From 4818585006d3ab231d842dbda1eb614a4639cadc Mon Sep 17 00:00:00 2001 From: Chaitanya Tata Date: Tue, 25 Mar 2025 00:40:14 +0530 Subject: [PATCH] modules: nrf_wifi: spi: Implement frequency switching In order to support higher frequencies than 8MHz, we need to implement frequency switching while waking up the RPU, as it has to be done only at 8MHz, once RPU is awake, we can switch back to the configured (DTS) frequency. Signed-off-by: Chaitanya Tata --- modules/nrf_wifi/bus/spi_if.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/modules/nrf_wifi/bus/spi_if.c b/modules/nrf_wifi/bus/spi_if.c index fba9f1f00bf..7ef1694da58 100644 --- a/modules/nrf_wifi/bus/spi_if.c +++ b/modules/nrf_wifi/bus/spi_if.c @@ -26,6 +26,9 @@ static struct qspi_config *spim_config; static const struct spi_dt_spec spi_spec = SPI_DT_SPEC_GET(NRF7002_NODE, SPI_WORD_SET(8) | SPI_TRANSFER_MSB, 0); +static struct spi_dt_spec spi_spec_8mhz = +SPI_DT_SPEC_GET(NRF7002_NODE, SPI_WORD_SET(8) | SPI_TRANSFER_MSB, 0); + static int spim_xfer_tx(unsigned int addr, void *data, unsigned int len) { int err; @@ -116,7 +119,7 @@ int spim_read_reg(uint32_t reg_addr, uint8_t *reg_value) return err; } -int spim_write_reg(uint32_t reg_addr, const uint8_t reg_value) +int spim_write_reg(const struct spi_dt_spec *spi_spec, uint32_t reg_addr, const uint8_t reg_value) { int err; uint8_t tx_buffer[] = { reg_addr, reg_value }; @@ -124,7 +127,7 @@ int spim_write_reg(uint32_t reg_addr, const uint8_t reg_value) const struct spi_buf tx_buf = { .buf = tx_buffer, .len = sizeof(tx_buffer) }; const struct spi_buf_set tx = { .buffers = &tx_buf, .count = 1 }; - err = spi_transceive_dt(&spi_spec, &tx, NULL); + err = spi_transceive_dt(spi_spec, &tx, NULL); if (err) { LOG_ERR("SPI error: %d", err); @@ -150,7 +153,7 @@ int spim_RDSR2(const struct device *dev, uint8_t *rdsr1) int spim_WRSR2(const struct device *dev, const uint8_t wrsr2) { - return spim_write_reg(0x3F, wrsr2); + return spim_write_reg(&spi_spec, 0x3F, wrsr2); } int _spim_wait_while_rpu_awake(void) @@ -208,7 +211,13 @@ int spim_wait_while_rpu_wake_write(void) int spim_cmd_rpu_wakeup(uint32_t data) { - return spim_write_reg(0x3F, data); + struct spi_dt_spec *spi_spec_tmp = (struct spi_dt_spec *)&spi_spec; + + if (spi_spec.config.frequency > MHZ(8)) { + spi_spec_tmp = &spi_spec_8mhz; + } + /* Waking RPU works reliably only with lowest frequency (8MHz) */ + return spim_write_reg(spi_spec_tmp, 0x3F, data); } unsigned int spim_cmd_sleep_rpu(void) @@ -243,6 +252,8 @@ int spim_init(struct qspi_config *config) spim_config->qspi_slave_latency = 1; } + spi_spec_8mhz.config.frequency = MHZ(8); + LOG_INF("SPIM %s: freq = %d MHz", spi_spec.bus->name, spi_spec.config.frequency / MHZ(1)); LOG_INF("SPIM %s: latency = %d", spi_spec.bus->name, spim_config->qspi_slave_latency);