[PATCH v7 0/5] MTD: Add Initial HyperBus support

From: Vignesh Raghavendra
Date: Thu Jun 20 2019 - 13:24:27 EST


Change log:
Since v6:
Fix up DT bindings for TI HBMC driver to move hyperbus node out of
syscon

Since v5:
Fix up DT bindings comments for TI HBMC driver
Move calibration sequence out of core into TI HBMC driver

Since v4:
Fix Rob's comments on dt-bindings of TI HBMC driver

Since v3:
* Drop reading QRY string twice in hyperbus_calibrate()
* Fix doc/misc comments on v3.

Since RFC v2:
* use map_word_xxx() for handling status register to support interleaved
flashes as suggested by Joakim Tjernlund <Joakim.Tjernlund@xxxxxxxxxxxx>
* Report error status/messages on erase/program failure by looking at
status register bits.
* Add "cfi-flash" as fallback compatible for cypress,hyperflash
* Add support to select between HyperBus and OSPI using mmio mux

Since RFC v1:
* Re-work Hyperbus core to provide separate struct representation for
controller and slave devices
* Rename all files and func names to have hyperbus_ prefix
* Provide default calibration routine for use by controller drivers
* Fix up errors with patch spliting
* Address comments by Sergei Shtylyov <sergei.shtylyov@xxxxxxxxxxxxxxxxxx>
Cypress HyperBus is Low Signal Count, High Performance Double Data Rate Bus
interface between a host system master and one or more slave interfaces.
HyperBus is used to connect microprocessor, microcontroller, or ASIC
devices with random access NOR flash memory(called HyperFlash) or
self refresh DRAM(called HyperRAM).

Its a 8-bit data bus (DQ[7:0]) with Read-Write Data Strobe (RWDS)
signal and either Single-ended clock(3.0V parts) or Differential clock
(1.8V parts). It uses ChipSelect lines to select b/w multiple slaves.
At bus level, it follows a separate protocol described in HyperBus
specification[1].

HyperFlash follows CFI AMD/Fujitsu Extended Command Set (0x0002) similar
to that of existing parallel NORs. Since Hyperbus is x8 DDR bus,
its equivalent to x16 parallel NOR flash wrt bits per clk. But Hyperbus
operates at >166MHz frequencies.
HyperRAM provides direct random read/write access to flash memory
array.
Framework is modelled along the lines of spi-nor framework. HyperBus
memory controller (HBMC) drivers call hyperbus_register_device() to
register a single HyperFlash device. HyperFlash core parses MMIO access
information from DT, sets up the map_info struct, probes CFI flash and
registers it with MTD framework.

Tested on modified TI AM654 EVM with Cypress Hyperflash S26KS512 by
creating a UBIFS partition and writing and reading files to it.
Stress tested by writing/reading 16MB flash repeatedly at different
offsets using dd commmand.

HyperBus specification can be found at[1]
HyperFlash datasheet can be found at[2]
TI's HBMC controller details at[3]

[1] https://www.cypress.com/file/213356/download
[2] https://www.cypress.com/file/213346/download
[3] http://www.ti.com/lit/ug/spruid7b/spruid7b.pdf
Table 12-5741. HyperFlash Access Sequence


Vignesh Raghavendra (5):
mtd: cfi_cmdset_0002: Add support for polling status register
dt-bindings: mtd: Add binding documentation for HyperFlash
mtd: Add support for HyperBus memory devices
dt-bindings: mtd: Add bindings for TI's AM654 HyperBus memory
controller
mtd: hyperbus: Add driver for TI's HyperBus memory controller

.../bindings/mtd/cypress,hyperflash.txt | 13 ++
.../devicetree/bindings/mtd/ti,am654-hbmc.txt | 52 ++++++
MAINTAINERS | 8 +
drivers/mtd/Kconfig | 2 +
drivers/mtd/Makefile | 1 +
drivers/mtd/chips/cfi_cmdset_0002.c | 90 ++++++++++
drivers/mtd/hyperbus/Kconfig | 23 +++
drivers/mtd/hyperbus/Makefile | 4 +
drivers/mtd/hyperbus/hbmc-am654.c | 141 ++++++++++++++++
drivers/mtd/hyperbus/hyperbus-core.c | 154 ++++++++++++++++++
include/linux/mtd/cfi.h | 5 +
include/linux/mtd/hyperbus.h | 86 ++++++++++
12 files changed, 579 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mtd/cypress,hyperflash.txt
create mode 100644 Documentation/devicetree/bindings/mtd/ti,am654-hbmc.txt
create mode 100644 drivers/mtd/hyperbus/Kconfig
create mode 100644 drivers/mtd/hyperbus/Makefile
create mode 100644 drivers/mtd/hyperbus/hbmc-am654.c
create mode 100644 drivers/mtd/hyperbus/hyperbus-core.c
create mode 100644 include/linux/mtd/hyperbus.h

--
2.22.0