diff mbox

[4/4] mtd: cfi_cmdset_0002: add CFI detection for SST 38VF640x chips

Message ID 20101022154030.11097.40767.stgit@dev.siriade.com
State Changes Requested, archived
Headers show

Commit Message

Guillaume LECERF Oct. 22, 2010, 3:40 p.m. UTC
Add support for SST38VF640x chips in CFI mode.

Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
Signed-off-by: yidong zhang <zhangyd6@gmail.com>
---
 drivers/mtd/chips/cfi_cmdset_0002.c |   19 +++++++++++++++++++
 1 files changed, 19 insertions(+), 0 deletions(-)

Comments

zhangyd Oct. 25, 2010, 1:18 a.m. UTC | #1
On Fri, Oct 22, 2010 at 11:40 PM, Guillaume LECERF <glecerf@gmail.com> wrote:
> Add support for SST38VF640x chips in CFI mode.
>
> Signed-off-by: Guillaume LECERF <glecerf@gmail.com>
> Signed-off-by: yidong zhang <zhangyd6@gmail.com>
> ---
>  drivers/mtd/chips/cfi_cmdset_0002.c |   19 +++++++++++++++++++
>  1 files changed, 19 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
> index a359967..0248253 100644
> --- a/drivers/mtd/chips/cfi_cmdset_0002.c
> +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
> @@ -296,6 +296,21 @@ static void fixup_sst39vf_rev_b(struct mtd_info *mtd, void *param)
>        sector_erase_cmd = CMD(0x50);
>  }
>
> +static void fixup_sst38vf640x_sectorsize(struct mtd_info *mtd, void *param)
> +{
> +       struct map_info *map = mtd->priv;
> +       struct cfi_private *cfi = map->fldrv_priv;
> +
> +       fixup_sst39vf_rev_b(mtd, param);
> +
> +       /*
> +        * CFI reports 1024 sectors (0x03ff +1) of 64KBytes (0x0100 *256) where
> +        * it should report a size of 8KBytes (0x0020 *256).
> +        */
> +       cfi->cfiq->EraseRegionInfo[0] = 0x002003ff;
> +       pr_warning("%s: Bad 38VF640x CFI data, adjust sector size from 64 to 8KBytes\n", mtd->name);
> +}
> +
>  static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param)
>  {
>        struct map_info *map = mtd->priv;
> @@ -347,6 +362,10 @@ static struct cfi_fixup cfi_fixup_table[] = {
>        { CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, },
>        { CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, },
>        { CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, },
> +       { CFI_MFR_SST, 0x536A, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6402 */
> +       { CFI_MFR_SST, 0x536B, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6401 */
> +       { CFI_MFR_SST, 0x536C, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6404 */
> +       { CFI_MFR_SST, 0x536D, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6403 */
>  #if !FORCE_WORD_WRITE
>        { CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
>  #endif
The SST38VF640x chips have no Extended Query table. I think we should
move them to the
 cfi_nopri_fixup_table.

>
>
Guillaume LECERF Oct. 25, 2010, 8:09 a.m. UTC | #2
2010/10/25 yidong zhang <zhangyd6@gmail.com>:
> The SST38VF640x chips have no Extended Query table. I think we should
> move them to the
>  cfi_nopri_fixup_table.

According to the datasheet [1], it has.

[1] http://www.sst.com/dotAsset/39749.pdf, table 13
zhangyd Oct. 25, 2010, 8:38 a.m. UTC | #3
On Mon, Oct 25, 2010 at 4:09 PM, Guillaume LECERF <glecerf@gmail.com> wrote:
> 2010/10/25 yidong zhang <zhangyd6@gmail.com>:
>> The SST38VF640x chips have no Extended Query table. I think we should
>> move them to the
>>  cfi_nopri_fixup_table.
>
> According to the datasheet [1], it has.
>
> [1] http://www.sst.com/dotAsset/39749.pdf, table 13

Oh, sorry, my mistake. I tested the patch right now. But it didn't
work, please the logs below.


Amd/Fujitsu Extended Query Table at 0x0040
  Unknown Amd/Fujitsu Extended Query version  .  (0xff/0xff).


> --
> Guillaume LECERF
> GeeXboX developer - www.geexbox.org
>
Guillaume LECERF Oct. 25, 2010, 9:17 a.m. UTC | #4
2010/10/25 yidong zhang <zhangyd6@gmail.com>:
> Oh, sorry, my mistake. I tested the patch right now. But it didn't
> work, please the logs below.
>
> Amd/Fujitsu Extended Query Table at 0x0040
>  Unknown Amd/Fujitsu Extended Query version  .  (0xff/0xff).

This chip does not have a valid Major/MinorVersion.
Could you please try the attached patch ?
zhangyd Oct. 25, 2010, 10:01 a.m. UTC | #5
On Mon, Oct 25, 2010 at 5:17 PM, Guillaume LECERF <glecerf@gmail.com> wrote:
> 2010/10/25 yidong zhang <zhangyd6@gmail.com>:
>> Oh, sorry, my mistake. I tested the patch right now. But it didn't
>> work, please the logs below.
>>
>> Amd/Fujitsu Extended Query Table at 0x0040
>>  Unknown Amd/Fujitsu Extended Query version  .  (0xff/0xff).
>
> This chip does not have a valid Major/MinorVersion.
> Could you please try the attached patch ?

Passed my test. Using this patch, the driver can support the chips now.

>
> --
> Guillaume LECERF
> GeeXboX developer - www.geexbox.org
>
diff mbox

Patch

diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index a359967..0248253 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -296,6 +296,21 @@  static void fixup_sst39vf_rev_b(struct mtd_info *mtd, void *param)
 	sector_erase_cmd = CMD(0x50);
 }
 
+static void fixup_sst38vf640x_sectorsize(struct mtd_info *mtd, void *param)
+{
+	struct map_info *map = mtd->priv;
+	struct cfi_private *cfi = map->fldrv_priv;
+
+	fixup_sst39vf_rev_b(mtd, param);
+
+	/*
+	 * CFI reports 1024 sectors (0x03ff +1) of 64KBytes (0x0100 *256) where
+	 * it should report a size of 8KBytes (0x0020 *256).
+	 */
+	cfi->cfiq->EraseRegionInfo[0] = 0x002003ff;
+	pr_warning("%s: Bad 38VF640x CFI data, adjust sector size from 64 to 8KBytes\n", mtd->name);
+}
+
 static void fixup_s29gl064n_sectors(struct mtd_info *mtd, void *param)
 {
 	struct map_info *map = mtd->priv;
@@ -347,6 +362,10 @@  static struct cfi_fixup cfi_fixup_table[] = {
 	{ CFI_MFR_AMD, 0x1301, fixup_s29gl064n_sectors, NULL, },
 	{ CFI_MFR_AMD, 0x1a00, fixup_s29gl032n_sectors, NULL, },
 	{ CFI_MFR_AMD, 0x1a01, fixup_s29gl032n_sectors, NULL, },
+	{ CFI_MFR_SST, 0x536A, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6402 */
+	{ CFI_MFR_SST, 0x536B, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6401 */
+	{ CFI_MFR_SST, 0x536C, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6404 */
+	{ CFI_MFR_SST, 0x536D, fixup_sst38vf640x_sectorsize, NULL, }, /* SST38VF6403 */
 #if !FORCE_WORD_WRITE
 	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
 #endif