[U-Boot] [PATCH] spi: kirkwood_spi: implement workaround for FE-9144572
Jagan Teki
jagannadh.teki at gmail.com
Mon Oct 16 17:04:47 UTC 2017
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.
> + 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(®->timing1);
> +
Better to have description of errata.
thanks!
--
Jagan Teki
Free Software Engineer | www.openedev.com
U-Boot, Linux | Upstream Maintainer
Hyderabad, India.
More information about the U-Boot
mailing list