diff --git a/drivers/adc/Kconfig.mcux b/drivers/adc/Kconfig.mcux index 23415ee2d3a..a458bd37681 100644 --- a/drivers/adc/Kconfig.mcux +++ b/drivers/adc/Kconfig.mcux @@ -12,6 +12,7 @@ config ADC_MCUX_ADC12 config ADC_MCUX_ADC16 bool "MCUX ADC16 driver" depends on HAS_MCUX_ADC16 + select PINCTRL help Enable the MCUX ADC16 driver. diff --git a/drivers/adc/adc_mcux_adc16.c b/drivers/adc/adc_mcux_adc16.c index e85b6e24135..c1fb624ffda 100644 --- a/drivers/adc/adc_mcux_adc16.c +++ b/drivers/adc/adc_mcux_adc16.c @@ -8,6 +8,7 @@ #include #include +#include #ifdef CONFIG_ADC_MCUX_ADC16_ENABLE_EDMA #include #include @@ -42,6 +43,7 @@ struct mcux_adc16_config { bool channel_mux_b; bool high_speed; /* ADC enable high speed mode*/ bool continuous_convert; /* ADC enable continuous convert*/ + const struct pinctrl_dev_config *pincfg; }; #ifdef CONFIG_ADC_MCUX_ADC16_ENABLE_EDMA @@ -322,6 +324,7 @@ static int mcux_adc16_init(const struct device *dev) struct mcux_adc16_data *data = dev->data; ADC_Type *base = config->base; adc16_config_t adc_config; + int err; LOG_DBG("init adc"); ADC16_GetDefaultConfig(&adc_config); @@ -366,6 +369,11 @@ static int mcux_adc16_init(const struct device *dev) ADC16_EnableHardwareTrigger(base, false); } + err = pinctrl_apply_state(config->pincfg, PINCTRL_STATE_DEFAULT); + if (err != 0) { + return err; + } + data->dev = dev; /* dma related init */ @@ -427,66 +435,23 @@ static const struct adc_driver_api mcux_adc16_driver_api = { }; #ifdef CONFIG_ADC_MCUX_ADC16_ENABLE_EDMA -#define ACD16_MCUX_INIT(n) \ - static const struct mcux_adc16_config mcux_adc16_config_##n = { \ - .base = (ADC_Type *)DT_INST_REG_ADDR(n), \ - .channel_mux_b = DT_INST_PROP(n, channel_mux_b), \ - .clk_source = DT_INST_PROP_OR(n, clk_source, 0), \ - .long_sample = DT_INST_PROP_OR(n, long_sample, 0), \ - .high_speed = DT_INST_PROP(n, high_speed), \ - .periodic_trigger = DT_INST_PROP(n, periodic_trigger), \ - .continuous_convert = \ - DT_INST_PROP(n, continuous_convert), \ - .hw_trigger_src = \ - DT_INST_PROP_OR(n, hw_trigger_src, 0), \ - .dma_slot = DT_INST_DMAS_CELL_BY_IDX(n, 0, source), \ - .trg_offset = DT_INST_CLOCKS_CELL_BY_IDX(n, 0, offset), \ - .trg_bits = DT_INST_CLOCKS_CELL_BY_IDX(n, 0, bits), \ - .alt_offset = DT_INST_CLOCKS_CELL_BY_IDX(n, 1, offset), \ - .alt_bits = DT_INST_CLOCKS_CELL_BY_IDX(n, 1, bits), \ - }; \ - \ - static struct mcux_adc16_data mcux_adc16_data_##n = { \ - ADC_CONTEXT_INIT_TIMER(mcux_adc16_data_##n, ctx), \ - ADC_CONTEXT_INIT_LOCK(mcux_adc16_data_##n, ctx), \ - ADC_CONTEXT_INIT_SYNC(mcux_adc16_data_##n, ctx), \ - .dev_dma = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, adc##n)), \ - }; \ - \ - DEVICE_DT_INST_DEFINE(n, &mcux_adc16_init, \ - NULL, \ - &mcux_adc16_data_##n, \ - &mcux_adc16_config_##n, \ - POST_KERNEL, \ - CONFIG_ADC_INIT_PRIORITY, \ - &mcux_adc16_driver_api); +#define ADC16_MCUX_EDMA_INIT(n) \ + .hw_trigger_src = \ + DT_INST_PROP_OR(n, hw_trigger_src, 0), \ + .dma_slot = DT_INST_DMAS_CELL_BY_IDX(n, 0, source), \ + .trg_offset = DT_INST_CLOCKS_CELL_BY_IDX(n, 0, offset), \ + .trg_bits = DT_INST_CLOCKS_CELL_BY_IDX(n, 0, bits), \ + .alt_offset = DT_INST_CLOCKS_CELL_BY_IDX(n, 1, offset), \ + .alt_bits = DT_INST_CLOCKS_CELL_BY_IDX(n, 1, bits), +#define ADC16_MCUX_EDMA_DATA(n) \ + .dev_dma = DEVICE_DT_GET(DT_INST_DMAS_CTLR_BY_NAME(n, adc##n)) +#define ADC16_MCUX_IRQ_INIT(n) +#define ADC16_MCUX_IRQ_DECLARE(n) #else -#define ACD16_MCUX_INIT(n) \ - static void mcux_adc16_config_func_##n(const struct device *dev); \ - static const struct mcux_adc16_config mcux_adc16_config_##n = { \ - .base = (ADC_Type *)DT_INST_REG_ADDR(n), \ - .irq_config_func = mcux_adc16_config_func_##n, \ - .channel_mux_b = DT_INST_PROP(n, channel_mux_b), \ - .clk_source = DT_INST_PROP_OR(n, clk_source, 0), \ - .long_sample = DT_INST_PROP_OR(n, long_sample, 0), \ - .high_speed = DT_INST_PROP(n, high_speed), \ - .continuous_convert = \ - DT_INST_PROP(n, continuous_convert), \ - }; \ - static struct mcux_adc16_data mcux_adc16_data_##n = { \ - ADC_CONTEXT_INIT_TIMER(mcux_adc16_data_##n, ctx), \ - ADC_CONTEXT_INIT_LOCK(mcux_adc16_data_##n, ctx), \ - ADC_CONTEXT_INIT_SYNC(mcux_adc16_data_##n, ctx), \ - }; \ - \ - DEVICE_DT_INST_DEFINE(n, &mcux_adc16_init, \ - NULL, \ - &mcux_adc16_data_##n, \ - &mcux_adc16_config_##n, \ - POST_KERNEL, \ - CONFIG_ADC_INIT_PRIORITY, \ - &mcux_adc16_driver_api); \ - \ +#define ADC16_MCUX_EDMA_INIT(n) +#define ADC16_MCUX_EDMA_DATA(n) +#define ADC16_MCUX_IRQ_INIT(n) .irq_config_func = mcux_adc16_config_func_##n, +#define ADC16_MCUX_IRQ_DECLARE(n) \ static void mcux_adc16_config_func_##n(const struct device *dev) \ { \ IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), \ @@ -495,6 +460,40 @@ static const struct adc_driver_api mcux_adc16_driver_api = { \ irq_enable(DT_INST_IRQN(n)); \ } -#endif +#endif /* CONFIG_ADC_MCUX_ADC16_ENABLE_EDMA */ + + +#define ACD16_MCUX_INIT(n) \ + ADC16_MCUX_IRQ_DECLARE(n) \ + PINCTRL_DT_INST_DEFINE(n); \ + \ + static const struct mcux_adc16_config mcux_adc16_config_##n = { \ + .base = (ADC_Type *)DT_INST_REG_ADDR(n), \ + ADC16_MCUX_IRQ_INIT(n) \ + .channel_mux_b = DT_INST_PROP(n, channel_mux_b), \ + .clk_source = DT_INST_PROP_OR(n, clk_source, 0), \ + .long_sample = DT_INST_PROP_OR(n, long_sample, 0), \ + .high_speed = DT_INST_PROP(n, high_speed), \ + .periodic_trigger = DT_INST_PROP(n, periodic_trigger), \ + .pincfg = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ + .continuous_convert = \ + DT_INST_PROP(n, continuous_convert), \ + ADC16_MCUX_EDMA_INIT(n) \ + }; \ + \ + static struct mcux_adc16_data mcux_adc16_data_##n = { \ + ADC_CONTEXT_INIT_TIMER(mcux_adc16_data_##n, ctx), \ + ADC_CONTEXT_INIT_LOCK(mcux_adc16_data_##n, ctx), \ + ADC_CONTEXT_INIT_SYNC(mcux_adc16_data_##n, ctx), \ + ADC16_MCUX_EDMA_DATA(n) \ + }; \ + \ + DEVICE_DT_INST_DEFINE(n, &mcux_adc16_init, \ + NULL, \ + &mcux_adc16_data_##n, \ + &mcux_adc16_config_##n, \ + POST_KERNEL, \ + CONFIG_ADC_INIT_PRIORITY, \ + &mcux_adc16_driver_api); \ DT_INST_FOREACH_STATUS_OKAY(ACD16_MCUX_INIT) diff --git a/dts/bindings/adc/nxp,kinetis-adc16.yaml b/dts/bindings/adc/nxp,kinetis-adc16.yaml index 8558374c349..897cee4622a 100644 --- a/dts/bindings/adc/nxp,kinetis-adc16.yaml +++ b/dts/bindings/adc/nxp,kinetis-adc16.yaml @@ -5,7 +5,7 @@ description: Kinetis ADC16 compatible: "nxp,kinetis-adc16" -include: adc-controller.yaml +include: ["adc-controller.yaml", "pinctrl-device.yaml"] properties: reg: