Lines Matching +full:axp221 +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>
159 IIO_MAP("vbus_v", "axp20x-usb-power-supply", "vbus_v"),
160 IIO_MAP("vbus_i", "axp20x-usb-power-supply", "vbus_i"),
161 IIO_MAP("acin_v", "axp20x-ac-power-supply", "acin_v"),
162 IIO_MAP("acin_i", "axp20x-ac-power-supply", "acin_i"),
163 IIO_MAP("batt_v", "axp20x-battery-power-supply", "batt_v"),
164 IIO_MAP("batt_chrg_i", "axp20x-battery-power-supply", "batt_chrg_i"),
165 IIO_MAP("batt_dischrg_i", "axp20x-battery-power-supply", "batt_dischrg_i"),
170 IIO_MAP("batt_v", "axp20x-battery-power-supply", "batt_v"),
171 IIO_MAP("batt_chrg_i", "axp20x-battery-power-supply", "batt_chrg_i"),
172 IIO_MAP("batt_dischrg_i", "axp20x-battery-power-supply", "batt_dischrg_i"),
178 .consumer_dev_name = "axp20x-usb-power-supply",
182 .consumer_dev_name = "axp20x-battery-power-supply",
186 .consumer_dev_name = "axp20x-battery-power-supply",
337 if (chan->type == IIO_CURRENT && in axp192_adc_raw()
338 (chan->channel == AXP192_BATT_CHRG_I || in axp192_adc_raw()
339 chan->channel == AXP192_BATT_DISCHRG_I)) in axp192_adc_raw()
344 ret = axp20x_read_variable_width(info->regmap, chan->address, size); in axp192_adc_raw()
363 if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I) in axp20x_adc_raw()
368 ret = axp20x_read_variable_width(info->regmap, chan->address, size); in axp20x_adc_raw()
382 ret = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp22x_adc_raw()
398 * A generic "ADC data" channel is used for TS, tdie, vmid, in axp717_adc_raw()
402 switch (chan->channel) { in axp717_adc_raw()
404 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
408 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
412 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
416 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
425 * register reserved and the remaining bits as the ADC value. in axp717_adc_raw()
427 ret = regmap_bulk_read(info->regmap, chan->address, bulk_reg, 2); in axp717_adc_raw()
441 ret = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp813_adc_raw()
483 return -EINVAL; in axp192_adc_scale_voltage()
519 return -EINVAL; in axp20x_adc_scale_voltage()
539 return -EINVAL; in axp22x_adc_scale_voltage()
562 return -EINVAL; in axp813_adc_scale_voltage()
586 return -EINVAL; in axp20x_adc_scale_current()
593 switch (chan->type) { in axp192_adc_scale()
595 return axp192_adc_scale_voltage(chan->channel, val, val2); in axp192_adc_scale()
600 * therefore we can re-use the scaling function. in axp192_adc_scale()
602 return axp20x_adc_scale_current(chan->channel, val, val2); in axp192_adc_scale()
609 return -EINVAL; in axp192_adc_scale()
616 switch (chan->type) { in axp20x_adc_scale()
618 return axp20x_adc_scale_voltage(chan->channel, val, val2); in axp20x_adc_scale()
621 return axp20x_adc_scale_current(chan->channel, val, val2); in axp20x_adc_scale()
628 return -EINVAL; in axp20x_adc_scale()
635 switch (chan->type) { in axp22x_adc_scale()
637 return axp22x_adc_scale_voltage(chan->channel, val, val2); in axp22x_adc_scale()
648 return -EINVAL; in axp22x_adc_scale()
655 switch (chan->type) { in axp717_adc_scale()
669 return -EINVAL; in axp717_adc_scale()
676 switch (chan->type) { in axp813_adc_scale()
678 return axp813_adc_scale_voltage(chan->channel, val, val2); in axp813_adc_scale()
689 return -EINVAL; in axp813_adc_scale()
700 ret = regmap_read(info->regmap, AXP192_GPIO30_IN_RANGE, &regval); in axp192_adc_offset_voltage()
722 return -EINVAL; in axp192_adc_offset_voltage()
736 ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, &regval); in axp20x_adc_offset_voltage()
750 return -EINVAL; in axp20x_adc_offset_voltage()
760 switch (chan->type) { in axp192_adc_offset()
762 return axp192_adc_offset_voltage(indio_dev, chan->channel, val); in axp192_adc_offset()
765 *val = -1447; in axp192_adc_offset()
769 return -EINVAL; in axp192_adc_offset()
776 switch (chan->type) { in axp20x_adc_offset()
778 return axp20x_adc_offset_voltage(indio_dev, chan->channel, val); in axp20x_adc_offset()
781 *val = -1447; in axp20x_adc_offset()
785 return -EINVAL; in axp20x_adc_offset()
804 return -EINVAL; in axp192_read_raw()
823 return -EINVAL; in axp20x_read_raw()
834 *val = -2677; in axp22x_read_raw()
844 return -EINVAL; in axp22x_read_raw()
860 return -EINVAL; in axp717_read_raw()
870 *val = -2667; in axp813_read_raw()
880 return -EINVAL; in axp813_read_raw()
893 * for (independently) GPIO0-3 when in ADC mode. in axp192_write_raw()
896 return -EINVAL; in axp192_write_raw()
899 return -EINVAL; in axp192_write_raw()
901 switch (chan->channel) { in axp192_write_raw()
923 return -EINVAL; in axp192_write_raw()
926 return regmap_update_bits(info->regmap, AXP192_GPIO30_IN_RANGE, regmask, regval); in axp192_write_raw()
938 * for (independently) GPIO0 and GPIO1 when in ADC mode. in axp20x_write_raw()
941 return -EINVAL; in axp20x_write_raw()
944 return -EINVAL; in axp20x_write_raw()
946 switch (chan->channel) { in axp20x_write_raw()
958 return -EINVAL; in axp20x_write_raw()
961 return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, regmask, regval); in axp20x_write_raw()
988 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp20x_adc_rate()
995 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp22x_adc_rate()
1002 return regmap_update_bits(info->regmap, AXP813_ADC_RATE, in axp813_adc_rate()
1072 { .compatible = "x-powers,axp192-adc", .data = (void *)&axp192_data, },
1073 { .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
1074 { .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
1075 { .compatible = "x-powers,axp717-adc", .data = (void *)&axp717_data, },
1076 { .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
1082 { .name = "axp192-adc", .driver_data = (kernel_ulong_t)&axp192_data, },
1083 { .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
1084 { .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
1085 { .name = "axp717-adc", .driver_data = (kernel_ulong_t)&axp717_data, },
1086 { .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
1098 axp20x_dev = dev_get_drvdata(pdev->dev.parent); in axp20x_probe()
1100 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in axp20x_probe()
1102 return -ENOMEM; in axp20x_probe()
1107 info->regmap = axp20x_dev->regmap; in axp20x_probe()
1108 indio_dev->modes = INDIO_DIRECT_MODE; in axp20x_probe()
1110 if (!dev_fwnode(&pdev->dev)) { in axp20x_probe()
1114 info->data = (const struct axp_data *)id->driver_data; in axp20x_probe()
1116 struct device *dev = &pdev->dev; in axp20x_probe()
1118 info->data = device_get_match_data(dev); in axp20x_probe()
1121 indio_dev->name = platform_get_device_id(pdev)->name; in axp20x_probe()
1122 indio_dev->info = info->data->iio_info; in axp20x_probe()
1123 indio_dev->num_channels = info->data->num_channels; in axp20x_probe()
1124 indio_dev->channels = info->data->channels; in axp20x_probe()
1127 regmap_write(info->regmap, info->data->adc_en1, in axp20x_probe()
1128 info->data->adc_en1_mask); in axp20x_probe()
1130 if (info->data->adc_en2_mask) in axp20x_probe()
1131 regmap_set_bits(info->regmap, info->data->adc_en2, in axp20x_probe()
1132 info->data->adc_en2_mask); in axp20x_probe()
1135 if (info->data->adc_rate) in axp20x_probe()
1136 info->data->adc_rate(info, 100); in axp20x_probe()
1138 ret = iio_map_array_register(indio_dev, info->data->maps); in axp20x_probe()
1140 dev_err(&pdev->dev, "failed to register IIO maps: %d\n", ret); in axp20x_probe()
1146 dev_err(&pdev->dev, "could not register the device\n"); in axp20x_probe()
1156 regmap_write(info->regmap, info->data->adc_en1, 0); in axp20x_probe()
1158 if (info->data->adc_en2_mask) in axp20x_probe()
1159 regmap_write(info->regmap, info->data->adc_en2, 0); in axp20x_probe()
1172 regmap_write(info->regmap, info->data->adc_en1, 0); in axp20x_remove()
1174 if (info->data->adc_en2_mask) in axp20x_remove()
1175 regmap_write(info->regmap, info->data->adc_en2, 0); in axp20x_remove()
1180 .name = "axp20x-adc",
1190 MODULE_DESCRIPTION("ADC driver for AXP20X and AXP22X PMICs");
1191 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");