[U-Boot] [PATCH v10 00/27] dm: Generic MTD Subsystem, with SPI-NOR interface

Jagan Teki
2017-12-28T06:12:06Z

Compared to previous series’s [1], [2], [3] and [4] this patch set
redefined most of the implementation suitable to fit into existing driver-model.

MTD is generic subsystem for underlying flash devices like nand,
parallel nor, spinor, dataflash etc. So to drive this theory with
driver model(with an example of block layer) mtd is common device
interaction for most of memory technology flashes like nand, parallel nor,
spinor, dataflash etc, these are treated as interface types wrt u-boot driver model.

Once the respective interface driver bind happen, the uclass driver will
pass an 'interface type' to mtd layer to create device for it,
for example once spinor ULASS_SPI_NOR driver bind happen,
the uclass driver of spinor will pass MTD_IF_TYPE_SPI_NOR
interface type to create mtd device for spinor devices.

SPI-NOR:
=======
Some of the SPI device drivers at drivers/spi not a real
spi controllers, Unlike normal/generic SPI controllers they
operates only with SPI-NOR flash devices. these were technically
termed as SPI-NOR controllers, Ex: drivers/spi/fsl_qspi.c

The problem with these were resides at drivers/spi is entire
SPI layer becomes SPI-NOR flash oriented which is absolutely
a wrong indication where SPI layer getting effected more with
flash operations - So this SPI-NOR core will resolve this issue
by separating all SPI-NOR flash operations from spi layer and
creats a generic layer called SPI-NOR core which can be used to
interact SPI-NOR to SPI driver interface layer and the SPI-NOR
controller driver.

=======================================
cmd/spinor.c
=======================================
mtd-uclass.c
=======================================
spi-nor-uclass.c
=======================================
spi-nor.c
=======================================
m25p80.c zynq_qspinor.c
=======================================
spi-uclass.c
=======================================
zynq_qspi.c
=======================================
#####SPI NOR chip######
=======================================

Changes for v10:
- Update Simon's R-B tag
- Add mtd dm test case
- implemented entire code wrt MTD, with interface type

code size:
==========
before:
$ arm-linux-gnueabi-size u-boot
text data bss dec hex filename
473712 15152 222568 711432 adb08 u-boot
$ du -hs u-boot-dtb.img
488K u-boot-dtb.img

after:
$ arm-linux-gnueabi-size u-boot
text data bss dec hex filename
470124 14352 222584 707060 ac9f4 u-boot
$ du -hs u-boot-dtb.img
484K u-boot-dtb.img

approximately 4KiB but DM_SPI_FLASH still there which
can be removed once support added in SPL

test log:
========
Zynq> spinor
spinor - SPI-NOR Sub-system

Usage:
spinor list - show list of spinor devices
spinor info - show current spinor device info
spinor dev [devnum] - show or set current spinor device
spinor erase offset len - erase 'len' bytes from 'offset'
spinor write addr to len - write 'len' bytes to 'to' from 'addr'
spinor read addr from len - read 'len' bytes from 'from' to 'addr'
spinor protect lock/unlock sector len - protect/unprotect 'len' bytes starting
at address 'sector'
Zynq> spinor list
flash at 0: 0
spi-nor at e000d000: 1
Zynq> spinor dev 0
switch to dev #0, OK
spinor0 is current device
Zynq> spinor info
bus: flash at 0: 0
device: s25fl128s_64k
page size: 256 B
erase size: 64 KiB
size: 16 MiB
Zynq> spinor erase 0xE00000 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Erased: OK
Zynq> mw.b 0x100 0xcc 0x100000
Zynq> spinor write 0x100 0xE00000 0x100000
device 0 offset 0xe00000, size 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Written: OK
Zynq> spinor read 0x3000000 0xE00000 0x100000
device 0 offset 0xe00000, size 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Read: OK
Zynq> cmp.b 0x3000000 0x100 0x100000
Total of 1048576 byte(s) were the same
Zynq> spinor dev 1
switch to dev #1, OK
spinor1 is current device
Zynq> spinor info
bus: spi-nor at e000d000: 1
device: s25fl128s_64k
page size: 256 B
erase size: 64 KiB
size: 16 MiB
Zynq> spinor erase 0xE00000 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Erased: OK
Zynq> mw.b 0x100 0xbb 0x100000
Zynq> spinor write 0x100 0xE00000 0x100000
device 0 offset 0xe00000, size 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Written: OK
Zynq> spinor read 0x3000000 0xE00000 0x100000
device 0 offset 0xe00000, size 0x100000
SPI-NOR: 1048576 bytes @ 0xe00000 Read: OK
Zynq> cmp.b 0x3000000 0x100 0x100000
Total of 1048576 byte(s) were the same

WIP:
===
- to support non-dm code
- to support spinor SPL

Repo:
====
$ git clone git://git.denx.de/u-boot-spi.git
$ cd u-boot-spi
$ git checkout -b mtd-spinor-working origin/mtd-spinor-working

[1] https://lists.denx.de/pipermail/u-boot/2016-October/271459.html
[2] http://lists.denx.de/pipermail/u-boot/2016-March/249286.html
[3] http://lists.denx.de/pipermail/u-boot/2016-February/245418.html
[4] [PATCH RFC v8 00/16] SPI-NOR/MTD addition

Jagan Teki (27):
mtd: Add mtd core ops
mtd: add mtd device create operations
mtd: add SPI-NOR core support
mtd: spi-nor: sync/modify sst write operations
mtd: spi-nor: sync/modify lock operations
mtd: spi-nor: Kconfig: Add MTD_SPI_NOR entry
mtd: spi-nor: Kconfig: Add MTD_SPI_NOR_USE_4K_SECTORS
mtd: spi-nor: Kconfig: Add SPI_NOR_MISC entry
mtd: spi-nor: Kconfig: Add SPI_NOR_MACRONIX entry
mtd: spi-nor: Kconfig: Add SPI_NOR_SPANSION entry
mtd: spi-nor: Kconfig: Add SPI_NOR_STMICRO entry
mtd: spi-nor: Kconfig: Add SPI_NOR_SST entry
mtd: spi-nor: Kconfig: Add SPI_NOR_WINBOND entry
mtd-uclass: use platdata_auto_alloc
spi: Add spi_write_then_read
mtd: spi-nor: Add m25p80 driver
mtd: spi-nor: Kconfig: Add MTD_M25P80 entry
mtd: spi-nor: Add zynq qspinor driver
mtd: spi-nor: zynq_qspi: Kconfig: Add MTD_ZYNQ
mtd: spi-nor: Add 4-byte addresswidth support
cmd: add spinor cmd support
cmd: spinor: sync/update protect command
board_r: initialize spi_nor
env: add spi-nor environment
arm: dts: zynq: Add zynq-qspinor node
dm: zynq: microzed: enable MTD/SPI-NOR framework
test: dm: add tests for mtd devices

Makefile | 1 +
arch/arm/dts/zynq-7000.dtsi | 12 +
arch/arm/dts/zynq-microzed.dts | 12 +-
cmd/Kconfig | 5 +
cmd/Makefile | 1 +
cmd/nvedit.c | 1 +
cmd/spinor.c | 326 ++++++++++++
common/board_r.c | 13 +
configs/sandbox_defconfig | 8 +-
configs/zynq_microzed_defconfig | 17 +-
drivers/mtd/Kconfig | 2 +
drivers/mtd/Makefile | 7 +-
drivers/mtd/mtd-uclass.c | 203 +++++++-
drivers/mtd/spi-nor/Kconfig | 89 ++++
drivers/mtd/spi-nor/Makefile | 15 +
drivers/mtd/spi-nor/m25p80.c | 251 ++++++++++
drivers/mtd/spi-nor/spi-nor-ids.c | 184 +++++++
drivers/mtd/spi-nor/spi-nor-uclass.c | 160 ++++++
drivers/mtd/spi-nor/spi-nor.c | 940 +++++++++++++++++++++++++++++++++++
drivers/mtd/spi-nor/zynq_qspinor.c | 622 +++++++++++++++++++++++
drivers/spi/spi-uclass.c | 24 +
env/Kconfig | 27 +
env/Makefile | 1 +
env/env.c | 2 +
env/spinor.c | 113 +++++
include/dm/uclass-id.h | 1 +
include/environment.h | 1 +
include/linux/mtd/mtd.h | 14 +
include/linux/mtd/spi-nor.h | 223 +++++++++
include/mtd.h | 176 +++++++
include/spi.h | 20 +
test/dm/Makefile | 1 +
test/dm/mtd.c | 33 ++
33 files changed, 3493 insertions(+), 12 deletions(-)
create mode 100644 cmd/spinor.c
create mode 100644 drivers/mtd/spi-nor/Kconfig
create mode 100644 drivers/mtd/spi-nor/Makefile
create mode 100644 drivers/mtd/spi-nor/m25p80.c
create mode 100644 drivers/mtd/spi-nor/spi-nor-ids.c
create mode 100644 drivers/mtd/spi-nor/spi-nor-uclass.c
create mode 100644 drivers/mtd/spi-nor/spi-nor.c
create mode 100644 drivers/mtd/spi-nor/zynq_qspinor.c
create mode 100644 env/spinor.c
create mode 100644 include/linux/mtd/spi-nor.h
create mode 100644 test/dm/mtd.c

--
2.7.4