diff --git a/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0-pinctrl.dtsi b/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0-pinctrl.dtsi index ebb531a862931..58f375169b03e 100644 --- a/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0-pinctrl.dtsi +++ b/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0-pinctrl.dtsi @@ -25,6 +25,38 @@ pinmux = ; }; + main_adc0_ain0: adc0_ain0_default { + pinmux = ; + }; + + main_adc0_ain1: adc0_ain1_default { + pinmux = ; + }; + + main_adc0_ain2: adc0_ain2_default { + pinmux = ; + }; + + main_adc0_ain3: adc0_ain3_default { + pinmux = ; + }; + + main_adc0_ain4: adc0_ain4_default { + pinmux = ; + }; + + main_adc0_ain5: adc0_ain5_default { + pinmux = ; + }; + + main_adc0_ain6: adc0_ain6_default { + pinmux = ; + }; + + main_adc0_ain7: adc0_ain7_default { + pinmux = ; + }; + spi0_cs0: spi0_cs0_default { pinmux = ; }; diff --git a/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0.dts b/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0.dts index b498b214c257b..abd22caa4efda 100644 --- a/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0.dts +++ b/boards/ti/am243x_evm/am243x_evm_am2434_r5f0_0.dts @@ -24,7 +24,6 @@ aliases { led0 = &ld26; - adc0 = &main_adc0; }; leds: leds { @@ -97,90 +96,12 @@ }; &main_adc0 { - ti,vrefp = <1800>; ti,fifo = <0>; + pinctrl-0 = <&main_adc0_ain0 &main_adc0_ain1 &main_adc0_ain2 &main_adc0_ain3 + &main_adc0_ain4 &main_adc0_ain5 &main_adc0_ain6 &main_adc0_ain7>; + pinctrl-names = "default"; status = "okay"; power-domains = <&adc0_pd>; - - channel@0 { - reg = <0>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@1 { - reg = <1>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@2 { - reg = <2>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@3 { - reg = <3>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@4 { - reg = <4>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@5 { - reg = <5>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@6 { - reg = <6>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; - - channel@7 { - reg = <7>; - ti,open-delay = <0>; - zephyr,gain = "ADC_GAIN_1"; - zephyr,reference = "ADC_REF_INTERNAL"; - zephyr,acquisition-time = <0>; - zephyr,resolution = <12>; - zephyr,oversampling = <4>; - }; }; &main_mbox6 { diff --git a/drivers/adc/adc_ti_am335x.c b/drivers/adc/adc_ti_am335x.c index 80cd63b60c619..c92155e43bba2 100644 --- a/drivers/adc/adc_ti_am335x.c +++ b/drivers/adc/adc_ti_am335x.c @@ -8,6 +8,7 @@ #include #include #include +#include #define ADC_CONTEXT_USES_KERNEL_TIMER #include "adc_context.h" @@ -97,6 +98,7 @@ enum ti_adc_irq { struct ti_adc_cfg { DEVICE_MMIO_ROM; + const struct pinctrl_dev_config *pinctrl; void (*irq_func)(const struct device *dev); uint32_t open_delay[TI_ADC_TOTAL_CHANNELS]; uint8_t oversampling[TI_ADC_TOTAL_CHANNELS]; @@ -186,6 +188,11 @@ static int ti_adc_channel_setup(const struct device *dev, const struct adc_chann return -EINVAL; } + if (chan_cfg->reference != ADC_REF_VDD_1) { + LOG_ERR("Invalid channel reference"); + return -EINVAL; + } + if (chan_cfg->gain != ADC_GAIN_1) { LOG_ERR("Gain must be 1x"); return -EINVAL; @@ -288,10 +295,19 @@ static int ti_adc_init(const struct device *dev) { const struct ti_adc_cfg *cfg = DEV_CFG(dev); struct ti_adc_data *data = DEV_DATA(dev); - struct ti_adc_regs *regs = DEV_REGS(dev); + struct ti_adc_regs *regs; + int ret; DEVICE_MMIO_MAP(dev, K_MEM_CACHE_NONE); + regs = DEV_REGS(dev); + + ret = pinctrl_apply_state(cfg->pinctrl, PINCTRL_STATE_DEFAULT); + if (ret < 0) { + LOG_ERR("failed to apply pinctrl"); + return ret; + } + cfg->irq_func(dev); if (cfg->fifo == 0) { @@ -370,13 +386,16 @@ static void ti_adc_isr(const struct device *dev) #define CHAN_PROP_LIST(n, prop) {DT_INST_FOREACH_CHILD_SEP_VARGS(n, EXPLICIT_CHAN_PROP, (,), prop)} +static DEVICE_API(adc, ti_adc_driver_api) = { + .channel_setup = ti_adc_channel_setup, + .read = ti_adc_read, +#ifdef CONFIG_ADC_ASYNC + .read_async = ti_adc_read_async, +#endif /* CONFIG_ADC_ASYNC */ +}; + #define TI_ADC_INIT(n) \ - static DEVICE_API(adc, ti_adc_driver_api_##n) = { \ - .channel_setup = ti_adc_channel_setup, \ - .read = ti_adc_read, \ - .ref_internal = DT_INST_PROP(n, ti_vrefp), \ - IF_ENABLED(CONFIG_ADC_ASYNC, (.read_async = ti_adc_read_async,)) }; \ - \ + PINCTRL_DT_INST_DEFINE(n); \ static void ti_adc_irq_setup_##n(const struct device *dev) \ { \ IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), ti_adc_isr, \ @@ -386,6 +405,7 @@ static void ti_adc_isr(const struct device *dev) \ static const struct ti_adc_cfg ti_adc_cfg_##n = { \ DEVICE_MMIO_ROM_INIT(DT_DRV_INST(n)), \ + .pinctrl = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \ .irq_func = &ti_adc_irq_setup_##n, \ .open_delay = CHAN_PROP_LIST(n, ti_open_delay), \ .oversampling = CHAN_PROP_LIST(n, zephyr_oversampling), \ @@ -400,6 +420,6 @@ static void ti_adc_isr(const struct device *dev) }; \ \ DEVICE_DT_INST_DEFINE(n, ti_adc_init, NULL, &ti_adc_data_##n, &ti_adc_cfg_##n, \ - POST_KERNEL, CONFIG_ADC_INIT_PRIORITY, &ti_adc_driver_api_##n); + POST_KERNEL, CONFIG_ADC_INIT_PRIORITY, &ti_adc_driver_api); DT_INST_FOREACH_STATUS_OKAY(TI_ADC_INIT) diff --git a/dts/bindings/adc/ti,am335x-adc.yaml b/dts/bindings/adc/ti,am335x-adc.yaml index d9ef025c4c7a7..be86f00ac554e 100644 --- a/dts/bindings/adc/ti,am335x-adc.yaml +++ b/dts/bindings/adc/ti,am335x-adc.yaml @@ -6,17 +6,12 @@ description: TI AM335X ADC compatible: "ti,am335x-adc" -include: [adc-controller.yaml] +include: [adc-controller.yaml, pinctrl-device.yaml] properties: interrupts: required: true - ti,vrefp: - type: int - required: true - description: Reference Voltage (in mV) - ti,fifo: type: int required: true diff --git a/samples/drivers/adc/adc_dt/boards/am243x_evm_am2434_r5f0_0.overlay b/samples/drivers/adc/adc_dt/boards/am243x_evm_am2434_r5f0_0.overlay index 5d8dccf46af83..2defbeb90bd61 100644 --- a/samples/drivers/adc/adc_dt/boards/am243x_evm_am2434_r5f0_0.overlay +++ b/samples/drivers/adc/adc_dt/boards/am243x_evm_am2434_r5f0_0.overlay @@ -6,7 +6,30 @@ / { zephyr,user { - io-channels = <&adc0 0>, <&adc0 1>, <&adc0 2>, <&adc0 3>, <&adc0 4>, <&adc0 5>, - <&adc0 6>, <&adc0 7>; + io-channels = <&main_adc0 0>, <&main_adc0 7>; + }; +}; + +&main_adc0 { + channel@0 { + reg = <0>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@7 { + reg = <7>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; }; }; diff --git a/samples/drivers/adc/adc_sequence/boards/am243x_evm_am2434_r5f0_0.overlay b/samples/drivers/adc/adc_sequence/boards/am243x_evm_am2434_r5f0_0.overlay new file mode 100644 index 0000000000000..20658cd92aa18 --- /dev/null +++ b/samples/drivers/adc/adc_sequence/boards/am243x_evm_am2434_r5f0_0.overlay @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2025 Texas Instruments + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + adc0 = &main_adc0; + }; +}; + +&main_adc0 { + channel@0 { + reg = <0>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@1 { + reg = <1>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@2 { + reg = <2>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@3 { + reg = <3>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@4 { + reg = <4>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@5 { + reg = <5>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@6 { + reg = <6>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; + + channel@7 { + reg = <7>; + ti,open-delay = <0>; + zephyr,gain = "ADC_GAIN_1"; + zephyr,reference = "ADC_REF_VDD_1"; + zephyr,acquisition-time = <0>; + zephyr,resolution = <12>; + zephyr,oversampling = <4>; + zephyr,vref-mv = <1800>; + }; +};