Lines Matching +full:settling +full:- +full:time +full:- +full:us
1 // SPDX-License-Identifier: GPL-2.0-only
30 * HR Timers-based version loads CPU only up to 10% during back to back ADC
31 * conversion, while busy wait-based version consumes whole CPU power.
88 mutex_lock(&priv->lock); in ep93xx_read_raw()
89 if (priv->lastch != channel->channel) { in ep93xx_read_raw()
90 priv->lastch = channel->channel; in ep93xx_read_raw()
92 * Switch register is software-locked, unlocking must be in ep93xx_read_raw()
96 writel_relaxed(0xAA, priv->base + EP93XX_ADC_SW_LOCK); in ep93xx_read_raw()
97 writel_relaxed(channel->address, in ep93xx_read_raw()
98 priv->base + EP93XX_ADC_SWITCH); in ep93xx_read_raw()
101 * Settling delay depends on module clock and could be in ep93xx_read_raw()
102 * 2ms or 500us in ep93xx_read_raw()
107 readl_relaxed(priv->base + EP93XX_ADC_RESULT); in ep93xx_read_raw()
117 t = readl_relaxed(priv->base + EP93XX_ADC_RESULT); in ep93xx_read_raw()
124 dev_err(&iiodev->dev, "Conversion timeout\n"); in ep93xx_read_raw()
125 ret = -ETIMEDOUT; in ep93xx_read_raw()
131 mutex_unlock(&priv->lock); in ep93xx_read_raw()
135 /* According to datasheet, range is -25000..25000 */ in ep93xx_read_raw()
146 return -EINVAL; in ep93xx_read_raw()
161 iiodev = devm_iio_device_alloc(&pdev->dev, sizeof(*priv)); in ep93xx_adc_probe()
163 return -ENOMEM; in ep93xx_adc_probe()
167 priv->base = devm_ioremap_resource(&pdev->dev, res); in ep93xx_adc_probe()
168 if (IS_ERR(priv->base)) in ep93xx_adc_probe()
169 return PTR_ERR(priv->base); in ep93xx_adc_probe()
171 iiodev->name = dev_name(&pdev->dev); in ep93xx_adc_probe()
172 iiodev->modes = INDIO_DIRECT_MODE; in ep93xx_adc_probe()
173 iiodev->info = &ep93xx_adc_info; in ep93xx_adc_probe()
174 iiodev->num_channels = ARRAY_SIZE(ep93xx_adc_channels); in ep93xx_adc_probe()
175 iiodev->channels = ep93xx_adc_channels; in ep93xx_adc_probe()
177 priv->lastch = -1; in ep93xx_adc_probe()
178 mutex_init(&priv->lock); in ep93xx_adc_probe()
182 priv->clk = devm_clk_get(&pdev->dev, NULL); in ep93xx_adc_probe()
183 if (IS_ERR(priv->clk)) { in ep93xx_adc_probe()
184 dev_err(&pdev->dev, "Cannot obtain clock\n"); in ep93xx_adc_probe()
185 return PTR_ERR(priv->clk); in ep93xx_adc_probe()
188 pclk = clk_get_parent(priv->clk); in ep93xx_adc_probe()
190 dev_warn(&pdev->dev, "Cannot obtain parent clock\n"); in ep93xx_adc_probe()
194 * EP93xx ADC supports two clock divisors -- 4 and 16, in ep93xx_adc_probe()
196 * with 500us or 2ms settling time respectively. in ep93xx_adc_probe()
199 ret = clk_set_rate(priv->clk, clk_get_rate(pclk) / 16); in ep93xx_adc_probe()
201 dev_warn(&pdev->dev, "Cannot set clock rate\n"); in ep93xx_adc_probe()
208 ret = clk_prepare_enable(priv->clk); in ep93xx_adc_probe()
210 dev_err(&pdev->dev, "Cannot enable clock\n"); in ep93xx_adc_probe()
216 clk_disable_unprepare(priv->clk); in ep93xx_adc_probe()
227 clk_disable_unprepare(priv->clk); in ep93xx_adc_remove()
234 .name = "ep93xx-adc",
244 MODULE_ALIAS("platform:ep93xx-adc");