mtd: cfi_cmdset_0002: make sector erase command variable
PATCH v3 1/1 mtd: cfi_cmdset_0002: make sector erase command variable
Some old SST chips use 0x50 as sector erase command, instead of 0x30. Make this value variable to handle such chips.
Signed-off-by Guillaume LECERF <[email protected]>
--- drivers/mtd/chips/cfi_cmdset_0002.c | 10 ++++++---- drivers/mtd/chips/cfi_probe.c | 2 ++ include/linux/mtd/cfi.h | 1 + 3 files changed, 9 insertions(+), 4 deletions(-)
drivers/mtd/chips/cfi_cmdset_0002.c +6 -4
@@ -291,6 +291,8 @@ static void fixup_sst39vf_rev_b(struct mtd_info *mtd, void *param) cfi->addr_unlock1 =0x555 ; cfi->addr_unlock2 =0x2AA ; + + cfi->sector_erase_cmd =CMD (0x50 ); }static void fixup_sst38vf640x_sectorsize (struct mtd_info *mtd,void *param)
@@ -691,7 +693,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr* there was an error (so leave the erase * routine to recover from it) or we trying to * use the erase-in-progress sector. */ -map_write (map,CMD (0x30 ), chip->in_progress_block_addr); +map_write (map, cfi->sector_erase_cmd, chip->in_progress_block_addr); chip->state =FL_ERASING ; chip->oldstate =FL_READY ;printk (KERN_ERR "MTD %s(): chip not ready after erase suspend\n" , __func__);
@@ -744,7 +746,7 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long adswitch (chip->oldstate) {case FL_ERASING : chip->state = chip->oldstate; -map_write (map,CMD (0x30 ), chip->in_progress_block_addr); +map_write (map, cfi->sector_erase_cmd, chip->in_progress_block_addr); chip->oldstate =FL_READY ; chip->state =FL_ERASING ;break ;
@@ -887,7 +889,7 @@ static void __xipram xip_udelay(struct map_info *map, struct flchip *chip,local_irq_disable ();/* Resume the write or erase operation */ -map_write (map,CMD (0x30 ), adr); +map_write (map, cfi->sector_erase_cmd, adr); chip->state = oldstate; start =xip_currtime (); }else if (usec >=1000000 /HZ ) {
@@ -1670,7 +1672,7 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip,cfi_send_gen_cmd (0x80 , cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type,NULL );cfi_send_gen_cmd (0xAA , cfi->addr_unlock1, chip->start, map, cfi, cfi->device_type,NULL );cfi_send_gen_cmd (0x55 , cfi->addr_unlock2, chip->start, map, cfi, cfi->device_type,NULL ); -map_write (map,CMD (0x30 ), adr); +map_write (map, cfi->sector_erase_cmd, adr); chip->state =FL_ERASING ; chip->erase_suspended =0 ;
drivers/mtd/chips/cfi_probe.c +2 -0
@@ -177,6 +177,8 @@ static int __xipram cfi_chip_setup(struct map_info *map, cfi->cfi_mode =CFI_MODE_CFI ; + cfi->sector_erase_cmd =CMD (0x30 ); +/* Read the CFI info structure */ xip_disable_qry (base, map, cfi);for (i=0 ; i<(sizeof (struct cfi_ident ) + num_erase_regions *4 ); i++)
include/linux/mtd/cfi.h +1 -0
@@ -289,6 +289,7 @@ struct cfi_private {must be of the same type. */ int mfr, id;int numchips; +map_word sector_erase_cmd;unsigned long chipshift;/* Because they're of the same type */ const char *im_name;/* inter_module name for cmdset_setup */ struct flchip chips[0 ];/* per-chip data structure for each chip */
Quoted 4 lines · Guillaume LECERF
Some old SST chips use
0x50as sector erase command, instead of0x30. Make this value variable to handle such chips.Signed-off-by Guillaume LECERF <[email protected]>
Looks good. Let me know when it's tested :)
Thanks.
Signature · 2 lines
David Woodhouse Open Source Technology Centre [email protected] Intel Corporation
Quoted 4 lines · Guillaume LECERF
Some old SST chips use
0x50as sector erase command, instead of0x30. Make this value variable to handle such chips.Signed-off-by Guillaume LECERF <[email protected]>
I like that :)
Acked-by Wolfram Sang <[email protected]>
Signature · 2 lines
Pengutronix e.K. | Wolfram Sang | Industrial Linux Solutions | http://www.pengutronix.de/ |