diff --git a/drivers/adc/adc_mcux_lpadc.c b/drivers/adc/adc_mcux_lpadc.c index 7804bdec94bd9..cea44408a6b0c 100644 --- a/drivers/adc/adc_mcux_lpadc.c +++ b/drivers/adc/adc_mcux_lpadc.c @@ -562,6 +562,7 @@ static DEVICE_API(adc, mcux_lpadc_driver_api) = { static void mcux_lpadc_config_func_##n(const struct device *dev); \ \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static const struct mcux_lpadc_config mcux_lpadc_config_##n = { \ .base = (ADC_Type *)DT_INST_REG_ADDR(n), \ .voltage_ref = DT_INST_PROP(n, voltage_ref), \ @@ -575,7 +576,7 @@ static DEVICE_API(adc, mcux_lpadc_driver_api) = { (DEVICE_DT_GET(DT_PHANDLE(DT_DRV_INST(n),\ nxp_references))), (NULL)),\ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks),\ .ref_supply_val = COND_CODE_1(\ DT_INST_NODE_HAS_PROP(n, nxp_references),\ (DT_PHA(DT_DRV_INST(n), nxp_references, vref_mv)), \ diff --git a/drivers/audio/dmic_mcux.c b/drivers/audio/dmic_mcux.c index 751ecaba04a69..9985ecae284ae 100644 --- a/drivers/audio/dmic_mcux.c +++ b/drivers/audio/dmic_mcux.c @@ -709,11 +709,11 @@ static const struct _dmic_ops dmic_ops = { }; \ \ PINCTRL_DT_INST_DEFINE(idx); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(idx, clocks); \ static struct mcux_dmic_cfg mcux_dmic_cfg##idx = { \ .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(idx), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(idx)), \ - .clock_name = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(idx, name), \ + .clock_name = CLOCK_CONTROL_DT_SPEC_INST_GET(idx, clocks), \ .use2fs = DT_INST_PROP(idx, use2fs), \ }; \ \ diff --git a/drivers/can/can_mcux_flexcan.c b/drivers/can/can_mcux_flexcan.c index e3a8caac98916..f145a937a6f59 100644 --- a/drivers/can/can_mcux_flexcan.c +++ b/drivers/can/can_mcux_flexcan.c @@ -1425,6 +1425,8 @@ static DEVICE_API(can, mcux_flexcan_fd_driver_api) = { #define FLEXCAN_DEVICE_INIT_MCUX(id) \ PINCTRL_DT_INST_DEFINE(id); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ + \ static void mcux_flexcan_irq_config_##id(const struct device *dev); \ static void mcux_flexcan_irq_enable_##id(void); \ static void mcux_flexcan_irq_disable_##id(void); \ @@ -1433,8 +1435,7 @@ static DEVICE_API(can, mcux_flexcan_fd_driver_api) = { DEVICE_MMIO_NAMED_ROM_INIT(flexcan_mmio, DT_DRV_INST(id)), \ .common = CAN_DT_DRIVER_CONFIG_INST_GET(id, 0, FLEXCAN_MAX_BITRATE(id)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(id, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks), \ .clk_source = DT_INST_PROP(id, clk_source), \ IF_ENABLED(CONFIG_CAN_MCUX_FLEXCAN_FD, ( \ .flexcan_fd = DT_INST_NODE_HAS_COMPAT(id, FLEXCAN_FD_DRV_COMPAT), \ diff --git a/drivers/can/can_mcux_mcan.c b/drivers/can/can_mcux_mcan.c index a5bfe0d724608..85bac77e3a497 100644 --- a/drivers/can/can_mcux_mcan.c +++ b/drivers/can/can_mcux_mcan.c @@ -195,6 +195,7 @@ static const struct can_mcan_ops mcux_mcan_ops = { #define MCUX_MCAN_INIT(n) \ CAN_MCAN_DT_INST_BUILD_ASSERT_MRAM_CFG(n); \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static void mcux_mcan_irq_config_##n(const struct device *dev); \ \ @@ -206,7 +207,7 @@ static const struct can_mcan_ops mcux_mcan_ops = { .mram = (mem_addr_t)POINTER_TO_UINT(&mcux_mcan_mram_##n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = mcux_mcan_irq_config_##n, \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .reset = RESET_DT_SPEC_INST_GET(n), \ diff --git a/drivers/clock_control/clock_control_mcux_sim.c b/drivers/clock_control/clock_control_mcux_sim.c index 5b354b99a83fa..cbd3792325761 100644 --- a/drivers/clock_control/clock_control_mcux_sim.c +++ b/drivers/clock_control/clock_control_mcux_sim.c @@ -15,6 +15,42 @@ #include LOG_MODULE_REGISTER(clock_control); +struct kinetis_sim_spec { + uint32_t name; + uint32_t offset; + uint32_t bits; +}; + +static int kinetis_sim_get_spec(clock_control_subsys_t subsys, struct kinetis_sim_spec *spec) +{ + struct clock_control_dt_spec *dt_spec = subsys; + + if (dt_spec->len != 3) { + return -EINVAL; + } + + spec->name = dt_spec->cells[0]; + spec->offset = dt_spec->cells[1]; + spec->bits = dt_spec->cells[2]; + + return 0; +} + +static int kinetis_sim_get_key(clock_control_subsys_t subsys, uint32_t *key) +{ + struct kinetis_sim_spec spec; + int ret; + + ret = kinetis_sim_get_spec(subsys, &spec); + if (ret) { + return ret; + } + + *key = CLK_GATE_DEFINE(spec.offset, spec.bits); + + return 0; +} + static int mcux_sim_on(const struct device *dev, clock_control_subsys_t sub_system) { diff --git a/drivers/clock_control/clock_control_mcux_syscon.c b/drivers/clock_control/clock_control_mcux_syscon.c index 4887b189937ae..c4bb1c46cfe65 100644 --- a/drivers/clock_control/clock_control_mcux_syscon.c +++ b/drivers/clock_control/clock_control_mcux_syscon.c @@ -15,9 +15,48 @@ #include LOG_MODULE_REGISTER(clock_control); +struct lpc_syscon_spec { + uint32_t name; +}; + +static int lpc_syscon_get_spec(clock_control_subsys_t subsys, struct lpc_syscon_spec *spec) +{ + struct clock_control_dt_spec *dt_spec = subsys; + + if (dt_spec->len != 1) { + return -EINVAL; + } + + spec->name = *(dt_spec->cells); + + return 0; +} + +static int lpc_syscon_get_name(clock_control_subsys_t dt_spec, uint32_t *name) +{ + struct lpc_syscon_spec spec; + int ret; + + ret = lpc_syscon_get_spec(dt_spec, &spec); + if (ret) { + return ret; + } + + *name = spec.name; + + return 0; +} + static int mcux_lpc_syscon_clock_control_on(const struct device *dev, - clock_control_subsys_t sub_system) + clock_control_subsys_t subsys) { + uint32_t sub_system; + + lpc_syscon_get_name(subsys, &sub_system); + if (ret) { + return ret; + } + #if defined(CONFIG_CAN_MCUX_MCAN) if ((uint32_t)sub_system == MCUX_MCAN_CLK) { CLOCK_EnableClock(kCLOCK_Mcan); @@ -149,7 +188,12 @@ static int mcux_lpc_syscon_clock_control_get_subsys_rate(const struct device *de clock_control_subsys_t sub_system, uint32_t *rate) { - uint32_t clock_name = (uint32_t)sub_system; + uint32_t clock_name = 0; + + lpc_syscon_get_name(sub_system, &clock_name); + if (ret) { + return ret; + } switch (clock_name) { @@ -602,9 +646,14 @@ __weak int flexspi_clock_set_freq(uint32_t clock_name, uint32_t freq) static int SYSCON_SET_FUNC_ATTR mcux_lpc_syscon_clock_control_set_subsys_rate( const struct device *dev, clock_control_subsys_t subsys, clock_control_subsys_rate_t rate) { - uint32_t clock_name = (uintptr_t)subsys; + uint32_t clock_name; uint32_t clock_rate = (uintptr_t)rate; + lpc_syscon_get_name(subsys, &clock_name); + if (ret) { + return ret; + } + switch (clock_name) { case MCUX_FLEXSPI_CLK: #if defined(CONFIG_MEMC) @@ -632,10 +681,16 @@ static int SYSCON_SET_FUNC_ATTR mcux_lpc_syscon_clock_control_set_subsys_rate( static int mcux_lpc_syscon_clock_control_configure(const struct device *dev, clock_control_subsys_t sub_system, void *data) { + uint32_t clock_name = 0; + int flexcomm_num = -1; + + lpc_syscon_get_name(sub_system, &clock_name); + if (ret) { + return ret; + } + #ifdef CONFIG_SOC_SERIES_RW6XX #define FLEXCOMM_LP_CLK_DECODE(n) (n & 0x80) - uint32_t clock_name = (uint32_t)sub_system; - int flexcomm_num = -1; switch (clock_name) { case MCUX_FLEXCOMM0_CLK: diff --git a/drivers/counter/counter_mcux_ctimer.c b/drivers/counter/counter_mcux_ctimer.c index a77b64b969466..9248417bf9a57 100644 --- a/drivers/counter/counter_mcux_ctimer.c +++ b/drivers/counter/counter_mcux_ctimer.c @@ -318,6 +318,7 @@ static DEVICE_API(counter, mcux_ctimer_driver_api) = { #define COUNTER_LPC_CTIMER_DEVICE(id) \ static void mcux_lpc_ctimer_irq_config_##id(const struct device *dev); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ static struct mcux_lpc_ctimer_config mcux_lpc_ctimer_config_##id = { \ .info = { \ .max_top_value = UINT32_MAX, \ @@ -326,8 +327,7 @@ static DEVICE_API(counter, mcux_ctimer_driver_api) = { },\ .base = (CTIMER_Type *)DT_INST_REG_ADDR(id), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ - .clock_subsys = \ - (clock_control_subsys_t)(DT_INST_CLOCKS_CELL(id, name)),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks),\ .mode = DT_INST_PROP(id, mode), \ .input = DT_INST_PROP(id, input), \ .prescale = DT_INST_PROP(id, prescale), \ diff --git a/drivers/counter/counter_mcux_ftm.c b/drivers/counter/counter_mcux_ftm.c index c82b382731349..dedd7be7c5b76 100644 --- a/drivers/counter/counter_mcux_ftm.c +++ b/drivers/counter/counter_mcux_ftm.c @@ -170,6 +170,7 @@ static DEVICE_API(counter, mcux_ftm_driver_api) = { #define COUNTER_MCUX_FTM_DEVICE_INIT(n) \ static struct mcux_ftm_data mcux_ftm_data_##n; \ static void mcux_ftm_irq_config_##n(const struct device *dev); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static const struct mcux_ftm_config mcux_ftm_config_##n = { \ .info = \ @@ -179,7 +180,7 @@ static DEVICE_API(counter, mcux_ftm_driver_api) = { }, \ .base = (FTM_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .ftm_clock_source = (ftm_clock_source_t)(DT_INST_ENUM_IDX(n, clock_source) + 1U), \ .prescale = TO_FTM_PRESCALE_DIVIDE(DT_INST_PROP(n, prescaler)), \ .irq_config_func = mcux_ftm_irq_config_##n, \ diff --git a/drivers/counter/counter_mcux_lpit.c b/drivers/counter/counter_mcux_lpit.c index e2b818ffa6eeb..68b970949af6e 100644 --- a/drivers/counter/counter_mcux_lpit.c +++ b/drivers/counter/counter_mcux_lpit.c @@ -235,6 +235,9 @@ static DEVICE_API(counter, mcux_lpit_driver_api) = { #define COUNTER_MCUX_LPIT_DEVICE_INIT(n) \ \ /* Setup the IRQ either for parent irq or per channel irq */ \ + MCUX_LPIT_SETUP_IRQ_CONFIG(n) \ + \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ MCUX_LPIT_SETUP_IRQ_CONFIG(n) \ \ /* Create channel declarations */ \ @@ -277,7 +280,7 @@ static DEVICE_API(counter, mcux_lpit_driver_api) = { .num_channels = DT_INST_FOREACH_CHILD_SEP_VARGS(n, DT_NODE_HAS_COMPAT, (+), \ nxp_lpit_channel), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .data = mcux_lpit_##n##_channel_datas, \ .channels = mcux_lpit_##n##_channels, \ }; \ diff --git a/drivers/counter/counter_mcux_qtmr.c b/drivers/counter/counter_mcux_qtmr.c index 7deb027b7dba3..da4cbb4d4c694 100644 --- a/drivers/counter/counter_mcux_qtmr.c +++ b/drivers/counter/counter_mcux_qtmr.c @@ -302,13 +302,14 @@ static DEVICE_API(counter, mcux_qtmr_driver_api) = { }; #define TMR_DEVICE_INIT_MCUX(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static struct mcux_qtmr_data mcux_qtmr_data_ ## n; \ \ static const struct mcux_qtmr_config mcux_qtmr_config_ ## n = { \ .base = (void *)DT_REG_ADDR(DT_INST_PARENT(n)), \ .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_INST_PARENT(n))), \ .clock_subsys = \ - (clock_control_subsys_t)DT_CLOCKS_CELL(DT_INST_PARENT(n), name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .info = { \ .max_top_value = UINT16_MAX, \ .freq = DT_INST_PROP_OR(n, freq, 0), \ diff --git a/drivers/counter/counter_mcux_tpm.c b/drivers/counter/counter_mcux_tpm.c index 059b057ada2a1..8e780833c0a79 100644 --- a/drivers/counter/counter_mcux_tpm.c +++ b/drivers/counter/counter_mcux_tpm.c @@ -271,12 +271,13 @@ static DEVICE_API(counter, mcux_tpm_driver_api) = { #define TPM_DEVICE_INIT_MCUX(n) \ static struct mcux_tpm_data mcux_tpm_data_ ## n; \ static void mcux_tpm_irq_config_ ## n(void); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static const struct mcux_tpm_config mcux_tpm_config_ ## n = { \ DEVICE_MMIO_NAMED_ROM_INIT(tpm_mmio, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .tpm_clock_source = kTPM_SystemClock, \ .prescale = TO_TPM_PRESCALE_DIVIDE(DT_INST_PROP(n, prescaler)), \ .info = { \ diff --git a/drivers/counter/counter_nxp_mrt.c b/drivers/counter/counter_nxp_mrt.c index b08a6765fc42c..41ba3aea24cb9 100644 --- a/drivers/counter/counter_nxp_mrt.c +++ b/drivers/counter/counter_nxp_mrt.c @@ -338,6 +338,9 @@ DEVICE_API(counter, nxp_mrt_api) = { /* Initialize all the data structs for active channels */ \ DT_INST_FOREACH_CHILD_STATUS_OKAY(n, NXP_MRT_CHANNEL_DATA_INIT) \ \ + /* Define clock control subsystem */ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ /* Create an array of const pointers to the data structs */ \ static struct nxp_mrt_channel_data *const nxp_mrt_##n##_channel_datas \ [DT_INST_PROP(n, num_channels)] = { \ @@ -367,8 +370,7 @@ DEVICE_API(counter, nxp_mrt_api) = { }, \ .base = (MRT_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = nxp_mrt_##n##_irq_config_func, \ .data = nxp_mrt_##n##_channel_datas, \ .channels = nxp_mrt_##n##_channels, \ diff --git a/drivers/counter/counter_nxp_pit.c b/drivers/counter/counter_nxp_pit.c index a8fac38b879c6..94efffa827294 100644 --- a/drivers/counter/counter_nxp_pit.c +++ b/drivers/counter/counter_nxp_pit.c @@ -311,6 +311,9 @@ static DEVICE_API(counter, nxp_pit_driver_api) = { #define COUNTER_NXP_PIT_DEVICE_INIT(n) \ \ /* Setup the IRQ either for parent irq or per channel irq */ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ + /* Setup the IRQ either for parent irq or per channel irq */ \ NXP_PIT_SETUP_IRQ_CONFIG(n) \ \ /* Create channel declarations */ \ @@ -359,8 +362,7 @@ static DEVICE_API(counter, nxp_pit_driver_api) = { .num_channels = DT_INST_FOREACH_CHILD_SEP_VARGS( \ n, DT_NODE_HAS_COMPAT, (+), nxp_pit_channel), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .data = nxp_pit_##n##_channel_datas, \ .channels = nxp_pit_##n##_channels, \ }; \ diff --git a/drivers/ethernet/eth_nxp_enet.c b/drivers/ethernet/eth_nxp_enet.c index a19b3ec3f7ebb..48a43a92cf4d2 100644 --- a/drivers/ethernet/eth_nxp_enet.c +++ b/drivers/ethernet/eth_nxp_enet.c @@ -936,6 +936,8 @@ BUILD_ASSERT(NXP_ENET_PHY_MODE(DT_DRV_INST(n)) != NXP_ENET_RGMII_MODE || \ \ NXP_ENET_FRAMEINFO_ARRAY(n) \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static void nxp_enet_##n##_irq_config_func(void) \ { \ DT_INST_FOREACH_PROP_ELEM(n, interrupt_names, \ @@ -965,8 +967,8 @@ BUILD_ASSERT(NXP_ENET_PHY_MODE(DT_DRV_INST(n)) != NXP_ENET_RGMII_MODE || \ const struct nxp_enet_mac_config nxp_enet_##n##_config = { \ .irq_config_func = nxp_enet_##n##_irq_config_func, \ .module_dev = DEVICE_DT_GET(DT_INST_PARENT(n)), \ - .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_INST_PARENT(n))), \ - .clock_subsys = (void *)DT_CLOCKS_CELL_BY_IDX( \ + .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_DRV_INST(n))), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ DT_INST_PARENT(n), 0, name), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .buffer_config = {{ \ diff --git a/drivers/ethernet/eth_nxp_enet_qos/eth_nxp_enet_qos.c b/drivers/ethernet/eth_nxp_enet_qos/eth_nxp_enet_qos.c index aa89232a56001..95cc5f10b0a44 100644 --- a/drivers/ethernet/eth_nxp_enet_qos/eth_nxp_enet_qos.c +++ b/drivers/ethernet/eth_nxp_enet_qos/eth_nxp_enet_qos.c @@ -29,11 +29,12 @@ int nxp_enet_qos_init(const struct device *dev) #define NXP_ENET_QOS_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static const struct nxp_enet_qos_config enet_qos_##n##_config = { \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (void *)DT_INST_CLOCKS_CELL_BY_IDX(n, 0, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .base = (enet_qos_t *)DT_INST_REG_ADDR(n), \ }; \ \ diff --git a/drivers/gpio/gpio_lpc11u6x.c b/drivers/gpio/gpio_lpc11u6x.c index ac290187ae43c..45a25657da184 100644 --- a/drivers/gpio/gpio_lpc11u6x.c +++ b/drivers/gpio/gpio_lpc11u6x.c @@ -499,9 +499,11 @@ static DEVICE_API(gpio, gpio_lpc11u6x_driver_api) = { * shared between all the ports (IRQ lines, clock). */ +CLOCK_CONTROL_DT_SPEC_INST_DEFINE(0, clocks); + static const struct gpio_lpc11u6x_shared gpio_lpc11u6x_shared = { .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(0)), - .clock_subsys = (clock_control_subsys_t) DT_INST_PHA(0, clocks, clkid), + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(0, clocks), .gpio_base = DT_INST_REG_ADDR_BY_IDX(0, 0), .syscon_base = DT_INST_REG_ADDR_BY_IDX(0, 1), .nirqs = DT_NUM_IRQS(DT_DRV_INST(0)), diff --git a/drivers/i2c/i2c_lpc11u6x.c b/drivers/i2c/i2c_lpc11u6x.c index a00ac10dd5c6f..7cec40793d462 100644 --- a/drivers/i2c/i2c_lpc11u6x.c +++ b/drivers/i2c/i2c_lpc11u6x.c @@ -354,6 +354,8 @@ static DEVICE_API(i2c, i2c_api) = { \ static void lpc11u6x_i2c_isr_config_##idx(const struct device *dev); \ \ +CLOCK_CONTROL_DT_SPEC_INST_DEFINE(idx, clocks); \ + \ PINCTRL_DT_INST_DEFINE(idx); \ \ static const struct lpc11u6x_i2c_config i2c_cfg_##idx = { \ @@ -362,7 +364,7 @@ static const struct lpc11u6x_i2c_config i2c_cfg_##idx = { \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(idx)), \ .irq_config_func = lpc11u6x_i2c_isr_config_##idx, \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(idx), \ - .clkid = DT_INST_PHA_BY_IDX(idx, clocks, 0, clkid), \ + .clkid = CLOCK_CONTROL_DT_SPEC_INST_GET(idx, clocks), \ }; \ \ static struct lpc11u6x_i2c_data i2c_data_##idx; \ diff --git a/drivers/i2c/i2c_mcux_flexcomm.c b/drivers/i2c/i2c_mcux_flexcomm.c index 4527f2764da45..cb44be3959763 100644 --- a/drivers/i2c/i2c_mcux_flexcomm.c +++ b/drivers/i2c/i2c_mcux_flexcomm.c @@ -671,12 +671,12 @@ static DEVICE_API(i2c, mcux_flexcomm_driver_api) = { #define I2C_MCUX_FLEXCOMM_DEVICE(id) \ PINCTRL_DT_INST_DEFINE(id); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ static void mcux_flexcomm_config_func_##id(const struct device *dev); \ static const struct mcux_flexcomm_config mcux_flexcomm_config_##id = { \ .base = (I2C_Type *) DT_INST_REG_ADDR(id), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ - .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(id, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks), \ .irq_config_func = mcux_flexcomm_config_func_##id, \ .bitrate = DT_INST_PROP(id, clock_frequency), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(id), \ diff --git a/drivers/i2c/i2c_mcux_lpi2c.c b/drivers/i2c/i2c_mcux_lpi2c.c index 81af8e2adc15b..16b2043e6402b 100644 --- a/drivers/i2c/i2c_mcux_lpi2c.c +++ b/drivers/i2c/i2c_mcux_lpi2c.c @@ -589,6 +589,7 @@ static DEVICE_API(i2c, mcux_lpi2c_driver_api) = { #define I2C_MCUX_LPI2C_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static void mcux_lpi2c_config_func_##n(const struct device *dev)\ { \ @@ -598,8 +599,7 @@ static DEVICE_API(i2c, mcux_lpi2c_driver_api) = { static const struct mcux_lpi2c_config mcux_lpi2c_config_##n = { \ DEVICE_MMIO_NAMED_ROM_INIT(reg_base, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks),\ .irq_config_func = mcux_lpi2c_config_func_##n, \ .bitrate = DT_INST_PROP(n, clock_frequency), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ diff --git a/drivers/i2c/i2c_mcux_lpi2c_rtio.c b/drivers/i2c/i2c_mcux_lpi2c_rtio.c index b5e2e12248d2c..c3ab82d7612b1 100644 --- a/drivers/i2c/i2c_mcux_lpi2c_rtio.c +++ b/drivers/i2c/i2c_mcux_lpi2c_rtio.c @@ -386,6 +386,8 @@ static DEVICE_API(i2c, mcux_lpi2c_driver_api) = { #define I2C_MCUX_LPI2C_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static void mcux_lpi2c_config_func_##n(const struct device *dev)\ { \ I2C_MCUX_LPI2C_IRQ_SETUP_FUNC(n); \ @@ -395,7 +397,7 @@ static DEVICE_API(i2c, mcux_lpi2c_driver_api) = { DEVICE_MMIO_NAMED_ROM_INIT(reg_base, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = mcux_lpi2c_config_func_##n, \ .bitrate = DT_INST_PROP(n, clock_frequency), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ diff --git a/drivers/i2c/i2c_nxp_ii2c.c b/drivers/i2c/i2c_nxp_ii2c.c index bfe6cf1467e9c..0f6234b9e8ab7 100644 --- a/drivers/i2c/i2c_nxp_ii2c.c +++ b/drivers/i2c/i2c_nxp_ii2c.c @@ -379,14 +379,14 @@ static DEVICE_API(i2c, nxp_ii2c_driver_api) = { #define I2C_DEVICE_INIT_MCUX(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static void nxp_ii2c_config_func_ ## n(const struct device *dev); \ \ static const struct nxp_ii2c_config nxp_ii2c_config_ ## n = { \ DEVICE_MMIO_NAMED_ROM_INIT(reg_base, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks),\ .irq_config_func = nxp_ii2c_config_func_ ## n, \ .bitrate = DT_INST_PROP(n, clock_frequency), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ diff --git a/drivers/i2s/i2s_mcux_sai.c b/drivers/i2s/i2s_mcux_sai.c index 3a32e5a6e7137..1efb0344f13c5 100644 --- a/drivers/i2s/i2s_mcux_sai.c +++ b/drivers/i2s/i2s_mcux_sai.c @@ -1185,6 +1185,8 @@ static DEVICE_API(i2s, i2s_mcux_driver_api) = { #define I2S_MCUX_INIT(i2s_id) \ static void i2s_irq_connect_##i2s_id(const struct device *dev); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(i2s_id, clocks); \ + \ PINCTRL_DT_INST_DEFINE(i2s_id); \ \ static const struct i2s_mcux_config i2s_##i2s_id##_config = { \ @@ -1202,7 +1204,7 @@ static DEVICE_API(i2s, i2s_mcux_driver_api) = { .mclk_pin_offset = DT_PHA_BY_IDX(DT_DRV_INST(i2s_id), pinmuxes, 0, offset), \ .mclk_output = DT_INST_PROP_OR(i2s_id, mclk_output, 0), \ .clk_sub_sys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(i2s_id, 0, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(i2s_id, clocks), \ .ccm_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(i2s_id)), \ .irq_connect = i2s_irq_connect_##i2s_id, \ .pinctrl = PINCTRL_DT_INST_DEV_CONFIG_GET(i2s_id), \ diff --git a/drivers/i3c/i3c_mcux.c b/drivers/i3c/i3c_mcux.c index fa3bf994b42a1..526243cb82bdc 100644 --- a/drivers/i3c/i3c_mcux.c +++ b/drivers/i3c/i3c_mcux.c @@ -2123,6 +2123,7 @@ static DEVICE_API(i3c, mcux_i3c_driver_api) = { #define I3C_MCUX_DEVICE(id) \ PINCTRL_DT_INST_DEFINE(id); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ static void mcux_i3c_config_func_##id(const struct device *dev); \ static struct i3c_device_desc mcux_i3c_device_array_##id[] = \ I3C_DEVICE_ARRAY_DT_INST(id); \ @@ -2132,7 +2133,7 @@ static DEVICE_API(i3c, mcux_i3c_driver_api) = { .base = (I3C_Type *) DT_INST_REG_ADDR(id), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(id, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks), \ .irq_config_func = mcux_i3c_config_func_##id, \ .common.dev_list.i3c = mcux_i3c_device_array_##id, \ .common.dev_list.num_i3c = ARRAY_SIZE(mcux_i3c_device_array_##id), \ diff --git a/drivers/input/input_mcux_kpp.c b/drivers/input/input_mcux_kpp.c index 3fb02ca1dd8e0..be9ebe84e4c8d 100644 --- a/drivers/input/input_mcux_kpp.c +++ b/drivers/input/input_mcux_kpp.c @@ -179,12 +179,13 @@ static int input_kpp_init(const struct device *dev) #define INPUT_KPP_INIT(n) \ static struct kpp_data kpp_data_##n; \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ PINCTRL_DT_INST_DEFINE(n); \ \ static const struct kpp_config kpp_config_##n = { \ .base = (KPP_Type *)DT_INST_REG_ADDR(n), \ - .clk_sub_sys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(n, 0, name), \ + .clk_sub_sys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .ccm_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ }; \ diff --git a/drivers/mdio/mdio_nxp_enet.c b/drivers/mdio/mdio_nxp_enet.c index b79e3e1502b86..107aba4702fff 100644 --- a/drivers/mdio/mdio_nxp_enet.c +++ b/drivers/mdio/mdio_nxp_enet.c @@ -240,13 +240,13 @@ static int nxp_enet_mdio_init(const struct device *dev) #define NXP_ENET_MDIO_INIT(inst) \ PINCTRL_DT_INST_DEFINE(inst); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(inst, clocks); \ \ static const struct nxp_enet_mdio_config nxp_enet_mdio_cfg_##inst = { \ .module_dev = DEVICE_DT_GET(DT_INST_PARENT(inst)), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(inst), \ .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_INST_PARENT(inst))), \ - .clock_subsys = (void *) DT_CLOCKS_CELL_BY_IDX( \ - DT_INST_PARENT(inst), 0, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(inst, clocks), \ .disable_preamble = DT_INST_PROP(inst, suppress_preamble), \ .mdc_freq = DT_INST_PROP(inst, clock_frequency), \ }; \ diff --git a/drivers/mdio/mdio_nxp_enet_qos.c b/drivers/mdio/mdio_nxp_enet_qos.c index 25a6a27a2095d..020f632fd011e 100644 --- a/drivers/mdio/mdio_nxp_enet_qos.c +++ b/drivers/mdio/mdio_nxp_enet_qos.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -259,6 +260,8 @@ static int nxp_enet_qos_mdio_init(const struct device *dev) #define NXP_ENET_QOS_MDIO_INIT(inst) \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(inst, clocks); \ + \ static const struct nxp_enet_qos_mdio_config \ nxp_enet_qos_mdio_cfg_##inst = { \ .enet_dev = DEVICE_DT_GET(DT_INST_PARENT(inst)), \ diff --git a/drivers/mdio/mdio_nxp_imx_netc.c b/drivers/mdio/mdio_nxp_imx_netc.c index c9afc4a4c4055..cdc10b196a615 100644 --- a/drivers/mdio/mdio_nxp_imx_netc.c +++ b/drivers/mdio/mdio_nxp_imx_netc.c @@ -96,6 +96,7 @@ static DEVICE_API(mdio, nxp_imx_netc_mdio_api) = { }; #define NXP_IMX_NETC_MDIO_INSTANCE_DEFINE(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ PINCTRL_DT_INST_DEFINE(n); \ static struct nxp_imx_netc_mdio_data nxp_imx_netc_mdio##n##_data; \ static const struct nxp_imx_netc_mdio_config nxp_imx_netc_mdio##n##_cfg = { \ @@ -103,7 +104,7 @@ static DEVICE_API(mdio, nxp_imx_netc_mdio_api) = { DEVICE_MMIO_NAMED_ROM_INIT_BY_NAME(pfconfig, DT_DRV_INST(n)), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ }; \ DEVICE_DT_INST_DEFINE(n, &nxp_imx_netc_mdio_initialize, NULL, \ &nxp_imx_netc_mdio##n##_data, &nxp_imx_netc_mdio##n##_cfg, \ diff --git a/drivers/memc/memc_mcux_flexspi.c b/drivers/memc/memc_mcux_flexspi.c index 2fe22f760d3e0..ccf5e60092eb0 100644 --- a/drivers/memc/memc_mcux_flexspi.c +++ b/drivers/memc/memc_mcux_flexspi.c @@ -442,6 +442,7 @@ static int memc_flexspi_pm_action(const struct device *dev, enum pm_device_actio #define MEMC_FLEXSPI(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static uint16_t buf_cfg_##n[] = \ DT_INST_PROP_OR(n, rx_buffer_config, {0}); \ \ @@ -464,8 +465,7 @@ static int memc_flexspi_pm_action(const struct device *dev, enum pm_device_actio sizeof(struct memc_flexspi_buf_cfg), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ }; \ \ PM_DEVICE_DT_INST_DEFINE(n, memc_flexspi_pm_action); \ diff --git a/drivers/mipi_dbi/mipi_dbi_nxp_lcdic.c b/drivers/mipi_dbi/mipi_dbi_nxp_lcdic.c index d1443fc764fbc..219153a22a5a9 100644 --- a/drivers/mipi_dbi/mipi_dbi_nxp_lcdic.c +++ b/drivers/mipi_dbi/mipi_dbi_nxp_lcdic.c @@ -946,6 +946,7 @@ static int mipi_dbi_lcdic_init(const struct device *dev) } \ \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static const struct mipi_dbi_lcdic_config \ mipi_dbi_lcdic_config_##n = { \ .base = (LCDIC_Type *)DT_INST_REG_ADDR(n), \ @@ -953,6 +954,7 @@ static int mipi_dbi_lcdic_init(const struct device *dev) .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = (clock_control_subsys_t) \ DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = mipi_dbi_lcdic_config_func_##n, \ .swap_bytes = DT_INST_PROP(n, nxp_swap_bytes), \ .write_active_min = \ diff --git a/drivers/mipi_dsi/dsi_mcux_2l.c b/drivers/mipi_dsi/dsi_mcux_2l.c index 14ec387960178..664017cd2eb28 100644 --- a/drivers/mipi_dsi/dsi_mcux_2l.c +++ b/drivers/mipi_dsi/dsi_mcux_2l.c @@ -828,6 +828,9 @@ static int mcux_mipi_dsi_init(const struct device *dev) #define MCUX_MIPI_DSI_DEVICE(id) \ COND_CODE_1(CONFIG_MIPI_DSI_MCUX_2L_SMARTDMA, \ (), (static void mipi_dsi_##n##_irq_config_func(const struct device *dev) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, dphy, clocks); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, esc, clocks); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, pixel, clocks); \ { \ IRQ_CONNECT(DT_INST_IRQN(id), DT_INST_IRQ(id, priority), \ mipi_dsi_isr, DEVICE_DT_INST_GET(id), 0); \ @@ -847,13 +850,13 @@ static int mcux_mipi_dsi_init(const struct device *dev) .dphy_ref_freq = DT_INST_PROP_OR(id, dphy_ref_frequency, 0), \ .bit_clk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(id, dphy)), \ .bit_clk_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(id, dphy, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, dphy, clocks), \ .esc_clk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(id, esc)), \ .esc_clk_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(id, esc, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, esc, clocks), \ .pixel_clk_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR_BY_NAME(id, pixel)), \ .pixel_clk_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_NAME(id, pixel, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, pixel, clocks), \ }; \ \ static struct mcux_mipi_dsi_data mipi_dsi_data_##id; \ diff --git a/drivers/misc/mcux_flexio/mcux_flexio.c b/drivers/misc/mcux_flexio/mcux_flexio.c index cef0ce1a62d68..4ccc739830daa 100644 --- a/drivers/misc/mcux_flexio/mcux_flexio.c +++ b/drivers/misc/mcux_flexio/mcux_flexio.c @@ -222,6 +222,8 @@ int nxp_flexio_child_attach(const struct device *dev, static void mcux_flexio_irq_enable_func_##n(void); \ static void mcux_flexio_irq_disable_func_##n(void); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static nxp_flexio_map_child_t \ nxp_flexio_map_shifter_child_##n[MCUX_FLEXIO_SHIFTER_COUNT_MAX(n)] = {0}; \ static nxp_flexio_map_child_t \ @@ -237,8 +239,7 @@ int nxp_flexio_child_attach(const struct device *dev, static const struct mcux_flexio_config mcux_flexio_config_##n = { \ .base = (FLEXIO_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = mcux_flexio_irq_config_func_##n, \ .irq_enable_func = mcux_flexio_irq_enable_func_##n, \ .irq_disable_func = mcux_flexio_irq_disable_func_##n, \ diff --git a/drivers/pinctrl/pinctrl_nxp_port.c b/drivers/pinctrl/pinctrl_nxp_port.c index 4af6602703f43..5b20cbfccd56c 100644 --- a/drivers/pinctrl/pinctrl_nxp_port.c +++ b/drivers/pinctrl/pinctrl_nxp_port.c @@ -71,24 +71,11 @@ static int pinctrl_mcux_init(const struct device *dev) return 0; } -#if DT_NODE_HAS_STATUS_OKAY(DT_INST(0, nxp_kinetis_sim)) -#define PINCTRL_MCUX_DT_INST_CLOCK_SUBSYS(n) \ - CLK_GATE_DEFINE(DT_INST_CLOCKS_CELL(n, offset), DT_INST_CLOCKS_CELL(n, bits)) -#elif DT_HAS_COMPAT_STATUS_OKAY(nxp_scg_k4) -#define PINCTRL_MCUX_DT_INST_CLOCK_SUBSYS(n) \ - (DT_INST_CLOCKS_CELL(n, mrcc_offset) == 0 \ - ? 0 \ - : MAKE_MRCC_REGADDR(MRCC_BASE, DT_INST_CLOCKS_CELL(n, mrcc_offset))) -#else -#define PINCTRL_MCUX_DT_INST_CLOCK_SUBSYS(n) \ - DT_INST_CLOCKS_CELL(n, name) -#endif - #define PINCTRL_MCUX_INIT(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static const struct pinctrl_mcux_config pinctrl_mcux_##n##_config = {\ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - PINCTRL_MCUX_DT_INST_CLOCK_SUBSYS(n), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ }; \ \ DEVICE_DT_INST_DEFINE(n, \ diff --git a/drivers/pwm/pwm_mcux.c b/drivers/pwm/pwm_mcux.c index 308581731f0d8..49bbd17891974 100644 --- a/drivers/pwm/pwm_mcux.c +++ b/drivers/pwm/pwm_mcux.c @@ -246,6 +246,7 @@ static DEVICE_API(pwm, pwm_mcux_driver_api) = { #define PWM_DEVICE_INIT_MCUX(n) \ static struct pwm_mcux_data pwm_mcux_data_ ## n; \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static const struct pwm_mcux_config pwm_mcux_config_ ## n = { \ .base = (PWM_Type *)DT_REG_ADDR(DT_INST_PARENT(n)), \ @@ -255,7 +256,7 @@ static DEVICE_API(pwm, pwm_mcux_driver_api) = { .reload = DT_ENUM_IDX_OR(DT_DRV_INST(n), nxp_reload,\ kPWM_ReloadPwmFullCycle),\ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks),\ .run_wait = DT_INST_PROP(n, run_in_wait), \ .run_debug = DT_INST_PROP(n, run_in_debug), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ diff --git a/drivers/pwm/pwm_mcux_ctimer.c b/drivers/pwm/pwm_mcux_ctimer.c index 27d48211cc86f..ead97fef2f2da 100644 --- a/drivers/pwm/pwm_mcux_ctimer.c +++ b/drivers/pwm/pwm_mcux_ctimer.c @@ -262,11 +262,12 @@ static DEVICE_API(pwm, pwm_mcux_ctimer_driver_api) = { .is_period_channel_set = false, \ }; \ PWM_MCUX_CTIMER_PINCTRL_DEFINE(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static const struct pwm_mcux_ctimer_config pwm_mcux_ctimer_config_##n = { \ .base = (CTIMER_Type *)DT_INST_REG_ADDR(n), \ .prescale = DT_INST_PROP(n, prescaler), \ .clock_control = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_id = (clock_control_subsys_t)(DT_INST_CLOCKS_CELL(n, name)), \ + .clock_id = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ PWM_MCUX_CTIMER_PINCTRL_INIT(n)}; \ \ DEVICE_DT_INST_DEFINE(n, mcux_ctimer_pwm_init, NULL, &pwm_mcux_ctimer_data_##n, \ diff --git a/drivers/pwm/pwm_mcux_ftm.c b/drivers/pwm/pwm_mcux_ftm.c index a8d578371777f..1c73c37038211 100644 --- a/drivers/pwm/pwm_mcux_ftm.c +++ b/drivers/pwm/pwm_mcux_ftm.c @@ -576,8 +576,7 @@ FTM_ISR_FUNC(6, 7) static const struct mcux_ftm_config mcux_ftm_config_##n = { \ .base = (FTM_Type *)DT_INST_REG_ADDR(n),\ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .ftm_clock_source = (ftm_clock_source_t)(DT_INST_ENUM_IDX(n, clock_source) + 1U), \ .prescale = TO_FTM_PRESCALE_DIVIDE(DT_INST_PROP(n, prescaler)),\ .channel_count = FSL_FEATURE_FTM_CHANNEL_COUNTn((FTM_Type *) \ @@ -588,6 +587,7 @@ static const struct mcux_ftm_config mcux_ftm_config_##n = { \ } #define FTM_DEVICE(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ PINCTRL_DT_INST_DEFINE(n); \ static struct mcux_ftm_data mcux_ftm_data_##n; \ static const struct mcux_ftm_config mcux_ftm_config_##n; \ diff --git a/drivers/pwm/pwm_mcux_pwt.c b/drivers/pwm/pwm_mcux_pwt.c index 13c0401b49960..a22430f28512a 100644 --- a/drivers/pwm/pwm_mcux_pwt.c +++ b/drivers/pwm/pwm_mcux_pwt.c @@ -338,6 +338,8 @@ static DEVICE_API(pwm, mcux_pwt_driver_api) = { #define PWT_DEVICE(n) \ static void mcux_pwt_config_func_##n(const struct device *dev); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ PINCTRL_DT_INST_DEFINE(n); \ \ static const struct mcux_pwt_config mcux_pwt_config_##n = { \ @@ -345,6 +347,7 @@ static DEVICE_API(pwm, mcux_pwt_driver_api) = { .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = \ (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .pwt_clock_source = kPWT_BusClock, \ .prescale = \ TO_PWT_PRESCALE_DIVIDE(DT_INST_PROP(n, prescaler)), \ diff --git a/drivers/pwm/pwm_mcux_qtmr.c b/drivers/pwm/pwm_mcux_qtmr.c index 44b33b829f718..0096cdc934a8d 100644 --- a/drivers/pwm/pwm_mcux_qtmr.c +++ b/drivers/pwm/pwm_mcux_qtmr.c @@ -156,6 +156,7 @@ static DEVICE_API(pwm, pwm_mcux_qtmr_driver_api) = { #define PWM_MCUX_QTMR_DEVICE_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static struct pwm_mcux_qtmr_data pwm_mcux_qtmr_data_##n; \ \ static const struct pwm_mcux_qtmr_config pwm_mcux_qtmr_config_##n = { \ @@ -163,7 +164,7 @@ static DEVICE_API(pwm, pwm_mcux_qtmr_driver_api) = { .prescaler = DT_INST_PROP(n, prescaler), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ }; \ \ DEVICE_DT_INST_DEFINE(n, mcux_qtmr_pwm_init, NULL, &pwm_mcux_qtmr_data_##n, \ diff --git a/drivers/pwm/pwm_mcux_sctimer.c b/drivers/pwm/pwm_mcux_sctimer.c index 9f572f452ee1e..b44c130b1ac29 100644 --- a/drivers/pwm/pwm_mcux_sctimer.c +++ b/drivers/pwm/pwm_mcux_sctimer.c @@ -250,6 +250,7 @@ static DEVICE_API(pwm, pwm_mcux_sctimer_driver_api) = { #define PWM_MCUX_SCTIMER_DEVICE_INIT_MCUX(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static struct pwm_mcux_sctimer_data pwm_mcux_sctimer_data_##n; \ \ static const struct pwm_mcux_sctimer_config pwm_mcux_sctimer_config_##n = { \ @@ -257,7 +258,7 @@ static DEVICE_API(pwm, pwm_mcux_sctimer_driver_api) = { .prescale = DT_INST_PROP(n, prescaler), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ }; \ \ DEVICE_DT_INST_DEFINE(n, \ diff --git a/drivers/pwm/pwm_mcux_tpm.c b/drivers/pwm/pwm_mcux_tpm.c index a9282ddd494c2..94b2f3152f356 100644 --- a/drivers/pwm/pwm_mcux_tpm.c +++ b/drivers/pwm/pwm_mcux_tpm.c @@ -228,12 +228,12 @@ static DEVICE_API(pwm, mcux_tpm_driver_api) = { #define TO_TPM_PRESCALE_DIVIDE(val) _DO_CONCAT(kTPM_Prescale_Divide_, val) #define TPM_DEVICE(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ PINCTRL_DT_INST_DEFINE(n); \ static const struct mcux_tpm_config mcux_tpm_config_##n = { \ DEVICE_MMIO_NAMED_ROM_INIT(base, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t) \ - DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .tpm_clock_source = kTPM_SystemClock, \ .prescale = TO_TPM_PRESCALE_DIVIDE(DT_INST_PROP(n, prescaler)), \ .channel_count = FSL_FEATURE_TPM_CHANNEL_COUNTn((TPM_Type *) \ diff --git a/drivers/pwm/pwm_nxp_flexio.c b/drivers/pwm/pwm_nxp_flexio.c index cf644a4527699..1830093a1df16 100644 --- a/drivers/pwm/pwm_nxp_flexio.c +++ b/drivers/pwm/pwm_nxp_flexio.c @@ -320,6 +320,7 @@ static DEVICE_API(pwm, pwm_nxp_flexio_driver_api) = { #define PWM_NXP_FLEXIO_PWM_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ FLEXIO_PWM_PULSE_GEN_CONFIG(n) \ FLEXIO_PWM_TIMER_INDEX_INIT(n) \ FLEXIO_PWM_CHILD_CONFIG(n) \ @@ -328,7 +329,7 @@ static DEVICE_API(pwm, pwm_nxp_flexio_driver_api) = { .flexio_base = (FLEXIO_Type *)DT_REG_ADDR(DT_INST_PARENT(n)), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_INST_PARENT(n))), \ - .clock_subsys = (clock_control_subsys_t)DT_CLOCKS_CELL(DT_INST_PARENT(n), name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .child = &mcux_flexio_pwm_child_##n, \ FLEXIO_PWM_PULSE_GEN_GET_CONFIG(n) \ }; \ diff --git a/drivers/sdhc/imx_usdhc.c b/drivers/sdhc/imx_usdhc.c index f0b3e5a299f3e..7bd8c4be890c7 100644 --- a/drivers/sdhc/imx_usdhc.c +++ b/drivers/sdhc/imx_usdhc.c @@ -1078,10 +1078,12 @@ static DEVICE_API(sdhc, usdhc_api) = { \ PINCTRL_DT_INST_DEFINE(n); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static const struct usdhc_config usdhc_##n##_config = { \ DEVICE_MMIO_NAMED_ROM_INIT(usdhc_mmio, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .nusdhc = n, \ .pwr_gpio = GPIO_DT_SPEC_INST_GET_OR(n, pwr_gpios, {0}), \ .detect_gpio = GPIO_DT_SPEC_INST_GET_OR(n, cd_gpios, {0}), \ diff --git a/drivers/sdhc/mcux_sdif.c b/drivers/sdhc/mcux_sdif.c index 1790b59950e6d..ff122db320123 100644 --- a/drivers/sdhc/mcux_sdif.c +++ b/drivers/sdhc/mcux_sdif.c @@ -424,6 +424,8 @@ static DEVICE_API(sdhc, sdif_api) = { #define MCUX_SDIF_INIT(n) \ static void sdif_##n##_irq_config_func(const struct device *dev) \ + \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ { \ IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), \ mcux_sdif_isr, DEVICE_DT_INST_GET(n), 0); \ @@ -440,7 +442,7 @@ static DEVICE_API(sdhc, sdif_api) = { .data_timeout = DT_INST_PROP(n, data_timeout), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = sdif_##n##_irq_config_func, \ }; \ \ diff --git a/drivers/serial/uart_lpc11u6x.c b/drivers/serial/uart_lpc11u6x.c index e9a1355d0d6b1..c8bc0ad2461ba 100644 --- a/drivers/serial/uart_lpc11u6x.c +++ b/drivers/serial/uart_lpc11u6x.c @@ -380,6 +380,8 @@ static void lpc11u6x_uart0_isr_config(const struct device *dev); PINCTRL_DT_DEFINE(DT_NODELABEL(uart0)); +CLOCK_CONTROL_DT_SPEC_DEFINE(DT_NODELABEL(uart0), clocks); + BUILD_ASSERT(DT_PROP(DT_NODELABEL(uart0), rx_invert) == 0, "rx-invert not supported for UART0"); BUILD_ASSERT(DT_PROP(DT_NODELABEL(uart0), tx_invert) == 0, @@ -390,7 +392,7 @@ static const struct lpc11u6x_uart0_config uart0_config = { DT_REG_ADDR(DT_NODELABEL(uart0)), .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_NODELABEL(uart0))), .pincfg = PINCTRL_DT_DEV_CONFIG_GET(DT_NODELABEL(uart0)), - .clkid = DT_PHA_BY_IDX(DT_NODELABEL(uart0), clocks, 0, clkid), + .clkid = CLOCK_CONTROL_DT_SPEC_GET(DT_NODELABEL(uart0), clocks), .baudrate = DT_PROP(DT_NODELABEL(uart0), current_speed), #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = lpc11u6x_uart0_isr_config, @@ -855,13 +857,14 @@ static DEVICE_API(uart, uartx_api) = { #define LPC11U6X_UARTX_INIT(idx) \ +CLOCK_CONTROL_DT_SPEC_DEFINE(DT_NODELABEL(uart##idx), clocks); \ PINCTRL_DT_DEFINE(DT_NODELABEL(uart##idx)); \ \ static const struct lpc11u6x_uartx_config uart_cfg_##idx = { \ .base = (struct lpc11u6x_uartx_regs *) \ DT_REG_ADDR(DT_NODELABEL(uart##idx)), \ .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(DT_NODELABEL(uart##idx))), \ - .clkid = DT_PHA_BY_IDX(DT_NODELABEL(uart##idx), clocks, 0, clkid), \ + .clkid = CLOCK_CONTROL_DT_SPEC_GET(DT_NODELABEL(uart##idx), clocks), \ .pincfg = PINCTRL_DT_DEV_CONFIG_GET(DT_NODELABEL(uart##idx)), \ .baudrate = DT_PROP(DT_NODELABEL(uart##idx), current_speed), \ .rx_invert = DT_PROP(DT_NODELABEL(uart##idx), rx_invert), \ diff --git a/drivers/serial/uart_mcux.c b/drivers/serial/uart_mcux.c index e7218f7b6905a..c57391c09249c 100644 --- a/drivers/serial/uart_mcux.c +++ b/drivers/serial/uart_mcux.c @@ -397,7 +397,7 @@ static DEVICE_API(uart, uart_mcux_driver_api) = { static const struct uart_mcux_config uart_mcux_##n##_config = { \ .base = (UART_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ IRQ_FUNC_INIT \ } @@ -436,6 +436,7 @@ static const struct uart_mcux_config uart_mcux_##n##_config = { \ #define UART_MCUX_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ \ static struct uart_mcux_data uart_mcux_##n##_data = { \ .uart_cfg = { \ diff --git a/drivers/serial/uart_mcux_flexcomm.c b/drivers/serial/uart_mcux_flexcomm.c index 08a1c1edb28bc..d8fee6963d478 100644 --- a/drivers/serial/uart_mcux_flexcomm.c +++ b/drivers/serial/uart_mcux_flexcomm.c @@ -1417,8 +1417,7 @@ static void serial_mcux_flexcomm_##n##_pm_exit(enum pm_state state) \ static const struct mcux_flexcomm_config mcux_flexcomm_##n##_config = { \ .base = (USART_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .baud_rate = DT_INST_PROP(n, current_speed), \ .parity = DT_INST_ENUM_IDX(n, parity), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ @@ -1438,6 +1437,8 @@ static struct mcux_flexcomm_data mcux_flexcomm_##n##_data = { \ \ PINCTRL_DT_INST_DEFINE(n); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ UART_MCUX_FLEXCOMM_PM_UNLOCK_FUNC_DEFINE(n) \ UART_MCUX_FLEXCOMM_WAKEUP_CFG_DEFINE(n) \ UART_MCUX_FLEXCOMM_PM_HANDLES_DEFINE(n) \ diff --git a/drivers/serial/uart_mcux_iuart.c b/drivers/serial/uart_mcux_iuart.c index 2024efa760378..583ce78265549 100644 --- a/drivers/serial/uart_mcux_iuart.c +++ b/drivers/serial/uart_mcux_iuart.c @@ -327,7 +327,7 @@ static DEVICE_API(uart, mcux_iuart_driver_api) = { static const struct mcux_iuart_config mcux_iuart_##n##_config = { \ .base = (UART_Type *) DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .baud_rate = DT_INST_PROP(n, current_speed), \ .parity = DT_INST_ENUM_IDX(n, parity), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ @@ -349,6 +349,8 @@ static const struct mcux_iuart_config mcux_iuart_##n##_config = { \ CONFIG_SERIAL_INIT_PRIORITY, \ &mcux_iuart_driver_api); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ PINCTRL_DT_INST_DEFINE(n); \ \ IUART_MCUX_CONFIG_FUNC(n) \ diff --git a/drivers/serial/uart_mcux_lpsci.c b/drivers/serial/uart_mcux_lpsci.c index 421f3b5b11b03..0e705e3398935 100644 --- a/drivers/serial/uart_mcux_lpsci.c +++ b/drivers/serial/uart_mcux_lpsci.c @@ -317,7 +317,7 @@ static DEVICE_API(uart, mcux_lpsci_driver_api) = { static const struct mcux_lpsci_config mcux_lpsci_##n##_config = { \ .base = (UART0_Type *)DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .baud_rate = DT_INST_PROP(n, current_speed), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ IRQ_FUNC_INIT \ @@ -326,6 +326,8 @@ static const struct mcux_lpsci_config mcux_lpsci_##n##_config = { \ #define MCUX_LPSCI_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static struct mcux_lpsci_data mcux_lpsci_##n##_data; \ \ static const struct mcux_lpsci_config mcux_lpsci_##n##_config; \ diff --git a/drivers/serial/uart_mcux_lpuart.c b/drivers/serial/uart_mcux_lpuart.c index 7faf225302984..9fae049d9154f 100644 --- a/drivers/serial/uart_mcux_lpuart.c +++ b/drivers/serial/uart_mcux_lpuart.c @@ -1515,7 +1515,7 @@ static DEVICE_API(uart, mcux_lpuart_driver_api) = { static const struct mcux_lpuart_config mcux_lpuart_##n##_config = { \ .base = (LPUART_Type *) DT_INST_REG_ADDR(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .baud_rate = DT_INST_PROP(n, current_speed), \ .flow_ctrl = FLOW_CONTROL(n), \ .parity = DT_INST_ENUM_IDX(n, parity), \ @@ -1534,6 +1534,7 @@ static const struct mcux_lpuart_config mcux_lpuart_##n##_config = { \ \ static struct mcux_lpuart_data mcux_lpuart_##n##_data; \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ PINCTRL_DT_INST_DEFINE(n); \ MCUX_LPUART_IRQ_DEFINE(n) \ \ diff --git a/drivers/spi/spi_mcux_dspi.c b/drivers/spi/spi_mcux_dspi.c index 7cbb6f12b6bf0..e6e66cfcff3d1 100644 --- a/drivers/spi/spi_mcux_dspi.c +++ b/drivers/spi/spi_mcux_dspi.c @@ -894,6 +894,7 @@ static DEVICE_API(spi, spi_mcux_driver_api) = { #define SPI_MCUX_DSPI_DEVICE(id) \ PINCTRL_DT_INST_DEFINE(id); \ static void spi_mcux_config_func_##id(const struct device *dev);\ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ TX_BUFFER(id); \ RX_BUFFER(id); \ static struct spi_mcux_data spi_mcux_data_##id = { \ @@ -906,7 +907,7 @@ static DEVICE_API(spi, spi_mcux_driver_api) = { .base = (SPI_Type *)DT_INST_REG_ADDR(id), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(id, name), \ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks), \ .irq_config_func = spi_mcux_config_func_##id, \ .pcs_sck_delay = \ DT_INST_PROP_OR(id, pcs_sck_delay, 0), \ diff --git a/drivers/spi/spi_mcux_ecspi.c b/drivers/spi/spi_mcux_ecspi.c index 8138e7fdc2a7e..ea676c9456192 100644 --- a/drivers/spi/spi_mcux_ecspi.c +++ b/drivers/spi/spi_mcux_ecspi.c @@ -317,13 +317,14 @@ static DEVICE_API(spi, spi_mcux_driver_api) = { #define SPI_MCUX_ECSPI_INIT(n) \ PINCTRL_DT_INST_DEFINE(n); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static void spi_mcux_config_func_##n(const struct device *dev); \ \ static const struct spi_mcux_config spi_mcux_config_##n = { \ .base = (ECSPI_Type *) DT_INST_REG_ADDR(n), \ .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = spi_mcux_config_func_##n, \ }; \ \ diff --git a/drivers/spi/spi_mcux_flexcomm.c b/drivers/spi/spi_mcux_flexcomm.c index 9edafe02096c7..a208efaa2ce91 100644 --- a/drivers/spi/spi_mcux_flexcomm.c +++ b/drivers/spi/spi_mcux_flexcomm.c @@ -946,12 +946,13 @@ static DEVICE_API(spi, spi_mcux_driver_api) = { #define SPI_MCUX_FLEXCOMM_DEVICE(id) \ SPI_MCUX_FLEXCOMM_IRQ_HANDLER_DECL(id); \ PINCTRL_DT_INST_DEFINE(id); \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(id, clocks); \ static const struct spi_mcux_config spi_mcux_config_##id = { \ .base = \ (SPI_Type *)DT_INST_REG_ADDR(id), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(id)), \ .clock_subsys = \ - (clock_control_subsys_t)DT_INST_CLOCKS_CELL(id, name),\ + CLOCK_CONTROL_DT_SPEC_INST_GET(id, clocks), \ SPI_MCUX_FLEXCOMM_IRQ_HANDLER_FUNC(id) \ .pre_delay = DT_INST_PROP_OR(id, pre_delay, 0), \ .post_delay = DT_INST_PROP_OR(id, post_delay, 0), \ diff --git a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h index 2f0d24238ce5d..80b9cd10db5dd 100644 --- a/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h +++ b/drivers/spi/spi_nxp_lpspi/spi_nxp_lpspi_priv.h @@ -93,9 +93,10 @@ int lpspi_wait_tx_fifo_empty(const struct device *dev); #define SPI_LPSPI_CONFIG_INIT(n) \ static const struct lpspi_config lpspi_config_##n = { \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ DEVICE_MMIO_NAMED_ROM_INIT(reg_base, DT_DRV_INST(n)), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name), \ + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .irq_config_func = lpspi_config_func_##n, \ .pcs_sck_delay = DT_INST_PROP_OR(n, pcs_sck_delay, 0), \ .sck_pcs_delay = DT_INST_PROP_OR(n, sck_pcs_delay, 0), \ diff --git a/drivers/video/video_mcux_mipi_csi2rx.c b/drivers/video/video_mcux_mipi_csi2rx.c index 5ff096437ca4b..e72a334a6d590 100644 --- a/drivers/video/video_mcux_mipi_csi2rx.c +++ b/drivers/video/video_mcux_mipi_csi2rx.c @@ -312,12 +312,14 @@ static int mipi_csi2rx_init(const struct device *dev) #define SOURCE_DEV(n) DEVICE_DT_GET(DT_NODE_REMOTE_DEVICE(DT_INST_ENDPOINT_BY_ID(n, 1, 0))) #define MIPI_CSI2RX_INIT(n) \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ + \ static struct mipi_csi2rx_data mipi_csi2rx_data_##n = { \ .csi2rxConfig.laneNum = DT_PROP_LEN(DT_INST_ENDPOINT_BY_ID(n, 1, 0), data_lanes), \ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ - .clock_root = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(n, 0, name), \ - .clock_ui = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(n, 1, name), \ - .clock_esc = (clock_control_subsys_t)DT_INST_CLOCKS_CELL_BY_IDX(n, 2, name), \ + .clock_root = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks, 0), \ + .clock_ui = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks, 1), \ + .clock_esc = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks, 2), \ }; \ \ static const struct mipi_csi2rx_config mipi_csi2rx_config_##n = { \ diff --git a/drivers/watchdog/wdt_mcux_rtwdog.c b/drivers/watchdog/wdt_mcux_rtwdog.c index 57a026917dc3a..130024862542f 100644 --- a/drivers/watchdog/wdt_mcux_rtwdog.c +++ b/drivers/watchdog/wdt_mcux_rtwdog.c @@ -202,6 +202,7 @@ static DEVICE_API(wdt, mcux_rtwdog_api) = { #define MCUX_RTWDOG_INIT(n) \ \ + CLOCK_CONTROL_DT_SPEC_INST_DEFINE(n, clocks); \ static struct mcux_rtwdog_data mcux_rtwdog_data_##n; \ static void mcux_rtwdog_config_func_##n(const struct device *dev); \ \ @@ -209,7 +210,7 @@ static DEVICE_API(wdt, mcux_rtwdog_api) = { .base = (RTWDOG_Type *)DT_INST_REG_ADDR(n), \ .irq_config_func = mcux_rtwdog_config_func_##n, \ .clock_frequency = DT_INST_PROP_BY_PHANDLE(n, clocks, clock_frequency), \ - .clk_source = TO_RTWDOG_CLK_SRC(DT_INST_PROP(n, clk_source)), \ + .clk_source = CLOCK_CONTROL_DT_SPEC_INST_GET(n, clocks), \ .clk_divider = TO_RTWDOG_CLK_DIV(DT_INST_PROP(n, clk_divider)), \ }; \ static void mcux_rtwdog_config_func_##n(const struct device *dev) \ diff --git a/drivers/watchdog/wdt_mcux_wdog.c b/drivers/watchdog/wdt_mcux_wdog.c index 5a18f46a4f620..22dd89b0252f7 100644 --- a/drivers/watchdog/wdt_mcux_wdog.c +++ b/drivers/watchdog/wdt_mcux_wdog.c @@ -165,11 +165,12 @@ static DEVICE_API(wdt, mcux_wdog_api) = { static void mcux_wdog_config_func_0(const struct device *dev); +CLOCK_CONTROL_DT_SPEC_INST_DEFINE(0, clocks); + static const struct mcux_wdog_config mcux_wdog_config_0 = { .base = (WDOG_Type *) DT_INST_REG_ADDR(0), .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(0)), - .clock_subsys = (clock_control_subsys_t) - DT_INST_CLOCKS_CELL(0, name), + .clock_subsys = CLOCK_CONTROL_DT_SPEC_INST_GET(0, clocks), .irq_config_func = mcux_wdog_config_func_0, }; diff --git a/drivers/watchdog/wdt_mcux_wdog32.c b/drivers/watchdog/wdt_mcux_wdog32.c index d38fe0e122e63..f9539ca88909b 100644 --- a/drivers/watchdog/wdt_mcux_wdog32.c +++ b/drivers/watchdog/wdt_mcux_wdog32.c @@ -190,6 +190,8 @@ static DEVICE_API(wdt, mcux_wdog32_api) = { static void mcux_wdog32_config_func_0(const struct device *dev); +CLOCK_CONTROL_DT_SPEC_INST_DEFINE(0, clocks); + static const struct mcux_wdog32_config mcux_wdog32_config_0 = { .base = (WDOG_Type *) DT_INST_REG_ADDR(0), #if DT_NODE_HAS_PROP(DT_INST_PHANDLE(0, clocks), clock_frequency) @@ -197,7 +199,7 @@ static const struct mcux_wdog32_config mcux_wdog32_config_0 = { #else /* !DT_NODE_HAS_PROP(DT_INST_PHANDLE(0, clocks), clock_frequency) */ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(0)), .clock_subsys = (clock_control_subsys_t) - DT_INST_CLOCKS_CELL(0, name), + CLOCK_CONTROL_DT_SPEC_INST_GET(0, clocks), #endif /* DT_NODE_HAS_PROP(DT_INST_PHANDLE(0, clocks), clock_frequency) */ .clk_source = TO_WDOG32_CLK_SRC(DT_INST_PROP(0, clk_source)), diff --git a/include/zephyr/drivers/clock_control.h b/include/zephyr/drivers/clock_control.h index d09daf9638604..323986618e5df 100644 --- a/include/zephyr/drivers/clock_control.h +++ b/include/zephyr/drivers/clock_control.h @@ -31,6 +31,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -51,6 +52,28 @@ enum clock_control_status { CLOCK_CONTROL_STATUS_UNKNOWN }; +/** @cond INTERNAL_HIDDEN */ + +/* This is a useful way to encode opaque data, this is private structure not part of API */ +struct clock_control_dt_spec { + uint32_t *cells; /* the cells in the DT phandle specifier */ + size_t len; /* the number of cells in the DT phandle specifier */ +}; + +#define ZPRIV_CLOCK_CONTROL_DT_DEFINE(node_id, prop, idx) \ + static uint32_t _CONCAT_6(zpriv_clock_control_cells_, node_id, _, prop, _, idx) = { \ + DT_FOREACH_PHA_CELL_BY_IDX_SEP(node_id, prop, idx, DT_PHA_BY_IDX, (,)) \ + }; \ + static struct clock_control_dt_spec \ + _CONCAT_6(zpriv_clock_control_, node_id, _, prop, _, idx) = { \ + .cells = \ + &(_CONCAT_6(zpriv_clock_control_cells_, node_id, _, prop, _, idx)), \ + .len = DT_PHA_NUM_CELLS_BY_IDX(node_id, prop, idx), \ + } /* intentionally require semicolon */ + +/** @endcond */ + + /** * clock_control_subsys_t is a type to identify a clock controller sub-system. * Such data pointed is opaque and relevant only to the clock controller @@ -66,6 +89,170 @@ typedef void *clock_control_subsys_t; */ typedef void *clock_control_subsys_rate_t; + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree + * + * This returns a static initializer for a @p clock_control_subsys_t value given a devicetree node + * identifier, a property specifying a clock controller and an index into that property. + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + * @param idx logical index into "prop" + */ +#define CLOCK_CONTROL_DT_SPEC_DEFINE_BY_IDX(node_id, prop, idx) \ + ZPRIV_CLOCK_CONTROL_DT_DEFINE(node_id, prop, idx) + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree + * + * This returns a static initializer for a @p clock_control_subsys_t value given a devicetree node + * identifier, a property specifying a clock controller and a name of a specifier in that property. + * Property must have clock-names. + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + * @param name lowercase-and-underscores name of a specifier in "prop" + */ +#define CLOCK_CONTROL_DT_SPEC_DEFINE_BY_NAME(node_id, prop, name) \ + ZPRIV_CLOCK_CONTROL_DT_DEFINE(node_id, prop, DT_PHA_ELEM_IDX_BY_NAME(node_id, prop, name)) + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree + * + * This returns a static initializer for a @p clock_control_subsys_t value given a devicetree node + * identifier and a property specifying a clock controller. + * + * This is equivalent to CLOCK_CONTROL_DT_SPEC_DEFINE_BY_IDX(node_id, prop, 0). + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + */ +#define CLOCK_CONTROL_DT_SPEC_DEFINE(node_id, prop) \ + ZPRIV_CLOCK_CONTROL_DT_DEFINE(node_id, prop, 0) + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_DEFINE_BY_IDX(DT_DRV_INST(inst), prop, idx). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + * @param idx logical index into "prop" + */ +#define CLOCK_CONTROL_DT_SPEC_INST_DEFINE_BY_IDX(inst, prop, idx) \ + CLOCK_CONTROL_DT_SPEC_DEFINE_BY_IDX(DT_DRV_INST(inst), prop, idx) + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_DEFINE_BY_NAME(DT_DRV_INST(inst), prop, name). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + * @param name lowercase-and-underscores name of a specifier in "prop" + */ +#define CLOCK_CONTROL_DT_SPEC_INST_DEFINE_BY_NAME(inst, prop, name) \ + CLOCK_CONTROL_DT_SPEC_DEFINE_BY_NAME(DT_DRV_INST(inst), prop, name) + +/** + * @brief Static initializer for a @p clock_control_subsys_t from devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_DEFINE(DT_DRV_INST(inst), prop). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + */ +#define CLOCK_CONTROL_DT_SPEC_INST_DEFINE(inst, prop) \ + CLOCK_CONTROL_DT_SPEC_DEFINE(DT_DRV_INST(inst), prop) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree node + * + * This returns a @p clock_control_subsys_t for the clock controller phandle at + * index "idx". + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + * @param idx logical index into "prop" + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_GET_BY_IDX(node_id, prop, idx) \ + (clock_control_subsys_t) &(_CONCAT_6(zpriv_clock_control_, node_id, _, prop, _, idx)) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree node + * + * This returns a @p clock_control_subsys_t for the clock controller phandle at + * the element named "name". Property must have clock-names. + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + * @param name lowercase-and-underscores name of a specifier in "prop" + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_GET_BY_NAME(node_id, prop, name) \ + CLOCK_CONTROL_DT_SPEC_GET_BY_IDX(node_id, prop, \ + DT_PHA_ELEM_IDX_BY_NAME(node_id, prop, name)) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree node + * + * This returns a @p clock_control_subsys_t for the clock controller phandle at + * index 0. + * + * @param node_id devicetree node identifier + * @param prop lowercase-and-underscores property name + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_GET(node_id, prop) \ + CLOCK_CONTROL_DT_SPEC_GET_BY_IDX(node_id, prop, 0) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), prop, idx). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + * @param idx logical index into "prop" + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_INST_GET_BY_IDX(inst, prop, idx) \ + CLOCK_CONTROL_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), prop, idx) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_GET_BY_NAME(DT_DRV_INST(inst), prop, name). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + * @param name lowercase-and-underscores name of a specifier in "prop" + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_INST_GET_BY_NAME(inst, prop, name) \ + CLOCK_CONTROL_DT_SPEC_GET_BY_NAME(DT_DRV_INST(inst), prop, name) + +/** + * @brief Get a @p clock_control_subsys_t for a devicetree instance + * + * This is equivalent to + * CLOCK_CONTROL_DT_SPEC_GET(DT_DRV_INST(inst), prop). + * + * @param inst DT_DRV_COMPAT instance number + * @param prop lowercase-and-underscores property name + * @return clock_control_subsys_t with the given information + */ +#define CLOCK_CONTROL_DT_SPEC_INST_GET(inst, prop) \ + CLOCK_CONTROL_DT_SPEC_GET(DT_DRV_INST(inst), prop) + + /** @brief Callback called on clock started. * * @param dev Device structure whose driver controls the clock.