[PATCH v1 1/4] spi: dw: Add DDR (Dual Data-Rate) support for enhanced SPI mode

Changhuang Liang changhuang.liang at starfivetech.com
Fri Oct 23 02:42:56 PDT 2026


Hi, Miquel

Thanks for the review.

> On 22/10/2026 at 03:26:11 -07, Changhuang Liang
> <changhuang.liang at starfivetech.com> wrote:
> 
> > Add support for DDR (Dual Data-Rate) transfers in the enhanced SPI
> > mode of the DW SPI controller.
> >
> > The enhanced SPI control register (SPI_CTRLR0) has dedicated fields to
> > enable DDR mode for the instruction phase (INST_DDR_EN) and for the
> > address/dummy/data phases (SPI_DDR_EN). Populate these from the
> > corresponding dtr flags of the spi_mem_op.
> >
> > For DDR transfers, the dummy phase consumes two bits per clock per
> > line, so the computed wait cycles must be halved. Factor the wait
> > cycle calculation into a helper, dw_spi_enh_wait_cycles(), so that
> > both the supports check and the exec path use the same value.
> >
> > When SPI DDR is enabled, program the DDR_DRIVE_EDGE register. The
> > recommended TDE value is clk_div / 4, clamped to clk_div / 2 - 1 and
> > to the field width.
> >
> > Finally, advertise DTR support to the SPI memory layer through a
> > dedicated dw_spi_enh_mem_caps, selected when the controller has
> > DW_SPI_CAP_EMODE, so that spi-mem may issue DDR operations.
> >
> > Signed-off-by: Changhuang Liang <changhuang.liang at starfivetech.com>
> > ---
> >  drivers/spi/spi-dw-core.c | 52
> +++++++++++++++++++++++++++++++++------
> >  drivers/spi/spi-dw.h      |  6 +++++
> >  2 files changed, 51 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
> > index 47434fa78e4b..6ff142c8a6bd 100644
> > --- a/drivers/spi/spi-dw-core.c
> > +++ b/drivers/spi/spi-dw-core.c
> > @@ -46,6 +46,8 @@ struct dw_spi_enh_cfg {
> >  	u8 inst_l;
> >  	u8 addr_l;
> >  	u8 trans_t;
> > +	bool inst_ddr;
> > +	bool spi_ddr;
> 
> If I understand this correctly, spi_ddr is quite a bad name because it means
> address and dummy and data ddr (but not instr). Can you try to come up with
> a better name for this variable?

spi_ddr is named exactly that way on the register field. Perhaps I won't change 
this variable name, and just add some comments to this variable—what do you think?

> Also, if my above understanding is correct, you must provide a
> supports_op() callback which would refuse any xS-xS-xD but allow xD-xD-xD
> and xS-xD-D modes.

OK, I'll add some filter conditions.

Best Regards,
Changhuang



More information about the linux-mtd mailing list