linux-uconsole/drivers/mtd
Vignesh Raghavendra dcc7d3446a mtd: Add support for HyperBus memory devices
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 with respect to bits per clock
cycle. But HyperBus operates at >166MHz frequencies.
HyperRAM provides direct random read/write access to flash memory
array.

But, HyperBus memory controllers seem to abstract implementation details
and expose a simple MMIO interface to access connected flash.

Add support for registering HyperFlash devices with MTD framework. MTD
maps framework along with CFI chip support framework are used to support
communicating with flash.

Framework is modelled along the lines of spi-nor framework. HyperBus
memory controller (HBMC) drivers calls 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.

Some HBMC masters need calibration/training sequence[3] to be carried
out, in order for DLL inside the controller to lock, by reading a known
string/pattern. This is done by repeatedly reading CFI Query
Identification String. Calibration needs to be done before trying to detect
flash as part of CFI flash probe.

HyperRAM is not supported at the moment.

HyperBus specification can be found at[1]
HyperFlash datasheet can be found at[2]

[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

Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
2019-06-27 19:47:58 +02:00
..
chips mtd: cfi_cmdset_0002: Add support for polling status register 2019-06-27 19:47:45 +02:00
devices mtd: phram: Mark expected switch fall-throughs 2019-05-06 21:57:05 +02:00
hyperbus mtd: Add support for HyperBus memory devices 2019-06-27 19:47:58 +02:00
lpddr mtd: lpddr_cmds: Mark expected switch fall-through 2019-05-06 21:57:05 +02:00
maps treewide: replace #include <asm/sizes.h> with #include <linux/sizes.h> 2019-05-14 19:52:52 -07:00
nand mtd: rawnand: vf610_nfc: add initializer to avoid -Wmaybe-uninitialized 2019-05-14 19:52:48 -07:00
parsers mtd: afs: add v2 partition parsing 2019-05-06 21:57:03 +02:00
spi-nor spi-nor: intel-spi: Add support for Intel Comet Lake SPI serial flash 2019-05-06 11:18:02 +03:00
tests mtd: rawnand: Clarify Kconfig entry MTD_NAND 2019-04-18 08:54:00 +02:00
ubi ubi: wl: Fix uninitialized variable 2019-05-07 21:58:33 +02:00
ar7part.c mm: remove include/linux/bootmem.h 2018-10-31 08:54:16 -07:00
bcm47xxpart.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
bcm63xxpart.c mtd: bcm63xxpart: move imagetag parsing to its own parser 2019-05-06 21:46:45 +02:00
cmdlinepart.c mtd: cmdlinepart: Update comment for introduction of OFFSET_CONTINUOUS 2018-05-23 10:08:48 +02:00
ftl.c treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
inftlcore.c mtd: nand: Rename nand.h into rawnand.h 2017-08-13 10:11:49 +02:00
inftlmount.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
Kconfig mtd: Add support for HyperBus memory devices 2019-06-27 19:47:58 +02:00
Makefile mtd: Add support for HyperBus memory devices 2019-06-27 19:47:58 +02:00
mtd_blkdevs.c mtd_blkdevs: convert to blk-mq 2018-10-16 08:09:58 -06:00
mtdblock.c mtd: change len type from signed to unsigned type 2018-12-03 11:32:26 +01:00
mtdblock_ro.c
mtdchar.c mtdchar: fix overflows in adjustment of count 2018-07-18 16:46:38 +02:00
mtdconcat.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
mtdcore.c MTD changes: 2019-03-04 18:59:37 -08:00
mtdcore.h mtd: Check add_mtd_device() ret code 2019-01-07 14:06:24 +01:00
mtdoops.c treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
mtdpart.c mtd: part: fix incorrect format specifier for an unsigned long long 2019-05-06 21:57:06 +02:00
mtdsuper.c Rename superblock flags (MS_xyz -> SB_xyz) 2017-11-27 13:05:09 -08:00
mtdswap.c mtd: use DEFINE_SHOW_ATTRIBUTE() instead of open-coding it 2018-12-03 11:32:26 +01:00
nftlcore.c mtd: nand: Rename nand.h into rawnand.h 2017-08-13 10:11:49 +02:00
nftlmount.c mtd: nftl: clean up indentation, remove extraneous tabs 2018-12-02 09:20:36 +01:00
ofpart.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
rfd_ftl.c treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
sm_ftl.c mtd: nand: Clarify Kconfig entry for software Hamming ECC entries 2019-04-18 08:54:00 +02:00
sm_ftl.h mtd: Stop assuming mtd_erase() is asynchronous 2018-03-15 18:21:07 +01:00
ssfdc.c treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00