
Hi,
On Wed, Dec 26, 2012 at 2:28 PM, Simon Glass sjg@chromium.org wrote:
Adding new fields to struct spi_slave and struct spi_flash is painful, because most drivers don't zero the fields they don't use. Anyway it seems better to have the SPI/SPI flash infrastructure provide a simple way of doing this that all drivers can use.
So the first part of this series adds spi_alloc_slave(), for SPI, and spi_flash_alloc() for SPI flash.
Support is added for the Intel ICH SPI controller, possibly the oddest SPI controller in U-Boot. It is designed for use with SPI flash only, and has a number of high-level features which are dedicated to flash. As such it is a bit of a challenge to get it to behave just like a normal U-Boot SPI device.
The ICH driver has two interesting features. Firstly it is impossible to read or write more than 64 bytes at a time! For SPI reading it is possible to hide this within the SPI driver. For SPI writing it unfortunately isn't, since the spi_flash layer has to send an unlock command and a new address for every write. It would be an egregious hack to try to fake this in the driver. So a new property is added to spi_flash to allow the maximum transfer size to be set.
Secondly, the ICH SPI flash can be memory mapped. On a lot of x86 devices this improves performance significantly. For example, the standard driver gets maybe 12Mbps throughput from a 33Mbps dual interface, roughly 20% utilisation. With memory mapping, many platforms can achieve about 40Mbps. To implement memory mapping, a new property is provided in the device tree to set the memory map address, which varies by platform. Some x86 platforms will see a speed increase with memory mapping, some won't. The memory mapping feature only works for reading. When in use, the spi_flash layer bypasses the SPI driver completely, and just copies the flash data from the correct place in the memory map.
This series includes some generic changes to the SPI and SPI flash layers.
It also includes an x86 SPI driver for Intel.
Are there any comments, particularlly on the addition of spi_alloc_aloc() and spi_flsah_alloc()? This affects all SPI flash drivers.
The first patch needs to be dropped since it seems we are sticking with cpp.
Simon Glass (15): fdt: Use sed instead of cpp to pre-process the dtc fdt: Add fdtdec_get_addr_size() to read reg properties spi: Add function to allocate a new SPI slave spi: Use spi_alloc_slave() in each SPI driver sf: Add spi_flash_alloc() to create a new SPI flash struct sf: Use spi_flash_alloc() in each SPI flash driver x86: spi: Add Intel ICH driver spi: Add parameter for maximum write size sf: Respect maximum SPI write size x86: spi: Set maximum write size for ICH sf: Enable FDT-based configuration and memory mapping x86: Move PCI init before SPI init x86: Add FDT SPI node for link x86: Enable SPI flash support for coreboot x86: Enable time command for coreboot
arch/x86/lib/board.c | 8 +- board/chromebook-x86/dts/link.dts | 11 + drivers/mtd/spi/atmel.c | 8 +- drivers/mtd/spi/eon.c | 8 +- drivers/mtd/spi/macronix.c | 8 +- drivers/mtd/spi/ramtron.c | 4 +- drivers/mtd/spi/spansion.c | 8 +- drivers/mtd/spi/spi_flash.c | 81 ++++- drivers/mtd/spi/sst.c | 8 +- drivers/mtd/spi/stmicro.c | 8 +- drivers/mtd/spi/winbond.c | 8 +- drivers/spi/Makefile | 4 + drivers/spi/altera_spi.c | 4 +- drivers/spi/andes_spi.c | 4 +- drivers/spi/armada100_spi.c | 4 +- drivers/spi/atmel_spi.c | 4 +- drivers/spi/bfin_spi.c | 4 +- drivers/spi/cf_qspi.c | 4 +- drivers/spi/cf_spi.c | 4 +- drivers/spi/davinci_spi.c | 4 +- drivers/spi/fsl_espi.c | 4 +- drivers/spi/ich.c | 752 +++++++++++++++++++++++++++++++++++++ drivers/spi/ich.h | 144 +++++++ drivers/spi/kirkwood_spi.c | 5 +- drivers/spi/mpc52xx_spi.c | 5 +- drivers/spi/mpc8xxx_spi.c | 5 +- drivers/spi/mxc_spi.c | 4 +- drivers/spi/mxs_spi.c | 4 +- drivers/spi/oc_tiny_spi.c | 5 +- drivers/spi/omap3_spi.c | 27 +- drivers/spi/sh_spi.c | 4 +- drivers/spi/soft_spi.c | 4 +- drivers/spi/spi.c | 39 ++ drivers/spi/tegra_spi.c | 4 +- drivers/spi/xilinx_spi.c | 4 +- dts/Makefile | 10 +- include/configs/coreboot.h | 13 +- include/fdtdec.h | 16 + include/spi.h | 44 +++ include/spi_flash.h | 39 ++ lib/fdtdec.c | 27 ++- 41 files changed, 1208 insertions(+), 147 deletions(-) create mode 100644 drivers/spi/ich.c create mode 100644 drivers/spi/ich.h create mode 100644 drivers/spi/spi.c
-- 1.7.7.3
Regards, Simon