Lines Matching +full:adc +full:- +full:chan
1 /* ADC driver for AXP20X and AXP22X PMICs
4 * Quentin Schulz <quentin.schulz@free-electrons.com>
111 .consumer_dev_name = "axp20x-usb-power-supply",
115 .consumer_dev_name = "axp20x-usb-power-supply",
119 .consumer_dev_name = "axp20x-ac-power-supply",
123 .consumer_dev_name = "axp20x-ac-power-supply",
127 .consumer_dev_name = "axp20x-battery-power-supply",
131 .consumer_dev_name = "axp20x-battery-power-supply",
135 .consumer_dev_name = "axp20x-battery-power-supply",
143 .consumer_dev_name = "axp20x-battery-power-supply",
147 .consumer_dev_name = "axp20x-battery-power-supply",
151 .consumer_dev_name = "axp20x-battery-power-supply",
231 struct iio_chan_spec const *chan, int *val) in axp20x_adc_raw() argument
241 if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I) in axp20x_adc_raw()
246 *val = axp20x_read_variable_width(info->regmap, chan->address, size); in axp20x_adc_raw()
254 struct iio_chan_spec const *chan, int *val) in axp22x_adc_raw() argument
264 if (chan->type == IIO_CURRENT && chan->channel == AXP22X_BATT_DISCHRG_I) in axp22x_adc_raw()
269 *val = axp20x_read_variable_width(info->regmap, chan->address, size); in axp22x_adc_raw()
277 struct iio_chan_spec const *chan, int *val) in axp813_adc_raw() argument
281 *val = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp813_adc_raw()
314 return -EINVAL; in axp20x_adc_scale_voltage()
332 return -EINVAL; in axp813_adc_scale_voltage()
356 return -EINVAL; in axp20x_adc_scale_current()
360 static int axp20x_adc_scale(struct iio_chan_spec const *chan, int *val, in axp20x_adc_scale() argument
363 switch (chan->type) { in axp20x_adc_scale()
365 return axp20x_adc_scale_voltage(chan->channel, val, val2); in axp20x_adc_scale()
368 return axp20x_adc_scale_current(chan->channel, val, val2); in axp20x_adc_scale()
375 return -EINVAL; in axp20x_adc_scale()
379 static int axp22x_adc_scale(struct iio_chan_spec const *chan, int *val, in axp22x_adc_scale() argument
382 switch (chan->type) { in axp22x_adc_scale()
384 if (chan->channel != AXP22X_BATT_V) in axp22x_adc_scale()
385 return -EINVAL; in axp22x_adc_scale()
401 return -EINVAL; in axp22x_adc_scale()
405 static int axp813_adc_scale(struct iio_chan_spec const *chan, int *val, in axp813_adc_scale() argument
408 switch (chan->type) { in axp813_adc_scale()
410 return axp813_adc_scale_voltage(chan->channel, val, val2); in axp813_adc_scale()
421 return -EINVAL; in axp813_adc_scale()
431 ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, val); in axp20x_adc_offset_voltage()
445 return -EINVAL; in axp20x_adc_offset_voltage()
454 struct iio_chan_spec const *chan, int *val) in axp20x_adc_offset() argument
456 switch (chan->type) { in axp20x_adc_offset()
458 return axp20x_adc_offset_voltage(indio_dev, chan->channel, val); in axp20x_adc_offset()
461 *val = -1447; in axp20x_adc_offset()
465 return -EINVAL; in axp20x_adc_offset()
470 struct iio_chan_spec const *chan, int *val, in axp20x_read_raw() argument
475 return axp20x_adc_offset(indio_dev, chan, val); in axp20x_read_raw()
478 return axp20x_adc_scale(chan, val, val2); in axp20x_read_raw()
481 return axp20x_adc_raw(indio_dev, chan, val); in axp20x_read_raw()
484 return -EINVAL; in axp20x_read_raw()
489 struct iio_chan_spec const *chan, int *val, in axp22x_read_raw() argument
494 *val = -2677; in axp22x_read_raw()
498 return axp22x_adc_scale(chan, val, val2); in axp22x_read_raw()
501 return axp22x_adc_raw(indio_dev, chan, val); in axp22x_read_raw()
504 return -EINVAL; in axp22x_read_raw()
509 struct iio_chan_spec const *chan, int *val, in axp813_read_raw() argument
514 *val = -2667; in axp813_read_raw()
518 return axp813_adc_scale(chan, val, val2); in axp813_read_raw()
521 return axp813_adc_raw(indio_dev, chan, val); in axp813_read_raw()
524 return -EINVAL; in axp813_read_raw()
529 struct iio_chan_spec const *chan, int val, int val2, in axp20x_write_raw() argument
537 * for (independently) GPIO0 and GPIO1 when in ADC mode. in axp20x_write_raw()
540 return -EINVAL; in axp20x_write_raw()
543 return -EINVAL; in axp20x_write_raw()
547 switch (chan->channel) { in axp20x_write_raw()
559 return -EINVAL; in axp20x_write_raw()
562 return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, reg, in axp20x_write_raw()
581 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp20x_adc_rate()
588 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp22x_adc_rate()
595 return regmap_update_bits(info->regmap, AXP813_ADC_RATE, in axp813_adc_rate()
642 { .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
643 { .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
644 { .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
650 { .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
651 { .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
652 { .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
664 axp20x_dev = dev_get_drvdata(pdev->dev.parent); in axp20x_probe()
666 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in axp20x_probe()
668 return -ENOMEM; in axp20x_probe()
673 info->regmap = axp20x_dev->regmap; in axp20x_probe()
674 indio_dev->dev.parent = &pdev->dev; in axp20x_probe()
675 indio_dev->dev.of_node = pdev->dev.of_node; in axp20x_probe()
676 indio_dev->modes = INDIO_DIRECT_MODE; in axp20x_probe()
678 if (!pdev->dev.of_node) { in axp20x_probe()
682 info->data = (struct axp_data *)id->driver_data; in axp20x_probe()
684 struct device *dev = &pdev->dev; in axp20x_probe()
686 info->data = (struct axp_data *)of_device_get_match_data(dev); in axp20x_probe()
689 indio_dev->name = platform_get_device_id(pdev)->name; in axp20x_probe()
690 indio_dev->info = info->data->iio_info; in axp20x_probe()
691 indio_dev->num_channels = info->data->num_channels; in axp20x_probe()
692 indio_dev->channels = info->data->channels; in axp20x_probe()
695 regmap_write(info->regmap, AXP20X_ADC_EN1, info->data->adc_en1_mask); in axp20x_probe()
697 if (info->data->adc_en2) in axp20x_probe()
699 regmap_update_bits(info->regmap, AXP20X_ADC_EN2, in axp20x_probe()
703 info->data->adc_rate(info, 100); in axp20x_probe()
705 ret = iio_map_array_register(indio_dev, info->data->maps); in axp20x_probe()
707 dev_err(&pdev->dev, "failed to register IIO maps: %d\n", ret); in axp20x_probe()
713 dev_err(&pdev->dev, "could not register the device\n"); in axp20x_probe()
723 regmap_write(info->regmap, AXP20X_ADC_EN1, 0); in axp20x_probe()
725 if (info->data->adc_en2) in axp20x_probe()
726 regmap_write(info->regmap, AXP20X_ADC_EN2, 0); in axp20x_probe()
739 regmap_write(info->regmap, AXP20X_ADC_EN1, 0); in axp20x_remove()
741 if (info->data->adc_en2) in axp20x_remove()
742 regmap_write(info->regmap, AXP20X_ADC_EN2, 0); in axp20x_remove()
749 .name = "axp20x-adc",
759 MODULE_DESCRIPTION("ADC driver for AXP20X and AXP22X PMICs");
760 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");