Hi,

On Tue, Jan 05, 2016 at 02:49:29PM -0800, Tony Lindgren wrote:
> From: Tony Lindgren <t...@atomide.com>
> Date: Tue, 5 Jan 2016 12:04:20 -0800
> Subject: [PATCH] ARM: OMAP2+: Fix onenand rate detection to avoid filesystem
>  corruption
> 
> Commit 63aa945b1013 ("memory: omap-gpmc: Add Kconfig option for debug")
> unified the GPMC debug for the SoCs with GPMC. The commit also left
> out the option for HWMOD_INIT_NO_RESET as we now require proper timings
> for GPMC to be able to remap GPMC devices out of address 0.
> 
> Unfortunately on 900, onenand now only partially works with the device
> tree provided timings. It works enough to get detected but the clock
> rate supported by the onenand chip gets misdetected. This in turn causes
> the GPMC timings to be miscalculated and this leads into file system
> corruption on n900.
> 
> Looks like onenand needs CS_CONFIG1 bit 27 WRITETYPE set for for sync
> write. This is needed also for async timings when we write to onenand
> with omap2_onenand_set_async_mode(). Without sync write bit set, the
> async read for the onenand ONENAND_REG_VERSION_ID will return 0xfff.
> 
> Let's exit with an error if onenand rate is not detected. And let's
> remove the extra call to omap2_onenand_set_async_mode() as we only
> need to do this once at the end of omap2_onenand_setup_async().
> 
> Reported-by: Ivaylo Dimitrov <ivo.g.dimitrov...@gmail.com>
> Signed-off-by: Tony Lindgren <t...@atomide.com>

This fixes also the detection issue on N950. Also tested the patch
with N810.

Tested-by: Aaro Koskinen <aaro.koski...@iki.fi>

A.

> --- 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);
>       }
>  
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to