Lines Matching +full:non +full:- +full:continuous

1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2016-2017, 2019, The Linux Foundation. All rights reserved.
28 #include <soc/qcom/qcom-spmi-pmic.h>
30 #define DRIVER_NAME "qcom-spmi-rradc"
219 * struct rradc_channel - rradc channel data
263 dev_err(chip->dev, in rradc_read()
266 return -EINVAL; in rradc_read()
270 ret = regmap_bulk_read(chip->regmap, chip->base + addr, buf, in rradc_read()
273 dev_err(chip->dev, "rr_adc reg 0x%x failed :%d\n", addr, in rradc_read()
278 ret = regmap_bulk_read(chip->regmap, chip->base + addr, in rradc_read()
281 dev_err(chip->dev, "rr_adc reg 0x%x failed :%d\n", addr, in rradc_read()
288 dev_dbg(chip->dev, in rradc_read()
298 dev_err(chip->dev, "Retry exceeded for coherency check\n"); in rradc_read()
306 if (chip->pmic->subtype == PM660_SUBTYPE) { in rradc_get_fab_coeff()
307 switch (chip->pmic->fab_id) { in rradc_get_fab_coeff()
320 } else if (chip->pmic->subtype == PMI8998_SUBTYPE) { in rradc_get_fab_coeff()
321 switch (chip->pmic->fab_id) { in rradc_get_fab_coeff()
331 return -EINVAL; in rradc_get_fab_coeff()
335 return -EINVAL; in rradc_get_fab_coeff()
348 current_value = chip->batt_id_data; in rradc_post_process_batt_id()
361 ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_LOG, in rradc_enable_continuous_mode()
364 dev_err(chip->dev, "log ctrl update to clear failed:%d\n", ret); in rradc_enable_continuous_mode()
368 ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_LOG, in rradc_enable_continuous_mode()
371 dev_err(chip->dev, "log ctrl update to not clear failed:%d\n", in rradc_enable_continuous_mode()
376 /* Switch to continuous mode */ in rradc_enable_continuous_mode()
377 ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_CTL, in rradc_enable_continuous_mode()
381 dev_err(chip->dev, "Update to continuous mode failed:%d\n", in rradc_enable_continuous_mode()
391 /* Switch to non continuous mode */ in rradc_disable_continuous_mode()
392 ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_CTL, in rradc_disable_continuous_mode()
395 dev_err(chip->dev, "Update to non-continuous mode failed:%d\n", in rradc_disable_continuous_mode()
418 ret = regmap_read(chip->regmap, chip->base + chan->status, &status); in rradc_is_ready()
432 if (chan->trigger_mask == 0) { in rradc_read_status_in_cont_mode()
433 dev_err(chip->dev, "Channel doesn't have a trigger mask\n"); in rradc_read_status_in_cont_mode()
434 return -EINVAL; in rradc_read_status_in_cont_mode()
437 ret = regmap_update_bits(chip->regmap, chip->base + chan->trigger_addr, in rradc_read_status_in_cont_mode()
438 chan->trigger_mask, chan->trigger_mask); in rradc_read_status_in_cont_mode()
440 dev_err(chip->dev, in rradc_read_status_in_cont_mode()
442 iio_chan->extend_name, ret); in rradc_read_status_in_cont_mode()
448 dev_err(chip->dev, "Failed to switch to continuous mode\n"); in rradc_read_status_in_cont_mode()
464 dev_err(chip->dev, "Channel '%s' is not ready\n", in rradc_read_status_in_cont_mode()
465 iio_chan->extend_name); in rradc_read_status_in_cont_mode()
466 ret = -ETIMEDOUT; in rradc_read_status_in_cont_mode()
472 regmap_update_bits(chip->regmap, chip->base + chan->trigger_addr, in rradc_read_status_in_cont_mode()
473 chan->trigger_mask, 0); in rradc_read_status_in_cont_mode()
484 ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, in rradc_prepare_batt_id_conversion()
488 dev_err(chip->dev, "Enabling BATT ID channel failed:%d\n", ret); in rradc_prepare_batt_id_conversion()
492 ret = regmap_update_bits(chip->regmap, in rradc_prepare_batt_id_conversion()
493 chip->base + RR_ADC_BATT_ID_TRIGGER, in rradc_prepare_batt_id_conversion()
496 dev_err(chip->dev, "BATT_ID trigger set failed:%d\n", ret); in rradc_prepare_batt_id_conversion()
503 regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_TRIGGER, in rradc_prepare_batt_id_conversion()
507 regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, in rradc_prepare_batt_id_conversion()
521 mutex_lock(&chip->conversion_lock); in rradc_do_conversion()
527 dev_err(chip->dev, "Battery ID conversion failed:%d\n", in rradc_do_conversion()
537 dev_err(chip->dev, in rradc_do_conversion()
538 "Error reading in continuous mode:%d\n", ret); in rradc_do_conversion()
549 dev_dbg(chip->dev, "channel '%s' is not ready\n", in rradc_do_conversion()
550 iio_chan->extend_name); in rradc_do_conversion()
551 ret = -ENODATA; in rradc_do_conversion()
557 ret = rradc_read(chip, chan->lsb, buf, chan->size); in rradc_do_conversion()
559 dev_err(chip->dev, "read data failed\n"); in rradc_do_conversion()
573 dev_err(chip->dev, in rradc_do_conversion()
575 ret = -EINVAL; in rradc_do_conversion()
581 chip->batt_id_data = 150; in rradc_do_conversion()
584 chip->batt_id_data = 15; in rradc_do_conversion()
587 chip->batt_id_data = 5; in rradc_do_conversion()
592 * We can rely on the second byte being 0 for 1-byte channels. in rradc_do_conversion()
598 mutex_unlock(&chip->conversion_lock); in rradc_do_conversion()
611 dev_err(chip->dev, "Unable to get fab id coefficients\n"); in rradc_read_scale()
612 return -EINVAL; in rradc_read_scale()
643 *val = -RR_ADC_TEMP_FS_VOLTAGE_NUM; in rradc_read_scale()
656 return -EINVAL; in rradc_read_scale()
679 dev_err(chip->dev, in rradc_read_offset()
681 return -EINVAL; in rradc_read_offset()
683 offset1 = -(fab_offset * RR_ADC_TEMP_FS_VOLTAGE_DEN * in rradc_read_offset()
697 * The -1 is to compensate for lost precision. in rradc_read_offset()
698 * It should actually be -0.7906976744186046. in rradc_read_offset()
702 *val = (int)(offset1 - offset2 - 1); in rradc_read_offset()
705 offset1 = -RR_ADC_DIE_TEMP_OFFSET * in rradc_read_offset()
710 offset2 = -(int64_t)RR_ADC_CHG_TEMP_OFFSET_MILLI_DEGC * in rradc_read_offset()
717 * The result is -339, it should be -338.69789, this results in rradc_read_offset()
719 * -0.004 - -0.0175 degrees C in rradc_read_offset()
721 *val = (int)(offset1 - offset2); in rradc_read_offset()
726 return -EINVAL; in rradc_read_offset()
738 if (chan_spec->address >= RR_ADC_CHAN_MAX) { in rradc_read_raw()
739 dev_err(chip->dev, "Invalid channel index:%lu\n", in rradc_read_raw()
740 chan_spec->address); in rradc_read_raw()
741 return -EINVAL; in rradc_read_raw()
746 return rradc_read_scale(chip, chan_spec->address, val, val2); in rradc_read_raw()
748 return rradc_read_offset(chip, chan_spec->address, val); in rradc_read_raw()
750 ret = rradc_do_conversion(chip, chan_spec->address, &adc_code); in rradc_read_raw()
757 chan = &rradc_chans[chan_spec->address]; in rradc_read_raw()
758 if (!chan->scale_fn) in rradc_read_raw()
759 return -EINVAL; in rradc_read_raw()
760 ret = rradc_do_conversion(chip, chan_spec->address, &adc_code); in rradc_read_raw()
764 *val = chan->scale_fn(chip, adc_code, val); in rradc_read_raw()
767 return -EINVAL; in rradc_read_raw()
775 rradc_chans[chan->address].label); in rradc_read_label()
928 struct device *dev = &pdev->dev; in rradc_probe()
935 return -ENOMEM; in rradc_probe()
938 chip->regmap = dev_get_regmap(pdev->dev.parent, NULL); in rradc_probe()
939 if (!chip->regmap) { in rradc_probe()
941 return -EINVAL; in rradc_probe()
944 chip->dev = dev; in rradc_probe()
945 mutex_init(&chip->conversion_lock); in rradc_probe()
947 ret = device_property_read_u32(dev, "reg", &chip->base); in rradc_probe()
949 dev_err(chip->dev, "Couldn't find reg address, ret = %d\n", in rradc_probe()
954 batt_id_delay = -1; in rradc_probe()
955 ret = device_property_read_u32(dev, "qcom,batt-id-delay-ms", in rradc_probe()
963 batt_id_delay = -1; in rradc_probe()
968 ret = regmap_update_bits(chip->regmap, in rradc_probe()
969 chip->base + RR_ADC_BATT_ID_CFG, in rradc_probe()
972 dev_err(chip->dev, in rradc_probe()
979 chip->pmic = qcom_pmic_get(chip->dev); in rradc_probe()
980 if (IS_ERR(chip->pmic)) { in rradc_probe()
981 dev_err(chip->dev, "Unable to get reference to PMIC device\n"); in rradc_probe()
982 return PTR_ERR(chip->pmic); in rradc_probe()
985 switch (chip->pmic->subtype) { in rradc_probe()
987 indio_dev->name = "pmi8998-rradc"; in rradc_probe()
990 indio_dev->name = "pm660-rradc"; in rradc_probe()
993 indio_dev->name = DRIVER_NAME; in rradc_probe()
996 indio_dev->modes = INDIO_DIRECT_MODE; in rradc_probe()
997 indio_dev->info = &rradc_info; in rradc_probe()
998 indio_dev->channels = rradc_iio_chans; in rradc_probe()
999 indio_dev->num_channels = ARRAY_SIZE(rradc_iio_chans); in rradc_probe()
1005 { .compatible = "qcom,pm660-rradc" },
1006 { .compatible = "qcom,pmi8998-rradc" },