static int32_t qpnp_iadc_configure(struct qpnp_iadc_chip *iadc,
                                   enum qpnp_iadc_channels channel,
                                   uint16_t *raw_code, uint32_t mode_sel)
{
    u8 qpnp_iadc_mode_reg = 0, qpnp_iadc_ch_sel_reg = 0;
    u8 qpnp_iadc_conv_req = 0, qpnp_iadc_dig_param_reg = 0;
    u8 status1 = 0;
    uint32_t count = 0;
    int32_t rc = 0;

    qpnp_iadc_ch_sel_reg = channel;

    qpnp_iadc_dig_param_reg |= iadc->adc->amux_prop->decimation <<
                               QPNP_IADC_DEC_RATIO_SEL;
    if (iadc->iadc_mode_sel)
        qpnp_iadc_mode_reg |= (QPNP_ADC_TRIM_EN | QPNP_VADC_SYNCH_EN);
    else
        qpnp_iadc_mode_reg |= QPNP_ADC_TRIM_EN;

    qpnp_iadc_conv_req = QPNP_IADC_CONV_REQ;

    rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_MODE_CTL, qpnp_iadc_mode_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(iadc, QPNP_IADC_ADC_CH_SEL_CTL,
                             qpnp_iadc_ch_sel_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(iadc, QPNP_ADC_DIG_PARAM,
                             qpnp_iadc_dig_param_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(iadc, QPNP_FAST_AVG_CTL,
                             iadc->adc->amux_prop->fast_avg_setup);
    if (rc < 0) {
        pr_err("qpnp adc fast averaging configure error\n");
        return rc;
    }

    if (!iadc->iadc_poll_eoc)
        INIT_COMPLETION(iadc->adc->adc_rslt_completion);

    rc = qpnp_iadc_enable(iadc, true);
    if (rc)
        return rc;

    rc = qpnp_iadc_write_reg(iadc, QPNP_CONV_REQ, qpnp_iadc_conv_req);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    if (iadc->iadc_poll_eoc) {
        while (status1 != QPNP_STATUS1_EOC) {
            rc = qpnp_iadc_read_reg(iadc, QPNP_STATUS1, &status1);
            if (rc < 0)
                return rc;
            status1 &= QPNP_STATUS1_REQ_STS_EOC_MASK;
            usleep_range(QPNP_ADC_CONV_TIME_MIN,
                         QPNP_ADC_CONV_TIME_MAX);
            count++;
            if (count > QPNP_ADC_ERR_COUNT) {
                pr_err("retry error exceeded\n");
                rc = qpnp_iadc_status_debug(iadc);
                if (rc < 0)
                    pr_err("IADC status debug failed\n");
                rc = -EINVAL;
                return rc;
            }
        }
    } else {
        rc = wait_for_completion_timeout(
                 &iadc->adc->adc_rslt_completion,
                 QPNP_ADC_COMPLETION_TIMEOUT);
        if (!rc) {
            rc = qpnp_iadc_read_reg(iadc, QPNP_STATUS1, &status1);
            if (rc < 0)
                return rc;
            status1 &= QPNP_STATUS1_REQ_STS_EOC_MASK;
            if (status1 == QPNP_STATUS1_EOC)
                pr_debug("End of conversion status set\n");
            else {
                rc = qpnp_iadc_status_debug(iadc);
                if (rc < 0) {
                    pr_err("status debug failed %d\n", rc);
                    return rc;
                }
                return -EINVAL;
            }
        }
    }

    rc = qpnp_iadc_read_conversion_result(iadc, raw_code);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    return 0;
}
static int32_t qpnp_iadc_configure(enum qpnp_iadc_channels channel,
                                   uint16_t *raw_code, uint32_t mode_sel)
{
    struct qpnp_iadc_drv *iadc = qpnp_iadc;
    u8 qpnp_iadc_mode_reg = 0, qpnp_iadc_ch_sel_reg = 0;
    u8 qpnp_iadc_conv_req = 0, qpnp_iadc_dig_param_reg = 0;
    int32_t rc = 0;

    qpnp_iadc_ch_sel_reg = channel;

    qpnp_iadc_dig_param_reg |= iadc->adc->amux_prop->decimation <<
                               QPNP_IADC_DEC_RATIO_SEL;
    if (iadc->iadc_mode_sel)
        qpnp_iadc_mode_reg |= (QPNP_ADC_TRIM_EN | QPNP_VADC_SYNCH_EN);
    else
        qpnp_iadc_mode_reg |= QPNP_ADC_TRIM_EN;

    qpnp_iadc_conv_req = QPNP_IADC_CONV_REQ;

    rc = qpnp_iadc_write_reg(QPNP_IADC_MODE_CTL, qpnp_iadc_mode_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(QPNP_IADC_ADC_CH_SEL_CTL,
                             qpnp_iadc_ch_sel_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(QPNP_ADC_DIG_PARAM,
                             qpnp_iadc_dig_param_reg);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = qpnp_iadc_write_reg(QPNP_HW_SETTLE_DELAY,
                             iadc->adc->amux_prop->hw_settle_time);
    if (rc < 0) {
        pr_err("qpnp adc configure error for hw settling time setup\n");
        return rc;
    }

    rc = qpnp_iadc_write_reg(QPNP_FAST_AVG_CTL,
                             iadc->adc->amux_prop->fast_avg_setup);
    if (rc < 0) {
        pr_err("qpnp adc fast averaging configure error\n");
        return rc;
    }

    INIT_COMPLETION(iadc->adc->adc_rslt_completion);

    rc = qpnp_iadc_enable(true);
    if (rc)
        return rc;

    rc = qpnp_iadc_write_reg(QPNP_CONV_REQ, qpnp_iadc_conv_req);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    rc = wait_for_completion_timeout(&iadc->adc->adc_rslt_completion,
                                     QPNP_ADC_COMPLETION_TIMEOUT);
    if (!rc) {
        u8 status1 = 0;
        rc = qpnp_iadc_read_reg(QPNP_STATUS1, &status1);
        if (rc < 0)
            return rc;
        status1 &= (QPNP_STATUS1_REQ_STS | QPNP_STATUS1_EOC);
        if (status1 == QPNP_STATUS1_EOC)
            pr_debug("End of conversion status set\n");
        else {
            rc = qpnp_iadc_status_debug();
            if (rc < 0) {
                pr_err("status1 read failed with %d\n", rc);
                return rc;
            }
            return -EINVAL;
        }
    }

    rc = qpnp_iadc_read_conversion_result(raw_code);
    if (rc) {
        pr_err("qpnp adc read adc failed with %d\n", rc);
        return rc;
    }

    return 0;
}