[PATCH V2] mtd: bcm47xxsflash: support reading flash out of mapping window
Marek Vasut
marek.vasut at gmail.com
Tue Jan 17 03:00:59 PST 2017
On 01/17/2017 11:51 AM, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal at milecki.pl>
>
> For reading flash content we use MMIO but it's possible to read only
> first 16 MiB this way. It's simply an arch design/limitation.
> To support flash sizes bigger than 16 MiB implement indirect access
> using ChipCommon registers.
> This has been tested using MX25L25635F.
>
> Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
> ---
> V2: Simplify line writing to buf
> Add some trivial comment for OPCODE_ST_READ4B
> Both requested by Marek
> ---
> drivers/mtd/devices/bcm47xxsflash.c | 12 +++++++++++-
> drivers/mtd/devices/bcm47xxsflash.h | 3 +++
> 2 files changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
> index 4decd8c..8d4c1db 100644
> --- a/drivers/mtd/devices/bcm47xxsflash.c
> +++ b/drivers/mtd/devices/bcm47xxsflash.c
> @@ -110,7 +110,17 @@ static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
> if ((from + len) > mtd->size)
> return -EINVAL;
>
> - memcpy_fromio(buf, b47s->window + from, len);
> + if (from + len <= BCM47XXSFLASH_WINDOW_SIZE) {
> + memcpy_fromio(buf, b47s->window + from, len);
One last nit, what if the read starts < 16 MiB and ends > 16 MiB ?
Shouldn't that use partly the windowed mode and partly the other mode?
> + } else {
> + size_t i;
> +
> + for (i = 0; i < len; i++) {
> + b47s->cc_write(b47s, BCMA_CC_FLASHADDR, from++);
> + bcm47xxsflash_cmd(b47s, OPCODE_ST_READ4B);
> + *buf++ = b47s->cc_read(b47s, BCMA_CC_FLASHDATA);
> + }
> + }
> *retlen = len;
>
> return len;
> diff --git a/drivers/mtd/devices/bcm47xxsflash.h b/drivers/mtd/devices/bcm47xxsflash.h
> index 1564b62..6b478af 100644
> --- a/drivers/mtd/devices/bcm47xxsflash.h
> +++ b/drivers/mtd/devices/bcm47xxsflash.h
> @@ -3,6 +3,8 @@
>
> #include <linux/mtd/mtd.h>
>
> +#define BCM47XXSFLASH_WINDOW_SIZE SZ_16M
> +
> /* Used for ST flashes only. */
> #define OPCODE_ST_WREN 0x0006 /* Write Enable */
> #define OPCODE_ST_WRDIS 0x0004 /* Write Disable */
> @@ -16,6 +18,7 @@
> #define OPCODE_ST_RES 0x03ab /* Read Electronic Signature */
> #define OPCODE_ST_CSA 0x1000 /* Keep chip select asserted */
> #define OPCODE_ST_SSE 0x0220 /* Sub-sector Erase */
> +#define OPCODE_ST_READ4B 0x6313 /* Read Data Bytes in 4Byte address */
>
> /* Used for Atmel flashes only. */
> #define OPCODE_AT_READ 0x07e8
>
--
Best regards,
Marek Vasut
More information about the linux-mtd
mailing list