[U-Boot] [PATCH] mtd: nand: allow NAND_NO_SUBPAGE_WRITE to be set from driver
Marek Vasut
marex at denx.de
Fri Aug 31 01:45:39 CEST 2012
Dear Marek Vasut,
> This is based on Linux kernel -next:
>
> commit a1256b0e087ed3cdb584c683acb966ee885f733c
> Author: Brian Norris <computersforpeace at gmail.com>
> Date: Fri Jul 13 09:28:24 2012 -0700
>
> mtd: nand: allow NAND_NO_SUBPAGE_WRITE to be set from driver
>
> The NAND_CHIPOPTIONS_MSK has limited utility and is causing real bugs.
> It silently masks off at least one flag that might be set by the driver
> (NAND_NO_SUBPAGE_WRITE). This breaks the GPMI NAND driver and possibly
> others.
>
> Really, as long as driver writers exercise a small amount of care with
> NAND_* options, this mask is not necessary at all; it was only here to
> prevent certain options from accidentally being set by the driver. But
> the original thought turns out to be a bad idea occasionally. Thus, kill
> it.
>
> Note, this patch fixes some major gpmi-nand breakage.
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Brian Norris <computersforpeace at gmail.com>
> Cc: Eric Nelson <eric.nelson at boundarydevices.com>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Otavio Salvador <otavio at ossystems.com.br>
> Cc: Scott Wood <scottwood at freescale.com>
> ---
> drivers/mtd/nand/nand_base.c | 7 ++-----
> include/linux/mtd/nand.h | 3 ---
> 2 files changed, 2 insertions(+), 8 deletions(-)
>
> NOTE: Please test before applying, I'd like to know it doesn't cause
> breakage.
NOTE2: This fixes UBI on MX28, MX6Q and soon-to-be MX233 GPMI NAND. Thanks
again, Brian!
> diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
> index bfd668f..658b3ad 100644
> --- a/drivers/mtd/nand/nand_base.c
> +++ b/drivers/mtd/nand/nand_base.c
> @@ -2578,9 +2578,7 @@ static int nand_flash_detect_onfi(struct mtd_info
> *mtd, struct nand_chip *chip, if (le16_to_cpu(p->features) & 1)
> *busw = NAND_BUSWIDTH_16;
>
> - chip->options &= ~NAND_CHIPOPTIONS_MSK;
> - chip->options |= (NAND_NO_READRDY |
> - NAND_NO_AUTOINCR) & NAND_CHIPOPTIONS_MSK;
> + chip->options |= NAND_NO_READRDY | NAND_NO_AUTOINCR;
>
> return 1;
> }
> @@ -2752,8 +2750,7 @@ static const struct nand_flash_dev
> *nand_get_flash_type(struct mtd_info *mtd, }
> }
> /* Get chip options, preserve non chip based options */
> - chip->options &= ~NAND_CHIPOPTIONS_MSK;
> - chip->options |= type->options & NAND_CHIPOPTIONS_MSK;
> + chip->options |= type->options;
>
> /* Check if chip is a not a samsung device. Do not clear the
> * options for chips which are not having an extended id.
> diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
> index 82704de..0a5aa64 100644
> --- a/include/linux/mtd/nand.h
> +++ b/include/linux/mtd/nand.h
> @@ -205,9 +205,6 @@ typedef enum {
> #define NAND_SUBPAGE_READ(chip) ((chip->ecc.mode == NAND_ECC_SOFT) \
> && (chip->page_shift > 9))
>
> -/* Mask to zero out the chip options, which come from the id table */
> -#define NAND_CHIPOPTIONS_MSK (0x0000ffff & ~NAND_NO_AUTOINCR)
> -
> /* Non chip related options */
> /*
> * Use a flash based bad block table. OOB identifier is saved in OOB area.
Best regards,
Marek Vasut
More information about the U-Boot
mailing list