drivers: adc: Simplify STM32 ADC channels setup
Now that we have the information of internal channel number for STM32
ADCs in the dts, we can use it to remove a lot of specific code and
make it clearer.
Signed-off-by: Guillaume Gautier <guillaume.gautier-ext@st.com>
diff --git a/drivers/adc/adc_stm32.c b/drivers/adc/adc_stm32.c
index 8dddb5a..9cc3d65 100644
--- a/drivers/adc/adc_stm32.c
+++ b/drivers/adc/adc_stm32.c
@@ -271,6 +271,9 @@
bool has_temp_channel;
bool has_vref_channel;
bool has_vbat_channel;
+ int8_t temp_channel;
+ int8_t vref_channel;
+ int8_t vbat_channel;
};
#ifdef CONFIG_ADC_STM32_SHARED_IRQS
@@ -544,78 +547,26 @@
const struct adc_stm32_cfg *config = dev->config;
ADC_TypeDef *adc = (ADC_TypeDef *)config->base;
-#ifdef CONFIG_SOC_SERIES_STM32G4X
- if (config->has_temp_channel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc1), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC1) == channel_id)
- && (config->base == ADC1)) {
- adc_stm32_disable(adc);
- adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- k_usleep(LL_ADC_DELAY_TEMPSENSOR_STAB_US);
- }
-#endif
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc5), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC5) == channel_id)
- && (config->base == ADC5)) {
- adc_stm32_disable(adc);
- adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- k_usleep(LL_ADC_DELAY_TEMPSENSOR_STAB_US);
- }
-#endif
- }
-#elif CONFIG_SOC_SERIES_STM32U5X
- if (config->has_temp_channel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc1), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR) == channel_id)
- && (config->base == ADC1)) {
- adc_stm32_disable(adc);
- adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- /* Wait for the sensor stabilization */
- k_usleep(LL_ADC_DELAY_TEMPSENSOR_STAB_US);
- }
-#endif
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc4), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC4) == channel_id)
- && (config->base == ADC4)) {
- adc_stm32_disable(adc);
- adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- LL_ADC_SetCommonPathInternalChAdd(__LL_ADC_COMMON_INSTANCE(adc),
- LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- /* Wait for the sensor stabilization */
- k_usleep(LL_ADC_DELAY_TEMPSENSOR_STAB_US);
- }
-#endif
- }
-#else
- if (config->has_temp_channel &&
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR) == channel_id)) {
+ if (config->temp_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
-#ifdef LL_ADC_DELAY_TEMPSENSOR_STAB_US
k_usleep(LL_ADC_DELAY_TEMPSENSOR_STAB_US);
-#endif
}
-#endif /* CONFIG_SOC_SERIES_STM32G4X */
- if (config->has_vref_channel &&
- __LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VREFINT) == channel_id) {
+ if (config->vref_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_VREFINT);
#ifdef LL_ADC_DELAY_VREFINT_STAB_US
k_usleep(LL_ADC_DELAY_VREFINT_STAB_US);
#endif
}
+
#if defined(LL_ADC_CHANNEL_VBAT)
/* Enable the bridge divider only when needed for ADC conversion. */
- if (config->has_vbat_channel && (
-#if defined(LL_ADC_CHANNEL_VBAT_ADC4)
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VBAT_ADC4) == channel_id) ||
-#endif /* LL_ADC_CHANNEL_VBAT_ADC4 */
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VBAT) == channel_id))) {
+ if (config->vbat_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_set_common_path(dev, LL_ADC_PATH_INTERNAL_VBAT);
}
-
#endif /* LL_ADC_CHANNEL_VBAT */
}
@@ -640,64 +591,19 @@
for (uint32_t channels = data->channels; channels; channels &= ~BIT(channel_id)) {
channel_id = find_lsb_set(channels) - 1;
-#ifdef CONFIG_SOC_SERIES_STM32G4X
- if (config->has_temp_channel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc1), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC1) ==
- channel_id) &&
- (config->base == ADC1)) {
- adc_stm32_disable(adc);
- adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- }
-#endif
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc5), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC5) ==
- channel_id) &&
- (config->base == ADC5)) {
- adc_stm32_disable(adc);
- adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- }
-#endif
- }
-#elif CONFIG_SOC_SERIES_STM32U5X
- if (config->has_temp_channel) {
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc1), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR) ==
- channel_id) &&
- (config->base == ADC1)) {
- adc_stm32_disable(adc);
- adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- }
-#endif
-#if DT_NODE_HAS_STATUS(DT_NODELABEL(adc4), okay)
- if ((__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR_ADC4) ==
- channel_id) &&
- (config->base == ADC4)) {
- adc_stm32_disable(adc);
- adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
- }
-#endif
- }
-#else
- if (config->has_temp_channel &&
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_TEMPSENSOR) == channel_id)) {
+ if (config->temp_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_TEMPSENSOR);
}
-#endif /* CONFIG_SOC_SERIES_STM32G4X */
- if (config->has_vref_channel &&
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VREFINT) == channel_id)) {
+ if (config->vref_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_VREFINT);
}
+
#if defined(LL_ADC_CHANNEL_VBAT)
/* Enable the bridge divider only when needed for ADC conversion. */
- if (config->has_vbat_channel && (
-#if defined(LL_ADC_CHANNEL_VBAT_ADC4)
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VBAT_ADC4) == channel_id) ||
-#endif /* LL_ADC_CHANNEL_VBAT_ADC4 */
- (__LL_ADC_CHANNEL_TO_DECIMAL_NB(LL_ADC_CHANNEL_VBAT) == channel_id))) {
+ if (config->vbat_channel == channel_id) {
adc_stm32_disable(adc);
adc_stm32_unset_common_path(dev, LL_ADC_PATH_INTERNAL_VBAT);
}
@@ -1494,6 +1400,9 @@
.has_temp_channel = DT_INST_PROP(index, has_temp_channel), \
.has_vref_channel = DT_INST_PROP(index, has_vref_channel), \
.has_vbat_channel = DT_INST_PROP(index, has_vbat_channel), \
+ .temp_channel = DT_INST_PROP_OR(index, temp_channel, 0xFF), \
+ .vref_channel = DT_INST_PROP_OR(index, vref_channel, 0xFF), \
+ .vbat_channel = DT_INST_PROP_OR(index, vbat_channel, 0xFF), \
}; \
\
static struct adc_stm32_data adc_stm32_data_##index = { \