- H6 dts(i) sync (Clément) - H6 PIO (Icenowy) - Fix pll1 clock calculation (Stefan) - H6 dram, half DQ (Jernej) - A64 OLinuXino eMMC (Sunil)
This commit is contained in:
@@ -3,6 +3,7 @@ menu "SPI Flash Support"
|
||||
config DM_SPI_FLASH
|
||||
bool "Enable Driver Model for SPI flash"
|
||||
depends on DM && DM_SPI
|
||||
imply SPI_FLASH
|
||||
help
|
||||
Enable driver model for SPI flash. This SPI flash interface
|
||||
(spi_flash_probe(), spi_flash_write(), etc.) is then
|
||||
@@ -26,11 +27,10 @@ config SPI_FLASH_SANDBOX
|
||||
stored in a file on the host filesystem.
|
||||
|
||||
config SPI_FLASH
|
||||
bool "Legacy SPI Flash Interface support"
|
||||
depends on SPI
|
||||
bool "SPI Flash Core Interface support"
|
||||
select SPI_MEM
|
||||
help
|
||||
Enable the legacy SPI flash support. This will include basic
|
||||
Enable the SPI flash Core support. This will include basic
|
||||
standard support for things like probing, read / write, and
|
||||
erasing through cmd_sf interface.
|
||||
|
||||
@@ -196,4 +196,12 @@ config SPI_FLASH_MTD
|
||||
|
||||
If unsure, say N
|
||||
|
||||
config SPL_SPI_FLASH_MTD
|
||||
bool "SPI flash MTD support for SPL"
|
||||
depends on SPI_FLASH
|
||||
help
|
||||
Enable the MTD support for the SPI flash layer in SPL.
|
||||
|
||||
If unsure, say N
|
||||
|
||||
endmenu # menu "SPI Flash Support"
|
||||
|
||||
@@ -19,5 +19,5 @@ endif
|
||||
|
||||
obj-$(CONFIG_SPI_FLASH) += spi-nor.o
|
||||
obj-$(CONFIG_SPI_FLASH_DATAFLASH) += sf_dataflash.o
|
||||
obj-$(CONFIG_SPI_FLASH_MTD) += sf_mtd.o
|
||||
obj-$(CONFIG_$(SPL_)SPI_FLASH_MTD) += sf_mtd.o
|
||||
obj-$(CONFIG_SPI_FLASH_SANDBOX) += sandbox.o
|
||||
|
||||
@@ -77,7 +77,7 @@ extern const struct flash_info spi_nor_ids[];
|
||||
int spi_flash_cmd_get_sw_write_prot(struct spi_flash *flash);
|
||||
|
||||
|
||||
#ifdef CONFIG_SPI_FLASH_MTD
|
||||
#if CONFIG_IS_ENABLED(SPI_FLASH_MTD)
|
||||
int spi_flash_mtd_register(struct spi_flash *flash);
|
||||
void spi_flash_mtd_unregister(void);
|
||||
#endif
|
||||
|
||||
@@ -44,7 +44,7 @@ static int spi_flash_probe_slave(struct spi_flash *flash)
|
||||
if (ret)
|
||||
goto err_read_id;
|
||||
|
||||
#ifdef CONFIG_SPI_FLASH_MTD
|
||||
#if CONFIG_IS_ENABLED(SPI_FLASH_MTD)
|
||||
ret = spi_flash_mtd_register(flash);
|
||||
#endif
|
||||
|
||||
@@ -83,7 +83,7 @@ struct spi_flash *spi_flash_probe(unsigned int busnum, unsigned int cs,
|
||||
|
||||
void spi_flash_free(struct spi_flash *flash)
|
||||
{
|
||||
#ifdef CONFIG_SPI_FLASH_MTD
|
||||
#if CONFIG_IS_ENABLED(SPI_FLASH_MTD)
|
||||
spi_flash_mtd_unregister();
|
||||
#endif
|
||||
spi_free_slave(flash->spi);
|
||||
@@ -152,7 +152,7 @@ static int spi_flash_std_probe(struct udevice *dev)
|
||||
|
||||
static int spi_flash_std_remove(struct udevice *dev)
|
||||
{
|
||||
#ifdef CONFIG_SPI_FLASH_MTD
|
||||
#if CONFIG_IS_ENABLED(SPI_FLASH_MTD)
|
||||
spi_flash_mtd_unregister();
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
@@ -380,12 +380,12 @@ static int spi_nor_fsr_ready(struct spi_nor *nor)
|
||||
|
||||
if (fsr & (FSR_E_ERR | FSR_P_ERR)) {
|
||||
if (fsr & FSR_E_ERR)
|
||||
dev_dbg(nor->dev, "Erase operation failed.\n");
|
||||
dev_err(nor->dev, "Erase operation failed.\n");
|
||||
else
|
||||
dev_dbg(nor->dev, "Program operation failed.\n");
|
||||
dev_err(nor->dev, "Program operation failed.\n");
|
||||
|
||||
if (fsr & FSR_PT_ERR)
|
||||
dev_dbg(nor->dev,
|
||||
dev_err(nor->dev,
|
||||
"Attempted to modify a protected sector.\n");
|
||||
|
||||
nor->write_reg(nor, SPINOR_OP_CLFSR, NULL, 0);
|
||||
@@ -1916,7 +1916,7 @@ static int spi_nor_parse_bfpt(struct spi_nor *nor,
|
||||
|
||||
erasesize = 1U << erasesize;
|
||||
opcode = (half >> 8) & 0xff;
|
||||
#ifdef CONFIG_MTD_SPI_NOR_USE_4K_SECTORS
|
||||
#ifdef CONFIG_SPI_FLASH_USE_4K_SECTORS
|
||||
if (erasesize == SZ_4K) {
|
||||
nor->erase_opcode = opcode;
|
||||
mtd->erasesize = erasesize;
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
* All newly added entries should describe *hardware* and should use SECT_4K
|
||||
* (or SECT_4K_PMC) if hardware supports erasing 4 KiB sectors. For usage
|
||||
* scenarios excluding small sectors there is config option that can be
|
||||
* disabled: CONFIG_MTD_SPI_NOR_USE_4K_SECTORS.
|
||||
* disabled: CONFIG_SPI_FLASH_USE_4K_SECTORS.
|
||||
* For historical (and compatibility) reasons (before we got above config) some
|
||||
* old entries may be missing 4K flag.
|
||||
*/
|
||||
@@ -75,6 +75,7 @@ const struct flash_info spi_nor_ids[] = {
|
||||
{ INFO("at45db161d", 0x1f2600, 0, 64 * 1024, 32, SECT_4K) },
|
||||
{ INFO("at45db321d", 0x1f2700, 0, 64 * 1024, 64, SECT_4K) },
|
||||
{ INFO("at45db641d", 0x1f2800, 0, 64 * 1024, 128, SECT_4K) },
|
||||
{ INFO("at25sl321", 0x1f4216, 0, 64 * 1024, 64, SECT_4K) },
|
||||
{ INFO("at26df081a", 0x1f4501, 0, 64 * 1024, 16, SECT_4K) },
|
||||
#endif
|
||||
#ifdef CONFIG_SPI_FLASH_EON /* EON */
|
||||
@@ -128,6 +129,8 @@ const struct flash_info spi_nor_ids[] = {
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("is25wp128", 0x9d7018, 0, 64 * 1024, 256,
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("is25wp256", 0x9d7019, 0, 64 * 1024, 512,
|
||||
SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) },
|
||||
#endif
|
||||
#ifdef CONFIG_SPI_FLASH_MACRONIX /* MACRONIX */
|
||||
/* Macronix */
|
||||
@@ -161,12 +164,16 @@ const struct flash_info spi_nor_ids[] = {
|
||||
{ INFO("n25q064a", 0x20bb17, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("n25q128a11", 0x20bb18, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("n25q128a13", 0x20ba18, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("n25q256a", 0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
{ INFO("n25q256ax1", 0x20bb19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
{ INFO6("mt25ql256a", 0x20ba19, 0x104400, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | USE_FSR) },
|
||||
{ INFO("n25q256a", 0x20ba19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | USE_FSR) },
|
||||
{ INFO6("mt25qu256a", 0x20bb19, 0x104400, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES | USE_FSR) },
|
||||
{ INFO("n25q256ax1", 0x20bb19, 0, 64 * 1024, 512, SECT_4K | SPI_NOR_QUAD_READ | USE_FSR) },
|
||||
{ INFO6("mt25qu512a", 0x20bb20, 0x104400, 64 * 1024, 1024,
|
||||
SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
{ INFO("n25q512a", 0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
{ INFO("n25q512ax3", 0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES |
|
||||
USE_FSR) },
|
||||
{ INFO("n25q512a", 0x20bb20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
|
||||
{ INFO6("mt25ql512a", 0x20ba20, 0x104400, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | SPI_NOR_4B_OPCODES) },
|
||||
{ INFO("n25q512ax3", 0x20ba20, 0, 64 * 1024, 1024, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ) },
|
||||
{ INFO("n25q00", 0x20ba21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
||||
{ INFO("n25q00a", 0x20bb21, 0, 64 * 1024, 2048, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
||||
{ INFO("mt25qu02g", 0x20bb22, 0, 64 * 1024, 4096, SECT_4K | USE_FSR | SPI_NOR_QUAD_READ | NO_CHIP_ERASE) },
|
||||
|
||||
@@ -1,5 +1,22 @@
|
||||
menuconfig SPI
|
||||
bool "SPI Support"
|
||||
help
|
||||
The "Serial Peripheral Interface" is a low level synchronous
|
||||
protocol. Chips that support SPI can have data transfer rates
|
||||
up to several tens of Mbit/sec. Chips are addressed with a
|
||||
controller and a chipselect. Most SPI slaves don't support
|
||||
dynamic device discovery; some are even write-only or read-only.
|
||||
|
||||
SPI is widely used by microcontrollers to talk with sensors,
|
||||
eeprom and flash memory, codecs and various other controller
|
||||
chips, analog to digital (and d-to-a) converters, and more.
|
||||
MMC and SD cards can be accessed using SPI protocol; and for
|
||||
DataFlash cards used in MMC sockets, SPI must always be used.
|
||||
|
||||
SPI is one of a family of similar protocols using a four wire
|
||||
interface (select, clock, data in, data out) including Microwire
|
||||
(half duplex), SSP, SSI, and PSP. This driver framework should
|
||||
work with most such devices and controllers.
|
||||
|
||||
if SPI
|
||||
|
||||
@@ -243,6 +260,7 @@ config SPI_SIFIVE
|
||||
|
||||
config SPI_SUNXI
|
||||
bool "Allwinner SoC SPI controllers"
|
||||
default ARCH_SUNXI
|
||||
help
|
||||
Enable the Allwinner SoC SPi controller driver.
|
||||
|
||||
|
||||
@@ -198,7 +198,7 @@ static int ath79_cs_info(struct udevice *bus, uint cs,
|
||||
{
|
||||
/* Always allow activity on CS 0/1/2 */
|
||||
if (cs >= 3)
|
||||
return -ENODEV;
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ static int bcm63xx_hsspi_cs_info(struct udevice *bus, uint cs,
|
||||
|
||||
if (cs >= priv->num_cs) {
|
||||
printf("no cs %u\n", cs);
|
||||
return -ENODEV;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -130,7 +130,7 @@ static int bcm63xx_spi_cs_info(struct udevice *bus, uint cs,
|
||||
|
||||
if (cs >= priv->num_cs) {
|
||||
printf("no cs %u\n", cs);
|
||||
return -ENODEV;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -518,8 +518,22 @@ static int dw_spi_set_mode(struct udevice *bus, uint mode)
|
||||
static int dw_spi_remove(struct udevice *bus)
|
||||
{
|
||||
struct dw_spi_priv *priv = dev_get_priv(bus);
|
||||
int ret;
|
||||
|
||||
return reset_release_bulk(&priv->resets);
|
||||
ret = reset_release_bulk(&priv->resets);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
#if CONFIG_IS_ENABLED(CLK)
|
||||
ret = clk_disable(&priv->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_free(&priv->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct dm_spi_ops dw_spi_ops = {
|
||||
|
||||
@@ -117,7 +117,7 @@ static int sandbox_cs_info(struct udevice *bus, uint cs,
|
||||
{
|
||||
/* Always allow activity on CS 0 */
|
||||
if (cs >= 1)
|
||||
return -ENODEV;
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -261,11 +261,10 @@ int spi_cs_info(struct udevice *bus, uint cs, struct spi_cs_info *info)
|
||||
return ops->cs_info(bus, cs, info);
|
||||
|
||||
/*
|
||||
* We could assume there is at least one valid chip select, but best
|
||||
* to be sure and return an error in this case. The driver didn't
|
||||
* care enough to tell us.
|
||||
* We could assume there is at least one valid chip select.
|
||||
* The driver didn't care enough to tell us.
|
||||
*/
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int spi_find_bus_and_cs(int busnum, int cs, struct udevice **busp,
|
||||
|
||||
@@ -78,7 +78,7 @@ int tegra20_sflash_cs_info(struct udevice *bus, unsigned int cs,
|
||||
{
|
||||
/* Tegra20 SPI-Flash - only 1 device ('bus/cs') */
|
||||
if (cs != 0)
|
||||
return -ENODEV;
|
||||
return -EINVAL;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user