• Home
  • Raw
  • Download

Lines Matching +full:axp209 +full:- +full:adc

1 // SPDX-License-Identifier: GPL-2.0-only
2 /* ADC driver for AXP20X and AXP22X PMICs
5 * Quentin Schulz <quentin.schulz@free-electrons.com>
108 .consumer_dev_name = "axp20x-usb-power-supply",
112 .consumer_dev_name = "axp20x-usb-power-supply",
116 .consumer_dev_name = "axp20x-ac-power-supply",
120 .consumer_dev_name = "axp20x-ac-power-supply",
124 .consumer_dev_name = "axp20x-battery-power-supply",
128 .consumer_dev_name = "axp20x-battery-power-supply",
132 .consumer_dev_name = "axp20x-battery-power-supply",
140 .consumer_dev_name = "axp20x-battery-power-supply",
144 .consumer_dev_name = "axp20x-battery-power-supply",
148 .consumer_dev_name = "axp20x-battery-power-supply",
238 if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I) in axp20x_adc_raw()
243 *val = axp20x_read_variable_width(info->regmap, chan->address, size); in axp20x_adc_raw()
255 *val = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp22x_adc_raw()
267 *val = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp813_adc_raw()
300 return -EINVAL; in axp20x_adc_scale_voltage()
318 return -EINVAL; in axp813_adc_scale_voltage()
342 return -EINVAL; in axp20x_adc_scale_current()
349 switch (chan->type) { in axp20x_adc_scale()
351 return axp20x_adc_scale_voltage(chan->channel, val, val2); in axp20x_adc_scale()
354 return axp20x_adc_scale_current(chan->channel, val, val2); in axp20x_adc_scale()
361 return -EINVAL; in axp20x_adc_scale()
368 switch (chan->type) { in axp22x_adc_scale()
370 if (chan->channel != AXP22X_BATT_V) in axp22x_adc_scale()
371 return -EINVAL; in axp22x_adc_scale()
386 return -EINVAL; in axp22x_adc_scale()
393 switch (chan->type) { in axp813_adc_scale()
395 return axp813_adc_scale_voltage(chan->channel, val, val2); in axp813_adc_scale()
406 return -EINVAL; in axp813_adc_scale()
416 ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, val); in axp20x_adc_offset_voltage()
430 return -EINVAL; in axp20x_adc_offset_voltage()
441 switch (chan->type) { in axp20x_adc_offset()
443 return axp20x_adc_offset_voltage(indio_dev, chan->channel, val); in axp20x_adc_offset()
446 *val = -1447; in axp20x_adc_offset()
450 return -EINVAL; in axp20x_adc_offset()
469 return -EINVAL; in axp20x_read_raw()
479 *val = -2677; in axp22x_read_raw()
489 return -EINVAL; in axp22x_read_raw()
499 *val = -2667; in axp813_read_raw()
509 return -EINVAL; in axp813_read_raw()
522 * for (independently) GPIO0 and GPIO1 when in ADC mode. in axp20x_write_raw()
525 return -EINVAL; in axp20x_write_raw()
528 return -EINVAL; in axp20x_write_raw()
532 switch (chan->channel) { in axp20x_write_raw()
544 return -EINVAL; in axp20x_write_raw()
547 return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, reg, in axp20x_write_raw()
566 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp20x_adc_rate()
573 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp22x_adc_rate()
580 return regmap_update_bits(info->regmap, AXP813_ADC_RATE, in axp813_adc_rate()
627 { .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
628 { .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
629 { .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
635 { .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
636 { .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
637 { .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
649 axp20x_dev = dev_get_drvdata(pdev->dev.parent); in axp20x_probe()
651 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in axp20x_probe()
653 return -ENOMEM; in axp20x_probe()
658 info->regmap = axp20x_dev->regmap; in axp20x_probe()
659 indio_dev->modes = INDIO_DIRECT_MODE; in axp20x_probe()
661 if (!dev_fwnode(&pdev->dev)) { in axp20x_probe()
665 info->data = (const struct axp_data *)id->driver_data; in axp20x_probe()
667 struct device *dev = &pdev->dev; in axp20x_probe()
669 info->data = device_get_match_data(dev); in axp20x_probe()
672 indio_dev->name = platform_get_device_id(pdev)->name; in axp20x_probe()
673 indio_dev->info = info->data->iio_info; in axp20x_probe()
674 indio_dev->num_channels = info->data->num_channels; in axp20x_probe()
675 indio_dev->channels = info->data->channels; in axp20x_probe()
678 regmap_write(info->regmap, AXP20X_ADC_EN1, info->data->adc_en1_mask); in axp20x_probe()
680 if (info->data->adc_en2) in axp20x_probe()
682 regmap_update_bits(info->regmap, AXP20X_ADC_EN2, in axp20x_probe()
686 info->data->adc_rate(info, 100); in axp20x_probe()
688 ret = iio_map_array_register(indio_dev, info->data->maps); in axp20x_probe()
690 dev_err(&pdev->dev, "failed to register IIO maps: %d\n", ret); in axp20x_probe()
696 dev_err(&pdev->dev, "could not register the device\n"); in axp20x_probe()
706 regmap_write(info->regmap, AXP20X_ADC_EN1, 0); in axp20x_probe()
708 if (info->data->adc_en2) in axp20x_probe()
709 regmap_write(info->regmap, AXP20X_ADC_EN2, 0); in axp20x_probe()
722 regmap_write(info->regmap, AXP20X_ADC_EN1, 0); in axp20x_remove()
724 if (info->data->adc_en2) in axp20x_remove()
725 regmap_write(info->regmap, AXP20X_ADC_EN2, 0); in axp20x_remove()
732 .name = "axp20x-adc",
742 MODULE_DESCRIPTION("ADC driver for AXP20X and AXP22X PMICs");
743 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");