spi: nxp_s32: use clock control APIs

Use clock control API to retrieve the module's frequency and
update the boards using it to provide the source clocks.

Signed-off-by: Manuel Argüelles <manuel.arguelles@nxp.com>
This commit is contained in:
Manuel Argüelles 2023-09-15 18:54:28 +07:00 committed by Carles Cufí
commit cdcba384bc
5 changed files with 49 additions and 56 deletions

View file

@ -4,6 +4,7 @@
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/clock_control.h>
#include <zephyr/drivers/pinctrl.h>
#include "spi_nxp_s32.h"
@ -273,12 +274,20 @@ static int spi_nxp_s32_configure(const struct device *dev,
uint8_t frame_size;
struct spi_nxp_s32_baudrate_param best_baud = {0};
uint32_t clock_rate;
int err;
if (spi_context_configured(&data->ctx, spi_cfg)) {
/* This configuration is already in use */
return 0;
}
err = clock_control_get_rate(config->clock_dev, config->clock_subsys, &clock_rate);
if (err) {
LOG_ERR("Failed to get clock frequency");
return err;
}
clk_phase = !!(SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPHA);
clk_polarity = !!(SPI_MODE_GET(spi_cfg->operation) & SPI_MODE_CPOL);
@ -340,7 +349,7 @@ static int spi_nxp_s32_configure(const struct device *dev,
return -ENOTSUP;
}
spi_nxp_s32_getbestfreq(config->clock_frequency, spi_cfg->frequency, &best_baud);
spi_nxp_s32_getbestfreq(clock_rate, spi_cfg->frequency, &best_baud);
data->transfer_cfg.Ctar &= ~(SPI_CTAR_BR_MASK | SPI_CTAR_PBR_MASK);
data->transfer_cfg.Ctar |= SPI_CTAR_BR(best_baud.scaler) |
@ -486,12 +495,29 @@ static int spi_nxp_s32_init(const struct device *dev)
{
const struct spi_nxp_s32_config *config = dev->config;
struct spi_nxp_s32_data *data = dev->data;
uint32_t clock_rate;
uint8_t scaler, prescaler;
uint32_t ctar = 0;
int ret = 0;
if (!device_is_ready(config->clock_dev)) {
LOG_ERR("Clock control device not ready");
return -ENODEV;
}
ret = clock_control_on(config->clock_dev, config->clock_subsys);
if (ret) {
LOG_ERR("Failed to enable clock");
return ret;
}
ret = clock_control_get_rate(config->clock_dev, config->clock_subsys, &clock_rate);
if (ret) {
LOG_ERR("Failed to get clock frequency");
return ret;
}
ret = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT);
if (ret < 0) {
return ret;
@ -513,18 +539,15 @@ static int spi_nxp_s32_init(const struct device *dev)
* Update the delay timings configuration that are
* applied for all inner CS signals of SPI module.
*/
spi_nxp_s32_getbestdelay(config->clock_frequency,
config->sck_cs_delay, &scaler, &prescaler);
spi_nxp_s32_getbestdelay(clock_rate, config->sck_cs_delay, &scaler, &prescaler);
ctar |= SPI_CTAR_ASC(scaler) | SPI_CTAR_PASC(prescaler);
spi_nxp_s32_getbestdelay(config->clock_frequency,
config->cs_sck_delay, &scaler, &prescaler);
spi_nxp_s32_getbestdelay(clock_rate, config->cs_sck_delay, &scaler, &prescaler);
ctar |= SPI_CTAR_CSSCK(scaler) | SPI_CTAR_PCSSCK(prescaler);
spi_nxp_s32_getbestdelay(config->clock_frequency,
config->cs_cs_delay, &scaler, &prescaler);
spi_nxp_s32_getbestdelay(clock_rate, config->cs_cs_delay, &scaler, &prescaler);
ctar |= SPI_CTAR_DT(scaler) | SPI_CTAR_PDT(prescaler);
@ -654,7 +677,9 @@ static const struct spi_driver_api spi_nxp_s32_driver_api = {
static const struct spi_nxp_s32_config spi_nxp_s32_config_##n = { \
.instance = n, \
.num_cs = SPI_NXP_S32_NUM_CS(n), \
.clock_frequency = DT_PROP(SPI_NXP_S32_NODE(n), clock_frequency), \
.clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(SPI_NXP_S32_NODE(n))), \
.clock_subsys = (clock_control_subsys_t) \
DT_CLOCKS_CELL(SPI_NXP_S32_NODE(n), name), \
.sck_cs_delay = DT_PROP_OR(SPI_NXP_S32_NODE(n), spi_sck_cs_delay, 0U), \
.cs_sck_delay = DT_PROP_OR(SPI_NXP_S32_NODE(n), spi_cs_sck_delay, 0U), \
.cs_cs_delay = DT_PROP_OR(SPI_NXP_S32_NODE(n), spi_cs_cs_delay, 0U), \

View file

@ -1,5 +1,5 @@
/*
* Copyright 2022 NXP
* Copyright 2022-2023 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
@ -49,7 +49,8 @@ struct spi_nxp_s32_data {
struct spi_nxp_s32_config {
uint8_t instance;
uint8_t num_cs;
uint32_t clock_frequency;
const struct device *clock_dev;
clock_control_subsys_t clock_subsys;
uint32_t sck_cs_delay;
uint32_t cs_sck_delay;
uint32_t cs_cs_delay;