> -----Original Message-----
> From: Ng, Boon Khai <boon.khai...@altera.com>
> Sent: Wednesday, April 16, 2025 11:18 AM
> To: U-boot Openlist <u-boot@lists.denx.de>
> Cc: Jagan Teki <ja...@amarulasolutions.com>; Tom Rini
> <tr...@konsulko.com>; Michal Simek <michal.si...@amd.com>; Venkatesh
> Yadav Abbarapu <venkatesh.abbar...@amd.com>; Tejas Bhumkar
> <tejas.arvind.bhum...@amd.com>; William Zhang
> <william.zh...@broadcom.com>; Hea, Kok Kiang
> <kok.kiang....@altera.com>; Maniyam, Dinesh
> <dinesh.mani...@altera.com>; Chee, Tien Fong
> <tien.fong.c...@altera.com>; Zamri, Muhammad Hazim Izzat
> <muhammad.hazim.izzat.za...@altera.com>; Meng, Tingting
> <tingting.m...@altera.com>; Yuslaimi, Alif Zakuan
> <alif.zakuan.yusla...@altera.com>; Ng, Boon Khai
> <boon.khai...@altera.com>
> Subject: [CAD QSPI v2] spi: cadence-qspi: Add disable STIG mode quikrs.
> 
> Adding quirk to disable STIG mode since cadence controller has issue for
> read/write using the STIG mode. STIG mode is enabled by default since
> 2023.04 for small read/write(<8bytes).
> 
> Updated STIG mode reading from dev_get_driver_data by assigning to
> platdata struct before read quirks variable.
> 
> The STIG mode is disabled for normal read case and enabled for QSPI Jedec
> ID read/write since it requires STIG read/write.
> 
> Porting from linux implementation
> https://lore.kernel.org/all/20241204063338.296959-1-niravkumar
> .l.rab...@intel.com/T/
> 
> Signed-off-by: Boon Khai Ng <boon.khai...@altera.com>
> ---
>  drivers/spi/cadence_qspi.c | 29 +++++++++++++++++++++++++----
> drivers/spi/cadence_qspi.h |  7 +++++++
>  2 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/spi/cadence_qspi.c b/drivers/spi/cadence_qspi.c index
> 623904ecdad..c2990ac833e 100644
> --- a/drivers/spi/cadence_qspi.c
> +++ b/drivers/spi/cadence_qspi.c
> @@ -27,6 +27,9 @@
>  #define CQSPI_READ                   2
>  #define CQSPI_WRITE                  3
> 
> +/* Quirks */
> +#define CQSPI_DISABLE_STIG_MODE              BIT(0)
> +
>  __weak int cadence_qspi_apb_dma_read(struct cadence_spi_priv *priv,
>                                    const struct spi_mem_op *op)
>  {
> @@ -217,6 +220,7 @@ static int cadence_spi_probe(struct udevice *bus)
>       priv->tsd2d_ns          = plat->tsd2d_ns;
>       priv->tchsh_ns          = plat->tchsh_ns;
>       priv->tslch_ns          = plat->tslch_ns;
> +     priv->quirks            = plat->quirks;
> 
>       if (IS_ENABLED(CONFIG_ZYNQMP_FIRMWARE))
>               xilinx_pm_request(PM_REQUEST_NODE, PM_DEV_OSPI,
> @@ -307,12 +311,16 @@ static int cadence_spi_mem_exec_op(struct
> spi_slave *spi,
>                * which is unsupported on some flash devices during register
>                * reads, prefer STIG mode for such small reads.
>                */
> -             if (op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX)
> +             if (!op->addr.nbytes ||
> +                 (op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX &&
> +                  !(priv->quirks & CQSPI_DISABLE_STIG_MODE)))
>                       mode = CQSPI_STIG_READ;
>               else
>                       mode = CQSPI_READ;
>       } else {
> -             if (op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX)
> +             if (!op->addr.nbytes || !op->data.buf.out ||
> +                 (op->data.nbytes <= CQSPI_STIG_DATA_LEN_MAX &&
> +                  !(priv->quirks & CQSPI_DISABLE_STIG_MODE)))
>                       mode = CQSPI_STIG_WRITE;
>               else
>                       mode = CQSPI_WRITE;
> @@ -427,6 +435,10 @@ static int cadence_spi_of_to_plat(struct udevice
> *bus)
>       plat->read_delay = ofnode_read_s32_default(subnode, "cdns,read-
> delay",
>                                                  -1);
> 
> +     const struct cqspi_driver_platdata *drvdata =
> +             (struct cqspi_driver_platdata *)dev_get_driver_data(bus);
> +     plat->quirks = drvdata->quirks;
> +
>       debug("%s: regbase=%p ahbbase=%p max-frequency=%d page-
> size=%d\n",
>             __func__, plat->regbase, plat->ahbbase, plat->max_hz,
>             plat->page_size);
> @@ -449,9 +461,18 @@ static const struct dm_spi_ops cadence_spi_ops = {
>        */
>  };
> 
> +static const struct cqspi_driver_platdata cdns_qspi = {
> +     .quirks = CQSPI_DISABLE_STIG_MODE,
> +};
> +
>  static const struct udevice_id cadence_spi_ids[] = {
> -     { .compatible = "cdns,qspi-nor" },
> -     { .compatible = "ti,am654-ospi" },
> +     {
> +             .compatible = "cdns,qspi-nor",
> +             .data = (ulong)&cdns_qspi,
> +     },
> +     {
> +             .compatible = "ti,am654-ospi"
> +     },
>       { }
>  };
> 
> diff --git a/drivers/spi/cadence_qspi.h b/drivers/spi/cadence_qspi.h index
> 1f9125cd239..e6ea9e6c1f4 100644
> --- a/drivers/spi/cadence_qspi.h
> +++ b/drivers/spi/cadence_qspi.h
> @@ -220,6 +220,7 @@ struct cadence_spi_plat {
>       u32             tsd2d_ns;
>       u32             tchsh_ns;
>       u32             tslch_ns;
> +     u32             quirks;
> 
>       bool            is_dma;
>  };
> @@ -251,6 +252,7 @@ struct cadence_spi_priv {
>       u32             tsd2d_ns;
>       u32             tchsh_ns;
>       u32             tslch_ns;
> +     u32             quirks;
>       u8              edge_mode;
>       u8              dll_mode;
>       bool            extra_dummy;
> @@ -266,6 +268,11 @@ struct cadence_spi_priv {
>       bool            dtr;
>  };
> 
> +struct cqspi_driver_platdata {
> +     u32 hwcaps_mask;
> +     u32 quirks;
> +};
> +
>  /* Functions call declaration */
>  void cadence_qspi_apb_controller_init(struct cadence_spi_priv *priv);  void
> cadence_qspi_apb_controller_enable(void *reg_base_addr);
> --
> Changelog:
> 
> v2:
> Added commit message explaining where does the code refer from.
> https://lore.kernel.org/all/20241204063338.296959-1-niravkumar.
> l.rab...@intel.com/T/
> 
> 2.35.3

Reviewed-by: Tien Fong Chee <tien.fong.c...@altera.com>

Best regards,
Tien Fong

Reply via email to