static int omap2_onenand_setup_async(void __iomem *onenand_base) { struct gpmc_timings t; int ret; if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_async); if (onenand_async.sync_read || onenand_async.sync_write) { if (onenand_async.sync_write) gpmc_onenand_data->flags |= ONENAND_SYNC_READWRITE; else gpmc_onenand_data->flags |= ONENAND_SYNC_READ; onenand_async.sync_read = false; onenand_async.sync_write = false; } } omap2_onenand_set_async_mode(onenand_base); omap2_onenand_calc_async_timings(&t); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_async); if (ret < 0) return ret; omap2_onenand_set_async_mode(onenand_base); return 0; }
static int omap2_onenand_setup_sync(void __iomem *onenand_base, int *freq_ptr) { int ret, freq = *freq_ptr; struct gpmc_timings t; if (!freq) { /* Very first call freq is not known */ freq = omap2_onenand_get_freq(gpmc_onenand_data, onenand_base); if (!freq) return -ENODEV; set_onenand_cfg(onenand_base); } if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_sync); } else { /* * FIXME: Appears to be legacy code from initial ONENAND commit. * Unclear what boards this is for and if this can be removed. */ if (!cpu_is_omap34xx()) onenand_sync.wait_on_read = true; } omap2_onenand_calc_sync_timings(&t, gpmc_onenand_data->flags, freq); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_sync); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_sync); if (ret < 0) return ret; set_onenand_cfg(onenand_base); *freq_ptr = freq; return 0; }
static int omap2_onenand_setup_async(void __iomem *onenand_base) { struct gpmc_timings t; int ret; /* * Note that we need to keep sync_write set for the call to * omap2_onenand_set_async_mode() to work to detect the onenand * supported clock rate for the sync timings. */ if (gpmc_onenand_data->of_node) { gpmc_read_settings_dt(gpmc_onenand_data->of_node, &onenand_async); if (onenand_async.sync_read || onenand_async.sync_write) { if (onenand_async.sync_write) gpmc_onenand_data->flags |= ONENAND_SYNC_READWRITE; else gpmc_onenand_data->flags |= ONENAND_SYNC_READ; onenand_async.sync_read = false; } } onenand_async.sync_write = true; omap2_onenand_calc_async_timings(&t); ret = gpmc_cs_program_settings(gpmc_onenand_data->cs, &onenand_async); if (ret < 0) return ret; ret = gpmc_cs_set_timings(gpmc_onenand_data->cs, &t, &onenand_async); if (ret < 0) return ret; omap2_onenand_set_async_mode(onenand_base); return 0; }