mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 07:38:10 +00:00
iio: adc: vf610_adc: add helper function to read samples
This is a precursor change to make it simpler to remove the 'mlock' usage. Having the code in it's own helper function, also makes it easier to read the error paths. Signed-off-by: Nuno Sá <nuno.sa@analog.com> Reviewed-by: Haibo Chen <haibo.chen@nxp.com> Link: https://lore.kernel.org/r/20221004134909.1692021-10-nuno.sa@analog.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
8433aa3591
commit
f2bdea865e
1 changed files with 54 additions and 40 deletions
|
@ -622,6 +622,58 @@ static const struct attribute_group vf610_attribute_group = {
|
||||||
.attrs = vf610_attributes,
|
.attrs = vf610_attributes,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int vf610_read_sample(struct iio_dev *indio_dev,
|
||||||
|
struct iio_chan_spec const *chan, int *val)
|
||||||
|
{
|
||||||
|
struct vf610_adc *info = iio_priv(indio_dev);
|
||||||
|
unsigned int hc_cfg;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&indio_dev->mlock);
|
||||||
|
if (iio_buffer_enabled(indio_dev)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
reinit_completion(&info->completion);
|
||||||
|
hc_cfg = VF610_ADC_ADCHC(chan->channel);
|
||||||
|
hc_cfg |= VF610_ADC_AIEN;
|
||||||
|
writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
|
||||||
|
ret = wait_for_completion_interruptible_timeout(&info->completion,
|
||||||
|
VF610_ADC_TIMEOUT);
|
||||||
|
if (ret == 0) {
|
||||||
|
ret = -ETIMEDOUT;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
switch (chan->type) {
|
||||||
|
case IIO_VOLTAGE:
|
||||||
|
*val = info->value;
|
||||||
|
break;
|
||||||
|
case IIO_TEMP:
|
||||||
|
/*
|
||||||
|
* Calculate in degree Celsius times 1000
|
||||||
|
* Using the typical sensor slope of 1.84 mV/°C
|
||||||
|
* and VREFH_ADC at 3.3V, V at 25°C of 699 mV
|
||||||
|
*/
|
||||||
|
*val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) *
|
||||||
|
1000000 / VF610_TEMP_SLOPE_COEFF;
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = -EINVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
|
mutex_unlock(&indio_dev->mlock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int vf610_read_raw(struct iio_dev *indio_dev,
|
static int vf610_read_raw(struct iio_dev *indio_dev,
|
||||||
struct iio_chan_spec const *chan,
|
struct iio_chan_spec const *chan,
|
||||||
int *val,
|
int *val,
|
||||||
|
@ -629,53 +681,15 @@ static int vf610_read_raw(struct iio_dev *indio_dev,
|
||||||
long mask)
|
long mask)
|
||||||
{
|
{
|
||||||
struct vf610_adc *info = iio_priv(indio_dev);
|
struct vf610_adc *info = iio_priv(indio_dev);
|
||||||
unsigned int hc_cfg;
|
|
||||||
long ret;
|
long ret;
|
||||||
|
|
||||||
switch (mask) {
|
switch (mask) {
|
||||||
case IIO_CHAN_INFO_RAW:
|
case IIO_CHAN_INFO_RAW:
|
||||||
case IIO_CHAN_INFO_PROCESSED:
|
case IIO_CHAN_INFO_PROCESSED:
|
||||||
mutex_lock(&indio_dev->mlock);
|
ret = vf610_read_sample(indio_dev, chan, val);
|
||||||
if (iio_buffer_enabled(indio_dev)) {
|
if (ret < 0)
|
||||||
mutex_unlock(&indio_dev->mlock);
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
reinit_completion(&info->completion);
|
|
||||||
hc_cfg = VF610_ADC_ADCHC(chan->channel);
|
|
||||||
hc_cfg |= VF610_ADC_AIEN;
|
|
||||||
writel(hc_cfg, info->regs + VF610_REG_ADC_HC0);
|
|
||||||
ret = wait_for_completion_interruptible_timeout
|
|
||||||
(&info->completion, VF610_ADC_TIMEOUT);
|
|
||||||
if (ret == 0) {
|
|
||||||
mutex_unlock(&indio_dev->mlock);
|
|
||||||
return -ETIMEDOUT;
|
|
||||||
}
|
|
||||||
if (ret < 0) {
|
|
||||||
mutex_unlock(&indio_dev->mlock);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
|
|
||||||
switch (chan->type) {
|
|
||||||
case IIO_VOLTAGE:
|
|
||||||
*val = info->value;
|
|
||||||
break;
|
|
||||||
case IIO_TEMP:
|
|
||||||
/*
|
|
||||||
* Calculate in degree Celsius times 1000
|
|
||||||
* Using the typical sensor slope of 1.84 mV/°C
|
|
||||||
* and VREFH_ADC at 3.3V, V at 25°C of 699 mV
|
|
||||||
*/
|
|
||||||
*val = 25000 - ((int)info->value - VF610_VTEMP25_3V3) *
|
|
||||||
1000000 / VF610_TEMP_SLOPE_COEFF;
|
|
||||||
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mutex_unlock(&indio_dev->mlock);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex_unlock(&indio_dev->mlock);
|
|
||||||
return IIO_VAL_INT;
|
return IIO_VAL_INT;
|
||||||
|
|
||||||
case IIO_CHAN_INFO_SCALE:
|
case IIO_CHAN_INFO_SCALE:
|
||||||
|
|
Loading…
Reference in a new issue