[U-Boot] [PATCH 5/5 v2] spi: ich: Configure SPI BIOS parameters for Linux upon U-Boot exit

Stefan Roese sr at denx.de
Tue May 9 11:20:33 UTC 2017


(Added Simon to Cc)

On 09.05.2017 13:14, Jagan Teki wrote:
> On Mon, Apr 24, 2017 at 1:18 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>
>> Reviewed-by: Simon Glass <sjg at chromium.org>
>> Cc: Bin Meng <bmeng.cn at gmail.com>
>> Cc: Jagan Teki <jteki at openedev.com>
>> ---
>> v2:
>> - Added Simons RB line
>>
>>  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..bf2e99b5cc 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_OS_PREPARE,
>>  };
>> 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
>
> Wonder why the flash part should be part of SPI, can't we use existing
> spi_flash through command interface if there is specific stuff like
> this?

This patch only changes some defines here and passes some allowed
opcodes via some configuration registers to the Linux driver.

I didn't look closely into this U-Boot driver and how it interacts
with the SPI NOR. Simon is most likely the best person to answer
on your questions regarding the usage of spi_flash. Simon could
you please answer Jagan's questions?

Thanks,
Stefan


More information about the U-Boot mailing list