int32_t qpnp_iadc_vadc_sync_read( enum qpnp_iadc_channels i_channel, struct qpnp_iadc_result *i_result, enum qpnp_vadc_channels v_channel, struct qpnp_vadc_result *v_result) { struct qpnp_iadc_drv *iadc = qpnp_iadc; int rc = 0; if (!iadc || !iadc->iadc_initialized) return -EPROBE_DEFER; mutex_lock(&iadc->iadc_vadc_lock); if (iadc->iadc_poll_eoc) { pr_debug("acquiring iadc eoc wakelock\n"); pm_stay_awake(iadc->dev); } rc = qpnp_check_pmic_temp(); if (rc) { pr_err("PMIC die temp check failed\n"); goto fail; } iadc->iadc_mode_sel = true; rc = qpnp_vadc_iadc_sync_request(v_channel); if (rc) { pr_err("Configuring VADC failed\n"); goto fail; } rc = qpnp_iadc_read(i_channel, i_result); if (rc) pr_err("Configuring IADC failed\n"); /* Intentional fall through to release VADC */ rc = qpnp_vadc_iadc_sync_complete_request(v_channel, v_result); if (rc) pr_err("Releasing VADC failed\n"); fail: iadc->iadc_mode_sel = false; if (iadc->iadc_poll_eoc) { pr_debug("releasing iadc eoc wakelock\n"); pm_relax(iadc->dev); } mutex_unlock(&iadc->iadc_vadc_lock); return rc; }
static ssize_t qpnp_iadc_show(struct device *dev, struct device_attribute *devattr, char *buf) { struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); struct qpnp_iadc_result result; int rc = -1; rc = qpnp_iadc_read(attr->index, &result); if (rc) return 0; return snprintf(buf, QPNP_ADC_HWMON_NAME_LENGTH, "Result:%d\n", result.result_ua); }
static int qpnp_get_battery_current(int *current_ua) { struct qpnp_iadc_result i_result; int ret; if (qpnp_iadc_is_ready()) { pr_err("%s: qpnp iadc is not ready!\n", __func__); *current_ua = 0; return 0; } ret = qpnp_iadc_read(EXTERNAL_RSENSE, &i_result); if (ret) { pr_err("%s: failed to read iadc\n", __func__); *current_ua = 0; return ret; } *current_ua = -i_result.result_ua; return 0; }
int32_t qpnp_iadc_get_offset(enum qpnp_iadc_channels channel, int32_t *result) { return qpnp_iadc_read(channel, result); }
int32_t qpnp_iadc_get_gain(int32_t *result) { return qpnp_iadc_read(GAIN_CALIBRATION_25MV, result); }