@@ -22,6 +22,7 @@
#define WR_RD_PIN_MONITORING 0x00600000
static struct omap_nand_platform_data *gpmc_nand_data;
+static struct gpmc_timings gpmc_default_timings;
static struct resource gpmc_nand_resource = {
.flags = IORESOURCE_MEM,
@@ -65,21 +66,28 @@ static void omap2_nand_gpmc_round_timings(struct gpmc_timings *src,
static int omap2_nand_gpmc_retime(void)
{
+ struct device *dev = &gpmc_nand_device.dev;
+ struct gpmc_timings *gpmc_t = gpmc_nand_data->gpmc_t;
struct gpmc_timings t;
int err;
- if (!gpmc_nand_data->gpmc_t)
+ if (!gpmc_t) {
+ dev_warn(dev, "No timings provided, skipping retime\n");
return 0;
+ }
- memset(&t, 0, sizeof(t));
- omap2_nand_gpmc_round_timings(gpmc_nand_data->gpmc_t, &t);
+ if (!gpmc_nand_data->keep_timings) {
+ memset(&t, 0, sizeof(t));
+ omap2_nand_gpmc_round_timings(gpmc_nand_data->gpmc_t, &t);
+ gpmc_t = &t;
+ }
/* Configure GPMC */
gpmc_cs_write_reg(gpmc_nand_data->cs, GPMC_CS_CONFIG1,
GPMC_CONFIG1_DEVICESIZE(gpmc_nand_data->devsize) |
GPMC_CONFIG1_DEVICETYPE_NAND);
- err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t);
+ err = gpmc_cs_set_timings(gpmc_nand_data->cs, gpmc_t);
if (err)
return err;
@@ -116,6 +124,11 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data)
return err;
}
+ if (gpmc_nand_data->keep_timings) {
+ gpmc_cs_get_timings(gpmc_nand_data->cs, &gpmc_default_timings);
+ gpmc_nand_data->gpmc_t = &gpmc_default_timings;
+ }
+
err = gpmc_nand_setup();
if (err < 0) {
dev_err(dev, "NAND platform setup failed: %d\n", err);
@@ -24,6 +24,7 @@ struct omap_nand_platform_data {
void __iomem *gpmc_cs_baseaddr;
void __iomem *gpmc_baseaddr;
int devsize;
+ bool keep_timings;
};
/* size (4 KiB) for IO mapping */