Second round of IIO fixes for the 3.18 cycle.
* tsl4531 - fix a compile error when CONFIG_PM_OPS not set. * kxcjk-1013 - event spec direction was invalid - leading to 'interesting' attrribute names. * as3935 - sizeof(st) used instead of sizeof(*st) leading to allocation of space for a pointer rather than the structure desired. * ade7758 - Another null pointer deref fix due to different channels being provided to the the buffer register than used for the sysfs side of things. * ade7758 - Check there is a channel enabled in preenable for the buffer before doing anything. * ade7758 - Drop a stray raw from the channel name that leads to _raw_raw postfix. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJUWm4LAAoJEFSFNJnE9BaIuCEQAK8+00Ltlr072ueToTWaactQ LP803YhF34jgpUFLvDaiUeYia0z5NjEGJDkFtCB6u7LFkrLD7LkpVchEvWM/TrKs Ci2E+0+RAhtMnXCrTRavlBBCqF85RK57ZPExqMlFyN9Rp88GAK7g/MpFyCB27Qiy i/xed5WhT/01ugBH/WE8fNUoIm1pMYJNDX925zderJlt/fKryEWFC/poFZ2bXYsM II1iwvCm3FY2Wsweeusrl9NZFuUkpGF/pB5XK+2e96DXkYHjVO06Xm/t/neDEskS UUOt7vFTK9SmO//oj8Rq4vSrwOtvQZzA0B1cY36vVksvcXkW2Ju2dGIibwhOG3Ss kVpYnLQGVBAmD/L5KXP40MSh4O/tjvi1v9Rgy/0yx7XCzj/Pst1ar+Figz61U/R5 MfUL90r9whcIdxfuSoMhDfHVLKVboMl1cqkWBE9b3GKJMGE9iTWJHI4IZAWqwtrO vxnn9W+c5EpVb8U8VTnVKv983+DZnzP6uaWWdM2wTJ6CgHO4DnQWoJNxlPvGzkQy QFpJCliBeQ2uypfPaBRByZ3hmR90mUdiQ576ALnZdWgqd327tRFHo+ERsLenyAZF wN2F8TzylxDKQ+9oYxNStiArQ+gyB1rkqnM/HPKivsHByoVr54e73HSlBB5AxEJQ udJv+CjKoHVNNnMky94o =wtif -----END PGP SIGNATURE----- Merge tag 'iio-fixes-for-3.18b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus Jonathan writes: Second round of IIO fixes for the 3.18 cycle. * tsl4531 - fix a compile error when CONFIG_PM_OPS not set. * kxcjk-1013 - event spec direction was invalid - leading to 'interesting' attrribute names. * as3935 - sizeof(st) used instead of sizeof(*st) leading to allocation of space for a pointer rather than the structure desired. * ade7758 - Another null pointer deref fix due to different channels being provided to the the buffer register than used for the sysfs side of things. * ade7758 - Check there is a channel enabled in preenable for the buffer before doing anything. * ade7758 - Drop a stray raw from the channel name that leads to _raw_raw postfix.
This commit is contained in:
commit
bce20b2396
|
@ -894,7 +894,7 @@ static const struct attribute_group kxcjk1013_attrs_group = {
|
||||||
|
|
||||||
static const struct iio_event_spec kxcjk1013_event = {
|
static const struct iio_event_spec kxcjk1013_event = {
|
||||||
.type = IIO_EV_TYPE_THRESH,
|
.type = IIO_EV_TYPE_THRESH,
|
||||||
.dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING,
|
.dir = IIO_EV_DIR_EITHER,
|
||||||
.mask_separate = BIT(IIO_EV_INFO_VALUE) |
|
.mask_separate = BIT(IIO_EV_INFO_VALUE) |
|
||||||
BIT(IIO_EV_INFO_ENABLE) |
|
BIT(IIO_EV_INFO_ENABLE) |
|
||||||
BIT(IIO_EV_INFO_PERIOD)
|
BIT(IIO_EV_INFO_PERIOD)
|
||||||
|
|
|
@ -230,9 +230,12 @@ static int tsl4531_resume(struct device *dev)
|
||||||
return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL,
|
return i2c_smbus_write_byte_data(to_i2c_client(dev), TSL4531_CONTROL,
|
||||||
TSL4531_MODE_NORMAL);
|
TSL4531_MODE_NORMAL);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume);
|
static SIMPLE_DEV_PM_OPS(tsl4531_pm_ops, tsl4531_suspend, tsl4531_resume);
|
||||||
|
#define TSL4531_PM_OPS (&tsl4531_pm_ops)
|
||||||
|
#else
|
||||||
|
#define TSL4531_PM_OPS NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct i2c_device_id tsl4531_id[] = {
|
static const struct i2c_device_id tsl4531_id[] = {
|
||||||
{ "tsl4531", 0 },
|
{ "tsl4531", 0 },
|
||||||
|
@ -243,7 +246,7 @@ MODULE_DEVICE_TABLE(i2c, tsl4531_id);
|
||||||
static struct i2c_driver tsl4531_driver = {
|
static struct i2c_driver tsl4531_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = TSL4531_DRV_NAME,
|
.name = TSL4531_DRV_NAME,
|
||||||
.pm = &tsl4531_pm_ops,
|
.pm = TSL4531_PM_OPS,
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
},
|
},
|
||||||
.probe = tsl4531_probe,
|
.probe = tsl4531_probe,
|
||||||
|
|
|
@ -330,7 +330,7 @@ static int as3935_probe(struct spi_device *spi)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(st));
|
indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
|
||||||
if (!indio_dev)
|
if (!indio_dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,6 @@ struct ade7758_state {
|
||||||
u8 *tx;
|
u8 *tx;
|
||||||
u8 *rx;
|
u8 *rx;
|
||||||
struct mutex buf_lock;
|
struct mutex buf_lock;
|
||||||
const struct iio_chan_spec *ade7758_ring_channels;
|
|
||||||
struct spi_transfer ring_xfer[4];
|
struct spi_transfer ring_xfer[4];
|
||||||
struct spi_message ring_msg;
|
struct spi_message ring_msg;
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -634,9 +634,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_VOLTAGE,
|
.type = IIO_VOLTAGE,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 0,
|
.channel = 0,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE),
|
.address = AD7758_WT(AD7758_PHASE_A, AD7758_VOLTAGE),
|
||||||
.scan_index = 0,
|
.scan_index = 0,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -648,9 +645,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_CURRENT,
|
.type = IIO_CURRENT,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 0,
|
.channel = 0,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT),
|
.address = AD7758_WT(AD7758_PHASE_A, AD7758_CURRENT),
|
||||||
.scan_index = 1,
|
.scan_index = 1,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -662,9 +656,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 0,
|
.channel = 0,
|
||||||
.extend_name = "apparent_raw",
|
.extend_name = "apparent",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR),
|
.address = AD7758_WT(AD7758_PHASE_A, AD7758_APP_PWR),
|
||||||
.scan_index = 2,
|
.scan_index = 2,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -676,9 +668,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 0,
|
.channel = 0,
|
||||||
.extend_name = "active_raw",
|
.extend_name = "active",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_A, AD7758_ACT_PWR),
|
||||||
.scan_index = 3,
|
.scan_index = 3,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -690,9 +680,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 0,
|
.channel = 0,
|
||||||
.extend_name = "reactive_raw",
|
.extend_name = "reactive",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_A, AD7758_REACT_PWR),
|
||||||
.scan_index = 4,
|
.scan_index = 4,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -704,9 +692,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_VOLTAGE,
|
.type = IIO_VOLTAGE,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 1,
|
.channel = 1,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE),
|
.address = AD7758_WT(AD7758_PHASE_B, AD7758_VOLTAGE),
|
||||||
.scan_index = 5,
|
.scan_index = 5,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -718,9 +703,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_CURRENT,
|
.type = IIO_CURRENT,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 1,
|
.channel = 1,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT),
|
.address = AD7758_WT(AD7758_PHASE_B, AD7758_CURRENT),
|
||||||
.scan_index = 6,
|
.scan_index = 6,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -732,9 +714,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 1,
|
.channel = 1,
|
||||||
.extend_name = "apparent_raw",
|
.extend_name = "apparent",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR),
|
.address = AD7758_WT(AD7758_PHASE_B, AD7758_APP_PWR),
|
||||||
.scan_index = 7,
|
.scan_index = 7,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -746,9 +726,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 1,
|
.channel = 1,
|
||||||
.extend_name = "active_raw",
|
.extend_name = "active",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_B, AD7758_ACT_PWR),
|
||||||
.scan_index = 8,
|
.scan_index = 8,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -760,9 +738,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 1,
|
.channel = 1,
|
||||||
.extend_name = "reactive_raw",
|
.extend_name = "reactive",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_B, AD7758_REACT_PWR),
|
||||||
.scan_index = 9,
|
.scan_index = 9,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -774,9 +750,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_VOLTAGE,
|
.type = IIO_VOLTAGE,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 2,
|
.channel = 2,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE),
|
.address = AD7758_WT(AD7758_PHASE_C, AD7758_VOLTAGE),
|
||||||
.scan_index = 10,
|
.scan_index = 10,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -788,9 +761,6 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_CURRENT,
|
.type = IIO_CURRENT,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 2,
|
.channel = 2,
|
||||||
.extend_name = "raw",
|
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT),
|
.address = AD7758_WT(AD7758_PHASE_C, AD7758_CURRENT),
|
||||||
.scan_index = 11,
|
.scan_index = 11,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -802,9 +772,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 2,
|
.channel = 2,
|
||||||
.extend_name = "apparent_raw",
|
.extend_name = "apparent",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR),
|
.address = AD7758_WT(AD7758_PHASE_C, AD7758_APP_PWR),
|
||||||
.scan_index = 12,
|
.scan_index = 12,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -816,9 +784,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 2,
|
.channel = 2,
|
||||||
.extend_name = "active_raw",
|
.extend_name = "active",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_C, AD7758_ACT_PWR),
|
||||||
.scan_index = 13,
|
.scan_index = 13,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -830,9 +796,7 @@ static const struct iio_chan_spec ade7758_channels[] = {
|
||||||
.type = IIO_POWER,
|
.type = IIO_POWER,
|
||||||
.indexed = 1,
|
.indexed = 1,
|
||||||
.channel = 2,
|
.channel = 2,
|
||||||
.extend_name = "reactive_raw",
|
.extend_name = "reactive",
|
||||||
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
||||||
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
|
|
||||||
.address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR),
|
.address = AD7758_WT(AD7758_PHASE_C, AD7758_REACT_PWR),
|
||||||
.scan_index = 14,
|
.scan_index = 14,
|
||||||
.scan_type = {
|
.scan_type = {
|
||||||
|
@ -873,13 +837,14 @@ static int ade7758_probe(struct spi_device *spi)
|
||||||
goto error_free_rx;
|
goto error_free_rx;
|
||||||
}
|
}
|
||||||
st->us = spi;
|
st->us = spi;
|
||||||
st->ade7758_ring_channels = &ade7758_channels[0];
|
|
||||||
mutex_init(&st->buf_lock);
|
mutex_init(&st->buf_lock);
|
||||||
|
|
||||||
indio_dev->name = spi->dev.driver->name;
|
indio_dev->name = spi->dev.driver->name;
|
||||||
indio_dev->dev.parent = &spi->dev;
|
indio_dev->dev.parent = &spi->dev;
|
||||||
indio_dev->info = &ade7758_info;
|
indio_dev->info = &ade7758_info;
|
||||||
indio_dev->modes = INDIO_DIRECT_MODE;
|
indio_dev->modes = INDIO_DIRECT_MODE;
|
||||||
|
indio_dev->channels = ade7758_channels;
|
||||||
|
indio_dev->num_channels = ARRAY_SIZE(ade7758_channels);
|
||||||
|
|
||||||
ret = ade7758_configure_ring(indio_dev);
|
ret = ade7758_configure_ring(indio_dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -85,17 +85,16 @@ static irqreturn_t ade7758_trigger_handler(int irq, void *p)
|
||||||
**/
|
**/
|
||||||
static int ade7758_ring_preenable(struct iio_dev *indio_dev)
|
static int ade7758_ring_preenable(struct iio_dev *indio_dev)
|
||||||
{
|
{
|
||||||
struct ade7758_state *st = iio_priv(indio_dev);
|
|
||||||
unsigned channel;
|
unsigned channel;
|
||||||
|
|
||||||
if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
|
if (bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
channel = find_first_bit(indio_dev->active_scan_mask,
|
channel = find_first_bit(indio_dev->active_scan_mask,
|
||||||
indio_dev->masklength);
|
indio_dev->masklength);
|
||||||
|
|
||||||
ade7758_write_waveform_type(&indio_dev->dev,
|
ade7758_write_waveform_type(&indio_dev->dev,
|
||||||
st->ade7758_ring_channels[channel].address);
|
indio_dev->channels[channel].address);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue