Skip to content

Commit 7ad1b6f

Browse files
committed
drivers: spi: dw: support enhanced SPI operation
Some Synopsys SPI controllers support the enhanced SPI operations and the SPI transfers need to configure the transfer type, instruction length and address length along with CTRLR0 FRF(frame format) update. Signed-off-by: Younghyun Park <[email protected]>
1 parent a0bd53d commit 7ad1b6f

File tree

3 files changed

+52
-0
lines changed

3 files changed

+52
-0
lines changed

drivers/spi/spi_dw.c

+37
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ LOG_MODULE_REGISTER(spi_dw);
4141
#include <zephyr/drivers/pinctrl.h>
4242
#endif
4343

44+
#define DW_HSSI_VER_102A (0x3130322a)
45+
4446
static inline bool spi_dw_is_slave(struct spi_dw_data *spi)
4547
{
4648
return (IS_ENABLED(CONFIG_SPI_SLAVE) &&
@@ -213,6 +215,7 @@ static int spi_dw_configure(const struct device *dev,
213215

214216
if ((config->operation & SPI_TRANSFER_LSB) ||
215217
(IS_ENABLED(CONFIG_SPI_EXTENDED_MODES) &&
218+
!IS_ENABLED(CONFIG_SPI_DW_HSSI) &&
216219
(config->operation & (SPI_LINES_DUAL |
217220
SPI_LINES_QUAD | SPI_LINES_OCTAL)))) {
218221
LOG_ERR("Unsupported configuration");
@@ -248,6 +251,23 @@ static int spi_dw_configure(const struct device *dev,
248251
ctrlr0 |= DW_SPI_CTRLR0_SRL;
249252
}
250253

254+
#if defined(CONFIG_SPI_DW_HSSI) && defined(CONFIG_SPI_EXTENDED_MODES)
255+
if (spi->version >= DW_HSSI_VER_102A) {
256+
/* SPI frame format for Tx/Rx data */
257+
switch (SPI_LINES_GET(config->operation)) {
258+
case SPI_LINES_DUAL:
259+
ctrlr0 |= DW_SPI_CTRLR0_SPI_DUAL;
260+
break;
261+
case SPI_LINES_QUAD:
262+
ctrlr0 |= DW_SPI_CTRLR0_SPI_QUAD;
263+
break;
264+
case SPI_LINES_OCTAL:
265+
ctrlr0 |= DW_SPI_CTRLR0_SPI_OCTAL;
266+
break;
267+
}
268+
}
269+
#endif
270+
251271
/* Installing the configuration */
252272
write_ctrlr0(dev, ctrlr0);
253273

@@ -410,6 +430,23 @@ static int transceive(const struct device *dev,
410430

411431
write_ctrlr0(dev, reg_data);
412432

433+
#if defined(CONFIG_SPI_DW_HSSI) && defined(CONFIG_SPI_EXTENDED_MODES)
434+
if (spi->version >= DW_HSSI_VER_102A) {
435+
/* Enhanced SPI operation */
436+
reg_data = read_spi_ctrlr0(dev);
437+
reg_data &= ~DW_SPI_ESPI_CTRLR0_TRANS_TYPE_MASK;
438+
reg_data |= FIELD_PREP(DW_SPI_ESPI_CTRLR0_TRANS_TYPE_MASK,
439+
SPI_TRANS_TYPE_FIELD_GET(config->operation));
440+
reg_data &= ~DW_SPI_ESPI_CTRLR0_ADDR_L_MASK;
441+
reg_data |= FIELD_PREP(DW_SPI_ESPI_CTRLR0_ADDR_L_MASK,
442+
SPI_ADDR_L_FIELD_GET(config->operation));
443+
reg_data &= ~DW_SPI_ESPI_CTRLR0_INST_L_MASK;
444+
reg_data |= FIELD_PREP(DW_SPI_ESPI_CTRLR0_INST_L_MASK,
445+
SPI_INST_L_FIELD_GET(config->operation));
446+
write_spi_ctrlr0(dev, reg_data);
447+
}
448+
#endif
449+
413450
/* Set buffers info */
414451
spi_context_buffers_setup(&spi->ctx, tx_bufs, rx_bufs, spi->dfs);
415452

drivers/spi/spi_dw.h

+12
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,18 @@ static int reg_test_bit(uint8_t bit, mm_reg_t addr, uint32_t off)
199199
#if defined(CONFIG_SPI_DW_HSSI) && defined(CONFIG_SPI_EXTENDED_MODES)
200200
/* TXFTLR setting. Only valid for Controller operation mode. */
201201
#define DW_SPI_TXFTLR_TXFTLR_SHIFT (16)
202+
203+
/* SPI Frame Format */
204+
#define DW_SPI_CTRLR0_SPI_FRF_SHIFT (22)
205+
#define DW_SPI_CTRLR0_SPI_STANDARD (0 << DW_SPI_CTRLR0_SPI_FRF_SHIFT)
206+
#define DW_SPI_CTRLR0_SPI_DUAL (1 << DW_SPI_CTRLR0_SPI_FRF_SHIFT)
207+
#define DW_SPI_CTRLR0_SPI_QUAD (2 << DW_SPI_CTRLR0_SPI_FRF_SHIFT)
208+
#define DW_SPI_CTRLR0_SPI_OCTAL (3 << DW_SPI_CTRLR0_SPI_FRF_SHIFT)
209+
210+
/* SPI_CTRLR0 settings */
211+
#define DW_SPI_ESPI_CTRLR0_INST_L_MASK GENMASK(9, 8)
212+
#define DW_SPI_ESPI_CTRLR0_ADDR_L_MASK GENMASK(5, 2)
213+
#define DW_SPI_ESPI_CTRLR0_TRANS_TYPE_MASK GENMASK(1, 0)
202214
#endif
203215

204216
#define DW_SPI_CTRLR0_SCPH BIT(DW_SPI_CTRLR0_SCPH_BIT)

drivers/spi/spi_dw_regs.h

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ extern "C" {
4040
#define DW_SPI_REG_SSI_COMP_VERSION (0x5c)
4141
#define DW_SPI_REG_DR (0x60)
4242
#define DW_SPI_REG_RX_SAMPLE_DLY (0xf0)
43+
#define DW_SPI_REG_SPI_CTRLR0 (0xf4)
4344

4445
/* Register helpers */
4546
DEFINE_MM_REG_WRITE(ctrlr0, DW_SPI_REG_CTRLR0, 32)
@@ -53,6 +54,8 @@ DEFINE_MM_REG_READ(dr, DW_SPI_REG_DR, 32)
5354
DEFINE_MM_REG_READ(ssi_comp_version, DW_SPI_REG_SSI_COMP_VERSION, 32)
5455
DEFINE_MM_REG_WRITE(rx_sample_dly, DW_SPI_REG_RX_SAMPLE_DLY, 32)
5556
DEFINE_MM_REG_READ(rx_sample_dly, DW_SPI_REG_RX_SAMPLE_DLY, 32)
57+
DEFINE_MM_REG_WRITE(spi_ctrlr0, DW_SPI_REG_SPI_CTRLR0, 32)
58+
DEFINE_MM_REG_READ(spi_ctrlr0, DW_SPI_REG_SPI_CTRLR0, 32)
5659

5760
#ifdef CONFIG_SPI_DW_ACCESS_WORD_ONLY
5861
DEFINE_MM_REG_WRITE(ctrlr1, DW_SPI_REG_CTRLR1, 32)

0 commit comments

Comments
 (0)