diff --git a/doc/kernel/drivers/index.rst b/doc/kernel/drivers/index.rst index c1571edff32e3..91255fa347bd5 100644 --- a/doc/kernel/drivers/index.rst +++ b/doc/kernel/drivers/index.rst @@ -61,6 +61,8 @@ High-level calls accessed through device-specific APIs, such as :file:`i2c.h` or :file:`spi.h`, are usually intended as synchronous. Thus, these calls should be blocking. +.. _device_driver_api: + Driver APIs *********** diff --git a/doc/releases/migration-guide-4.1.rst b/doc/releases/migration-guide-4.1.rst index 7a11cc4886f83..cee17d9dd8ab7 100644 --- a/doc/releases/migration-guide-4.1.rst +++ b/doc/releases/migration-guide-4.1.rst @@ -57,6 +57,13 @@ LVGL Device Drivers and Devicetree ***************************** +* Device driver APIs are placed into iterable sections (:github:`71773`) to allow for runtime + checking. See :ref:`device_driver_api` for more details. + The :c:macro:`DEVICE_API()` macro should be used by out-of-tree driver implementations for + the following driver classes: + + * :c:struct:`adc_driver_api` + Controller Area Network (CAN) ============================= diff --git a/drivers/adc/adc_ad559x.c b/drivers/adc/adc_ad559x.c index fdde4bb012403..ccb5860c527c0 100644 --- a/drivers/adc/adc_ad559x.c +++ b/drivers/adc/adc_ad559x.c @@ -297,7 +297,7 @@ static int adc_ad559x_init(const struct device *dev) #endif #define ADC_AD559X_DRIVER_API(inst) \ - static const struct adc_driver_api adc_ad559x_api##inst = { \ + static DEVICE_API(adc, adc_ad559x_api##inst) = { \ .channel_setup = adc_ad559x_channel_setup, \ .read = adc_ad559x_read, \ .ref_internal = AD559X_ADC_VREF_MV * (1 + DT_INST_PROP(inst, double_input_range)), \ diff --git a/drivers/adc/adc_ads1112.c b/drivers/adc/adc_ads1112.c index ecf8ddf469d9a..42fa391fd119d 100644 --- a/drivers/adc/adc_ads1112.c +++ b/drivers/adc/adc_ads1112.c @@ -379,7 +379,7 @@ static int ads1112_init(const struct device *dev) return rc; } -static const struct adc_driver_api api = { +static DEVICE_API(adc, api) = { .channel_setup = ads1112_channel_setup, .read = ads1112_read, .ref_internal = ADS1112_REF_INTERNAL, diff --git a/drivers/adc/adc_ads1119.c b/drivers/adc/adc_ads1119.c index 638b83fc2b2a9..ef4b84b70fa4c 100644 --- a/drivers/adc/adc_ads1119.c +++ b/drivers/adc/adc_ads1119.c @@ -481,7 +481,7 @@ static int ads1119_init(const struct device *dev) return rc; } -static const struct adc_driver_api api = { +static DEVICE_API(adc, api) = { .channel_setup = ads1119_channel_setup, .read = ads1119_read, .ref_internal = ADS1119_REF_INTERNAL, diff --git a/drivers/adc/adc_ads114s0x.c b/drivers/adc/adc_ads114s0x.c index 9864fd689f46d..36e3eaefac4af 100644 --- a/drivers/adc/adc_ads114s0x.c +++ b/drivers/adc/adc_ads114s0x.c @@ -1472,7 +1472,7 @@ static int ads114s0x_init(const struct device *dev) return result; } -static const struct adc_driver_api api = { +static DEVICE_API(adc, api) = { .channel_setup = ads114s0x_channel_setup, .read = ads114s0x_read, .ref_internal = ADS114S0X_REF_INTERNAL, diff --git a/drivers/adc/adc_ads1x1x.c b/drivers/adc/adc_ads1x1x.c index 0502eb0c8780a..f984de435b99b 100644 --- a/drivers/adc/adc_ads1x1x.c +++ b/drivers/adc/adc_ads1x1x.c @@ -786,7 +786,7 @@ static int ads1x1x_init(const struct device *dev) return 0; } -static const struct adc_driver_api ads1x1x_api = { +static DEVICE_API(adc, ads1x1x_api) = { .channel_setup = ads1x1x_channel_setup, .read = ads1x1x_read, .ref_internal = 2048, diff --git a/drivers/adc/adc_ads7052.c b/drivers/adc/adc_ads7052.c index c4ae2264e1e29..c86e2de8ea4f1 100644 --- a/drivers/adc/adc_ads7052.c +++ b/drivers/adc/adc_ads7052.c @@ -284,7 +284,7 @@ static int adc_ads7052_init(const struct device *dev) return 0; } -static const struct adc_driver_api ads7052_api = { +static DEVICE_API(adc, ads7052_api) = { .channel_setup = adc_ads7052_channel_setup, .read = adc_ads7052_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_ambiq.c b/drivers/adc/adc_ambiq.c index ce8ee479d16d4..66c40efac8369 100644 --- a/drivers/adc/adc_ambiq.c +++ b/drivers/adc/adc_ambiq.c @@ -386,7 +386,7 @@ static int adc_ambiq_pm_action(const struct device *dev, enum pm_device_action a #ifdef CONFIG_ADC_ASYNC #define ADC_AMBIQ_DRIVER_API(n) \ - static const struct adc_driver_api adc_ambiq_driver_api_##n = { \ + static DEVICE_API(adc, adc_ambiq_driver_api_##n) = { \ .channel_setup = adc_ambiq_channel_setup, \ .read = adc_ambiq_read, \ .read_async = adc_ambiq_read_async, \ @@ -394,7 +394,7 @@ static int adc_ambiq_pm_action(const struct device *dev, enum pm_device_action a }; #else #define ADC_AMBIQ_DRIVER_API(n) \ - static const struct adc_driver_api adc_ambiq_driver_api_##n = { \ + static DEVICE_API(adc, adc_ambiq_driver_api_##n) = { \ .channel_setup = adc_ambiq_channel_setup, \ .read = adc_ambiq_read, \ .ref_internal = DT_INST_PROP(n, internal_vref_mv), \ diff --git a/drivers/adc/adc_b91.c b/drivers/adc/adc_b91.c index 30e76c88a764a..1649730ccfd65 100644 --- a/drivers/adc/adc_b91.c +++ b/drivers/adc/adc_b91.c @@ -452,7 +452,7 @@ static const struct b91_adc_cfg cfg_0 = { .vref_internal_mv = DT_INST_PROP(0, vref_internal_mv), }; -static const struct adc_driver_api adc_b91_driver_api = { +static DEVICE_API(adc, adc_b91_driver_api) = { .channel_setup = adc_b91_channel_setup, .read = adc_b91_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_cc13xx_cc26xx.c b/drivers/adc/adc_cc13xx_cc26xx.c index b75aac176ad56..a46b1e1384957 100644 --- a/drivers/adc/adc_cc13xx_cc26xx.c +++ b/drivers/adc/adc_cc13xx_cc26xx.c @@ -274,7 +274,7 @@ static void adc_cc13xx_cc26xx_isr(const struct device *dev) adc_context_on_sampling_done(&data->ctx, dev); } -static const struct adc_driver_api cc13xx_cc26xx_driver_api = { +static DEVICE_API(adc, cc13xx_cc26xx_driver_api) = { .channel_setup = adc_cc13xx_cc26xx_channel_setup, .read = adc_cc13xx_cc26xx_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_cc32xx.c b/drivers/adc/adc_cc32xx.c index 3fff3b84e73fb..cdec99770a4e0 100644 --- a/drivers/adc/adc_cc32xx.c +++ b/drivers/adc/adc_cc32xx.c @@ -279,7 +279,7 @@ static void adc_cc32xx_isr_ch3(const struct device *dev) adc_cc32xx_isr(dev, 3); } -static const struct adc_driver_api cc32xx_driver_api = { +static DEVICE_API(adc, cc32xx_driver_api) = { .channel_setup = adc_cc32xx_channel_setup, .read = adc_cc32xx_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_emul.c b/drivers/adc/adc_emul.c index 20b9764fd5fbb..8630516d8212b 100644 --- a/drivers/adc/adc_emul.c +++ b/drivers/adc/adc_emul.c @@ -155,7 +155,6 @@ int adc_emul_value_func_set(const struct device *dev, unsigned int chan, int adc_emul_ref_voltage_set(const struct device *dev, enum adc_reference ref, uint16_t value) { - struct adc_driver_api *api = (struct adc_driver_api *)dev->api; struct adc_emul_data *data = dev->data; int err = 0; @@ -167,7 +166,6 @@ int adc_emul_ref_voltage_set(const struct device *dev, enum adc_reference ref, break; case ADC_REF_INTERNAL: data->ref_int = value; - api->ref_internal = value; break; case ADC_REF_EXTERNAL0: data->ref_ext0 = value; @@ -548,7 +546,7 @@ static int adc_emul_init(const struct device *dev) } #define ADC_EMUL_INIT(_num) \ - static struct adc_driver_api adc_emul_api_##_num = { \ + static DEVICE_API(adc, adc_emul_api_##_num) = { \ .channel_setup = adc_emul_channel_setup, \ .read = adc_emul_read, \ .ref_internal = DT_INST_PROP(_num, ref_internal_mv), \ diff --git a/drivers/adc/adc_ene_kb1200.c b/drivers/adc/adc_ene_kb1200.c index 51b0eb93bbba2..3078d0b915d6e 100644 --- a/drivers/adc/adc_ene_kb1200.c +++ b/drivers/adc/adc_ene_kb1200.c @@ -212,7 +212,7 @@ static void adc_context_update_buffer_pointer(struct adc_context *ctx, bool repe } } -struct adc_driver_api adc_kb1200_api = { +static DEVICE_API(adc, adc_kb1200_api) = { .channel_setup = adc_kb1200_channel_setup, .read = adc_kb1200_read, .ref_internal = ADC_VREF_ANALOG, diff --git a/drivers/adc/adc_esp32.c b/drivers/adc/adc_esp32.c index 1740d96b0ccb0..e6d43b0c7e7c4 100644 --- a/drivers/adc/adc_esp32.c +++ b/drivers/adc/adc_esp32.c @@ -706,7 +706,7 @@ static int adc_esp32_init(const struct device *dev) return 0; } -static const struct adc_driver_api api_esp32_driver_api = { +static DEVICE_API(adc, api_esp32_driver_api) = { .channel_setup = adc_esp32_channel_setup, .read = adc_esp32_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_gd32.c b/drivers/adc/adc_gd32.c index 46fbfc783b751..4703f565678d1 100644 --- a/drivers/adc/adc_gd32.c +++ b/drivers/adc/adc_gd32.c @@ -356,7 +356,7 @@ static int adc_gd32_read_async(const struct device *dev, } #endif /* CONFIG_ADC_ASYNC */ -static struct adc_driver_api adc_gd32_driver_api = { +static DEVICE_API(adc, adc_gd32_driver_api) = { .channel_setup = adc_gd32_channel_setup, .read = adc_gd32_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_gecko.c b/drivers/adc/adc_gecko.c index d8544cebd612b..adf042204bbf2 100644 --- a/drivers/adc/adc_gecko.c +++ b/drivers/adc/adc_gecko.c @@ -280,7 +280,7 @@ static int adc_gecko_init(const struct device *dev) return 0; } -static const struct adc_driver_api api_gecko_adc_driver_api = { +static DEVICE_API(adc, api_gecko_adc_driver_api) = { .channel_setup = adc_gecko_channel_setup, .read = adc_gecko_read, }; diff --git a/drivers/adc/adc_ifx_cat1.c b/drivers/adc/adc_ifx_cat1.c index 095f860b8eb14..e247ee96209fc 100644 --- a/drivers/adc/adc_ifx_cat1.c +++ b/drivers/adc/adc_ifx_cat1.c @@ -266,7 +266,7 @@ static int ifx_cat1_adc_init(const struct device *dev) return 0; } -static const struct adc_driver_api adc_cat1_driver_api = { +static DEVICE_API(adc, adc_cat1_driver_api) = { .channel_setup = ifx_cat1_adc_channel_setup, .read = ifx_cat1_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_ite_it8xxx2.c b/drivers/adc/adc_ite_it8xxx2.c index 53aec279fd2d0..3645dac7e8594 100644 --- a/drivers/adc/adc_ite_it8xxx2.c +++ b/drivers/adc/adc_ite_it8xxx2.c @@ -387,7 +387,7 @@ static void adc_it8xxx2_isr(const struct device *dev) k_sem_give(&data->sem); } -static const struct adc_driver_api api_it8xxx2_driver_api = { +static DEVICE_API(adc, api_it8xxx2_driver_api) = { .channel_setup = adc_it8xxx2_channel_setup, .read = adc_it8xxx2_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_lmp90xxx.c b/drivers/adc/adc_lmp90xxx.c index f71d6f4fa3879..ab06960b41d8e 100644 --- a/drivers/adc/adc_lmp90xxx.c +++ b/drivers/adc/adc_lmp90xxx.c @@ -1036,7 +1036,7 @@ static int lmp90xxx_init(const struct device *dev) return 0; } -static const struct adc_driver_api lmp90xxx_adc_api = { +static DEVICE_API(adc, lmp90xxx_adc_api) = { .channel_setup = lmp90xxx_adc_channel_setup, .read = lmp90xxx_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_ltc2451.c b/drivers/adc/adc_ltc2451.c index 95b86f30d68a5..a576a5d0cae0f 100644 --- a/drivers/adc/adc_ltc2451.c +++ b/drivers/adc/adc_ltc2451.c @@ -87,7 +87,7 @@ static int ltc2451_init(const struct device *dev) return ltc2451_set_conversion_speed(dev, config->conversion_speed); } -static const struct adc_driver_api ltc2451_api = { +static DEVICE_API(adc, ltc2451_api) = { .channel_setup = ltc2451_channel_setup, .read = ltc2451_read_latest_conversion, }; diff --git a/drivers/adc/adc_max11102_17.c b/drivers/adc/adc_max11102_17.c index 5443de0375357..45c95971eaad8 100644 --- a/drivers/adc/adc_max11102_17.c +++ b/drivers/adc/adc_max11102_17.c @@ -389,7 +389,7 @@ static int max11102_17_init(const struct device *dev) return result; } -static const struct adc_driver_api api = { +static DEVICE_API(adc, api) = { .channel_setup = max11102_17_channel_setup, .read = max11102_17_read, .ref_internal = 0, diff --git a/drivers/adc/adc_max1125x.c b/drivers/adc/adc_max1125x.c index a70748d420ef1..aa277cd1861c2 100644 --- a/drivers/adc/adc_max1125x.c +++ b/drivers/adc/adc_max1125x.c @@ -765,7 +765,7 @@ static int max1125x_init(const struct device *dev) return 0; } -static const struct adc_driver_api max1125x_api = { +static DEVICE_API(adc, max1125x_api) = { .channel_setup = max1125x_channel_setup, .read = max1125x_read, .ref_internal = 2048, diff --git a/drivers/adc/adc_max32.c b/drivers/adc/adc_max32.c index f09d8695a1204..af04b00f573ae 100644 --- a/drivers/adc/adc_max32.c +++ b/drivers/adc/adc_max32.c @@ -296,7 +296,7 @@ static void adc_max32_isr(const struct device *dev) } } -static const struct adc_driver_api adc_max32_driver_api = { +static DEVICE_API(adc, adc_max32_driver_api) = { .channel_setup = adc_max32_channel_setup, .read = adc_max32_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_mchp_xec.c b/drivers/adc/adc_mchp_xec.c index 948b8e894a9b4..a3167b7479eeb 100644 --- a/drivers/adc/adc_mchp_xec.c +++ b/drivers/adc/adc_mchp_xec.c @@ -397,7 +397,7 @@ static int adc_xec_pm_action(const struct device *dev, enum pm_device_action act } #endif /* CONFIG_PM_DEVICE */ -struct adc_driver_api adc_xec_api = { +static DEVICE_API(adc, adc_xec_api) = { .channel_setup = adc_xec_channel_setup, .read = adc_xec_read, #if defined(CONFIG_ADC_ASYNC) diff --git a/drivers/adc/adc_mcp320x.c b/drivers/adc/adc_mcp320x.c index 7fc0e421fd8fd..1722b78bfce5f 100644 --- a/drivers/adc/adc_mcp320x.c +++ b/drivers/adc/adc_mcp320x.c @@ -297,7 +297,7 @@ static int mcp320x_init(const struct device *dev) return 0; } -static const struct adc_driver_api mcp320x_adc_api = { +static DEVICE_API(adc, mcp320x_adc_api) = { .channel_setup = mcp320x_channel_setup, .read = mcp320x_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_mcux_12b1msps_sar.c b/drivers/adc/adc_mcux_12b1msps_sar.c index 059ec7c3cd956..b9820b49ea0d4 100644 --- a/drivers/adc/adc_mcux_12b1msps_sar.c +++ b/drivers/adc/adc_mcux_12b1msps_sar.c @@ -262,7 +262,7 @@ static int mcux_12b1msps_sar_adc_init(const struct device *dev) return 0; } -static const struct adc_driver_api mcux_12b1msps_sar_adc_driver_api = { +static DEVICE_API(adc, mcux_12b1msps_sar_adc_driver_api) = { .channel_setup = mcux_12b1msps_sar_adc_channel_setup, .read = mcux_12b1msps_sar_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_mcux_adc12.c b/drivers/adc/adc_mcux_adc12.c index a8b176dd58e7e..5a2b1cba0d8d7 100644 --- a/drivers/adc/adc_mcux_adc12.c +++ b/drivers/adc/adc_mcux_adc12.c @@ -269,7 +269,7 @@ static int mcux_adc12_init(const struct device *dev) (kADC12_ReferenceVoltageSourceVref)) #define ADC12_MCUX_DRIVER_API(n) \ - static const struct adc_driver_api mcux_adc12_driver_api_##n = { \ + static DEVICE_API(adc, mcux_adc12_driver_api_##n) = { \ .channel_setup = mcux_adc12_channel_setup, \ .read = mcux_adc12_read, \ IF_ENABLED(CONFIG_ADC_ASYNC, (.read_async = mcux_adc12_read_async,)) \ diff --git a/drivers/adc/adc_mcux_adc16.c b/drivers/adc/adc_mcux_adc16.c index 49e89de58ce90..f0d5a82910761 100644 --- a/drivers/adc/adc_mcux_adc16.c +++ b/drivers/adc/adc_mcux_adc16.c @@ -432,7 +432,7 @@ static int mcux_adc16_init(const struct device *dev) return 0; } -static const struct adc_driver_api mcux_adc16_driver_api = { +static DEVICE_API(adc, mcux_adc16_driver_api) = { .channel_setup = mcux_adc16_channel_setup, .read = mcux_adc16_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_mcux_gau_adc.c b/drivers/adc/adc_mcux_gau_adc.c index 137c33feeaf47..c3b31250d4fbd 100644 --- a/drivers/adc/adc_mcux_gau_adc.c +++ b/drivers/adc/adc_mcux_gau_adc.c @@ -351,7 +351,7 @@ static int mcux_gau_adc_init(const struct device *dev) return 0; } -static const struct adc_driver_api mcux_gau_adc_driver_api = { +static DEVICE_API(adc, mcux_gau_adc_driver_api) = { .channel_setup = mcux_gau_adc_channel_setup, .read = mcux_gau_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_mcux_lpadc.c b/drivers/adc/adc_mcux_lpadc.c index 8300935c21fb7..9b0fbd475f6c5 100644 --- a/drivers/adc/adc_mcux_lpadc.c +++ b/drivers/adc/adc_mcux_lpadc.c @@ -543,7 +543,7 @@ static int mcux_lpadc_init(const struct device *dev) return 0; } -static const struct adc_driver_api mcux_lpadc_driver_api = { +static DEVICE_API(adc, mcux_lpadc_driver_api) = { .channel_setup = mcux_lpadc_channel_setup, .read = mcux_lpadc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_npcx.c b/drivers/adc/adc_npcx.c index ae1cf65ffbb2d..da50673498672 100644 --- a/drivers/adc/adc_npcx.c +++ b/drivers/adc/adc_npcx.c @@ -841,7 +841,7 @@ static int adc_npcx_init(const struct device *dev) irq_enable(DT_INST_IRQN(n)); \ } \ \ - static const struct adc_driver_api adc_npcx_driver_api_##n = { \ + static DEVICE_API(adc, adc_npcx_driver_api_##n) = { \ .channel_setup = adc_npcx_channel_setup, \ .read = adc_npcx_read, \ .ref_internal = DT_INST_PROP(n, vref_mv), \ diff --git a/drivers/adc/adc_nrfx_adc.c b/drivers/adc/adc_nrfx_adc.c index ec96e244bcdea..85b0940be515d 100644 --- a/drivers/adc/adc_nrfx_adc.c +++ b/drivers/adc/adc_nrfx_adc.c @@ -281,7 +281,7 @@ static int init_adc(const struct device *dev) return 0; } -static const struct adc_driver_api adc_nrfx_driver_api = { +static DEVICE_API(adc, adc_nrfx_driver_api) = { .channel_setup = adc_nrfx_channel_setup, .read = adc_nrfx_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_nrfx_saadc.c b/drivers/adc/adc_nrfx_saadc.c index c5b68f564a825..279ba41265127 100644 --- a/drivers/adc/adc_nrfx_saadc.c +++ b/drivers/adc/adc_nrfx_saadc.c @@ -661,7 +661,7 @@ static int init_saadc(const struct device *dev) return 0; } -static const struct adc_driver_api adc_nrfx_driver_api = { +static DEVICE_API(adc, adc_nrfx_driver_api) = { .channel_setup = adc_nrfx_channel_setup, .read = adc_nrfx_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_numaker.c b/drivers/adc/adc_numaker.c index 42d3b7ad5ddbf..5c96bfc35b000 100644 --- a/drivers/adc/adc_numaker.c +++ b/drivers/adc/adc_numaker.c @@ -301,7 +301,7 @@ static int adc_numaker_read_async(const struct device *dev, } #endif -static const struct adc_driver_api adc_numaker_driver_api = { +static DEVICE_API(adc, adc_numaker_driver_api) = { .channel_setup = adc_numaker_channel_setup, .read = adc_numaker_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_nxp_s32_adc_sar.c b/drivers/adc/adc_nxp_s32_adc_sar.c index e4c9f269b7274..bc65466310e0b 100644 --- a/drivers/adc/adc_nxp_s32_adc_sar.c +++ b/drivers/adc/adc_nxp_s32_adc_sar.c @@ -334,7 +334,7 @@ static void adc_nxp_s32_isr(const struct device *dev) } #define ADC_NXP_S32_DRIVER_API(n) \ - static const struct adc_driver_api adc_nxp_s32_driver_api_##n = { \ + static DEVICE_API(adc, adc_nxp_s32_driver_api_##n) = { \ .channel_setup = adc_nxp_s32_channel_setup, \ .read = adc_nxp_s32_read, \ IF_ENABLED(CONFIG_ADC_ASYNC, (.read_async = adc_nxp_s32_read_async,))\ diff --git a/drivers/adc/adc_renesas_ra.c b/drivers/adc/adc_renesas_ra.c index d1054f9721c96..8c1225040edbc 100644 --- a/drivers/adc/adc_renesas_ra.c +++ b/drivers/adc/adc_renesas_ra.c @@ -342,7 +342,7 @@ const adc_extended_cfg_t g_adc_cfg_extend = { #define ADC_RA_INIT(idx) \ IRQ_CONFIGURE_FUNC(idx) \ PINCTRL_DT_INST_DEFINE(idx); \ - static struct adc_driver_api adc_ra_api_##idx = { \ + static DEVICE_API(adc, adc_ra_api_##idx) = { \ .channel_setup = adc_ra_channel_setup, \ .read = adc_ra_read, \ .ref_internal = DT_INST_PROP(idx, vref_mv), \ diff --git a/drivers/adc/adc_rpi_pico.c b/drivers/adc/adc_rpi_pico.c index 3f63924a9d580..5dffdd6ba00e2 100644 --- a/drivers/adc/adc_rpi_pico.c +++ b/drivers/adc/adc_rpi_pico.c @@ -354,7 +354,7 @@ static int adc_rpi_init(const struct device *dev) #define ADC_RPI_INIT(idx) \ IRQ_CONFIGURE_FUNC(idx) \ PINCTRL_DT_INST_DEFINE(idx); \ - static struct adc_driver_api adc_rpi_api_##idx = { \ + static DEVICE_API(adc, adc_rpi_api_##idx) = { \ .channel_setup = adc_rpi_channel_setup, \ .read = adc_rpi_read, \ .ref_internal = DT_INST_PROP(idx, vref_mv), \ diff --git a/drivers/adc/adc_sam.c b/drivers/adc/adc_sam.c index 3536a88af4d57..32b8450ef0fda 100644 --- a/drivers/adc/adc_sam.c +++ b/drivers/adc/adc_sam.c @@ -376,7 +376,7 @@ static int adc_sam_read_async(const struct device *dev, } #endif -static const struct adc_driver_api adc_sam_api = { +static DEVICE_API(adc, adc_sam_api) = { .channel_setup = adc_sam_channel_setup, .read = adc_sam_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_sam0.c b/drivers/adc/adc_sam0.c index b7b1f59aa8ed7..7cf31bc2ef54b 100644 --- a/drivers/adc/adc_sam0.c +++ b/drivers/adc/adc_sam0.c @@ -503,7 +503,7 @@ static int adc_sam0_read_async(const struct device *dev, } #endif -static const struct adc_driver_api adc_sam0_api = { +static DEVICE_API(adc, adc_sam0_api) = { .channel_setup = adc_sam0_channel_setup, .read = adc_sam0_read, .ref_internal = 1000U, /* Fixed 1.0 V reference */ diff --git a/drivers/adc/adc_sam_afec.c b/drivers/adc/adc_sam_afec.c index 8096ca9236eb9..46bdf646a0727 100644 --- a/drivers/adc/adc_sam_afec.c +++ b/drivers/adc/adc_sam_afec.c @@ -331,7 +331,7 @@ static int adc_sam_read_async(const struct device *dev, } #endif -static const struct adc_driver_api adc_sam_api = { +static DEVICE_API(adc, adc_sam_api) = { .channel_setup = adc_sam_channel_setup, .read = adc_sam_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_smartbond_gpadc.c b/drivers/adc/adc_smartbond_gpadc.c index 76bdaede5108e..e1be9f3f1ffad 100644 --- a/drivers/adc/adc_smartbond_gpadc.c +++ b/drivers/adc/adc_smartbond_gpadc.c @@ -389,7 +389,7 @@ static int adc_smartbond_init(const struct device *dev) return ret; } -static const struct adc_driver_api adc_smartbond_driver_api = { +static DEVICE_API(adc, adc_smartbond_driver_api) = { .channel_setup = adc_smartbond_channel_setup, .read = adc_smartbond_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_smartbond_sdadc.c b/drivers/adc/adc_smartbond_sdadc.c index de7b71888299d..f6633078e81e4 100644 --- a/drivers/adc/adc_smartbond_sdadc.c +++ b/drivers/adc/adc_smartbond_sdadc.c @@ -393,7 +393,7 @@ static int sdadc_smartbond_init(const struct device *dev) return ret; } -static const struct adc_driver_api sdadc_smartbond_driver_api = { +static DEVICE_API(adc, sdadc_smartbond_driver_api) = { .channel_setup = sdadc_smartbond_channel_setup, .read = sdadc_smartbond_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_stm32.c b/drivers/adc/adc_stm32.c index 81e44ccab2fec..85f12aa7e4992 100644 --- a/drivers/adc/adc_stm32.c +++ b/drivers/adc/adc_stm32.c @@ -1727,7 +1727,7 @@ static int adc_stm32_pm_action(const struct device *dev, } #endif /* CONFIG_PM_DEVICE */ -static const struct adc_driver_api api_stm32_driver_api = { +static DEVICE_API(adc, api_stm32_driver_api) = { .channel_setup = adc_stm32_channel_setup, .read = adc_stm32_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_stm32wb0.c b/drivers/adc/adc_stm32wb0.c index e36cee7631c28..e71357364d26b 100644 --- a/drivers/adc/adc_stm32wb0.c +++ b/drivers/adc/adc_stm32wb0.c @@ -1056,7 +1056,7 @@ int adc_stm32wb0_read_async(const struct device *dev, } #endif /* CONFIG_ADC_ASYNC */ -static const struct adc_driver_api api_stm32wb0_driver_api = { +static DEVICE_API(adc, api_stm32wb0_driver_api) = { .channel_setup = adc_stm32wb0_channel_setup, .read = adc_stm32wb0_read, #if defined(CONFIG_ADC_ASYNC) diff --git a/drivers/adc/adc_test.c b/drivers/adc/adc_test.c index 09f30ddace9bc..bb8a557ecd3df 100644 --- a/drivers/adc/adc_test.c +++ b/drivers/adc/adc_test.c @@ -37,7 +37,7 @@ static int vnd_adc_read_async(const struct device *dev, } #endif -static const struct adc_driver_api vnd_adc_api = { +static DEVICE_API(adc, vnd_adc_api) = { .channel_setup = vnd_adc_channel_setup, .read = vnd_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_tla2021.c b/drivers/adc/adc_tla2021.c index 7c08a8292b058..c4bfb50082f2b 100644 --- a/drivers/adc/adc_tla2021.c +++ b/drivers/adc/adc_tla2021.c @@ -295,7 +295,7 @@ static int tla2021_init(const struct device *dev) return 0; } -static const struct adc_driver_api tla2021_driver_api = { +static DEVICE_API(adc, tla2021_driver_api) = { .channel_setup = tla2021_channel_setup, .read = tla2021_read, .ref_internal = 4096, diff --git a/drivers/adc/adc_vf610.c b/drivers/adc/adc_vf610.c index 1fa8b090af9a4..d7d8da7411e4a 100644 --- a/drivers/adc/adc_vf610.c +++ b/drivers/adc/adc_vf610.c @@ -233,7 +233,7 @@ static int vf610_adc_init(const struct device *dev) return 0; } -static const struct adc_driver_api vf610_adc_driver_api = { +static DEVICE_API(adc, vf610_adc_driver_api) = { .channel_setup = vf610_adc_channel_setup, .read = vf610_adc_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/adc_xmc4xxx.c b/drivers/adc/adc_xmc4xxx.c index b5b935b53d060..e7b25fdb64df3 100644 --- a/drivers/adc/adc_xmc4xxx.c +++ b/drivers/adc/adc_xmc4xxx.c @@ -300,7 +300,7 @@ static int adc_xmc4xxx_init(const struct device *dev) return 0; } -static const struct adc_driver_api api_xmc4xxx_driver_api = { +static DEVICE_API(adc, api_xmc4xxx_driver_api) = { .channel_setup = adc_xmc4xxx_channel_setup, .read = adc_xmc4xxx_read, #ifdef CONFIG_ADC_ASYNC diff --git a/drivers/adc/iadc_gecko.c b/drivers/adc/iadc_gecko.c index d9dc542a5bf94..3e76794d55ec8 100644 --- a/drivers/adc/iadc_gecko.c +++ b/drivers/adc/iadc_gecko.c @@ -453,7 +453,7 @@ static int adc_gecko_init(const struct device *dev) return 0; } -static const struct adc_driver_api api_gecko_adc_driver_api = { +static DEVICE_API(adc, api_gecko_adc_driver_api) = { .channel_setup = adc_gecko_channel_setup, .read = adc_gecko_read, #ifdef CONFIG_ADC_ASYNC diff --git a/include/zephyr/drivers/adc.h b/include/zephyr/drivers/adc.h index 583c04cd0e71e..1c95baa9707c5 100644 --- a/include/zephyr/drivers/adc.h +++ b/include/zephyr/drivers/adc.h @@ -726,10 +726,7 @@ __syscall int adc_channel_setup(const struct device *dev, static inline int z_impl_adc_channel_setup(const struct device *dev, const struct adc_channel_cfg *channel_cfg) { - const struct adc_driver_api *api = - (const struct adc_driver_api *)dev->api; - - return api->channel_setup(dev, channel_cfg); + return DEVICE_API_GET(adc, dev)->channel_setup(dev, channel_cfg); } /** @@ -777,10 +774,7 @@ __syscall int adc_read(const struct device *dev, static inline int z_impl_adc_read(const struct device *dev, const struct adc_sequence *sequence) { - const struct adc_driver_api *api = - (const struct adc_driver_api *)dev->api; - - return api->read(dev, sequence); + return DEVICE_API_GET(adc, dev)->read(dev, sequence); } /** @@ -828,10 +822,7 @@ static inline int z_impl_adc_read_async(const struct device *dev, const struct adc_sequence *sequence, struct k_poll_signal *async) { - const struct adc_driver_api *api = - (const struct adc_driver_api *)dev->api; - - return api->read_async(dev, sequence, async); + return DEVICE_API_GET(adc, dev)->read_async(dev, sequence, async); } #endif /* CONFIG_ADC_ASYNC */ @@ -846,10 +837,7 @@ static inline int z_impl_adc_read_async(const struct device *dev, */ static inline uint16_t adc_ref_internal(const struct device *dev) { - const struct adc_driver_api *api = - (const struct adc_driver_api *)dev->api; - - return api->ref_internal; + return DEVICE_API_GET(adc, dev)->ref_internal; } /** diff --git a/tests/drivers/build_all/adc/testcase.yaml b/tests/drivers/build_all/adc/testcase.yaml index f0345bef853d7..c9fa5a8ec6557 100644 --- a/tests/drivers/build_all/adc/testcase.yaml +++ b/tests/drivers/build_all/adc/testcase.yaml @@ -39,3 +39,9 @@ tests: platform_allow: mec15xxevb_assy6853 drivers.adc.test.build: platform_allow: qemu_cortex_m3 + drivers.adc.linker_generator.build: + platform_allow: qemu_cortex_m3 + tags: + - linker_generator + extra_configs: + - CONFIG_CMAKE_LINKER_GENERATOR=y