diff options
author | 2011-05-18 14:42:37 +0100 | |
---|---|---|
committer | 2011-05-19 16:15:05 -0700 | |
commit | 6fe8135fccd66aedcc55ded70824342587fd2499 (patch) | |
tree | 3afc7acfd0edc052ba93241761e935af9a3b6ebc /drivers/staging/iio | |
parent | staging:iio:meter:ade7758: Use private data space from iio_allocate_device (diff) | |
download | linux-6fe8135fccd66aedcc55ded70824342587fd2499.tar.gz linux-6fe8135fccd66aedcc55ded70824342587fd2499.tar.bz2 linux-6fe8135fccd66aedcc55ded70824342587fd2499.zip |
staging:iio: implement an iio_info structure to take some of the constant elements out of iio_dev.
This was suggested by Arnd Bergmann, Other elements may well
move in here in future, but it definitely makes sense for these.
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio')
61 files changed, 964 insertions, 669 deletions
diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c index 59b6ac2ca545..e4c49f00d132 100644 --- a/drivers/staging/iio/accel/adis16201_core.c +++ b/drivers/staging/iio/accel/adis16201_core.c @@ -457,6 +457,13 @@ static const struct attribute_group adis16201_attribute_group = { .attrs = adis16201_attributes, }; +static const struct iio_info adis16201_info = { + .attrs = &adis16201_attribute_group, + .read_raw = &adis16201_read_raw, + .write_raw = &adis16201_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16201_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -490,13 +497,11 @@ static int __devinit adis16201_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16201_attribute_group; + st->indio_dev->info = &adis16201_info; + st->indio_dev->channels = adis16201_channels; st->indio_dev->num_channels = ARRAY_SIZE(adis16201_channels); - st->indio_dev->read_raw = &adis16201_read_raw; - st->indio_dev->write_raw = &adis16201_write_raw; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16201_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c index 1694a0c9929e..36be4d5dc614 100644 --- a/drivers/staging/iio/accel/adis16203_core.c +++ b/drivers/staging/iio/accel/adis16203_core.c @@ -408,6 +408,13 @@ static const struct attribute_group adis16203_attribute_group = { .attrs = adis16203_attributes, }; +static const struct iio_info adis16203_info = { + .attrs = &adis16203_attribute_group, + .read_raw = &adis16203_read_raw, + .write_raw = &adis16203_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16203_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -440,13 +447,10 @@ static int __devinit adis16203_probe(struct spi_device *spi) } st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16203_attribute_group; st->indio_dev->channels = adis16203_channels; st->indio_dev->num_channels = ARRAY_SIZE(adis16203_channels); - st->indio_dev->read_raw = &adis16203_read_raw; - st->indio_dev->write_raw = &adis16203_write_raw; + st->indio_dev->info = &adis16203_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16203_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c index 4e4944cf106e..16806704bf48 100644 --- a/drivers/staging/iio/accel/adis16204_core.c +++ b/drivers/staging/iio/accel/adis16204_core.c @@ -473,6 +473,13 @@ static const struct attribute_group adis16204_attribute_group = { .attrs = adis16204_attributes, }; +static const struct iio_info adis16204_info = { + .attrs = &adis16204_attribute_group, + .read_raw = &adis16204_read_raw, + .write_raw = &adis16204_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16204_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -506,13 +513,10 @@ static int __devinit adis16204_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16204_attribute_group; + st->indio_dev->info = &adis16204_info; st->indio_dev->channels = adis16204_channels; st->indio_dev->num_channels = ARRAY_SIZE(adis16204_channels); - st->indio_dev->read_raw = &adis16204_read_raw; - st->indio_dev->write_raw = &adis16204_write_raw; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16204_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c index d48babe97977..c423cc960254 100644 --- a/drivers/staging/iio/accel/adis16209_core.c +++ b/drivers/staging/iio/accel/adis16209_core.c @@ -456,6 +456,13 @@ static const struct attribute_group adis16209_attribute_group = { .attrs = adis16209_attributes, }; +static const struct iio_info adis16209_info = { + .attrs = &adis16209_attribute_group, + .read_raw = &adis16209_read_raw, + .write_raw = &adis16209_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16209_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -489,13 +496,10 @@ static int __devinit adis16209_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16209_attribute_group; + st->indio_dev->info = &adis16209_info; st->indio_dev->channels = adis16209_channels; st->indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); - st->indio_dev->read_raw = &adis16209_read_raw; - st->indio_dev->write_raw = &adis16209_write_raw; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16209_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/accel/adis16220_core.c b/drivers/staging/iio/accel/adis16220_core.c index 7af48b8cb073..605a75ea3996 100644 --- a/drivers/staging/iio/accel/adis16220_core.c +++ b/drivers/staging/iio/accel/adis16220_core.c @@ -544,6 +544,10 @@ static const struct attribute_group adis16220_attribute_group = { .attrs = adis16220_attributes, }; +static const struct iio_info adis16220_info = { + .attrs = &adis16220_attribute_group, + .driver_module = THIS_MODULE, +}; static int __devinit adis16220_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -577,9 +581,8 @@ static int __devinit adis16220_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16220_attribute_group; + st->indio_dev->info = &adis16220_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c index 537e0f22743e..ac6038557b0d 100644 --- a/drivers/staging/iio/accel/adis16240_core.c +++ b/drivers/staging/iio/accel/adis16240_core.c @@ -507,6 +507,13 @@ static const struct attribute_group adis16240_attribute_group = { .attrs = adis16240_attributes, }; +static const struct iio_info adis16240_info = { + .attrs = &adis16240_attribute_group, + .read_raw = &adis16240_read_raw, + .write_raw = &adis16240_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16240_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -540,13 +547,10 @@ static int __devinit adis16240_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16240_attribute_group; + st->indio_dev->info = &adis16240_info; st->indio_dev->channels = adis16240_channels; st->indio_dev->num_channels = ARRAY_SIZE(adis16240_channels); - st->indio_dev->read_raw = &adis16240_read_raw; - st->indio_dev->write_raw = &adis16240_write_raw; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16240_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/accel/kxsd9.c b/drivers/staging/iio/accel/kxsd9.c index 431aa0f886f1..973156e75773 100644 --- a/drivers/staging/iio/accel/kxsd9.c +++ b/drivers/staging/iio/accel/kxsd9.c @@ -301,6 +301,11 @@ error_ret: }; +static const struct iio_info kxsd9_info = { + .attrs = &kxsd9_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit kxsd9_probe(struct spi_device *spi) { @@ -335,13 +340,8 @@ static int __devinit kxsd9_probe(struct spi_device *spi) goto error_free_tx; } st->indio_dev->dev.parent = &spi->dev; - /* for now */ - st->indio_dev->num_interrupt_lines = 0; - st->indio_dev->event_attrs = NULL; - - st->indio_dev->attrs = &kxsd9_attribute_group; + st->indio_dev->info = &kxsd9_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c index 942139a02ed7..ba5bc679204f 100644 --- a/drivers/staging/iio/accel/lis3l02dq_core.c +++ b/drivers/staging/iio/accel/lis3l02dq_core.c @@ -651,6 +651,18 @@ static const struct attribute_group lis3l02dq_attribute_group = { .attrs = lis3l02dq_attributes, }; +static const struct iio_info lis3l02dq_info = { + .num_interrupt_lines = 1, + .read_raw = &lis3l02dq_read_raw, + .write_raw = &lis3l02dq_write_raw, + .read_event_value = &lis3l02dq_read_thresh, + .write_event_value = &lis3l02dq_write_thresh, + .write_event_config = &lis3l02dq_write_event_config, + .read_event_config = &lis3l02dq_read_event_config, + .driver_module = THIS_MODULE, + .attrs = &lis3l02dq_attribute_group, +}; + static int __devinit lis3l02dq_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -670,17 +682,10 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi) mutex_init(&st->buf_lock); indio_dev->name = spi->dev.driver->name; indio_dev->dev.parent = &spi->dev; - indio_dev->num_interrupt_lines = 1; + indio_dev->info = &lis3l02dq_info; indio_dev->channels = lis3l02dq_channels; indio_dev->num_channels = ARRAY_SIZE(lis3l02dq_channels); - indio_dev->read_raw = &lis3l02dq_read_raw; - indio_dev->write_raw = &lis3l02dq_write_raw; - indio_dev->read_event_value = &lis3l02dq_read_thresh; - indio_dev->write_event_value = &lis3l02dq_write_thresh; - indio_dev->write_event_config = &lis3l02dq_write_event_config; - indio_dev->read_event_config = &lis3l02dq_read_event_config; - indio_dev->attrs = &lis3l02dq_attribute_group; - indio_dev->driver_module = THIS_MODULE; + indio_dev->modes = INDIO_DIRECT_MODE; ret = lis3l02dq_configure_ring(indio_dev); diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c index 5de07fd76328..f213b8698eb2 100644 --- a/drivers/staging/iio/accel/sca3000_core.c +++ b/drivers/staging/iio/accel/sca3000_core.c @@ -1100,6 +1100,28 @@ error_ret: return ret; } +static const struct iio_info sca3000_info = { + .attrs = &sca3000_attribute_group, + .read_raw = &sca3000_read_raw, + .num_interrupt_lines = 1, + .event_attrs = &sca3000_event_attribute_group, + .read_event_value = &sca3000_read_thresh, + .write_event_value = &sca3000_write_thresh, + .read_event_config = &sca3000_read_event_config, + .write_event_config = &sca3000_write_event_config, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info sca3000_info_with_temp = { + .attrs = &sca3000_attribute_group_with_temp, + .read_raw = &sca3000_read_raw, + .read_event_value = &sca3000_read_thresh, + .write_event_value = &sca3000_write_thresh, + .read_event_config = &sca3000_read_event_config, + .write_event_config = &sca3000_write_event_config, + .driver_module = THIS_MODULE, +}; + static int __devinit sca3000_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -1124,20 +1146,13 @@ static int __devinit sca3000_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->num_interrupt_lines = 1; - st->indio_dev->event_attrs = &sca3000_event_attribute_group; if (st->info->temp_output) - st->indio_dev->attrs = &sca3000_attribute_group_with_temp; + st->indio_dev->info = &sca3000_info_with_temp; else { - st->indio_dev->attrs = &sca3000_attribute_group; + st->indio_dev->info = &sca3000_info; st->indio_dev->channels = sca3000_channels; st->indio_dev->num_channels = ARRAY_SIZE(sca3000_channels); } - st->indio_dev->read_raw = &sca3000_read_raw; - st->indio_dev->read_event_value = &sca3000_read_thresh; - st->indio_dev->write_event_value = &sca3000_write_thresh; - st->indio_dev->read_event_config = &sca3000_read_event_config; - st->indio_dev->write_event_config = &sca3000_write_event_config; st->indio_dev->dev_data = (void *)(st); st->indio_dev->modes = INDIO_DIRECT_MODE; diff --git a/drivers/staging/iio/adc/ad7150.c b/drivers/staging/iio/adc/ad7150.c index e23bb9960019..ca32b6778a9e 100644 --- a/drivers/staging/iio/adc/ad7150.c +++ b/drivers/staging/iio/adc/ad7150.c @@ -700,6 +700,12 @@ static struct attribute_group ad7150_event_attribute_group = { .attrs = ad7150_event_attributes, }; +static const struct iio_info ad7150_info = { + .attrs = &ad7150_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &ad7150_event_attribute_group, + .driver_module = THIS_MODULE, +}; /* * device probe and remove */ @@ -725,14 +731,13 @@ static int __devinit ad7150_probe(struct i2c_client *client, goto error_free_chip; } - /* Echipabilish that the iio_dev is a child of the i2c device */ + /* Establish that the iio_dev is a child of the i2c device */ chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &ad7150_attribute_group; - chip->indio_dev->event_attrs = &ad7150_event_attribute_group; + + chip->indio_dev->info = &ad7150_info; chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; + chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/ad7152.c b/drivers/staging/iio/adc/ad7152.c index e53e3e9e586d..7a38bcbbe1af 100644 --- a/drivers/staging/iio/adc/ad7152.c +++ b/drivers/staging/iio/adc/ad7152.c @@ -497,6 +497,10 @@ static const struct attribute_group ad7152_attribute_group = { .attrs = ad7152_attributes, }; +static const struct iio_info ad7152_info = { + .attrs = &ad7152_attribute_group, + .driver_module = THIS_MODULE, +}; /* * device probe and remove */ @@ -525,9 +529,8 @@ static int __devinit ad7152_probe(struct i2c_client *client, /* Echipabilish that the iio_dev is a child of the i2c device */ chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &ad7152_attribute_group; + chip->indio_dev->info = &ad7152_info; chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->driver_module = THIS_MODULE; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/staging/iio/adc/ad7291.c index 0e4c7283bb07..1be3453479b7 100644 --- a/drivers/staging/iio/adc/ad7291.c +++ b/drivers/staging/iio/adc/ad7291.c @@ -778,6 +778,12 @@ static struct attribute_group ad7291_event_attribute_group = { .attrs = ad7291_event_attributes, }; +static const struct iio_info ad7291_info = { + .attrs = &ad7291_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &ad7291_event_attribute_group, +}; + /* * device probe and remove */ @@ -807,11 +813,8 @@ static int __devinit ad7291_probe(struct i2c_client *client, chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &ad7291_attribute_group; - chip->indio_dev->event_attrs = &ad7291_event_attribute_group; + chip->indio_dev->info = &ad7291_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/ad7298_core.c b/drivers/staging/iio/adc/ad7298_core.c index 83b3d158353f..b8e4ae29b0b5 100644 --- a/drivers/staging/iio/adc/ad7298_core.c +++ b/drivers/staging/iio/adc/ad7298_core.c @@ -156,6 +156,11 @@ static int ad7298_read_raw(struct iio_dev *dev_info, return -EINVAL; } +static const struct iio_info ad7298_info = { + .read_raw = &ad7298_read_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit ad7298_probe(struct spi_device *spi) { struct ad7298_platform_data *pdata = spi->dev.platform_data; @@ -181,11 +186,10 @@ static int __devinit ad7298_probe(struct spi_device *spi) indio_dev->name = spi_get_device_id(spi)->name; indio_dev->dev.parent = &spi->dev; - indio_dev->driver_module = THIS_MODULE; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = ad7298_channels; indio_dev->num_channels = ARRAY_SIZE(ad7298_channels); - indio_dev->read_raw = &ad7298_read_raw; + indio_dev->info = &ad7298_info; /* Setup default message */ diff --git a/drivers/staging/iio/adc/ad7314.c b/drivers/staging/iio/adc/ad7314.c index a1f1b4379c66..98bb16fcff26 100644 --- a/drivers/staging/iio/adc/ad7314.c +++ b/drivers/staging/iio/adc/ad7314.c @@ -191,6 +191,10 @@ static const struct attribute_group ad7314_attribute_group = { .attrs = ad7314_attributes, }; +static const struct iio_info ad7314_info = { + .attrs = &ad7314_attribute_group, + .driver_module = THIS_MODULE, +}; /* * device probe and remove */ @@ -218,9 +222,8 @@ static int __devinit ad7314_probe(struct spi_device *spi_dev) chip->indio_dev->name = spi_get_device_id(spi_dev)->name; chip->indio_dev->dev.parent = &spi_dev->dev; - chip->indio_dev->attrs = &ad7314_attribute_group; + chip->indio_dev->info = &ad7314_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; ret = iio_device_register(chip->indio_dev); if (ret) diff --git a/drivers/staging/iio/adc/ad7476_core.c b/drivers/staging/iio/adc/ad7476_core.c index 5b41e0101e55..50cedb422839 100644 --- a/drivers/staging/iio/adc/ad7476_core.c +++ b/drivers/staging/iio/adc/ad7476_core.c @@ -118,6 +118,11 @@ static const struct ad7476_chip_info ad7476_chip_info_tbl[] = { }, }; +static const struct iio_info ad7476_info = { + .driver_module = THIS_MODULE, + .read_raw = &ad7476_read_raw, +}; + static int __devinit ad7476_probe(struct spi_device *spi) { struct ad7476_platform_data *pdata = spi->dev.platform_data; @@ -165,11 +170,10 @@ static int __devinit ad7476_probe(struct spi_device *spi) st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; st->indio_dev->channels = st->chip_info->channel; st->indio_dev->num_channels = 2; - st->indio_dev->read_raw = &ad7476_read_raw; + st->indio_dev->info = &ad7476_info; /* Setup default message */ st->xfer.rx_buf = &st->data; diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c index fb96802819fc..459371ae4dcc 100644 --- a/drivers/staging/iio/adc/ad7606_core.c +++ b/drivers/staging/iio/adc/ad7606_core.c @@ -426,6 +426,12 @@ static irqreturn_t ad7606_interrupt(int irq, void *dev_id) return IRQ_HANDLED; }; +static const struct iio_info ad7606_info = { + .driver_module = THIS_MODULE, + .read_raw = &ad7606_read_raw, + .attrs = &ad7606_attribute_group, +}; + struct iio_dev *ad7606_probe(struct device *dev, int irq, void __iomem *base_address, unsigned id, @@ -470,13 +476,11 @@ struct iio_dev *ad7606_probe(struct device *dev, int irq, st->chip_info = &ad7606_chip_info_tbl[id]; indio_dev->dev.parent = dev; - indio_dev->attrs = &ad7606_attribute_group; - indio_dev->driver_module = THIS_MODULE; + indio_dev->info = &ad7606_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->name = st->chip_info->name; indio_dev->channels = st->chip_info->channels; indio_dev->num_channels = st->chip_info->num_channels; - indio_dev->read_raw = &ad7606_read_raw; init_waitqueue_head(&st->wq_data_avail); diff --git a/drivers/staging/iio/adc/ad7745.c b/drivers/staging/iio/adc/ad7745.c index 98b510dcecc8..1944223ef163 100644 --- a/drivers/staging/iio/adc/ad7745.c +++ b/drivers/staging/iio/adc/ad7745.c @@ -565,6 +565,12 @@ static struct attribute_group ad774x_event_attribute_group = { .attrs = ad774x_event_attributes, }; +static const struct iio_info ad774x_info = { + .attrs = &ad774x_event_attribute_group, + .event_attrs = &ad774x_event_attribute_group, + .num_interrupt_lines = 1, + .driver_module = THIS_MODULE, +}; /* * device probe and remove */ @@ -593,11 +599,8 @@ static int __devinit ad774x_probe(struct i2c_client *client, /* Establish that the iio_dev is a child of the i2c device */ chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &ad774x_attribute_group; - chip->indio_dev->event_attrs = &ad774x_event_attribute_group; + chip->indio_dev->info = &ad774x_info; chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/ad7780.c b/drivers/staging/iio/adc/ad7780.c index 713e202b9395..e0c7b6cc05c7 100644 --- a/drivers/staging/iio/adc/ad7780.c +++ b/drivers/staging/iio/adc/ad7780.c @@ -151,6 +151,11 @@ static irqreturn_t ad7780_interrupt(int irq, void *dev_id) return IRQ_HANDLED; }; +static const struct iio_info ad7780_info = { + .read_raw = &ad7780_read_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit ad7780_probe(struct spi_device *spi) { struct ad7780_platform_data *pdata = spi->dev.platform_data; @@ -195,11 +200,10 @@ static int __devinit ad7780_probe(struct spi_device *spi) indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; - indio_dev->driver_module = THIS_MODULE; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = &st->chip_info->channel; indio_dev->num_channels = 1; - indio_dev->read_raw = &ad7780_read_raw; + indio_dev->info = &ad7780_info; init_waitqueue_head(&st->wq_data_avail); diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c index 873fe2bf8312..11379e469b07 100644 --- a/drivers/staging/iio/adc/ad7816.c +++ b/drivers/staging/iio/adc/ad7816.c @@ -331,6 +331,13 @@ static struct attribute_group ad7816_event_attribute_group = { .attrs = ad7816_event_attributes, }; +static const struct iio_info ad7816_info = { + .attrs = &ad7816_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &ad7816_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -391,11 +398,8 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) } chip->indio_dev->name = spi_get_device_id(spi_dev)->name; chip->indio_dev->dev.parent = &spi_dev->dev; - chip->indio_dev->attrs = &ad7816_attribute_group; - chip->indio_dev->event_attrs = &ad7816_event_attribute_group; + chip->indio_dev->info = &ad7816_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c index 6773fe1bf059..de14b174cef7 100644 --- a/drivers/staging/iio/adc/ad7887_core.c +++ b/drivers/staging/iio/adc/ad7887_core.c @@ -83,6 +83,11 @@ static const struct ad7887_chip_info ad7887_chip_info_tbl[] = { }, }; +static const struct iio_info ad7887_info = { + .read_raw = &ad7887_read_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit ad7887_probe(struct spi_device *spi) { struct ad7887_platform_data *pdata = spi->dev.platform_data; @@ -114,8 +119,7 @@ static int __devinit ad7887_probe(struct spi_device *spi) indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; indio_dev->dev_data = (void *)(st); - indio_dev->read_raw = &ad7887_read_raw; - indio_dev->driver_module = THIS_MODULE; + indio_dev->info = &ad7887_info; indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default message */ diff --git a/drivers/staging/iio/adc/ad799x.h b/drivers/staging/iio/adc/ad799x.h index 0a8d6e21c00b..0dc9b4c73a33 100644 --- a/drivers/staging/iio/adc/ad799x.h +++ b/drivers/staging/iio/adc/ad799x.h @@ -97,9 +97,8 @@ struct ad799x_chip_info { struct iio_chan_spec channel[9]; int num_channels; u16 int_vref_mv; - bool monitor_mode; u16 default_config; - struct attribute_group *event_attrs; + const struct iio_info *info; }; struct ad799x_state { diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c index a105910bd71d..29bfbcf82064 100644 --- a/drivers/staging/iio/adc/ad799x_core.c +++ b/drivers/staging/iio/adc/ad799x_core.c @@ -459,6 +459,25 @@ static struct attribute_group ad7992_event_attrs_group = { .attrs = ad7992_event_attributes, }; +static const struct iio_info ad7991_info = { + .read_raw = &ad799x_read_raw, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info ad7992_info = { + .read_raw = &ad799x_read_raw, + .num_interrupt_lines = 1, + .event_attrs = &ad7992_event_attrs_group, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info ad7993_4_7_8_info = { + .read_raw = &ad799x_read_raw, + .num_interrupt_lines = 1, + .event_attrs = &ad7993_4_7_8_event_attrs_group, + .driver_module = THIS_MODULE, +}; + static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { [ad7991] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -476,6 +495,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[4] = IIO_CHAN_SOFT_TIMESTAMP(4), .num_channels = 5, .int_vref_mv = 4096, + .info = &ad7991_info, }, [ad7995] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -493,6 +513,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[4] = IIO_CHAN_SOFT_TIMESTAMP(4), .num_channels = 5, .int_vref_mv = 1024, + .info = &ad7991_info, }, [ad7999] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -510,6 +531,7 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[4] = IIO_CHAN_SOFT_TIMESTAMP(4), .num_channels = 5, .int_vref_mv = 1024, + .info = &ad7991_info, }, [ad7992] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -521,9 +543,8 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[2] = IIO_CHAN_SOFT_TIMESTAMP(2), .num_channels = 3, .int_vref_mv = 4096, - .monitor_mode = true, .default_config = AD7998_ALERT_EN, - .event_attrs = &ad7992_event_attrs_group, + .info = &ad7992_info, }, [ad7993] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -541,9 +562,8 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[4] = IIO_CHAN_SOFT_TIMESTAMP(4), .num_channels = 5, .int_vref_mv = 1024, - .monitor_mode = true, .default_config = AD7998_ALERT_EN, - .event_attrs = &ad7993_4_7_8_event_attrs_group, + .info = &ad7993_4_7_8_info, }, [ad7994] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -561,9 +581,8 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[4] = IIO_CHAN_SOFT_TIMESTAMP(4), .num_channels = 5, .int_vref_mv = 4096, - .monitor_mode = true, .default_config = AD7998_ALERT_EN, - .event_attrs = &ad7993_4_7_8_event_attrs_group, + .info = &ad7993_4_7_8_info, }, [ad7997] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -593,9 +612,8 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[8] = IIO_CHAN_SOFT_TIMESTAMP(8), .num_channels = 9, .int_vref_mv = 1024, - .monitor_mode = true, .default_config = AD7998_ALERT_EN, - .event_attrs = &ad7993_4_7_8_event_attrs_group, + .info = &ad7993_4_7_8_info, }, [ad7998] = { .channel[0] = IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 0, 0, @@ -625,9 +643,8 @@ static const struct ad799x_chip_info ad799x_chip_info_tbl[] = { .channel[8] = IIO_CHAN_SOFT_TIMESTAMP(8), .num_channels = 9, .int_vref_mv = 4096, - .monitor_mode = true, .default_config = AD7998_ALERT_EN, - .event_attrs = &ad7993_4_7_8_event_attrs_group, + .info = &ad7993_4_7_8_info, }, }; @@ -667,15 +684,13 @@ static int __devinit ad799x_probe(struct i2c_client *client, indio_dev->dev.parent = &client->dev; indio_dev->name = id->name; - indio_dev->event_attrs = st->chip_info->event_attrs; + indio_dev->info = st->chip_info->info; indio_dev->name = id->name; indio_dev->dev_data = (void *)(st); - indio_dev->driver_module = THIS_MODULE; + indio_dev->modes = INDIO_DIRECT_MODE; - indio_dev->num_interrupt_lines = 1; indio_dev->channels = st->chip_info->channel; indio_dev->num_channels = st->chip_info->num_channels; - indio_dev->read_raw = &ad799x_read_raw; ret = ad799x_register_ring_funcs_and_init(indio_dev); if (ret) @@ -692,7 +707,7 @@ static int __devinit ad799x_probe(struct i2c_client *client, if (ret) goto error_cleanup_ring; - if (client->irq > 0 && st->chip_info->monitor_mode) { + if (client->irq > 0) { ret = request_threaded_irq(client->irq, NULL, ad799x_event_handler, @@ -727,7 +742,7 @@ static __devexit int ad799x_remove(struct i2c_client *client) struct iio_dev *indio_dev = i2c_get_clientdata(client); struct ad799x_state *st = iio_priv(indio_dev); - if (client->irq > 0 && st->chip_info->monitor_mode) + if (client->irq > 0) free_irq(client->irq, indio_dev); iio_ring_buffer_unregister(indio_dev->ring); diff --git a/drivers/staging/iio/adc/adt7310.c b/drivers/staging/iio/adc/adt7310.c index e405fc311d4d..68eca0b99ac0 100644 --- a/drivers/staging/iio/adc/adt7310.c +++ b/drivers/staging/iio/adc/adt7310.c @@ -746,6 +746,13 @@ static struct attribute_group adt7310_event_attribute_group[ADT7310_IRQS] = { } }; +static const struct iio_info adt7310_info = { + .attrs = &adt7310_attribute_group, + .num_interrupt_lines = ADT7310_IRQS, + .event_attrs = adt7310_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -775,11 +782,8 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) chip->indio_dev->dev.parent = &spi_dev->dev; chip->indio_dev->name = spi_get_device_id(spi_dev)->name; - chip->indio_dev->attrs = &adt7310_attribute_group; - chip->indio_dev->event_attrs = adt7310_event_attribute_group; + chip->indio_dev->info = &adt7310_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = ADT7310_IRQS; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/adt7410.c b/drivers/staging/iio/adc/adt7410.c index 85b5c1acc631..c40a84f9c2ff 100644 --- a/drivers/staging/iio/adc/adt7410.c +++ b/drivers/staging/iio/adc/adt7410.c @@ -713,6 +713,13 @@ static struct attribute_group adt7410_event_attribute_group[ADT7410_IRQS] = { } }; +static const struct iio_info adt7410_info = { + .attrs = &adt7410_attribute_group, + .num_interrupt_lines = ADT7410_IRQS, + .event_attrs = adt7410_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -741,11 +748,8 @@ static int __devinit adt7410_probe(struct i2c_client *client, } chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &adt7410_attribute_group; - chip->indio_dev->event_attrs = adt7410_event_attribute_group; + chip->indio_dev->info = &adt7410_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = ADT7410_IRQS; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/adt75.c b/drivers/staging/iio/adc/adt75.c index 2a44428a1075..1171fb9c178f 100644 --- a/drivers/staging/iio/adc/adt75.c +++ b/drivers/staging/iio/adc/adt75.c @@ -534,6 +534,13 @@ static struct attribute_group adt75_event_attribute_group = { .attrs = adt75_event_attributes, }; +static const struct iio_info adt75_info = { + .attrs = &adt75_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &adt75_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -562,11 +569,8 @@ static int __devinit adt75_probe(struct i2c_client *client, chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->attrs = &adt75_attribute_group; - chip->indio_dev->event_attrs = &adt75_event_attribute_group; + chip->indio_dev->info = &adt75_info; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/adc/max1363.h b/drivers/staging/iio/adc/max1363.h index 15227bd571dc..5243b5a3f9a5 100644 --- a/drivers/staging/iio/adc/max1363.h +++ b/drivers/staging/iio/adc/max1363.h @@ -154,7 +154,7 @@ enum max1363_modes { * @name: indentification string for chip * @bits: accuracy of the adc in bits * @int_vref_mv: the internal reference voltage - * @monitor_mode: whether the chip supports monitor interrupts + * @info: iio core function callbacks structure * @mode_list: array of available scan modes * @num_modes: the number of scan modes available * @default_mode: the scan mode in which the chip starts up @@ -162,14 +162,14 @@ enum max1363_modes { * @num_channels: number of channels */ struct max1363_chip_info { - u8 bits; - u16 int_vref_mv; - bool monitor_mode; - const enum max1363_modes *mode_list; - int num_modes; - enum max1363_modes default_mode; + const struct iio_info *info; struct iio_chan_spec *channels; int num_channels; + const enum max1363_modes *mode_list; + enum max1363_modes default_mode; + u16 int_vref_mv; + u8 num_modes; + u8 bits; }; /** diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c index 0c80abb7e753..8d09bf3d450a 100644 --- a/drivers/staging/iio/adc/max1363_core.c +++ b/drivers/staging/iio/adc/max1363_core.c @@ -472,47 +472,409 @@ enum { max1361, max11647 }; +static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600, + 8300, 4200, 2000, 1000 }; + +static ssize_t max1363_monitor_show_freq(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct max1363_state *st = iio_priv(dev_get_drvdata(dev)); + return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]); +} + +static ssize_t max1363_monitor_store_freq(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct max1363_state *st = iio_priv(indio_dev); + int i, ret; + unsigned long val; + bool found = false; + + ret = strict_strtoul(buf, 10, &val); + if (ret) + return -EINVAL; + for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++) + if (val == max1363_monitor_speeds[i]) { + found = true; + break; + } + if (!found) + return -EINVAL; + + mutex_lock(&indio_dev->mlock); + st->monitor_speed = i; + mutex_unlock(&indio_dev->mlock); + + return 0; +} + +static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR, + max1363_monitor_show_freq, + max1363_monitor_store_freq); + +static IIO_CONST_ATTR(sampling_frequency_available, + "133000 665000 33300 16600 8300 4200 2000 1000"); + +static int max1363_read_thresh(struct iio_dev *indio_dev, + int event_code, + int *val) +{ + struct max1363_state *st = iio_priv(indio_dev); + if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) + *val = st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)]; + else + *val = st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)]; + return 0; +} + +static int max1363_write_thresh(struct iio_dev *indio_dev, + int event_code, + int val) +{ + struct max1363_state *st = iio_priv(indio_dev); + /* make it handle signed correctly as well */ + switch (st->chip_info->bits) { + case 10: + if (val > 0x3FF) + return -EINVAL; + break; + case 12: + if (val > 0xFFF) + return -EINVAL; + break; + } + + switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) { + case IIO_EV_DIR_FALLING: + st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; + break; + case IIO_EV_DIR_RISING: + st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; + break; + } + + return 0; +} + +static irqreturn_t max1363_event_handler(int irq, void *private) +{ + struct iio_dev *indio_dev = private; + struct max1363_state *st = iio_priv(indio_dev); + s64 timestamp = iio_get_time_ns(); + u8 rx; + u8 tx[2] = { st->setupbyte, + MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 }; + + i2c_master_recv(st->client, &rx, 1); + /* todo - begging for use of for_each_set_bit */ + if (rx & (1 << 0)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_LOW_THRESH(3), + timestamp); + if (rx & (1 << 1)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_HIGH_THRESH(3), + timestamp); + if (rx & (1 << 2)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_LOW_THRESH(2), + timestamp); + if (rx & (1 << 3)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_HIGH_THRESH(2), + timestamp); + if (rx & (1 << 4)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_LOW_THRESH(1), + timestamp); + if (rx & (1 << 5)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_HIGH_THRESH(1), + timestamp); + if (rx & (1 << 6)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_LOW_THRESH(0), + timestamp); + if (rx & (1 << 7)) + iio_push_event(indio_dev, 0, + IIO_EVENT_CODE_IN_HIGH_THRESH(0), + timestamp); + i2c_master_send(st->client, tx, 2); + + return IRQ_HANDLED; +} + +static int max1363_read_event_config(struct iio_dev *indio_dev, + int event_code) +{ + struct max1363_state *st = iio_priv(indio_dev); + + int val; + int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code); + mutex_lock(&indio_dev->mlock); + if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) + val = (1 << number) & st->mask_low; + else + val = (1 << number) & st->mask_high; + mutex_unlock(&indio_dev->mlock); + + return val; +} + +static int max1363_monitor_mode_update(struct max1363_state *st, int enabled) +{ + u8 *tx_buf; + int ret, i = 3, j; + unsigned long numelements; + int len; + long modemask; + + if (!enabled) { + /* transition to ring capture is not currently supported */ + st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP; + st->configbyte &= ~MAX1363_SCAN_MASK; + st->monitor_on = false; + return max1363_write_basic_config(st->client, + st->setupbyte, + st->configbyte); + } + + /* Ensure we are in the relevant mode */ + st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP; + st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK + | MAX1363_SCAN_MASK + | MAX1363_SE_DE_MASK); + st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE; + if ((st->mask_low | st->mask_high) & 0x0F) { + st->configbyte |= max1363_mode_table[s0to3].conf; + modemask = max1363_mode_table[s0to3].modemask; + } else if ((st->mask_low | st->mask_high) & 0x30) { + st->configbyte |= max1363_mode_table[d0m1to2m3].conf; + modemask = max1363_mode_table[d0m1to2m3].modemask; + } else { + st->configbyte |= max1363_mode_table[d1m0to3m2].conf; + modemask = max1363_mode_table[d1m0to3m2].modemask; + } + numelements = hweight_long(modemask); + len = 3 * numelements + 3; + tx_buf = kmalloc(len, GFP_KERNEL); + if (!tx_buf) { + ret = -ENOMEM; + goto error_ret; + } + tx_buf[0] = st->configbyte; + tx_buf[1] = st->setupbyte; + tx_buf[2] = (st->monitor_speed << 1); + + /* + * So we need to do yet another bit of nefarious scan mode + * setup to match what we need. + */ + for (j = 0; j < 8; j++) + if (modemask & (1 << j)) { + /* Establish the mode is in the scan */ + if (st->mask_low & (1 << j)) { + tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF; + tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0; + } else if (j < 4) { + tx_buf[i] = 0; + tx_buf[i + 1] = 0; + } else { + tx_buf[i] = 0x80; + tx_buf[i + 1] = 0; + } + if (st->mask_high & (1 << j)) { + tx_buf[i + 1] |= + (st->thresh_high[j] >> 8) & 0x0F; + tx_buf[i + 2] = st->thresh_high[j] & 0xFF; + } else if (j < 4) { + tx_buf[i + 1] |= 0x0F; + tx_buf[i + 2] = 0xFF; + } else { + tx_buf[i + 1] |= 0x07; + tx_buf[i + 2] = 0xFF; + } + i += 3; + } + + + ret = i2c_master_send(st->client, tx_buf, len); + if (ret < 0) + goto error_ret; + if (ret != len) { + ret = -EIO; + goto error_ret; + } + + /* + * Now that we hopefully have sensible thresholds in place it is + * time to turn the interrupts on. + * It is unclear from the data sheet if this should be necessary + * (i.e. whether monitor mode setup is atomic) but it appears to + * be in practice. + */ + tx_buf[0] = st->setupbyte; + tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0; + ret = i2c_master_send(st->client, tx_buf, 2); + if (ret < 0) + goto error_ret; + if (ret != 2) { + ret = -EIO; + goto error_ret; + } + ret = 0; + st->monitor_on = true; +error_ret: + + kfree(tx_buf); + + return ret; +} + +/* + * To keep this manageable we always use one of 3 scan modes. + * Scan 0...3, 0-1,2-3 and 1-0,3-2 + */ + +static inline int __max1363_check_event_mask(int thismask, int checkmask) +{ + int ret = 0; + /* Is it unipolar */ + if (thismask < 4) { + if (checkmask & ~0x0F) { + ret = -EBUSY; + goto error_ret; + } + } else if (thismask < 6) { + if (checkmask & ~0x30) { + ret = -EBUSY; + goto error_ret; + } + } else if (checkmask & ~0xC0) + ret = -EBUSY; +error_ret: + return ret; +} + +static int max1363_write_event_config(struct iio_dev *indio_dev, + int event_code, + int state) +{ + int ret = 0; + struct max1363_state *st = iio_priv(indio_dev); + u16 unifiedmask; + int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code); + + mutex_lock(&indio_dev->mlock); + unifiedmask = st->mask_low | st->mask_high; + if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) { + + if (state == 0) + st->mask_low &= ~(1 << number); + else { + ret = __max1363_check_event_mask((1 << number), + unifiedmask); + if (ret) + goto error_ret; + st->mask_low |= (1 << number); + } + } else { + if (state == 0) + st->mask_high &= ~(1 << number); + else { + ret = __max1363_check_event_mask((1 << number), + unifiedmask); + if (ret) + goto error_ret; + st->mask_high |= (1 << number); + } + } + + max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low)); +error_ret: + mutex_unlock(&indio_dev->mlock); + + return ret; +} + +/* + * As with scan_elements, only certain sets of these can + * be combined. + */ +static struct attribute *max1363_event_attributes[] = { + &iio_dev_attr_sampling_frequency.dev_attr.attr, + &iio_const_attr_sampling_frequency_available.dev_attr.attr, + NULL, +}; + +static struct attribute_group max1363_event_attribute_group = { + .attrs = max1363_event_attributes, +}; + +#define MAX1363_EVENT_FUNCS \ + + +static const struct iio_info max1238_info = { + .read_raw = &max1363_read_raw, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info max1363_info = { + .read_event_value = &max1363_read_thresh, + .write_event_value = &max1363_write_thresh, + .read_event_config = &max1363_read_event_config, + .write_event_config = &max1363_write_event_config, + .read_raw = &max1363_read_raw, + .driver_module = THIS_MODULE, + .num_interrupt_lines = 1, + .event_attrs = &max1363_event_attribute_group, +}; + /* max1363 and max1368 tested - rest from data sheet */ static const struct max1363_chip_info max1363_chip_info_tbl[] = { [max1361] = { .bits = 10, .int_vref_mv = 2048, - .monitor_mode = 1, .mode_list = max1363_mode_list, .num_modes = ARRAY_SIZE(max1363_mode_list), .default_mode = s0to3, .channels = max1361_channels, .num_channels = ARRAY_SIZE(max1361_channels), + .info = &max1363_info, }, [max1362] = { .bits = 10, .int_vref_mv = 4096, - .monitor_mode = 1, .mode_list = max1363_mode_list, .num_modes = ARRAY_SIZE(max1363_mode_list), .default_mode = s0to3, .channels = max1361_channels, .num_channels = ARRAY_SIZE(max1361_channels), + .info = &max1363_info, }, [max1363] = { .bits = 12, .int_vref_mv = 2048, - .monitor_mode = 1, .mode_list = max1363_mode_list, .num_modes = ARRAY_SIZE(max1363_mode_list), .default_mode = s0to3, .channels = max1363_channels, .num_channels = ARRAY_SIZE(max1363_channels), + .info = &max1363_info, }, [max1364] = { .bits = 12, .int_vref_mv = 4096, - .monitor_mode = 1, .mode_list = max1363_mode_list, .num_modes = ARRAY_SIZE(max1363_mode_list), .default_mode = s0to3, .channels = max1363_channels, .num_channels = ARRAY_SIZE(max1363_channels), + .info = &max1363_info, }, [max1036] = { .bits = 8, @@ -520,6 +882,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1036_channels, .num_channels = ARRAY_SIZE(max1036_channels), }, @@ -529,6 +892,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1036_channels, .num_channels = ARRAY_SIZE(max1036_channels), }, @@ -538,6 +902,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1038_channels, .num_channels = ARRAY_SIZE(max1038_channels), }, @@ -547,6 +912,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1038_channels, .num_channels = ARRAY_SIZE(max1038_channels), }, @@ -556,6 +922,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1136_channels, .num_channels = ARRAY_SIZE(max1136_channels), }, @@ -565,6 +932,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1136_channels, .num_channels = ARRAY_SIZE(max1136_channels), }, @@ -574,6 +942,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1138_channels, .num_channels = ARRAY_SIZE(max1138_channels), }, @@ -583,6 +952,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1138_channels, .num_channels = ARRAY_SIZE(max1138_channels), }, @@ -592,6 +962,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1236_channels, .num_channels = ARRAY_SIZE(max1236_channels), }, @@ -601,6 +972,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1236_mode_list, .num_modes = ARRAY_SIZE(max1236_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1236_channels, .num_channels = ARRAY_SIZE(max1236_channels), }, @@ -610,6 +982,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -619,6 +992,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -628,6 +1002,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1036_channels, .num_channels = ARRAY_SIZE(max1036_channels), }, @@ -637,6 +1012,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1036_channels, .num_channels = ARRAY_SIZE(max1036_channels), }, @@ -646,6 +1022,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11602_channels, .num_channels = ARRAY_SIZE(max11602_channels), }, @@ -655,6 +1032,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11602_channels, .num_channels = ARRAY_SIZE(max11602_channels), }, @@ -664,6 +1042,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -673,6 +1052,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -682,6 +1062,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1136_channels, .num_channels = ARRAY_SIZE(max1136_channels), }, @@ -691,6 +1072,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1136_channels, .num_channels = ARRAY_SIZE(max1136_channels), }, @@ -700,6 +1082,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11608_channels, .num_channels = ARRAY_SIZE(max11608_channels), }, @@ -709,6 +1092,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11608_channels, .num_channels = ARRAY_SIZE(max11608_channels), }, @@ -718,6 +1102,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -727,6 +1112,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -736,6 +1122,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1363_channels, .num_channels = ARRAY_SIZE(max1363_channels), }, @@ -745,6 +1132,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11607_mode_list, .num_modes = ARRAY_SIZE(max11607_mode_list), .default_mode = s0to3, + .info = &max1238_info, .channels = max1363_channels, .num_channels = ARRAY_SIZE(max1363_channels), }, @@ -754,6 +1142,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11614_channels, .num_channels = ARRAY_SIZE(max11614_channels), }, @@ -763,6 +1152,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11608_mode_list, .num_modes = ARRAY_SIZE(max11608_mode_list), .default_mode = s0to7, + .info = &max1238_info, .channels = max11614_channels, .num_channels = ARRAY_SIZE(max11614_channels), }, @@ -772,6 +1162,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -781,6 +1172,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max1238_mode_list, .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, + .info = &max1238_info, .channels = max1238_channels, .num_channels = ARRAY_SIZE(max1238_channels), }, @@ -790,6 +1182,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11644_mode_list, .num_modes = ARRAY_SIZE(max11644_mode_list), .default_mode = s0to1, + .info = &max1238_info, .channels = max11644_channels, .num_channels = ARRAY_SIZE(max11644_channels), }, @@ -799,6 +1192,7 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11644_mode_list, .num_modes = ARRAY_SIZE(max11644_mode_list), .default_mode = s0to1, + .info = &max1238_info, .channels = max11644_channels, .num_channels = ARRAY_SIZE(max11644_channels), }, @@ -808,7 +1202,8 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11644_mode_list, .num_modes = ARRAY_SIZE(max11644_mode_list), .default_mode = s0to1, - .channels = max11644_channels, + .info = &max1238_info, + .channels = max11646_channels, .num_channels = ARRAY_SIZE(max11646_channels), }, [max11647] = { @@ -817,353 +1212,13 @@ static const struct max1363_chip_info max1363_chip_info_tbl[] = { .mode_list = max11644_mode_list, .num_modes = ARRAY_SIZE(max11644_mode_list), .default_mode = s0to1, - .channels = max11644_channels, + .info = &max1238_info, + .channels = max11646_channels, .num_channels = ARRAY_SIZE(max11646_channels), }, }; -static const int max1363_monitor_speeds[] = { 133000, 665000, 33300, 16600, - 8300, 4200, 2000, 1000 }; - -static ssize_t max1363_monitor_show_freq(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct max1363_state *st = iio_priv(dev_get_drvdata(dev)); - return sprintf(buf, "%d\n", max1363_monitor_speeds[st->monitor_speed]); -} - -static ssize_t max1363_monitor_store_freq(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t len) -{ - struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct max1363_state *st = iio_priv(indio_dev); - int i, ret; - unsigned long val; - bool found = false; - - ret = strict_strtoul(buf, 10, &val); - if (ret) - return -EINVAL; - for (i = 0; i < ARRAY_SIZE(max1363_monitor_speeds); i++) - if (val == max1363_monitor_speeds[i]) { - found = true; - break; - } - if (!found) - return -EINVAL; - - mutex_lock(&indio_dev->mlock); - st->monitor_speed = i; - mutex_unlock(&indio_dev->mlock); - - return 0; -} - -static IIO_DEV_ATTR_SAMP_FREQ(S_IRUGO | S_IWUSR, - max1363_monitor_show_freq, - max1363_monitor_store_freq); - -static IIO_CONST_ATTR(sampling_frequency_available, - "133000 665000 33300 16600 8300 4200 2000 1000"); - -static int max1363_read_thresh(struct iio_dev *indio_dev, - int event_code, - int *val) -{ - struct max1363_state *st = iio_priv(indio_dev); - if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) - *val = st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)]; - else - *val = st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)]; - return 0; -} - -static int max1363_write_thresh(struct iio_dev *indio_dev, - int event_code, - int val) -{ - struct max1363_state *st = iio_priv(indio_dev); - /* make it handle signed correctly as well */ - switch (st->chip_info->bits) { - case 10: - if (val > 0x3FF) - return -EINVAL; - break; - case 12: - if (val > 0xFFF) - return -EINVAL; - break; - } - - switch (IIO_EVENT_CODE_EXTRACT_DIR(event_code)) { - case IIO_EV_DIR_FALLING: - st->thresh_low[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; - break; - case IIO_EV_DIR_RISING: - st->thresh_high[IIO_EVENT_CODE_EXTRACT_NUM(event_code)] = val; - break; - } - - return 0; -} -static irqreturn_t max1363_event_handler(int irq, void *private) -{ - struct iio_dev *indio_dev = private; - struct max1363_state *st = iio_priv(indio_dev); - s64 timestamp = iio_get_time_ns(); - u8 rx; - u8 tx[2] = { st->setupbyte, - MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0 }; - - i2c_master_recv(st->client, &rx, 1); - /* todo - begging for use of for_each_set_bit */ - if (rx & (1 << 0)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_LOW_THRESH(3), - timestamp); - if (rx & (1 << 1)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_HIGH_THRESH(3), - timestamp); - if (rx & (1 << 2)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_LOW_THRESH(2), - timestamp); - if (rx & (1 << 3)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_HIGH_THRESH(2), - timestamp); - if (rx & (1 << 4)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_LOW_THRESH(1), - timestamp); - if (rx & (1 << 5)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_HIGH_THRESH(1), - timestamp); - if (rx & (1 << 6)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_LOW_THRESH(0), - timestamp); - if (rx & (1 << 7)) - iio_push_event(indio_dev, 0, - IIO_EVENT_CODE_IN_HIGH_THRESH(0), - timestamp); - i2c_master_send(st->client, tx, 2); - - return IRQ_HANDLED; -} - -static int max1363_read_event_config(struct iio_dev *indio_dev, - int event_code) -{ - struct max1363_state *st = iio_priv(indio_dev); - - int val; - int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code); - mutex_lock(&indio_dev->mlock); - if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) - val = (1 << number) & st->mask_low; - else - val = (1 << number) & st->mask_high; - mutex_unlock(&indio_dev->mlock); - - return val; -} - -static int max1363_monitor_mode_update(struct max1363_state *st, int enabled) -{ - u8 *tx_buf; - int ret, i = 3, j; - unsigned long numelements; - int len; - long modemask; - - if (!enabled) { - /* transition to ring capture is not currently supported */ - st->setupbyte &= ~MAX1363_SETUP_MONITOR_SETUP; - st->configbyte &= ~MAX1363_SCAN_MASK; - st->monitor_on = false; - return max1363_write_basic_config(st->client, - st->setupbyte, - st->configbyte); - } - - /* Ensure we are in the relevant mode */ - st->setupbyte |= MAX1363_SETUP_MONITOR_SETUP; - st->configbyte &= ~(MAX1363_CHANNEL_SEL_MASK - | MAX1363_SCAN_MASK - | MAX1363_SE_DE_MASK); - st->configbyte |= MAX1363_CONFIG_SCAN_MONITOR_MODE; - if ((st->mask_low | st->mask_high) & 0x0F) { - st->configbyte |= max1363_mode_table[s0to3].conf; - modemask = max1363_mode_table[s0to3].modemask; - } else if ((st->mask_low | st->mask_high) & 0x30) { - st->configbyte |= max1363_mode_table[d0m1to2m3].conf; - modemask = max1363_mode_table[d0m1to2m3].modemask; - } else { - st->configbyte |= max1363_mode_table[d1m0to3m2].conf; - modemask = max1363_mode_table[d1m0to3m2].modemask; - } - numelements = hweight_long(modemask); - len = 3 * numelements + 3; - tx_buf = kmalloc(len, GFP_KERNEL); - if (!tx_buf) { - ret = -ENOMEM; - goto error_ret; - } - tx_buf[0] = st->configbyte; - tx_buf[1] = st->setupbyte; - tx_buf[2] = (st->monitor_speed << 1); - - /* - * So we need to do yet another bit of nefarious scan mode - * setup to match what we need. - */ - for (j = 0; j < 8; j++) - if (modemask & (1 << j)) { - /* Establish the mode is in the scan */ - if (st->mask_low & (1 << j)) { - tx_buf[i] = (st->thresh_low[j] >> 4) & 0xFF; - tx_buf[i + 1] = (st->thresh_low[j] << 4) & 0xF0; - } else if (j < 4) { - tx_buf[i] = 0; - tx_buf[i + 1] = 0; - } else { - tx_buf[i] = 0x80; - tx_buf[i + 1] = 0; - } - if (st->mask_high & (1 << j)) { - tx_buf[i + 1] |= - (st->thresh_high[j] >> 8) & 0x0F; - tx_buf[i + 2] = st->thresh_high[j] & 0xFF; - } else if (j < 4) { - tx_buf[i + 1] |= 0x0F; - tx_buf[i + 2] = 0xFF; - } else { - tx_buf[i + 1] |= 0x07; - tx_buf[i + 2] = 0xFF; - } - i += 3; - } - - - ret = i2c_master_send(st->client, tx_buf, len); - if (ret < 0) - goto error_ret; - if (ret != len) { - ret = -EIO; - goto error_ret; - } - - /* - * Now that we hopefully have sensible thresholds in place it is - * time to turn the interrupts on. - * It is unclear from the data sheet if this should be necessary - * (i.e. whether monitor mode setup is atomic) but it appears to - * be in practice. - */ - tx_buf[0] = st->setupbyte; - tx_buf[1] = MAX1363_MON_INT_ENABLE | (st->monitor_speed << 1) | 0xF0; - ret = i2c_master_send(st->client, tx_buf, 2); - if (ret < 0) - goto error_ret; - if (ret != 2) { - ret = -EIO; - goto error_ret; - } - ret = 0; - st->monitor_on = true; -error_ret: - - kfree(tx_buf); - - return ret; -} - -/* - * To keep this manageable we always use one of 3 scan modes. - * Scan 0...3, 0-1,2-3 and 1-0,3-2 - */ - -static inline int __max1363_check_event_mask(int thismask, int checkmask) -{ - int ret = 0; - /* Is it unipolar */ - if (thismask < 4) { - if (checkmask & ~0x0F) { - ret = -EBUSY; - goto error_ret; - } - } else if (thismask < 6) { - if (checkmask & ~0x30) { - ret = -EBUSY; - goto error_ret; - } - } else if (checkmask & ~0xC0) - ret = -EBUSY; -error_ret: - return ret; -} - -static int max1363_write_event_config(struct iio_dev *indio_dev, - int event_code, - int state) -{ - int ret = 0; - struct max1363_state *st = iio_priv(indio_dev); - u16 unifiedmask; - int number = IIO_EVENT_CODE_EXTRACT_NUM(event_code); - - mutex_lock(&indio_dev->mlock); - unifiedmask = st->mask_low | st->mask_high; - if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING) { - - if (state == 0) - st->mask_low &= ~(1 << number); - else { - ret = __max1363_check_event_mask((1 << number), - unifiedmask); - if (ret) - goto error_ret; - st->mask_low |= (1 << number); - } - } else { - if (state == 0) - st->mask_high &= ~(1 << number); - else { - ret = __max1363_check_event_mask((1 << number), - unifiedmask); - if (ret) - goto error_ret; - st->mask_high |= (1 << number); - } - } - - max1363_monitor_mode_update(st, !!(st->mask_high | st->mask_low)); -error_ret: - mutex_unlock(&indio_dev->mlock); - - return ret; -} - -/* - * As with scan_elements, only certain sets of these can - * be combined. - */ -static struct attribute *max1363_event_attributes[] = { - &iio_dev_attr_sampling_frequency.dev_attr.attr, - &iio_const_attr_sampling_frequency_available.dev_attr.attr, - NULL, -}; - -static struct attribute_group max1363_event_attribute_group = { - .attrs = max1363_event_attributes, -}; static int max1363_initial_setup(struct max1363_state *st) { @@ -1224,22 +1279,9 @@ static int __devinit max1363_probe(struct i2c_client *client, /* Estabilish that the iio_dev is a child of the i2c device */ indio_dev->dev.parent = &client->dev; indio_dev->name = id->name; - indio_dev->read_event_value = &max1363_read_thresh; - indio_dev->write_event_value = &max1363_write_thresh; - indio_dev->read_event_config = &max1363_read_event_config; - indio_dev->write_event_config = &max1363_write_event_config; - indio_dev->channels = st->chip_info->channels; - indio_dev->num_channels = st->chip_info->num_channels; - indio_dev->read_raw = &max1363_read_raw; - /* Todo: this shouldn't be here. */ - indio_dev->driver_module = THIS_MODULE; - indio_dev->modes = INDIO_DIRECT_MODE; - if (st->chip_info->monitor_mode && client->irq) { - indio_dev->num_interrupt_lines = 1; - indio_dev->event_attrs - = &max1363_event_attribute_group; - } + indio_dev->info = st->chip_info->info; + indio_dev->modes = INDIO_DIRECT_MODE; ret = max1363_initial_setup(st); if (ret) goto error_free_available_scan_masks; @@ -1258,7 +1300,7 @@ static int __devinit max1363_probe(struct i2c_client *client, if (ret) goto error_cleanup_ring; - if (st->chip_info->monitor_mode && client->irq) { + if (client->irq) { ret = request_threaded_irq(st->client->irq, NULL, &max1363_event_handler, @@ -1298,7 +1340,7 @@ static int max1363_remove(struct i2c_client *client) struct max1363_state *st = iio_priv(indio_dev); struct regulator *reg = st->reg; - if (st->chip_info->monitor_mode && client->irq) + if (client->irq) free_irq(st->client->irq, indio_dev); iio_ring_buffer_unregister(indio_dev->ring); max1363_ring_cleanup(indio_dev); diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c index b71994ee8845..7097deb0f309 100644 --- a/drivers/staging/iio/addac/adt7316.c +++ b/drivers/staging/iio/addac/adt7316.c @@ -2106,6 +2106,20 @@ int adt7316_enable(struct device *dev) EXPORT_SYMBOL(adt7316_enable); #endif +static const struct iio_info adt7316_info = { + .attrs = &adt7316_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &adt7316_event_attribute_group, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info adt7516_info = { + .attrs = &adt7516_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &adt7516_event_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * device probe and remove */ @@ -2150,17 +2164,12 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, } chip->indio_dev->dev.parent = dev; - if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) { - chip->indio_dev->attrs = &adt7516_attribute_group; - chip->indio_dev->event_attrs = &adt7516_event_attribute_group; - } else { - chip->indio_dev->attrs = &adt7316_attribute_group; - chip->indio_dev->event_attrs = &adt7316_event_attribute_group; - } + if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) + chip->indio_dev->info = &adt7516_info; + else + chip->indio_dev->info = &adt7316_info; chip->indio_dev->name = name; chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->driver_module = THIS_MODULE; - chip->indio_dev->num_interrupt_lines = 1; chip->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->indio_dev); diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c index 22646a617806..86cb08ce199b 100644 --- a/drivers/staging/iio/dac/ad5446.c +++ b/drivers/staging/iio/dac/ad5446.c @@ -334,6 +334,11 @@ static const struct ad5446_chip_info ad5446_chip_info_tbl[] = { }, }; +static const struct iio_info ad5446_info = { + .attrs = &ad5446_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad5446_probe(struct spi_device *spi) { struct ad5446_state *st; @@ -370,9 +375,8 @@ static int __devinit ad5446_probe(struct spi_device *spi) /* Estabilish that the iio_dev is a child of the spi device */ st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->attrs = &ad5446_attribute_group; + st->indio_dev->info = &ad5446_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default message */ diff --git a/drivers/staging/iio/dac/ad5504.c b/drivers/staging/iio/dac/ad5504.c index 351a9d330fab..ed029cdff300 100644 --- a/drivers/staging/iio/dac/ad5504.c +++ b/drivers/staging/iio/dac/ad5504.c @@ -260,6 +260,20 @@ static irqreturn_t ad5504_event_handler(int irq, void *private) return IRQ_HANDLED; } +static const struct iio_info ad5504_info = { + .attrs = &ad5504_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &ad5504_ev_attribute_group, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info ad5501_info = { + .attrs = &ad5501_attribute_group, + .num_interrupt_lines = 1, + .event_attrs = &ad5504_ev_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad5504_probe(struct spi_device *spi) { struct ad5504_platform_data *pdata = spi->dev.platform_data; @@ -298,14 +312,12 @@ static int __devinit ad5504_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(st->spi)->name; - st->indio_dev->attrs = spi_get_device_id(st->spi)->driver_data - == ID_AD5501 ? &ad5501_attribute_group : - &ad5504_attribute_group; + if (spi_get_device_id(st->spi)->driver_data == ID_AD5501) + st->indio_dev->info = &ad5501_info; + else + st->indio_dev->info = &ad5504_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; - st->indio_dev->num_interrupt_lines = 1; - st->indio_dev->event_attrs = &ad5504_ev_attribute_group, ret = iio_device_register(st->indio_dev); if (ret) diff --git a/drivers/staging/iio/dac/ad5624r_spi.c b/drivers/staging/iio/dac/ad5624r_spi.c index b0e25e25a267..c679981f0143 100644 --- a/drivers/staging/iio/dac/ad5624r_spi.c +++ b/drivers/staging/iio/dac/ad5624r_spi.c @@ -218,6 +218,11 @@ static const struct attribute_group ad5624r_attribute_group = { .attrs = ad5624r_attributes, }; +static const struct iio_info ad5624r_info = { + .attrs = &ad5624r_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad5624r_probe(struct spi_device *spi) { struct ad5624r_state *st; @@ -255,9 +260,8 @@ static int __devinit ad5624r_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->attrs = &ad5624r_attribute_group; + st->indio_dev->info = &ad5624r_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/dac/ad5791.c b/drivers/staging/iio/dac/ad5791.c index acfd13bdecc1..4eda25cba870 100644 --- a/drivers/staging/iio/dac/ad5791.c +++ b/drivers/staging/iio/dac/ad5791.c @@ -287,6 +287,11 @@ static const struct ad5791_chip_info ad5791_chip_info_tbl[] = { }, }; +static const struct iio_info ad5791_info = { + .attrs = &ad5791_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad5791_probe(struct spi_device *spi) { struct ad5791_platform_data *pdata = spi->dev.platform_data; @@ -353,8 +358,7 @@ static int __devinit ad5791_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->attrs = &ad5791_attribute_group; - st->indio_dev->driver_module = THIS_MODULE; + st->indio_dev->info = &ad5791_info; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/dac/max517.c b/drivers/staging/iio/dac/max517.c index 3eb48b65c15e..881768df47a6 100644 --- a/drivers/staging/iio/dac/max517.c +++ b/drivers/staging/iio/dac/max517.c @@ -189,6 +189,16 @@ static int max517_resume(struct i2c_client *client) return i2c_master_send(client, &outbuf, 1); } +static const struct iio_info max517_info = { + .attrs = &max517_attribute_group, + .driver_module = THIS_MODULE, +}; + +static const struct iio_info max518_info = { + .attrs = &max517_attribute_group, + .driver_module = THIS_MODULE, +}; + static int max517_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -217,11 +227,10 @@ static int max517_probe(struct i2c_client *client, /* reduced attribute set for MAX517 */ if (id->driver_data == ID_MAX517) - data->indio_dev->attrs = &max517_attribute_group; + data->indio_dev->info = &max517_info; else - data->indio_dev->attrs = &max518_attribute_group; + data->indio_dev->info = &max518_info; data->indio_dev->dev_data = (void *)(data); - data->indio_dev->driver_module = THIS_MODULE; data->indio_dev->modes = INDIO_DIRECT_MODE; /* diff --git a/drivers/staging/iio/dds/ad5930.c b/drivers/staging/iio/dds/ad5930.c index 5d98f93ca84e..490c3637bc8e 100644 --- a/drivers/staging/iio/dds/ad5930.c +++ b/drivers/staging/iio/dds/ad5930.c @@ -87,6 +87,12 @@ static const struct attribute_group ad5930_attribute_group = { .attrs = ad5930_attributes, }; +static const struct iio_info ad5930_info = { + .attrs = &ad5930_attribute_group, + + .driver_module = THIS_MODULE, +}; + static int __devinit ad5930_probe(struct spi_device *spi) { struct ad5930_state *st; @@ -108,12 +114,8 @@ static int __devinit ad5930_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - - st->idev->attrs = &ad5930_attribute_group; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; + st->idev->info = &ad5930_info; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/dds/ad9832.c b/drivers/staging/iio/dds/ad9832.c index 4b5721cbac66..e8fe1426a329 100644 --- a/drivers/staging/iio/dds/ad9832.c +++ b/drivers/staging/iio/dds/ad9832.c @@ -195,6 +195,11 @@ static const struct attribute_group ad9832_attribute_group = { .attrs = ad9832_attributes, }; +static const struct iio_info ad9832_info = { + .attrs = &ad9832_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9832_probe(struct spi_device *spi) { struct ad9832_platform_data *pdata = spi->dev.platform_data; @@ -232,9 +237,8 @@ static int __devinit ad9832_probe(struct spi_device *spi) st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->attrs = &ad9832_attribute_group; + st->indio_dev->info = &ad9832_info; st->indio_dev->dev_data = (void *) st; - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default messages */ diff --git a/drivers/staging/iio/dds/ad9834.c b/drivers/staging/iio/dds/ad9834.c index e5303e6139ae..0ebe8d58e92e 100644 --- a/drivers/staging/iio/dds/ad9834.c +++ b/drivers/staging/iio/dds/ad9834.c @@ -305,6 +305,11 @@ static const struct attribute_group ad9834_attribute_group = { .is_visible = ad9834_attr_is_visible, }; +static const struct iio_info ad9834_info = { + .attrs = &ad9834_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9834_probe(struct spi_device *spi) { struct ad9834_platform_data *pdata = spi->dev.platform_data; @@ -344,9 +349,8 @@ static int __devinit ad9834_probe(struct spi_device *spi) st->indio_dev->dev.parent = &spi->dev; st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->attrs = &ad9834_attribute_group; + st->indio_dev->info = &ad9834_info; st->indio_dev->dev_data = (void *) st; - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default messages */ diff --git a/drivers/staging/iio/dds/ad9850.c b/drivers/staging/iio/dds/ad9850.c index 34bc0e6950d2..b580d852a1ee 100644 --- a/drivers/staging/iio/dds/ad9850.c +++ b/drivers/staging/iio/dds/ad9850.c @@ -73,6 +73,11 @@ static const struct attribute_group ad9850_attribute_group = { .attrs = ad9850_attributes, }; +static const struct iio_info ad9850_info = { + .attrs = &ad9850_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9850_probe(struct spi_device *spi) { struct ad9850_state *st; @@ -94,12 +99,9 @@ static int __devinit ad9850_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad9850_attribute_group; + st->idev->info = &ad9850_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/dds/ad9852.c b/drivers/staging/iio/dds/ad9852.c index 899a72acd8f6..08020f96300a 100644 --- a/drivers/staging/iio/dds/ad9852.c +++ b/drivers/staging/iio/dds/ad9852.c @@ -222,6 +222,11 @@ static const struct attribute_group ad9852_attribute_group = { .attrs = ad9852_attributes, }; +static const struct iio_info ad9852_info = { + .attrs = &ad9852_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9852_probe(struct spi_device *spi) { struct ad9852_state *st; @@ -243,12 +248,9 @@ static int __devinit ad9852_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad9852_attribute_group; + st->idev->info = &ad9852_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/dds/ad9910.c b/drivers/staging/iio/dds/ad9910.c index fddb6e7c7edc..97d75d755824 100644 --- a/drivers/staging/iio/dds/ad9910.c +++ b/drivers/staging/iio/dds/ad9910.c @@ -357,6 +357,11 @@ static const struct attribute_group ad9910_attribute_group = { .attrs = ad9910_attributes, }; +static const struct iio_info ad9910_info = { + .attrs = &ad9910_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9910_probe(struct spi_device *spi) { struct ad9910_state *st; @@ -378,12 +383,9 @@ static int __devinit ad9910_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad9910_attribute_group; + st->idev->info = &ad9910_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/dds/ad9951.c b/drivers/staging/iio/dds/ad9951.c index a9e56c6e0fa7..d4dfcd41d5f9 100644 --- a/drivers/staging/iio/dds/ad9951.c +++ b/drivers/staging/iio/dds/ad9951.c @@ -166,6 +166,11 @@ static const struct attribute_group ad9951_attribute_group = { .attrs = ad9951_attributes, }; +static const struct iio_info ad9951_info = { + .attrs = &ad9951_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad9951_probe(struct spi_device *spi) { struct ad9951_state *st; @@ -187,12 +192,9 @@ static int __devinit ad9951_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad9951_attribute_group; + st->idev->info = &ad9951_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/gyro/adis16060_core.c b/drivers/staging/iio/gyro/adis16060_core.c index e1f8a708c630..edf9e3bf3efd 100644 --- a/drivers/staging/iio/gyro/adis16060_core.c +++ b/drivers/staging/iio/gyro/adis16060_core.c @@ -133,6 +133,11 @@ static const struct attribute_group adis16060_attribute_group = { .attrs = adis16060_attributes, }; +static const struct iio_info adis16060_info = { + .attrs = &adis16060_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16060_r_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -154,9 +159,8 @@ static int __devinit adis16060_r_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16060_attribute_group; + st->indio_dev->info = &adis16060_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/gyro/adis16080_core.c b/drivers/staging/iio/gyro/adis16080_core.c index fb48e9b3e03a..d42690bea066 100644 --- a/drivers/staging/iio/gyro/adis16080_core.c +++ b/drivers/staging/iio/gyro/adis16080_core.c @@ -123,6 +123,11 @@ static const struct attribute_group adis16080_attribute_group = { .attrs = adis16080_attributes, }; +static const struct iio_info adis16080_info = { + .attrs = &adis16080_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16080_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -146,9 +151,8 @@ static int __devinit adis16080_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16080_attribute_group; + st->indio_dev->info = &adis16080_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/gyro/adis16130_core.c b/drivers/staging/iio/gyro/adis16130_core.c index c2f338c7faf0..14d5a34ab441 100644 --- a/drivers/staging/iio/gyro/adis16130_core.c +++ b/drivers/staging/iio/gyro/adis16130_core.c @@ -175,6 +175,11 @@ static const struct attribute_group adis16130_attribute_group = { .attrs = adis16130_attributes, }; +static const struct iio_info adis16130_info = { + .attrs = &adis16130_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16130_probe(struct spi_device *spi) { int ret; @@ -196,9 +201,8 @@ static int __devinit adis16130_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16130_attribute_group; + st->indio_dev->info = &adis16130_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; st->mode = 1; diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c index 0eb6a87bca45..3dc9a272749d 100644 --- a/drivers/staging/iio/gyro/adis16260_core.c +++ b/drivers/staging/iio/gyro/adis16260_core.c @@ -565,6 +565,13 @@ static const struct attribute_group adis16260_attribute_group = { .attrs = adis16260_attributes, }; +static const struct iio_info adis16260_info = { + .attrs = &adis16260_attribute_group, + .read_raw = &adis16260_read_raw, + .write_raw = &adis16260_write_raw, + .driver_module = THIS_MODULE, +}; + static int __devinit adis16260_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -601,7 +608,7 @@ static int __devinit adis16260_probe(struct spi_device *spi) st->indio_dev->name = spi_get_device_id(st->us)->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adis16260_attribute_group; + st->indio_dev->info = &adis16260_info; st->indio_dev->num_channels = ARRAY_SIZE(adis16260_channels_x); if (pd && pd->direction) @@ -621,10 +628,7 @@ static int __devinit adis16260_probe(struct spi_device *spi) else st->indio_dev->channels = adis16260_channels_x; - st->indio_dev->read_raw = &adis16260_read_raw; - st->indio_dev->write_raw = &adis16260_write_raw; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16260_configure_ring(st->indio_dev); diff --git a/drivers/staging/iio/gyro/adxrs450_core.c b/drivers/staging/iio/gyro/adxrs450_core.c index 7a9d7c258dcf..3714e4aadc23 100644 --- a/drivers/staging/iio/gyro/adxrs450_core.c +++ b/drivers/staging/iio/gyro/adxrs450_core.c @@ -349,6 +349,11 @@ static const struct attribute_group adxrs450_attribute_group = { .attrs = adxrs450_attributes, }; +static const struct iio_info adxrs450_info = { + .attrs = &adxrs450_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit adxrs450_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -381,9 +386,8 @@ static int __devinit adxrs450_probe(struct spi_device *spi) } st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &adxrs450_attribute_group; + st->indio_dev->info = &adxrs450_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h index 4dc4ff0232a4..38f1425f4645 100644 --- a/drivers/staging/iio/iio.h +++ b/drivers/staging/iio/iio.h @@ -202,6 +202,61 @@ static inline s64 iio_get_time_ns(void) * call to iio_device_register. */ #define IIO_VAL_INT 1 #define IIO_VAL_INT_PLUS_MICRO 2 + +/** + * struct iio_info - constant information about device + * @driver_module: module structure used to ensure correct + * ownership of chrdevs etc + * @num_interrupt_lines:number of physical interrupt lines from device + * @event_attrs: event control attributes + * @attrs: general purpose device attributes + * @read_raw: function to request a value from the device. + * mask specifies which value. Note 0 means a reading of + * the channel in question. Return value will specify the + * type of value returned by the device. val and val2 will + * contain the elements making up the returned value. + * @write_raw: function to write a value to the device. + * Parameters are the same as for read_raw. + * @read_event_config: find out if the event is enabled. + * @write_event_config: set if the event is enabled. + * @read_event_value: read a value associated with the event. Meaning + * is event dependant. event_code specifies which event. + * @write_event_value: write the value associate with the event. + * Meaning is event dependent. + **/ +struct iio_info { + struct module *driver_module; + int num_interrupt_lines; + struct attribute_group *event_attrs; + const struct attribute_group *attrs; + + int (*read_raw)(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, + int *val2, + long mask); + + int (*write_raw)(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, + int val2, + long mask); + + int (*read_event_config)(struct iio_dev *indio_dev, + int event_code); + + int (*write_event_config)(struct iio_dev *indio_dev, + int event_code, + int state); + + int (*read_event_value)(struct iio_dev *indio_dev, + int event_code, + int *val); + int (*write_event_value)(struct iio_dev *indio_dev, + int event_code, + int val); +}; + /** * struct iio_dev - industrial I/O device * @id: [INTERN] used to identify device internally @@ -210,11 +265,6 @@ static inline s64 iio_get_time_ns(void) * @currentmode: [DRIVER] current operating mode * @dev: [DRIVER] device structure, should be assigned a parent * and owner - * @attrs: [DRIVER] general purpose device attributes - * @driver_module: [DRIVER] module structure used to ensure correct - * ownership of chrdevs etc - * @num_interrupt_lines:[DRIVER] number of physical interrupt lines from device - * @event_attrs: [DRIVER] event control attributes * @event_interfaces: [INTERN] event chrdevs associated with interrupt lines * @ring: [DRIVER] any ring buffer present * @mlock: [INTERN] lock used to prevent simultaneous device state @@ -227,19 +277,6 @@ static inline s64 iio_get_time_ns(void) * @channel_attr_list: [INTERN] keep track of automatically created channel * attributes. * @name: [DRIVER] name of the device. - * @read_raw: [DRIVER] function to request a value from the device. - * mask specifies which value. Note 0 means a reading of - * the channel in question. Return value will specify the - * type of value returned by the device. val and val2 will - * contain the elements making up the returned value. - * @write_raw: [DRIVER] function to write a value to the device. - * Parameters are the same as for read_raw. - * @read_event_config: [DRIVER] find out if the event is enabled. - * @write_event_config: [DRIVER] set if the event is enabled. - * @read_event_value: [DRIVER] read a value associated with the event. Meaning - * is event dependant. event_code specifies which event. - * @write_event_value: [DRIVER] write the value associate with the event. - * Meaning is event dependent. **/ struct iio_dev { int id; @@ -247,11 +284,7 @@ struct iio_dev { int modes; int currentmode; struct device dev; - const struct attribute_group *attrs; - struct module *driver_module; - int num_interrupt_lines; - struct attribute_group *event_attrs; struct iio_event_interface *event_interfaces; struct iio_ring_buffer *ring; @@ -263,34 +296,10 @@ struct iio_dev { struct iio_chan_spec const *channels; int num_channels; - struct list_head channel_attr_list; + struct list_head channel_attr_list; const char *name; - int (*read_raw)(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - int *val, - int *val2, - long mask); - - int (*write_raw)(struct iio_dev *indio_dev, - struct iio_chan_spec const *chan, - int val, - int val2, - long mask); - - int (*read_event_config)(struct iio_dev *indio_dev, - int event_code); - - int (*write_event_config)(struct iio_dev *indio_dev, - int event_code, - int state); - - int (*read_event_value)(struct iio_dev *indio_dev, - int event_code, - int *val); - int (*write_event_value)(struct iio_dev *indio_dev, - int event_code, - int val); + const struct iio_info *info; }; /** diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index 0067bc70acba..fe89802e3fe7 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c @@ -770,7 +770,12 @@ static struct adis16400_chip_info adis16400_chips[] = { } }; - +static const struct iio_info adis16400_info = { + .driver_module = THIS_MODULE, + .read_raw = &adis16400_read_raw, + .write_raw = &adis16400_write_raw, + .attrs = &adis16400_attribute_group, +}; static int __devinit adis16400_probe(struct spi_device *spi) { @@ -792,12 +797,9 @@ static int __devinit adis16400_probe(struct spi_device *spi) st->variant = &adis16400_chips[spi_get_device_id(spi)->driver_data]; indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; - indio_dev->attrs = &adis16400_attribute_group; indio_dev->channels = st->variant->channels; indio_dev->num_channels = st->variant->num_channels; - indio_dev->read_raw = &adis16400_read_raw; - indio_dev->write_raw = &adis16400_write_raw; - indio_dev->driver_module = THIS_MODULE; + indio_dev->info = &adis16400_info; indio_dev->modes = INDIO_DIRECT_MODE; ret = adis16400_configure_ring(indio_dev); diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c index 9218fee8c26f..94d3bfaa061d 100644 --- a/drivers/staging/iio/industrialio-core.c +++ b/drivers/staging/iio/industrialio-core.c @@ -383,8 +383,8 @@ static ssize_t iio_read_channel_info(struct device *dev, struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int val, val2; - int ret = indio_dev->read_raw(indio_dev, this_attr->c, - &val, &val2, this_attr->address); + int ret = indio_dev->info->read_raw(indio_dev, this_attr->c, + &val, &val2, this_attr->address); if (ret < 0) return ret; @@ -411,7 +411,7 @@ static ssize_t iio_write_channel_info(struct device *dev, bool integer_part = true, negative = false; /* Assumes decimal - precision based on number of digits */ - if (!indio_dev->write_raw) + if (!indio_dev->info->write_raw) return -EINVAL; if (buf[0] == '-') { negative = true; @@ -446,8 +446,8 @@ static ssize_t iio_write_channel_info(struct device *dev, micro = -micro; } - ret = indio_dev->write_raw(indio_dev, this_attr->c, - integer, micro, this_attr->address); + ret = indio_dev->info->write_raw(indio_dev, this_attr->c, + integer, micro, this_attr->address); if (ret) return ret; @@ -707,8 +707,9 @@ static int iio_device_register_sysfs(struct iio_dev *dev_info) int i, ret = 0; struct iio_dev_attr *p, *n; - if (dev_info->attrs) { - ret = sysfs_create_group(&dev_info->dev.kobj, dev_info->attrs); + if (dev_info->info->attrs) { + ret = sysfs_create_group(&dev_info->dev.kobj, + dev_info->info->attrs); if (ret) { dev_err(dev_info->dev.parent, "Failed to register sysfs hooks\n"); @@ -744,8 +745,8 @@ error_clear_attrs: list_del(&p->l); iio_device_remove_and_free_read_attr(dev_info, p); } - if (dev_info->attrs) - sysfs_remove_group(&dev_info->dev.kobj, dev_info->attrs); + if (dev_info->info->attrs) + sysfs_remove_group(&dev_info->dev.kobj, dev_info->info->attrs); error_ret: return ret; @@ -764,8 +765,8 @@ static void iio_device_unregister_sysfs(struct iio_dev *dev_info) iio_device_remove_and_free_read_attr(dev_info, p); } - if (dev_info->attrs) - sysfs_remove_group(&dev_info->dev.kobj, dev_info->attrs); + if (dev_info->info->attrs) + sysfs_remove_group(&dev_info->dev.kobj, dev_info->info->attrs); } /* Return a negative errno on failure */ @@ -824,8 +825,9 @@ static ssize_t iio_ev_state_store(struct device *dev, if (ret < 0) return ret; - ret = indio_dev->write_event_config(indio_dev, this_attr->address, - val); + ret = indio_dev->info->write_event_config(indio_dev, + this_attr->address, + val); return (ret < 0) ? ret : len; } @@ -835,7 +837,8 @@ static ssize_t iio_ev_state_show(struct device *dev, { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); - int val = indio_dev->read_event_config(indio_dev, this_attr->address); + int val = indio_dev->info->read_event_config(indio_dev, + this_attr->address); if (val < 0) return val; @@ -851,8 +854,8 @@ static ssize_t iio_ev_value_show(struct device *dev, struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int val, ret; - ret = indio_dev->read_event_value(indio_dev, - this_attr->address, &val); + ret = indio_dev->info->read_event_value(indio_dev, + this_attr->address, &val); if (ret < 0) return ret; @@ -873,8 +876,8 @@ static ssize_t iio_ev_value_store(struct device *dev, if (ret) return ret; - ret = indio_dev->write_event_value(indio_dev, this_attr->address, - val); + ret = indio_dev->info->write_event_value(indio_dev, this_attr->address, + val); if (ret < 0) return ret; @@ -930,8 +933,7 @@ static int iio_device_add_event_sysfs(struct iio_dev *dev_info, extending the bitmask - but how far*/ 0, - &dev_info->event_interfaces[0] - .dev, + &dev_info->event_interfaces[0].dev, &dev_info->event_interfaces[0]. dev_attr_list); kfree(postfix); @@ -1015,23 +1017,23 @@ static int iio_device_register_eventset(struct iio_dev *dev_info) { int ret = 0, i, j; - if (dev_info->num_interrupt_lines == 0) + if (dev_info->info->num_interrupt_lines == 0) return 0; dev_info->event_interfaces = kzalloc(sizeof(struct iio_event_interface) - *dev_info->num_interrupt_lines, + *dev_info->info->num_interrupt_lines, GFP_KERNEL); if (dev_info->event_interfaces == NULL) { ret = -ENOMEM; goto error_ret; } - for (i = 0; i < dev_info->num_interrupt_lines; i++) { + for (i = 0; i < dev_info->info->num_interrupt_lines; i++) { ret = iio_setup_ev_int(&dev_info->event_interfaces[i], dev_name(&dev_info->dev), i, - dev_info->driver_module, + dev_info->info->driver_module, &dev_info->dev); if (ret) { dev_err(&dev_info->dev, @@ -1042,11 +1044,12 @@ static int iio_device_register_eventset(struct iio_dev *dev_info) dev_set_drvdata(&dev_info->event_interfaces[i].dev, (void *)dev_info); - if (dev_info->event_attrs != NULL) + if (dev_info->info->event_attrs != NULL) ret = sysfs_create_group(&dev_info ->event_interfaces[i] .dev.kobj, - &dev_info->event_attrs[i]); + &dev_info->info + ->event_attrs[i]); if (ret) { dev_err(&dev_info->dev, @@ -1055,7 +1058,7 @@ static int iio_device_register_eventset(struct iio_dev *dev_info) } } - for (i = 0; i < dev_info->num_interrupt_lines; i++) { + for (i = 0; i < dev_info->info->num_interrupt_lines; i++) { ret = __iio_add_event_config_attrs(dev_info, i); if (ret) goto error_unregister_config_attrs; @@ -1066,13 +1069,13 @@ static int iio_device_register_eventset(struct iio_dev *dev_info) error_unregister_config_attrs: for (j = 0; j < i; j++) __iio_remove_event_config_attrs(dev_info, i); - i = dev_info->num_interrupt_lines - 1; + i = dev_info->info->num_interrupt_lines - 1; error_remove_sysfs_interfaces: for (j = 0; j < i; j++) - if (dev_info->event_attrs != NULL) + if (dev_info->info->event_attrs != NULL) sysfs_remove_group(&dev_info ->event_interfaces[j].dev.kobj, - &dev_info->event_attrs[j]); + &dev_info->info->event_attrs[j]); error_free_setup_ev_ints: for (j = 0; j < i; j++) iio_free_ev_int(&dev_info->event_interfaces[j]); @@ -1086,17 +1089,17 @@ static void iio_device_unregister_eventset(struct iio_dev *dev_info) { int i; - if (dev_info->num_interrupt_lines == 0) + if (dev_info->info->num_interrupt_lines == 0) return; - for (i = 0; i < dev_info->num_interrupt_lines; i++) { + for (i = 0; i < dev_info->info->num_interrupt_lines; i++) { __iio_remove_event_config_attrs(dev_info, i); - if (dev_info->event_attrs != NULL) + if (dev_info->info->event_attrs != NULL) sysfs_remove_group(&dev_info ->event_interfaces[i].dev.kobj, - &dev_info->event_attrs[i]); + &dev_info->info->event_attrs[i]); } - for (i = 0; i < dev_info->num_interrupt_lines; i++) + for (i = 0; i < dev_info->info->num_interrupt_lines; i++) iio_free_ev_int(&dev_info->event_interfaces[i]); kfree(dev_info->event_interfaces); } diff --git a/drivers/staging/iio/light/isl29018.c b/drivers/staging/iio/light/isl29018.c index 307c66426dc7..4794ffd5e446 100644 --- a/drivers/staging/iio/light/isl29018.c +++ b/drivers/staging/iio/light/isl29018.c @@ -455,6 +455,11 @@ static int isl29018_chip_init(struct i2c_client *client) return 0; } +static const struct iio_info isl29108_info = { + .attrs = &isl29108_group, + .driver_module = THIS_MODULE, +}; + static int __devinit isl29018_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -485,11 +490,10 @@ static int __devinit isl29018_probe(struct i2c_client *client, dev_err(&client->dev, "iio allocation fails\n"); goto exit_free; } - chip->indio_dev->attrs = &isl29108_group; + chip->indio_dev->info = &isl29108_info; chip->indio_dev->name = id->name; chip->indio_dev->dev.parent = &client->dev; chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->driver_module = THIS_MODULE; chip->indio_dev->modes = INDIO_DIRECT_MODE; err = iio_device_register(chip->indio_dev); if (err) { diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c index ded305321c0a..9cffa2ecb0ee 100644 --- a/drivers/staging/iio/light/tsl2563.c +++ b/drivers/staging/iio/light/tsl2563.c @@ -688,6 +688,21 @@ error_ret: /*--------------------------------------------------------------*/ static struct i2c_driver tsl2563_i2c_driver; +static const struct iio_info tsl2563_info_no_irq = { + .driver_module = THIS_MODULE, +}; + +static const struct iio_info tsl2563_info = { + .driver_module = THIS_MODULE, + .num_interrupt_lines = 1, + .read_raw = &tsl2563_read_raw, + .write_raw = &tsl2563_write_raw, + .read_event_value = &tsl2563_read_thresh, + .write_event_value = &tsl2563_write_thresh, + .read_event_config = &tsl2563_read_interrupt_config, + .write_event_config = &tsl2563_write_interrupt_config, +}; + static int __devinit tsl2563_probe(struct i2c_client *client, const struct i2c_device_id *device_id) { @@ -736,17 +751,12 @@ static int __devinit tsl2563_probe(struct i2c_client *client, indio_dev->name = client->name; indio_dev->channels = tsl2563_channels; indio_dev->num_channels = ARRAY_SIZE(tsl2563_channels); - indio_dev->read_raw = &tsl2563_read_raw; - indio_dev->write_raw = &tsl2563_write_raw; - indio_dev->read_event_value = &tsl2563_read_thresh; - indio_dev->write_event_value = &tsl2563_write_thresh; - indio_dev->read_event_config = &tsl2563_read_interrupt_config; - indio_dev->write_event_config = &tsl2563_write_interrupt_config; indio_dev->dev.parent = &client->dev; - indio_dev->driver_module = THIS_MODULE; indio_dev->modes = INDIO_DIRECT_MODE; if (client->irq) - indio_dev->num_interrupt_lines = 1; + indio_dev->info = &tsl2563_info; + else + indio_dev->info = &tsl2563_info_no_irq; ret = iio_device_register(indio_dev); if (ret) goto fail1; diff --git a/drivers/staging/iio/light/tsl2583.c b/drivers/staging/iio/light/tsl2583.c index b87ccd5a2f50..5694610da1ca 100644 --- a/drivers/staging/iio/light/tsl2583.c +++ b/drivers/staging/iio/light/tsl2583.c @@ -786,6 +786,11 @@ static int taos_tsl258x_device(unsigned char *bufp) return ((bufp[TSL258X_CHIPID] & 0xf0) == 0x90); } +static const struct iio_info tsl2583_info = { + .attrs = &tsl2583_attribute_group, + .driver_module = THIS_MODULE, +}; + /* * Client probe function - When a valid device is found, the driver's device * data structure is updated, and initialization completes successfully. @@ -854,10 +859,9 @@ static int __devinit taos_probe(struct i2c_client *clientp, goto fail1; } - chip->iio_dev->attrs = &tsl2583_attribute_group; + chip->iio_dev->info = &tsl2583_info; chip->iio_dev->dev.parent = &clientp->dev; chip->iio_dev->dev_data = (void *)(chip); - chip->iio_dev->driver_module = THIS_MODULE; chip->iio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(chip->iio_dev); if (ret) { diff --git a/drivers/staging/iio/magnetometer/ak8975.c b/drivers/staging/iio/magnetometer/ak8975.c index 2226b88882d8..700f96c70273 100644 --- a/drivers/staging/iio/magnetometer/ak8975.c +++ b/drivers/staging/iio/magnetometer/ak8975.c @@ -474,6 +474,11 @@ static struct attribute_group ak8975_attr_group = { .attrs = ak8975_attr, }; +static const struct iio_info ak8975_info = { + .attrs = &ak8975_attr_group, + .driver_module = THIS_MODULE, +}; + static int ak8975_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -533,9 +538,8 @@ static int ak8975_probe(struct i2c_client *client, } data->indio_dev->dev.parent = &client->dev; - data->indio_dev->attrs = &ak8975_attr_group; + data->indio_dev->info = &ak8975_info; data->indio_dev->dev_data = (void *)(data); - data->indio_dev->driver_module = THIS_MODULE; data->indio_dev->modes = INDIO_DIRECT_MODE; err = iio_device_register(data->indio_dev); diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index d0676e99f157..dd9a3bb6aa01 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c @@ -529,6 +529,11 @@ static void hmc5843_init_client(struct i2c_client *client) pr_info("HMC5843 initialized\n"); } +static const struct iio_info hmc5843_info = { + .attrs = &hmc5843_group, + .driver_module = THIS_MODULE, +}; + static int hmc5843_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -557,10 +562,9 @@ static int hmc5843_probe(struct i2c_client *client, err = -ENOMEM; goto exit_free1; } - data->indio_dev->attrs = &hmc5843_group; + data->indio_dev->info = &hmc5843_info; data->indio_dev->dev.parent = &client->dev; data->indio_dev->dev_data = (void *)(data); - data->indio_dev->driver_module = THIS_MODULE; data->indio_dev->modes = INDIO_DIRECT_MODE; err = iio_device_register(data->indio_dev); if (err) diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c index 8b6bf508e41b..6c9c23fc4aed 100644 --- a/drivers/staging/iio/meter/ade7753.c +++ b/drivers/staging/iio/meter/ade7753.c @@ -504,6 +504,11 @@ static const struct attribute_group ade7753_attribute_group = { .attrs = ade7753_attributes, }; +static const struct iio_info ade7753_info = { + .attrs = &ade7753_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ade7753_probe(struct spi_device *spi) { int ret, regdone = 0; @@ -537,9 +542,8 @@ static int __devinit ade7753_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &ade7753_attribute_group; + st->indio_dev->info = &ade7753_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/meter/ade7754.c b/drivers/staging/iio/meter/ade7754.c index 4179325c8d78..378f2c87086f 100644 --- a/drivers/staging/iio/meter/ade7754.c +++ b/drivers/staging/iio/meter/ade7754.c @@ -527,7 +527,10 @@ static const struct attribute_group ade7754_attribute_group = { .attrs = ade7754_attributes, }; - +static const struct iio_info ade7754_info = { + .attrs = &ade7754_attribute_group, + .driver_module = THIS_MODULE, +}; static int __devinit ade7754_probe(struct spi_device *spi) { @@ -562,9 +565,8 @@ static int __devinit ade7754_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->attrs = &ade7754_attribute_group; + st->indio_dev->info = &ade7754_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c index d9dfd8321222..299b95434e20 100644 --- a/drivers/staging/iio/meter/ade7758_core.c +++ b/drivers/staging/iio/meter/ade7758_core.c @@ -725,6 +725,11 @@ static struct iio_chan_spec ade7758_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(15), }; +static const struct iio_info ade7758_info = { + .attrs = &ade7758_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ade7758_probe(struct spi_device *spi) { int i, ret, regdone = 0; @@ -757,8 +762,7 @@ static int __devinit ade7758_probe(struct spi_device *spi) indio_dev->name = spi->dev.driver->name; indio_dev->dev.parent = &spi->dev; - indio_dev->attrs = &ade7758_attribute_group; - indio_dev->driver_module = THIS_MODULE; + indio_dev->info = &ade7758_info; indio_dev->modes = INDIO_DIRECT_MODE; for (i = 0; i < AD7758_NUM_WAVESRC; i++) diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c index 86fe0ae22df0..730f6d9074a6 100644 --- a/drivers/staging/iio/meter/ade7759.c +++ b/drivers/staging/iio/meter/ade7759.c @@ -450,6 +450,11 @@ static const struct attribute_group ade7759_attribute_group = { .attrs = ade7759_attributes, }; +static const struct iio_info ade7759_info = { + .attrs = &ade7759_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ade7759_probe(struct spi_device *spi) { int ret; @@ -483,11 +488,9 @@ static int __devinit ade7759_probe(struct spi_device *spi) st->indio_dev->name = spi->dev.driver->name; st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->num_interrupt_lines = 1; - st->indio_dev->attrs = &ade7759_attribute_group; + st->indio_dev->info = &ade7759_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/meter/ade7854.c b/drivers/staging/iio/meter/ade7854.c index d3f1df71c7f7..44cd3ec546ae 100644 --- a/drivers/staging/iio/meter/ade7854.c +++ b/drivers/staging/iio/meter/ade7854.c @@ -551,6 +551,11 @@ static const struct attribute_group ade7854_attribute_group = { .attrs = ade7854_attributes, }; +static const struct iio_info ade7854_info = { + .attrs = &ade7854_attribute_group, + .driver_module = THIS_MODULE, +}; + int ade7854_probe(struct ade7854_state *st, struct device *dev) { int ret; @@ -575,9 +580,8 @@ int ade7854_probe(struct ade7854_state *st, struct device *dev) } st->indio_dev->dev.parent = dev; - st->indio_dev->attrs = &ade7854_attribute_group; + st->indio_dev->info = &ade7854_info; st->indio_dev->dev_data = (void *)(st); - st->indio_dev->driver_module = THIS_MODULE; st->indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->indio_dev); diff --git a/drivers/staging/iio/resolver/ad2s120x.c b/drivers/staging/iio/resolver/ad2s120x.c index e0237ff81054..f83e1422fd29 100644 --- a/drivers/staging/iio/resolver/ad2s120x.c +++ b/drivers/staging/iio/resolver/ad2s120x.c @@ -209,10 +209,14 @@ static struct attribute *ad2s120x_attributes[] = { }; static const struct attribute_group ad2s120x_attribute_group = { - .name = DRV_NAME, .attrs = ad2s120x_attributes, }; +static const struct iio_info ad2s120x_info = { + .attrs = &ad2s120x_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad2s120x_probe(struct spi_device *spi) { struct ad2s120x_state *st; @@ -246,12 +250,9 @@ static int __devinit ad2s120x_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad2s120x_attribute_group; + st->idev->info = &ad2s120x_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c index dc7cae80cf3a..09f4fcfda73a 100644 --- a/drivers/staging/iio/resolver/ad2s1210.c +++ b/drivers/staging/iio/resolver/ad2s1210.c @@ -755,6 +755,11 @@ error_ret: return ret; } +static const struct iio_info ad2s1210_info = { + .attrs = &ad2s1210_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad2s1210_probe(struct spi_device *spi) { struct ad2s1210_state *st; @@ -806,12 +811,9 @@ static int __devinit ad2s1210_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad2s1210_attribute_group; + st->idev->info = &ad2s1210_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); diff --git a/drivers/staging/iio/resolver/ad2s90.c b/drivers/staging/iio/resolver/ad2s90.c index e300adeefa8b..9b72a952f2bc 100644 --- a/drivers/staging/iio/resolver/ad2s90.c +++ b/drivers/staging/iio/resolver/ad2s90.c @@ -75,6 +75,11 @@ static const struct attribute_group ad2s90_attribute_group = { .attrs = ad2s90_attributes, }; +static const struct iio_info ad2s90_info = { + .attrs = &ad2s90_attribute_group, + .driver_module = THIS_MODULE, +}; + static int __devinit ad2s90_probe(struct spi_device *spi) { struct ad2s90_state *st; @@ -96,12 +101,9 @@ static int __devinit ad2s90_probe(struct spi_device *spi) goto error_free_st; } st->idev->dev.parent = &spi->dev; - st->idev->num_interrupt_lines = 0; - st->idev->event_attrs = NULL; - st->idev->attrs = &ad2s90_attribute_group; + st->idev->info = &ad2s90_info; st->idev->dev_data = (void *)(st); - st->idev->driver_module = THIS_MODULE; st->idev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); |