[PATCH v2 6/7] mtd: cfi_cmdset_0002: add CFI detection for SST 39VF{16, 32}xx chips
Wolfram Sang
w.sang at pengutronix.de
Thu Apr 8 05:12:15 EDT 2010
On Tue, Mar 30, 2010 at 03:35:13PM +0200, Guillaume LECERF wrote:
> SST 39VF{16,32}xx chips use the 0x0701 command set, fully compatible
> with the AMD one. This patch adds support for detecting them in CFI
> mode.
>
> Based on a patch by Peter Turczaki [1].
>
> [1] http://www.mail-archive.com/uclinux-dev@uclinux.org/msg05737.html
>
> Signed-off-by: Guillaume LECERF <glecerf at gmail.com>
> ---
> drivers/mtd/chips/cfi_cmdset_0002.c | 41 +++++++++++++++++++++++++++++++++++
> drivers/mtd/chips/gen_probe.c | 1 +
> 2 files changed, 42 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
> index de1b4ba..e3e4a94 100644
> --- a/drivers/mtd/chips/cfi_cmdset_0002.c
> +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
> @@ -256,6 +256,36 @@ static void fixup_use_atmel_lock(struct mtd_info *mtd, void *param)
> mtd->flags |= MTD_POWERUP_LOCK;
> }
>
> +/** While reporting a mostly-correct CFI-Information block
> + * the eraseblock-region information is severely damaged in SST
> + * parts at least those of the 39VF{16,32,64}xxB series.
> + **/
Kernel mulit line comments, please.
> +static void fixup_old_sst_eraseregion(struct mtd_info *mtd)
> +{
> + struct map_info *map = mtd->priv;
> + struct cfi_private *cfi = map->fldrv_priv;
> +
> + /** Although the part claims to have two eraseblock-regions
> + * these refer to the same region within the flash-array.
> + * Because a really CFI-Compliant part may only return
s/Compliant/compliant/?
> + * one eraseblock-length per physical memory region
> + * we pretend the part said it had just one region ;)
> + **/
> + cfi->cfiq->NumEraseRegions = 1;
> + cfi->cfiq->EraseRegionInfo[0] = cfi->cfiq->EraseRegionInfo[1];
Why is this last line needed? The comment says they are the same?
> +}
> +
> +static void fixup_sst39vf(struct mtd_info *mtd, void *param)
> +{
> + struct map_info *map = mtd->priv;
> + struct cfi_private *cfi = map->fldrv_priv;
> +
> + fixup_old_sst_eraseregion(mtd);
> +
> + cfi->addr_unlock1 = 0x5555;
> + cfi->addr_unlock2 = 0x2AAA;
> +}
> +
> static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param)
> {
> struct map_info *map = mtd->priv;
> @@ -278,6 +308,16 @@ static void fixup_s29gl032n_sectors(struct mtd_info *mtd, void *param)
> }
> }
>
> +/* Used to fix CFI-Tables of chips without Extended Query Tables
> + */
> +static struct cfi_fixup cfi_nopri_fixup_table[] = {
> + { CFI_MFR_SST, 0x234A, fixup_sst39vf, NULL, }, // SST39VF1602
> + { CFI_MFR_SST, 0x234B, fixup_sst39vf, NULL, }, // SST39VF1601
> + { CFI_MFR_SST, 0x235A, fixup_sst39vf, NULL, }, // SST39VF3202
> + { CFI_MFR_SST, 0x235B, fixup_sst39vf, NULL, }, // SST39VF3201
> + { 0, 0, NULL, NULL }
> +};
> +
> static struct cfi_fixup cfi_fixup_table[] = {
> { CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
> #ifdef AMD_BOOTLOC_BUG
> @@ -408,6 +448,7 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
> cfi->addr_unlock1 = 0x555;
> cfi->addr_unlock2 = 0x2aa;
> }
> + cfi_fixup(mtd, cfi_nopri_fixup_table);
>
> if (!cfi->addr_unlock1 || !cfi->addr_unlock2) {
> kfree(mtd);
> diff --git a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c
> index 991c457..599c259 100644
> --- a/drivers/mtd/chips/gen_probe.c
> +++ b/drivers/mtd/chips/gen_probe.c
> @@ -249,6 +249,7 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary)
> #endif
> #ifdef CONFIG_MTD_CFI_AMDSTD
> case P_ID_AMD_STD:
> + case P_ID_SST_OLD:
> return cfi_cmdset_0002(map, primary);
> #endif
> #ifdef CONFIG_MTD_CFI_STAA
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.infradead.org/pipermail/linux-mtd/attachments/20100408/968eb95a/attachment.sig>
More information about the linux-mtd
mailing list