mirror of https://gitee.com/openkylin/linux.git
staging: iio: adc: ad7192: Add system calibration support
This patch will add a system calibration attribute for each channel. Using this option the user will have the ability to calibrate each channel for zero scale and full scale. It uses the iio_chan_spec_ext_info and IIO_ENUM to implement the functionality. Signed-off-by: Mircea Caprioru <mircea.caprioru@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
parent
c88c8cd826
commit
42776c14c6
|
@ -13,3 +13,27 @@ Description:
|
||||||
need to minimize the system current consumption.
|
need to minimize the system current consumption.
|
||||||
Reading gives the state of the bridge switch.
|
Reading gives the state of the bridge switch.
|
||||||
Writing '1' enables the bridge switch.
|
Writing '1' enables the bridge switch.
|
||||||
|
|
||||||
|
What: /sys/bus/iio/devices/iio:deviceX/in_voltagex_sys_calibration
|
||||||
|
KernelVersion:
|
||||||
|
Contact: linux-iio@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Initiates the system calibration procedure. This is done on a
|
||||||
|
single channel at a time. Write '1' to start the calibration.
|
||||||
|
|
||||||
|
What: /sys/bus/iio/devices/iio:deviceX/in_voltagex_sys_calibration_mode_available
|
||||||
|
KernelVersion:
|
||||||
|
Contact: linux-iio@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Reading returns a list with the possible calibration modes.
|
||||||
|
There are two available options:
|
||||||
|
"zero_scale" - calibrate to zero scale
|
||||||
|
"full_scale" - calibrate to full scale
|
||||||
|
|
||||||
|
What: /sys/bus/iio/devices/iio:deviceX/in_voltagex_sys_calibration_mode
|
||||||
|
KernelVersion:
|
||||||
|
Contact: linux-iio@vger.kernel.org
|
||||||
|
Description:
|
||||||
|
Sets up the calibration mode used in the system calibration
|
||||||
|
procedure. Reading returns the current calibration mode.
|
||||||
|
Writing sets the system calibration mode.
|
||||||
|
|
|
@ -155,6 +155,11 @@
|
||||||
* The DOUT/RDY output must also be wired to an interrupt capable GPIO.
|
* The DOUT/RDY output must also be wired to an interrupt capable GPIO.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AD7192_SYSCALIB_ZERO_SCALE,
|
||||||
|
AD7192_SYSCALIB_FULL_SCALE,
|
||||||
|
};
|
||||||
|
|
||||||
struct ad7192_state {
|
struct ad7192_state {
|
||||||
struct regulator *avdd;
|
struct regulator *avdd;
|
||||||
struct regulator *dvdd;
|
struct regulator *dvdd;
|
||||||
|
@ -169,10 +174,80 @@ struct ad7192_state {
|
||||||
u8 devid;
|
u8 devid;
|
||||||
u8 clock_sel;
|
u8 clock_sel;
|
||||||
struct mutex lock; /* protect sensor state */
|
struct mutex lock; /* protect sensor state */
|
||||||
|
u8 syscalib_mode[8];
|
||||||
|
|
||||||
struct ad_sigma_delta sd;
|
struct ad_sigma_delta sd;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const ad7192_syscalib_modes[] = {
|
||||||
|
[AD7192_SYSCALIB_ZERO_SCALE] = "zero_scale",
|
||||||
|
[AD7192_SYSCALIB_FULL_SCALE] = "full_scale",
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ad7192_set_syscalib_mode(struct iio_dev *indio_dev,
|
||||||
|
const struct iio_chan_spec *chan,
|
||||||
|
unsigned int mode)
|
||||||
|
{
|
||||||
|
struct ad7192_state *st = iio_priv(indio_dev);
|
||||||
|
|
||||||
|
st->syscalib_mode[chan->channel] = mode;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ad7192_get_syscalib_mode(struct iio_dev *indio_dev,
|
||||||
|
const struct iio_chan_spec *chan)
|
||||||
|
{
|
||||||
|
struct ad7192_state *st = iio_priv(indio_dev);
|
||||||
|
|
||||||
|
return st->syscalib_mode[chan->channel];
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t ad7192_write_syscalib(struct iio_dev *indio_dev,
|
||||||
|
uintptr_t private,
|
||||||
|
const struct iio_chan_spec *chan,
|
||||||
|
const char *buf, size_t len)
|
||||||
|
{
|
||||||
|
struct ad7192_state *st = iio_priv(indio_dev);
|
||||||
|
bool sys_calib;
|
||||||
|
int ret, temp;
|
||||||
|
|
||||||
|
ret = strtobool(buf, &sys_calib);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
temp = st->syscalib_mode[chan->channel];
|
||||||
|
if (sys_calib) {
|
||||||
|
if (temp == AD7192_SYSCALIB_ZERO_SCALE)
|
||||||
|
ret = ad_sd_calibrate(&st->sd, AD7192_MODE_CAL_SYS_ZERO,
|
||||||
|
chan->address);
|
||||||
|
else
|
||||||
|
ret = ad_sd_calibrate(&st->sd, AD7192_MODE_CAL_SYS_FULL,
|
||||||
|
chan->address);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret ? ret : len;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct iio_enum ad7192_syscalib_mode_enum = {
|
||||||
|
.items = ad7192_syscalib_modes,
|
||||||
|
.num_items = ARRAY_SIZE(ad7192_syscalib_modes),
|
||||||
|
.set = ad7192_set_syscalib_mode,
|
||||||
|
.get = ad7192_get_syscalib_mode
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct iio_chan_spec_ext_info ad7192_calibsys_ext_info[] = {
|
||||||
|
{
|
||||||
|
.name = "sys_calibration",
|
||||||
|
.write = ad7192_write_syscalib,
|
||||||
|
.shared = IIO_SEPARATE,
|
||||||
|
},
|
||||||
|
IIO_ENUM("sys_calibration_mode", IIO_SEPARATE,
|
||||||
|
&ad7192_syscalib_mode_enum),
|
||||||
|
IIO_ENUM_AVAILABLE("sys_calibration_mode", &ad7192_syscalib_mode_enum),
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
static struct ad7192_state *ad_sigma_delta_to_ad7192(struct ad_sigma_delta *sd)
|
static struct ad7192_state *ad_sigma_delta_to_ad7192(struct ad_sigma_delta *sd)
|
||||||
{
|
{
|
||||||
return container_of(sd, struct ad7192_state, sd);
|
return container_of(sd, struct ad7192_state, sd);
|
||||||
|
@ -770,9 +845,11 @@ static int ad7192_channels_config(struct iio_dev *indio_dev)
|
||||||
*chan = channels[i];
|
*chan = channels[i];
|
||||||
chan->info_mask_shared_by_all |=
|
chan->info_mask_shared_by_all |=
|
||||||
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY);
|
BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY);
|
||||||
if (chan->type != IIO_TEMP)
|
if (chan->type != IIO_TEMP) {
|
||||||
chan->info_mask_shared_by_type_available |=
|
chan->info_mask_shared_by_type_available |=
|
||||||
BIT(IIO_CHAN_INFO_SCALE);
|
BIT(IIO_CHAN_INFO_SCALE);
|
||||||
|
chan->ext_info = ad7192_calibsys_ext_info;
|
||||||
|
}
|
||||||
chan++;
|
chan++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue