Loading drivers/staging/iio/adc/ad7291.c +59 −37 Original line number Diff line number Diff line Loading @@ -248,13 +248,14 @@ static struct attribute *ad7291_event_attributes[] = { NULL, }; static unsigned int ad7291_threshold_reg(u64 event_code) static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, enum iio_event_direction dir) { unsigned int offset; switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: offset = IIO_EVENT_CODE_EXTRACT_CHAN(event_code); offset = chan->channel; break; case IIO_TEMP: offset = 8; Loading @@ -263,43 +264,49 @@ static unsigned int ad7291_threshold_reg(u64 event_code) return 0; } if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) if (dir == 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, u64 event_code, int *val) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, enum iio_event_info info, int *val, int *val2) { struct ad7291_chip_info *chip = iio_priv(indio_dev); int ret; u16 uval; ret = ad7291_i2c_read(chip, ad7291_threshold_reg(event_code), &uval); ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir), &uval); if (ret < 0) return ret; switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: *val = uval & AD7291_VALUE_MASK; return 0; return IIO_VAL_INT; case IIO_TEMP: *val = sign_extend32(uval, 11); return 0; return IIO_VAL_INT; default: return -EINVAL; }; } static int ad7291_write_event_value(struct iio_dev *indio_dev, u64 event_code, int val) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, enum iio_event_info info, int val, int val2) { struct ad7291_chip_info *chip = iio_priv(indio_dev); switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: if (val > AD7291_VALUE_MASK || val < 0) return -EINVAL; Loading @@ -312,20 +319,21 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev, return -EINVAL; } return ad7291_i2c_write(chip, ad7291_threshold_reg(event_code), val); return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir), val); } static int ad7291_read_event_config(struct iio_dev *indio_dev, u64 event_code) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir) { struct ad7291_chip_info *chip = iio_priv(indio_dev); /* To be enabled the channel must simply be on. If any are enabled we are in continuous sampling mode */ switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: if (chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code)))) if (chip->c_mask & (1 << (15 - chan->channel))) return 1; else return 0; Loading @@ -339,11 +347,14 @@ static int ad7291_read_event_config(struct iio_dev *indio_dev, } static int ad7291_write_event_config(struct iio_dev *indio_dev, u64 event_code, const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, int state) { int ret = 0; struct ad7291_chip_info *chip = iio_priv(indio_dev); unsigned int mask; u16 regval; mutex_lock(&chip->state_lock); Loading @@ -354,16 +365,14 @@ static int ad7291_write_event_config(struct iio_dev *indio_dev, * Possible to disable temp as well but that makes single read tricky. */ switch (IIO_EVENT_CODE_EXTRACT_TYPE(event_code)) { mask = BIT(15 - chan->channel); switch (chan->type) { case IIO_VOLTAGE: if ((!state) && (chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code))))) chip->c_mask &= ~(1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN (event_code))); else if (state && (!(chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code)))))) chip->c_mask |= (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN (event_code))); if ((!state) && (chip->c_mask & mask)) chip->c_mask &= ~mask; else if (state && (!(chip->c_mask & mask))) chip->c_mask |= mask; else break; Loading Loading @@ -473,6 +482,20 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, } } static const struct iio_event_spec ad7291_events[] = { { .type = IIO_EV_TYPE_THRESH, .dir = IIO_EV_DIR_RISING, .mask_separate = BIT(IIO_EV_INFO_VALUE) | BIT(IIO_EV_INFO_ENABLE), }, { .type = IIO_EV_TYPE_THRESH, .dir = IIO_EV_DIR_FALLING, .mask_separate = BIT(IIO_EV_INFO_VALUE) | BIT(IIO_EV_INFO_ENABLE), }, }; #define AD7291_VOLTAGE_CHAN(_chan) \ { \ .type = IIO_VOLTAGE, \ Loading @@ -480,8 +503,8 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ .indexed = 1, \ .channel = _chan, \ .event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)|\ IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) \ .event_spec = ad7291_events, \ .num_event_specs = ARRAY_SIZE(ad7291_events), \ } static const struct iio_chan_spec ad7291_channels[] = { Loading @@ -500,9 +523,8 @@ static const struct iio_chan_spec ad7291_channels[] = { BIT(IIO_CHAN_INFO_SCALE), .indexed = 1, .channel = 0, .event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)| IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) .event_spec = ad7291_events, .num_event_specs = ARRAY_SIZE(ad7291_events), } }; Loading @@ -512,10 +534,10 @@ static struct attribute_group ad7291_event_attribute_group = { static const struct iio_info ad7291_info = { .read_raw = &ad7291_read_raw, .read_event_config = &ad7291_read_event_config, .write_event_config = &ad7291_write_event_config, .read_event_value = &ad7291_read_event_value, .write_event_value = &ad7291_write_event_value, .read_event_config_new = &ad7291_read_event_config, .write_event_config_new = &ad7291_write_event_config, .read_event_value_new = &ad7291_read_event_value, .write_event_value_new = &ad7291_write_event_value, .event_attrs = &ad7291_event_attribute_group, .driver_module = THIS_MODULE, }; Loading Loading
drivers/staging/iio/adc/ad7291.c +59 −37 Original line number Diff line number Diff line Loading @@ -248,13 +248,14 @@ static struct attribute *ad7291_event_attributes[] = { NULL, }; static unsigned int ad7291_threshold_reg(u64 event_code) static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, enum iio_event_direction dir) { unsigned int offset; switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: offset = IIO_EVENT_CODE_EXTRACT_CHAN(event_code); offset = chan->channel; break; case IIO_TEMP: offset = 8; Loading @@ -263,43 +264,49 @@ static unsigned int ad7291_threshold_reg(u64 event_code) return 0; } if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) if (dir == 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, u64 event_code, int *val) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, enum iio_event_info info, int *val, int *val2) { struct ad7291_chip_info *chip = iio_priv(indio_dev); int ret; u16 uval; ret = ad7291_i2c_read(chip, ad7291_threshold_reg(event_code), &uval); ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir), &uval); if (ret < 0) return ret; switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: *val = uval & AD7291_VALUE_MASK; return 0; return IIO_VAL_INT; case IIO_TEMP: *val = sign_extend32(uval, 11); return 0; return IIO_VAL_INT; default: return -EINVAL; }; } static int ad7291_write_event_value(struct iio_dev *indio_dev, u64 event_code, int val) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, enum iio_event_info info, int val, int val2) { struct ad7291_chip_info *chip = iio_priv(indio_dev); switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: if (val > AD7291_VALUE_MASK || val < 0) return -EINVAL; Loading @@ -312,20 +319,21 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev, return -EINVAL; } return ad7291_i2c_write(chip, ad7291_threshold_reg(event_code), val); return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir), val); } static int ad7291_read_event_config(struct iio_dev *indio_dev, u64 event_code) const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir) { struct ad7291_chip_info *chip = iio_priv(indio_dev); /* To be enabled the channel must simply be on. If any are enabled we are in continuous sampling mode */ switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) { switch (chan->type) { case IIO_VOLTAGE: if (chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code)))) if (chip->c_mask & (1 << (15 - chan->channel))) return 1; else return 0; Loading @@ -339,11 +347,14 @@ static int ad7291_read_event_config(struct iio_dev *indio_dev, } static int ad7291_write_event_config(struct iio_dev *indio_dev, u64 event_code, const struct iio_chan_spec *chan, enum iio_event_type type, enum iio_event_direction dir, int state) { int ret = 0; struct ad7291_chip_info *chip = iio_priv(indio_dev); unsigned int mask; u16 regval; mutex_lock(&chip->state_lock); Loading @@ -354,16 +365,14 @@ static int ad7291_write_event_config(struct iio_dev *indio_dev, * Possible to disable temp as well but that makes single read tricky. */ switch (IIO_EVENT_CODE_EXTRACT_TYPE(event_code)) { mask = BIT(15 - chan->channel); switch (chan->type) { case IIO_VOLTAGE: if ((!state) && (chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code))))) chip->c_mask &= ~(1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN (event_code))); else if (state && (!(chip->c_mask & (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN(event_code)))))) chip->c_mask |= (1 << (15 - IIO_EVENT_CODE_EXTRACT_CHAN (event_code))); if ((!state) && (chip->c_mask & mask)) chip->c_mask &= ~mask; else if (state && (!(chip->c_mask & mask))) chip->c_mask |= mask; else break; Loading Loading @@ -473,6 +482,20 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, } } static const struct iio_event_spec ad7291_events[] = { { .type = IIO_EV_TYPE_THRESH, .dir = IIO_EV_DIR_RISING, .mask_separate = BIT(IIO_EV_INFO_VALUE) | BIT(IIO_EV_INFO_ENABLE), }, { .type = IIO_EV_TYPE_THRESH, .dir = IIO_EV_DIR_FALLING, .mask_separate = BIT(IIO_EV_INFO_VALUE) | BIT(IIO_EV_INFO_ENABLE), }, }; #define AD7291_VOLTAGE_CHAN(_chan) \ { \ .type = IIO_VOLTAGE, \ Loading @@ -480,8 +503,8 @@ static int ad7291_read_raw(struct iio_dev *indio_dev, .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ .indexed = 1, \ .channel = _chan, \ .event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)|\ IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) \ .event_spec = ad7291_events, \ .num_event_specs = ARRAY_SIZE(ad7291_events), \ } static const struct iio_chan_spec ad7291_channels[] = { Loading @@ -500,9 +523,8 @@ static const struct iio_chan_spec ad7291_channels[] = { BIT(IIO_CHAN_INFO_SCALE), .indexed = 1, .channel = 0, .event_mask = IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING)| IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING) .event_spec = ad7291_events, .num_event_specs = ARRAY_SIZE(ad7291_events), } }; Loading @@ -512,10 +534,10 @@ static struct attribute_group ad7291_event_attribute_group = { static const struct iio_info ad7291_info = { .read_raw = &ad7291_read_raw, .read_event_config = &ad7291_read_event_config, .write_event_config = &ad7291_write_event_config, .read_event_value = &ad7291_read_event_value, .write_event_value = &ad7291_write_event_value, .read_event_config_new = &ad7291_read_event_config, .write_event_config_new = &ad7291_write_event_config, .read_event_value_new = &ad7291_read_event_value, .write_event_value_new = &ad7291_write_event_value, .event_attrs = &ad7291_event_attribute_group, .driver_module = THIS_MODULE, }; Loading