mtd: st_spi_fsm: correct type issues
PATCH 1/2 mtd: st_spi_fsm: correct type issues
Compile-testing for a 64-bit arch uncovers several bad casts:
In file included from include/linux/linkage.h:4:0,
from include/linux/kernel.h:6,
from drivers/mtd/devices/st_spi_fsm.c:15:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_read_fifo’:
drivers/mtd/devices/st_spi_fsm.c:758:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
BUG_ON((((uint32_t)buf) & 0x3) || (size & 0x3));
...
Use uintptr_t instead of uint32_t, since it's guaranteed to be pointer-sized.
We also see this warning, if size_t is not 32 bits wide:
In file included from drivers/mtd/devices/st_spi_fsm.c:15:0:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_mtd_write’:
include/linux/kernel.h:712:17: warning: comparison of distinct pointer types lacks a cast [enabled by default]
(void) (&_min1 == &_min2); \
^
drivers/mtd/devices/st_spi_fsm.c:1704:11: note: in expansion of macro ‘min’
bytes = min(FLASH_PAGESIZE - page_offs, len);
^
Just use min_t() to force the type conversion, since we don't really want to upgrade 'page_offs' and 'bytes' to size_t; they only should be handling <= 256 byte offsets.
--- drivers/mtd/devices/st_spi_fsm.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/mtd/devices/st_spi_fsm.c +6 -6
@@ -755,7 +755,7 @@ static void stfsm_read_fifo(struct stfsm *fsm, uint32_t *buf, uint32_t size)dev_dbg (fsm->dev,"Reading %d bytes from FIFO\n" , size); -BUG_ON ((((uint32_t )buf) &0x3 ) || (size &0x3 )); +BUG_ON ((((uintptr_t )buf) &0x3 ) || (size &0x3 ));while (remaining) {for (;;) {
@@ -779,7 +779,7 @@ static int stfsm_write_fifo(struct stfsm *fsm, const uint32_t *buf,dev_dbg (fsm->dev,"writing %d bytes to FIFO\n" , size); -BUG_ON ((((uint32_t )buf) &0x3 ) || (size &0x3 )); +BUG_ON ((((uintptr_t )buf) &0x3 ) || (size &0x3 ));writesl (fsm->base +SPI_FAST_SEQ_DATA_REG , buf, words);
@@ -1474,7 +1474,7 @@ static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size, read_mask = (data_pads <<2 ) -1 ;/* Handle non-aligned buf */ - p = ((uint32_t )buf &0x3 ) ? (uint8_t *)page_buf : buf; + p = ((uintptr_t )buf &0x3 ) ? (uint8_t *)page_buf : buf;/* Handle non-aligned size */ size_ub = (size + read_mask) & ~read_mask;
@@ -1496,7 +1496,7 @@ static int stfsm_read(struct stfsm *fsm, uint8_t *buf, uint32_t size, }/* Handle non-aligned buf */ -if ((uint32_t )buf &0x3 ) +if ((uintptr_t )buf &0x3 )memcpy (buf, page_buf, size);/* Wait for sequence to finish */
@@ -1538,7 +1538,7 @@ static int stfsm_write(struct stfsm *fsm, const uint8_t *buf, write_mask = (data_pads <<2 ) -1 ;/* Handle non-aligned buf */ -if ((uint32_t )buf &0x3 ) { +if ((uintptr_t )buf &0x3 ) {memcpy (page_buf, buf, size); p = (uint8_t *)page_buf; }else {
@@ -1701,7 +1701,7 @@ static int stfsm_mtd_write(struct mtd_info *mtd, loff_t to, size_t len,while (len) {/* Write up to page boundary */ - bytes =min (FLASH_PAGESIZE - page_offs, len); + bytes =min_t (size_t,FLASH_PAGESIZE - page_offs, len); ret =stfsm_write (fsm, b, bytes, to);if (ret)
Signature · 1 line
1.8.3.2
PATCH 2/2 mtd: st_spi_fsm: only build for ARM
COMPILE_TEST allows us to build this driver on other arch'es. But not all arch'es have the right I/O accessors -- particularly, x86 is missing readsl() and writesl().
So just restrict this driver to ARCH_STI. It's still buildable for a multiplatform ARM kernel, so it can get decent compile coverage.
--- drivers/mtd/devices/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/devices/Kconfig +1 -1
@@ -212,7 +212,7 @@ config MTD_DOCG3 config MTD_ST_SPI_FSM tristate "ST Microelectronics SPI FSM Serial Flash Controller" - depends on ARCH_STI || COMPILE_TEST + depends on ARCH_STI help This provides an MTD device driver for the ST Microelectronics SPI Fast Sequence Mode (FSM) Serial Flash Controller and support
Signature · 1 line
1.8.3.2
Quoted 28 lines
Compile-testing for a 64-bit arch uncovers several bad casts:
In file included from
include/linux/linkage.h:4:0,
frominclude/linux/kernel.h:6,
fromdrivers/mtd/devices/st_spi_fsm.c:15:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_read_fifo’:
drivers/mtd/devices/st_spi_fsm.c:758:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
BUG_ON((((uint32_t)buf) & 0x3) || (size & 0x3));
...Use
uintptr_tinstead ofuint32_t, since it's guaranteed to be pointer-sized.We also see this warning, if
size_tis not 32 bits wide:In file included from
drivers/mtd/devices/st_spi_fsm.c:15:0:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_mtd_write’:
include/linux/kernel.h:712:17: warning: comparison of distinct pointer types lacks a cast [enabled by default]
(void) (&_min1==&_min2); \
^
drivers/mtd/devices/st_spi_fsm.c:1704:11: note: in expansion of macro ‘min’
bytes =min(FLASH_PAGESIZE - page_offs, len);
^Just use
min_t()to force the type conversion, since we don't really want to upgrade 'page_offs' and 'bytes' tosize_t; they only should be handling <= 256 byte offsets.
Quoted 5 lines
Signed-off-by Brian Norris <[email protected]>Cc Lee Jones <[email protected]>--- drivers/mtd/devices/st_spi_fsm.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
Thanks for fixing Brian. Fixes look good.
Signature · 4 lines
Lee Jones Linaro STMicroelectronics Landing Team Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
Quoted 34 lines · Lee Jones
Quoted 28 lines
Compile-testing for a 64-bit arch uncovers several bad casts:
In file included from
include/linux/linkage.h:4:0,
frominclude/linux/kernel.h:6,
fromdrivers/mtd/devices/st_spi_fsm.c:15:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_read_fifo’:
drivers/mtd/devices/st_spi_fsm.c:758:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
BUG_ON((((uint32_t)buf) & 0x3) || (size & 0x3));
...Use
uintptr_tinstead ofuint32_t, since it's guaranteed to be pointer-sized.We also see this warning, if
size_tis not 32 bits wide:In file included from
drivers/mtd/devices/st_spi_fsm.c:15:0:
drivers/mtd/devices/st_spi_fsm.c: In function ‘stfsm_mtd_write’:
include/linux/kernel.h:712:17: warning: comparison of distinct pointer types lacks a cast [enabled by default]
(void) (&_min1==&_min2); \
^
drivers/mtd/devices/st_spi_fsm.c:1704:11: note: in expansion of macro ‘min’
bytes =min(FLASH_PAGESIZE - page_offs, len);
^Just use
min_t()to force the type conversion, since we don't really want to upgrade 'page_offs' and 'bytes' tosize_t; they only should be handling <= 256 byte offsets.Quoted 5 lines
Signed-off-by Brian Norris <[email protected]>Cc Lee Jones <[email protected]>--- drivers/mtd/devices/st_spi_fsm.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
Quoted 3 lines
Thanks for fixing Brian. Fixes look good.
Acked-by Lee Jones <[email protected]>
Pushed both to l2-mtd.git/spinor.
Brian