Lines Matching +full:adc +full:- +full:dev
2 * Freescale MXS LRADC ADC driver
27 #include <linux/mfd/mxs-lradc.h>
52 "mxs-lradc-channel0",
53 "mxs-lradc-channel1",
54 "mxs-lradc-channel2",
55 "mxs-lradc-channel3",
56 "mxs-lradc-channel4",
57 "mxs-lradc-channel5",
61 "mxs-lradc-thresh0",
62 "mxs-lradc-thresh1",
63 "mxs-lradc-channel0",
64 "mxs-lradc-channel1",
65 "mxs-lradc-channel2",
66 "mxs-lradc-channel3",
67 "mxs-lradc-channel4",
68 "mxs-lradc-channel5",
69 "mxs-lradc-button0",
70 "mxs-lradc-button1",
124 struct device *dev; member
142 struct mxs_lradc_adc *adc = iio_priv(iio_dev); in mxs_lradc_adc_read_single() local
143 struct mxs_lradc *lradc = adc->lradc; in mxs_lradc_adc_read_single()
156 reinit_completion(&adc->completion); in mxs_lradc_adc_read_single()
163 if (lradc->soc == IMX28_LRADC) in mxs_lradc_adc_read_single()
165 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_read_single()
166 writel(0x1, adc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_read_single()
169 if (test_bit(chan, &adc->is_divided)) in mxs_lradc_adc_read_single()
171 adc->base + LRADC_CTRL2 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_read_single()
174 adc->base + LRADC_CTRL2 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_read_single()
178 adc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_read_single()
179 writel(chan, adc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_read_single()
181 writel(0, adc->base + LRADC_CH(0)); in mxs_lradc_adc_read_single()
185 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_read_single()
186 writel(BIT(0), adc->base + LRADC_CTRL0 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_read_single()
189 ret = wait_for_completion_killable_timeout(&adc->completion, HZ); in mxs_lradc_adc_read_single()
191 ret = -ETIMEDOUT; in mxs_lradc_adc_read_single()
196 *val = readl(adc->base + LRADC_CH(0)) & LRADC_CH_VALUE_MASK; in mxs_lradc_adc_read_single()
201 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_read_single()
220 *val = max - min; in mxs_lradc_adc_read_temp()
229 struct mxs_lradc_adc *adc = iio_priv(iio_dev); in mxs_lradc_adc_read_raw() local
233 if (chan->type == IIO_TEMP) in mxs_lradc_adc_read_raw()
236 return mxs_lradc_adc_read_single(iio_dev, chan->channel, val); in mxs_lradc_adc_read_raw()
239 if (chan->type == IIO_TEMP) { in mxs_lradc_adc_read_raw()
249 *val = adc->vref_mv[chan->channel]; in mxs_lradc_adc_read_raw()
250 *val2 = chan->scan_type.realbits - in mxs_lradc_adc_read_raw()
251 test_bit(chan->channel, &adc->is_divided); in mxs_lradc_adc_read_raw()
255 if (chan->type == IIO_TEMP) { in mxs_lradc_adc_read_raw()
257 * The calculated value from the ADC is in Kelvin, we in mxs_lradc_adc_read_raw()
258 * want Celsius for hwmon so the offset is -273.15 in mxs_lradc_adc_read_raw()
260 * actually -213.15 * 4 / 1.012 = -1079.644268 in mxs_lradc_adc_read_raw()
262 *val = -1079; in mxs_lradc_adc_read_raw()
268 return -EINVAL; in mxs_lradc_adc_read_raw()
274 return -EINVAL; in mxs_lradc_adc_read_raw()
281 struct mxs_lradc_adc *adc = iio_priv(iio_dev); in mxs_lradc_adc_write_raw() local
283 adc->scale_avail[chan->channel]; in mxs_lradc_adc_write_raw()
292 ret = -EINVAL; in mxs_lradc_adc_write_raw()
296 clear_bit(chan->channel, &adc->is_divided); in mxs_lradc_adc_write_raw()
301 set_bit(chan->channel, &adc->is_divided); in mxs_lradc_adc_write_raw()
307 ret = -EINVAL; in mxs_lradc_adc_write_raw()
323 static ssize_t mxs_lradc_adc_show_scale_avail(struct device *dev, in mxs_lradc_adc_show_scale_avail() argument
327 struct iio_dev *iio = dev_to_iio_dev(dev); in mxs_lradc_adc_show_scale_avail()
328 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_show_scale_avail() local
332 ch = iio_attr->address; in mxs_lradc_adc_show_scale_avail()
333 for (i = 0; i < ARRAY_SIZE(adc->scale_avail[ch]); i++) in mxs_lradc_adc_show_scale_avail()
335 adc->scale_avail[ch][i].integer, in mxs_lradc_adc_show_scale_avail()
336 adc->scale_avail[ch][i].nano); in mxs_lradc_adc_show_scale_avail()
395 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_handle_irq() local
396 struct mxs_lradc *lradc = adc->lradc; in mxs_lradc_adc_handle_irq()
397 unsigned long reg = readl(adc->base + LRADC_CTRL1); in mxs_lradc_adc_handle_irq()
404 if (reg & lradc->buffer_vchans) { in mxs_lradc_adc_handle_irq()
405 spin_lock_irqsave(&adc->lock, flags); in mxs_lradc_adc_handle_irq()
406 iio_trigger_poll(iio->trig); in mxs_lradc_adc_handle_irq()
407 spin_unlock_irqrestore(&adc->lock, flags); in mxs_lradc_adc_handle_irq()
410 complete(&adc->completion); in mxs_lradc_adc_handle_irq()
414 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_handle_irq()
424 struct iio_dev *iio = pf->indio_dev; in mxs_lradc_adc_trigger_handler()
425 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_trigger_handler() local
427 ((LRADC_DELAY_TIMER_LOOP - 1) << LRADC_CH_NUM_SAMPLES_OFFSET); in mxs_lradc_adc_trigger_handler()
430 for_each_set_bit(i, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) { in mxs_lradc_adc_trigger_handler()
431 adc->buffer[j] = readl(adc->base + LRADC_CH(j)); in mxs_lradc_adc_trigger_handler()
432 writel(chan_value, adc->base + LRADC_CH(j)); in mxs_lradc_adc_trigger_handler()
433 adc->buffer[j] &= LRADC_CH_VALUE_MASK; in mxs_lradc_adc_trigger_handler()
434 adc->buffer[j] /= LRADC_DELAY_TIMER_LOOP; in mxs_lradc_adc_trigger_handler()
438 iio_push_to_buffers_with_timestamp(iio, adc->buffer, pf->timestamp); in mxs_lradc_adc_trigger_handler()
440 iio_trigger_notify_done(iio->trig); in mxs_lradc_adc_trigger_handler()
448 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_configure_trigger() local
451 writel(LRADC_DELAY_KICK, adc->base + (LRADC_DELAY(0) + st)); in mxs_lradc_adc_configure_trigger()
464 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_trigger_init() local
466 trig = devm_iio_trigger_alloc(&iio->dev, "%s-dev%i", iio->name, in mxs_lradc_adc_trigger_init()
467 iio->id); in mxs_lradc_adc_trigger_init()
469 trig->dev.parent = adc->dev; in mxs_lradc_adc_trigger_init()
471 trig->ops = &mxs_lradc_adc_trigger_ops; in mxs_lradc_adc_trigger_init()
477 adc->trig = trig; in mxs_lradc_adc_trigger_init()
484 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_trigger_remove() local
486 iio_trigger_unregister(adc->trig); in mxs_lradc_adc_trigger_remove()
491 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_buffer_preenable() local
492 struct mxs_lradc *lradc = adc->lradc; in mxs_lradc_adc_buffer_preenable()
499 ((LRADC_DELAY_TIMER_LOOP - 1) << LRADC_CH_NUM_SAMPLES_OFFSET); in mxs_lradc_adc_buffer_preenable()
501 if (lradc->soc == IMX28_LRADC) in mxs_lradc_adc_buffer_preenable()
502 writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET, in mxs_lradc_adc_buffer_preenable()
503 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_preenable()
504 writel(lradc->buffer_vchans, in mxs_lradc_adc_buffer_preenable()
505 adc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_preenable()
507 for_each_set_bit(chan, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) { in mxs_lradc_adc_buffer_preenable()
511 writel(chan_value, adc->base + LRADC_CH(ofs)); in mxs_lradc_adc_buffer_preenable()
517 adc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_preenable()
518 writel(ctrl4_clr, adc->base + LRADC_CTRL4 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_preenable()
519 writel(ctrl4_set, adc->base + LRADC_CTRL4 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_buffer_preenable()
520 writel(ctrl1_irq, adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_SET); in mxs_lradc_adc_buffer_preenable()
522 adc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_SET); in mxs_lradc_adc_buffer_preenable()
529 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_buffer_postdisable() local
530 struct mxs_lradc *lradc = adc->lradc; in mxs_lradc_adc_buffer_postdisable()
533 adc->base + LRADC_DELAY(0) + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_postdisable()
535 writel(lradc->buffer_vchans, in mxs_lradc_adc_buffer_postdisable()
536 adc->base + LRADC_CTRL0 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_postdisable()
537 if (lradc->soc == IMX28_LRADC) in mxs_lradc_adc_buffer_postdisable()
538 writel(lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET, in mxs_lradc_adc_buffer_postdisable()
539 adc->base + LRADC_CTRL1 + STMP_OFFSET_REG_CLR); in mxs_lradc_adc_buffer_postdisable()
547 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_validate_scan_mask() local
548 struct mxs_lradc *lradc = adc->lradc; in mxs_lradc_adc_validate_scan_mask()
553 if (lradc->use_touchbutton) in mxs_lradc_adc_validate_scan_mask()
555 if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_4WIRE) in mxs_lradc_adc_validate_scan_mask()
557 if (lradc->touchscreen_wire == MXS_LRADC_TOUCHSCREEN_5WIRE) in mxs_lradc_adc_validate_scan_mask()
560 if (lradc->use_touchbutton) in mxs_lradc_adc_validate_scan_mask()
562 if (lradc->touchscreen_wire) in mxs_lradc_adc_validate_scan_mask()
626 .scan_index = -1,
662 .scan_index = -1,
673 static void mxs_lradc_adc_hw_init(struct mxs_lradc_adc *adc) in mxs_lradc_adc_hw_init() argument
675 /* The ADC always uses DELAY CHANNEL 0. */ in mxs_lradc_adc_hw_init()
680 /* Configure DELAY CHANNEL 0 for generic ADC sampling. */ in mxs_lradc_adc_hw_init()
681 writel(adc_cfg, adc->base + LRADC_DELAY(0)); in mxs_lradc_adc_hw_init()
688 writel(0, adc->base + LRADC_CTRL2); in mxs_lradc_adc_hw_init()
691 static void mxs_lradc_adc_hw_stop(struct mxs_lradc_adc *adc) in mxs_lradc_adc_hw_stop() argument
693 writel(0, adc->base + LRADC_DELAY(0)); in mxs_lradc_adc_hw_stop()
698 struct device *dev = &pdev->dev; in mxs_lradc_adc_probe() local
699 struct mxs_lradc *lradc = dev_get_drvdata(dev->parent); in mxs_lradc_adc_probe()
700 struct mxs_lradc_adc *adc; in mxs_lradc_adc_probe() local
708 iio = devm_iio_device_alloc(dev, sizeof(*adc)); in mxs_lradc_adc_probe()
710 dev_err(dev, "Failed to allocate IIO device\n"); in mxs_lradc_adc_probe()
711 return -ENOMEM; in mxs_lradc_adc_probe()
714 adc = iio_priv(iio); in mxs_lradc_adc_probe()
715 adc->lradc = lradc; in mxs_lradc_adc_probe()
716 adc->dev = dev; in mxs_lradc_adc_probe()
720 return -EINVAL; in mxs_lradc_adc_probe()
722 adc->base = devm_ioremap(dev, iores->start, resource_size(iores)); in mxs_lradc_adc_probe()
723 if (!adc->base) in mxs_lradc_adc_probe()
724 return -ENOMEM; in mxs_lradc_adc_probe()
726 init_completion(&adc->completion); in mxs_lradc_adc_probe()
727 spin_lock_init(&adc->lock); in mxs_lradc_adc_probe()
731 iio->name = pdev->name; in mxs_lradc_adc_probe()
732 iio->dev.parent = dev; in mxs_lradc_adc_probe()
733 iio->dev.of_node = dev->parent->of_node; in mxs_lradc_adc_probe()
734 iio->info = &mxs_lradc_adc_iio_info; in mxs_lradc_adc_probe()
735 iio->modes = INDIO_DIRECT_MODE; in mxs_lradc_adc_probe()
736 iio->masklength = LRADC_MAX_TOTAL_CHANS; in mxs_lradc_adc_probe()
738 if (lradc->soc == IMX23_LRADC) { in mxs_lradc_adc_probe()
739 iio->channels = mx23_lradc_chan_spec; in mxs_lradc_adc_probe()
740 iio->num_channels = ARRAY_SIZE(mx23_lradc_chan_spec); in mxs_lradc_adc_probe()
744 iio->channels = mx28_lradc_chan_spec; in mxs_lradc_adc_probe()
745 iio->num_channels = ARRAY_SIZE(mx28_lradc_chan_spec); in mxs_lradc_adc_probe()
750 ret = stmp_reset_block(adc->base); in mxs_lradc_adc_probe()
759 virq = irq_of_parse_and_map(dev->parent->of_node, irq); in mxs_lradc_adc_probe()
761 ret = devm_request_irq(dev, virq, mxs_lradc_adc_handle_irq, in mxs_lradc_adc_probe()
777 adc->vref_mv = mxs_lradc_adc_vref_mv[lradc->soc]; in mxs_lradc_adc_probe()
779 /* Populate available ADC input ranges */ in mxs_lradc_adc_probe()
781 for (s = 0; s < ARRAY_SIZE(adc->scale_avail[i]); s++) { in mxs_lradc_adc_probe()
787 * Vref >> (realbits - s) in mxs_lradc_adc_probe()
791 scale_uv = ((u64)adc->vref_mv[i] * 100000000) >> in mxs_lradc_adc_probe()
792 (LRADC_RESOLUTION - s); in mxs_lradc_adc_probe()
793 adc->scale_avail[i][s].nano = in mxs_lradc_adc_probe()
795 adc->scale_avail[i][s].integer = scale_uv; in mxs_lradc_adc_probe()
800 mxs_lradc_adc_hw_init(adc); in mxs_lradc_adc_probe()
805 dev_err(dev, "Failed to register IIO device\n"); in mxs_lradc_adc_probe()
812 mxs_lradc_adc_hw_stop(adc); in mxs_lradc_adc_probe()
822 struct mxs_lradc_adc *adc = iio_priv(iio); in mxs_lradc_adc_remove() local
825 mxs_lradc_adc_hw_stop(adc); in mxs_lradc_adc_remove()
834 .name = "mxs-lradc-adc",
842 MODULE_DESCRIPTION("Freescale MXS LRADC driver general purpose ADC driver");
844 MODULE_ALIAS("platform:mxs-lradc-adc");