mirror of https://gitee.com/openkylin/linux.git
staging:iio:ad7291: Simplify threshold register lookup
The AD7291 register map is nicely uniform and we can easily compute the threshold register address for a certain channel using simple math instead of using a look-up table. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
08d7a70c01
commit
3f8db0d46b
|
@ -39,33 +39,9 @@
|
||||||
#define AD7291_VOLTAGE 0x01
|
#define AD7291_VOLTAGE 0x01
|
||||||
#define AD7291_T_SENSE 0x02
|
#define AD7291_T_SENSE 0x02
|
||||||
#define AD7291_T_AVERAGE 0x03
|
#define AD7291_T_AVERAGE 0x03
|
||||||
#define AD7291_CH0_DATA_HIGH 0x04
|
#define AD7291_DATA_HIGH(x) ((x) * 3 + 0x4)
|
||||||
#define AD7291_CH0_DATA_LOW 0x05
|
#define AD7291_DATA_LOW(x) ((x) * 3 + 0x5)
|
||||||
#define AD7291_CH0_HYST 0x06
|
#define AD7291_HYST(x) ((x) * 3 + 0x6)
|
||||||
#define AD7291_CH1_DATA_HIGH 0x07
|
|
||||||
#define AD7291_CH1_DATA_LOW 0x08
|
|
||||||
#define AD7291_CH1_HYST 0x09
|
|
||||||
#define AD7291_CH2_DATA_HIGH 0x0A
|
|
||||||
#define AD7291_CH2_DATA_LOW 0x0B
|
|
||||||
#define AD7291_CH2_HYST 0x0C
|
|
||||||
#define AD7291_CH3_DATA_HIGH 0x0D
|
|
||||||
#define AD7291_CH3_DATA_LOW 0x0E
|
|
||||||
#define AD7291_CH3_HYST 0x0F
|
|
||||||
#define AD7291_CH4_DATA_HIGH 0x10
|
|
||||||
#define AD7291_CH4_DATA_LOW 0x11
|
|
||||||
#define AD7291_CH4_HYST 0x12
|
|
||||||
#define AD7291_CH5_DATA_HIGH 0x13
|
|
||||||
#define AD7291_CH5_DATA_LOW 0x14
|
|
||||||
#define AD7291_CH5_HYST 0x15
|
|
||||||
#define AD7291_CH6_DATA_HIGH 0x16
|
|
||||||
#define AD7291_CH6_DATA_LOW 0x17
|
|
||||||
#define AD7291_CH6_HYST 0x18
|
|
||||||
#define AD7291_CH7_DATA_HIGH 0x19
|
|
||||||
#define AD7291_CH7_DATA_LOW 0x1A
|
|
||||||
#define AD7291_CH7_HYST 0x2B
|
|
||||||
#define AD7291_T_SENSE_HIGH 0x1C
|
|
||||||
#define AD7291_T_SENSE_LOW 0x1D
|
|
||||||
#define AD7291_T_SENSE_HYST 0x1E
|
|
||||||
#define AD7291_VOLTAGE_ALERT_STATUS 0x1F
|
#define AD7291_VOLTAGE_ALERT_STATUS 0x1F
|
||||||
#define AD7291_T_ALERT_STATUS 0x20
|
#define AD7291_T_ALERT_STATUS 0x20
|
||||||
|
|
||||||
|
@ -232,31 +208,31 @@ static inline ssize_t ad7291_set_hyst(struct device *dev,
|
||||||
static IIO_DEVICE_ATTR(in_temp0_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_temp0_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst,
|
ad7291_show_hyst, ad7291_set_hyst,
|
||||||
AD7291_T_SENSE_HYST);
|
AD7291_HYST(8));
|
||||||
static IIO_DEVICE_ATTR(in_voltage0_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage0_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH0_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(0));
|
||||||
static IIO_DEVICE_ATTR(in_voltage1_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage1_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH1_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(1));
|
||||||
static IIO_DEVICE_ATTR(in_voltage2_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage2_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH2_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(2));
|
||||||
static IIO_DEVICE_ATTR(in_voltage3_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage3_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH3_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(3));
|
||||||
static IIO_DEVICE_ATTR(in_voltage4_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage4_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH4_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(4));
|
||||||
static IIO_DEVICE_ATTR(in_voltage5_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage5_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH5_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(5));
|
||||||
static IIO_DEVICE_ATTR(in_voltage6_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage6_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH6_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(6));
|
||||||
static IIO_DEVICE_ATTR(in_voltage7_thresh_both_hyst_raw,
|
static IIO_DEVICE_ATTR(in_voltage7_thresh_both_hyst_raw,
|
||||||
S_IRUGO | S_IWUSR,
|
S_IRUGO | S_IWUSR,
|
||||||
ad7291_show_hyst, ad7291_set_hyst, AD7291_CH7_HYST);
|
ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(7));
|
||||||
|
|
||||||
static struct attribute *ad7291_event_attributes[] = {
|
static struct attribute *ad7291_event_attributes[] = {
|
||||||
&iio_dev_attr_in_temp0_thresh_both_hyst_raw.dev_attr.attr,
|
&iio_dev_attr_in_temp0_thresh_both_hyst_raw.dev_attr.attr,
|
||||||
|
@ -271,52 +247,46 @@ static struct attribute *ad7291_event_attributes[] = {
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* high / low */
|
static unsigned int ad7291_threshold_reg(u64 event_code)
|
||||||
static u8 ad7291_limit_regs[9][2] = {
|
{
|
||||||
{ AD7291_CH0_DATA_HIGH, AD7291_CH0_DATA_LOW },
|
unsigned int offset;
|
||||||
{ AD7291_CH1_DATA_HIGH, AD7291_CH1_DATA_LOW },
|
|
||||||
{ AD7291_CH2_DATA_HIGH, AD7291_CH2_DATA_LOW },
|
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
|
||||||
{ AD7291_CH3_DATA_HIGH, AD7291_CH3_DATA_LOW }, /* FIXME: ? */
|
case IIO_VOLTAGE:
|
||||||
{ AD7291_CH4_DATA_HIGH, AD7291_CH4_DATA_LOW },
|
offset = IIO_EVENT_CODE_EXTRACT_CHAN(event_code);
|
||||||
{ AD7291_CH5_DATA_HIGH, AD7291_CH5_DATA_LOW },
|
break;
|
||||||
{ AD7291_CH6_DATA_HIGH, AD7291_CH6_DATA_LOW },
|
case IIO_TEMP:
|
||||||
{ AD7291_CH7_DATA_HIGH, AD7291_CH7_DATA_LOW },
|
offset = 8;
|
||||||
/* temp */
|
break;
|
||||||
{ AD7291_T_SENSE_HIGH, AD7291_T_SENSE_LOW },
|
default:
|
||||||
};
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
|
||||||
|
return AD7291_DATA_LOW(offset);
|
||||||
|
else
|
||||||
|
return AD7291_DATA_HIGH(offset);
|
||||||
|
}
|
||||||
|
|
||||||
static int ad7291_read_event_value(struct iio_dev *indio_dev,
|
static int ad7291_read_event_value(struct iio_dev *indio_dev,
|
||||||
u64 event_code,
|
u64 event_code,
|
||||||
int *val)
|
int *val)
|
||||||
{
|
{
|
||||||
struct ad7291_chip_info *chip = iio_priv(indio_dev);
|
struct ad7291_chip_info *chip = iio_priv(indio_dev);
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
u8 reg;
|
|
||||||
u16 uval;
|
u16 uval;
|
||||||
s16 signval;
|
s16 signval;
|
||||||
|
|
||||||
|
ret = ad7291_i2c_read(chip, ad7291_threshold_reg(event_code), &uval);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
|
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
|
||||||
case IIO_VOLTAGE:
|
case IIO_VOLTAGE:
|
||||||
reg = ad7291_limit_regs[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)]
|
|
||||||
[!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
|
|
||||||
IIO_EV_DIR_RISING)];
|
|
||||||
|
|
||||||
ret = ad7291_i2c_read(chip, reg, &uval);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
*val = uval & AD7291_VALUE_MASK;
|
*val = uval & AD7291_VALUE_MASK;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case IIO_TEMP:
|
case IIO_TEMP:
|
||||||
reg = ad7291_limit_regs[8]
|
signval = (s16)((uval & AD7291_VALUE_MASK) << 4) >> 4;
|
||||||
[!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
|
|
||||||
IIO_EV_DIR_RISING)];
|
|
||||||
|
|
||||||
ret = ad7291_i2c_read(chip, reg, &signval);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
signval = (s16)((signval & AD7291_VALUE_MASK) << 4) >> 4;
|
|
||||||
*val = signval;
|
*val = signval;
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
|
@ -329,28 +299,21 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev,
|
||||||
int val)
|
int val)
|
||||||
{
|
{
|
||||||
struct ad7291_chip_info *chip = iio_priv(indio_dev);
|
struct ad7291_chip_info *chip = iio_priv(indio_dev);
|
||||||
u8 reg;
|
|
||||||
s16 signval;
|
|
||||||
|
|
||||||
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
|
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
|
||||||
case IIO_VOLTAGE:
|
case IIO_VOLTAGE:
|
||||||
if (val > AD7291_VALUE_MASK || val < 0)
|
if (val > AD7291_VALUE_MASK || val < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
reg = ad7291_limit_regs[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)]
|
break;
|
||||||
[!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
|
|
||||||
IIO_EV_DIR_RISING)];
|
|
||||||
return ad7291_i2c_write(chip, reg, val);
|
|
||||||
case IIO_TEMP:
|
case IIO_TEMP:
|
||||||
if (val > 2047 || val < -2048)
|
if (val > 2047 || val < -2048)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
reg = ad7291_limit_regs[8]
|
break;
|
||||||
[!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
|
|
||||||
IIO_EV_DIR_RISING)];
|
|
||||||
signval = val;
|
|
||||||
return ad7291_i2c_write(chip, reg, *(u16 *)&signval);
|
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
return ad7291_i2c_write(chip, ad7291_threshold_reg(event_code), val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ad7291_read_event_config(struct iio_dev *indio_dev,
|
static int ad7291_read_event_config(struct iio_dev *indio_dev,
|
||||||
|
|
Loading…
Reference in New Issue