diff options
Diffstat (limited to 'arch/arm/mach-omap2/gpmc-onenand.c')
| -rw-r--r-- | arch/arm/mach-omap2/gpmc-onenand.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c index 17a6f752a436..7b76ce01c21d 100644 --- a/arch/arm/mach-omap2/gpmc-onenand.c +++ b/arch/arm/mach-omap2/gpmc-onenand.c @@ -149,8 +149,8 @@ static int omap2_onenand_get_freq(struct omap_onenand_platform_data *cfg,  		freq = 104;  		break;  	default: -		freq = 54; -		break; +		pr_err("onenand rate not detected, bad GPMC async timings?\n"); +		freq = 0;  	}  	return freq; @@ -271,6 +271,11 @@ 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); @@ -281,12 +286,9 @@ static int omap2_onenand_setup_async(void __iomem *onenand_base)  			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); @@ -310,6 +312,8 @@ static int omap2_onenand_setup_sync(void __iomem *onenand_base, int *freq_ptr)  	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);  	}  | 
