[U-Boot] [PATCH 0/15] Enhance SPI/SPI flash probing, add support for Intel ICH controller

Simon Glass sjg at chromium.org
Wed Dec 26 23:28:18 CET 2012


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.


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



More information about the U-Boot mailing list