Skip to content

Commit 8b0a93f

Browse files
committed
spi_nxp_lpspi: Support API timing parameters
Support the new timing parameters in the API. We don't really need to check if the cs_control is GPIO because the pin function already determines that behavior. Also, if both the DT and the API is unset, introduce a new default behavior which is to make the transfer delay 50% of the SCK period. This is what is most commonly expected by users and often gets reported as a bug because they don't configure this. Signed-off-by: Declan Snyder <declan.snyder@nxp.com>
1 parent 38c69dc commit 8b0a93f

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_common.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,20 @@ int spi_mcux_configure(const struct device *dev, const struct spi_config *spi_cf
108108
master_config.direction =
109109
(spi_cfg->operation & SPI_TRANSFER_LSB) ? kLPSPI_LsbFirst : kLPSPI_MsbFirst;
110110
master_config.baudRate = spi_cfg->frequency;
111-
master_config.pcsToSckDelayInNanoSec = config->pcs_sck_delay;
112-
master_config.lastSckToPcsDelayInNanoSec = config->sck_pcs_delay;
113-
master_config.betweenTransferDelayInNanoSec = config->transfer_delay;
111+
112+
/* TODO: deprecate the DT delay props */
113+
master_config.pcsToSckDelayInNanoSec = config->pcs_sck_delay ?
114+
config->pcs_sck_delay : spi_cfg->cs.pcs_to_sck_delay_ns;
115+
master_config.lastSckToPcsDelayInNanoSec = config->sck_pcs_delay ?
116+
config->sck_pcs_delay : spi_cfg->cs.sck_to_pcs_delay_ns;
117+
if (config->transfer_delay > 0) {
118+
master_config.betweenTransferDelayInNanoSec = config->transfer_delay;
119+
} else if (spi_cfg->dfs_delay_ns > 0) {
120+
master_config.betweenTransferDelayInNanoSec = spi_cfg->dfs_delay_ns;
121+
} else {
122+
master_config.betweenTransferDelayInNanoSec = (1000000000 / spi_cfg->frequency) / 2;
123+
}
124+
114125
master_config.whichPcs = spi_cfg->slave + kLPSPI_Pcs0;
115126
master_config.pcsActiveHighOrLow = (spi_cfg->operation & SPI_CS_ACTIVE_HIGH)
116127
? kLPSPI_PcsActiveHigh : kLPSPI_PcsActiveLow;

drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,10 @@ void lpspi_wait_tx_fifo_empty(const struct device *dev);
9999
.clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \
100100
.clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \
101101
.irq_config_func = spi_mcux_config_func_##n, \
102-
.pcs_sck_delay = UTIL_AND(DT_INST_NODE_HAS_PROP(n, pcs_sck_delay), \
103-
DT_INST_PROP(n, pcs_sck_delay)), \
104-
.sck_pcs_delay = UTIL_AND(DT_INST_NODE_HAS_PROP(n, sck_pcs_delay), \
105-
DT_INST_PROP(n, sck_pcs_delay)), \
106-
.transfer_delay = UTIL_AND(DT_INST_NODE_HAS_PROP(n, transfer_delay), \
107-
DT_INST_PROP(n, transfer_delay)), \
102+
/* TODO: deprecate the DT delay props */ \
103+
.pcs_sck_delay = DT_INST_PROP_OR(n, pcs_sck_delay, 0), \
104+
.sck_pcs_delay = DT_INST_PROP_OR(n, sck_pcs_delay, 0), \
105+
.transfer_delay = DT_INST_PROP_OR(n, transfer_delay, 0), \
108106
.pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \
109107
.data_pin_config = DT_INST_ENUM_IDX(n, data_pin_config), \
110108
.output_config = DT_INST_PROP(n, tristate_output), \

0 commit comments

Comments
 (0)