[U-Boot] [PATCH 4/4] spi: ich: Configure SPI BIOS parameters for Linux upon U-Boot exit
Jagan Teki
jagannadh.teki at gmail.com
Fri Apr 7 06:53:17 UTC 2017
On Thu, Apr 6, 2017 at 6:59 PM, Stefan Roese <sr at denx.de> wrote:
> This patch adds a remove function to the Intel ICH SPI driver, that will
> be called upon U-Boot exit, directly before the OS (Linux) is started.
> This function takes care of configuring the BIOS registers in the SPI
> controller (similar to what a "standard" BIOS or coreboot does), so that
> the Linux MTD device driver is able to correctly read/write to the SPI
> NOR chip. Without this, the chip is not detected at all.
>
> Signed-off-by: Stefan Roese <sr at denx.de>
> Cc: Bin Meng <bmeng.cn at gmail.com>
> Cc: Simon Glass <sjg at chromium.org>
> Cc: Jagan Teki <jteki at openedev.com>
> ---
> drivers/spi/ich.c | 18 ++++++++++++++++++
> drivers/spi/ich.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++-------
> 2 files changed, 65 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/spi/ich.c b/drivers/spi/ich.c
> index 893fe33b66..60f40c5cf5 100644
> --- a/drivers/spi/ich.c
> +++ b/drivers/spi/ich.c
> @@ -617,6 +617,22 @@ static int ich_spi_probe(struct udevice *dev)
> return 0;
> }
>
> +static int ich_spi_remove(struct udevice *bus)
> +{
> + struct ich_spi_priv *ctlr = dev_get_priv(bus);
> +
> + /*
> + * Configure SPI controller so that the Linux MTD driver can fully
> + * access the SPI NOR chip
> + */
> + ich_writew(ctlr, SPI_OPPREFIX, ctlr->preop);
> + ich_writew(ctlr, SPI_OPTYPE, ctlr->optype);
> + ich_writel(ctlr, SPI_OPMENU_LOWER, ctlr->opmenu);
> + ich_writel(ctlr, SPI_OPMENU_UPPER, ctlr->opmenu + sizeof(u32));
> +
> + return 0;
> +}
> +
> static int ich_spi_set_speed(struct udevice *bus, uint speed)
> {
> struct ich_spi_priv *priv = dev_get_priv(bus);
> @@ -700,4 +716,6 @@ U_BOOT_DRIVER(ich_spi) = {
> .priv_auto_alloc_size = sizeof(struct ich_spi_priv),
> .child_pre_probe = ich_spi_child_pre_probe,
> .probe = ich_spi_probe,
> + .remove = ich_spi_remove,
> + .flags = DM_FLAG_PRE_OS_FINALIZE,
> };
> diff --git a/drivers/spi/ich.h b/drivers/spi/ich.h
> index bd0a820809..dcb8a9048f 100644
> --- a/drivers/spi/ich.h
> +++ b/drivers/spi/ich.h
> @@ -102,13 +102,6 @@ enum {
> };
>
> enum {
> - SPI_OPCODE_TYPE_READ_NO_ADDRESS = 0,
> - SPI_OPCODE_TYPE_WRITE_NO_ADDRESS = 1,
> - SPI_OPCODE_TYPE_READ_WITH_ADDRESS = 2,
> - SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS = 3
> -};
> -
> -enum {
> ICH_MAX_CMD_LEN = 5,
> };
>
> @@ -124,8 +117,55 @@ struct spi_trans {
> uint32_t offset;
> };
>
> +#define SPI_OPCODE_WRSR 0x01
> +#define SPI_OPCODE_PAGE_PROGRAM 0x02
> +#define SPI_OPCODE_READ 0x03
> +#define SPI_OPCODE_WRDIS 0x04
> +#define SPI_OPCODE_RDSR 0x05
> #define SPI_OPCODE_WREN 0x06
> #define SPI_OPCODE_FAST_READ 0x0b
> +#define SPI_OPCODE_ERASE_SECT 0x20
> +#define SPI_OPCODE_READ_ID 0x9f
> +#define SPI_OPCODE_ERASE_BLOCK 0xd8
> +
> +#define SPI_OPCODE_TYPE_READ_NO_ADDRESS 0
> +#define SPI_OPCODE_TYPE_WRITE_NO_ADDRESS 1
> +#define SPI_OPCODE_TYPE_READ_WITH_ADDRESS 2
> +#define SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS 3
> +
> +#define SPI_OPMENU_0 SPI_OPCODE_WRSR
> +#define SPI_OPTYPE_0 SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
> +
> +#define SPI_OPMENU_1 SPI_OPCODE_PAGE_PROGRAM
> +#define SPI_OPTYPE_1 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
> +
> +#define SPI_OPMENU_2 SPI_OPCODE_READ
> +#define SPI_OPTYPE_2 SPI_OPCODE_TYPE_READ_WITH_ADDRESS
> +
> +#define SPI_OPMENU_3 SPI_OPCODE_RDSR
> +#define SPI_OPTYPE_3 SPI_OPCODE_TYPE_READ_NO_ADDRESS
> +
> +#define SPI_OPMENU_4 SPI_OPCODE_ERASE_SECT
> +#define SPI_OPTYPE_4 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
> +
> +#define SPI_OPMENU_5 SPI_OPCODE_READ_ID
> +#define SPI_OPTYPE_5 SPI_OPCODE_TYPE_READ_NO_ADDRESS
> +
> +#define SPI_OPMENU_6 SPI_OPCODE_ERASE_BLOCK
> +#define SPI_OPTYPE_6 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
> +
> +#define SPI_OPMENU_7 SPI_OPCODE_FAST_READ
> +#define SPI_OPTYPE_7 SPI_OPCODE_TYPE_READ_WITH_ADDRESS
> +
> +#define SPI_OPPREFIX ((SPI_OPCODE_WREN << 8) | SPI_OPCODE_WREN)
> +#define SPI_OPTYPE ((SPI_OPTYPE_7 << 14) | (SPI_OPTYPE_6 << 12) | \
> + (SPI_OPTYPE_5 << 10) | (SPI_OPTYPE_4 << 8) | \
> + (SPI_OPTYPE_3 << 6) | (SPI_OPTYPE_2 << 4) | \
> + (SPI_OPTYPE_1 << 2) | (SPI_OPTYPE_0 << 0))
> +#define SPI_OPMENU_UPPER ((SPI_OPMENU_7 << 24) | (SPI_OPMENU_6 << 16) | \
> + (SPI_OPMENU_5 << 8) | (SPI_OPMENU_4 << 0))
> +#define SPI_OPMENU_LOWER ((SPI_OPMENU_3 << 24) | (SPI_OPMENU_2 << 16) | \
> + (SPI_OPMENU_1 << 8) | (SPI_OPMENU_0 << 0))
These look flash opcodes, shouldn't be part of spi
thanks!
--
Jagan Teki
Free Software Engineer | www.openedev.com
U-Boot, Linux | Upstream Maintainer
Hyderabad, India.
More information about the U-Boot
mailing list