iio: adc: qcom-vadc: move several adc5 functions to common file
ADC-TM5 driver will make use of several functions from ADC5 driver. Move them to qcom-vadc-common driver. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> Link: https://lore.kernel.org/r/20201204025509.1075506-4-dmitry.baryshkov@linaro.org Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
8d502ef682
commit
c7ba98fc40
|
@ -154,18 +154,6 @@ struct adc5_chip {
|
||||||
const struct adc5_data *data;
|
const struct adc5_data *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct vadc_prescale_ratio adc5_prescale_ratios[] = {
|
|
||||||
{.num = 1, .den = 1},
|
|
||||||
{.num = 1, .den = 3},
|
|
||||||
{.num = 1, .den = 4},
|
|
||||||
{.num = 1, .den = 6},
|
|
||||||
{.num = 1, .den = 20},
|
|
||||||
{.num = 1, .den = 8},
|
|
||||||
{.num = 10, .den = 81},
|
|
||||||
{.num = 1, .den = 10},
|
|
||||||
{.num = 1, .den = 16}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int adc5_read(struct adc5_chip *adc, u16 offset, u8 *data, int len)
|
static int adc5_read(struct adc5_chip *adc, u16 offset, u8 *data, int len)
|
||||||
{
|
{
|
||||||
return regmap_bulk_read(adc->regmap, adc->base + offset, data, len);
|
return regmap_bulk_read(adc->regmap, adc->base + offset, data, len);
|
||||||
|
@ -181,55 +169,6 @@ static int adc5_masked_write(struct adc5_chip *adc, u16 offset, u8 mask, u8 val)
|
||||||
return regmap_update_bits(adc->regmap, adc->base + offset, mask, val);
|
return regmap_update_bits(adc->regmap, adc->base + offset, mask, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adc5_prescaling_from_dt(u32 num, u32 den)
|
|
||||||
{
|
|
||||||
unsigned int pre;
|
|
||||||
|
|
||||||
for (pre = 0; pre < ARRAY_SIZE(adc5_prescale_ratios); pre++)
|
|
||||||
if (adc5_prescale_ratios[pre].num == num &&
|
|
||||||
adc5_prescale_ratios[pre].den == den)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (pre == ARRAY_SIZE(adc5_prescale_ratios))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return pre;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int adc5_hw_settle_time_from_dt(u32 value,
|
|
||||||
const unsigned int *hw_settle)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < VADC_HW_SETTLE_SAMPLES_MAX; i++) {
|
|
||||||
if (value == hw_settle[i])
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int adc5_avg_samples_from_dt(u32 value)
|
|
||||||
{
|
|
||||||
if (!is_power_of_2(value) || value > ADC5_AVG_SAMPLES_MAX)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
return __ffs(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int adc5_decimation_from_dt(u32 value,
|
|
||||||
const unsigned int *decimation)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ADC5_DECIMATION_SAMPLES_MAX; i++) {
|
|
||||||
if (value == decimation[i])
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int adc5_read_voltage_data(struct adc5_chip *adc, u16 *data)
|
static int adc5_read_voltage_data(struct adc5_chip *adc, u16 *data)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -511,7 +450,7 @@ static int adc_read_raw_common(struct iio_dev *indio_dev,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ret = qcom_adc5_hw_scale(prop->scale_fn_type,
|
ret = qcom_adc5_hw_scale(prop->scale_fn_type,
|
||||||
&adc5_prescale_ratios[prop->prescale],
|
prop->prescale,
|
||||||
adc->data,
|
adc->data,
|
||||||
adc_code_volt, val);
|
adc_code_volt, val);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -717,7 +656,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
|
||||||
|
|
||||||
ret = of_property_read_u32(node, "qcom,decimation", &value);
|
ret = of_property_read_u32(node, "qcom,decimation", &value);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ret = adc5_decimation_from_dt(value, data->decimation);
|
ret = qcom_adc5_decimation_from_dt(value, data->decimation);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "%02x invalid decimation %d\n",
|
dev_err(dev, "%02x invalid decimation %d\n",
|
||||||
chan, value);
|
chan, value);
|
||||||
|
@ -730,7 +669,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
|
||||||
|
|
||||||
ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
|
ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ret = adc5_prescaling_from_dt(varr[0], varr[1]);
|
ret = qcom_adc5_prescaling_from_dt(varr[0], varr[1]);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "%02x invalid pre-scaling <%d %d>\n",
|
dev_err(dev, "%02x invalid pre-scaling <%d %d>\n",
|
||||||
chan, varr[0], varr[1]);
|
chan, varr[0], varr[1]);
|
||||||
|
@ -759,11 +698,9 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
|
||||||
if ((dig_version[0] >= ADC5_HW_SETTLE_DIFF_MINOR &&
|
if ((dig_version[0] >= ADC5_HW_SETTLE_DIFF_MINOR &&
|
||||||
dig_version[1] >= ADC5_HW_SETTLE_DIFF_MAJOR) ||
|
dig_version[1] >= ADC5_HW_SETTLE_DIFF_MAJOR) ||
|
||||||
adc->data->info == &adc7_info)
|
adc->data->info == &adc7_info)
|
||||||
ret = adc5_hw_settle_time_from_dt(value,
|
ret = qcom_adc5_hw_settle_time_from_dt(value, data->hw_settle_2);
|
||||||
data->hw_settle_2);
|
|
||||||
else
|
else
|
||||||
ret = adc5_hw_settle_time_from_dt(value,
|
ret = qcom_adc5_hw_settle_time_from_dt(value, data->hw_settle_1);
|
||||||
data->hw_settle_1);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "%02x invalid hw-settle-time %d us\n",
|
dev_err(dev, "%02x invalid hw-settle-time %d us\n",
|
||||||
|
@ -777,7 +714,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc,
|
||||||
|
|
||||||
ret = of_property_read_u32(node, "qcom,avg-samples", &value);
|
ret = of_property_read_u32(node, "qcom,avg-samples", &value);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ret = adc5_avg_samples_from_dt(value);
|
ret = qcom_adc5_avg_samples_from_dt(value);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "%02x invalid avg-samples %d\n",
|
dev_err(dev, "%02x invalid avg-samples %d\n",
|
||||||
chan, value);
|
chan, value);
|
||||||
|
|
|
@ -278,6 +278,18 @@ static const struct vadc_map_pt adcmap7_100k[] = {
|
||||||
{ 2420, 130048 }
|
{ 2420, 130048 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct vadc_prescale_ratio adc5_prescale_ratios[] = {
|
||||||
|
{.num = 1, .den = 1},
|
||||||
|
{.num = 1, .den = 3},
|
||||||
|
{.num = 1, .den = 4},
|
||||||
|
{.num = 1, .den = 6},
|
||||||
|
{.num = 1, .den = 20},
|
||||||
|
{.num = 1, .den = 8},
|
||||||
|
{.num = 10, .den = 81},
|
||||||
|
{.num = 1, .den = 10},
|
||||||
|
{.num = 1, .den = 16}
|
||||||
|
};
|
||||||
|
|
||||||
static int qcom_vadc_scale_hw_calib_volt(
|
static int qcom_vadc_scale_hw_calib_volt(
|
||||||
const struct vadc_prescale_ratio *prescale,
|
const struct vadc_prescale_ratio *prescale,
|
||||||
const struct adc5_data *data,
|
const struct adc5_data *data,
|
||||||
|
@ -647,10 +659,12 @@ int qcom_vadc_scale(enum vadc_scale_fn_type scaletype,
|
||||||
EXPORT_SYMBOL(qcom_vadc_scale);
|
EXPORT_SYMBOL(qcom_vadc_scale);
|
||||||
|
|
||||||
int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
|
int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
|
||||||
const struct vadc_prescale_ratio *prescale,
|
unsigned int prescale_ratio,
|
||||||
const struct adc5_data *data,
|
const struct adc5_data *data,
|
||||||
u16 adc_code, int *result)
|
u16 adc_code, int *result)
|
||||||
{
|
{
|
||||||
|
const struct vadc_prescale_ratio *prescale = &adc5_prescale_ratios[prescale_ratio];
|
||||||
|
|
||||||
if (!(scaletype >= SCALE_HW_CALIB_DEFAULT &&
|
if (!(scaletype >= SCALE_HW_CALIB_DEFAULT &&
|
||||||
scaletype < SCALE_HW_CALIB_INVALID)) {
|
scaletype < SCALE_HW_CALIB_INVALID)) {
|
||||||
pr_err("Invalid scale type %d\n", scaletype);
|
pr_err("Invalid scale type %d\n", scaletype);
|
||||||
|
@ -662,6 +676,58 @@ int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(qcom_adc5_hw_scale);
|
EXPORT_SYMBOL(qcom_adc5_hw_scale);
|
||||||
|
|
||||||
|
int qcom_adc5_prescaling_from_dt(u32 num, u32 den)
|
||||||
|
{
|
||||||
|
unsigned int pre;
|
||||||
|
|
||||||
|
for (pre = 0; pre < ARRAY_SIZE(adc5_prescale_ratios); pre++)
|
||||||
|
if (adc5_prescale_ratios[pre].num == num &&
|
||||||
|
adc5_prescale_ratios[pre].den == den)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (pre == ARRAY_SIZE(adc5_prescale_ratios))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return pre;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(qcom_adc5_prescaling_from_dt);
|
||||||
|
|
||||||
|
int qcom_adc5_hw_settle_time_from_dt(u32 value,
|
||||||
|
const unsigned int *hw_settle)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < VADC_HW_SETTLE_SAMPLES_MAX; i++) {
|
||||||
|
if (value == hw_settle[i])
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(qcom_adc5_hw_settle_time_from_dt);
|
||||||
|
|
||||||
|
int qcom_adc5_avg_samples_from_dt(u32 value)
|
||||||
|
{
|
||||||
|
if (!is_power_of_2(value) || value > ADC5_AVG_SAMPLES_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return __ffs(value);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(qcom_adc5_avg_samples_from_dt);
|
||||||
|
|
||||||
|
int qcom_adc5_decimation_from_dt(u32 value, const unsigned int *decimation)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ADC5_DECIMATION_SAMPLES_MAX; i++) {
|
||||||
|
if (value == decimation[i])
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(qcom_adc5_decimation_from_dt);
|
||||||
|
|
||||||
int qcom_vadc_decimation_from_dt(u32 value)
|
int qcom_vadc_decimation_from_dt(u32 value)
|
||||||
{
|
{
|
||||||
if (!is_power_of_2(value) || value < VADC_DECIMATION_MIN ||
|
if (!is_power_of_2(value) || value < VADC_DECIMATION_MIN ||
|
||||||
|
|
|
@ -168,10 +168,18 @@ struct qcom_adc5_scale_type {
|
||||||
};
|
};
|
||||||
|
|
||||||
int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
|
int qcom_adc5_hw_scale(enum vadc_scale_fn_type scaletype,
|
||||||
const struct vadc_prescale_ratio *prescale,
|
unsigned int prescale_ratio,
|
||||||
const struct adc5_data *data,
|
const struct adc5_data *data,
|
||||||
u16 adc_code, int *result_mdec);
|
u16 adc_code, int *result_mdec);
|
||||||
|
|
||||||
|
int qcom_adc5_prescaling_from_dt(u32 num, u32 den);
|
||||||
|
|
||||||
|
int qcom_adc5_hw_settle_time_from_dt(u32 value, const unsigned int *hw_settle);
|
||||||
|
|
||||||
|
int qcom_adc5_avg_samples_from_dt(u32 value);
|
||||||
|
|
||||||
|
int qcom_adc5_decimation_from_dt(u32 value, const unsigned int *decimation);
|
||||||
|
|
||||||
int qcom_vadc_decimation_from_dt(u32 value);
|
int qcom_vadc_decimation_from_dt(u32 value);
|
||||||
|
|
||||||
#endif /* QCOM_VADC_COMMON_H */
|
#endif /* QCOM_VADC_COMMON_H */
|
||||||
|
|
Loading…
Reference in New Issue