sf: MTD support
v6 cover sf: MTD support
This series is combination of mtd and sf tunning stuff in previous version patches.
This is whole patch series for add mtd support to spi-flash framework and related stuff.
The idea is to introduce the spi-nor flash framework which similar to Linux with driver-model support.
spi-nor looks:
-----------------------------------------------------------
cmd_spi cmd_sf
------|----------------------------------------------------
| spi_flash
------|----------------------------------------------------
| MTD Core
------|----------------------------------------------------
| sf-uclass
------|----------------------------------------------------
| SPI-NOR Core------V----------------------------------------------------
spi-uclass <---->spi-nor-flash drivers/mtd/spi/*
-----------------------------------------------------------
drivers/spi/*
-----------------------------------------------------------
drivers/mtd/spi/spi-nor.c: spi-nor core drivers/mtd/spi/spi-flash-nor.c: spi-nor to spi drivers interface drivers/mtd/spi/fsl-quadspi.c: spi-nor controller driver
Changes in this series:
- drivers/mtd/spi/sf_probe.c: spi-flash to spi drivers interface(dm and non-dm)
- drivers/mtd/spi/sf_ops.c: Core spi-flash functionalities.
- spi_flash ops and dm_spi_ops are not needed as flash opertaion are common for dm and non-dm via MTD
Changes in v5, v6, v3, v2:
- One patch bisectable separation
- Rebase to master
- added newly mtd stuff patches.
Jagan Teki (23):
sf: spi_flash_validate_params => spi_flash_scan
sf: Move spi_flash_scan code to sf_ops
sf: Move read_id code to sf_ops
sf: probe: Code cleanup
sf: Use static for file-scope functions
sf: Fix Makefile
sf: Use simple name for register access functions
sf: Use flash function pointers in dm_spi_flash_ops
sf: Flash power up read-only based on idcode0
sf: Use static for file-scope functions
sf: Remove unneeded header includes
sf: probe: Use spi_flash_scan in dm-spi-flash
sf: Re-factorize spi_flash_probe_tail code
dm-sf: Re-factorize spi_flash_std_probe code
sf: Add MTD support to spi_flash
sf: Use mtd_info ops instead of spi_flash ops
cmd_sf: Use mtd->size instead of flash->size
dm-sf: use mtd_ops, drop dm_spi_flash_ops
sf: Use MTD lock operations
sf: Add MTD support for non-dm spi_flash interface
sf: probe: Minor cleanup
sf: Drop SPI_FLASH_MTD driver
configs: Remove CONFIG_SPI_FLASH_MTD
common/cmd_sf.c | 16 +- drivers/mtd/spi/Kconfig | 12 - drivers/mtd/spi/Makefile | 7 +- drivers/mtd/spi/sf-uclass.c | 16 - drivers/mtd/spi/sf_internal.h | 65 +-- drivers/mtd/spi/sf_mtd.c | 104 ----- drivers/mtd/spi/sf_ops.c | 746 ++++++++++++++++++++++++++-------- drivers/mtd/spi/sf_probe.c | 504 ++++------------------- include/configs/aristainetos-common.h | 1 - include/configs/gw_ventana.h | 1 - include/configs/socfpga_common.h | 1 - include/spi_flash.h | 163 ++------ 12 files changed, 703 insertions(+), 933 deletions(-) delete mode 100644 drivers/mtd/spi/sf_mtd.c
Signature · 1 line
1.9.1
PATCH v6 1/23 sf: spi_flash_validate_params => spi_flash_scan
Rename spi_flash_validate_params to spi_flash_scan as this code not only deals with params setup but also configure all spi_flash attributes.
And also moved all flash related code into spi_flash_scan for future functionality addition.
--- drivers/mtd/spi/sf_probe.c | 145 +++++++++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 70 deletions(-)
drivers/mtd/spi/sf_probe.c +75 -70
@@ -130,13 +130,42 @@ bank_end: }#endif -static int spi_flash_validate_params (struct spi_slave *spi,u8 *idcode, +#if CONFIG_IS_ENABLED (OF_CONTROL ) +int spi_flash_decode_fdt (const void *blob,struct spi_flash *flash) +{ +fdt_addr_t addr; +fdt_size_t size; +int node; + +/* If there is no node, do nothing */ + node =fdtdec_next_compatible (blob,0 ,COMPAT_GENERIC_SPI_FLASH ); +if (node <0 ) +return 0 ; + + addr =fdtdec_get_addr_size (blob, node,"memory-map" , &size); +if (addr ==FDT_ADDR_T_NONE ) { +debug ("%s: Cannot decode address\n" , __func__); +return 0 ; + } + +if (flash->size != size) { +debug ("%s: Memory map must cover entire device\n" , __func__); +return -1 ; + } + flash->memory_map =map_sysmem (addr, size); + +return 0 ; +} +#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */ + +static int spi_flash_scan (struct spi_slave *spi,u8 *idcode,struct spi_flash *flash) {const struct spi_flash_params *params;u8 cmd;u16 jedec = idcode[1 ] <<8 | idcode[2 ];u16 ext_jedec = idcode[3 ] <<8 | idcode[4 ]; +int ret;/* Validate params from spi_flash_params table */ params = spi_flash_params_table;
@@ -158,6 +187,13 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,return -EPROTONOSUPPORT ; } +/* Flash powers up read-only, so clear BP# bits */ +#if defined(CONFIG_SPI_FLASH_ATMEL ) || \ + defined(CONFIG_SPI_FLASH_MACRONIX ) || \ + defined(CONFIG_SPI_FLASH_SST ) +spi_flash_cmd_write_status (flash,0 ); +#endif +/* Assign spi data */ flash->spi = spi; flash->name = params->name;
@@ -251,6 +287,17 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,/* Go for default supported write cmd */ flash->write_cmd =CMD_PAGE_PROGRAM ; +/* Set the quad enable bit - only for quad commands */ +if ((flash->read_cmd ==CMD_READ_QUAD_OUTPUT_FAST ) || + (flash->read_cmd ==CMD_READ_QUAD_IO_FAST ) || + (flash->write_cmd ==CMD_QUAD_PAGE_PROGRAM )) { + ret =spi_flash_set_qeb (flash, idcode[0 ]); +if (ret) { +debug ("SF: Fail to set QEB for %02x\n" , idcode[0 ]); +return -EINVAL ; + } + } +/* Read dummy_byte: dummy byte is determined based on the * dummy cycles of a particular command. * Fast commands - dummy_byte = dummy_cycles/8
@@ -277,48 +324,41 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,/* Configure the BAR - discover bank cmds and read current bank */ #ifdef CONFIG_SPI_FLASH_BAR -int ret =spi_flash_read_bank (flash, idcode[0 ]); + ret =spi_flash_read_bank (flash, idcode[0 ]);if (ret <0 )return ret;#endif -/* Flash powers up read-only, so clear BP# bits */ -#if defined(CONFIG_SPI_FLASH_ATMEL ) || \ - defined(CONFIG_SPI_FLASH_MACRONIX ) || \ - defined(CONFIG_SPI_FLASH_SST ) -spi_flash_cmd_write_status (flash,0 ); -#endif - -return 0 ; -} -#if CONFIG_IS_ENABLED (OF_CONTROL ) -int spi_flash_decode_fdt (const void *blob,struct spi_flash *flash) -{ -fdt_addr_t addr; -fdt_size_t size; -int node; - -/* If there is no node, do nothing */ - node =fdtdec_next_compatible (blob,0 ,COMPAT_GENERIC_SPI_FLASH ); -if (node <0 ) -return 0 ; - - addr =fdtdec_get_addr_size (blob, node,"memory-map" , &size); -if (addr ==FDT_ADDR_T_NONE ) { -debug ("%s: Cannot decode address\n" , __func__); -return 0 ; + ret =spi_flash_decode_fdt (gd->fdt_blob, flash); +if (ret) { +debug ("SF: FDT decode error\n" ); +return -EINVAL ; } +#endif -if (flash->size != size) { -debug ("%s: Memory map must cover entire device\n" , __func__); -return -1 ; +#ifndef CONFIG_SPL_BUILD +printf ("SF: Detected %s with page size " , flash->name); +print_size (flash->page_size,", erase size " ); +print_size (flash->erase_size,", total " ); +print_size (flash->size,"" ); +if (flash->memory_map) +printf (", mapped at %p" , flash->memory_map); +puts ("\n" ); +#endif + +#ifndef CONFIG_SPI_FLASH_BAR +if (((flash->dual_flash ==SF_SINGLE_FLASH ) && + (flash->size >SPI_FLASH_16MB_BOUN )) || + ((flash->dual_flash >SF_SINGLE_FLASH ) && + (flash->size >SPI_FLASH_16MB_BOUN <<1 ))) { +puts ("SF: Warning - Only lower 16MiB accessible," ); +puts (" Full access #define CONFIG_SPI_FLASH_BAR\n" ); } - flash->memory_map =map_sysmem (addr, size); +#endif -return 0 ; +return ret; } -#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */ /** * spi_flash_probe_slave() - Probe for a SPI flash device on a bus
@@ -357,47 +397,12 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)print_buffer (0 , idcode,1 ,sizeof (idcode),0 );#endif -if (spi_flash_validate_params (spi, idcode, flash)) { + ret =spi_flash_scan (spi, idcode, flash); +if (ret) { ret = -EINVAL ; goto err_read_id; } -/* Set the quad enable bit - only for quad commands */ -if ((flash->read_cmd ==CMD_READ_QUAD_OUTPUT_FAST ) || - (flash->read_cmd ==CMD_READ_QUAD_IO_FAST ) || - (flash->write_cmd ==CMD_QUAD_PAGE_PROGRAM )) { -if (spi_flash_set_qeb (flash, idcode[0 ])) { -debug ("SF: Fail to set QEB for %02x\n" , idcode[0 ]); - ret = -EINVAL ; - goto err_read_id; - } - } - -#if CONFIG_IS_ENABLED (OF_CONTROL ) -if (spi_flash_decode_fdt (gd->fdt_blob, flash)) { -debug ("SF: FDT decode error\n" ); - ret = -EINVAL ; - goto err_read_id; - } -#endif -#ifndef CONFIG_SPL_BUILD -printf ("SF: Detected %s with page size " , flash->name); -print_size (flash->page_size,", erase size " ); -print_size (flash->erase_size,", total " ); -print_size (flash->size,"" ); -if (flash->memory_map) -printf (", mapped at %p" , flash->memory_map); -puts ("\n" ); -#endif -#ifndef CONFIG_SPI_FLASH_BAR -if (((flash->dual_flash ==SF_SINGLE_FLASH ) && - (flash->size >SPI_FLASH_16MB_BOUN )) || - ((flash->dual_flash >SF_SINGLE_FLASH ) && - (flash->size >SPI_FLASH_16MB_BOUN <<1 ))) { -puts ("SF: Warning - Only lower 16MiB accessible," ); -puts (" Full access #define CONFIG_SPI_FLASH_BAR\n" ); - } -#endif #ifdef CONFIG_SPI_FLASH_MTD ret =spi_flash_mtd_register (flash);#endif
Signature · 1 line
1.9.1
PATCH v6 2/23 sf: Move spi_flash_scan code to sf_ops
In reply to Jagan TekiIntension is that sf_ops should deals all spi_flash related stuff and sf_probe (which should renamed future) should be an interface layer for spi_flash versus spi drivers.
sf_ops => spi_flash interfacesf_probe => interface layer vs spi_flash(sf_probe) to spi drivers
--- drivers/mtd/spi/sf_internal.h | 14 ++ drivers/mtd/spi/sf_ops.c | 341 ++++++++++++++++++++++++++++++++++++++++++ drivers/mtd/spi/sf_probe.c | 340 ----------------------------------------- 3 files changed, 355 insertions(+), 340 deletions(-)
drivers/mtd/spi/sf_internal.h +14 -0
@@ -244,4 +244,18 @@ int spi_flash_mtd_register(struct spi_flash *flash);void spi_flash_mtd_unregister (void );#endif +/** +* spi_flash_scan - scan the SPI FLASH +* @spi: the spi slave structure +* @idcode: idcode of spi flash +* @flash: the spi flash structure +* +* The drivers can use this fuction to scan the SPI FLASH. +* In the scanning, it will try to get all the necessary information to +* fill the spi_flash{}. +* +* Return: 0 for success, others for failure. +*/ +int spi_flash_scan (struct spi_slave *spi,u8 *idcode,struct spi_flash *flash); +#endif /* _SF_INTERNAL_H_ */
drivers/mtd/spi/sf_ops.c +341 -0
356 lines not on this page · raw message
drivers/mtd/spi/sf_probe.c +0 -340
346 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v6 3/23 sf: Move read_id code to sf_ops
In reply to Jagan Tekiread_id code is related to spi_flash stuff
hence moved to sf_ops.
--- drivers/mtd/spi/sf_internal.h | 3 +-- drivers/mtd/spi/sf_ops.c | 21 ++++++++++++++++++--- drivers/mtd/spi/sf_probe.c | 15 +-------------- 3 files changed, 20 insertions(+), 19 deletions(-)
drivers/mtd/spi/sf_internal.h +1 -2
@@ -247,7 +247,6 @@ void spi_flash_mtd_unregister(void);/** * spi_flash_scan - scan the SPI FLASH * @spi: the spi slave structure -* @idcode: idcode of spi flash * @flash: the spi flash structure * * The drivers can use this fuction to scan the SPI FLASH.
@@ -256,6 +255,6 @@ void spi_flash_mtd_unregister(void);* * Return: 0 for success, others for failure. */ -int spi_flash_scan (struct spi_slave *spi,u8 *idcode,struct spi_flash *flash); +int spi_flash_scan (struct spi_slave *spi,struct spi_flash *flash);#endif /* _SF_INTERNAL_H_ */
drivers/mtd/spi/sf_ops.c +18 -3
@@ -886,14 +886,29 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash) }#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */ -int spi_flash_scan (struct spi_slave *spi,u8 *idcode,struct spi_flash *flash) +int spi_flash_scan (struct spi_slave *spi,struct spi_flash *flash) {const struct spi_flash_params *params; +u16 jedec, ext_jedec; +u8 idcode[5 ];u8 cmd; -u16 jedec = idcode[1 ] <<8 | idcode[2 ]; -u16 ext_jedec = idcode[3 ] <<8 | idcode[4 ];int ret; +/* Read the ID codes */ + ret =spi_flash_cmd (spi,CMD_READ_ID , idcode,sizeof (idcode)); +if (ret) { +printf ("SF: Failed to get idcodes\n" ); +return -EINVAL ; + } + +#ifdef DEBUG +printf ("SF: Got idcodes\n" ); +print_buffer (0 , idcode,1 ,sizeof (idcode),0 ); +#endif + + jedec = idcode[1 ] <<8 | idcode[2 ]; + ext_jedec = idcode[3 ] <<8 | idcode[4 ]; +/* Validate params from spi_flash_params table */ params = spi_flash_params_table;for (; params->name !=NULL ; params++) {
drivers/mtd/spi/sf_probe.c +1 -14
@@ -29,7 +29,6 @@*/ int spi_flash_probe_slave (struct spi_slave *spi,struct spi_flash *flash) { -u8 idcode[5 ];int ret;/* Setup spi_slave */
@@ -45,19 +44,7 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)return ret; } -/* Read the ID codes */ - ret =spi_flash_cmd (spi,CMD_READ_ID , idcode,sizeof (idcode)); -if (ret) { -printf ("SF: Failed to get idcodes\n" ); - goto err_read_id; - } - -#ifdef DEBUG -printf ("SF: Got idcodes\n" ); -print_buffer (0 , idcode,1 ,sizeof (idcode),0 ); -#endif - - ret =spi_flash_scan (spi, idcode, flash); + ret =spi_flash_scan (spi, flash);if (ret) { ret = -EINVAL ; goto err_read_id;
Signature · 1 line
1.9.1
PATCH v6 4/23 sf: probe: Code cleanup
In reply to Jagan Teki- Move bar read code below the bar write hance both at once place, hence it easy for #ifdef macro only once and readable.
- Move read_cmd_array at top
--- drivers/mtd/spi/sf_ops.c | 80 +++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 41 deletions(-)
drivers/mtd/spi/sf_ops.c +39 -41
@@ -30,6 +30,16 @@ static void spi_flash_addr(u32 addr, u8 *cmd) cmd[3 ] = addr >>0 ; } +/* Read commands array */ +static u8 spi_read_cmds_array[] = { +CMD_READ_ARRAY_SLOW , +CMD_READ_ARRAY_FAST , +CMD_READ_DUAL_OUTPUT_FAST , +CMD_READ_DUAL_IO_FAST , +CMD_READ_QUAD_OUTPUT_FAST , +CMD_READ_QUAD_IO_FAST , +}; +int spi_flash_cmd_read_status (struct spi_flash *flash,u8 *rs) {int ret;
@@ -133,6 +143,35 @@ bar_end: flash->bank_curr = bank_sel; return flash->bank_curr; } + +static int spi_flash_read_bank (struct spi_flash *flash,u8 idcode0) +{ +u8 curr_bank =0 ; +int ret; + +if (flash->size <=SPI_FLASH_16MB_BOUN ) + goto bank_end; + +switch (idcode0) { +case SPI_FLASH_CFI_MFR_SPANSION : + flash->bank_read_cmd =CMD_BANKADDR_BRRD ; + flash->bank_write_cmd =CMD_BANKADDR_BRWR ; +default : + flash->bank_read_cmd =CMD_EXTNADDR_RDEAR ; + flash->bank_write_cmd =CMD_EXTNADDR_WREAR ; + } + + ret =spi_flash_read_common (flash, &flash->bank_read_cmd,1 , + &curr_bank,1 ); +if (ret) { +debug ("SF: fail to read bank addr register\n" ); +return ret; + } + +bank_end: + flash->bank_curr = curr_bank; +return 0 ; +}#endif #ifdef CONFIG_SF_DUAL_FLASH
@@ -750,16 +789,6 @@ int stm_unlock(struct spi_flash *flash, u32 ofs, size_t len)#endif /* CONFIG_SPI_FLASH_STMICRO */ -/* Read commands array */ -static u8 spi_read_cmds_array[] = { -CMD_READ_ARRAY_SLOW , -CMD_READ_ARRAY_FAST , -CMD_READ_DUAL_OUTPUT_FAST , -CMD_READ_DUAL_IO_FAST , -CMD_READ_QUAD_OUTPUT_FAST , -CMD_READ_QUAD_IO_FAST , -}; -#ifdef CONFIG_SPI_FLASH_MACRONIX static int spi_flash_set_qeb_mxic (struct spi_flash *flash) {
@@ -827,37 +856,6 @@ static int spi_flash_set_qeb(struct spi_flash *flash, u8 idcode0) } } -#ifdef CONFIG_SPI_FLASH_BAR -static int spi_flash_read_bank (struct spi_flash *flash,u8 idcode0) -{ -u8 curr_bank =0 ; -int ret; - -if (flash->size <=SPI_FLASH_16MB_BOUN ) - goto bank_end; - -switch (idcode0) { -case SPI_FLASH_CFI_MFR_SPANSION : - flash->bank_read_cmd =CMD_BANKADDR_BRRD ; - flash->bank_write_cmd =CMD_BANKADDR_BRWR ; -default : - flash->bank_read_cmd =CMD_EXTNADDR_RDEAR ; - flash->bank_write_cmd =CMD_EXTNADDR_WREAR ; - } - - ret =spi_flash_read_common (flash, &flash->bank_read_cmd,1 , - &curr_bank,1 ); -if (ret) { -debug ("SF: fail to read bank addr register\n" ); -return ret; - } - -bank_end: - flash->bank_curr = curr_bank; -return 0 ; -} -#endif -#if CONFIG_IS_ENABLED (OF_CONTROL )int spi_flash_decode_fdt (const void *blob,struct spi_flash *flash) {
Signature · 1 line
1.9.1
PATCH v6 5/23 sf: Use static for file-scope functions
In reply to Jagan TekiUse static for file-scope functions and removed
them from header files.
--- drivers/mtd/spi/sf_internal.h | 18 ------------------ drivers/mtd/spi/sf_ops.c | 11 ++++++----- 2 files changed, 6 insertions(+), 23 deletions(-)
drivers/mtd/spi/sf_internal.h +0 -18
@@ -170,12 +170,6 @@ int spi_flash_cmd_write(struct spi_slave *spi, const u8 *cmd, size_t cmd_len,/* Flash erase(sectors) operation, support all possible erase commands */ int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset,size_t len); -/* Read the status register */ -int spi_flash_cmd_read_status (struct spi_flash *flash,u8 *rs); - -/* Program the status register */ -int spi_flash_cmd_write_status (struct spi_flash *flash,u8 ws); -/* Lock stmicro spi flash region */ int stm_lock (struct spi_flash *flash,u32 ofs,size_t len);
@@ -185,12 +179,6 @@ int stm_unlock(struct spi_flash *flash, u32 ofs, size_t len);/* Check if a stmicro spi flash region is completely locked */ int stm_is_locked (struct spi_flash *flash,u32 ofs,size_t len); -/* Read the config register */ -int spi_flash_cmd_read_config (struct spi_flash *flash,u8 *rc); - -/* Program the config register */ -int spi_flash_cmd_write_config (struct spi_flash *flash,u8 wc); -/* Enable writing on the SPI flash */ static inline int spi_flash_cmd_write_enable (struct spi_flash *flash) {
@@ -204,12 +192,6 @@ static inline int spi_flash_cmd_write_disable(struct spi_flash *flash) }/* -* Send the read status command to the device and wait for the wip -* (write-in-progress) bit to clear itself. -*/ -int spi_flash_cmd_wait_ready (struct spi_flash *flash,unsigned long timeout); - -/* * Used for spi_flash write operation * - SPI claim * - spi_flash_cmd_write_enable
drivers/mtd/spi/sf_ops.c +6 -5
@@ -40,7 +40,7 @@ static u8 spi_read_cmds_array[] = { CMD_READ_QUAD_IO_FAST, }; -int spi_flash_cmd_read_status (struct spi_flash *flash,u8 *rs) +static int spi_flash_cmd_read_status (struct spi_flash *flash,u8 *rs) {int ret;u8 cmd;
@@ -69,7 +69,7 @@ static int read_fsr(struct spi_flash *flash, u8 *fsr)return 0 ; } -int spi_flash_cmd_write_status (struct spi_flash *flash,u8 ws) +static int spi_flash_cmd_write_status (struct spi_flash *flash,u8 ws) {u8 cmd;int ret;
@@ -85,7 +85,7 @@ int spi_flash_cmd_write_status(struct spi_flash *flash, u8 ws) }#if defined(CONFIG_SPI_FLASH_SPANSION ) || defined(CONFIG_SPI_FLASH_WINBOND ) -int spi_flash_cmd_read_config (struct spi_flash *flash,u8 *rc) +static int spi_flash_cmd_read_config (struct spi_flash *flash,u8 *rc) {int ret;u8 cmd;
@@ -100,7 +100,7 @@ int spi_flash_cmd_read_config(struct spi_flash *flash, u8 *rc)return 0 ; } -int spi_flash_cmd_write_config (struct spi_flash *flash,u8 wc) +static int spi_flash_cmd_write_config (struct spi_flash *flash,u8 wc) {u8 data[2 ];u8 cmd;
@@ -238,7 +238,8 @@ static int spi_flash_ready(struct spi_flash *flash)return sr && fsr; } -int spi_flash_cmd_wait_ready (struct spi_flash *flash,unsigned long timeout) +static int spi_flash_cmd_wait_ready (struct spi_flash *flash, +unsigned long timeout) {int timebase, ret;
Signature · 1 line
1.9.1
PATCH v6 6/23 sf: Fix Makefile
In reply to Jagan TekiThis patch removes unneeded ifdef and fixed accordingly.
--- drivers/mtd/spi/Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/mtd/spi/Makefile +1 -5
@@ -12,11 +12,7 @@ obj-$(CONFIG_SPL_SPI_LOAD) += spi_spl_load.o obj-$(CONFIG_SPL_SPI_BOOT) += fsl_espi_spl.o endif -#ifndef CONFIG_DM_SPI -obj-$(CONFIG_SPI_FLASH) += sf_probe.o -#endif -obj-$(CONFIG_CMD_SF) += sf.o -obj-$(CONFIG_SPI_FLASH) += sf_ops.o sf_params.o +obj-$(CONFIG_SPI_FLASH) += sf_probe.o sf_ops.o sf_params.o sf.o obj-$(CONFIG_SPI_FLASH_DATAFLASH) += sf_dataflash.o obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o
Signature · 1 line
1.9.1
PATCH v6 7/23 sf: Use simple name for register access functions
In reply to Jagan TekiMost of the register access function are static,
so used simple name to represent each.
--- drivers/mtd/spi/sf_ops.c | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-)
drivers/mtd/spi/sf_ops.c +21 -21
@@ -40,7 +40,7 @@ static u8 spi_read_cmds_array[] = { CMD_READ_QUAD_IO_FAST, }; -static int spi_flash_cmd_read_status (struct spi_flash *flash,u8 *rs) +static int read_sr (struct spi_flash *flash,u8 *rs) {int ret;u8 cmd;
@@ -69,7 +69,7 @@ static int read_fsr(struct spi_flash *flash, u8 *fsr)return 0 ; } -static int spi_flash_cmd_write_status (struct spi_flash *flash,u8 ws) +static int write_sr (struct spi_flash *flash,u8 ws) {u8 cmd;int ret;
@@ -85,7 +85,7 @@ static int spi_flash_cmd_write_status(struct spi_flash *flash, u8 ws) }#if defined(CONFIG_SPI_FLASH_SPANSION ) || defined(CONFIG_SPI_FLASH_WINBOND ) -static int spi_flash_cmd_read_config (struct spi_flash *flash,u8 *rc) +static int read_cr (struct spi_flash *flash,u8 *rc) {int ret;u8 cmd;
@@ -100,13 +100,13 @@ static int spi_flash_cmd_read_config(struct spi_flash *flash, u8 *rc)return 0 ; } -static int spi_flash_cmd_write_config (struct spi_flash *flash,u8 wc) +static int write_cr (struct spi_flash *flash,u8 wc) {u8 data[2 ];u8 cmd;int ret; - ret =spi_flash_cmd_read_status (flash, &data[0 ]); + ret =read_sr (flash, &data[0 ]);if (ret <0 )return ret;
@@ -123,7 +123,7 @@ static int spi_flash_cmd_write_config(struct spi_flash *flash, u8 wc)#endif #ifdef CONFIG_SPI_FLASH_BAR -static int spi_flash_write_bank (struct spi_flash *flash,u32 offset) +static int spi_flash_write_bar (struct spi_flash *flash,u32 offset) {u8 cmd, bank_sel;int ret;
@@ -144,7 +144,7 @@ bar_end:return flash->bank_curr; } -static int spi_flash_read_bank (struct spi_flash *flash,u8 idcode0) +static int spi_flash_read_bar (struct spi_flash *flash,u8 idcode0) {u8 curr_bank =0 ;int ret;
@@ -175,7 +175,7 @@ bank_end:#endif #ifdef CONFIG_SF_DUAL_FLASH -static void spi_flash_dual_flash (struct spi_flash *flash,u32 *addr) +static void spi_flash_dual (struct spi_flash *flash,u32 *addr) {switch (flash->dual_flash) {case SF_DUAL_STACKED_FLASH :
@@ -201,7 +201,7 @@ static int spi_flash_sr_ready(struct spi_flash *flash)u8 sr;int ret; - ret =spi_flash_cmd_read_status (flash, &sr); + ret =read_sr (flash, &sr);if (ret <0 )return ret;
@@ -322,10 +322,10 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)#ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash >SF_SINGLE_FLASH ) -spi_flash_dual_flash (flash, &erase_addr); +spi_flash_dual (flash, &erase_addr);#endif #ifdef CONFIG_SPI_FLASH_BAR - ret =spi_flash_write_bank (flash, erase_addr); + ret =spi_flash_write_bar (flash, erase_addr);if (ret <0 )return ret;#endif
@@ -369,10 +369,10 @@ int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset,#ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash >SF_SINGLE_FLASH ) -spi_flash_dual_flash (flash, &write_addr); +spi_flash_dual (flash, &write_addr);#endif #ifdef CONFIG_SPI_FLASH_BAR - ret =spi_flash_write_bank (flash, write_addr); + ret =spi_flash_write_bar (flash, write_addr);if (ret <0 )return ret;#endif
@@ -464,10 +464,10 @@ int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset,#ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash >SF_SINGLE_FLASH ) -spi_flash_dual_flash (flash, &read_addr); +spi_flash_dual (flash, &read_addr);#endif #ifdef CONFIG_SPI_FLASH_BAR - ret =spi_flash_write_bank (flash, read_addr); + ret =spi_flash_write_bar (flash, read_addr);if (ret <0 )return ret; bank_sel = flash->bank_curr;
@@ -796,14 +796,14 @@ static int spi_flash_set_qeb_mxic(struct spi_flash *flash)u8 qeb_status;int ret; - ret =spi_flash_cmd_read_status (flash, &qeb_status); + ret =read_sr (flash, &qeb_status);if (ret <0 )return ret;if (qeb_status &STATUS_QEB_MXIC ) {debug ("SF: mxic: QEB is already set\n" ); }else { - ret =spi_flash_cmd_write_status (flash,STATUS_QEB_MXIC ); + ret =write_sr (flash,STATUS_QEB_MXIC );if (ret <0 )return ret; }
@@ -818,14 +818,14 @@ static int spi_flash_set_qeb_winspan(struct spi_flash *flash)u8 qeb_status;int ret; - ret =spi_flash_cmd_read_config (flash, &qeb_status); + ret =read_cr (flash, &qeb_status);if (ret <0 )return ret;if (qeb_status &STATUS_QEB_WINSPAN ) {debug ("SF: winspan: QEB is already set\n" ); }else { - ret =spi_flash_cmd_write_config (flash,STATUS_QEB_WINSPAN ); + ret =write_cr (flash,STATUS_QEB_WINSPAN );if (ret <0 )return ret; }
@@ -932,7 +932,7 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash)#if defined(CONFIG_SPI_FLASH_ATMEL ) || \ defined(CONFIG_SPI_FLASH_MACRONIX ) || \ defined(CONFIG_SPI_FLASH_SST ) -spi_flash_cmd_write_status (flash,0 ); +write_sr (flash,0 );#endif /* Assign spi data */
@@ -1065,7 +1065,7 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash)/* Configure the BAR - discover bank cmds and read current bank */ #ifdef CONFIG_SPI_FLASH_BAR - ret =spi_flash_read_bank (flash, idcode[0 ]); + ret =spi_flash_read_bar (flash, idcode[0 ]);if (ret <0 )return ret;#endif
Signature · 1 line
1.9.1
PATCH v6 8/23 sf: Use flash function pointers in dm_spi_flash_ops
In reply to Jagan Tekiflash operations are defined as static and reuse them with function-pointers so call them with generic function pounters instead of calling like normal functions.
--- drivers/mtd/spi/sf_ops.c | 2 -- drivers/mtd/spi/sf_probe.c | 15 +++------------ include/spi_flash.h | 13 ------------- 3 files changed, 3 insertions(+), 27 deletions(-)
drivers/mtd/spi/sf_ops.c +0 -2
@@ -942,7 +942,6 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash) flash->dual_flash = flash->spi->option;/* Assign spi_flash ops */ -#ifndef CONFIG_DM_SPI_FLASH flash->write = spi_flash_cmd_write_ops;#if defined(CONFIG_SPI_FLASH_SST )if (params->flags &SST_WR )
@@ -957,7 +956,6 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash)#endif flash->erase = spi_flash_cmd_erase_ops; flash->read = spi_flash_cmd_read_ops; -#endif /* lock hooks are flash specific - assign them based on idcode0 */ switch (idcode[0 ]) {
drivers/mtd/spi/sf_probe.c +3 -12
@@ -120,7 +120,7 @@ static int spi_flash_std_read(struct udevice *dev, u32 offset, size_t len, {struct spi_flash *flash =dev_get_uclass_priv (dev); -return spi_flash_cmd_read_ops (flash, offset, len, buf); +return flash->read (flash, offset, len, buf); } int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
@@ -128,23 +128,14 @@ int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len, {struct spi_flash *flash =dev_get_uclass_priv (dev); -#if defined(CONFIG_SPI_FLASH_SST ) -if (flash->flags &SNOR_F_SST_WR ) { -if (flash->spi->op_mode_tx &SPI_OPM_TX_BP ) -return sst_write_bp (flash, offset, len, buf); -else -return sst_write_wp (flash, offset, len, buf); - } -#endif - -return spi_flash_cmd_write_ops (flash, offset, len, buf); +return flash->write (flash, offset, len, buf); }int spi_flash_std_erase (struct udevice *dev,u32 offset,size_t len) {struct spi_flash *flash =dev_get_uclass_priv (dev); -return spi_flash_cmd_erase_ops (flash, offset, len); +return flash->erase (flash, offset, len); }int spi_flash_std_probe (struct udevice *dev)
include/spi_flash.h +0 -13
@@ -94,23 +94,10 @@ struct spi_flash {int (*flash_lock)(struct spi_flash *flash,u32 ofs,size_t len);int (*flash_unlock)(struct spi_flash *flash,u32 ofs,size_t len);int (*flash_is_locked)(struct spi_flash *flash,u32 ofs,size_t len); -#ifndef CONFIG_DM_SPI_FLASH -/* -* These are not strictly needed for driver model, but keep them here -* while the transition is in progress. -* -* Normally each driver would provide its own operations, but for -* SPI flash most chips use the same algorithms. One approach is -* to create a 'common' SPI flash device which knows how to talk -* to most devices, and then allow other drivers to be used instead -* if required, perhaps with a way of scanning through the list to -* find the driver that matches the device. -*/ int (*read)(struct spi_flash *flash,u32 offset,size_t len,void *buf);int (*write)(struct spi_flash *flash,u32 offset,size_t len,const void *buf);int (*erase)(struct spi_flash *flash,u32 offset,size_t len); -#endif };struct dm_spi_flash_ops {
Signature · 1 line
1.9.1
PATCH v6 9/23 sf: Flash power up read-only based on idcode0
In reply to Jagan TekiUsing macro's for flash power up read-only access code leads wrong behaviour hence use idcode0 for runtime detection, hence the flash which require this functionality gets detected at runtime.
--- drivers/mtd/spi/sf_internal.h | 2 ++ drivers/mtd/spi/sf_ops.c | 7 +++---- 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/mtd/spi/sf_internal.h +2 -0
@@ -64,7 +64,9 @@ enum spi_nor_option_flags {#define SPI_FLASH_CFI_MFR_SPANSION 0x01#define SPI_FLASH_CFI_MFR_STMICRO 0x20#define SPI_FLASH_CFI_MFR_MACRONIX 0xc2 +#define SPI_FLASH_CFI_MFR_SST 0xbf#define SPI_FLASH_CFI_MFR_WINBOND 0xef +#define SPI_FLASH_CFI_MFR_ATMEL 0x1f/* Erase commands */ #define CMD_ERASE_4K 0x20
drivers/mtd/spi/sf_ops.c +3 -4
@@ -929,11 +929,10 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash) }/* Flash powers up read-only, so clear BP# bits */ -#if defined(CONFIG_SPI_FLASH_ATMEL ) || \ - defined(CONFIG_SPI_FLASH_MACRONIX ) || \ - defined(CONFIG_SPI_FLASH_SST ) +if (idcode[0 ] ==SPI_FLASH_CFI_MFR_ATMEL || + idcode[0 ] ==SPI_FLASH_CFI_MFR_MACRONIX || + idcode[0 ] ==SPI_FLASH_CFI_MFR_SST )write_sr (flash,0 ); -#endif /* Assign spi data */ flash->spi = spi;
Signature · 1 line
1.9.1
PATCH v6 10/23 sf: Use static for file-scope functions
In reply to Jagan TekiUse static for file-scope functions and removed
them from header files.
--- drivers/mtd/spi/sf_internal.h | 21 --------------------- drivers/mtd/spi/sf_ops.c | 11 ++++++----- 2 files changed, 6 insertions(+), 26 deletions(-)
drivers/mtd/spi/sf_internal.h +0 -21
@@ -120,11 +120,6 @@ enum spi_nor_option_flags {#ifdef CONFIG_SPI_FLASH_SST # define CMD_SST_BP 0x02/* Byte Program */ # define CMD_SST_AAI_WP 0xAD/* Auto Address Incr Word Program */ - -int sst_write_wp (struct spi_flash *flash,u32 offset,size_t len, -const void *buf); -int sst_write_bp (struct spi_flash *flash,u32 offset,size_t len, -const void *buf);#endif /**
@@ -168,10 +163,6 @@ int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,int spi_flash_cmd_write (struct spi_slave *spi,const u8 *cmd,size_t cmd_len,const void *data,size_t data_len); - -/* Flash erase(sectors) operation, support all possible erase commands */ -int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset,size_t len); -/* Lock stmicro spi flash region */ int stm_lock (struct spi_flash *flash,u32 ofs,size_t len);
@@ -205,24 +196,12 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd, size_t cmd_len, const void *buf, size_t buf_len);/* -* Flash write operation, support all possible write commands. -* Write the requested data out breaking it up into multiple write -* commands as needed per the write size. -*/ -int spi_flash_cmd_write_ops (struct spi_flash *flash,u32 offset, -size_t len,const void *buf); - -/* * Same as spi_flash_cmd_read() except it also claims/releases the SPI * bus. Used as common part of the ->read() operation. */ int spi_flash_read_common (struct spi_flash *flash,const u8 *cmd,size_t cmd_len,void *data,size_t data_len); -/* Flash read operation, support all possible read commands */ -int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset, -size_t len,void *data); -#ifdef CONFIG_SPI_FLASH_MTD int spi_flash_mtd_register (struct spi_flash *flash);void spi_flash_mtd_unregister (void );
drivers/mtd/spi/sf_ops.c +6 -5
@@ -299,7 +299,8 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,return ret; } -int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset,size_t len) +static int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset, +size_t len) {u32 erase_size, erase_addr;u8 cmd[SPI_FLASH_CMD_LEN ];
@@ -347,7 +348,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)return ret; } -int spi_flash_cmd_write_ops (struct spi_flash *flash,u32 offset, +static int spi_flash_cmd_write_ops (struct spi_flash *flash,u32 offset,size_t len,const void *buf) {unsigned long byte_addr, page_size;
@@ -429,7 +430,7 @@ void __weak spi_flash_copy_mmap(void *data, void *offset, size_t len)memcpy (data, offset, len); } -int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset, +static int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset,size_t len,void *data) {u8 *cmd, cmdsz;
@@ -521,7 +522,7 @@ static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)return spi_flash_cmd_wait_ready (flash,SPI_FLASH_PROG_TIMEOUT ); } -int sst_write_wp (struct spi_flash *flash,u32 offset,size_t len, +static int sst_write_wp (struct spi_flash *flash,u32 offset,size_t len,const void *buf) {size_t actual, cmd_len;
@@ -588,7 +589,7 @@ int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,return ret; } -int sst_write_bp (struct spi_flash *flash,u32 offset,size_t len, +static int sst_write_bp (struct spi_flash *flash,u32 offset,size_t len,const void *buf) {size_t actual;
Signature · 1 line
1.9.1
PATCH v6 11/23 sf: Remove unneeded header includes
In reply to Jagan TekiRemoved unneeded header includes in sf_ops and sf_probe
--- drivers/mtd/spi/sf_ops.c | 2 -- drivers/mtd/spi/sf_probe.c | 3 --- 2 files changed, 5 deletions(-)
drivers/mtd/spi/sf_ops.c +0 -2
@@ -14,8 +14,6 @@#include <mapmem.h> #include <spi.h> #include <spi_flash.h> -#include <watchdog.h> -#include <linux/compiler.h> #include <linux/log2.h> #include "sf_internal.h"
drivers/mtd/spi/sf_probe.c +0 -3
@@ -11,12 +11,9 @@#include <common.h> #include <dm.h> #include <errno.h> -#include <fdtdec.h> #include <malloc.h> -#include <mapmem.h> #include <spi.h> #include <spi_flash.h> -#include <asm/io.h> #include "sf_internal.h"
Signature · 1 line
1.9.1
PATCH v6 12/23 sf: probe: Use spi_flash_scan in dm-spi-flash
In reply to Jagan TekiThis patch add support to use spi_flash_scan in dm-spi-flash probe, so-that it can access
the spi_flash functionalities same as non-dm sf probe.
--- drivers/mtd/spi/sf_probe.c | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-)
drivers/mtd/spi/sf_probe.c +25 -3
@@ -137,14 +137,36 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)int spi_flash_std_probe (struct udevice *dev) { -struct spi_slave *slave =dev_get_parent_priv (dev);struct dm_spi_slave_platdata *plat =dev_get_parent_platdata (dev); +struct spi_slave *slave =dev_get_parent_priv (dev);struct spi_flash *flash; +int ret; + +debug ("%s: slave=%p, cs=%d\n" , __func__, slave, plat->cs); flash =dev_get_uclass_priv (dev); flash->dev = dev; -debug ("%s: slave=%p, cs=%d\n" , __func__, slave, plat->cs); -return spi_flash_probe_slave (slave, flash); + +/* Claim spi bus */ + ret =spi_claim_bus (slave); +if (ret) { +debug ("SF: Failed to claim SPI bus: %d\n" , ret); +return ret; + } + + ret =spi_flash_scan (slave, flash); +if (ret) { + ret = -EINVAL ; + goto err_read_id; + } + +#ifdef CONFIG_SPI_FLASH_MTD + ret =spi_flash_mtd_register (flash); +#endif + +err_read_id: +spi_release_bus (slave); +return ret; }static const struct dm_spi_flash_ops spi_flash_std_ops = {
Signature · 1 line
1.9.1
PATCH v6 13/23 sf: Re-factorize spi_flash_probe_tail code
In reply to Jagan Tekispi_flash_probe_tail code looks not in proper shape to add more functionalities. hence refactorized so-that it's more readable and hence we may extend more functionalies to it.
--- drivers/mtd/spi/sf_internal.h | 3 +- drivers/mtd/spi/sf_ops.c | 7 ++-- drivers/mtd/spi/sf_probe.c | 74 ++++++++++++++++++------------------------- 3 files changed, 34 insertions(+), 50 deletions(-)
drivers/mtd/spi/sf_internal.h +1 -2
@@ -209,7 +209,6 @@ void spi_flash_mtd_unregister(void);/** * spi_flash_scan - scan the SPI FLASH -* @spi: the spi slave structure * @flash: the spi flash structure * * The drivers can use this fuction to scan the SPI FLASH.
@@ -218,6 +217,6 @@ void spi_flash_mtd_unregister(void);* * Return: 0 for success, others for failure. */ -int spi_flash_scan (struct spi_slave *spi,struct spi_flash *flash); +int spi_flash_scan (struct spi_flash *flash);#endif /* _SF_INTERNAL_H_ */
drivers/mtd/spi/sf_ops.c +3 -4
@@ -884,7 +884,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash) }#endif /* CONFIG_IS_ENABLED(OF_CONTROL) */ -int spi_flash_scan (struct spi_slave *spi,struct spi_flash *flash) +int spi_flash_scan (struct spi_flash *flash) {const struct spi_flash_params *params;u16 jedec, ext_jedec;
@@ -893,7 +893,7 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash)int ret;/* Read the ID codes */ - ret =spi_flash_cmd (spi,CMD_READ_ID , idcode,sizeof (idcode)); + ret =spi_flash_cmd (flash->spi,CMD_READ_ID , idcode,sizeof (idcode));if (ret) {printf ("SF: Failed to get idcodes\n" );return -EINVAL ;
@@ -934,9 +934,8 @@ int spi_flash_scan(struct spi_slave *spi, struct spi_flash *flash)write_sr (flash,0 );/* Assign spi data */ - flash->spi = spi; flash->name = params->name; - flash->memory_map = spi->memory_map; + flash->memory_map = flash->spi->memory_map; flash->dual_flash = flash->spi->option;/* Assign spi_flash ops */
drivers/mtd/spi/sf_probe.c +30 -44
99 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v6 14/23 dm-sf: Re-factorize spi_flash_std_probe code
In reply to Jagan Tekispi_flash_probe_tail code looks not in proper shape to add more functionalities. hence refactorized so-that it's more readable and hence we may extend more functionalies to it.
--- drivers/mtd/spi/sf_probe.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
drivers/mtd/spi/sf_probe.c +13 -7
@@ -123,15 +123,12 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)int spi_flash_std_probe (struct udevice *dev) { -struct dm_spi_slave_platdata *plat =dev_get_parent_platdata (dev); +struct spi_flash *flash =dev_get_uclass_priv (dev);struct spi_slave *slave =dev_get_parent_priv (dev); -struct spi_flash *flash;int ret; -debug ("%s: slave=%p, cs=%d\n" , __func__, slave, plat->cs); - - flash =dev_get_uclass_priv (dev); flash->dev = dev; + flash->spi = slave;/* Claim spi bus */ ret =spi_claim_bus (slave);
@@ -143,14 +140,23 @@ int spi_flash_std_probe(struct udevice *dev) ret =spi_flash_scan (flash);if (ret) { ret = -EINVAL ; - goto err_read_id; + goto err_scan; }#ifdef CONFIG_SPI_FLASH_MTD ret =spi_flash_mtd_register (flash); +if (ret) { +printf ("SF: failed to register mtd device: %d\n" , ret); + goto err_mtd; + }#endif +return ret; -err_read_id: +#ifdef CONFIG_SPI_FLASH_MTD +err_mtd: +spi_free_slave (slave); +#endif +err_scan:spi_release_bus (slave);return ret; }
Signature · 1 line
1.9.1
PATCH v6 15/23 sf: Add MTD support to spi_flash
In reply to Jagan TekiThis patch adds mtd_info support to spi_flash layer, MTD has proven core for flash operations so adding MTD to spi_flash will extends more functionality.
--- drivers/mtd/spi/sf_ops.c | 45 +++++++++++++++++++++++++-------------------- drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++++++-------- include/spi_flash.h | 9 +++++---- 3 files changed, 48 insertions(+), 32 deletions(-)
drivers/mtd/spi/sf_ops.c +25 -20
@@ -147,7 +147,7 @@ static int spi_flash_read_bar(struct spi_flash *flash, u8 idcode0)u8 curr_bank =0 ;int ret; -if (flash->size <=SPI_FLASH_16MB_BOUN ) +if (flash->mtd->size <=SPI_FLASH_16MB_BOUN ) goto bank_end;switch (idcode0) {
@@ -177,8 +177,8 @@ static void spi_flash_dual(struct spi_flash *flash, u32 *addr) {switch (flash->dual_flash) {case SF_DUAL_STACKED_FLASH : -if (*addr >= (flash->size >>1 )) { - *addr -= flash->size >>1 ; +if (*addr >= (flash->mtd->size >>1 )) { + *addr -= flash->mtd->size >>1 ; flash->spi->flags |=SPI_XFER_U_PAGE ; }else { flash->spi->flags &= ~SPI_XFER_U_PAGE ;
@@ -304,7 +304,7 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset,u8 cmd[SPI_FLASH_CMD_LEN ];int ret =-1 ; - erase_size = flash->erase_size; + erase_size = mtd->erasesize;if (offset % erase_size || len % erase_size) {debug ("SF: Erase offset/length not multiple of erase size\n" );return -1 ;
@@ -874,7 +874,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)return 0 ; } -if (flash->size != size) { +if (flash->mtd->size != size) {debug ("%s: Memory map must cover entire device\n" , __func__);return -1 ; }
@@ -886,6 +886,7 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)int spi_flash_scan (struct spi_flash *flash) { +struct mtd_info *mtd = flash->mtd;const struct spi_flash_params *params;u16 jedec, ext_jedec;u8 idcode[5 ];
@@ -935,24 +936,27 @@ int spi_flash_scan(struct spi_flash *flash)/* Assign spi data */ flash->name = params->name; + mtd->type =MTD_NORFLASH ; + mtd->writesize =1 ; + mtd->flags =MTD_CAP_NORFLASH ; flash->memory_map = flash->spi->memory_map; flash->dual_flash = flash->spi->option;/* Assign spi_flash ops */ - flash->write = spi_flash_cmd_write_ops; + mtd->_write = spi_flash_cmd_write_ops;#if defined(CONFIG_SPI_FLASH_SST )if (params->flags &SST_WR ) flash->flags |=SNOR_F_SST_WR ;if (params->flags &SNOR_F_SST_WR ) {if (flash->spi->op_mode_tx &SPI_OPM_TX_BP ) - flash->write = sst_write_bp; + mtd->_write = sst_write_bp;else - flash->write = sst_write_wp; + mtd->_write = sst_write_wp; }#endif - flash->erase = spi_flash_cmd_erase_ops; - flash->read = spi_flash_cmd_read_ops; + mtd->_erase = spi_flash_cmd_erase_ops; + mtd->_read = spi_flash_cmd_read_ops;/* lock hooks are flash specific - assign them based on idcode0 */ switch (idcode[0 ]) {
@@ -984,27 +988,28 @@ int spi_flash_scan(struct spi_flash *flash) flash->page_size =256 ; } flash->page_size <<= flash->shift; + mtd->writebufsize = flash->page_size; flash->sector_size = params->sector_size << flash->shift; - flash->size = flash->sector_size * params->nr_sectors << flash->shift; + mtd->size = flash->sector_size * params->nr_sectors << flash->shift;#ifdef CONFIG_SF_DUAL_FLASH if (flash->dual_flash &SF_DUAL_STACKED_FLASH ) - flash->size <<=1 ; + mtd->size <<=1 ;#endif /* Compute erase sector and command */ if (params->flags &SECT_4K ) { flash->erase_cmd =CMD_ERASE_4K ; - flash->erase_size =4096 << flash->shift; + mtd->erasesize =4096 << flash->shift; }else if (params->flags &SECT_32K ) { flash->erase_cmd =CMD_ERASE_32K ; - flash->erase_size =32768 << flash->shift; + mtd->erasesize =32768 << flash->shift; }else { flash->erase_cmd =CMD_ERASE_64K ; - flash->erase_size = flash->sector_size; + mtd->erasesize = flash->sector_size; }/* Now erase size becomes valid sector size */ - flash->sector_size = flash->erase_size; + flash->sector_size = mtd->erasesize;/* Look for the fastest read cmd */ cmd =fls (params->e_rd_cmd & flash->spi->op_mode_rx);
@@ -1076,8 +1081,8 @@ int spi_flash_scan(struct spi_flash *flash)#ifndef CONFIG_SPL_BUILD printf ("SF: Detected %s with page size " , flash->name);print_size (flash->page_size,", erase size " ); -print_size (flash->erase_size,", total " ); -print_size (flash->size,"" ); +print_size (mtd->erasesize,", total " ); +print_size (mtd->size,"" );if (flash->memory_map)printf (", mapped at %p" , flash->memory_map);puts ("\n" );
@@ -1085,9 +1090,9 @@ int spi_flash_scan(struct spi_flash *flash)#ifndef CONFIG_SPI_FLASH_BAR if (((flash->dual_flash ==SF_SINGLE_FLASH ) && - (flash->size >SPI_FLASH_16MB_BOUN )) || + (mtd->size >SPI_FLASH_16MB_BOUN )) || ((flash->dual_flash >SF_SINGLE_FLASH ) && - (flash->size >SPI_FLASH_16MB_BOUN <<1 ))) { + (mtd->size >SPI_FLASH_16MB_BOUN <<1 ))) {puts ("SF: Warning - Only lower 16MiB accessible," );puts (" Full access #define CONFIG_SPI_FLASH_BAR\n" ); }
drivers/mtd/spi/sf_probe.c +18 -8
@@ -14,9 +14,15 @@#include <malloc.h> #include <spi.h> #include <spi_flash.h> +#include <linux/mtd/mtd.h> #include "sf_internal.h" +struct spi_flash_priv { +struct spi_flash flash; +struct mtd_info mtd; +}; +#ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail (struct spi_slave *bus) {
@@ -123,12 +129,19 @@ int spi_flash_std_erase(struct udevice *dev, u32 offset, size_t len)int spi_flash_std_probe (struct udevice *dev) { -struct spi_flash *flash =dev_get_uclass_priv (dev); +struct spi_flash_priv *priv =dev_get_uclass_priv (dev);struct spi_slave *slave =dev_get_parent_priv (dev); +struct spi_flash *flash;int ret; - flash->dev = dev; + flash = &priv->flash; + flash->mtd = &priv->mtd; + flash->spi = slave; + flash->priv = priv; + + priv->mtd.priv = flash; + flash->dev = dev;/* Claim spi bus */ ret =spi_claim_bus (slave);
@@ -143,19 +156,16 @@ int spi_flash_std_probe(struct udevice *dev) goto err_scan; } -#ifdef CONFIG_SPI_FLASH_MTD - ret =spi_flash_mtd_register (flash); + ret =add_mtd_device (&priv->mtd);if (ret) {printf ("SF: failed to register mtd device: %d\n" , ret); goto err_mtd; } -#endif +return ret; -#ifdef CONFIG_SPI_FLASH_MTD err_mtd:spi_free_slave (slave); -#endif err_scan:spi_release_bus (slave);return ret;
@@ -177,7 +187,7 @@ U_BOOT_DRIVER(spi_flash_std) = { .id = UCLASS_SPI_FLASH, .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, - .priv_auto_alloc_size = sizeof(struct spi_flash), + .priv_auto_alloc_size = sizeof(struct spi_flash_priv), .ops = &spi_flash_std_ops, };
include/spi_flash.h +5 -4
@@ -17,6 +17,7 @@#include <dm.h> /* Because we dereference struct udevice here */ #include <linux/types.h> +#include <linux/mtd/mtd.h> #ifndef CONFIG_SF_DEFAULT_SPEED # define CONFIG_SF_DEFAULT_SPEED 1000000
@@ -36,16 +37,15 @@ struct spi_slave;/** * struct spi_flash - SPI flash structure * +* @mtd: point to a mtd_info structure * @spi: SPI slave * @dev: SPI flash device * @name: Name of SPI flash * @dual_flash: Indicates dual flash memories - dual stacked, parallel * @shift: Flash shift useful in dual parallel * @flags: Indication of spi flash flags -* @size: Total flash size * @page_size: Write (page) size * @sector_size: Sector size -* @erase_size: Erase size * @bank_read_cmd: Bank read cmd * @bank_write_cmd: Bank write cmd * @bank_curr: Current flash bank
@@ -54,6 +54,7 @@ struct spi_slave;* @write_cmd: Write cmd - page and quad program. * @dummy_byte: Dummy cycles for read operation. * @memory_map: Address of read-only SPI flash access +* @priv: the private data * @flash_lock: lock a region of the SPI Flash * @flash_unlock: unlock a region of the SPI Flash * @flash_is_locked: check if a region of the SPI Flash is completely locked
@@ -66,6 +67,7 @@ struct spi_slave;* return 0 - Success, 1 - Failure */ struct spi_flash { +struct mtd_info *mtd;struct spi_slave *spi;#ifdef CONFIG_DM_SPI_FLASH struct udevice *dev;
@@ -75,10 +77,8 @@ struct spi_flash {u8 shift;u16 flags; -u32 size;u32 page_size;u32 sector_size; -u32 erase_size;#ifdef CONFIG_SPI_FLASH_BAR u8 bank_read_cmd;u8 bank_write_cmd;
@@ -90,6 +90,7 @@ struct spi_flash {u8 dummy_byte;void *memory_map; +void *priv;int (*flash_lock)(struct spi_flash *flash,u32 ofs,size_t len);int (*flash_unlock)(struct spi_flash *flash,u32 ofs,size_t len);
Signature · 1 line
1.9.1
PATCH v6 16/23 sf: Use mtd_info ops instead of spi_flash ops
In reply to Jagan TekiSince MTD support is added in spi_flash layer, this patch uses mtd_info operations instead of legacy spi_flash operations.
--- drivers/mtd/spi/sf_ops.c | 66 ++++++++++++++++++++++++++++-------------------- include/spi_flash.h | 23 ++++++++--------- 2 files changed, 49 insertions(+), 40 deletions(-)
drivers/mtd/spi/sf_ops.c +39 -27
@@ -297,18 +297,16 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,return ret; } -static int spi_flash_cmd_erase_ops (struct spi_flash *flash,u32 offset, -size_t len) +static int spi_flash_cmd_erase_ops (struct mtd_info *mtd, +struct erase_info *instr) { -u32 erase_size, erase_addr; +struct spi_flash *flash = mtd->priv; +u32 offset, len, erase_addr;u8 cmd[SPI_FLASH_CMD_LEN ];int ret =-1 ; - erase_size = mtd->erasesize; -if (offset % erase_size || len % erase_size) { -debug ("SF: Erase offset/length not multiple of erase size\n" ); -return -1 ; - } + offset = instr->addr; + len = instr->len;if (flash->flash_is_locked (flash, offset, len) >0 ) {printf ("offset 0x%x is protected and cannot be erased\n" , offset);
@@ -336,19 +334,24 @@ static int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, ret =spi_flash_write_common (flash, cmd,sizeof (cmd),NULL ,0 );if (ret <0 ) {debug ("SF: erase failed\n" ); -break ; + goto erase_err; } - offset += erase_size; - len -= erase_size; + offset += mtd->erasesize; + len -= mtd->erasesize; }return ret; + +erase_err: + instr->state =MTD_ERASE_FAILED ; +return ret; } -static int spi_flash_cmd_write_ops (struct spi_flash *flash,u32 offset, -size_t len,const void *buf) +static int spi_flash_cmd_write_ops (struct mtd_info *mtd,loff_t offset, +size_t len,size_t *retlen,const u_char *buf) { +struct spi_flash *flash = mtd->priv;unsigned long byte_addr, page_size;u32 write_addr;size_t chunk_len, actual;
@@ -395,6 +398,7 @@ static int spi_flash_cmd_write_ops(struct spi_flash *flash, u32 offset, } offset += chunk_len; + *retlen += chunk_len; }return ret;
@@ -428,11 +432,12 @@ void __weak spi_flash_copy_mmap(void *data, void *offset, size_t len)memcpy (data, offset, len); } -static int spi_flash_cmd_read_ops (struct spi_flash *flash,u32 offset, -size_t len,void *data) +static int spi_flash_cmd_read_ops (struct mtd_info *mtd,loff_t offset, +size_t len,size_t *retlen,u_char *data) { -u8 *cmd, cmdsz; +struct spi_flash *flash = mtd->priv;u32 remain_len, read_len, read_addr; +u8 *cmd, cmdsz;int bank_sel =0 ;int ret =-1 ;
@@ -489,6 +494,7 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, offset += read_len; len -= read_len; data += read_len; + *retlen += read_len; }free (cmd);
@@ -496,7 +502,8 @@ static int spi_flash_cmd_read_ops(struct spi_flash *flash, u32 offset, } #ifdef CONFIG_SPI_FLASH_SST -static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf) +static int sst_byte_write(struct spi_flash *flash, u32 offset, + const void *buf, size_t *retlen) { int ret; u8 cmd[4] = {
@@ -517,12 +524,15 @@ static int sst_byte_write(struct spi_flash *flash, u32 offset, const void *buf)if (ret)return ret; + *retlen +=1 ; +return spi_flash_cmd_wait_ready (flash,SPI_FLASH_PROG_TIMEOUT ); } -static int sst_write_wp (struct spi_flash *flash,u32 offset,size_t len, -const void *buf) +static int sst_write_wp (struct mtd_info *mtd,loff_t offset,size_t len, +size_t *retlen,const u_char *buf) { +struct spi_flash *flash = mtd->priv;size_t actual, cmd_len;int ret;u8 cmd[4 ];
@@ -536,7 +546,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,/* If the data is not word aligned, write out leading single byte */ actual = offset %2 ;if (actual) { - ret =sst_byte_write (flash, offset, buf); + ret =sst_byte_write (flash, offset, buf, retlen);if (ret) goto done; }
@@ -553,7 +563,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, cmd[3 ] = offset;for (; actual < len -1 ; actual +=2 ) { -debug ("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06x }\n" , +debug ("WP[%02x]: 0x%p => cmd = { 0x%02x 0x%06llx }\n" ,spi_w8r8 (flash->spi,CMD_READ_STATUS ), buf + actual, cmd[0 ], offset);
@@ -570,6 +580,7 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len, cmd_len =1 ; offset +=2 ; + *retlen +=2 ; }if (!ret)
@@ -577,19 +588,20 @@ static int sst_write_wp(struct spi_flash *flash, u32 offset, size_t len,/* If there is a single trailing byte, write it out */ if (!ret && actual != len) - ret =sst_byte_write (flash, offset, buf + actual); + ret =sst_byte_write (flash, offset, buf + actual, retlen); done: -debug ("SF: sst: program %s %zu bytes @ 0x%zx\n" , +debug ("SF: sst: program %s %zu bytes @ 0x%llx\n" , ret ?"failure" :"success" , len, offset - actual);spi_release_bus (flash->spi);return ret; } -static int sst_write_bp (struct spi_flash *flash,u32 offset,size_t len, -const void *buf) +static int sst_write_bp (struct mtd_info *mtd,loff_t offset,size_t len, +size_t *retlen,const u_char *buf) { +struct spi_flash *flash = mtd->priv;size_t actual;int ret;
@@ -600,7 +612,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len, }for (actual =0 ; actual < len; actual++) { - ret =sst_byte_write (flash, offset, buf + actual); + ret =sst_byte_write (flash, offset, buf + actual, retlen);if (ret) {debug ("SF: sst byte program failed\n" );break ;
@@ -611,7 +623,7 @@ static int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,if (!ret) ret =spi_flash_cmd_write_disable (flash); -debug ("SF: sst: program %s %zu bytes @ 0x%zx\n" , +debug ("SF: sst: program %s %zu bytes @ 0x%llx\n" , ret ?"failure" :"success" , len, offset - actual);spi_release_bus (flash->spi);
include/spi_flash.h +10 -13
@@ -58,12 +58,6 @@ struct spi_slave;* @flash_lock: lock a region of the SPI Flash * @flash_unlock: unlock a region of the SPI Flash * @flash_is_locked: check if a region of the SPI Flash is completely locked -* @read: Flash read ops: Read len bytes at offset into buf -* Supported cmds: Fast Array Read -* @write: Flash write ops: Write len bytes from buf into offset -* Supported cmds: Page Program -* @erase: Flash erase ops: Erase len bytes from offset -* Supported cmds: Sector erase 4K, 32K, 64K * return 0 - Success, 1 - Failure */ struct spi_flash {
@@ -95,10 +89,6 @@ struct spi_flash {int (*flash_lock)(struct spi_flash *flash,u32 ofs,size_t len);int (*flash_unlock)(struct spi_flash *flash,u32 ofs,size_t len);int (*flash_is_locked)(struct spi_flash *flash,u32 ofs,size_t len); -int (*read)(struct spi_flash *flash,u32 offset,size_t len,void *buf); -int (*write)(struct spi_flash *flash,u32 offset,size_t len, -const void *buf); -int (*erase)(struct spi_flash *flash,u32 offset,size_t len); };struct dm_spi_flash_ops {
@@ -163,19 +153,26 @@ int spi_flash_remove(struct udevice *flash);static inline int spi_flash_read (struct spi_flash *flash,u32 offset,size_t len,void *buf) { -return spi_flash_read_dm (flash->dev, offset, len, buf); +return mtd_read (flash->mtd, offset, len, &len, (u_char *)buf); }static inline int spi_flash_write (struct spi_flash *flash,u32 offset,size_t len,const void *buf) { -return spi_flash_write_dm (flash->dev, offset, len, buf); +return mtd_write (flash->mtd, offset, len, &len, (u_char *)buf); }static inline int spi_flash_erase (struct spi_flash *flash,u32 offset,size_t len) { -return spi_flash_erase_dm (flash->dev, offset, len); +struct erase_info instr; + + instr.mtd = flash->mtd; + instr.addr = offset; + instr.len = len; + instr.callback =0 ; + +return mtd_erase (flash->mtd, &instr); }struct sandbox_state ;
Signature · 1 line
1.9.1
PATCH v6 17/23 cmd_sf: Use mtd->size instead of flash->size
In reply to Jagan TekiSince mtd got added, replace flash->size with mtd->size.
--- common/cmd_sf.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
common/cmd_sf.c +8 -8
@@ -275,13 +275,13 @@ static int do_spi_flash_read_write(int argc, char * const argv[])return -1 ;if (mtd_arg_off_size (argc -2 , &argv[2 ], &dev, &offset, &len, - &maxsize,MTD_DEV_TYPE_NOR , flash->size)) + &maxsize,MTD_DEV_TYPE_NOR , flash->mtd->size))return -1 ;/* Consistency checking */ -if (offset + len > flash->size) { -printf ("ERROR: attempting %s past flash size (%#x)\n" , - argv[0 ], flash->size); +if (offset + len > flash->mtd->size) { +printf ("ERROR: attempting %s past flash size (0x%llx)\n" , + argv[0 ], flash->mtd->size);return 1 ; }
@@ -327,7 +327,7 @@ static int do_spi_flash_erase(int argc, char * const argv[])return -1 ;if (mtd_arg_off (argv[1 ], &dev, &offset, &len, &maxsize, -MTD_DEV_TYPE_NOR , flash->size)) +MTD_DEV_TYPE_NOR , flash->mtd->size))return -1 ; ret =sf_parse_len_arg (argv[2 ], &size);
@@ -335,9 +335,9 @@ static int do_spi_flash_erase(int argc, char * const argv[])return -1 ;/* Consistency checking */ -if (offset + size > flash->size) { -printf ("ERROR: attempting %s past flash size (%#x)\n" , - argv[0 ], flash->size); +if (offset + size > flash->mtd->size) { +printf ("ERROR: attempting %s past flash size (0x%llx)\n" , + argv[0 ], flash->mtd->size);return 1 ; }
Signature · 1 line
1.9.1
PATCH v6 18/23 dm-sf: use mtd_ops, drop dm_spi_flash_ops
In reply to Jagan TekiSince mtd_info ops got introduced, just drop the unneeded dm_spi_flash operations.
--- drivers/mtd/spi/sf-uclass.c | 16 -------- drivers/mtd/spi/sf_probe.c | 30 --------------- include/spi_flash.h | 90 +++++++-------------------------------------- 3 files changed, 14 insertions(+), 122 deletions(-)
drivers/mtd/spi/sf-uclass.c +0 -16
@@ -11,22 +11,6 @@#include <dm/device-internal.h> #include "sf_internal.h" -int spi_flash_read_dm (struct udevice *dev,u32 offset,size_t len,void *buf) -{ -return sf_get_ops (dev)->read (dev, offset, len, buf); -} - -int spi_flash_write_dm (struct udevice *dev,u32 offset,size_t len, -const void *buf) -{ -return sf_get_ops (dev)->write (dev, offset, len, buf); -} - -int spi_flash_erase_dm (struct udevice *dev,u32 offset,size_t len) -{ -return sf_get_ops (dev)->erase (dev, offset, len); -} -/* * TODO(sjg at chromium.org): This is an old-style function. We should remove * it when all SPI flash drivers use dm
drivers/mtd/spi/sf_probe.c +0 -30
@@ -104,29 +104,6 @@ void spi_flash_free(struct spi_flash *flash)#else /* defined CONFIG_DM_SPI_FLASH */ -static int spi_flash_std_read (struct udevice *dev,u32 offset,size_t len, -void *buf) -{ -struct spi_flash *flash =dev_get_uclass_priv (dev); - -return flash->read (flash, offset, len, buf); -} - -int spi_flash_std_write (struct udevice *dev,u32 offset,size_t len, -const void *buf) -{ -struct spi_flash *flash =dev_get_uclass_priv (dev); - -return flash->write (flash, offset, len, buf); -} - -int spi_flash_std_erase (struct udevice *dev,u32 offset,size_t len) -{ -struct spi_flash *flash =dev_get_uclass_priv (dev); - -return flash->erase (flash, offset, len); -} -int spi_flash_std_probe (struct udevice *dev) {struct spi_flash_priv *priv =dev_get_uclass_priv (dev);
@@ -171,12 +148,6 @@ err_scan:return ret; } -static const struct dm_spi_flash_ops spi_flash_std_ops = { - .read = spi_flash_std_read, - .write = spi_flash_std_write, - .erase = spi_flash_std_erase, -}; -static const struct udevice_id spi_flash_std_ids[] = { { .compatible ="spi-flash" }, { }
@@ -188,7 +159,6 @@ U_BOOT_DRIVER(spi_flash_std) = { .of_match = spi_flash_std_ids, .probe = spi_flash_std_probe, .priv_auto_alloc_size = sizeof(struct spi_flash_priv), - .ops = &spi_flash_std_ops, };#endif /* CONFIG_DM_SPI_FLASH */
include/spi_flash.h +14 -76
108 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v6 19/23 sf: Use MTD lock operations
In reply to Jagan TekiSince the spi-flash framework itself is using core MTD functionalities this patch uses lock operation from mtd.
Fabio Estevam <[email protected]>
--- drivers/mtd/spi/sf_internal.h | 9 - drivers/mtd/spi/sf_ops.c | 383 ++++++++++++++++++++++-------------------- include/spi_flash.h | 34 ++-- 3 files changed, 220 insertions(+), 206 deletions(-)
drivers/mtd/spi/sf_internal.h +0 -9
@@ -163,15 +163,6 @@ int spi_flash_cmd_read(struct spi_slave *spi, const u8 *cmd,int spi_flash_cmd_write (struct spi_slave *spi,const u8 *cmd,size_t cmd_len,const void *data,size_t data_len); -/* Lock stmicro spi flash region */ -int stm_lock (struct spi_flash *flash,u32 ofs,size_t len); - -/* Unlock stmicro spi flash region */ -int stm_unlock (struct spi_flash *flash,u32 ofs,size_t len); - -/* Check if a stmicro spi flash region is completely locked */ -int stm_is_locked (struct spi_flash *flash,u32 ofs,size_t len); -/* Enable writing on the SPI flash */ static inline int spi_flash_cmd_write_enable (struct spi_flash *flash) {
drivers/mtd/spi/sf_ops.c +204 -179
418 lines not on this page · raw message
include/spi_flash.h +16 -18
@@ -55,9 +55,10 @@ struct spi_slave;* @dummy_byte: Dummy cycles for read operation. * @memory_map: Address of read-only SPI flash access * @priv: the private data -* @flash_lock: lock a region of the SPI Flash -* @flash_unlock: unlock a region of the SPI Flash -* @flash_is_locked: check if a region of the SPI Flash is completely locked +* @flash_lock: [FLASH-SPECIFIC] lock a region of the SPI NOR +* @flash_unlock: [FLASH-SPECIFIC] unlock a region of the SPI NOR +* @flash_is_locked: [FLASH-SPECIFIC] check if a region of the SPI NOR is +* completely locked * return 0 - Success, 1 - Failure */ struct spi_flash {
@@ -86,9 +87,9 @@ struct spi_flash {void *memory_map;void *priv; -int (*flash_lock)(struct spi_flash *flash,u32 ofs,size_t len); -int (*flash_unlock)(struct spi_flash *flash,u32 ofs,size_t len); -int (*flash_is_locked)(struct spi_flash *flash,u32 ofs,size_t len); +int (*flash_lock)(struct spi_flash *flash,loff_t ofs,uint64_t len); +int (*flash_unlock)(struct spi_flash *flash,loff_t ofs,uint64_t len); +int (*flash_is_locked)(struct spi_flash *flash,loff_t ofs,uint64_t len); }; static inline int spi_flash_read(struct spi_flash *flash, u32 offset,
@@ -116,6 +117,15 @@ static inline int spi_flash_erase(struct spi_flash *flash, u32 offset,return mtd_erase (flash->mtd, &instr); } +static inline int spi_flash_protect (struct spi_flash *flash,u32 ofs,u32 len, +bool prot) +{ +if (prot) +return mtd_lock (flash->mtd, ofs, len); +else +return mtd_unlock (flash->mtd, ofs, len); +} +#ifdef CONFIG_DM_SPI_FLASH int spi_flash_probe_bus_cs(unsigned int busnum, unsigned int cs, unsigned int max_hz, unsigned int spi_mode,
@@ -157,18 +167,6 @@ void spi_flash_free(struct spi_flash *flash);#endif -static inline int spi_flash_protect (struct spi_flash *flash,u32 ofs,u32 len, -bool prot) -{ -if (!flash->flash_lock) -return -EOPNOTSUPP ; - -if (prot) -return flash->flash_lock (flash, ofs, len); -else -return flash->flash_unlock (flash, ofs, len); -} -void spi_boot (void )__noreturn ;void spi_spl_load_image (uint32_t offs,unsigned int size,void *vdst);
Signature · 1 line
1.9.1
PATCH v6 20/23 sf: Add MTD support for non-dm spi_flash interface
In reply to Jagan TekiThis patch adds MTD support to non-dm spi_flash
interface code.
--- drivers/mtd/spi/sf_probe.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-)
drivers/mtd/spi/sf_probe.c +14 -12
@@ -26,17 +26,24 @@ struct spi_flash_priv {#ifndef CONFIG_DM_SPI_FLASH struct spi_flash *spi_flash_probe_tail (struct spi_slave *bus) { +struct spi_flash_priv *priv;struct spi_flash *flash;int ret; -/* Allocate space if needed (not used by sf-uclass */ - flash =calloc (1 ,sizeof (*flash)); -if (!flash) { -debug ("SF: Failed to allocate spi_flash\n" ); +/* Allocate space if needed (not used by sf-uclass) */ + priv =calloc (1 ,sizeof (*priv)); +if (!priv) { +debug ("SF: Failed to allocate spi_flash_priv\n" );return NULL ; } + flash = &priv->flash; + flash->mtd = &priv->mtd; + flash->spi = bus; + flash->priv = priv; + + priv->mtd.priv = flash;/* Claim spi bus */ ret =spi_claim_bus (bus);
@@ -49,19 +56,16 @@ struct spi_flash *spi_flash_probe_tail(struct spi_slave *bus)if (ret) goto err_scan; -#ifdef CONFIG_SPI_FLASH_MTD - ret =spi_flash_mtd_register (flash); + ret =add_mtd_device (&priv->mtd);if (ret) {printf ("SF: failed to register mtd device: %d\n" , ret); goto err_mtd; } -#endif +return flash; -#ifdef CONFIG_SPI_FLASH_MTD err_mtd:spi_free_slave (bus); -#endif err_scan:spi_release_bus (bus); err_claim:
@@ -95,9 +99,7 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,void spi_flash_free (struct spi_flash *flash) { -#ifdef CONFIG_SPI_FLASH_MTD -spi_flash_mtd_unregister (); -#endif +del_mtd_device (flash->mtd);spi_free_slave (flash->spi);free (flash); }
Signature · 1 line
1.9.1
PATCH v6 21/23 sf: probe: Minor cleanup
In reply to Jagan Teki- Use static for file-scope function
- Remove unneeded header file
- Use spi instead of slave notation for spi_slave {}
--- drivers/mtd/spi/sf_probe.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/mtd/spi/sf_probe.c +7 -7
@@ -24,7 +24,7 @@ struct spi_flash_priv { };#ifndef CONFIG_DM_SPI_FLASH -struct spi_flash *spi_flash_probe_tail (struct spi_slave *bus) +static struct spi_flash *spi_flash_probe_tail (struct spi_slave *bus) {struct spi_flash_priv *priv;struct spi_flash *flash;
@@ -106,24 +106,24 @@ void spi_flash_free(struct spi_flash *flash)#else /* defined CONFIG_DM_SPI_FLASH */ -int spi_flash_std_probe (struct udevice *dev) +static int spi_flash_std_probe (struct udevice *dev) {struct spi_flash_priv *priv =dev_get_uclass_priv (dev); -struct spi_slave *slave =dev_get_parent_priv (dev); +struct spi_slave *spi =dev_get_parent_priv (dev);struct spi_flash *flash;int ret; flash = &priv->flash; flash->mtd = &priv->mtd; - flash->spi = slave; + flash->spi = spi; flash->priv = priv; priv->mtd.priv = flash; flash->dev = dev;/* Claim spi bus */ - ret =spi_claim_bus (slave); + ret =spi_claim_bus (spi);if (ret) {debug ("SF: Failed to claim SPI bus: %d\n" , ret);return ret;
@@ -144,9 +144,9 @@ int spi_flash_std_probe(struct udevice *dev)return ret; err_mtd: -spi_free_slave (slave); +spi_free_slave (spi); err_scan: -spi_release_bus (slave); +spi_release_bus (spi);return ret; }
Signature · 1 line
1.9.1
PATCH v6 22/23 sf: Drop SPI_FLASH_MTD driver
In reply to Jagan TekiNow MTD core has been added as part of spi-flash layer, so there is no need for explicit driver for handling mtd stuff, hence removed all neccessary code regarding SPI_FLASH_MTD driver.
--- drivers/mtd/spi/Kconfig | 12 ----- drivers/mtd/spi/Makefile | 1 - drivers/mtd/spi/sf_internal.h | 5 -- drivers/mtd/spi/sf_mtd.c | 104 ------------------------------------------ 4 files changed, 122 deletions(-) delete mode 100644 drivers/mtd/spi/sf_mtd.c
drivers/mtd/spi/Kconfig +0 -12
@@ -116,16 +116,4 @@ config SPI_FLASH_DATAFLASH If unsure, say N -config SPI_FLASH_MTD - bool "SPI Flash MTD support" - depends on SPI_FLASH - help - Enable the MTD support for spi flash layer, this adapter is for - translating mtd_read/mtd_write commands into spi_flash_read/write - commands. It is not intended to use it within sf_cmd or the SPI - flash subsystem. Such an adapter is needed for subsystems like - UBI which can only operate on top of the MTD layer. - - If unsure, say N - endmenu # menu "SPI Flash Support"
drivers/mtd/spi/Makefile +0 -1
@@ -14,6 +14,5 @@ endif obj-$(CONFIG_SPI_FLASH) += sf_probe.o sf_ops.o sf_params.o sf.o obj-$(CONFIG_SPI_FLASH_DATAFLASH) += sf_dataflash.o -obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o obj-$(CONFIG_SPI_M95XXX) += eeprom_m95xxx.o
drivers/mtd/spi/sf_internal.h +0 -5
@@ -193,11 +193,6 @@ int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,int spi_flash_read_common (struct spi_flash *flash,const u8 *cmd,size_t cmd_len,void *data,size_t data_len); -#ifdef CONFIG_SPI_FLASH_MTD -int spi_flash_mtd_register (struct spi_flash *flash); -void spi_flash_mtd_unregister (void ); -#endif -/** * spi_flash_scan - scan the SPI FLASH * @flash: the spi flash structure
drivers/mtd/spi/sf_mtd.c deleted +0 -104
104 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v6 23/23 configs: Remove CONFIG_SPI_FLASH_MTD
In reply to Jagan TekiNo explict spi-flash mtd handling driver, it's been part of spi-flash layer iteself, hence removed it from board configs.
--- include/configs/aristainetos-common.h | 1 - include/configs/gw_ventana.h | 1 - include/configs/socfpga_common.h | 1 - 3 files changed, 3 deletions(-)
include/configs/aristainetos-common.h +0 -1
@@ -42,7 +42,6 @@#define CONFIG_PHY_MICREL #define CONFIG_CMD_SF -#define CONFIG_SPI_FLASH_MTD #define CONFIG_SPI_FLASH_STMICRO #define CONFIG_MXC_SPI #define CONFIG_SF_DEFAULT_SPEED 20000000
include/configs/gw_ventana.h +0 -1
@@ -69,7 +69,6 @@#define CONFIG_CMD_SF #ifdef CONFIG_CMD_SF #define CONFIG_MXC_SPI -#define CONFIG_SPI_FLASH_MTD #define CONFIG_SPI_FLASH_BAR #define CONFIG_SPI_FLASH_WINBOND #define CONFIG_SF_DEFAULT_BUS 0
include/configs/socfpga_common.h +0 -1
@@ -195,7 +195,6 @@ unsigned int cm_get_l4_sp_clk_hz(void);#define CONFIG_SPI_FLASH_STMICRO /* Micron/Numonyx flash */ #define CONFIG_SPI_FLASH_SPANSION /* Spansion flash */ #ifndef CONFIG_SPL_BUILD -#define CONFIG_SPI_FLASH_MTD #define CONFIG_CMD_MTDPARTS #define CONFIG_MTD_DEVICE #define CONFIG_MTD_PARTITIONS
Signature · 1 line
1.9.1