RE: [PATCH v2 2/2] spi: dw: Add support for Intel Thunder Bay SPI

From: Srikandan, Nandhini
Date: Thu Sep 09 2021 - 05:51:23 EST




> -----Original Message-----
> From: Serge Semin <fancer.lancer@xxxxxxxxx>
> Sent: Wednesday, September 8, 2021 2:59 PM
> To: Srikandan, Nandhini <nandhini.srikandan@xxxxxxxxx>
> Cc: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>; broonie@xxxxxxxxxx;
> robh+dt@xxxxxxxxxx; linux-spi@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx;
> mgross@xxxxxxxxxxxxxxx; Pan, Kris <kris.pan@xxxxxxxxx>; Demakkanavar,
> Kenchappa <kenchappa.demakkanavar@xxxxxxxxx>; Zhou, Furong
> <furong.zhou@xxxxxxxxx>; Sangannavar, Mallikarjunappa
> <mallikarjunappa.sangannavar@xxxxxxxxx>; Vaidya, Mahesh R
> <mahesh.r.vaidya@xxxxxxxxx>; A, Rashmi <rashmi.a@xxxxxxxxx>
> Subject: Re: [PATCH v2 2/2] spi: dw: Add support for Intel Thunder Bay SPI
>
> On Tue, Sep 07, 2021 at 10:54:10AM +0000, Srikandan, Nandhini wrote:
> >
> >
> > > -----Original Message-----
> > > From: Serge Semin <fancer.lancer@xxxxxxxxx>
> > > Sent: Sunday, September 5, 2021 8:04 PM
> > > To: Srikandan, Nandhini <nandhini.srikandan@xxxxxxxxx>
> > > Cc: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>;
> > > broonie@xxxxxxxxxx;
> > > robh+dt@xxxxxxxxxx; linux-spi@xxxxxxxxxxxxxxx; linux-
> > > kernel@xxxxxxxxxxxxxxx; devicetree@xxxxxxxxxxxxxxx;
> > > mgross@xxxxxxxxxxxxxxx; Pan, Kris <kris.pan@xxxxxxxxx>;
> > > Demakkanavar, Kenchappa <kenchappa.demakkanavar@xxxxxxxxx>;
> Zhou,
> > > Furong <furong.zhou@xxxxxxxxx>; Sangannavar, Mallikarjunappa
> > > <mallikarjunappa.sangannavar@xxxxxxxxx>; Vaidya, Mahesh R
> > > <mahesh.r.vaidya@xxxxxxxxx>; A, Rashmi <rashmi.a@xxxxxxxxx>
> > > Subject: Re: [PATCH v2 2/2] spi: dw: Add support for Intel Thunder
> > > Bay SPI
> > >
> > > Hi Nandhini
> > >
> > > On Tue, Aug 24, 2021 at 04:58:56PM +0800,
> > > nandhini.srikandan@xxxxxxxxx
> > > wrote:
> > > > From: Nandhini Srikandan <nandhini.srikandan@xxxxxxxxx>
> > > >
> > > > Add support for Intel Thunder Bay SPI controller, which uses
> > > > DesignWare DWC_ssi core.
> > > > Bit 31 of CTRLR0 register is set for Thunder Bay, to configure the
> > > > device as a master or as a slave serial peripheral.
> > > > Bit 14(SSTE) of CTRLR0 register should be set(1) for Thunder Bay.
> > >
> > > After reading your response to my v1 comments, I've got a better
> > > notion of the features you are trying to implement here. Please see
> > > my comments below.
> > >
> > > >
> > > > Signed-off-by: Nandhini Srikandan <nandhini.srikandan@xxxxxxxxx>
> > > > ---
> > >
> > > Just to note for your future patchwork. Instead of having a single
> > > general changelog text in the cover letter it is much more
> > > convenient for reviewers to see both the summary changelog and a
> > > changelog of individual patches here under '---' delimiter.
> > Sure, I will add changelog for individual patches also.
> >
> > >
> > > > drivers/spi/spi-dw-core.c | 7 +++++-- drivers/spi/spi-dw-mmio.c
> > > > |
> > > > 20 +++++++++++++++++++-
> > > > drivers/spi/spi-dw.h | 12 +++++++++---
> > > > 3 files changed, 33 insertions(+), 6 deletions(-)
> > > >
> > > > diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
> > > > index a305074c482e..f7d45318db8a 100644
> > > > --- a/drivers/spi/spi-dw-core.c
> > > > +++ b/drivers/spi/spi-dw-core.c
> > > > @@ -300,8 +300,11 @@ static u32 dw_spi_prepare_cr0(struct dw_spi
> > > *dws, struct spi_device *spi)
> > > > /* CTRLR0[13] Shift Register Loop */
> > > > cr0 |= ((spi->mode & SPI_LOOP) ? 1 : 0) <<
> > > > DWC_SSI_CTRLR0_SRL_OFFSET;
> > > >
> > > > - if (dws->caps & DW_SPI_CAP_KEEMBAY_MST)
> > > > - cr0 |= DWC_SSI_CTRLR0_KEEMBAY_MST;
> > >
> > > > + if (dws->caps & DW_SPI_CAP_DWC_MST)
> > > > + cr0 |= DWC_SSI_CTRLR0_MST;
> > >
> > > Since you've used a generic suffix here, are you sure the MST/SLV
> > > feature toggled by the BIT(31) bit is generic for all DWC SSI controllers?
> > > I am asking because I don't have DWC SSI IP manual, but there is a
> > > CTRL0 register layout posted by your colleague Wan Ahmad Zainie a
> > > year
> > > ago: https://patches.linaro.org/patch/214693/ . It doesn't have that
> > > bit defined.
> > >
> > > If you are and it's specific to all DWC SSI controllers of v1.01a
> > > and newer, then why not to implement that flag setting up in the
> > > framework of the "DW_SPI_CAP_DWC_SSI" capability? Thus we'd have all
> > > "snps,dwc-ssi- 1.01a"-compatible devices and devices with the
> > > DW_SPI_CAP_DWC_SSI flag set working well if for some reason they
> > > have got slave-mode enabled by default.
> >
>
> > Intel Keem Bay and Thunder Bay uses v1.02a version of DWC SSI controller.
> According to v1.02a, BIT31 of CTRLR0 is used for selecting Master or slave
> mode. In earlier versions, it was reserved. Both Keem Bay and Thunder Bay
> has to work in master mode, so this bit is set. The dwc_ssi controller can
> either function in master or slave (default) mode as per the spec. The bit31
> requirement is only for Keem Bay and Thunder bay and other controllers can
> have a requirement to function in slave mode as well. Hence the bit is set
> only for Keem Bay/Thunder Bay. Please let me know if it should be set
> default to master mode.
> > Wan Ahmed Zainie has posted that patch based on earlier version of the
> controller and later up streamed the DW_SPI_CAP_KEEMBAY_MST capability
> flag. This will become generic now.
>
> I see. Thanks for clarification. IIUC BIT(31) is indeed specific to all DWC SSI
> (not only Keem/Thunder Bay SPI IPs) and indeed determines the
> Master/Slave mode of the controller. Then I don't really understand why
> Wan Ahmed didn't make it set generically in CR0 for all DWC SSI v1.01a
> instead of marking it as "intel,keembay-ssi"-specific seeing he provided a
> generic "snps,dwc-ssi-1.01a" compatible code in that same patchset.
>
> That decision might have been caused by having different default states of
> CTRLR0.31 bit in generic DWC SSI and Keem/Thunder Bay SSI...
> Anyway I believe it won't hurt to set that bit for each DWC SSI especially
> seeing the DW APB SSI driver doesn't support the SPI slave mode at the
> moment. So please do that in a dedicated patch by converting the
> DWC_SSI_CTRLR0_KEEMBAY_MST macro to a generic DWC_SSI_CTRLR0_MST
> and applying it for CTRLR0.31 for each DW_SPI_CAP_DWC_SSI controller.
>
Sure, I will make the macro to a generic one and include it in the upcoming patchset.

> > >
> > > > +
> > > > + if (dws->caps & DW_SPI_CAP_DWC_SSTE)
> > > > + cr0 |= DWC_SSI_CTRLR0_SSTE;
> > >
> > > Regarding SSTE flag and feature implemented behind it. First of all
> > > AFAICS from the Wan Ahmad Zainie post sited above it is indeed
> > > generic for both DWC SSI and DW APB SSI IP-cores of the controllers.
> > > Thus we don't need an additional DWC SSI capability flag defined for
> > > it, but need to have it generically implemented in the DW SPI core driver.
> > > Secondly as you said it two weeks ago it defines a slave-specific
> > > protocol, the way the SSI and CLK signals are driven between
> > > consecutive
> > > frames:
> > > >> SSTE (Slave Select Toggle Enable) When SSTE bit is set to 1, the
> > > >> slave select line will toggle between consecutive data frames,
> > > >> with the serial clock being held to its default value while
> > > >> slave select line is high.
> > > >> When SSTE bit is set to 0, slave select line will stay low and
> > > >> clock will run continuously for the duration of the transfer.
> > > In general DWC SSI/DW APB SSI controller can be connected to slave
> > > devices with SSTE and normal communication protocol requirements at
> > > the same time by using different CS-lanes. Therefore the SSTE
> > > feature turns to be Slave/Peripheral-device specific rather than
> > > controller-specific and needs to be enabled/disabled when it's required
> by a slave device.
> > >
> > > Thus here is what I'd suggest to implement the SSTE feature generically:
> > > 1) Add a new SPI-slave Synopsys-specific DT-property into the
> > > bindings file like this:
> > > --- a/Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.yaml
> > > +++ b/Documentation/devicetree/bindings/spi/snps,dw-apb-ssi.yaml
> > > @@ -143,6 +143,12 @@ patternProperties:
> > > is an optional feature of the designware controller, and the
> > > upper limit is also subject to controller configuration.
> > >
> > > + snps,sste:
> > > + description: Slave select line will toggle between consecutive
> > > + data frames, with the serial clock being held to its default
> > > + value while slave select line is high.
> > > + type: boolean
> > > +
> > > unevaluatedProperties: false
> > >
> > > required:
> > >
> > > Please do that in a separate preparation patch submitted before the
> > > "dt-bindings: spi: Add bindings for Intel Thunder Bay SoC" patch in
> > > this series.
> > Sure, will modify SSTE as DT-property and do the necessary changes in both
> code and in DT.
> > >
> > > 2) Add that property support into the driver like this:
> > > diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
> > > index
> > > a305074c482e..5caa74b9aa74 100644
> > > --- a/drivers/spi/spi-dw-core.c
> > > +++ b/drivers/spi/spi-dw-core.c
> > > @@ -27,6 +27,7 @@
> > > struct chip_data {
> > > u32 cr0;
> > > u32 rx_sample_dly; /* RX sample delay */
> > > + bool sste; /* Slave Select Toggle flag */
> > > };
> > >
> > > #ifdef CONFIG_DEBUG_FS
> > > @@ -269,6 +270,7 @@ static irqreturn_t dw_spi_irq(int irq, void
> > > *dev_id)
> > >
> > > static u32 dw_spi_prepare_cr0(struct dw_spi *dws, struct spi_device
> > > *spi) {
> > > + struct chip_data *chip = spi_get_ctldata(spi);
> > > u32 cr0 = 0;
> > >
> > > if (!(dws->caps & DW_SPI_CAP_DWC_SSI)) { @@ -285,6 +287,9 @@
> > > static u32 dw_spi_prepare_cr0(struct dw_spi *dws, struct spi_device
> > > *spi)
> > >
> > > /* CTRLR0[11] Shift Register Loop */
> > > cr0 |= ((spi->mode & SPI_LOOP) ? 1 : 0) << SPI_SRL_OFFSET;
> > > +
> > > + /* CTRLR0[24] Slave Select Toggle Enable */
> > > + cr0 |= chip->sste << SPI_SSTE_OFFSET;
> > > } else {
> > > /* CTRLR0[ 7: 6] Frame Format */
> > > cr0 |= SSI_MOTO_SPI << DWC_SSI_CTRLR0_FRF_OFFSET; @@
> > > -300,6 +305,9 @@ static u32 dw_spi_prepare_cr0(struct dw_spi *dws,
> > > struct spi_device *spi)
> > > /* CTRLR0[13] Shift Register Loop */
> > > cr0 |= ((spi->mode & SPI_LOOP) ? 1 : 0) <<
> > > DWC_SSI_CTRLR0_SRL_OFFSET;
> > >
> > > + /* CTRLR0[14] Slave Select Toggle Enable */
> > > + cr0 |= chip->sste << DWC_SSI_CTRLR0_SSTE_OFFSET;
> > > +
> > > if (dws->caps & DW_SPI_CAP_KEEMBAY_MST)
> > > cr0 |= DWC_SSI_CTRLR0_KEEMBAY_MST;
> > > }
> > > @@ -789,6 +797,9 @@ static int dw_spi_setup(struct spi_device *spi)
> > > chip->rx_sample_dly =
> > > DIV_ROUND_CLOSEST(rx_sample_dly_ns,
> > > NSEC_PER_SEC /
> > > dws->max_freq);
> > > +
> > > + /* Get slave select toggling feature requirement */
> > > + chip->sste = device_property_read_bool(&spi->dev,
> > > "snps,sste");
> > > }
> > >
> > > /*
> > > diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index
> > > b665e040862c..2ee3f839de39 100644
> > > --- a/drivers/spi/spi-dw.h
> > > +++ b/drivers/spi/spi-dw.h
> > > @@ -65,8 +65,10 @@
> > > #define SPI_SLVOE_OFFSET 10
> > > #define SPI_SRL_OFFSET 11
> > > #define SPI_CFS_OFFSET 12
> > > +#define SPI_SSTE_OFFSET 24
> > >
> > > /* Bit fields in CTRLR0 based on DWC_ssi_databook.pdf v1.01a */
> > > +#define DWC_SSI_CTRLR0_SSTE_OFFSET 14
> > > #define DWC_SSI_CTRLR0_SRL_OFFSET 13
> > > #define DWC_SSI_CTRLR0_TMOD_OFFSET 10
> > > #define DWC_SSI_CTRLR0_TMOD_MASK GENMASK(11, 10)
> > >
> > > Please also do that in a separate preparation patch.
> > >
> > > 3) If MST BIT(31) feature is generic, then please discard the
> > > DW_SPI_CAP_KEEMBAY_MST capability flag and set the MST bit for each
> > > DWC SSI device with DW_SPI_CAP_DWC_SSI capability set. If it's
> > > Intel- specific, then convert the DW_SPI_CAP_KEEMBAY_MST capability
> > > macro name to DW_SPI_CAP_INTEL_MST.
> > >
> > > Please also do that in a separate preparation patch.
>
> > The feature is for the controller version v1.02a and above. The controller
> can function on master or slave mode, default being slave mode. So, it is
> modified to master only in Keem bay and Thunder bay.
> > The difference between v1.01a and v1.02a w.r.t CTRLR0 is BIT31 selection
> of master/slave mode. Though the feature is generic but BIT31 is needed to
> be set only for bay, I will rename the macros to a generic name.
>
> Please, see my comment above. Let's set that bit for each DWC SSI controller,
> so to have the driver protected from having the inverted default state on any
> other vendor-specific controller.
>
Sure, I will set the bit for each DWC SSI controller.

Regard,
Nandhini
> >
> > >
> > > 4) After all of that you can add the "Thunder Bay SPI" controller
> > > support into the DW SPI MMIO driver by placing the
> > > "intel,thunderbay-ssi" compatibility string into the OF-device table.
> > > Since both Thunder and Keembay SPIs are based on the same IP-core
> > > then you can just reuse the dw_spi_keembay_init() for both of them
> > > after renaming it to something like dw_spi_intel_init().
> > >
>
> > Sure, will do the same.
>
> Thanks.
>
> Regards,
> -Sergey
>
> >
> > Regards,
> > Nandhini
> > >
> > > > }
> > > >
> > > > return cr0;
> > > > diff --git a/drivers/spi/spi-dw-mmio.c b/drivers/spi/spi-dw-mmio.c
> > > > index 3379720cfcb8..2bd1dedd90b0 100644
> > > > --- a/drivers/spi/spi-dw-mmio.c
> > > > +++ b/drivers/spi/spi-dw-mmio.c
> > > > @@ -217,7 +217,24 @@ static int dw_spi_dwc_ssi_init(struct
> > > > platform_device *pdev, static int dw_spi_keembay_init(struct
> > > platform_device *pdev,
> > > > struct dw_spi_mmio *dwsmmio) {
> > > > - dwsmmio->dws.caps = DW_SPI_CAP_KEEMBAY_MST |
> > > DW_SPI_CAP_DWC_SSI;
> > > > + /*
> > > > + * Set MST to make keem bay SPI as master.
> > > > + */
> > > > + dwsmmio->dws.caps = DW_SPI_CAP_DWC_MST |
> > > DW_SPI_CAP_DWC_SSI;
> > > > +
> > > > + return 0;
> > > > +}
> > > > +
> > > > +static int dw_spi_thunderbay_init(struct platform_device *pdev,
> > > > + struct dw_spi_mmio *dwsmmio) {
> > > > + /*
> > > > + * Set MST to make thunder bay SPI as master.
> > > > + * Set SSTE to enable slave select toggle bit which is required
> > > > + * for the slave devices connected to the thunder bay SPI controller.
> > > > + */
> > > > + dwsmmio->dws.caps = DW_SPI_CAP_DWC_MST |
> > > DW_SPI_CAP_DWC_SSTE |
> > > > + DW_SPI_CAP_DWC_SSI;
> > > >
> > > > return 0;
> > > > }
> > > > @@ -349,6 +366,7 @@ static const struct of_device_id
> > > dw_spi_mmio_of_match[] = {
> > > > { .compatible = "renesas,rzn1-spi", .data = dw_spi_dw_apb_init},
> > > > { .compatible = "snps,dwc-ssi-1.01a", .data = dw_spi_dwc_ssi_init},
> > > > { .compatible = "intel,keembay-ssi", .data =
> > > > dw_spi_keembay_init},
> > > > + { .compatible = "intel,thunderbay-ssi", .data =
> > > > +dw_spi_thunderbay_init},
> > > > { .compatible = "microchip,sparx5-spi", dw_spi_mscc_sparx5_init},
> > > > { .compatible = "canaan,k210-spi", dw_spi_canaan_k210_init},
> > > > { /* end of table */}
> > > > diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index
> > > > b665e040862c..9fffe0a02f3a 100644
> > > > --- a/drivers/spi/spi-dw.h
> > > > +++ b/drivers/spi/spi-dw.h
> > > > @@ -76,11 +76,16 @@
> > > > #define DWC_SSI_CTRLR0_DFS_OFFSET 0
> > > >
> > > > /*
> > > > - * For Keem Bay, CTRLR0[31] is used to select controller mode.
> > > > + * CTRLR0[31] is used to select controller mode.
> > > > * 0: SSI is slave
> > > > * 1: SSI is master
> > > > */
> > > > -#define DWC_SSI_CTRLR0_KEEMBAY_MST BIT(31)
> > > > +#define DWC_SSI_CTRLR0_MST BIT(31)
> > > > +
> > > > +/*
> > > > + * CTRLR0[14] is used to enable/disable Slave Select Toggle bit */
> > > > +#define DWC_SSI_CTRLR0_SSTE BIT(14)
> > > >
> > > > /* Bit fields in CTRLR1 */
> > > > #define SPI_NDF_MASK GENMASK(15, 0)
> > > > @@ -122,9 +127,10 @@ enum dw_ssi_type {
> > > >
> > > > /* DW SPI capabilities */
> > > > #define DW_SPI_CAP_CS_OVERRIDE BIT(0)
> > > > -#define DW_SPI_CAP_KEEMBAY_MST BIT(1)
> > > > +#define DW_SPI_CAP_DWC_MST BIT(1)
> > > > #define DW_SPI_CAP_DWC_SSI BIT(2)
> > > > #define DW_SPI_CAP_DFS32 BIT(3)
> > > > +#define DW_SPI_CAP_DWC_SSTE BIT(4)
> > > >
> > > > /* Slave spi_transfer/spi_mem_op related */ struct dw_spi_cfg {
> > > > --
> > > > 2.17.1
> > > >