Lines Matching +full:adc +full:- +full:dev

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2018, STMicroelectronics - All Rights Reserved
6 * Originally based on the Linux kernel v4.18 drivers/iio/adc/stm32-adc.c.
10 #include <adc.h>
13 #include "stm32-adc-core.h"
15 /* STM32H7 - Registers for each ADC instance */
26 /* STM32H7_ADC_ISR - bit fields */
31 /* STM32H7_ADC_CR - bit fields */
43 /* STM32H7_ADC_SQR1 - bit fields */
46 /* BOOST bit must be set on STM32H7 when ADC clock is above 20MHz */
64 static int stm32_adc_stop(struct udevice *dev) in stm32_adc_stop() argument
66 struct stm32_adc *adc = dev_get_priv(dev); in stm32_adc_stop() local
68 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADDIS); in stm32_adc_stop()
69 clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST); in stm32_adc_stop()
70 /* Setting DEEPPWD disables ADC vreg and clears ADVREGEN */ in stm32_adc_stop()
71 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD); in stm32_adc_stop()
72 adc->active_channel = -1; in stm32_adc_stop()
77 static int stm32_adc_start_channel(struct udevice *dev, int channel) in stm32_adc_start_channel() argument
79 struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); in stm32_adc_start_channel()
80 struct stm32_adc_common *common = dev_get_priv(dev_get_parent(dev)); in stm32_adc_start_channel()
81 struct stm32_adc *adc = dev_get_priv(dev); in stm32_adc_start_channel() local
85 /* Exit deep power down, then enable ADC voltage regulator */ in stm32_adc_start_channel()
86 clrbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_DEEPPWD); in stm32_adc_start_channel()
87 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADVREGEN); in stm32_adc_start_channel()
88 if (common->rate > STM32H7_BOOST_CLKRATE) in stm32_adc_start_channel()
89 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_BOOST); in stm32_adc_start_channel()
92 if (!adc->cfg->has_vregready) { in stm32_adc_start_channel()
95 ret = readl_poll_timeout(adc->regs + STM32H7_ADC_ISR, val, in stm32_adc_start_channel()
99 stm32_adc_stop(dev); in stm32_adc_start_channel()
100 dev_err(dev, "Failed to enable vreg: %d\n", ret); in stm32_adc_start_channel()
106 writel(0, adc->regs + STM32H7_ADC_DIFSEL); in stm32_adc_start_channel()
108 /* Enable ADC, Poll for ADRDY to be set (after adc startup time) */ in stm32_adc_start_channel()
109 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADEN); in stm32_adc_start_channel()
110 ret = readl_poll_timeout(adc->regs + STM32H7_ADC_ISR, val, in stm32_adc_start_channel()
113 stm32_adc_stop(dev); in stm32_adc_start_channel()
114 dev_err(dev, "Failed to enable ADC: %d\n", ret); in stm32_adc_start_channel()
119 writel(uc_pdata->channel_mask, adc->regs + STM32H7_ADC_PCSEL); in stm32_adc_start_channel()
122 writel(0xffffffff, adc->regs + STM32H7_ADC_SMPR1); in stm32_adc_start_channel()
123 writel(0xffffffff, adc->regs + STM32H7_ADC_SMPR2); in stm32_adc_start_channel()
126 writel(channel << STM32H7_SQ1_SHIFT, adc->regs + STM32H7_ADC_SQR1); in stm32_adc_start_channel()
129 clrbits_le32(adc->regs + STM32H7_ADC_CFGR, STM32H7_EXTEN | in stm32_adc_start_channel()
131 adc->active_channel = channel; in stm32_adc_start_channel()
136 static int stm32_adc_channel_data(struct udevice *dev, int channel, in stm32_adc_channel_data() argument
139 struct stm32_adc *adc = dev_get_priv(dev); in stm32_adc_channel_data() local
143 if (channel != adc->active_channel) { in stm32_adc_channel_data()
144 dev_err(dev, "Requested channel is not active!\n"); in stm32_adc_channel_data()
145 return -EINVAL; in stm32_adc_channel_data()
148 setbits_le32(adc->regs + STM32H7_ADC_CR, STM32H7_ADSTART); in stm32_adc_channel_data()
149 ret = readl_poll_timeout(adc->regs + STM32H7_ADC_ISR, val, in stm32_adc_channel_data()
152 dev_err(dev, "conversion timed out: %d\n", ret); in stm32_adc_channel_data()
156 *data = readl(adc->regs + STM32H7_ADC_DR); in stm32_adc_channel_data()
161 static int stm32_adc_chan_of_init(struct udevice *dev) in stm32_adc_chan_of_init() argument
163 struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); in stm32_adc_chan_of_init()
164 struct stm32_adc *adc = dev_get_priv(dev); in stm32_adc_chan_of_init() local
169 num_channels = dev_read_size(dev, "st,adc-channels"); in stm32_adc_chan_of_init()
171 dev_err(dev, "can't get st,adc-channels: %d\n", num_channels); in stm32_adc_chan_of_init()
176 if (num_channels > adc->cfg->max_channels) { in stm32_adc_chan_of_init()
177 dev_err(dev, "too many st,adc-channels: %d\n", num_channels); in stm32_adc_chan_of_init()
178 return -EINVAL; in stm32_adc_chan_of_init()
181 ret = dev_read_u32_array(dev, "st,adc-channels", chans, num_channels); in stm32_adc_chan_of_init()
183 dev_err(dev, "can't read st,adc-channels: %d\n", ret); in stm32_adc_chan_of_init()
188 if (chans[i] >= adc->cfg->max_channels) { in stm32_adc_chan_of_init()
189 dev_err(dev, "bad channel %u\n", chans[i]); in stm32_adc_chan_of_init()
190 return -EINVAL; in stm32_adc_chan_of_init()
192 uc_pdata->channel_mask |= 1 << chans[i]; in stm32_adc_chan_of_init()
195 uc_pdata->data_mask = (1 << adc->cfg->num_bits) - 1; in stm32_adc_chan_of_init()
196 uc_pdata->data_format = ADC_DATA_FORMAT_BIN; in stm32_adc_chan_of_init()
197 uc_pdata->data_timeout_us = 100000; in stm32_adc_chan_of_init()
202 static int stm32_adc_probe(struct udevice *dev) in stm32_adc_probe() argument
204 struct adc_uclass_platdata *uc_pdata = dev_get_uclass_platdata(dev); in stm32_adc_probe()
205 struct stm32_adc_common *common = dev_get_priv(dev_get_parent(dev)); in stm32_adc_probe()
206 struct stm32_adc *adc = dev_get_priv(dev); in stm32_adc_probe() local
209 offset = dev_read_u32_default(dev, "reg", -ENODATA); in stm32_adc_probe()
211 dev_err(dev, "Can't read reg property\n"); in stm32_adc_probe()
214 adc->regs = common->base + offset; in stm32_adc_probe()
215 adc->cfg = (const struct stm32_adc_cfg *)dev_get_driver_data(dev); in stm32_adc_probe()
218 uc_pdata->vdd_supply = common->vref; in stm32_adc_probe()
219 uc_pdata->vdd_microvolts = common->vref_uv; in stm32_adc_probe()
220 uc_pdata->vss_microvolts = 0; in stm32_adc_probe()
222 return stm32_adc_chan_of_init(dev); in stm32_adc_probe()
243 { .compatible = "st,stm32h7-adc",
245 { .compatible = "st,stm32mp1-adc",
251 .name = "stm32-adc",