[U-Boot] [PATCH] spi: kirkwood_spi: implement workaround for FE-9144572

Chris Packham judge.packham at gmail.com
Mon Oct 16 20:57:39 UTC 2017


On Tue, Oct 17, 2017 at 6:04 AM, Jagan Teki <jagannadh.teki at gmail.com> wrote:
> On Fri, Oct 13, 2017 at 6:35 AM, Chris Packham <judge.packham at gmail.com> wrote:
>> Erratum NO. FE-9144572: The device SPI interface supports frequencies of
>> up to 50 MHz.  However, due to this erratum, when the device core clock
>> is 250 MHz and the SPI interfaces is configured for 50MHz SPI clock and
>> CPOL=CPHA=1 there might occur data corruption on reads from the SPI
>> device.
>>
>> Implement the workaround by setting the TMISO_SAMPLE value to 0x2
>> in the timing1 register.
>>
>> Signed-off-by: Chris Packham <judge.packham at gmail.com>
>> ---
>>
>>  arch/arm/include/asm/arch-mvebu/spi.h |  6 ++++
>>  drivers/spi/kirkwood_spi.c            | 62 +++++++++++++++++++++++++++++++++--
>>  2 files changed, 65 insertions(+), 3 deletions(-)
>>
>> diff --git a/arch/arm/include/asm/arch-mvebu/spi.h b/arch/arm/include/asm/arch-mvebu/spi.h
>> index 3545aed17347..1de510ea6da9 100644
>> --- a/arch/arm/include/asm/arch-mvebu/spi.h
>> +++ b/arch/arm/include/asm/arch-mvebu/spi.h
>> @@ -57,6 +57,12 @@ struct kwspi_registers {
>>  #define KWSPI_TXLSBF           (1 << 13)
>>  #define KWSPI_RXLSBF           (1 << 14)
>>
>> +/* Timing Parameters 1 Register */
>> +#define KW_SPI_TMISO_SAMPLE_OFFSET     6
>> +#define KW_SPI_TMISO_SAMPLE_MASK       (0x3 << KW_SPI_TMISO_SAMPLE_OFFSET)
>> +#define KW_SPI_TMISO_SAMPLE_1          (1 << KW_SPI_TMISO_SAMPLE_OFFSET)
>> +#define KW_SPI_TMISO_SAMPLE_2          (2 << KW_SPI_TMISO_SAMPLE_OFFSET)
>> +
>>  #define KWSPI_IRQUNMASK                1 /* unmask SPI interrupt */
>>  #define KWSPI_IRQMASK          0 /* mask SPI interrupt */
>>  #define KWSPI_SMEMRDIRQ                1 /* SerMem data xfer ready irq */
>> diff --git a/drivers/spi/kirkwood_spi.c b/drivers/spi/kirkwood_spi.c
>> index 0c6bd295cde9..7992556d49eb 100644
>> --- a/drivers/spi/kirkwood_spi.c
>> +++ b/drivers/spi/kirkwood_spi.c
>> @@ -243,6 +243,16 @@ int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
>>
>>  /* Here now the DM part */
>>
>> +enum mvebu_spi_type {
>> +       ORION_SPI,
>
> This is never used, since there is a separate driver in orion - any
> plan to merge them as single driver? otherwise it's no need.
>

I actually do have access to some Kirkwood hardware. But a distinct
lack of round tuits to port it to master/DM/etc.

For now I'll drop the type. It can be added back if/when a user emerges.

>> +       ARMADA_SPI,
>> +};
>> +
>> +struct mvebu_spi_dev {
>> +       enum mvebu_spi_type     typ;
>> +       bool                    is_errata_50mhz_ac;
>> +};
>> +
>>  struct mvebu_spi_platdata {
>>         struct kwspi_registers *spireg;
>>  };
>> @@ -269,10 +279,30 @@ static int mvebu_spi_set_speed(struct udevice *bus, uint hz)
>>         return 0;
>>  }
>>
>> +static void
>> +mvebu_spi_50mhz_ac_timing_erratum(struct udevice *bus, uint mode)
>> +{
>> +       struct mvebu_spi_platdata *plat = dev_get_platdata(bus);
>> +       struct kwspi_registers *reg = plat->spireg;
>> +       u32 data = readl(&reg->timing1);
>> +
>
> Better to have description of errata.
>

Will add in v2.

> thanks!
> --
> Jagan Teki
> Free Software Engineer | www.openedev.com
> U-Boot, Linux | Upstream Maintainer
> Hyderabad, India.


More information about the U-Boot mailing list