On Mon, Jun 25, 2018 at 4:06 PM, Vipul Kumar <vip...@xilinx.com> wrote:
> Hi Jagan,
>
>> -----Original Message-----
>> From: Jagan Teki [mailto:jagannadh.t...@gmail.com]
>> Sent: Monday, June 25, 2018 3:47 PM
>> To: Vipul Kumar <vip...@xilinx.com>
>> Cc: U-Boot Mailing List <u-boot@lists.denx.de>; Michal Simek
>> <mich...@xilinx.com>
>> Subject: Re: [U-Boot] [UBOOT PATCH v3 3/3] spi: xilinx_spi: Added support to
>> read JEDEC-id twice at the boot time
>>
>> On Thu, Jun 21, 2018 at 2:53 PM, Vipul Kumar <vipul.ku...@xilinx.com>
>> wrote:
>> > This patch is for the startup block issue in the spi controller.
>> > SPI clock is passing through STARTUP block to FLASH. STARTUP block
>> > don't provide clock as soon as QSPI provides command. So, first
>> > command fails.
>>
>> Does this a controller issue?
>
> Yes, this is a controller issue.
>
>>
>> >
>> > This patch added support to read JEDEC id in xilinx_spi_xfer ().
>> >
>> > Signed-off-by: Vipul Kumar <vipul.ku...@xilinx.com>
>> > ---
>> > Changes in v3:
>> > - No change
>> > ---
>> >  drivers/spi/xilinx_spi.c | 41
>> > +++++++++++++++++++++++++++++++++++++++++
>> >  1 file changed, 41 insertions(+)
>> >
>> > diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c index
>> > 4026540..61301c2 100644
>> > --- a/drivers/spi/xilinx_spi.c
>> > +++ b/drivers/spi/xilinx_spi.c
>> > @@ -204,6 +204,40 @@ static u32 xilinx_spi_read_rxfifo(struct udevice
>> *bus, u8 *rxp, u32 rxbytes)
>> >         return i;
>> >  }
>> >
>> > +static void xilinx_startup_block(struct udevice *dev, unsigned int bytes,
>> > +                                const void *dout, void *din) {
>> > +       struct udevice *bus = dev_get_parent(dev);
>> > +       struct xilinx_spi_priv *priv = dev_get_priv(bus);
>> > +       struct xilinx_spi_regs *regs = priv->regs;
>> > +       struct dm_spi_slave_platdata *slave_plat =
>> dev_get_parent_platdata(dev);
>> > +       const unsigned char *txp = dout;
>> > +       unsigned char *rxp = din;
>> > +       static int startup;
>> > +       u32 reg, count;
>> > +       u32 txbytes = bytes;
>> > +       u32 rxbytes = bytes;
>> > +
>> > +       /*
>> > +        * This loop runs two times. First time to send the command.
>> > +        * Second time to transfer data. After transferring data,
>> > +        * it sets txp to the initial value for the normal operation.
>> > +        */
>> > +       for ( ; startup < 2; startup++) {
>> > +               count = xilinx_spi_fill_txfifo(bus, txp, txbytes);
>> > +               reg = readl(&regs->spicr) & ~SPICR_MASTER_INHIBIT;
>> > +               writel(reg, &regs->spicr);
>> > +               count = xilinx_spi_read_rxfifo(bus, rxp, rxbytes);
>> > +               txp = din;
>> > +
>> > +               if (startup) {
>> > +                       spi_cs_deactivate(dev);
>> > +                       spi_cs_activate(dev, slave_plat->cs);
>> > +                       txp = dout;
>> > +               }
>> > +       }
>> > +}
>> > +
>> >  static int xilinx_spi_xfer(struct udevice *dev, unsigned int bitlen,
>> >                             const void *dout, void *din, unsigned long
>> > flags)  { @@ -236,6 +270,13 @@ static int xilinx_spi_xfer(struct
>> > udevice *dev, unsigned int bitlen,
>> >         if (flags & SPI_XFER_BEGIN)
>> >                 spi_cs_activate(dev, slave_plat->cs);
>> >
>> > +       /*
>> > +        * This is the work around for the startup block issue in
>> > +        * the spi controller. SPI clock is passing through STARTUP
>> > +        * block to FLASH. STARTUP block don't provide clock as soon
>> > +        * as QSPI provides command. So first command fails.
>> > +        */
>> > +       xilinx_startup_block(dev, bytes, dout, din);
>>
>> But not every spi_xfer from flash side is to read JEDEC ID? during probe of 
>> sf,
>> the relevant spi_xfer is to read JEDEC ID
>
> Inside xilinx_startup_block() function, we are using static variable, so that 
> code will execute only first time.

Sorry, IMHO mainline won't accept this kind of hack (particularly
avoiding function execution through static variables) by for the sake
of bug fix. Having a proper condition to check and fix the errata look
fine to me, any idea how Linux handling this?
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to