]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
Merge tag 'v2013.04' into master-next
authorMichal Simek <michal.simek@xilinx.com>
Thu, 25 Apr 2013 11:51:34 +0000 (13:51 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Thu, 25 Apr 2013 14:55:29 +0000 (16:55 +0200)
Prepare v2013.04

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
16 files changed:
1  2 
Makefile
arch/arm/cpu/armv7/zynq/timer.c
arch/arm/lib/bootm.c
board/xilinx/zynq/Makefile
boards.cfg
drivers/fpga/xilinx.c
drivers/mmc/Makefile
drivers/mtd/nand/Makefile
drivers/mtd/spi/spansion.c
drivers/mtd/spi/spi_flash.c
drivers/mtd/spi/stmicro.c
drivers/mtd/spi/winbond.c
drivers/spi/Makefile
include/netdev.h
include/spi.h
include/spi_flash.h

diff --cc Makefile
index 3305e8cd1c0a81bad6d79e7175b42ce869f6c5b9,3fd6d156c2b51b498aca3b8622b3bcd843b12a04..3fd6d156c2b51b498aca3b8622b3bcd843b12a04
mode 100755,100644..100755
+++ b/Makefile
Simple merge
Simple merge
Simple merge
diff --cc boards.cfg
index 54d2bc718b7111aeef3f733c30477ba881b22274,31483d623fb4a35cd54961fa07153e3192e1ef24..e33039fb3ef8b6d1c5bd9c71451d692b7b431a54
@@@ -278,18 -296,8 +296,19 @@@ twister                      ar
  nokia_rx51                   arm         armv7       rx51                nokia          omap3
  omap4_panda                  arm         armv7       panda               ti             omap4
  omap4_sdp4430                arm         armv7       sdp4430             ti             omap4
- omap5_evm                    arm         armv7       omap5_evm           ti           omap5
 +petalogix-arm-auto           arm         armv7       arm-auto            petalogix      zynq
 +zynq_zc770_XM010             arm         armv7       zynq                xilinx         zynq  zynq_zc770:ZC770_XM010
 +zynq_zc770_XM011             arm         armv7       zynq                xilinx         zynq  zynq_zc770:ZC770_XM011
 +zynq_zc770_XM012             arm         armv7       zynq                xilinx         zynq  zynq_zc770:ZC770_XM012
 +zynq_zc770_XM013             arm         armv7       zynq                xilinx         zynq  zynq_zc770:ZC770_XM013
 +zynq_afx_nor                 arm         armv7       zynq                xilinx         zynq  zynq_afx:AFX_NOR
 +zynq_afx_qspi                arm         armv7       zynq                xilinx         zynq  zynq_afx:AFX_QSPI
 +zynq_afx_nand                arm         armv7       zynq                xilinx         zynq  zynq_afx:AFX_NAND
 +zynq_zc70x                   arm         armv7       zynq                xilinx         zynq
 +zynq_cseflash                arm         armv7       zynq                xilinx         zynq
 +zynq_zed                     arm         armv7       zynq                xilinx         zynq
+ omap5_uevm                   arm         armv7       omap5_uevm          ti           omap5
+ dra7xx_evm                 arm         armv7       dra7xx              ti             omap5
  s5p_goni                     arm         armv7       goni                samsung        s5pc1xx
  smdkc100                     arm         armv7       smdkc100            samsung        s5pc1xx
  origen                             arm         armv7       origen              samsung        exynos
Simple merge
Simple merge
Simple merge
index 4f19ee047460f18077c3b3391c760fbf9c8c5059,bc558c4c96ba317bffac1a66730bc28c2f49be32..2fb96b8db65f50e67dad8fa5388d1c0aeddf4181
@@@ -140,23 -134,9 +140,17 @@@ struct spi_flash *spi_flash_probe_spans
                return NULL;
        }
  
-       flash->spi = spi;
-       flash->name = params->name;
-       flash->write = spi_flash_cmd_write_multi;
-       flash->erase = spi_flash_cmd_erase;
-       flash->read = spi_flash_cmd_read_fast;
        flash->page_size = 256;
        flash->sector_size = 256 * params->pages_per_sector;
 -      flash->size = flash->sector_size * params->nr_sectors;
 +
 +      /* address width is 4 for dual and 3 for single qspi */
 +      if (flash->spi->is_dual == 1) {
 +              flash->addr_width = 4;
 +              flash->size = flash->sector_size * (2 * params->nr_sectors);
 +      } else {
 +              flash->addr_width = 3;
 +              flash->size = flash->sector_size * params->nr_sectors;
 +      }
  
        return flash;
  }
index 035dd38ab11664f94e58322e0780da4308b708e3,111185af17586900b7ff447ead1e0ea9d131ecc4..7fe55825687e5f3fb00527c91118fb0264392bdc
  
  #include "spi_flash_internal.h"
  
 -static void spi_flash_addr(u32 addr, u8 *cmd)
+ DECLARE_GLOBAL_DATA_PTR;
 +static void spi_flash_addr(struct spi_flash *flash,
 +      unsigned long page_addr, unsigned long byte_addr, u8 *cmd)
  {
        /* cmd[0] is actual command */
 -      cmd[1] = addr >> 16;
 -      cmd[2] = addr >> 8;
 -      cmd[3] = addr >> 0;
 +      if (flash->addr_width == 4) {
 +              cmd[1] = page_addr >> 16;
 +              cmd[2] = page_addr >> 8;
 +              cmd[3] = page_addr;
 +              cmd[4] = byte_addr;
 +      } else {
 +              cmd[1] = page_addr >> 8;
 +              cmd[2] = page_addr;
 +              cmd[3] = byte_addr;
 +      }
 +}
 +
 +static int spi_flash_check_bankaddr_access(struct spi_flash *flash, u32 *offset)
 +{
 +      int ret;
 +
 +      if (*offset >= 0x1000000) {
 +              ret = spi_flash_bankaddr_access(flash, STATUS_BANKADDR_ENABLE);
 +              if (ret) {
 +                      debug("SF: fail to %s bank addr bit\n",
 +                              STATUS_BANKADDR_ENABLE ? "set" : "reset");
 +                      return ret;
 +              }
 +              *offset -= 0x1000000;
 +      } else {
 +              ret = spi_flash_bankaddr_access(flash, STATUS_BANKADDR_DISABLE);
 +              if (ret) {
 +                      debug("SF: fail to %s bank addr bit\n",
 +                              STATUS_BANKADDR_DISABLE ? "set" : "reset");
 +                      return ret;
 +              }
 +      }
 +
 +      return ret;
  }
  
  static int spi_flash_read_write(struct spi_slave *spi,
@@@ -127,11 -90,15 +130,14 @@@ int spi_flash_cmd_write_multi(struct sp
        for (actual = 0; actual < len; actual += chunk_len) {
                chunk_len = min(len - actual, page_size - byte_addr);
  
 -              cmd[1] = page_addr >> 8;
 -              cmd[2] = page_addr;
 -              cmd[3] = byte_addr;
+               if (flash->spi->max_write_size)
+                       chunk_len = min(chunk_len, flash->spi->max_write_size);
 +              spi_flash_addr(flash, page_addr, byte_addr, cmd);
  
 -              debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x } chunk_len = %zu\n",
 -                    buf + actual, cmd[0], cmd[1], cmd[2], cmd[3], chunk_len);
 +              debug("PP: 0x%p => cmd = { 0x%02x 0x%02x%02x%02x0x%02x } \
 +                      chunk_len = %zu\n", buf + actual, cmd[0], cmd[1],
 +                      cmd[2], cmd[3], cmd[4], chunk_len);
  
                ret = spi_flash_cmd_write_enable(flash);
                if (ret < 0) {
                if (ret)
                        break;
  
-               page_addr++;
-               byte_addr = 0;
+               byte_addr += chunk_len;
+               if (byte_addr == page_size) {
+                       page_addr++;
+                       byte_addr = 0;
+               }
        }
  
 -      debug("SF: program %s %zu bytes @ %#x\n",
 +      printf("SF: program %s %zu bytes @ %#x\n",
              ret ? "failure" : "success", len, offset);
  
        spi_release_bus(flash->spi);
@@@ -177,27 -147,15 +186,31 @@@ int spi_flash_read_common(struct spi_fl
  int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
                size_t len, void *data)
  {
 -      u8 cmd[5];
 +      unsigned long page_addr;
 +      unsigned long page_size;
 +      unsigned long byte_addr;
 +      u8 cmd[flash->addr_width+2];
 +      int ret;
 +
 +      if ((flash->size > 0x1000000) && (flash->addr_width == 3)) {
 +              ret = spi_flash_check_bankaddr_access(flash, &offset);
 +              if (ret) {
 +                      debug("SF: fail to acess bank_addr\n");
 +                      return ret;
 +              }
 +      }
 +
 +      page_size = flash->page_size;
 +      page_addr = offset / page_size;
 +      byte_addr = offset % page_size;
  
+       /* Handle memory-mapped SPI */
+       if (flash->memory_map)
+               memcpy(data, flash->memory_map + offset, len);
        cmd[0] = CMD_READ_ARRAY_FAST;
 -      spi_flash_addr(offset, cmd);
 -      cmd[4] = 0x00;
 +      spi_flash_addr(flash, page_addr, byte_addr, cmd);
 +      cmd[sizeof(cmd)-1] = 0x00;
  
        return spi_flash_read_common(flash, cmd, sizeof(cmd), data, len);
  }
@@@ -334,106 -282,34 +347,134 @@@ int spi_flash_cmd_write_status(struct s
        return 0;
  }
  
 +int spi_flash_cmd_bankaddr_write(struct spi_flash *flash, u8 ear)
 +{
 +      u8 cmd;
 +      u8 idcode0;
 +      int ret;
 +
 +      ret = spi_flash_cmd(flash->spi, CMD_READ_ID, &idcode0, 1);
 +      if (ret) {
 +              debug("SF: fail to read read id\n");
 +              return ret;
 +      }
 +
 +      if (idcode0 == 0x01) {
 +              cmd = CMD_BANKADDR_BRWR;
 +      } else if ((idcode0 == 0xef) || (idcode0 == 0x20)) {
 +              cmd = CMD_EXT_WREAR;
 +      } else {
 +              printf("SF: unable to support extended addr reg write"
 +                                              " for %s flash\n", flash->name);
 +              return -1;
 +      }
 +
 +      ret = spi_flash_cmd_write_enable(flash);
 +      if (ret < 0) {
 +              debug("SF: enabling write failed\n");
 +              return ret;
 +      }
 +
 +      ret = spi_flash_cmd_write(flash->spi, &cmd, 1, &ear, 1);
 +      if (ret) {
 +              debug("SF: fail to write bank addr register\n");
 +              return ret;
 +      }
 +
 +      ret = spi_flash_cmd_wait_ready(flash, SPI_FLASH_PROG_TIMEOUT);
 +      if (ret < 0) {
 +              debug("SF: write config register timed out\n");
 +              return ret;
 +      }
 +
 +      return 0;
 +}
 +
 +int spi_flash_cmd_bankaddr_read(struct spi_flash *flash, void *data)
 +{
 +      u8 cmd;
 +      u8 idcode0;
 +      int ret;
 +
 +      ret = spi_flash_cmd(flash->spi, CMD_READ_ID, &idcode0, 1);
 +      if (ret) {
 +              debug("SF: fail to read read id\n");
 +              return ret;
 +      }
 +
 +      if (idcode0 == 0x01) {
 +              cmd = CMD_BANKADDR_BRRD;
 +      } else if ((idcode0 == 0xef) || (idcode0 == 0x20)) {
 +              cmd = CMD_EXT_RDEAR;
 +      } else {
 +              printf("SF: unable to support extended addr reg read"
 +                      " for %s flash\n", flash->name);
 +              return -1;
 +      }
 +
 +      return spi_flash_read_common(flash, &cmd, 1, data, 1);
 +}
 +
 +int spi_flash_bankaddr_access(struct spi_flash *flash, u8 status)
 +{
 +      int ret, pass;
 +      u8 data = 0, write_done = 0;
 +
 +      for (pass = 0; pass < 2; pass++) {
 +              ret = spi_flash_cmd_bankaddr_read(flash, (void *)&data);
 +              if (ret < 0) {
 +                      debug("SF: fail to read bank addr register\n");
 +                      return ret;
 +              }
 +
 +              if ((data != status) & !write_done) {
 +                      debug("SF: need to %s bank addr bit\n",
 +                                              status ? "set" : "reset");
 +
 +                      write_done = 1;
 +                      ret = spi_flash_cmd_bankaddr_write(flash, status);
 +                      if (ret < 0) {
 +                              debug("SF: fail to write bank addr bit\n");
 +                              return ret;
 +                      }
 +              } else {
 +                      debug("SF: bank addr bit is %s.\n",
 +                                              status ? "set" : "reset");
 +                      return ret;
 +              }
 +      }
 +
 +      return -1;
 +}
 +
+ #ifdef CONFIG_OF_CONTROL
+ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
+ {
+       fdt_addr_t addr;
+       fdt_size_t size;
+       int node;
+       /* If there is no node, do nothing */
+       node = fdtdec_next_compatible(blob, 0, COMPAT_GENERIC_SPI_FLASH);
+       if (node < 0)
+               return 0;
+       addr = fdtdec_get_addr_size(blob, node, "memory-map", &size);
+       if (addr == FDT_ADDR_T_NONE) {
+               debug("%s: Cannot decode address\n", __func__);
+               return 0;
+       }
+       if (flash->size != size) {
+               debug("%s: Memory map must cover entire device\n", __func__);
+               return -1;
+       }
+       flash->memory_map = (void *)addr;
+       return 0;
+ }
+ #endif /* CONFIG_OF_CONTROL */
  /*
   * The following table holds all device probe functions
   *
index 13c1971e5b65cfede2cc7a86ff6c877dca6109f0,2a9972bd4ee519f97c67c7df3e6c0c4ac49fa49d..b73112c94972bf0e7b94d1ef8e9e7af09c551c33
@@@ -182,23 -182,9 +182,17 @@@ struct spi_flash *spi_flash_probe_stmic
                return NULL;
        }
  
-       flash->spi = spi;
-       flash->name = params->name;
-       flash->write = spi_flash_cmd_write_multi;
-       flash->erase = spi_flash_cmd_erase;
-       flash->read = spi_flash_cmd_read_fast;
        flash->page_size = 256;
        flash->sector_size = 256 * params->pages_per_sector;
 -      flash->size = flash->sector_size * params->nr_sectors;
 +
 +      /* address width is 4 for dual and 3 for single qspi */
 +      if (flash->spi->is_dual == 1) {
 +              flash->addr_width = 4;
 +              flash->size = flash->sector_size * (2 * params->nr_sectors);
 +      } else {
 +              flash->addr_width = 3;
 +              flash->size = flash->sector_size * params->nr_sectors;
 +      }
  
        return flash;
  }
index 3ddd057009b119c2fd220993651323206b6d741f,27162091c5ac69e4cfe8af4fc7d4f4944391c0a5..6e9b586fe07a6010b573b0f3852c1bb779a9f034
@@@ -98,23 -103,9 +103,17 @@@ struct spi_flash *spi_flash_probe_winbo
                return NULL;
        }
  
-       flash->spi = spi;
-       flash->name = params->name;
-       flash->write = spi_flash_cmd_write_multi;
-       flash->erase = spi_flash_cmd_erase;
-       flash->read = spi_flash_cmd_read_fast;
        flash->page_size = 256;
        flash->sector_size = 4096;
 -      flash->size = 4096 * 16 * params->nr_blocks;
 +
 +      /* address width is 4 for dual and 3 for single qspi */
 +      if (flash->spi->is_dual == 1) {
 +              flash->addr_width = 4;
 +              flash->size = 4096 * 16 * (2 * params->nr_blocks);
 +      } else {
 +              flash->addr_width = 3;
 +              flash->size = 4096 * 16 * params->nr_blocks;
 +      }
  
        return flash;
  }
index 0f324f4c2a1241b8990d4fbcaf5147f4ef559c7f,d08609effe1ace437a87c06a9dd66744d7a3a642..2072bca10928892e20701eb86061ef67fe8ab820
@@@ -45,9 -50,11 +50,12 @@@ COBJS-$(CONFIG_OMAP3_SPI) += omap3_spi.
  COBJS-$(CONFIG_SOFT_SPI) += soft_spi.o
  COBJS-$(CONFIG_SH_SPI) += sh_spi.o
  COBJS-$(CONFIG_FSL_ESPI) += fsl_espi.o
- COBJS-$(CONFIG_TEGRA_SPI) += tegra_spi.o
+ COBJS-$(CONFIG_FDT_SPI) += fdt_spi.o
+ COBJS-$(CONFIG_TEGRA20_SFLASH) += tegra20_sflash.o
+ COBJS-$(CONFIG_TEGRA20_SLINK) += tegra20_slink.o
+ COBJS-$(CONFIG_TEGRA114_SPI) += tegra114_spi.o
  COBJS-$(CONFIG_XILINX_SPI) += xilinx_spi.o
 +COBJS-$(CONFIG_ZYNQ_SPI) += zynq_qspips.o
  
  COBJS := $(COBJS-y)
  SRCS  := $(COBJS:.o=.c)
Simple merge
diff --cc include/spi.h
index f48374204a0d2f6c36f8e490b2ede746800a1491,3fe2e1eab2defc568079cd8a035225bbf682b18d..7de7ac91c79a22e2ae4a19e788e38ec79047a156
   *
   *   bus:     ID of the bus that the slave is attached to.
   *   cs:      ID of the chip select connected to the slave.
 + *   is_dual: Indicates whether dual memories are used
+  *   max_write_size:  If non-zero, the maximum number of bytes which can
+  *            be written at once, excluding command bytes.
   */
  struct spi_slave {
        unsigned int    bus;
        unsigned int    cs;
 +      unsigned int    is_dual;
+       unsigned int max_write_size;
  };
  
  /*-----------------------------------------------------------------------
index 9b0d1045e9ae546830a380045c7ddc132e0c85df,3b6a44edcef6a1e8707ecd20572f191c9f05da46..a3b0dcdfeeace6d2e27785b1c1f93d4b0484b02b
@@@ -38,9 -38,8 +38,10 @@@ struct spi_flash 
        u32             page_size;
        /* Erase (sector) size */
        u32             sector_size;
 +      /* To find whether single/dual spi device */
 +      u8              addr_width;
  
+       void *memory_map;       /* Address of read-only SPI flash access */
        int             (*read)(struct spi_flash *flash, u32 offset,
                                size_t len, void *buf);
        int             (*write)(struct spi_flash *flash, u32 offset,