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>
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",
338 if (chan->type == IIO_CURRENT && in axp192_adc_raw()
339 (chan->channel == AXP192_BATT_CHRG_I || in axp192_adc_raw()
340 chan->channel == AXP192_BATT_DISCHRG_I)) in axp192_adc_raw()
345 ret = axp20x_read_variable_width(info->regmap, chan->address, size); in axp192_adc_raw()
364 if (chan->type == IIO_CURRENT && chan->channel == AXP20X_BATT_DISCHRG_I) in axp20x_adc_raw()
369 ret = axp20x_read_variable_width(info->regmap, chan->address, size); in axp20x_adc_raw()
383 ret = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp22x_adc_raw()
399 * A generic "ADC data" channel is used for TS, tdie, vmid, in axp717_adc_raw()
403 switch (chan->channel) { in axp717_adc_raw()
405 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
409 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
413 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
417 regmap_write(info->regmap, AXP717_ADC_DATA_SEL, in axp717_adc_raw()
426 * register reserved and the remaining bits as the ADC value. in axp717_adc_raw()
428 ret = regmap_bulk_read(info->regmap, chan->address, bulk_reg, 2); in axp717_adc_raw()
442 ret = axp20x_read_variable_width(info->regmap, chan->address, 12); in axp813_adc_raw()
484 return -EINVAL; in axp192_adc_scale_voltage()
520 return -EINVAL; in axp20x_adc_scale_voltage()
540 return -EINVAL; in axp22x_adc_scale_voltage()
563 return -EINVAL; in axp813_adc_scale_voltage()
587 return -EINVAL; in axp20x_adc_scale_current()
594 switch (chan->type) { in axp192_adc_scale()
596 return axp192_adc_scale_voltage(chan->channel, val, val2); in axp192_adc_scale()
601 * therefore we can re-use the scaling function. in axp192_adc_scale()
603 return axp20x_adc_scale_current(chan->channel, val, val2); in axp192_adc_scale()
610 return -EINVAL; in axp192_adc_scale()
617 switch (chan->type) { in axp20x_adc_scale()
619 return axp20x_adc_scale_voltage(chan->channel, val, val2); in axp20x_adc_scale()
622 return axp20x_adc_scale_current(chan->channel, val, val2); in axp20x_adc_scale()
629 return -EINVAL; in axp20x_adc_scale()
636 switch (chan->type) { in axp22x_adc_scale()
638 return axp22x_adc_scale_voltage(chan->channel, val, val2); in axp22x_adc_scale()
649 return -EINVAL; in axp22x_adc_scale()
656 switch (chan->type) { in axp717_adc_scale()
670 return -EINVAL; in axp717_adc_scale()
677 switch (chan->type) { in axp813_adc_scale()
679 return axp813_adc_scale_voltage(chan->channel, val, val2); in axp813_adc_scale()
690 return -EINVAL; in axp813_adc_scale()
701 ret = regmap_read(info->regmap, AXP192_GPIO30_IN_RANGE, ®val); in axp192_adc_offset_voltage()
723 return -EINVAL; in axp192_adc_offset_voltage()
737 ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, ®val); in axp20x_adc_offset_voltage()
751 return -EINVAL; in axp20x_adc_offset_voltage()
761 switch (chan->type) { in axp192_adc_offset()
763 return axp192_adc_offset_voltage(indio_dev, chan->channel, val); in axp192_adc_offset()
766 *val = -1447; in axp192_adc_offset()
770 return -EINVAL; in axp192_adc_offset()
777 switch (chan->type) { in axp20x_adc_offset()
779 return axp20x_adc_offset_voltage(indio_dev, chan->channel, val); in axp20x_adc_offset()
782 *val = -1447; in axp20x_adc_offset()
786 return -EINVAL; in axp20x_adc_offset()
805 return -EINVAL; in axp192_read_raw()
824 return -EINVAL; in axp20x_read_raw()
835 *val = -2677; in axp22x_read_raw()
845 return -EINVAL; in axp22x_read_raw()
861 return -EINVAL; in axp717_read_raw()
871 *val = -2667; in axp813_read_raw()
881 return -EINVAL; in axp813_read_raw()
894 * for (independently) GPIO0-3 when in ADC mode. in axp192_write_raw()
897 return -EINVAL; in axp192_write_raw()
900 return -EINVAL; in axp192_write_raw()
902 switch (chan->channel) { in axp192_write_raw()
924 return -EINVAL; in axp192_write_raw()
927 return regmap_update_bits(info->regmap, AXP192_GPIO30_IN_RANGE, regmask, regval); in axp192_write_raw()
939 * for (independently) GPIO0 and GPIO1 when in ADC mode. in axp20x_write_raw()
942 return -EINVAL; in axp20x_write_raw()
945 return -EINVAL; in axp20x_write_raw()
947 switch (chan->channel) { in axp20x_write_raw()
959 return -EINVAL; in axp20x_write_raw()
962 return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, regmask, regval); in axp20x_write_raw()
989 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp20x_adc_rate()
996 return regmap_update_bits(info->regmap, AXP20X_ADC_RATE, in axp22x_adc_rate()
1003 return regmap_update_bits(info->regmap, AXP813_ADC_RATE, in axp813_adc_rate()
1073 { .compatible = "x-powers,axp192-adc", .data = (void *)&axp192_data, },
1074 { .compatible = "x-powers,axp209-adc", .data = (void *)&axp20x_data, },
1075 { .compatible = "x-powers,axp221-adc", .data = (void *)&axp22x_data, },
1076 { .compatible = "x-powers,axp717-adc", .data = (void *)&axp717_data, },
1077 { .compatible = "x-powers,axp813-adc", .data = (void *)&axp813_data, },
1083 { .name = "axp192-adc", .driver_data = (kernel_ulong_t)&axp192_data, },
1084 { .name = "axp20x-adc", .driver_data = (kernel_ulong_t)&axp20x_data, },
1085 { .name = "axp22x-adc", .driver_data = (kernel_ulong_t)&axp22x_data, },
1086 { .name = "axp717-adc", .driver_data = (kernel_ulong_t)&axp717_data, },
1087 { .name = "axp813-adc", .driver_data = (kernel_ulong_t)&axp813_data, },
1099 axp20x_dev = dev_get_drvdata(pdev->dev.parent); in axp20x_probe()
1101 indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*info)); in axp20x_probe()
1103 return -ENOMEM; in axp20x_probe()
1108 info->regmap = axp20x_dev->regmap; in axp20x_probe()
1109 indio_dev->modes = INDIO_DIRECT_MODE; in axp20x_probe()
1111 if (!dev_fwnode(&pdev->dev)) { in axp20x_probe()
1115 info->data = (const struct axp_data *)id->driver_data; in axp20x_probe()
1117 struct device *dev = &pdev->dev; in axp20x_probe()
1119 info->data = device_get_match_data(dev); in axp20x_probe()
1122 indio_dev->name = platform_get_device_id(pdev)->name; in axp20x_probe()
1123 indio_dev->info = info->data->iio_info; in axp20x_probe()
1124 indio_dev->num_channels = info->data->num_channels; in axp20x_probe()
1125 indio_dev->channels = info->data->channels; in axp20x_probe()
1128 regmap_write(info->regmap, info->data->adc_en1, in axp20x_probe()
1129 info->data->adc_en1_mask); in axp20x_probe()
1131 if (info->data->adc_en2_mask) in axp20x_probe()
1132 regmap_set_bits(info->regmap, info->data->adc_en2, in axp20x_probe()
1133 info->data->adc_en2_mask); in axp20x_probe()
1136 if (info->data->adc_rate) in axp20x_probe()
1137 info->data->adc_rate(info, 100); in axp20x_probe()
1139 ret = iio_map_array_register(indio_dev, info->data->maps); in axp20x_probe()
1141 dev_err(&pdev->dev, "failed to register IIO maps: %d\n", ret); in axp20x_probe()
1147 dev_err(&pdev->dev, "could not register the device\n"); in axp20x_probe()
1157 regmap_write(info->regmap, info->data->adc_en1, 0); in axp20x_probe()
1159 if (info->data->adc_en2_mask) in axp20x_probe()
1160 regmap_write(info->regmap, info->data->adc_en2, 0); in axp20x_probe()
1173 regmap_write(info->regmap, info->data->adc_en1, 0); in axp20x_remove()
1175 if (info->data->adc_en2_mask) in axp20x_remove()
1176 regmap_write(info->regmap, info->data->adc_en2, 0); in axp20x_remove()
1181 .name = "axp20x-adc",
1191 MODULE_DESCRIPTION("ADC driver for AXP20X and AXP22X PMICs");
1192 MODULE_AUTHOR("Quentin Schulz <quentin.schulz@free-electrons.com>");