diff options
Diffstat (limited to 'drivers/staging/iio')
108 files changed, 3978 insertions, 3154 deletions
diff --git a/drivers/staging/iio/Documentation/sysfs-bus-iio-light b/drivers/staging/iio/Documentation/sysfs-bus-iio-light index 21d277405816..edbf470e4e30 100644 --- a/drivers/staging/iio/Documentation/sysfs-bus-iio-light +++ b/drivers/staging/iio/Documentation/sysfs-bus-iio-light @@ -75,3 +75,11 @@ KernelVersion: 2.6.37 Contact: linux-iio@vger.kernel.org Description: This property gets/sets the sensors ADC analog integration time. + +What: /sys/bus/iio/devices/device[n]/illuminance0_calibscale +KernelVersion: 2.6.37 +Contact: linux-iio@vger.kernel.org +Description: + Hardware or software applied calibration scale factor assumed + to account for attenuation due to industrial design (glass + filters or aperture holes). diff --git a/drivers/staging/iio/accel/adis16201.h b/drivers/staging/iio/accel/adis16201.h index 4cc1a5bfab40..dac5540b5a8e 100644 --- a/drivers/staging/iio/accel/adis16201.h +++ b/drivers/staging/iio/accel/adis16201.h @@ -64,19 +64,17 @@ /** * struct adis16201_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16201_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + u8 tx[14] ____cacheline_aligned; + u8 rx[14]; }; int adis16201_set_irq(struct iio_dev *indio_dev, bool enable); diff --git a/drivers/staging/iio/accel/adis16201_core.c b/drivers/staging/iio/accel/adis16201_core.c index e4c49f00d132..2fd01aecdf96 100644 --- a/drivers/staging/iio/accel/adis16201_core.c +++ b/drivers/staging/iio/accel/adis16201_core.c @@ -24,8 +24,6 @@ #include "adis16201.h" -#define DRIVER_NAME "adis16201" - enum adis16201_chan { in_supply, temp, @@ -42,13 +40,12 @@ enum adis16201_chan { * @reg_address: the address of the register to be written * @val: the value to write **/ -static int adis16201_spi_write_reg_8(struct device *dev, +static int adis16201_spi_write_reg_8(struct iio_dev *indio_dev, u8 reg_address, u8 val) { int ret; - struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16201_state *st = iio_dev_get_devdata(indio_dev); + struct adis16201_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16201_WRITE_REG(reg_address); @@ -73,7 +70,7 @@ static int adis16201_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16201_state *st = iio_dev_get_devdata(indio_dev); + struct adis16201_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -114,7 +111,7 @@ static int adis16201_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16201_state *st = iio_dev_get_devdata(indio_dev); + struct adis16201_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -151,14 +148,16 @@ error_ret: return ret; } -static int adis16201_reset(struct device *dev) +static int adis16201_reset(struct iio_dev *indio_dev) { int ret; - ret = adis16201_spi_write_reg_8(dev, + struct adis16201_state *st = iio_priv(indio_dev); + + ret = adis16201_spi_write_reg_8(indio_dev, ADIS16201_GLOB_CMD, ADIS16201_GLOB_CMD_SW_RESET); if (ret) - dev_err(dev, "problem resetting device"); + dev_err(&st->us->dev, "problem resetting device"); return ret; } @@ -167,15 +166,15 @@ static ssize_t adis16201_write_reset(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { + int ret; + bool res; + if (len < 1) return -EINVAL; - switch (buf[0]) { - case '1': - case 'y': - case 'Y': - return adis16201_reset(dev); - } - return -EINVAL; + ret = strtobool(buf, &res); + if (ret || !res) + return ret; + return adis16201_reset(dev_get_drvdata(dev)); } int adis16201_set_irq(struct iio_dev *indio_dev, bool enable) @@ -245,41 +244,38 @@ err_ret: return ret; } -static int adis16201_initial_setup(struct adis16201_state *st) +static int adis16201_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct device *dev = &indio_dev->dev; /* Disable IRQ */ - ret = adis16201_set_irq(st->indio_dev, false); + ret = adis16201_set_irq(indio_dev, false); if (ret) { dev_err(dev, "disable irq failed"); goto err_ret; } /* Do self test */ - ret = adis16201_self_test(st->indio_dev); + ret = adis16201_self_test(indio_dev); if (ret) { dev_err(dev, "self test failure"); goto err_ret; } /* Read status register to check the result */ - ret = adis16201_check_status(st->indio_dev); + ret = adis16201_check_status(indio_dev); if (ret) { - adis16201_reset(dev); + adis16201_reset(indio_dev); dev_err(dev, "device not playing ball -> reset"); msleep(ADIS16201_STARTUP_DELAY); - ret = adis16201_check_status(st->indio_dev); + ret = adis16201_check_status(indio_dev); if (ret) { dev_err(dev, "giving up"); goto err_ret; } } - printk(KERN_INFO DRIVER_NAME ": at CS%d (irq %d)\n", - st->us->chip_select, st->us->irq); - err_ret: return ret; } @@ -309,13 +305,17 @@ static int adis16201_read_raw(struct iio_dev *indio_dev, mutex_lock(&indio_dev->mlock); addr = adis16201_addresses[chan->address][0]; ret = adis16201_spi_read_reg_16(indio_dev, addr, &val16); - if (ret) + if (ret) { + mutex_unlock(&indio_dev->mlock); return ret; + } if (val16 & ADIS16201_ERROR_ACTIVE) { ret = adis16201_check_status(indio_dev); - if (ret) + if (ret) { + mutex_unlock(&indio_dev->mlock); return ret; + } } val16 = val16 & ((1 << chan->scan_type.realbits) - 1); if (chan->scan_type.sign == 's') @@ -467,53 +467,40 @@ static const struct iio_info adis16201_info = { static int __devinit adis16201_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16201_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16201_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + st = iio_priv(indio_dev); /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16201_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16201_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16201_info; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16201_info; - st->indio_dev->channels = adis16201_channels; - st->indio_dev->num_channels = ARRAY_SIZE(adis16201_channels); - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = adis16201_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16201_channels); + indio_dev->modes = INDIO_DIRECT_MODE; - ret = adis16201_configure_ring(st->indio_dev); + ret = adis16201_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, adis16201_channels, ARRAY_SIZE(adis16201_channels)); if (ret) { @@ -522,50 +509,40 @@ static int __devinit adis16201_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16201_probe_trigger(st->indio_dev); + ret = adis16201_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16201_initial_setup(st); + ret = adis16201_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16201_remove_trigger(st->indio_dev); + adis16201_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16201_unconfigure_ring(st->indio_dev); + adis16201_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16201_remove(struct spi_device *spi) { - struct adis16201_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); adis16201_remove_trigger(indio_dev); iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16201_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c index c61f981255ca..66e708ddf8b2 100644 --- a/drivers/staging/iio/accel/adis16201_ring.c +++ b/drivers/staging/iio/accel/adis16201_ring.c @@ -23,7 +23,7 @@ static int adis16201_read_ring_data(struct iio_dev *indio_dev, u8 *rx) { struct spi_message msg; - struct adis16201_state *st = iio_dev_get_devdata(indio_dev); + struct adis16201_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16201_OUTPUTS + 1]; int ret; int i; @@ -63,7 +63,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16201_state *st = iio_dev_get_devdata(indio_dev); + struct adis16201_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; @@ -77,7 +77,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p) } if (ring->scan_count) - if (adis16201_read_ring_data(st->indio_dev, st->rx) >= 0) + if (adis16201_read_ring_data(indio_dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup( (__be16 *)&(st->rx[i*2])); @@ -88,7 +88,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p) ring->access->store_to(ring, (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/accel/adis16201_trigger.c b/drivers/staging/iio/accel/adis16201_trigger.c index bea917e03b42..3a95c083b452 100644 --- a/drivers/staging/iio/accel/adis16201_trigger.c +++ b/drivers/staging/iio/accel/adis16201_trigger.c @@ -17,17 +17,16 @@ static int adis16201_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16201_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); - return adis16201_set_irq(st->indio_dev, state); + return adis16201_set_irq(indio_dev, state); } int adis16201_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16201_state *st = indio_dev->dev_data; + struct adis16201_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("adis16201-dev%d", indio_dev->id); if (st->trig == NULL) { @@ -43,7 +42,7 @@ int adis16201_probe_trigger(struct iio_dev *indio_dev) goto error_free_trig; st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16201_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -64,7 +63,7 @@ error_ret: void adis16201_remove_trigger(struct iio_dev *indio_dev) { - struct adis16201_state *state = indio_dev->dev_data; + struct adis16201_state *state = iio_priv(indio_dev); iio_trigger_unregister(state->trig); free_irq(state->us->irq, state->trig); diff --git a/drivers/staging/iio/accel/adis16203.h b/drivers/staging/iio/accel/adis16203.h index 175e21bb9b40..4071bc0d69ab 100644 --- a/drivers/staging/iio/accel/adis16203.h +++ b/drivers/staging/iio/accel/adis16203.h @@ -59,19 +59,17 @@ /** * struct adis16203_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16203_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + u8 tx[ADIS16203_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16203_MAX_RX]; }; int adis16203_set_irq(struct iio_dev *indio_dev, bool enable); diff --git a/drivers/staging/iio/accel/adis16203_core.c b/drivers/staging/iio/accel/adis16203_core.c index 36be4d5dc614..bf1988884e93 100644 --- a/drivers/staging/iio/accel/adis16203_core.c +++ b/drivers/staging/iio/accel/adis16203_core.c @@ -36,7 +36,7 @@ static int adis16203_spi_write_reg_8(struct iio_dev *indio_dev, u8 val) { int ret; - struct adis16203_state *st = iio_dev_get_devdata(indio_dev); + struct adis16203_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16203_WRITE_REG(reg_address); @@ -61,7 +61,7 @@ static int adis16203_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16203_state *st = iio_dev_get_devdata(indio_dev); + struct adis16203_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -102,7 +102,7 @@ static int adis16203_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16203_state *st = iio_dev_get_devdata(indio_dev); + struct adis16203_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -418,51 +418,38 @@ static const struct iio_info adis16203_info = { static int __devinit adis16203_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16203_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - goto error_ret; - } - /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + struct iio_dev *indio_dev; + struct adis16203_state *st; - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16203_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16203_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; - goto error_free_rx; + goto error_ret; } + st = iio_priv(indio_dev); + /* this is only used for removal purposes */ + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->channels = adis16203_channels; - st->indio_dev->num_channels = ARRAY_SIZE(adis16203_channels); - st->indio_dev->info = &adis16203_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; - - ret = adis16203_configure_ring(st->indio_dev); + + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->channels = adis16203_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16203_channels); + indio_dev->info = &adis16203_info; + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = adis16203_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, adis16203_channels, ARRAY_SIZE(adis16203_channels)); if (ret) { @@ -471,50 +458,40 @@ static int __devinit adis16203_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16203_probe_trigger(st->indio_dev); + ret = adis16203_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16203_initial_setup(st->indio_dev); + ret = adis16203_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16203_remove_trigger(st->indio_dev); + adis16203_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16203_unconfigure_ring(st->indio_dev); + adis16203_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16203_remove(struct spi_device *spi) { - struct adis16203_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); adis16203_remove_trigger(indio_dev); iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16203_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c index a9a789d79c09..d2c07c527467 100644 --- a/drivers/staging/iio/accel/adis16203_ring.c +++ b/drivers/staging/iio/accel/adis16203_ring.c @@ -26,7 +26,7 @@ static int adis16203_read_ring_data(struct device *dev, u8 *rx) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16203_state *st = iio_dev_get_devdata(indio_dev); + struct adis16203_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16203_OUTPUTS + 1]; int ret; int i; @@ -68,7 +68,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16203_state *st = iio_dev_get_devdata(indio_dev); + struct adis16203_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; @@ -82,7 +82,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p) } if (ring->scan_count) - if (adis16203_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) + if (adis16203_read_ring_data(&indio_dev->dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup( (__be16 *)&(st->rx[i*2])); @@ -95,7 +95,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p) (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/accel/adis16203_trigger.c b/drivers/staging/iio/accel/adis16203_trigger.c index ca5db1731988..3caf3e8bc9d9 100644 --- a/drivers/staging/iio/accel/adis16203_trigger.c +++ b/drivers/staging/iio/accel/adis16203_trigger.c @@ -18,17 +18,16 @@ static int adis16203_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16203_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); - return adis16203_set_irq(st->indio_dev, state); + return adis16203_set_irq(indio_dev, state); } int adis16203_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16203_state *st = indio_dev->dev_data; + struct adis16203_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("adis16203-dev%d", indio_dev->id); if (st->trig == NULL) { @@ -46,7 +45,7 @@ int adis16203_probe_trigger(struct iio_dev *indio_dev) st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16203_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -67,9 +66,9 @@ error_ret: void adis16203_remove_trigger(struct iio_dev *indio_dev) { - struct adis16203_state *state = indio_dev->dev_data; + struct adis16203_state *st = iio_priv(indio_dev); - iio_trigger_unregister(state->trig); - free_irq(state->us->irq, state->trig); - iio_free_trigger(state->trig); + iio_trigger_unregister(st->trig); + free_irq(st->us->irq, st->trig); + iio_free_trigger(st->trig); } diff --git a/drivers/staging/iio/accel/adis16204.h b/drivers/staging/iio/accel/adis16204.h index 1690c0d15690..3bb0490465f4 100644 --- a/drivers/staging/iio/accel/adis16204.h +++ b/drivers/staging/iio/accel/adis16204.h @@ -67,19 +67,17 @@ /** * struct adis16204_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16204_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + u8 tx[ADIS16204_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16204_MAX_RX]; }; int adis16204_set_irq(struct iio_dev *indio_dev, bool enable); diff --git a/drivers/staging/iio/accel/adis16204_core.c b/drivers/staging/iio/accel/adis16204_core.c index 16806704bf48..cfd09b3b9937 100644 --- a/drivers/staging/iio/accel/adis16204_core.c +++ b/drivers/staging/iio/accel/adis16204_core.c @@ -39,7 +39,7 @@ static int adis16204_spi_write_reg_8(struct iio_dev *indio_dev, u8 val) { int ret; - struct adis16204_state *st = iio_dev_get_devdata(indio_dev); + struct adis16204_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16204_WRITE_REG(reg_address); @@ -64,7 +64,7 @@ static int adis16204_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16204_state *st = iio_dev_get_devdata(indio_dev); + struct adis16204_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -106,7 +106,7 @@ static int adis16204_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16204_state *st = iio_dev_get_devdata(indio_dev); + struct adis16204_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -483,52 +483,38 @@ static const struct iio_info adis16204_info = { static int __devinit adis16204_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16204_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - goto error_ret; - } - /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + struct adis16204_state *st; + struct iio_dev *indio_dev; - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16204_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16204_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; - goto error_free_rx; + goto error_ret; } + st = iio_priv(indio_dev); + /* this is only used for removal purposes */ + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16204_info; - st->indio_dev->channels = adis16204_channels; - st->indio_dev->num_channels = ARRAY_SIZE(adis16204_channels); - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16204_info; + indio_dev->channels = adis16204_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16204_channels); + indio_dev->modes = INDIO_DIRECT_MODE; - ret = adis16204_configure_ring(st->indio_dev); + ret = adis16204_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, adis16204_channels, ARRAY_SIZE(adis16204_channels)); if (ret) { @@ -537,50 +523,40 @@ static int __devinit adis16204_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16204_probe_trigger(st->indio_dev); + ret = adis16204_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16204_initial_setup(st->indio_dev); + ret = adis16204_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16204_remove_trigger(st->indio_dev); + adis16204_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16204_unconfigure_ring(st->indio_dev); + adis16204_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16204_remove(struct spi_device *spi) { - struct adis16204_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); adis16204_remove_trigger(indio_dev); - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16204_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c index a2d36fb822e5..852df06684d8 100644 --- a/drivers/staging/iio/accel/adis16204_ring.c +++ b/drivers/staging/iio/accel/adis16204_ring.c @@ -26,7 +26,7 @@ static int adis16204_read_ring_data(struct device *dev, u8 *rx) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16204_state *st = iio_dev_get_devdata(indio_dev); + struct adis16204_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16204_OUTPUTS + 1]; int ret; int i; @@ -66,7 +66,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16204_state *st = iio_dev_get_devdata(indio_dev); + struct adis16204_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; s16 *data; @@ -79,7 +79,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p) } if (ring->scan_count) - if (adis16204_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) + if (adis16204_read_ring_data(&indio_dev->dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup( (__be16 *)&(st->rx[i*2])); @@ -90,7 +90,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p) ring->access->store_to(ring, (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/accel/adis16204_trigger.c b/drivers/staging/iio/accel/adis16204_trigger.c index 5e1f9ae9d5c1..01f73b9b8886 100644 --- a/drivers/staging/iio/accel/adis16204_trigger.c +++ b/drivers/staging/iio/accel/adis16204_trigger.c @@ -18,17 +18,16 @@ static int adis16204_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16204_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); - return adis16204_set_irq(st->indio_dev, state); + return adis16204_set_irq(indio_dev, state); } int adis16204_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16204_state *st = indio_dev->dev_data; + struct adis16204_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("adis16204-dev%d", indio_dev->id); if (st->trig == NULL) { @@ -46,7 +45,7 @@ int adis16204_probe_trigger(struct iio_dev *indio_dev) st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16204_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -67,7 +66,7 @@ error_ret: void adis16204_remove_trigger(struct iio_dev *indio_dev) { - struct adis16204_state *state = indio_dev->dev_data; + struct adis16204_state *state = iio_priv(indio_dev); iio_trigger_unregister(state->trig); free_irq(state->us->irq, state->trig); diff --git a/drivers/staging/iio/accel/adis16209.h b/drivers/staging/iio/accel/adis16209.h index 3153cbee0957..c8b7b00d417a 100644 --- a/drivers/staging/iio/accel/adis16209.h +++ b/drivers/staging/iio/accel/adis16209.h @@ -104,19 +104,17 @@ /** * struct adis16209_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16209_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + u8 tx[ADIS16209_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16209_MAX_RX]; }; int adis16209_set_irq(struct iio_dev *indio_dev, bool enable); diff --git a/drivers/staging/iio/accel/adis16209_core.c b/drivers/staging/iio/accel/adis16209_core.c index c423cc960254..55f3a7bcaf0a 100644 --- a/drivers/staging/iio/accel/adis16209_core.c +++ b/drivers/staging/iio/accel/adis16209_core.c @@ -37,7 +37,7 @@ static int adis16209_spi_write_reg_8(struct iio_dev *indio_dev, u8 val) { int ret; - struct adis16209_state *st = iio_dev_get_devdata(indio_dev); + struct adis16209_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16209_WRITE_REG(reg_address); @@ -62,7 +62,7 @@ static int adis16209_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16209_state *st = iio_dev_get_devdata(indio_dev); + struct adis16209_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -105,7 +105,7 @@ static int adis16209_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16209_state *st = iio_dev_get_devdata(indio_dev); + struct adis16209_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -466,52 +466,38 @@ static const struct iio_info adis16209_info = { static int __devinit adis16209_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16209_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - goto error_ret; - } - /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + struct adis16209_state *st; + struct iio_dev *indio_dev; - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16209_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16209_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; - goto error_free_rx; + goto error_ret; } + st = iio_priv(indio_dev); + /* this is only used for removal purposes */ + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16209_info; - st->indio_dev->channels = adis16209_channels; - st->indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16209_info; + indio_dev->channels = adis16209_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); + indio_dev->modes = INDIO_DIRECT_MODE; - ret = adis16209_configure_ring(st->indio_dev); + ret = adis16209_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, adis16209_channels, ARRAY_SIZE(adis16209_channels)); if (ret) { @@ -520,42 +506,35 @@ static int __devinit adis16209_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16209_probe_trigger(st->indio_dev); + ret = adis16209_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16209_initial_setup(st->indio_dev); + ret = adis16209_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16209_remove_trigger(st->indio_dev); + adis16209_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16209_unconfigure_ring(st->indio_dev); + adis16209_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16209_remove(struct spi_device *spi) { - struct adis16209_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); flush_scheduled_work(); @@ -563,9 +542,6 @@ static int adis16209_remove(struct spi_device *spi) iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16209_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c index 390908b3f02f..45017d3f02f5 100644 --- a/drivers/staging/iio/accel/adis16209_ring.c +++ b/drivers/staging/iio/accel/adis16209_ring.c @@ -26,7 +26,7 @@ static int adis16209_read_ring_data(struct device *dev, u8 *rx) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16209_state *st = iio_dev_get_devdata(indio_dev); + struct adis16209_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16209_OUTPUTS + 1]; int ret; int i; @@ -66,7 +66,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16209_state *st = iio_dev_get_devdata(indio_dev); + struct adis16209_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; @@ -80,7 +80,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p) } if (ring->scan_count && - adis16209_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) + adis16209_read_ring_data(&indio_dev->dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); @@ -90,7 +90,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p) ring->access->store_to(ring, (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/accel/adis16209_trigger.c b/drivers/staging/iio/accel/adis16209_trigger.c index 211ee7045697..6df7b47ec7b4 100644 --- a/drivers/staging/iio/accel/adis16209_trigger.c +++ b/drivers/staging/iio/accel/adis16209_trigger.c @@ -27,17 +27,16 @@ static irqreturn_t adis16209_data_rdy_trig_poll(int irq, void *trig) static int adis16209_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16209_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); - return adis16209_set_irq(st->indio_dev, state); + return adis16209_set_irq(indio_dev, state); } int adis16209_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16209_state *st = indio_dev->dev_data; + struct adis16209_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("adis16209-dev%d", indio_dev->id); if (st->trig == NULL) { @@ -54,7 +53,7 @@ int adis16209_probe_trigger(struct iio_dev *indio_dev) goto error_free_trig; st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16209_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -75,9 +74,9 @@ error_ret: void adis16209_remove_trigger(struct iio_dev *indio_dev) { - struct adis16209_state *state = indio_dev->dev_data; + struct adis16209_state *st = iio_priv(indio_dev); - iio_trigger_unregister(state->trig); - free_irq(state->us->irq, state->trig); - iio_free_trigger(state->trig); + iio_trigger_unregister(st->trig); + free_irq(st->us->irq, st->trig); + iio_free_trigger(st->trig); } diff --git a/drivers/staging/iio/accel/adis16220.h b/drivers/staging/iio/accel/adis16220.h index 4d5758c2c047..024313cf5cf0 100644 --- a/drivers/staging/iio/accel/adis16220.h +++ b/drivers/staging/iio/accel/adis16220.h @@ -126,21 +126,15 @@ /** * struct adis16220_state - device instance specific data * @us: actual spi_device - * @work_trigger_to_ring: bh for triggered event handling - * @inter: used to check if new interrupt has been triggered - * @last_timestamp: passing timestamp from th to bh of interrupt handler - * @indio_dev: industrial I/O device structure - * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16220_state { - struct spi_device *us; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct mutex buf_lock; + u8 tx[ADIS16220_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16220_MAX_RX]; }; #endif /* SPI_ADIS16220_H_ */ diff --git a/drivers/staging/iio/accel/adis16220_core.c b/drivers/staging/iio/accel/adis16220_core.c index 605a75ea3996..bf9ba07c0383 100644 --- a/drivers/staging/iio/accel/adis16220_core.c +++ b/drivers/staging/iio/accel/adis16220_core.c @@ -39,7 +39,7 @@ static int adis16220_spi_write_reg_8(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); + struct adis16220_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16220_WRITE_REG(reg_address); @@ -65,7 +65,7 @@ static int adis16220_spi_write_reg_16(struct device *dev, int ret; struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); + struct adis16220_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -110,7 +110,7 @@ static int adis16220_spi_read_reg_16(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); + struct adis16220_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -316,10 +316,10 @@ err_ret: return ret; } -static int adis16220_initial_setup(struct adis16220_state *st) +static int adis16220_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct device *dev = &indio_dev->dev; /* Do self test */ ret = adis16220_self_test(dev); @@ -341,19 +341,17 @@ static int adis16220_initial_setup(struct adis16220_state *st) } } - printk(KERN_INFO DRIVER_NAME ": at CS%d (irq %d)\n", - st->us->chip_select, st->us->irq); - err_ret: return ret; } -static ssize_t adis16220_capture_buffer_read(struct adis16220_state *st, +static ssize_t adis16220_capture_buffer_read(struct iio_dev *indio_dev, char *buf, loff_t off, size_t count, int addr) { + struct adis16220_state *st = iio_priv(indio_dev); struct spi_message msg; struct spi_transfer xfers[] = { { @@ -383,7 +381,7 @@ static ssize_t adis16220_capture_buffer_read(struct adis16220_state *st, count = ADIS16220_CAPTURE_SIZE - off; /* write the begin position of capture buffer */ - ret = adis16220_spi_write_reg_16(&st->indio_dev->dev, + ret = adis16220_spi_write_reg_16(&indio_dev->dev, ADIS16220_CAPT_PNTR, off > 1); if (ret) @@ -422,9 +420,8 @@ static ssize_t adis16220_accel_bin_read(struct file *filp, struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); - return adis16220_capture_buffer_read(st, buf, + return adis16220_capture_buffer_read(indio_dev, buf, off, count, ADIS16220_CAPT_BUFA); } @@ -445,9 +442,8 @@ static ssize_t adis16220_adc1_bin_read(struct file *filp, struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); - return adis16220_capture_buffer_read(st, buf, + return adis16220_capture_buffer_read(indio_dev, buf, off, count, ADIS16220_CAPT_BUF1); } @@ -468,9 +464,8 @@ static ssize_t adis16220_adc2_bin_read(struct file *filp, struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16220_state *st = iio_dev_get_devdata(indio_dev); - return adis16220_capture_buffer_read(st, buf, + return adis16220_capture_buffer_read(indio_dev, buf, off, count, ADIS16220_CAPT_BUF2); } @@ -551,98 +546,76 @@ static const struct iio_info adis16220_info = { static int __devinit adis16220_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16220_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16220_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + + st = iio_priv(indio_dev); /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16220_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16220_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16220_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16220_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; - ret = sysfs_create_bin_file(&st->indio_dev->dev.kobj, &accel_bin); + ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &accel_bin); if (ret) goto error_free_dev; - ret = sysfs_create_bin_file(&st->indio_dev->dev.kobj, &adc1_bin); + ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &adc1_bin); if (ret) goto error_rm_accel_bin; - ret = sysfs_create_bin_file(&st->indio_dev->dev.kobj, &adc2_bin); + ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &adc2_bin); if (ret) goto error_rm_adc1_bin; /* Get the device into a sane initial state */ - ret = adis16220_initial_setup(st); + ret = adis16220_initial_setup(indio_dev); if (ret) goto error_rm_adc2_bin; return 0; error_rm_adc2_bin: - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &adc2_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc2_bin); error_rm_adc1_bin: - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &adc1_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin); error_rm_accel_bin: - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &accel_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16220_remove(struct spi_device *spi) { - struct adis16220_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); flush_scheduled_work(); - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &adc2_bin); - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &adc1_bin); - sysfs_remove_bin_file(&st->indio_dev->dev.kobj, &accel_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc2_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin); + sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin); iio_device_unregister(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16240.h b/drivers/staging/iio/accel/adis16240.h index 162b1f468a1a..f1dd047aa5e0 100644 --- a/drivers/staging/iio/accel/adis16240.h +++ b/drivers/staging/iio/accel/adis16240.h @@ -126,24 +126,21 @@ /** * struct adis16240_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16240_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + u8 tx[ADIS16240_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16240_MAX_RX]; }; int adis16240_set_irq(struct iio_dev *indio_dev, bool enable); -#ifdef CONFIG_IIO_RING_BUFFER /* At the moment triggers are only used for ring buffer * filling. This may change! */ @@ -155,6 +152,7 @@ int adis16240_set_irq(struct iio_dev *indio_dev, bool enable); #define ADIS16240_SCAN_AUX_ADC 4 #define ADIS16240_SCAN_TEMP 5 +#ifdef CONFIG_IIO_RING_BUFFER void adis16240_remove_trigger(struct iio_dev *indio_dev); int adis16240_probe_trigger(struct iio_dev *indio_dev); diff --git a/drivers/staging/iio/accel/adis16240_core.c b/drivers/staging/iio/accel/adis16240_core.c index ac6038557b0d..4a4eafc58630 100644 --- a/drivers/staging/iio/accel/adis16240_core.c +++ b/drivers/staging/iio/accel/adis16240_core.c @@ -41,7 +41,7 @@ static int adis16240_spi_write_reg_8(struct iio_dev *indio_dev, u8 val) { int ret; - struct adis16240_state *st = iio_dev_get_devdata(indio_dev); + struct adis16240_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16240_WRITE_REG(reg_address); @@ -66,7 +66,7 @@ static int adis16240_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16240_state *st = iio_dev_get_devdata(indio_dev); + struct adis16240_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -109,7 +109,7 @@ static int adis16240_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16240_state *st = iio_dev_get_devdata(indio_dev); + struct adis16240_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -517,52 +517,39 @@ static const struct iio_info adis16240_info = { static int __devinit adis16240_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16240_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16240_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + st = iio_priv(indio_dev); /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16240_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16240_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16240_info; - st->indio_dev->channels = adis16240_channels; - st->indio_dev->num_channels = ARRAY_SIZE(adis16240_channels); - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16240_info; + indio_dev->channels = adis16240_channels; + indio_dev->num_channels = ARRAY_SIZE(adis16240_channels); + indio_dev->modes = INDIO_DIRECT_MODE; - ret = adis16240_configure_ring(st->indio_dev); + ret = adis16240_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, adis16240_channels, ARRAY_SIZE(adis16240_channels)); if (ret) { @@ -571,42 +558,36 @@ static int __devinit adis16240_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16240_probe_trigger(st->indio_dev); + ret = adis16240_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16240_initial_setup(st->indio_dev); + ret = adis16240_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16240_remove_trigger(st->indio_dev); + adis16240_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16240_unconfigure_ring(st->indio_dev); + adis16240_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int adis16240_remove(struct spi_device *spi) { - struct adis16240_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + + struct iio_dev *indio_dev = spi_get_drvdata(spi); flush_scheduled_work(); @@ -614,9 +595,6 @@ static int adis16240_remove(struct spi_device *spi) iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16240_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c index 0c6d781d94c6..c812a34dacaf 100644 --- a/drivers/staging/iio/accel/adis16240_ring.c +++ b/drivers/staging/iio/accel/adis16240_ring.c @@ -26,7 +26,7 @@ static int adis16240_read_ring_data(struct device *dev, u8 *rx) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16240_state *st = iio_dev_get_devdata(indio_dev); + struct adis16240_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16240_OUTPUTS + 1]; int ret; int i; @@ -63,7 +63,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16240_state *st = iio_dev_get_devdata(indio_dev); + struct adis16240_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; @@ -77,7 +77,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p) } if (ring->scan_count && - adis16240_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) + adis16240_read_ring_data(&indio_dev->dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); @@ -87,7 +87,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p) ring->access->store_to(ring, (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/accel/adis16240_trigger.c b/drivers/staging/iio/accel/adis16240_trigger.c index ece3ca8fb7eb..17135fc33c99 100644 --- a/drivers/staging/iio/accel/adis16240_trigger.c +++ b/drivers/staging/iio/accel/adis16240_trigger.c @@ -27,17 +27,16 @@ static irqreturn_t adis16240_data_rdy_trig_poll(int irq, void *trig) static int adis16240_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16240_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); - return adis16240_set_irq(st->indio_dev, state); + return adis16240_set_irq(indio_dev, state); } int adis16240_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16240_state *st = indio_dev->dev_data; + struct adis16240_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("adis16240-dev%d", indio_dev->id); if (st->trig == NULL) { @@ -55,7 +54,7 @@ int adis16240_probe_trigger(struct iio_dev *indio_dev) st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16240_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -76,9 +75,9 @@ error_ret: void adis16240_remove_trigger(struct iio_dev *indio_dev) { - struct adis16240_state *state = indio_dev->dev_data; + struct adis16240_state *st = iio_priv(indio_dev); - iio_trigger_unregister(state->trig); - free_irq(state->us->irq, state->trig); - iio_free_trigger(state->trig); + iio_trigger_unregister(st->trig); + free_irq(st->us->irq, st->trig); + iio_free_trigger(st->trig); } diff --git a/drivers/staging/iio/accel/kxsd9.c b/drivers/staging/iio/accel/kxsd9.c index 973156e75773..c8a358a5df87 100644 --- a/drivers/staging/iio/accel/kxsd9.c +++ b/drivers/staging/iio/accel/kxsd9.c @@ -56,17 +56,15 @@ /** * struct kxsd9_state - device related storage * @buf_lock: protect the rx and tx buffers. - * @indio_dev: associated industrial IO device * @us: spi device * @rx: single rx buffer storage * @tx: single tx buffer storage **/ struct kxsd9_state { struct mutex buf_lock; - struct iio_dev *indio_dev; struct spi_device *us; - u8 *rx; - u8 *tx; + u8 rx[KXSD9_STATE_RX_SIZE] ____cacheline_aligned; + u8 tx[KXSD9_STATE_TX_SIZE]; }; /* This may want to move to mili g to allow for non integer ranges */ @@ -77,7 +75,7 @@ static ssize_t kxsd9_read_scale(struct device *dev, int ret; ssize_t len = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct kxsd9_state *st = indio_dev->dev_data; + struct kxsd9_state *st = iio_priv(indio_dev); struct spi_transfer xfer = { .bits_per_word = 8, .len = 2, @@ -125,7 +123,7 @@ static ssize_t kxsd9_write_scale(struct device *dev, struct spi_message msg; int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct kxsd9_state *st = indio_dev->dev_data; + struct kxsd9_state *st = iio_priv(indio_dev); u8 val; struct spi_transfer xfers[] = { { @@ -190,7 +188,7 @@ static ssize_t kxsd9_read_accel(struct device *dev, u16 val; struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct kxsd9_state *st = indio_dev->dev_data; + struct kxsd9_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .bits_per_word = 8, @@ -253,52 +251,32 @@ static const struct attribute_group kxsd9_attribute_group = { .attrs = kxsd9_attributes, }; -static int __devinit kxsd9_power_up(struct spi_device *spi) +static int __devinit kxsd9_power_up(struct kxsd9_state *st) { - int ret; struct spi_transfer xfers[2] = { { .bits_per_word = 8, .len = 2, .cs_change = 1, + .tx_buf = st->tx, }, { .bits_per_word = 8, .len = 2, .cs_change = 1, + .tx_buf = st->tx + 2, }, }; struct spi_message msg; - u8 *tx2; - u8 *tx = kmalloc(2, GFP_KERNEL); - - if (tx == NULL) { - ret = -ENOMEM; - goto error_ret; - } - tx2 = kmalloc(2, GFP_KERNEL); - if (tx2 == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - tx[0] = 0x0d; - tx[1] = 0x40; + st->tx[0] = 0x0d; + st->tx[1] = 0x40; + st->tx[2] = 0x0c; + st->tx[3] = 0x9b; - tx2[0] = 0x0c; - tx2[1] = 0x9b; - - xfers[0].tx_buf = tx; - xfers[1].tx_buf = tx2; spi_message_init(&msg); spi_message_add_tail(&xfers[0], &msg); spi_message_add_tail(&xfers[1], &msg); - ret = spi_sync(spi, &msg); - - kfree(tx2); -error_free_tx: - kfree(tx); -error_ret: - return ret; + return spi_sync(st->us, &msg); }; static const struct iio_info kxsd9_info = { @@ -308,72 +286,44 @@ static const struct iio_info kxsd9_info = { static int __devinit kxsd9_probe(struct spi_device *spi) { - + struct iio_dev *indio_dev; struct kxsd9_state *st; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - - st->rx = kmalloc(sizeof(*st->rx)*KXSD9_STATE_RX_SIZE, - GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kmalloc(sizeof(*st->tx)*KXSD9_STATE_TX_SIZE, - GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &kxsd9_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &kxsd9_info; + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; spi->mode = SPI_MODE_0; spi_setup(spi); - kxsd9_power_up(spi); + kxsd9_power_up(st); return 0; error_free_dev: - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } static int __devexit kxsd9_remove(struct spi_device *spi) { - struct kxsd9_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/accel/lis3l02dq_core.c b/drivers/staging/iio/accel/lis3l02dq_core.c index ba5bc679204f..a29dfd27d440 100644 --- a/drivers/staging/iio/accel/lis3l02dq_core.c +++ b/drivers/staging/iio/accel/lis3l02dq_core.c @@ -676,7 +676,7 @@ static int __devinit lis3l02dq_probe(struct spi_device *spi) } st = iio_priv(indio_dev); /* this is only used tor removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); diff --git a/drivers/staging/iio/accel/sca3000.h b/drivers/staging/iio/accel/sca3000.h index cf0751d917a9..1e396cefdf6e 100644 --- a/drivers/staging/iio/accel/sca3000.h +++ b/drivers/staging/iio/accel/sca3000.h @@ -173,7 +173,6 @@ struct sca3000_state { struct spi_device *us; const struct sca3000_chip_info *info; - struct iio_dev *indio_dev; struct work_struct interrupt_handler_ws; s64 last_timestamp; int mo_det_use_count; diff --git a/drivers/staging/iio/accel/sca3000_core.c b/drivers/staging/iio/accel/sca3000_core.c index f213b8698eb2..603f5bca797c 100644 --- a/drivers/staging/iio/accel/sca3000_core.c +++ b/drivers/staging/iio/accel/sca3000_core.c @@ -242,7 +242,7 @@ static int sca3000_check_status(struct device *dev) { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); mutex_lock(&st->lock); ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_STATUS, 1); @@ -269,7 +269,7 @@ static ssize_t sca3000_show_rev(struct device *dev, { int len = 0, ret; struct iio_dev *dev_info = dev_get_drvdata(dev); - struct sca3000_state *st = dev_info->dev_data; + struct sca3000_state *st = iio_priv(dev_info); mutex_lock(&st->lock); ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_REVID, 1); @@ -297,7 +297,7 @@ sca3000_show_available_measurement_modes(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct sca3000_state *st = dev_info->dev_data; + struct sca3000_state *st = iio_priv(dev_info); int len = 0; len += sprintf(buf + len, "0 - normal mode"); @@ -329,7 +329,7 @@ sca3000_show_measurement_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct sca3000_state *st = dev_info->dev_data; + struct sca3000_state *st = iio_priv(dev_info); int len = 0, ret; mutex_lock(&st->lock); @@ -380,7 +380,7 @@ sca3000_store_measurement_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct sca3000_state *st = dev_info->dev_data; + struct sca3000_state *st = iio_priv(dev_info); int ret; int mask = 0x03; long val; @@ -453,7 +453,7 @@ static int sca3000_read_raw(struct iio_dev *indio_dev, int *val2, long mask) { - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret; u8 address; @@ -500,7 +500,7 @@ static ssize_t sca3000_read_av_freq(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int len = 0, ret, val; mutex_lock(&st->lock); @@ -571,7 +571,7 @@ static ssize_t sca3000_read_frequency(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret, len = 0, base_freq = 0, val; mutex_lock(&st->lock); @@ -613,7 +613,7 @@ static ssize_t sca3000_set_frequency(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret, base_freq = 0; int ctrlval; long val; @@ -673,7 +673,7 @@ static ssize_t sca3000_read_temp(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret; int val; ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_TEMP_MSB, 2); @@ -699,7 +699,7 @@ static int sca3000_read_thresh(struct iio_dev *indio_dev, int *val) { int ret, i; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int num = IIO_EVENT_CODE_EXTRACT_MODIFIER(e); mutex_lock(&st->lock); ret = sca3000_read_ctrl_reg(st, sca3000_addresses[num][1]); @@ -726,7 +726,7 @@ static int sca3000_write_thresh(struct iio_dev *indio_dev, int e, int val) { - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int num = IIO_EVENT_CODE_EXTRACT_MODIFIER(e); int ret; int i; @@ -798,11 +798,10 @@ static const struct attribute_group sca3000_attribute_group_with_temp = { static irqreturn_t sca3000_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct sca3000_state *st; + struct sca3000_state *st = iio_priv(indio_dev); int ret, val; s64 last_timestamp = iio_get_time_ns(); - st = indio_dev->dev_data; /* Could lead if badly timed to an extra read of status reg, * but ensures no interrupt is missed. */ @@ -813,10 +812,10 @@ static irqreturn_t sca3000_event_handler(int irq, void *private) if (ret) goto done; - sca3000_ring_int_process(val, st->indio_dev->ring); + sca3000_ring_int_process(val, indio_dev->ring); if (val & SCA3000_INT_STATUS_FREE_FALL) - iio_push_event(st->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL, 0, IIO_EV_MOD_X_AND_Y_AND_Z, @@ -825,7 +824,7 @@ static irqreturn_t sca3000_event_handler(int irq, void *private) last_timestamp); if (val & SCA3000_INT_STATUS_Y_TRIGGER) - iio_push_event(st->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL, 0, IIO_EV_MOD_Y, @@ -834,7 +833,7 @@ static irqreturn_t sca3000_event_handler(int irq, void *private) last_timestamp); if (val & SCA3000_INT_STATUS_X_TRIGGER) - iio_push_event(st->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL, 0, IIO_EV_MOD_X, @@ -843,7 +842,7 @@ static irqreturn_t sca3000_event_handler(int irq, void *private) last_timestamp); if (val & SCA3000_INT_STATUS_Z_TRIGGER) - iio_push_event(st->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_MOD_EVENT_CODE(IIO_EV_CLASS_ACCEL, 0, IIO_EV_MOD_Z, @@ -861,7 +860,7 @@ done: static int sca3000_read_event_config(struct iio_dev *indio_dev, int e) { - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret; u8 protect_mask = 0x03; int num = IIO_EVENT_CODE_EXTRACT_MODIFIER(e); @@ -895,7 +894,7 @@ static ssize_t sca3000_query_free_fall_mode(struct device *dev, { int ret, len; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int val; mutex_lock(&st->lock); @@ -923,7 +922,7 @@ static ssize_t sca3000_set_free_fall_mode(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); long val; int ret; u8 protect_mask = SCA3000_FREE_FALL_DETECT; @@ -965,7 +964,7 @@ static int sca3000_write_event_config(struct iio_dev *indio_dev, int e, int state) { - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret, ctrlval; u8 protect_mask = 0x03; int num = IIO_EVENT_CODE_EXTRACT_MODIFIER(e); @@ -1126,42 +1125,38 @@ static int __devinit sca3000_probe(struct spi_device *spi) { int ret, regdone = 0; struct sca3000_state *st; + struct iio_dev *indio_dev; - st = kzalloc(sizeof(struct sca3000_state), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->lock); st->info = &sca3000_spi_chip_info_tbl[spi_get_device_id(spi) ->driver_data]; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_clear_st; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; if (st->info->temp_output) - st->indio_dev->info = &sca3000_info_with_temp; + indio_dev->info = &sca3000_info_with_temp; else { - st->indio_dev->info = &sca3000_info; - st->indio_dev->channels = sca3000_channels; - st->indio_dev->num_channels = ARRAY_SIZE(sca3000_channels); + indio_dev->info = &sca3000_info; + indio_dev->channels = sca3000_channels; + indio_dev->num_channels = ARRAY_SIZE(sca3000_channels); } - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->modes = INDIO_DIRECT_MODE; - sca3000_configure_ring(st->indio_dev); - ret = iio_device_register(st->indio_dev); + sca3000_configure_ring(indio_dev); + ret = iio_device_register(indio_dev); if (ret < 0) goto error_free_dev; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, sca3000_channels, ARRAY_SIZE(sca3000_channels)); if (ret < 0) @@ -1172,11 +1167,11 @@ static int __devinit sca3000_probe(struct spi_device *spi) &sca3000_event_handler, IRQF_TRIGGER_FALLING, "sca3000", - st->indio_dev); + indio_dev); if (ret) goto error_unregister_ring; } - sca3000_register_ring_funcs(st->indio_dev); + sca3000_register_ring_funcs(indio_dev); ret = sca3000_clean_setup(st); if (ret) goto error_free_irq; @@ -1184,17 +1179,16 @@ static int __devinit sca3000_probe(struct spi_device *spi) error_free_irq: if (spi->irq && gpio_is_valid(irq_to_gpio(spi->irq)) > 0) - free_irq(spi->irq, st->indio_dev); + free_irq(spi->irq, indio_dev); error_unregister_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unregister_dev: error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_clear_st: - kfree(st); + iio_free_device(indio_dev); + error_ret: return ret; } @@ -1219,8 +1213,8 @@ error_ret: static int sca3000_remove(struct spi_device *spi) { - struct sca3000_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct sca3000_state *st = iio_priv(indio_dev); int ret; /* Must ensure no interrupts can be generated after this!*/ ret = sca3000_stop_all_interrupts(st); @@ -1232,8 +1226,6 @@ static int sca3000_remove(struct spi_device *spi) sca3000_unconfigure_ring(indio_dev); iio_device_unregister(indio_dev); - kfree(st); - return 0; } diff --git a/drivers/staging/iio/accel/sca3000_ring.c b/drivers/staging/iio/accel/sca3000_ring.c index 7c4ff0b1df04..a704c75fffc2 100644 --- a/drivers/staging/iio/accel/sca3000_ring.c +++ b/drivers/staging/iio/accel/sca3000_ring.c @@ -89,7 +89,7 @@ static int sca3000_read_first_n_hw_rb(struct iio_ring_buffer *r, { struct iio_hw_ring_buffer *hw_ring = iio_to_hw_ring_buf(r); struct iio_dev *indio_dev = hw_ring->private; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); u8 *rx; int ret, i, num_available, num_read = 0; int bytes_per_sample = 1; @@ -168,7 +168,7 @@ static ssize_t sca3000_query_ring_int(struct device *dev, int ret, val; struct iio_ring_buffer *ring = dev_get_drvdata(dev); struct iio_dev *indio_dev = ring->indio_dev; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); mutex_lock(&st->lock); ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_INT_MASK, 1); @@ -190,7 +190,7 @@ static ssize_t sca3000_set_ring_int(struct device *dev, { struct iio_ring_buffer *ring = dev_get_drvdata(dev); struct iio_dev *indio_dev = ring->indio_dev; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); long val; int ret; @@ -240,7 +240,7 @@ static ssize_t sca3000_show_ring_bpse(struct device *dev, int len = 0, ret; struct iio_ring_buffer *ring = dev_get_drvdata(dev); struct iio_dev *indio_dev = ring->indio_dev; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); mutex_lock(&st->lock); ret = sca3000_read_data_short(st, SCA3000_REG_ADDR_MODE, 1); @@ -270,7 +270,7 @@ static ssize_t sca3000_store_ring_bpse(struct device *dev, { struct iio_ring_buffer *ring = dev_get_drvdata(dev); struct iio_dev *indio_dev = ring->indio_dev; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->lock); @@ -300,7 +300,7 @@ static ssize_t sca3000_show_buffer_scale(struct device *dev, { struct iio_ring_buffer *ring = dev_get_drvdata(dev); struct iio_dev *indio_dev = ring->indio_dev; - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); return sprintf(buf, "0.%06d\n", 4*st->info->scale); } @@ -397,7 +397,7 @@ void sca3000_unconfigure_ring(struct iio_dev *indio_dev) static inline int __sca3000_hw_ring_state_set(struct iio_dev *indio_dev, bool state) { - struct sca3000_state *st = indio_dev->dev_data; + struct sca3000_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->lock); diff --git a/drivers/staging/iio/adc/Kconfig b/drivers/staging/iio/adc/Kconfig index 8c751c46ddd7..b39f2e1c1fe6 100644 --- a/drivers/staging/iio/adc/Kconfig +++ b/drivers/staging/iio/adc/Kconfig @@ -130,6 +130,20 @@ config AD7780 To compile this driver as a module, choose M here: the module will be called ad7780. +config AD7793 + tristate "Analog Devices AD7792 AD7793 ADC driver" + depends on SPI + select IIO_RING_BUFFER + select IIO_SW_RING + select IIO_TRIGGER + help + Say yes here to build support for Analog Devices + AD7792 and AD7793 SPI analog to digital convertors (ADC). + If unsure, say N (but it's safe to say "Y"). + + To compile this driver as a module, choose M here: the + module will be called AD7793. + config AD7745 tristate "Analog Devices AD7745, AD7746 AD7747 capacitive sensor driver" depends on I2C diff --git a/drivers/staging/iio/adc/Makefile b/drivers/staging/iio/adc/Makefile index 1d9b3f582eab..f02035139979 100644 --- a/drivers/staging/iio/adc/Makefile +++ b/drivers/staging/iio/adc/Makefile @@ -35,6 +35,7 @@ obj-$(CONFIG_AD7291) += ad7291.o obj-$(CONFIG_AD7314) += ad7314.o obj-$(CONFIG_AD7745) += ad7745.o obj-$(CONFIG_AD7780) += ad7780.o +obj-$(CONFIG_AD7793) += ad7793.o obj-$(CONFIG_AD7816) += ad7816.o obj-$(CONFIG_ADT75) += adt75.o obj-$(CONFIG_ADT7310) += adt7310.o diff --git a/drivers/staging/iio/adc/ad7150.c b/drivers/staging/iio/adc/ad7150.c index ca32b6778a9e..04017ef6688a 100644 --- a/drivers/staging/iio/adc/ad7150.c +++ b/drivers/staging/iio/adc/ad7150.c @@ -59,7 +59,6 @@ struct ad7150_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; bool inter; u16 ch1_threshold; /* Ch1 Threshold (in fixed threshold mode) */ u8 ch1_sensitivity; /* Ch1 Sensitivity (in adaptive threshold mode) */ @@ -184,7 +183,7 @@ static ssize_t ad7150_show_conversion_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%s\n", chip->conversion_mode); } @@ -195,7 +194,7 @@ static ssize_t ad7150_store_conversion_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); u8 cfg; int i; @@ -234,7 +233,7 @@ static ssize_t ad7150_show_ch1_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); u8 data[2]; ad7150_i2c_read(chip, AD7150_CH1_DATA_HIGH, data, 2); @@ -248,7 +247,7 @@ static ssize_t ad7150_show_ch2_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); u8 data[2]; ad7150_i2c_read(chip, AD7150_CH2_DATA_HIGH, data, 2); @@ -262,7 +261,7 @@ static ssize_t ad7150_show_threshold_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%s\n", chip->threshold_mode); } @@ -273,7 +272,7 @@ static ssize_t ad7150_store_threshold_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); u8 cfg; ad7150_i2c_read(chip, AD7150_CFG, &cfg, 1); @@ -305,7 +304,7 @@ static ssize_t ad7150_show_ch1_threshold(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch1_threshold); } @@ -316,7 +315,7 @@ static ssize_t ad7150_store_ch1_threshold(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -341,7 +340,7 @@ static ssize_t ad7150_show_ch2_threshold(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch2_threshold); } @@ -352,7 +351,7 @@ static ssize_t ad7150_store_ch2_threshold(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -377,7 +376,7 @@ static ssize_t ad7150_show_ch1_sensitivity(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch1_sensitivity); } @@ -388,7 +387,7 @@ static ssize_t ad7150_store_ch1_sensitivity(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -412,7 +411,7 @@ static ssize_t ad7150_show_ch2_sensitivity(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch2_sensitivity); } @@ -423,7 +422,7 @@ static ssize_t ad7150_store_ch2_sensitivity(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -447,7 +446,7 @@ static ssize_t ad7150_show_ch1_timeout(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch1_timeout); } @@ -458,7 +457,7 @@ static ssize_t ad7150_store_ch1_timeout(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -482,7 +481,7 @@ static ssize_t ad7150_show_ch2_timeout(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch2_timeout); } @@ -493,7 +492,7 @@ static ssize_t ad7150_store_ch2_timeout(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -517,7 +516,7 @@ static ssize_t ad7150_show_ch1_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->ch1_setup); } @@ -528,7 +527,7 @@ static ssize_t ad7150_store_ch1_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -553,7 +552,7 @@ static ssize_t ad7150_show_ch2_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->ch2_setup); } @@ -564,7 +563,7 @@ static ssize_t ad7150_store_ch2_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -588,7 +587,7 @@ static ssize_t ad7150_show_powerdown_timer(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->powerdown_timer); } @@ -599,7 +598,7 @@ static ssize_t ad7150_store_powerdown_timer(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7150_chip_info *chip = dev_info->dev_data; + struct ad7150_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -645,7 +644,7 @@ static const struct attribute_group ad7150_attribute_group = { static irqreturn_t ad7150_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct ad7150_chip_info *chip = iio_dev_get_devdata(indio_dev); + struct ad7150_chip_info *chip = iio_priv(indio_dev); u8 int_status; s64 timestamp = iio_get_time_ns(); @@ -714,33 +713,29 @@ static int __devinit ad7150_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0, regdone = 0; - struct ad7150_chip_info *chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { + struct ad7150_chip_info *chip; + struct iio_dev *indio_dev; + + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - /* 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; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; - chip->indio_dev->info = &ad7150_info; - chip->indio_dev->dev_data = (void *)(chip); + indio_dev->info = &ad7150_info; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; @@ -752,7 +747,7 @@ static int __devinit ad7150_probe(struct i2c_client *client, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "ad7150", - chip->indio_dev); + indio_dev); if (ret) goto error_free_dev; } @@ -763,24 +758,20 @@ static int __devinit ad7150_probe(struct i2c_client *client, error_free_dev: if (regdone) - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); + iio_free_device(indio_dev); error_ret: return ret; } static int __devexit ad7150_remove(struct i2c_client *client) { - struct ad7150_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); if (client->irq) free_irq(client->irq, indio_dev); iio_device_unregister(indio_dev); - kfree(chip); return 0; } diff --git a/drivers/staging/iio/adc/ad7152.c b/drivers/staging/iio/adc/ad7152.c index 7a38bcbbe1af..21f5f380fb5e 100644 --- a/drivers/staging/iio/adc/ad7152.c +++ b/drivers/staging/iio/adc/ad7152.c @@ -51,7 +51,6 @@ struct ad7152_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; u16 ch1_offset; /* Channel 1 offset calibration coefficient */ u16 ch1_gain; /* Channel 1 gain coefficient */ u8 ch1_setup; @@ -166,7 +165,7 @@ static ssize_t ad7152_show_ch1_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); u8 data[2]; ad7152_i2c_read(chip, AD7152_CH1_DATA_HIGH, data, 2); @@ -180,7 +179,7 @@ static ssize_t ad7152_show_ch2_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); u8 data[2]; ad7152_i2c_read(chip, AD7152_CH2_DATA_HIGH, data, 2); @@ -194,7 +193,7 @@ static ssize_t ad7152_show_conversion_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%s\n", chip->conversion_mode); } @@ -205,7 +204,7 @@ static ssize_t ad7152_store_conversion_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); u8 cfg; int i; @@ -234,7 +233,7 @@ static ssize_t ad7152_show_ch1_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch1_offset); } @@ -245,7 +244,7 @@ static ssize_t ad7152_store_ch1_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -270,7 +269,7 @@ static ssize_t ad7152_show_ch2_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch2_offset); } @@ -281,7 +280,7 @@ static ssize_t ad7152_store_ch2_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -306,7 +305,7 @@ static ssize_t ad7152_show_ch1_gain(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch1_gain); } @@ -317,7 +316,7 @@ static ssize_t ad7152_store_ch1_gain(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -342,7 +341,7 @@ static ssize_t ad7152_show_ch2_gain(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->ch2_gain); } @@ -353,7 +352,7 @@ static ssize_t ad7152_store_ch2_gain(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -378,7 +377,7 @@ static ssize_t ad7152_show_ch1_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->ch1_setup); } @@ -389,7 +388,7 @@ static ssize_t ad7152_store_ch1_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -413,7 +412,7 @@ static ssize_t ad7152_show_ch2_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->ch2_setup); } @@ -424,7 +423,7 @@ static ssize_t ad7152_store_ch2_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -448,7 +447,7 @@ static ssize_t ad7152_show_filter_rate_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->filter_rate_setup); } @@ -459,7 +458,7 @@ static ssize_t ad7152_store_filter_rate_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7152_chip_info *chip = dev_info->dev_data; + struct ad7152_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -509,31 +508,27 @@ static int __devinit ad7152_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0; - struct ad7152_chip_info *chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { + struct ad7152_chip_info *chip; + struct iio_dev *indio_dev; + + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - /* 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->info = &ad7152_info; - chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &ad7152_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -542,20 +537,16 @@ static int __devinit ad7152_probe(struct i2c_client *client, return 0; error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); + iio_free_device(indio_dev); error_ret: return ret; } static int __devexit ad7152_remove(struct i2c_client *client) { - struct ad7152_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); iio_device_unregister(indio_dev); - kfree(chip); return 0; } diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/staging/iio/adc/ad7291.c index 1be3453479b7..96cbb17bc2cd 100644 --- a/drivers/staging/iio/adc/ad7291.c +++ b/drivers/staging/iio/adc/ad7291.c @@ -61,7 +61,6 @@ struct ad7291_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; u16 command; u8 channels; /* Active voltage channels */ }; @@ -157,7 +156,7 @@ static ssize_t ad7291_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); if (chip->command & AD7291_AUTOCYCLE) return sprintf(buf, "autocycle\n"); @@ -171,7 +170,7 @@ static ssize_t ad7291_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 command; int ret; @@ -208,7 +207,7 @@ static ssize_t ad7291_store_reset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 command; int ret; @@ -231,7 +230,7 @@ static ssize_t ad7291_show_ext_ref(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->command & AD7291_EXT_REF)); } @@ -242,7 +241,7 @@ static ssize_t ad7291_store_ext_ref(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 command; int ret; @@ -269,7 +268,7 @@ static ssize_t ad7291_show_noise_delay(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->command & AD7291_NOISE_DELAY)); } @@ -280,7 +279,7 @@ static ssize_t ad7291_store_noise_delay(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 command; int ret; @@ -307,7 +306,7 @@ static ssize_t ad7291_show_t_sense(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 data; char sign = ' '; int ret; @@ -334,7 +333,7 @@ static ssize_t ad7291_show_t_average(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 data; char sign = ' '; int ret; @@ -361,7 +360,7 @@ static ssize_t ad7291_show_voltage(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 data[AD7291_VOLTAGE_LIMIT_COUNT]; int i, size, ret; @@ -390,7 +389,7 @@ static ssize_t ad7291_show_channel_mask(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%x\n", (chip->command & AD7291_VOLTAGE_MASK) >> AD7291_VOLTAGE_OFFSET); @@ -402,7 +401,7 @@ static ssize_t ad7291_store_channel_mask(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 command; unsigned long data; int i, ret; @@ -457,7 +456,7 @@ static const struct attribute_group ad7291_attribute_group = { static irqreturn_t ad7291_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct ad7291_chip_info *chip = iio_dev_get_devdata(private); + struct ad7291_chip_info *chip = iio_priv(private); u16 t_status, v_status; u16 command; int i; @@ -532,7 +531,7 @@ static inline ssize_t ad7291_show_t_bound(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); u16 data; char sign = ' '; @@ -560,7 +559,7 @@ static inline ssize_t ad7291_set_t_bound(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); long tmp1, tmp2; u16 data; @@ -608,7 +607,7 @@ static inline ssize_t ad7291_show_v_bound(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); u16 data; int ret; @@ -633,7 +632,7 @@ static inline ssize_t ad7291_set_v_bound(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7291_chip_info *chip = dev_info->dev_data; + struct ad7291_chip_info *chip = iio_priv(dev_info); unsigned long value; u16 data; int ret; @@ -792,32 +791,27 @@ static int __devinit ad7291_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ad7291_chip_info *chip; + struct iio_dev *indio_dev; int ret = 0; - chip = kzalloc(sizeof(struct ad7291_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; chip->command = AD7291_NOISE_DELAY | AD7291_T_SENSE_MASK; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - - chip->indio_dev->name = id->name; - chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->info = &ad7291_info; - chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &ad7291_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -827,7 +821,7 @@ static int __devinit ad7291_probe(struct i2c_client *client, &ad7291_event_handler, IRQF_TRIGGER_LOW | IRQF_ONESHOT, id->name, - chip->indio_dev); + indio_dev); if (ret) goto error_unreg_dev; @@ -847,27 +841,23 @@ static int __devinit ad7291_probe(struct i2c_client *client, return 0; error_unreg_irq: - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); error_unreg_dev: - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit ad7291_remove(struct i2c_client *client) { - struct ad7291_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); if (client->irq) - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/adc/ad7314.c b/drivers/staging/iio/adc/ad7314.c index 98bb16fcff26..9070d9cac725 100644 --- a/drivers/staging/iio/adc/ad7314.c +++ b/drivers/staging/iio/adc/ad7314.c @@ -43,7 +43,6 @@ struct ad7314_chip_info { struct spi_device *spi_dev; - struct iio_dev *indio_dev; s64 last_timestamp; u8 mode; }; @@ -87,7 +86,7 @@ static ssize_t ad7314_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7314_chip_info *chip = dev_info->dev_data; + struct ad7314_chip_info *chip = iio_priv(dev_info); if (chip->mode) return sprintf(buf, "power-save\n"); @@ -101,7 +100,7 @@ static ssize_t ad7314_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7314_chip_info *chip = dev_info->dev_data; + struct ad7314_chip_info *chip = iio_priv(dev_info); u16 mode = 0; int ret; @@ -136,7 +135,7 @@ static ssize_t ad7314_show_temperature(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7314_chip_info *chip = dev_info->dev_data; + struct ad7314_chip_info *chip = iio_priv(dev_info); u16 data; char sign = ' '; int ret; @@ -202,54 +201,45 @@ static const struct iio_info ad7314_info = { static int __devinit ad7314_probe(struct spi_device *spi_dev) { struct ad7314_chip_info *chip; + struct iio_dev *indio_dev; int ret = 0; - chip = kzalloc(sizeof(struct ad7314_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ dev_set_drvdata(&spi_dev->dev, chip); chip->spi_dev = spi_dev; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } + indio_dev->name = spi_get_device_id(spi_dev)->name; + indio_dev->dev.parent = &spi_dev->dev; + indio_dev->info = &ad7314_info; - chip->indio_dev->name = spi_get_device_id(spi_dev)->name; - chip->indio_dev->dev.parent = &spi_dev->dev; - chip->indio_dev->info = &ad7314_info; - chip->indio_dev->dev_data = (void *)chip; - - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; dev_info(&spi_dev->dev, "%s temperature sensor registered.\n", - chip->indio_dev->name); + indio_dev->name); return 0; error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit ad7314_remove(struct spi_device *spi_dev) { - struct ad7314_chip_info *chip = dev_get_drvdata(&spi_dev->dev); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev); dev_set_drvdata(&spi_dev->dev, NULL); iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/adc/ad7476.h b/drivers/staging/iio/adc/ad7476.h index 01a70211f4ff..0d44976e846f 100644 --- a/drivers/staging/iio/adc/ad7476.h +++ b/drivers/staging/iio/adc/ad7476.h @@ -24,7 +24,6 @@ struct ad7476_chip_info { }; struct ad7476_state { - struct iio_dev *indio_dev; struct spi_device *spi; const struct ad7476_chip_info *chip_info; struct regulator *reg; @@ -51,11 +50,11 @@ enum ad7476_supported_device_ids { }; #ifdef CONFIG_IIO_RING_BUFFER -int ad7476_scan_from_ring(struct ad7476_state *st); +int ad7476_scan_from_ring(struct iio_dev *indio_dev); int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev); void ad7476_ring_cleanup(struct iio_dev *indio_dev); #else /* CONFIG_IIO_RING_BUFFER */ -static inline int ad7476_scan_from_ring(struct ad7476_state *st) +static inline int ad7476_scan_from_ring(struct iio_dev *indio_dev) { return 0; } diff --git a/drivers/staging/iio/adc/ad7476_core.c b/drivers/staging/iio/adc/ad7476_core.c index 50cedb422839..c21089894d28 100644 --- a/drivers/staging/iio/adc/ad7476_core.c +++ b/drivers/staging/iio/adc/ad7476_core.c @@ -39,14 +39,14 @@ static int ad7476_read_raw(struct iio_dev *dev_info, long m) { int ret; - struct ad7476_state *st = dev_info->dev_data; + struct ad7476_state *st = iio_priv(dev_info); unsigned int scale_uv; switch (m) { case 0: mutex_lock(&dev_info->mlock); if (iio_ring_enabled(dev_info)) - ret = ad7476_scan_from_ring(st); + ret = ad7476_scan_from_ring(dev_info); else ret = ad7476_scan_direct(st); mutex_unlock(&dev_info->mlock); @@ -127,23 +127,26 @@ static int __devinit ad7476_probe(struct spi_device *spi) { struct ad7476_platform_data *pdata = spi->dev.platform_data; struct ad7476_state *st; + struct iio_dev *indio_dev; int ret, voltage_uv = 0; + bool reg_done = false; + struct regulator *reg; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + st = iio_priv(indio_dev); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; - voltage_uv = regulator_get_voltage(st->reg); + voltage_uv = regulator_get_voltage(reg); } - + st->reg = reg; st->chip_info = &ad7476_chip_info_tbl[spi_get_device_id(spi)->driver_data]; @@ -156,24 +159,17 @@ static int __devinit ad7476_probe(struct spi_device *spi) else dev_warn(&spi->dev, "reference voltage unspecified\n"); - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); st->spi = spi; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_disable_reg; - } - /* Establish 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->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; - st->indio_dev->channels = st->chip_info->channel; - st->indio_dev->num_channels = 2; - st->indio_dev->info = &ad7476_info; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = st->chip_info->channel; + indio_dev->num_channels = 2; + indio_dev->info = &ad7476_info; /* Setup default message */ st->xfer.rx_buf = &st->data; @@ -182,15 +178,15 @@ static int __devinit ad7476_probe(struct spi_device *spi) spi_message_init(&st->msg); spi_message_add_tail(&st->xfer, &st->msg); - ret = ad7476_register_ring_funcs_and_init(st->indio_dev); + ret = ad7476_register_ring_funcs_and_init(indio_dev); if (ret) - goto error_free_device; + goto error_disable_reg; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) - goto error_free_device; + goto error_disable_reg; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, st->chip_info->channel, ARRAY_SIZE(st->chip_info->channel)); if (ret) @@ -198,33 +194,35 @@ static int __devinit ad7476_probe(struct spi_device *spi) return 0; error_cleanup_ring: - ad7476_ring_cleanup(st->indio_dev); - iio_device_unregister(st->indio_dev); -error_free_device: - iio_free_device(st->indio_dev); + ad7476_ring_cleanup(indio_dev); + iio_device_unregister(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) + if (!IS_ERR(reg)) regulator_disable(st->reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); - kfree(st); + if (!IS_ERR(reg)) + regulator_put(reg); + if (!reg_done) + iio_free_device(indio_dev); error_ret: return ret; } static int ad7476_remove(struct spi_device *spi) { - struct ad7476_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad7476_state *st = iio_priv(indio_dev); + /* copy needed as st will have been freed */ + struct regulator *reg = st->reg; + iio_ring_buffer_unregister(indio_dev->ring); ad7476_ring_cleanup(indio_dev); iio_device_unregister(indio_dev); - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); + return 0; } diff --git a/drivers/staging/iio/adc/ad7476_ring.c b/drivers/staging/iio/adc/ad7476_ring.c index b1b2ee2c56b0..a92fc5a1a604 100644 --- a/drivers/staging/iio/adc/ad7476_ring.c +++ b/drivers/staging/iio/adc/ad7476_ring.c @@ -22,9 +22,9 @@ #include "ad7476.h" -int ad7476_scan_from_ring(struct ad7476_state *st) +int ad7476_scan_from_ring(struct iio_dev *indio_dev) { - struct iio_ring_buffer *ring = st->indio_dev->ring; + struct iio_ring_buffer *ring = indio_dev->ring; int ret; u8 *ring_data; @@ -55,7 +55,7 @@ error_ret: **/ static int ad7476_ring_preenable(struct iio_dev *indio_dev) { - struct ad7476_state *st = indio_dev->dev_data; + struct ad7476_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; st->d_size = ring->scan_count * @@ -79,7 +79,7 @@ static irqreturn_t ad7476_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct ad7476_state *st = iio_dev_get_devdata(indio_dev); + struct ad7476_state *st = iio_priv(indio_dev); s64 time_ns; __u8 *rxbuf; int b_sent; @@ -115,7 +115,7 @@ static const struct iio_ring_setup_ops ad7476_ring_setup_ops = { int ad7476_register_ring_funcs_and_init(struct iio_dev *indio_dev) { - struct ad7476_state *st = indio_dev->dev_data; + struct ad7476_state *st = iio_priv(indio_dev); int ret = 0; indio_dev->ring = iio_sw_rb_allocate(indio_dev); diff --git a/drivers/staging/iio/adc/ad7745.c b/drivers/staging/iio/adc/ad7745.c index 1944223ef163..4c13f26aa9ae 100644 --- a/drivers/staging/iio/adc/ad7745.c +++ b/drivers/staging/iio/adc/ad7745.c @@ -54,7 +54,6 @@ struct ad774x_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; bool inter; u16 cap_offs; /* Capacitive offset */ u16 cap_gain; /* Capacitive gain calibration */ @@ -169,7 +168,7 @@ static ssize_t ad774x_show_conversion_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%s\n", chip->conversion_mode); } @@ -180,7 +179,7 @@ static ssize_t ad774x_store_conversion_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); u8 cfg; int i; @@ -210,7 +209,7 @@ static ssize_t ad774x_show_dac_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); u8 data; @@ -225,7 +224,7 @@ static ssize_t ad774x_store_dac_value(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); unsigned long data; int ret; @@ -256,7 +255,7 @@ static ssize_t ad774x_show_cap_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->cap_setup); } @@ -267,7 +266,7 @@ static ssize_t ad774x_store_cap_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -291,7 +290,7 @@ static ssize_t ad774x_show_vt_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->vt_setup); } @@ -302,7 +301,7 @@ static ssize_t ad774x_store_vt_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -326,7 +325,7 @@ static ssize_t ad774x_show_exec_setup(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%02x\n", chip->exec_setup); } @@ -337,7 +336,7 @@ static ssize_t ad774x_store_exec_setup(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -361,7 +360,7 @@ static ssize_t ad774x_show_volt_gain(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->volt_gain); } @@ -372,7 +371,7 @@ static ssize_t ad774x_store_volt_gain(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -397,7 +396,7 @@ static ssize_t ad774x_show_cap_data(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; char tmp[3]; @@ -414,7 +413,7 @@ static ssize_t ad774x_show_vt_data(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; char tmp[3]; @@ -431,7 +430,7 @@ static ssize_t ad774x_show_cap_offs(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->cap_offs); } @@ -442,7 +441,7 @@ static ssize_t ad774x_store_cap_offs(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -467,7 +466,7 @@ static ssize_t ad774x_show_cap_gain(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->cap_gain); } @@ -478,7 +477,7 @@ static ssize_t ad774x_store_cap_gain(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad774x_chip_info *chip = dev_info->dev_data; + struct ad774x_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -534,7 +533,7 @@ static const struct attribute_group ad774x_attribute_group = { static irqreturn_t ad774x_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct ad774x_chip_info *chip = iio_dev_get_devdata(indio_dev); + struct ad774x_chip_info *chip = iio_priv(indio_dev); u8 int_status; ad774x_i2c_read(chip, AD774X_STATUS, &int_status, 1); @@ -579,31 +578,27 @@ static int __devinit ad774x_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret = 0, regdone = 0; - struct ad774x_chip_info *chip = kzalloc(sizeof(*chip), GFP_KERNEL); - if (chip == NULL) { + struct ad774x_chip_info *chip; + struct iio_dev *indio_dev; + + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - /* 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->info = &ad774x_info; - chip->indio_dev->dev_data = (void *)(chip); - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &ad774x_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; @@ -614,7 +609,7 @@ static int __devinit ad774x_probe(struct i2c_client *client, &ad774x_event_handler, IRQF_TRIGGER_FALLING, "ad774x", - chip->indio_dev); + indio_dev); if (ret) goto error_free_dev; } @@ -625,24 +620,20 @@ static int __devinit ad774x_probe(struct i2c_client *client, error_free_dev: if (regdone) - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); else - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); + iio_free_device(indio_dev); error_ret: return ret; } static int __devexit ad774x_remove(struct i2c_client *client) { - struct ad774x_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); if (client->irq) free_irq(client->irq, indio_dev); iio_device_unregister(indio_dev); - kfree(chip); return 0; } diff --git a/drivers/staging/iio/adc/ad7793.c b/drivers/staging/iio/adc/ad7793.c new file mode 100644 index 000000000000..90f6c039d6c6 --- /dev/null +++ b/drivers/staging/iio/adc/ad7793.c @@ -0,0 +1,987 @@ +/* + * AD7792/AD7793 SPI ADC driver + * + * Copyright 2011 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ + +#include <linux/interrupt.h> +#include <linux/device.h> +#include <linux/kernel.h> +#include <linux/slab.h> +#include <linux/sysfs.h> +#include <linux/spi/spi.h> +#include <linux/regulator/consumer.h> +#include <linux/err.h> +#include <linux/sched.h> +#include <linux/delay.h> + +#include "../iio.h" +#include "../sysfs.h" +#include "../ring_generic.h" +#include "../ring_sw.h" +#include "../trigger.h" +#include "adc.h" + +#include "ad7793.h" + +/* NOTE: + * The AD7792/AD7793 features a dual use data out ready DOUT/RDY output. + * In order to avoid contentions on the SPI bus, it's therefore necessary + * to use spi bus locking. + * + * The DOUT/RDY output must also be wired to an interrupt capable GPIO. + */ + +struct ad7793_chip_info { + struct iio_chan_spec channel[7]; +}; + +struct ad7793_state { + struct spi_device *spi; + struct iio_trigger *trig; + const struct ad7793_chip_info *chip_info; + struct regulator *reg; + struct ad7793_platform_data *pdata; + wait_queue_head_t wq_data_avail; + bool done; + bool irq_dis; + u16 int_vref_mv; + u16 mode; + u16 conf; + u32 scale_avail[8][2]; + u32 available_scan_masks[7]; + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + u8 data[4] ____cacheline_aligned; +}; + +enum ad7793_supported_device_ids { + ID_AD7792, + ID_AD7793, +}; + +static int __ad7793_write_reg(struct ad7793_state *st, bool locked, + bool cs_change, unsigned char reg, + unsigned size, unsigned val) +{ + u8 *data = st->data; + struct spi_transfer t = { + .tx_buf = data, + .len = size + 1, + .cs_change = cs_change, + }; + struct spi_message m; + + data[0] = AD7793_COMM_WRITE | AD7793_COMM_ADDR(reg); + + switch (size) { + case 3: + data[1] = val >> 16; + data[2] = val >> 8; + data[3] = val; + break; + case 2: + data[1] = val >> 8; + data[2] = val; + break; + case 1: + data[1] = val; + break; + default: + return -EINVAL; + } + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + + if (locked) + return spi_sync_locked(st->spi, &m); + else + return spi_sync(st->spi, &m); +} + +static int ad7793_write_reg(struct ad7793_state *st, + unsigned reg, unsigned size, unsigned val) +{ + return __ad7793_write_reg(st, false, false, reg, size, val); +} + +static int __ad7793_read_reg(struct ad7793_state *st, bool locked, + bool cs_change, unsigned char reg, + int *val, unsigned size) +{ + u8 *data = st->data; + int ret; + struct spi_transfer t[] = { + { + .tx_buf = data, + .len = 1, + }, { + .rx_buf = data, + .len = size, + .cs_change = cs_change, + }, + }; + struct spi_message m; + + data[0] = AD7793_COMM_READ | AD7793_COMM_ADDR(reg); + + spi_message_init(&m); + spi_message_add_tail(&t[0], &m); + spi_message_add_tail(&t[1], &m); + + if (locked) + ret = spi_sync_locked(st->spi, &m); + else + ret = spi_sync(st->spi, &m); + + if (ret < 0) + return ret; + + switch (size) { + case 3: + *val = data[0] << 16 | data[1] << 8 | data[2]; + break; + case 2: + *val = data[0] << 8 | data[1]; + break; + case 1: + *val = data[0]; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int ad7793_read_reg(struct ad7793_state *st, + unsigned reg, int *val, unsigned size) +{ + return __ad7793_read_reg(st, 0, 0, reg, val, size); +} + +static int ad7793_read(struct ad7793_state *st, unsigned ch, + unsigned len, int *val) +{ + int ret; + st->conf = (st->conf & ~AD7793_CONF_CHAN(-1)) | AD7793_CONF_CHAN(ch); + st->mode = (st->mode & ~AD7793_MODE_SEL(-1)) | + AD7793_MODE_SEL(AD7793_MODE_SINGLE); + + ad7793_write_reg(st, AD7793_REG_CONF, sizeof(st->conf), st->conf); + + spi_bus_lock(st->spi->master); + st->done = false; + + ret = __ad7793_write_reg(st, 1, 1, AD7793_REG_MODE, + sizeof(st->mode), st->mode); + if (ret < 0) + goto out; + + st->irq_dis = false; + enable_irq(st->spi->irq); + wait_event_interruptible(st->wq_data_avail, st->done); + + ret = __ad7793_read_reg(st, 1, 0, AD7793_REG_DATA, val, len); +out: + spi_bus_unlock(st->spi->master); + + return ret; +} + +static int ad7793_calibrate(struct ad7793_state *st, unsigned mode, unsigned ch) +{ + int ret; + + st->conf = (st->conf & ~AD7793_CONF_CHAN(-1)) | AD7793_CONF_CHAN(ch); + st->mode = (st->mode & ~AD7793_MODE_SEL(-1)) | AD7793_MODE_SEL(mode); + + ad7793_write_reg(st, AD7793_REG_CONF, sizeof(st->conf), st->conf); + + spi_bus_lock(st->spi->master); + st->done = false; + + ret = __ad7793_write_reg(st, 1, 1, AD7793_REG_MODE, + sizeof(st->mode), st->mode); + if (ret < 0) + goto out; + + st->irq_dis = false; + enable_irq(st->spi->irq); + wait_event_interruptible(st->wq_data_avail, st->done); + + st->mode = (st->mode & ~AD7793_MODE_SEL(-1)) | + AD7793_MODE_SEL(AD7793_MODE_IDLE); + + ret = __ad7793_write_reg(st, 1, 0, AD7793_REG_MODE, + sizeof(st->mode), st->mode); +out: + spi_bus_unlock(st->spi->master); + + return ret; +} + +static const u8 ad7793_calib_arr[6][2] = { + {AD7793_MODE_CAL_INT_ZERO, AD7793_CH_AIN1P_AIN1M}, + {AD7793_MODE_CAL_INT_FULL, AD7793_CH_AIN1P_AIN1M}, + {AD7793_MODE_CAL_INT_ZERO, AD7793_CH_AIN2P_AIN2M}, + {AD7793_MODE_CAL_INT_FULL, AD7793_CH_AIN2P_AIN2M}, + {AD7793_MODE_CAL_INT_ZERO, AD7793_CH_AIN3P_AIN3M}, + {AD7793_MODE_CAL_INT_FULL, AD7793_CH_AIN3P_AIN3M} +}; + +static int ad7793_calibrate_all(struct ad7793_state *st) +{ + int i, ret; + + for (i = 0; i < ARRAY_SIZE(ad7793_calib_arr); i++) { + ret = ad7793_calibrate(st, ad7793_calib_arr[i][0], + ad7793_calib_arr[i][1]); + if (ret) + goto out; + } + + return 0; +out: + dev_err(&st->spi->dev, "Calibration failed\n"); + return ret; +} + +static int ad7793_setup(struct ad7793_state *st) +{ + int i, ret = -1; + unsigned long long scale_uv; + u32 id; + + /* reset the serial interface */ + ret = spi_write(st->spi, (u8 *)&ret, sizeof(ret)); + if (ret < 0) + goto out; + msleep(1); /* Wait for at least 500us */ + + /* write/read test for device presence */ + ret = ad7793_read_reg(st, AD7793_REG_ID, &id, 1); + if (ret) + goto out; + + id &= AD7793_ID_MASK; + + if (!((id == AD7792_ID) || (id == AD7793_ID))) { + dev_err(&st->spi->dev, "device ID query failed\n"); + goto out; + } + + st->mode = (st->pdata->mode & ~AD7793_MODE_SEL(-1)) | + AD7793_MODE_SEL(AD7793_MODE_IDLE); + st->conf = st->pdata->conf & ~AD7793_CONF_CHAN(-1); + + ret = ad7793_write_reg(st, AD7793_REG_MODE, sizeof(st->mode), st->mode); + if (ret) + goto out; + + ret = ad7793_write_reg(st, AD7793_REG_CONF, sizeof(st->conf), st->conf); + if (ret) + goto out; + + ret = ad7793_write_reg(st, AD7793_REG_IO, + sizeof(st->pdata->io), st->pdata->io); + if (ret) + goto out; + + ret = ad7793_calibrate_all(st); + if (ret) + goto out; + + /* Populate available ADC input ranges */ + for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) { + scale_uv = ((u64)st->int_vref_mv * 100000000) + >> (st->chip_info->channel[0].scan_type.realbits - + (!!(st->conf & AD7793_CONF_UNIPOLAR) ? 0 : 1)); + scale_uv >>= i; + + st->scale_avail[i][1] = do_div(scale_uv, 100000000) * 10; + st->scale_avail[i][0] = scale_uv; + } + + return 0; +out: + dev_err(&st->spi->dev, "setup failed\n"); + return ret; +} + +static int ad7793_scan_from_ring(struct ad7793_state *st, unsigned ch, int *val) +{ + struct iio_ring_buffer *ring = iio_priv_to_dev(st)->ring; + int ret; + s64 dat64[2]; + u32 *dat32 = (u32 *)dat64; + + if (!(ring->scan_mask & (1 << ch))) + return -EBUSY; + + ret = ring->access->read_last(ring, (u8 *) &dat64); + if (ret) + return ret; + + *val = *dat32; + + return 0; +} + +static int ad7793_ring_preenable(struct iio_dev *indio_dev) +{ + struct ad7793_state *st = iio_priv(indio_dev); + struct iio_ring_buffer *ring = indio_dev->ring; + size_t d_size; + unsigned channel; + + if (!ring->scan_count) + return -EINVAL; + + channel = __ffs(ring->scan_mask); + + d_size = ring->scan_count * + indio_dev->channels[0].scan_type.storagebits / 8; + + if (ring->scan_timestamp) { + d_size += sizeof(s64); + + if (d_size % sizeof(s64)) + d_size += sizeof(s64) - (d_size % sizeof(s64)); + } + + if (indio_dev->ring->access->set_bytes_per_datum) + indio_dev->ring->access->set_bytes_per_datum(indio_dev->ring, + d_size); + + st->mode = (st->mode & ~AD7793_MODE_SEL(-1)) | + AD7793_MODE_SEL(AD7793_MODE_CONT); + st->conf = (st->conf & ~AD7793_CONF_CHAN(-1)) | + AD7793_CONF_CHAN(indio_dev->channels[channel].address); + + ad7793_write_reg(st, AD7793_REG_CONF, sizeof(st->conf), st->conf); + + spi_bus_lock(st->spi->master); + __ad7793_write_reg(st, 1, 1, AD7793_REG_MODE, + sizeof(st->mode), st->mode); + + st->irq_dis = false; + enable_irq(st->spi->irq); + + return 0; +} + +static int ad7793_ring_postdisable(struct iio_dev *indio_dev) +{ + struct ad7793_state *st = iio_priv(indio_dev); + + st->mode = (st->mode & ~AD7793_MODE_SEL(-1)) | + AD7793_MODE_SEL(AD7793_MODE_IDLE); + + st->done = false; + wait_event_interruptible(st->wq_data_avail, st->done); + + if (!st->irq_dis) + disable_irq_nosync(st->spi->irq); + + __ad7793_write_reg(st, 1, 0, AD7793_REG_MODE, + sizeof(st->mode), st->mode); + + return spi_bus_unlock(st->spi->master); +} + +/** + * ad7793_trigger_handler() bh of trigger launched polling to ring buffer + **/ + +static irqreturn_t ad7793_trigger_handler(int irq, void *p) +{ + struct iio_poll_func *pf = p; + struct iio_dev *indio_dev = pf->private_data; + struct iio_ring_buffer *ring = indio_dev->ring; + struct ad7793_state *st = iio_priv(indio_dev); + s64 dat64[2]; + s32 *dat32 = (s32 *)dat64; + + if (ring->scan_count) + __ad7793_read_reg(st, 1, 1, AD7793_REG_DATA, + dat32, + indio_dev->channels[0].scan_type.realbits/8); + + /* Guaranteed to be aligned with 8 byte boundary */ + if (ring->scan_timestamp) + dat64[1] = pf->timestamp; + + ring->access->store_to(ring, (u8 *)dat64, pf->timestamp); + + iio_trigger_notify_done(indio_dev->trig); + st->irq_dis = false; + enable_irq(st->spi->irq); + + return IRQ_HANDLED; +} + +static const struct iio_ring_setup_ops ad7793_ring_setup_ops = { + .preenable = &ad7793_ring_preenable, + .postenable = &iio_triggered_ring_postenable, + .predisable = &iio_triggered_ring_predisable, + .postdisable = &ad7793_ring_postdisable, +}; + +static int ad7793_register_ring_funcs_and_init(struct iio_dev *indio_dev) +{ + int ret; + + indio_dev->ring = iio_sw_rb_allocate(indio_dev); + if (!indio_dev->ring) { + ret = -ENOMEM; + goto error_ret; + } + /* Effectively select the ring buffer implementation */ + indio_dev->ring->access = &ring_sw_access_funcs; + indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time, + &ad7793_trigger_handler, + IRQF_ONESHOT, + indio_dev, + "ad7793_consumer%d", + indio_dev->id); + if (indio_dev->pollfunc == NULL) { + ret = -ENOMEM; + goto error_deallocate_sw_rb; + } + + /* Ring buffer functions - here trigger setup related */ + indio_dev->ring->setup_ops = &ad7793_ring_setup_ops; + + /* Flag that polled ring buffering is possible */ + indio_dev->modes |= INDIO_RING_TRIGGERED; + return 0; + +error_deallocate_sw_rb: + iio_sw_rb_free(indio_dev->ring); +error_ret: + return ret; +} + +static void ad7793_ring_cleanup(struct iio_dev *indio_dev) +{ + /* ensure that the trigger has been detached */ + if (indio_dev->trig) { + iio_put_trigger(indio_dev->trig); + iio_trigger_dettach_poll_func(indio_dev->trig, + indio_dev->pollfunc); + } + iio_dealloc_pollfunc(indio_dev->pollfunc); + iio_sw_rb_free(indio_dev->ring); +} + +/** + * ad7793_data_rdy_trig_poll() the event handler for the data rdy trig + **/ +static irqreturn_t ad7793_data_rdy_trig_poll(int irq, void *private) +{ + struct ad7793_state *st = iio_priv(private); + + st->done = true; + wake_up_interruptible(&st->wq_data_avail); + disable_irq_nosync(irq); + st->irq_dis = true; + iio_trigger_poll(st->trig, iio_get_time_ns()); + + return IRQ_HANDLED; +} + +static int ad7793_probe_trigger(struct iio_dev *indio_dev) +{ + struct ad7793_state *st = iio_priv(indio_dev); + int ret; + + st->trig = iio_allocate_trigger("%s-dev%d", + spi_get_device_id(st->spi)->name, + indio_dev->id); + if (st->trig == NULL) { + ret = -ENOMEM; + goto error_ret; + } + + ret = request_irq(st->spi->irq, + ad7793_data_rdy_trig_poll, + IRQF_TRIGGER_LOW, + spi_get_device_id(st->spi)->name, + indio_dev); + if (ret) + goto error_free_trig; + + disable_irq_nosync(st->spi->irq); + st->irq_dis = true; + st->trig->dev.parent = &st->spi->dev; + st->trig->owner = THIS_MODULE; + st->trig->private_data = indio_dev; + + ret = iio_trigger_register(st->trig); + + /* select default trigger */ + indio_dev->trig = st->trig; + if (ret) + goto error_free_irq; + + return 0; + +error_free_irq: + free_irq(st->spi->irq, indio_dev); +error_free_trig: + iio_free_trigger(st->trig); +error_ret: + return ret; +} + +static void ad7793_remove_trigger(struct iio_dev *indio_dev) +{ + struct ad7793_state *st = iio_priv(indio_dev); + + iio_trigger_unregister(st->trig); + free_irq(st->spi->irq, indio_dev); + iio_free_trigger(st->trig); +} + +static const u16 sample_freq_avail[16] = {0, 470, 242, 123, 62, 50, 39, 33, 19, + 17, 16, 12, 10, 8, 6, 4}; + +static ssize_t ad7793_read_frequency(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad7793_state *st = iio_priv(indio_dev); + + return sprintf(buf, "%d\n", + sample_freq_avail[AD7793_MODE_RATE(st->mode)]); +} + +static ssize_t ad7793_write_frequency(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t len) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad7793_state *st = iio_priv(indio_dev); + long lval; + int i, ret; + + mutex_lock(&indio_dev->mlock); + if (iio_ring_enabled(indio_dev)) { + mutex_unlock(&indio_dev->mlock); + return -EBUSY; + } + mutex_unlock(&indio_dev->mlock); + + ret = strict_strtol(buf, 10, &lval); + if (ret) + return ret; + + ret = -EINVAL; + + for (i = 0; i < ARRAY_SIZE(sample_freq_avail); i++) + if (lval == sample_freq_avail[i]) { + mutex_lock(&indio_dev->mlock); + st->mode &= ~AD7793_MODE_RATE(-1); + st->mode |= AD7793_MODE_RATE(i); + ad7793_write_reg(st, AD7793_REG_MODE, + sizeof(st->mode), st->mode); + mutex_unlock(&indio_dev->mlock); + ret = 0; + } + + return ret ? ret : len; +} + +static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, + ad7793_read_frequency, + ad7793_write_frequency); + +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( + "470 242 123 62 50 39 33 19 17 16 12 10 8 6 4"); + +static ssize_t ad7793_show_scale_available(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad7793_state *st = iio_priv(indio_dev); + int i, len = 0; + + for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) + len += sprintf(buf + len, "%d.%09u ", st->scale_avail[i][0], + st->scale_avail[i][1]); + + len += sprintf(buf + len, "\n"); + + return len; +} + +static IIO_DEVICE_ATTR_NAMED(in_m_in_scale_available, in-in_scale_available, + S_IRUGO, ad7793_show_scale_available, NULL, 0); + +static struct attribute *ad7793_attributes[] = { + &iio_dev_attr_sampling_frequency.dev_attr.attr, + &iio_const_attr_sampling_frequency_available.dev_attr.attr, + &iio_dev_attr_in_m_in_scale_available.dev_attr.attr, + NULL +}; + +static const struct attribute_group ad7793_attribute_group = { + .attrs = ad7793_attributes, +}; + +static int ad7793_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, + int *val2, + long m) +{ + struct ad7793_state *st = iio_priv(indio_dev); + int ret, smpl = 0; + unsigned long long scale_uv; + bool unipolar = !!(st->conf & AD7793_CONF_UNIPOLAR); + + switch (m) { + case 0: + mutex_lock(&indio_dev->mlock); + if (iio_ring_enabled(indio_dev)) + ret = ad7793_scan_from_ring(st, + chan->scan_index, &smpl); + else + ret = ad7793_read(st, chan->address, + chan->scan_type.realbits / 8, &smpl); + mutex_unlock(&indio_dev->mlock); + + if (ret < 0) + return ret; + + *val = (smpl >> chan->scan_type.shift) & + ((1 << (chan->scan_type.realbits)) - 1); + + if (!unipolar) + *val -= (1 << (chan->scan_type.realbits - 1)); + + return IIO_VAL_INT; + + case (1 << IIO_CHAN_INFO_SCALE_SHARED): + *val = st->scale_avail[(st->conf >> 8) & 0x7][0]; + *val2 = st->scale_avail[(st->conf >> 8) & 0x7][1]; + + return IIO_VAL_INT_PLUS_NANO; + + case (1 << IIO_CHAN_INFO_SCALE_SEPARATE): + switch (chan->type) { + case IIO_IN: + /* 1170mV / 2^23 * 6 */ + scale_uv = (1170ULL * 100000000ULL * 6ULL) + >> (chan->scan_type.realbits - + (unipolar ? 0 : 1)); + break; + case IIO_TEMP: + /* Always uses unity gain and internal ref */ + scale_uv = (2500ULL * 100000000ULL) + >> (chan->scan_type.realbits - + (unipolar ? 0 : 1)); + break; + default: + return -EINVAL; + } + + *val2 = do_div(scale_uv, 100000000) * 10; + *val = scale_uv; + + return IIO_VAL_INT_PLUS_NANO; + } + return -EINVAL; +} + +static int ad7793_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, + int val2, + long mask) +{ + struct ad7793_state *st = iio_priv(indio_dev); + int ret, i; + unsigned int tmp; + + mutex_lock(&indio_dev->mlock); + if (iio_ring_enabled(indio_dev)) { + mutex_unlock(&indio_dev->mlock); + return -EBUSY; + } + + switch (mask) { + case (1 << IIO_CHAN_INFO_SCALE_SHARED): + ret = -EINVAL; + for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) + if (val2 == st->scale_avail[i][1]) { + tmp = st->conf; + st->conf &= ~AD7793_CONF_GAIN(-1); + st->conf |= AD7793_CONF_GAIN(i); + + if (tmp != st->conf) { + ad7793_write_reg(st, AD7793_REG_CONF, + sizeof(st->conf), + st->conf); + ad7793_calibrate_all(st); + } + ret = 0; + } + + default: + ret = -EINVAL; + } + + mutex_unlock(&indio_dev->mlock); + return ret; +} + +static int ad7793_validate_trigger(struct iio_dev *indio_dev, + struct iio_trigger *trig) +{ + if (indio_dev->trig != trig) + return -EINVAL; + + return 0; +} + +static int ad7793_write_raw_get_fmt(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + long mask) +{ + return IIO_VAL_INT_PLUS_NANO; +} + +static const struct iio_info ad7793_info = { + .read_raw = &ad7793_read_raw, + .write_raw = &ad7793_write_raw, + .write_raw_get_fmt = &ad7793_write_raw_get_fmt, + .attrs = &ad7793_attribute_group, + .validate_trigger = ad7793_validate_trigger, + .driver_module = THIS_MODULE, +}; + +static const struct ad7793_chip_info ad7793_chip_info_tbl[] = { + [ID_AD7793] = { + .channel[0] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN1P_AIN1M, + 0, IIO_ST('s', 24, 32, 0), 0), + .channel[1] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 1, 1, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN2P_AIN2M, + 1, IIO_ST('s', 24, 32, 0), 0), + .channel[2] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 2, 2, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN3P_AIN3M, + 2, IIO_ST('s', 24, 32, 0), 0), + .channel[3] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, "shorted", 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN1M_AIN1M, + 3, IIO_ST('s', 24, 32, 0), 0), + .channel[4] = IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SEPARATE), + AD7793_CH_TEMP, + 4, IIO_ST('s', 24, 32, 0), 0), + .channel[5] = IIO_CHAN(IIO_IN, 0, 1, 0, "supply", 4, 0, + (1 << IIO_CHAN_INFO_SCALE_SEPARATE), + AD7793_CH_AVDD_MONITOR, + 5, IIO_ST('s', 24, 32, 0), 0), + .channel[6] = IIO_CHAN_SOFT_TIMESTAMP(6), + }, + [ID_AD7792] = { + .channel[0] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN1P_AIN1M, + 0, IIO_ST('s', 16, 32, 0), 0), + .channel[1] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 1, 1, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN2P_AIN2M, + 1, IIO_ST('s', 16, 32, 0), 0), + .channel[2] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, NULL, 2, 2, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN3P_AIN3M, + 2, IIO_ST('s', 16, 32, 0), 0), + .channel[3] = IIO_CHAN(IIO_IN_DIFF, 0, 1, 0, "shorted", 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD7793_CH_AIN1M_AIN1M, + 3, IIO_ST('s', 16, 32, 0), 0), + .channel[4] = IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SEPARATE), + AD7793_CH_TEMP, + 4, IIO_ST('s', 16, 32, 0), 0), + .channel[5] = IIO_CHAN(IIO_IN, 0, 1, 0, "supply", 4, 0, + (1 << IIO_CHAN_INFO_SCALE_SEPARATE), + AD7793_CH_AVDD_MONITOR, + 5, IIO_ST('s', 16, 32, 0), 0), + .channel[6] = IIO_CHAN_SOFT_TIMESTAMP(6), + }, +}; + +static int __devinit ad7793_probe(struct spi_device *spi) +{ + struct ad7793_platform_data *pdata = spi->dev.platform_data; + struct ad7793_state *st; + struct iio_dev *indio_dev; + int ret, i, voltage_uv = 0, regdone = 0; + + if (!pdata) { + dev_err(&spi->dev, "no platform data?\n"); + return -ENODEV; + } + + if (!spi->irq) { + dev_err(&spi->dev, "no IRQ?\n"); + return -ENODEV; + } + + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) + return -ENOMEM; + + st = iio_priv(indio_dev); + + st->reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(st->reg)) { + ret = regulator_enable(st->reg); + if (ret) + goto error_put_reg; + + voltage_uv = regulator_get_voltage(st->reg); + } + + st->chip_info = + &ad7793_chip_info_tbl[spi_get_device_id(spi)->driver_data]; + + st->pdata = pdata; + + if (pdata && pdata->vref_mv) + st->int_vref_mv = pdata->vref_mv; + else if (voltage_uv) + st->int_vref_mv = voltage_uv / 1000; + else + st->int_vref_mv = 2500; /* Build-in ref */ + + spi_set_drvdata(spi, indio_dev); + st->spi = spi; + + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = st->chip_info->channel; + indio_dev->available_scan_masks = st->available_scan_masks; + indio_dev->num_channels = 7; + indio_dev->info = &ad7793_info; + + for (i = 0; i < indio_dev->num_channels; i++) + st->available_scan_masks[i] = (1 << i) | (1 << + indio_dev->channels[indio_dev->num_channels - 1]. + scan_index); + + init_waitqueue_head(&st->wq_data_avail); + + ret = ad7793_register_ring_funcs_and_init(indio_dev); + if (ret) + goto error_disable_reg; + + ret = iio_device_register(indio_dev); + if (ret) + goto error_unreg_ring; + regdone = 1; + + ret = ad7793_probe_trigger(indio_dev); + if (ret) + goto error_unreg_ring; + + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, + indio_dev->channels, + indio_dev->num_channels); + if (ret) + goto error_remove_trigger; + + ret = ad7793_setup(st); + if (ret) + goto error_uninitialize_ring; + + return 0; + +error_uninitialize_ring: + iio_ring_buffer_unregister(indio_dev->ring); +error_remove_trigger: + ad7793_remove_trigger(indio_dev); +error_unreg_ring: + ad7793_ring_cleanup(indio_dev); +error_disable_reg: + if (!IS_ERR(st->reg)) + regulator_disable(st->reg); +error_put_reg: + if (!IS_ERR(st->reg)) + regulator_put(st->reg); + + if (regdone) + iio_device_unregister(indio_dev); + else + iio_free_device(indio_dev); + + return ret; +} + +static int ad7793_remove(struct spi_device *spi) +{ + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad7793_state *st = iio_priv(indio_dev); + + iio_ring_buffer_unregister(indio_dev->ring); + ad7793_remove_trigger(indio_dev); + ad7793_ring_cleanup(indio_dev); + + if (!IS_ERR(st->reg)) { + regulator_disable(st->reg); + regulator_put(st->reg); + } + + iio_device_unregister(indio_dev); + + return 0; +} + +static const struct spi_device_id ad7793_id[] = { + {"ad7792", ID_AD7792}, + {"ad7793", ID_AD7793}, + {} +}; + +static struct spi_driver ad7793_driver = { + .driver = { + .name = "ad7793", + .bus = &spi_bus_type, + .owner = THIS_MODULE, + }, + .probe = ad7793_probe, + .remove = __devexit_p(ad7793_remove), + .id_table = ad7793_id, +}; + +static int __init ad7793_init(void) +{ + return spi_register_driver(&ad7793_driver); +} +module_init(ad7793_init); + +static void __exit ad7793_exit(void) +{ + spi_unregister_driver(&ad7793_driver); +} +module_exit(ad7793_exit); + +MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); +MODULE_DESCRIPTION("Analog Devices AD7792/3 ADC"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/staging/iio/adc/ad7793.h b/drivers/staging/iio/adc/ad7793.h new file mode 100644 index 000000000000..64f7d41dc453 --- /dev/null +++ b/drivers/staging/iio/adc/ad7793.h @@ -0,0 +1,107 @@ +/* + * AD7792/AD7793 SPI ADC driver + * + * Copyright 2011 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ +#ifndef IIO_ADC_AD7793_H_ +#define IIO_ADC_AD7793_H_ + +/* + * TODO: struct ad7793_platform_data needs to go into include/linux/iio + */ + +/* Registers */ +#define AD7793_REG_COMM 0 /* Communications Register (WO, 8-bit) */ +#define AD7793_REG_STAT 0 /* Status Register (RO, 8-bit) */ +#define AD7793_REG_MODE 1 /* Mode Register (RW, 16-bit */ +#define AD7793_REG_CONF 2 /* Configuration Register (RW, 16-bit) */ +#define AD7793_REG_DATA 3 /* Data Register (RO, 16-/24-bit) */ +#define AD7793_REG_ID 4 /* ID Register (RO, 8-bit) */ +#define AD7793_REG_IO 5 /* IO Register (RO, 8-bit) */ +#define AD7793_REG_OFFSET 6 /* Offset Register (RW, 16-bit + * (AD7792)/24-bit (AD7793)) */ +#define AD7793_REG_FULLSALE 7 /* Full-Scale Register + * (RW, 16-bit (AD7792)/24-bit (AD7793)) */ + +/* Communications Register Bit Designations (AD7793_REG_COMM) */ +#define AD7793_COMM_WEN (1 << 7) /* Write Enable */ +#define AD7793_COMM_WRITE (0 << 6) /* Write Operation */ +#define AD7793_COMM_READ (1 << 6) /* Read Operation */ +#define AD7793_COMM_ADDR(x) (((x) & 0x7) << 3) /* Register Address */ +#define AD7793_COMM_CREAD (1 << 2) /* Continuous Read of Data Register */ + +/* Status Register Bit Designations (AD7793_REG_STAT) */ +#define AD7793_STAT_RDY (1 << 7) /* Ready */ +#define AD7793_STAT_ERR (1 << 6) /* Error (Overrange, Underrange) */ +#define AD7793_STAT_CH3 (1 << 2) /* Channel 3 */ +#define AD7793_STAT_CH2 (1 << 1) /* Channel 2 */ +#define AD7793_STAT_CH1 (1 << 0) /* Channel 1 */ + +/* Mode Register Bit Designations (AD7793_REG_MODE) */ +#define AD7793_MODE_SEL(x) (((x) & 0x7) << 13) /* Operation Mode Select */ +#define AD7793_MODE_CLKSRC(x) (((x) & 0x3) << 6) /* ADC Clock Source Select */ +#define AD7793_MODE_RATE(x) ((x) & 0xF) /* Filter Update Rate Select */ + +#define AD7793_MODE_CONT 0 /* Continuous Conversion Mode */ +#define AD7793_MODE_SINGLE 1 /* Single Conversion Mode */ +#define AD7793_MODE_IDLE 2 /* Idle Mode */ +#define AD7793_MODE_PWRDN 3 /* Power-Down Mode */ +#define AD7793_MODE_CAL_INT_ZERO 4 /* Internal Zero-Scale Calibration */ +#define AD7793_MODE_CAL_INT_FULL 5 /* Internal Full-Scale Calibration */ +#define AD7793_MODE_CAL_SYS_ZERO 6 /* System Zero-Scale Calibration */ +#define AD7793_MODE_CAL_SYS_FULL 7 /* System Full-Scale Calibration */ + +#define AD7793_CLK_INT 0 /* Internal 64 kHz Clock not + * available at the CLK pin */ +#define AD7793_CLK_INT_CO 1 /* Internal 64 kHz Clock available + * at the CLK pin */ +#define AD7793_CLK_EXT 2 /* External 64 kHz Clock */ +#define AD7793_CLK_EXT_DIV2 3 /* External Clock divided by 2 */ + +/* Configuration Register Bit Designations (AD7793_REG_CONF) */ +#define AD7793_CONF_VBIAS(x) (((x) & 0x3) << 14) /* Bias Voltage + * Generator Enable */ +#define AD7793_CONF_BO_EN (1 << 13) /* Burnout Current Enable */ +#define AD7793_CONF_UNIPOLAR (1 << 12) /* Unipolar/Bipolar Enable */ +#define AD7793_CONF_BOOST (1 << 11) /* Boost Enable */ +#define AD7793_CONF_GAIN(x) (((x) & 0x7) << 8) /* Gain Select */ +#define AD7793_CONF_REFSEL (1 << 7) /* INT/EXT Reference Select */ +#define AD7793_CONF_BUF (1 << 4) /* Buffered Mode Enable */ +#define AD7793_CONF_CHAN(x) ((x) & 0x7) /* Channel select */ + +#define AD7793_CH_AIN1P_AIN1M 0 /* AIN1(+) - AIN1(-) */ +#define AD7793_CH_AIN2P_AIN2M 1 /* AIN2(+) - AIN2(-) */ +#define AD7793_CH_AIN3P_AIN3M 2 /* AIN3(+) - AIN3(-) */ +#define AD7793_CH_AIN1M_AIN1M 3 /* AIN1(-) - AIN1(-) */ +#define AD7793_CH_TEMP 6 /* Temp Sensor */ +#define AD7793_CH_AVDD_MONITOR 7 /* AVDD Monitor */ + +/* ID Register Bit Designations (AD7793_REG_ID) */ +#define AD7792_ID 0xA +#define AD7793_ID 0xB +#define AD7793_ID_MASK 0xF + +/* IO (Excitation Current Sources) Register Bit Designations (AD7793_REG_IO) */ +#define AD7793_IO_IEXC1_IOUT1_IEXC2_IOUT2 0 /* IEXC1 connect to IOUT1, + * IEXC2 connect to IOUT2 */ +#define AD7793_IO_IEXC1_IOUT2_IEXC2_IOUT1 1 /* IEXC1 connect to IOUT2, + * IEXC2 connect to IOUT1 */ +#define AD7793_IO_IEXC1_IEXC2_IOUT1 2 /* Both current sources + * IEXC1,2 connect to IOUT1 */ +#define AD7793_IO_IEXC1_IEXC2_IOUT2 3 /* Both current sources + * IEXC1,2 connect to IOUT2 */ + +#define AD7793_IO_IXCEN_10uA (1 << 0) /* Excitation Current 10uA */ +#define AD7793_IO_IXCEN_210uA (2 << 0) /* Excitation Current 210uA */ +#define AD7793_IO_IXCEN_1mA (3 << 0) /* Excitation Current 1mA */ + +struct ad7793_platform_data { + u16 vref_mv; + u16 mode; + u16 conf; + u8 io; +}; + +#endif /* IIO_ADC_AD7793_H_ */ diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c index 11379e469b07..0c84217bde3d 100644 --- a/drivers/staging/iio/adc/ad7816.c +++ b/drivers/staging/iio/adc/ad7816.c @@ -43,7 +43,6 @@ struct ad7816_chip_info { struct spi_device *spi_dev; - struct iio_dev *indio_dev; u16 rdwr_pin; u16 convert_pin; u16 busy_pin; @@ -113,7 +112,7 @@ static ssize_t ad7816_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); if (chip->mode) return sprintf(buf, "power-save\n"); @@ -127,7 +126,7 @@ static ssize_t ad7816_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); if (strcmp(buf, "full")) { gpio_set_value(chip->rdwr_pin, 1); @@ -159,7 +158,7 @@ static ssize_t ad7816_show_channel(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", chip->channel_id); } @@ -170,7 +169,7 @@ static ssize_t ad7816_store_channel(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; @@ -208,7 +207,7 @@ static ssize_t ad7816_show_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); u16 data; s8 value; int ret; @@ -265,7 +264,7 @@ static ssize_t ad7816_show_oti(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); int value; if (chip->channel_id > AD7816_CS_MAX) { @@ -286,7 +285,7 @@ static inline ssize_t ad7816_set_oti(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad7816_chip_info *chip = dev_info->dev_data; + struct ad7816_chip_info *chip = iio_priv(dev_info); long value; u8 data; int ret; @@ -345,6 +344,7 @@ static const struct iio_info ad7816_info = { static int __devinit ad7816_probe(struct spi_device *spi_dev) { struct ad7816_chip_info *chip; + struct iio_dev *indio_dev; unsigned short *pins = spi_dev->dev.platform_data; int ret = 0; int i; @@ -354,13 +354,14 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) return -EINVAL; } - chip = kzalloc(sizeof(struct ad7816_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - dev_set_drvdata(&spi_dev->dev, chip); + dev_set_drvdata(&spi_dev->dev, indio_dev); chip->spi_dev = spi_dev; for (i = 0; i <= AD7816_CS_MAX; i++) @@ -373,7 +374,7 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) if (ret) { dev_err(&spi_dev->dev, "Fail to request rdwr gpio PIN %d.\n", chip->rdwr_pin); - goto error_free_chip; + goto error_free_device; } gpio_direction_input(chip->rdwr_pin); ret = gpio_request(chip->convert_pin, spi_get_device_id(spi_dev)->name); @@ -391,20 +392,14 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) } gpio_direction_input(chip->busy_pin); - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_gpio; - } - chip->indio_dev->name = spi_get_device_id(spi_dev)->name; - chip->indio_dev->dev.parent = &spi_dev->dev; - chip->indio_dev->info = &ad7816_info; - chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi_get_device_id(spi_dev)->name; + indio_dev->dev.parent = &spi_dev->dev; + indio_dev->info = &ad7816_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) - goto error_free_dev; + goto error_free_gpio; if (spi_dev->irq) { /* Only low trigger is supported in ad7816/7/8 */ @@ -412,47 +407,44 @@ static int __devinit ad7816_probe(struct spi_device *spi_dev) NULL, &ad7816_event_handler, IRQF_TRIGGER_LOW, - chip->indio_dev->name, - chip->indio_dev); + indio_dev->name, + indio_dev); if (ret) goto error_unreg_dev; } dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n", - chip->indio_dev->name); + indio_dev->name); return 0; error_unreg_dev: - iio_device_unregister(chip->indio_dev); -error_free_dev: - iio_free_device(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_gpio: gpio_free(chip->busy_pin); error_free_gpio_convert: gpio_free(chip->convert_pin); error_free_gpio_rdwr: gpio_free(chip->rdwr_pin); -error_free_chip: - kfree(chip); - +error_free_device: + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit ad7816_remove(struct spi_device *spi_dev) { - struct ad7816_chip_info *chip = dev_get_drvdata(&spi_dev->dev); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev); + struct ad7816_chip_info *chip = iio_priv(indio_dev); dev_set_drvdata(&spi_dev->dev, NULL); if (spi_dev->irq) free_irq(spi_dev->irq, indio_dev); - iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); gpio_free(chip->busy_pin); gpio_free(chip->convert_pin); gpio_free(chip->rdwr_pin); - kfree(chip); + iio_device_unregister(indio_dev); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/adc/ad7887_core.c b/drivers/staging/iio/adc/ad7887_core.c index de14b174cef7..3d9121e5c37d 100644 --- a/drivers/staging/iio/adc/ad7887_core.c +++ b/drivers/staging/iio/adc/ad7887_core.c @@ -37,7 +37,7 @@ static int ad7887_read_raw(struct iio_dev *dev_info, long m) { int ret; - struct ad7887_state *st = dev_info->dev_data; + struct ad7887_state *st = iio_priv(dev_info); unsigned int scale_uv; switch (m) { @@ -118,7 +118,6 @@ static int __devinit ad7887_probe(struct spi_device *spi) /* Estabilish that the iio_dev is a child of the spi device */ indio_dev->dev.parent = &spi->dev; indio_dev->name = spi_get_device_id(spi)->name; - indio_dev->dev_data = (void *)(st); indio_dev->info = &ad7887_info; indio_dev->modes = INDIO_DIRECT_MODE; diff --git a/drivers/staging/iio/adc/ad7887_ring.c b/drivers/staging/iio/adc/ad7887_ring.c index 0e4a5f4fd892..0ac7c0b9d71d 100644 --- a/drivers/staging/iio/adc/ad7887_ring.c +++ b/drivers/staging/iio/adc/ad7887_ring.c @@ -64,7 +64,7 @@ error_ret: **/ static int ad7887_ring_preenable(struct iio_dev *indio_dev) { - struct ad7887_state *st = indio_dev->dev_data; + struct ad7887_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; st->d_size = ring->scan_count * @@ -100,7 +100,7 @@ static int ad7887_ring_preenable(struct iio_dev *indio_dev) static int ad7887_ring_postdisable(struct iio_dev *indio_dev) { - struct ad7887_state *st = indio_dev->dev_data; + struct ad7887_state *st = iio_priv(indio_dev); /* dummy read: restore default CH0 settin */ return spi_sync(st->spi, &st->msg[AD7887_CH0]); @@ -116,7 +116,7 @@ static irqreturn_t ad7887_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct ad7887_state *st = iio_dev_get_devdata(indio_dev); + struct ad7887_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; s64 time_ns; __u8 *buf; diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c index 29bfbcf82064..92cfe2e3ea4a 100644 --- a/drivers/staging/iio/adc/ad799x_core.c +++ b/drivers/staging/iio/adc/ad799x_core.c @@ -143,7 +143,7 @@ static int ad799x_read_raw(struct iio_dev *dev_info, long m) { int ret; - struct ad799x_state *st = dev_info->dev_data; + struct ad799x_state *st = iio_priv(dev_info); unsigned int scale_uv; switch (m) { @@ -176,7 +176,7 @@ static ssize_t ad799x_read_frequency(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad799x_state *st = iio_dev_get_devdata(dev_info); + struct ad799x_state *st = iio_priv(dev_info); int ret, len = 0; u8 val; @@ -221,7 +221,7 @@ static ssize_t ad799x_write_frequency(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad799x_state *st = iio_dev_get_devdata(dev_info); + struct ad799x_state *st = iio_priv(dev_info); long val; int ret; @@ -281,7 +281,7 @@ static ssize_t ad799x_read_channel_config(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad799x_state *st = iio_dev_get_devdata(dev_info); + struct ad799x_state *st = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret; @@ -299,7 +299,7 @@ static ssize_t ad799x_write_channel_config(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad799x_state *st = iio_dev_get_devdata(dev_info); + struct ad799x_state *st = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); long val; @@ -319,7 +319,7 @@ static ssize_t ad799x_write_channel_config(struct device *dev, static irqreturn_t ad799x_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct ad799x_state *st = iio_dev_get_devdata(private); + struct ad799x_state *st = iio_priv(private); u8 status; int i, ret; @@ -686,7 +686,6 @@ static int __devinit ad799x_probe(struct i2c_client *client, indio_dev->name = id->name; indio_dev->info = st->chip_info->info; indio_dev->name = id->name; - indio_dev->dev_data = (void *)(st); indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = st->chip_info->channel; diff --git a/drivers/staging/iio/adc/ad799x_ring.c b/drivers/staging/iio/adc/ad799x_ring.c index 1ae8857b3d25..0376a826c26c 100644 --- a/drivers/staging/iio/adc/ad799x_ring.c +++ b/drivers/staging/iio/adc/ad799x_ring.c @@ -72,7 +72,7 @@ error_ret: static int ad799x_ring_preenable(struct iio_dev *indio_dev) { struct iio_ring_buffer *ring = indio_dev->ring; - struct ad799x_state *st = iio_dev_get_devdata(indio_dev); + struct ad799x_state *st = iio_priv(indio_dev); /* * Need to figure out the current mode based upon the requested @@ -109,7 +109,7 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct ad799x_state *st = iio_dev_get_devdata(indio_dev); + struct ad799x_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; s64 time_ns; __u8 *rxbuf; diff --git a/drivers/staging/iio/adc/adt7310.c b/drivers/staging/iio/adc/adt7310.c index 68eca0b99ac0..1a41b8034405 100644 --- a/drivers/staging/iio/adc/adt7310.c +++ b/drivers/staging/iio/adc/adt7310.c @@ -80,7 +80,6 @@ struct adt7310_chip_info { struct spi_device *spi_dev; - struct iio_dev *indio_dev; u8 config; }; @@ -176,7 +175,7 @@ static ssize_t adt7310_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u8 config; config = chip->config & ADT7310_MODE_MASK; @@ -199,7 +198,7 @@ static ssize_t adt7310_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u16 config; int ret; @@ -243,7 +242,7 @@ static ssize_t adt7310_show_resolution(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); int ret; int bits; @@ -265,7 +264,7 @@ static ssize_t adt7310_store_resolution(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); unsigned long data; u16 config; int ret; @@ -301,7 +300,7 @@ static ssize_t adt7310_show_id(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u8 id; int ret; @@ -351,7 +350,7 @@ static ssize_t adt7310_show_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u8 status; u16 data; int ret, i = 0; @@ -390,7 +389,7 @@ static const struct attribute_group adt7310_attribute_group = { static irqreturn_t adt7310_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct adt7310_chip_info *chip = iio_dev_get_devdata(indio_dev); + struct adt7310_chip_info *chip = iio_priv(indio_dev); s64 timestamp = iio_get_time_ns(); u8 status; int ret; @@ -425,7 +424,7 @@ static ssize_t adt7310_show_event_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); int ret; ret = adt7310_spi_read_byte(chip, ADT7310_CONFIG, &chip->config); @@ -444,7 +443,7 @@ static ssize_t adt7310_set_event_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u16 config; int ret; @@ -477,7 +476,7 @@ static ssize_t adt7310_show_fault_queue(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); int ret; ret = adt7310_spi_read_byte(chip, ADT7310_CONFIG, &chip->config); @@ -493,7 +492,7 @@ static ssize_t adt7310_set_fault_queue(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; u8 config; @@ -523,7 +522,7 @@ static inline ssize_t adt7310_show_t_bound(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); u16 data; int ret; @@ -541,7 +540,7 @@ static inline ssize_t adt7310_set_t_bound(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); long tmp1, tmp2; u16 data; char *pos; @@ -661,7 +660,7 @@ static ssize_t adt7310_show_t_hyst(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); int ret; u8 t_hyst; @@ -678,7 +677,7 @@ static inline ssize_t adt7310_set_t_hyst(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7310_chip_info *chip = dev_info->dev_data; + struct adt7310_chip_info *chip = iio_priv(dev_info); int ret; unsigned long data; u8 t_hyst; @@ -760,33 +759,28 @@ static const struct iio_info adt7310_info = { static int __devinit adt7310_probe(struct spi_device *spi_dev) { struct adt7310_chip_info *chip; + struct iio_dev *indio_dev; int ret = 0; unsigned long *adt7310_platform_data = spi_dev->dev.platform_data; unsigned long irq_flags; - chip = kzalloc(sizeof(struct adt7310_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - dev_set_drvdata(&spi_dev->dev, chip); + dev_set_drvdata(&spi_dev->dev, indio_dev); chip->spi_dev = spi_dev; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - - chip->indio_dev->dev.parent = &spi_dev->dev; - chip->indio_dev->name = spi_get_device_id(spi_dev)->name; - chip->indio_dev->info = &adt7310_info; - chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi_dev->dev; + indio_dev->name = spi_get_device_id(spi_dev)->name; + indio_dev->info = &adt7310_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -800,8 +794,8 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) NULL, &adt7310_event_handler, irq_flags, - chip->indio_dev->name, - chip->indio_dev); + indio_dev->name, + indio_dev); if (ret) goto error_unreg_dev; } @@ -812,8 +806,8 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) NULL, &adt7310_event_handler, adt7310_platform_data[1], - chip->indio_dev->name, - chip->indio_dev); + indio_dev->name, + indio_dev); if (ret) goto error_unreg_ct_irq; } @@ -841,38 +835,34 @@ static int __devinit adt7310_probe(struct spi_device *spi_dev) } dev_info(&spi_dev->dev, "%s temperature sensor registered.\n", - chip->indio_dev->name); + indio_dev->name); return 0; error_unreg_int_irq: - free_irq(adt7310_platform_data[0], chip->indio_dev); + free_irq(adt7310_platform_data[0], indio_dev); error_unreg_ct_irq: - free_irq(spi_dev->irq, chip->indio_dev); + free_irq(spi_dev->irq, indio_dev); error_unreg_dev: - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit adt7310_remove(struct spi_device *spi_dev) { - struct adt7310_chip_info *chip = dev_get_drvdata(&spi_dev->dev); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev); unsigned long *adt7310_platform_data = spi_dev->dev.platform_data; dev_set_drvdata(&spi_dev->dev, NULL); if (adt7310_platform_data[0]) - free_irq(adt7310_platform_data[0], chip->indio_dev); + free_irq(adt7310_platform_data[0], indio_dev); if (spi_dev->irq) - free_irq(spi_dev->irq, chip->indio_dev); + free_irq(spi_dev->irq, indio_dev); iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/adc/adt7410.c b/drivers/staging/iio/adc/adt7410.c index c40a84f9c2ff..76aa0639a55a 100644 --- a/drivers/staging/iio/adc/adt7410.c +++ b/drivers/staging/iio/adc/adt7410.c @@ -75,7 +75,6 @@ struct adt7410_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; u8 config; }; @@ -144,7 +143,7 @@ static ssize_t adt7410_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u8 config; config = chip->config & ADT7410_MODE_MASK; @@ -167,7 +166,7 @@ static ssize_t adt7410_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u16 config; int ret; @@ -211,7 +210,7 @@ static ssize_t adt7410_show_resolution(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); int ret; int bits; @@ -233,7 +232,7 @@ static ssize_t adt7410_store_resolution(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); unsigned long data; u16 config; int ret; @@ -269,7 +268,7 @@ static ssize_t adt7410_show_id(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u8 id; int ret; @@ -319,7 +318,7 @@ static ssize_t adt7410_show_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u8 status; u16 data; int ret, i = 0; @@ -358,7 +357,7 @@ static const struct attribute_group adt7410_attribute_group = { static irqreturn_t adt7410_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct adt7410_chip_info *chip = iio_dev_get_devdata(indio_dev); + struct adt7410_chip_info *chip = iio_priv(indio_dev); s64 timestamp = iio_get_time_ns(); u8 status; @@ -392,7 +391,7 @@ static ssize_t adt7410_show_event_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); int ret; ret = adt7410_i2c_read_byte(chip, ADT7410_CONFIG, &chip->config); @@ -411,7 +410,7 @@ static ssize_t adt7410_set_event_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u16 config; int ret; @@ -444,7 +443,7 @@ static ssize_t adt7410_show_fault_queue(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); int ret; ret = adt7410_i2c_read_byte(chip, ADT7410_CONFIG, &chip->config); @@ -460,7 +459,7 @@ static ssize_t adt7410_set_fault_queue(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; u8 config; @@ -490,7 +489,7 @@ static inline ssize_t adt7410_show_t_bound(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); u16 data; int ret; @@ -508,7 +507,7 @@ static inline ssize_t adt7410_set_t_bound(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); long tmp1, tmp2; u16 data; char *pos; @@ -628,7 +627,7 @@ static ssize_t adt7410_show_t_hyst(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); int ret; u8 t_hyst; @@ -645,7 +644,7 @@ static inline ssize_t adt7410_set_t_hyst(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7410_chip_info *chip = dev_info->dev_data; + struct adt7410_chip_info *chip = iio_priv(dev_info); int ret; unsigned long data; u8 t_hyst; @@ -728,31 +727,27 @@ static int __devinit adt7410_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct adt7410_chip_info *chip; + struct iio_dev *indio_dev; int ret = 0; unsigned long *adt7410_platform_data = client->dev.platform_data; - chip = kzalloc(sizeof(struct adt7410_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - chip->indio_dev->name = id->name; - chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->info = &adt7410_info; - chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &adt7410_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -763,7 +758,7 @@ static int __devinit adt7410_probe(struct i2c_client *client, &adt7410_event_handler, IRQF_TRIGGER_LOW, id->name, - chip->indio_dev); + indio_dev); if (ret) goto error_unreg_dev; } @@ -775,7 +770,7 @@ static int __devinit adt7410_probe(struct i2c_client *client, &adt7410_event_handler, adt7410_platform_data[1], id->name, - chip->indio_dev); + indio_dev); if (ret) goto error_unreg_ct_irq; } @@ -809,32 +804,27 @@ static int __devinit adt7410_probe(struct i2c_client *client, return 0; error_unreg_int_irq: - free_irq(adt7410_platform_data[0], chip->indio_dev); + free_irq(adt7410_platform_data[0], indio_dev); error_unreg_ct_irq: - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); error_unreg_dev: - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit adt7410_remove(struct i2c_client *client) { - struct adt7410_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); unsigned long *adt7410_platform_data = client->dev.platform_data; if (adt7410_platform_data[0]) - free_irq(adt7410_platform_data[0], chip->indio_dev); + free_irq(adt7410_platform_data[0], indio_dev); if (client->irq) - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); return 0; } diff --git a/drivers/staging/iio/adc/adt75.c b/drivers/staging/iio/adc/adt75.c index 1171fb9c178f..38f141de6a4b 100644 --- a/drivers/staging/iio/adc/adt75.c +++ b/drivers/staging/iio/adc/adt75.c @@ -51,7 +51,6 @@ struct adt75_chip_info { struct i2c_client *client; - struct iio_dev *indio_dev; u8 config; }; @@ -59,8 +58,9 @@ struct adt75_chip_info { * adt75 register access by I2C */ -static int adt75_i2c_read(struct adt75_chip_info *chip, u8 reg, u8 *data) +static int adt75_i2c_read(struct iio_dev *dev_info, u8 reg, u8 *data) { + struct adt75_chip_info *chip = iio_priv(dev_info); struct i2c_client *client = chip->client; int ret = 0, len; @@ -84,8 +84,9 @@ static int adt75_i2c_read(struct adt75_chip_info *chip, u8 reg, u8 *data) return ret; } -static int adt75_i2c_write(struct adt75_chip_info *chip, u8 reg, u8 data) +static int adt75_i2c_write(struct iio_dev *dev_info, u8 reg, u8 data) { + struct adt75_chip_info *chip = iio_priv(dev_info); struct i2c_client *client = chip->client; int ret = 0; @@ -104,8 +105,7 @@ static ssize_t adt75_show_mode(struct device *dev, struct device_attribute *attr, char *buf) { - struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_get_drvdata(dev)); if (chip->config & ADT75_PD) return sprintf(buf, "power-save\n"); @@ -119,11 +119,11 @@ static ssize_t adt75_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); int ret; u8 config; - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -131,7 +131,7 @@ static ssize_t adt75_store_mode(struct device *dev, if (!strcmp(buf, "full")) config |= ADT75_PD; - ret = adt75_i2c_write(chip, ADT75_CONFIG, config); + ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config); if (ret) return -EIO; @@ -158,8 +158,7 @@ static ssize_t adt75_show_oneshot(struct device *dev, struct device_attribute *attr, char *buf) { - struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_get_drvdata(dev)); return sprintf(buf, "%d\n", !!(chip->config & ADT75_ONESHOT)); } @@ -170,7 +169,7 @@ static ssize_t adt75_store_oneshot(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); unsigned long data = 0; int ret; u8 config; @@ -180,7 +179,7 @@ static ssize_t adt75_store_oneshot(struct device *dev, return -EINVAL; - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -188,7 +187,7 @@ static ssize_t adt75_store_oneshot(struct device *dev, if (data) config |= ADT75_ONESHOT; - ret = adt75_i2c_write(chip, ADT75_CONFIG, config); + ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config); if (ret) return -EIO; @@ -207,7 +206,7 @@ static ssize_t adt75_show_value(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); u16 data; char sign = ' '; int ret; @@ -224,7 +223,7 @@ static ssize_t adt75_show_value(struct device *dev, return -EIO; } - ret = adt75_i2c_read(chip, ADT75_TEMPERATURE, (u8 *)&data); + ret = adt75_i2c_read(dev_info, ADT75_TEMPERATURE, (u8 *)&data); if (ret) return -EIO; @@ -277,11 +276,11 @@ static ssize_t adt75_show_oti_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); int ret; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -297,12 +296,12 @@ static ssize_t adt75_set_oti_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); int ret; u8 config; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -310,7 +309,7 @@ static ssize_t adt75_set_oti_mode(struct device *dev, if (strcmp(buf, "comparator") != 0) config |= ADT75_OS_INT; - ret = adt75_i2c_write(chip, ADT75_CONFIG, config); + ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config); if (ret) return -EIO; @@ -331,11 +330,11 @@ static ssize_t adt75_show_smbus_alart(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); int ret; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -348,7 +347,7 @@ static ssize_t adt75_set_smbus_alart(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); unsigned long data = 0; int ret; u8 config; @@ -358,7 +357,7 @@ static ssize_t adt75_set_smbus_alart(struct device *dev, return -EINVAL; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -366,7 +365,7 @@ static ssize_t adt75_set_smbus_alart(struct device *dev, if (data) config |= ADT75_SMBUS_ALART; - ret = adt75_i2c_write(chip, ADT75_CONFIG, config); + ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config); if (ret) return -EIO; @@ -380,11 +379,11 @@ static ssize_t adt75_show_fault_queue(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); int ret; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; @@ -398,7 +397,7 @@ static ssize_t adt75_set_fault_queue(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; + struct adt75_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; u8 config; @@ -408,13 +407,13 @@ static ssize_t adt75_set_fault_queue(struct device *dev, return -EINVAL; /* retrive ALART status */ - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(dev_info, ADT75_CONFIG, &chip->config); if (ret) return -EIO; config = chip->config & ~ADT75_FAULT_QUEUE_MASK; config |= (data << ADT75_FAULT_QUEUE_OFFSET); - ret = adt75_i2c_write(chip, ADT75_CONFIG, config); + ret = adt75_i2c_write(dev_info, ADT75_CONFIG, config); if (ret) return -EIO; @@ -428,12 +427,11 @@ static inline ssize_t adt75_show_t_bound(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; u16 data; char sign = ' '; int ret; - ret = adt75_i2c_read(chip, this_attr->address, (u8 *)&data); + ret = adt75_i2c_read(dev_info, this_attr->address, (u8 *)&data); if (ret) return -EIO; @@ -456,7 +454,6 @@ static inline ssize_t adt75_set_t_bound(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt75_chip_info *chip = dev_info->dev_data; long tmp1, tmp2; u16 data; char *pos; @@ -491,7 +488,7 @@ static inline ssize_t adt75_set_t_bound(struct device *dev, data <<= ADT75_VALUE_OFFSET; data = swab16(data); - ret = adt75_i2c_write(chip, this_attr->address, (u8)data); + ret = adt75_i2c_write(dev_info, this_attr->address, (u8)data); if (ret) return -EIO; @@ -549,31 +546,27 @@ static int __devinit adt75_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct adt75_chip_info *chip; + struct iio_dev *indio_dev; int ret = 0; - chip = kzalloc(sizeof(struct adt75_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - - chip->indio_dev->name = id->name; - chip->indio_dev->dev.parent = &client->dev; - chip->indio_dev->info = &adt75_info; - chip->indio_dev->dev_data = (void *)chip; - chip->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &adt75_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -582,12 +575,12 @@ static int __devinit adt75_probe(struct i2c_client *client, NULL, &adt75_event_handler, IRQF_TRIGGER_LOW, - chip->indio_dev->name, - chip->indio_dev); + indio_dev->name, + indio_dev); if (ret) goto error_unreg_dev; - ret = adt75_i2c_read(chip, ADT75_CONFIG, &chip->config); + ret = adt75_i2c_read(indio_dev, ADT75_CONFIG, &chip->config); if (ret) { ret = -EIO; goto error_unreg_irq; @@ -596,7 +589,7 @@ static int __devinit adt75_probe(struct i2c_client *client, /* set irq polarity low level */ chip->config &= ~ADT75_OS_POLARITY; - ret = adt75_i2c_write(chip, ADT75_CONFIG, chip->config); + ret = adt75_i2c_write(indio_dev, ADT75_CONFIG, chip->config); if (ret) { ret = -EIO; goto error_unreg_irq; @@ -604,31 +597,27 @@ static int __devinit adt75_probe(struct i2c_client *client, } dev_info(&client->dev, "%s temperature sensor registered.\n", - chip->indio_dev->name); + indio_dev->name); return 0; error_unreg_irq: - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); error_unreg_dev: - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } static int __devexit adt75_remove(struct i2c_client *client) { - struct adt75_chip_info *chip = i2c_get_clientdata(client); - struct iio_dev *indio_dev = chip->indio_dev; + struct iio_dev *indio_dev = i2c_get_clientdata(client); if (client->irq) - free_irq(client->irq, chip->indio_dev); + free_irq(client->irq, indio_dev); iio_device_unregister(indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/adc/max1363_core.c b/drivers/staging/iio/adc/max1363_core.c index 98cebd26310f..72b0917412ee 100644 --- a/drivers/staging/iio/adc/max1363_core.c +++ b/drivers/staging/iio/adc/max1363_core.c @@ -1255,12 +1255,15 @@ static int __devinit max1363_probe(struct i2c_client *client, struct regulator *reg; reg = regulator_get(&client->dev, "vcc"); - if (!IS_ERR(reg)) { - ret = regulator_enable(reg); - if (ret) - goto error_put_reg; + if (IS_ERR(reg)) { + ret = PTR_ERR(reg); + goto error_out; } + ret = regulator_enable(reg); + if (ret) + goto error_put_reg; + indio_dev = iio_allocate_device(sizeof(struct max1363_state)); if (indio_dev == NULL) { ret = -ENOMEM; @@ -1323,6 +1326,7 @@ static int __devinit max1363_probe(struct i2c_client *client, } return 0; + error_uninit_ring: iio_ring_buffer_unregister(indio_dev->ring); error_cleanup_ring: @@ -1335,12 +1339,10 @@ error_free_device: else iio_device_unregister(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) - regulator_disable(st->reg); + regulator_disable(reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); - + regulator_put(reg); +error_out: return ret; } diff --git a/drivers/staging/iio/addac/adt7316.c b/drivers/staging/iio/addac/adt7316.c index 7097deb0f309..637316f79f78 100644 --- a/drivers/staging/iio/addac/adt7316.c +++ b/drivers/staging/iio/addac/adt7316.c @@ -174,7 +174,6 @@ */ struct adt7316_chip_info { - struct iio_dev *indio_dev; struct adt7316_bus bus; u16 ldac_pin; u16 int_mask; /* 0x2f */ @@ -220,7 +219,7 @@ static ssize_t adt7316_show_enabled(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_EN)); } @@ -252,7 +251,7 @@ static ssize_t adt7316_store_enabled(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); int enable; if (!memcmp(buf, "1", 1)) @@ -276,7 +275,7 @@ static ssize_t adt7316_show_select_ex_temp(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX) return -EPERM; @@ -290,7 +289,7 @@ static ssize_t adt7316_store_select_ex_temp(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config1; int ret; @@ -320,7 +319,7 @@ static ssize_t adt7316_show_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (chip->config2 & ADT7316_AD_SINGLE_CH_MODE) return sprintf(buf, "single_channel\n"); @@ -334,7 +333,7 @@ static ssize_t adt7316_store_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config2; int ret; @@ -370,7 +369,7 @@ static ssize_t adt7316_show_ad_channel(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE)) return -EPERM; @@ -409,7 +408,7 @@ static ssize_t adt7316_store_ad_channel(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config2; unsigned long data = 0; int ret; @@ -455,7 +454,7 @@ static ssize_t adt7316_show_all_ad_channels(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (!(chip->config2 & ADT7316_AD_SINGLE_CH_MODE)) return -EPERM; @@ -477,7 +476,7 @@ static ssize_t adt7316_show_disable_averaging(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config2 & ADT7316_DISABLE_AVERAGING)); @@ -489,7 +488,7 @@ static ssize_t adt7316_store_disable_averaging(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config2; int ret; @@ -516,7 +515,7 @@ static ssize_t adt7316_show_enable_smbus_timeout(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config2 & ADT7316_EN_SMBUS_TIMEOUT)); @@ -528,7 +527,7 @@ static ssize_t adt7316_store_enable_smbus_timeout(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config2; int ret; @@ -557,7 +556,7 @@ static ssize_t adt7316_store_reset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config2; int ret; @@ -580,7 +579,7 @@ static ssize_t adt7316_show_powerdown(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_PD)); } @@ -591,7 +590,7 @@ static ssize_t adt7316_store_powerdown(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config1; int ret; @@ -618,7 +617,7 @@ static ssize_t adt7316_show_fast_ad_clock(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_ADCLK_22_5)); } @@ -629,7 +628,7 @@ static ssize_t adt7316_store_fast_ad_clock(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config3; int ret; @@ -656,7 +655,7 @@ static ssize_t adt7316_show_da_high_resolution(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (chip->config3 & ADT7316_DA_HIGH_RESOLUTION) { if (chip->id == ID_ADT7316 || chip->id == ID_ADT7516) @@ -674,7 +673,7 @@ static ssize_t adt7316_store_da_high_resolution(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config3; int ret; @@ -708,7 +707,7 @@ static ssize_t adt7316_show_AIN_internal_Vref(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if ((chip->id & ID_FAMILY_MASK) != ID_ADT75XX) return -EPERM; @@ -723,7 +722,7 @@ static ssize_t adt7316_store_AIN_internal_Vref(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config3; int ret; @@ -755,7 +754,7 @@ static ssize_t adt7316_show_enable_prop_DACA(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_EN_IN_TEMP_PROP_DACA)); @@ -767,7 +766,7 @@ static ssize_t adt7316_store_enable_prop_DACA(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config3; int ret; @@ -794,7 +793,7 @@ static ssize_t adt7316_show_enable_prop_DACB(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config3 & ADT7316_EN_EX_TEMP_PROP_DACB)); @@ -806,7 +805,7 @@ static ssize_t adt7316_store_enable_prop_DACB(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config3; int ret; @@ -833,7 +832,7 @@ static ssize_t adt7316_show_DAC_2Vref_ch_mask(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%x\n", chip->dac_config & ADT7316_DA_2VREF_CH_MASK); @@ -845,7 +844,7 @@ static ssize_t adt7316_store_DAC_2Vref_ch_mask(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 dac_config; unsigned long data = 0; int ret; @@ -876,7 +875,7 @@ static ssize_t adt7316_show_DAC_update_mode(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (!(chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA)) return sprintf(buf, "manual\n"); @@ -900,7 +899,7 @@ static ssize_t adt7316_store_DAC_update_mode(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 dac_config; unsigned long data; int ret; @@ -934,7 +933,7 @@ static ssize_t adt7316_show_all_DAC_update_modes(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if (chip->config3 & ADT7316_DA_EN_VIA_DAC_LDCA) return sprintf(buf, "0 - auto at any MSB DAC writing\n" @@ -955,7 +954,7 @@ static ssize_t adt7316_store_update_DAC(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 ldac_config; unsigned long data; int ret; @@ -994,7 +993,7 @@ static ssize_t adt7316_show_DA_AB_Vref_bypass(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) return -EPERM; @@ -1009,7 +1008,7 @@ static ssize_t adt7316_store_DA_AB_Vref_bypass(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 dac_config; int ret; @@ -1039,7 +1038,7 @@ static ssize_t adt7316_show_DA_CD_Vref_bypass(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) return -EPERM; @@ -1054,7 +1053,7 @@ static ssize_t adt7316_store_DA_CD_Vref_bypass(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 dac_config; int ret; @@ -1084,7 +1083,7 @@ static ssize_t adt7316_show_DAC_internal_Vref(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) return sprintf(buf, "0x%x\n", @@ -1101,7 +1100,7 @@ static ssize_t adt7316_store_DAC_internal_Vref(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 ldac_config; unsigned long data; int ret; @@ -1220,7 +1219,7 @@ static ssize_t adt7316_show_VDD(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_VDD, buf); } @@ -1231,7 +1230,7 @@ static ssize_t adt7316_show_in_temp(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_IN, buf); } @@ -1243,7 +1242,7 @@ static ssize_t adt7316_show_ex_temp_AIN1(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7316_AD_SINGLE_CH_EX, buf); } @@ -1256,7 +1255,7 @@ static ssize_t adt7316_show_AIN2(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN2, buf); } @@ -1267,7 +1266,7 @@ static ssize_t adt7316_show_AIN3(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN3, buf); } @@ -1278,7 +1277,7 @@ static ssize_t adt7316_show_AIN4(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_ad(chip, ADT7516_AD_SINGLE_CH_AIN4, buf); } @@ -1330,7 +1329,7 @@ static ssize_t adt7316_show_in_temp_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf); } @@ -1341,7 +1340,7 @@ static ssize_t adt7316_store_in_temp_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_temp_offset(chip, ADT7316_IN_TEMP_OFFSET, buf, len); } @@ -1355,7 +1354,7 @@ static ssize_t adt7316_show_ex_temp_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf); } @@ -1366,7 +1365,7 @@ static ssize_t adt7316_store_ex_temp_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_temp_offset(chip, ADT7316_EX_TEMP_OFFSET, buf, len); } @@ -1380,7 +1379,7 @@ static ssize_t adt7316_show_in_analog_temp_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_temp_offset(chip, ADT7316_IN_ANALOG_TEMP_OFFSET, buf); @@ -1392,7 +1391,7 @@ static ssize_t adt7316_store_in_analog_temp_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_temp_offset(chip, ADT7316_IN_ANALOG_TEMP_OFFSET, buf, len); @@ -1407,7 +1406,7 @@ static ssize_t adt7316_show_ex_analog_temp_offset(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_temp_offset(chip, ADT7316_EX_ANALOG_TEMP_OFFSET, buf); @@ -1419,7 +1418,7 @@ static ssize_t adt7316_store_ex_analog_temp_offset(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_temp_offset(chip, ADT7316_EX_ANALOG_TEMP_OFFSET, buf, len); @@ -1504,7 +1503,7 @@ static ssize_t adt7316_show_DAC_A(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_DAC(chip, 0, buf); } @@ -1515,7 +1514,7 @@ static ssize_t adt7316_store_DAC_A(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_DAC(chip, 0, buf, len); } @@ -1528,7 +1527,7 @@ static ssize_t adt7316_show_DAC_B(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_DAC(chip, 1, buf); } @@ -1539,7 +1538,7 @@ static ssize_t adt7316_store_DAC_B(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_DAC(chip, 1, buf, len); } @@ -1552,7 +1551,7 @@ static ssize_t adt7316_show_DAC_C(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_DAC(chip, 2, buf); } @@ -1563,7 +1562,7 @@ static ssize_t adt7316_store_DAC_C(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_DAC(chip, 2, buf, len); } @@ -1576,7 +1575,7 @@ static ssize_t adt7316_show_DAC_D(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_show_DAC(chip, 3, buf); } @@ -1587,7 +1586,7 @@ static ssize_t adt7316_store_DAC_D(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return adt7316_store_DAC(chip, 3, buf, len); } @@ -1600,7 +1599,7 @@ static ssize_t adt7316_show_device_id(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 id; int ret; @@ -1618,7 +1617,7 @@ static ssize_t adt7316_show_manufactorer_id(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 id; int ret; @@ -1637,7 +1636,7 @@ static ssize_t adt7316_show_device_rev(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 rev; int ret; @@ -1655,7 +1654,7 @@ static ssize_t adt7316_show_bus_type(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 stat; int ret; @@ -1765,7 +1764,7 @@ static const struct attribute_group adt7516_attribute_group = { static irqreturn_t adt7316_event_handler(int irq, void *private) { struct iio_dev *indio_dev = private; - struct adt7316_chip_info *chip = iio_dev_get_devdata(indio_dev); + struct adt7316_chip_info *chip = iio_priv(indio_dev); u8 stat1, stat2; int ret; s64 time; @@ -1777,43 +1776,43 @@ static irqreturn_t adt7316_event_handler(int irq, void *private) time = iio_get_time_ns(); if (stat1 & (1 << 0)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), time); if (stat1 & (1 << 1)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_TEMP, 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), time); if (stat1 & (1 << 2)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1, IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING), time); if (stat1 & (1 << 3)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_TEMP, 1, IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING), time); if (stat1 & (1 << 5)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_IN, 1, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), time); if (stat1 & (1 << 6)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_IN, 2, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), time); if (stat1 & (1 << 7)) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_IN, 3, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), @@ -1822,7 +1821,7 @@ static irqreturn_t adt7316_event_handler(int irq, void *private) ret = chip->bus.read(chip->bus.client, ADT7316_INT_STAT2, &stat2); if (!ret) { if (stat2 & ADT7316_INT_MASK2_VDD) - iio_push_event(chip->indio_dev, 0, + iio_push_event(indio_dev, 0, IIO_UNMOD_EVENT_CODE(IIO_IN, 0, IIO_EV_TYPE_THRESH, @@ -1841,7 +1840,7 @@ static ssize_t adt7316_show_int_mask(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "0x%x\n", chip->int_mask); } @@ -1855,7 +1854,7 @@ static ssize_t adt7316_set_int_mask(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); unsigned long data; int ret; u8 mask; @@ -1895,7 +1894,7 @@ static inline ssize_t adt7316_show_ad_bound(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 val; int data; int ret; @@ -1926,7 +1925,7 @@ static inline ssize_t adt7316_set_ad_bound(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); long data; u8 val; int ret; @@ -1965,7 +1964,7 @@ static ssize_t adt7316_show_int_enabled(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return sprintf(buf, "%d\n", !!(chip->config1 & ADT7316_INT_EN)); } @@ -1976,7 +1975,7 @@ static ssize_t adt7316_set_int_enabled(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); u8 config1; int ret; @@ -2090,7 +2089,7 @@ static struct attribute_group adt7516_event_attribute_group = { int adt7316_disable(struct device *dev) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return _adt7316_store_enabled(chip, 0); } @@ -2099,7 +2098,7 @@ EXPORT_SYMBOL(adt7316_disable); int adt7316_enable(struct device *dev) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct adt7316_chip_info *chip = iio_priv(dev_info); return _adt7316_store_enabled(chip, 1); } @@ -2127,16 +2126,18 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, const char *name) { struct adt7316_chip_info *chip; + struct iio_dev *indio_dev; unsigned short *adt7316_platform_data = dev->platform_data; int ret = 0; - chip = kzalloc(sizeof(struct adt7316_chip_info), GFP_KERNEL); - - if (chip == NULL) - return -ENOMEM; - + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_ret; + } + chip = iio_priv(indio_dev); /* this is only used for device removal purposes */ - dev_set_drvdata(dev, chip); + dev_set_drvdata(dev, indio_dev); chip->bus = *bus; @@ -2157,22 +2158,15 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) chip->int_mask |= ADT7516_AIN_INT_MASK; - chip->indio_dev = iio_allocate_device(0); - if (chip->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_chip; - } - - chip->indio_dev->dev.parent = dev; + indio_dev->dev.parent = dev; if ((chip->id & ID_FAMILY_MASK) == ID_ADT75XX) - chip->indio_dev->info = &adt7516_info; + 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->modes = INDIO_DIRECT_MODE; + indio_dev->info = &adt7316_info; + indio_dev->name = name; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(chip->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -2184,8 +2178,8 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, NULL, &adt7316_event_handler, chip->bus.irq_flags | IRQF_ONESHOT, - chip->indio_dev->name, - chip->indio_dev); + indio_dev->name, + indio_dev); if (ret) goto error_unreg_dev; @@ -2206,35 +2200,31 @@ int __devinit adt7316_probe(struct device *dev, struct adt7316_bus *bus, } dev_info(dev, "%s temperature sensor, ADC and DAC registered.\n", - chip->indio_dev->name); + indio_dev->name); return 0; error_unreg_irq: - free_irq(chip->bus.irq, chip->indio_dev); + free_irq(chip->bus.irq, indio_dev); error_unreg_dev: - iio_device_unregister(chip->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(chip->indio_dev); -error_free_chip: - kfree(chip); - + iio_free_device(indio_dev); +error_ret: return ret; } EXPORT_SYMBOL(adt7316_probe); int __devexit adt7316_remove(struct device *dev) { - - struct iio_dev *dev_info = dev_get_drvdata(dev); - struct adt7316_chip_info *chip = dev_info->dev_data; + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct adt7316_chip_info *chip = iio_priv(indio_dev); dev_set_drvdata(dev, NULL); if (chip->bus.irq) - free_irq(chip->bus.irq, chip->indio_dev); - iio_device_unregister(chip->indio_dev); - iio_free_device(chip->indio_dev); - kfree(chip); + free_irq(chip->bus.irq, indio_dev); + iio_device_unregister(indio_dev); + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/dac/Kconfig b/drivers/staging/iio/dac/Kconfig index d5a5556cf985..7ddae357f20e 100644 --- a/drivers/staging/iio/dac/Kconfig +++ b/drivers/staging/iio/dac/Kconfig @@ -42,6 +42,17 @@ config AD5791 To compile this driver as a module, choose M here: the module will be called ad5791. +config AD5686 + tristate "Analog Devices AD5686R/AD5685R/AD5684R DAC SPI driver" + depends on SPI + help + Say yes here to build support for Analog Devices AD5686R, AD5685R, + AD5684R, AD5791 Voltage Output Digital to + Analog Converter. + + To compile this driver as a module, choose M here: the + module will be called ad5686. + config MAX517 tristate "Maxim MAX517/518/519 DAC driver" depends on I2C && EXPERIMENTAL diff --git a/drivers/staging/iio/dac/Makefile b/drivers/staging/iio/dac/Makefile index 83196de7a54c..7f4f2ed031ec 100644 --- a/drivers/staging/iio/dac/Makefile +++ b/drivers/staging/iio/dac/Makefile @@ -6,4 +6,5 @@ obj-$(CONFIG_AD5624R_SPI) += ad5624r_spi.o obj-$(CONFIG_AD5504) += ad5504.o obj-$(CONFIG_AD5446) += ad5446.o obj-$(CONFIG_AD5791) += ad5791.o +obj-$(CONFIG_AD5686) += ad5686.o obj-$(CONFIG_MAX517) += max517.o diff --git a/drivers/staging/iio/dac/ad5446.c b/drivers/staging/iio/dac/ad5446.c index 86cb08ce199b..e8a9d0bf1edb 100644 --- a/drivers/staging/iio/dac/ad5446.c +++ b/drivers/staging/iio/dac/ad5446.c @@ -68,7 +68,7 @@ static ssize_t ad5446_write(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = dev_info->dev_data; + struct ad5446_state *st = iio_priv(dev_info); int ret; long val; @@ -98,7 +98,7 @@ static ssize_t ad5446_show_scale(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = iio_dev_get_devdata(dev_info); + struct ad5446_state *st = iio_priv(dev_info); /* Corresponds to Vref / 2^(bits) */ unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits; @@ -111,7 +111,7 @@ static ssize_t ad5446_write_powerdown_mode(struct device *dev, const char *buf, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = dev_info->dev_data; + struct ad5446_state *st = iio_priv(dev_info); if (sysfs_streq(buf, "1kohm_to_gnd")) st->pwr_down_mode = MODE_PWRDWN_1k; @@ -129,7 +129,7 @@ static ssize_t ad5446_read_powerdown_mode(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = dev_info->dev_data; + struct ad5446_state *st = iio_priv(dev_info); char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"}; @@ -141,7 +141,7 @@ static ssize_t ad5446_read_dac_powerdown(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = dev_info->dev_data; + struct ad5446_state *st = iio_priv(dev_info); return sprintf(buf, "%d\n", st->pwr_down); } @@ -151,7 +151,7 @@ static ssize_t ad5446_write_dac_powerdown(struct device *dev, const char *buf, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = dev_info->dev_data; + struct ad5446_state *st = iio_priv(dev_info); unsigned long readin; int ret; @@ -201,7 +201,7 @@ static mode_t ad5446_attr_is_visible(struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad5446_state *st = iio_dev_get_devdata(dev_info); + struct ad5446_state *st = iio_priv(dev_info); mode_t mode = attr->mode; @@ -342,42 +342,37 @@ static const struct iio_info ad5446_info = { static int __devinit ad5446_probe(struct spi_device *spi) { struct ad5446_state *st; + struct iio_dev *indio_dev; + struct regulator *reg; int ret, voltage_uv = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; - voltage_uv = regulator_get_voltage(st->reg); + voltage_uv = regulator_get_voltage(reg); } + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_disable_reg; + } + st = iio_priv(indio_dev); st->chip_info = &ad5446_chip_info_tbl[spi_get_device_id(spi)->driver_data]; - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, indio_dev); + st->reg = reg; st->spi = spi; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_disable_reg; - } - /* 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->info = &ad5446_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->info = &ad5446_info; + indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default message */ @@ -404,36 +399,35 @@ static int __devinit ad5446_probe(struct spi_device *spi) "reference voltage unspecified\n"); } - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_device; return 0; error_free_device: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) - regulator_disable(st->reg); + if (!IS_ERR(reg)) + regulator_disable(reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); - kfree(st); -error_ret: + if (!IS_ERR(reg)) + regulator_put(reg); + return ret; } static int ad5446_remove(struct spi_device *spi) { - struct ad5446_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad5446_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; iio_device_unregister(indio_dev); - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); return 0; } diff --git a/drivers/staging/iio/dac/ad5446.h b/drivers/staging/iio/dac/ad5446.h index e6ffd2bb7c7d..7118d653ac3e 100644 --- a/drivers/staging/iio/dac/ad5446.h +++ b/drivers/staging/iio/dac/ad5446.h @@ -33,7 +33,6 @@ /** * struct ad5446_state - driver instance specific data - * @indio_dev: the industrial I/O device * @spi: spi_device * @chip_info: chip model specific constants, available modes etc * @reg: supply regulator @@ -45,7 +44,6 @@ */ struct ad5446_state { - struct iio_dev *indio_dev; struct spi_device *spi; const struct ad5446_chip_info *chip_info; struct regulator *reg; diff --git a/drivers/staging/iio/dac/ad5504.c b/drivers/staging/iio/dac/ad5504.c index ed029cdff300..1915f459868b 100644 --- a/drivers/staging/iio/dac/ad5504.c +++ b/drivers/staging/iio/dac/ad5504.c @@ -55,7 +55,7 @@ static ssize_t ad5504_write_dac(struct device *dev, const char *buf, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); long readin; int ret; @@ -73,7 +73,7 @@ static ssize_t ad5504_read_dac(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret; u16 val; @@ -89,7 +89,7 @@ static ssize_t ad5504_read_powerdown_mode(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); const char mode[][14] = {"20kohm_to_gnd", "three_state"}; @@ -101,7 +101,7 @@ static ssize_t ad5504_write_powerdown_mode(struct device *dev, const char *buf, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); int ret; if (sysfs_streq(buf, "20kohm_to_gnd")) @@ -119,7 +119,7 @@ static ssize_t ad5504_read_dac_powerdown(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); return sprintf(buf, "%d\n", @@ -133,7 +133,7 @@ static ssize_t ad5504_write_dac_powerdown(struct device *dev, long readin; int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = strict_strtol(buf, 10, &readin); @@ -162,7 +162,7 @@ static ssize_t ad5504_show_scale(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5504_state *st = iio_dev_get_devdata(indio_dev); + struct ad5504_state *st = iio_priv(indio_dev); /* Corresponds to Vref / 2^(bits) */ unsigned int scale_uv = (st->vref_mv * 1000) >> AD5505_BITS; @@ -277,26 +277,27 @@ static const struct iio_info ad5501_info = { static int __devinit ad5504_probe(struct spi_device *spi) { struct ad5504_platform_data *pdata = spi->dev.platform_data; + struct iio_dev *indio_dev; struct ad5504_state *st; + struct regulator *reg; int ret, voltage_uv = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - - spi_set_drvdata(spi, st); - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; - voltage_uv = regulator_get_voltage(st->reg); + voltage_uv = regulator_get_voltage(reg); } + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_disable_reg; + } + spi_set_drvdata(spi, indio_dev); + st = iio_priv(indio_dev); if (voltage_uv) st->vref_mv = voltage_uv / 1000; else if (pdata) @@ -304,22 +305,17 @@ static int __devinit ad5504_probe(struct spi_device *spi) else dev_warn(&spi->dev, "reference voltage unspecified\n"); + st->reg = reg; st->spi = spi; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_disable_reg; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->name = spi_get_device_id(st->spi)->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(st->spi)->name; if (spi_get_device_id(st->spi)->driver_data == ID_AD5501) - st->indio_dev->info = &ad5501_info; + indio_dev->info = &ad5501_info; else - st->indio_dev->info = &ad5504_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->info = &ad5504_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -329,7 +325,7 @@ static int __devinit ad5504_probe(struct spi_device *spi) &ad5504_event_handler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, spi_get_device_id(st->spi)->name, - st->indio_dev); + indio_dev); if (ret) goto error_unreg_iio_device; } @@ -337,37 +333,34 @@ static int __devinit ad5504_probe(struct spi_device *spi) return 0; error_unreg_iio_device: - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) + if (!IS_ERR(reg)) regulator_disable(st->reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); + if (!IS_ERR(reg)) + regulator_put(reg); - kfree(st); -error_ret: return ret; } static int __devexit ad5504_remove(struct spi_device *spi) { - struct ad5504_state *st = spi_get_drvdata(spi); - + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad5504_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; if (spi->irq) - free_irq(spi->irq, st->indio_dev); + free_irq(spi->irq, indio_dev); - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); - return 0; } diff --git a/drivers/staging/iio/dac/ad5504.h b/drivers/staging/iio/dac/ad5504.h index 13ef35399137..85beb1dd29b9 100644 --- a/drivers/staging/iio/dac/ad5504.h +++ b/drivers/staging/iio/dac/ad5504.h @@ -41,7 +41,6 @@ struct ad5504_platform_data { /** * struct ad5446_state - driver instance specific data - * @indio_dev: the industrial I/O device * @us: spi_device * @reg: supply regulator * @vref_mv: actual reference voltage used @@ -50,7 +49,6 @@ struct ad5504_platform_data { */ struct ad5504_state { - struct iio_dev *indio_dev; struct spi_device *spi; struct regulator *reg; unsigned short vref_mv; diff --git a/drivers/staging/iio/dac/ad5624r.h b/drivers/staging/iio/dac/ad5624r.h index c16df4ed52ca..b71c6a03e780 100644 --- a/drivers/staging/iio/dac/ad5624r.h +++ b/drivers/staging/iio/dac/ad5624r.h @@ -53,7 +53,6 @@ struct ad5624r_chip_info { */ struct ad5624r_state { - struct iio_dev *indio_dev; struct spi_device *us; const struct ad5624r_chip_info *chip_info; struct regulator *reg; diff --git a/drivers/staging/iio/dac/ad5624r_spi.c b/drivers/staging/iio/dac/ad5624r_spi.c index c679981f0143..a5b3776718e9 100644 --- a/drivers/staging/iio/dac/ad5624r_spi.c +++ b/drivers/staging/iio/dac/ad5624r_spi.c @@ -77,7 +77,7 @@ static ssize_t ad5624r_write_dac(struct device *dev, long readin; int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = strict_strtol(buf, 10, &readin); @@ -94,7 +94,7 @@ static ssize_t ad5624r_read_powerdown_mode(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"}; @@ -106,7 +106,7 @@ static ssize_t ad5624r_write_powerdown_mode(struct device *dev, const char *buf, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); int ret; if (sysfs_streq(buf, "1kohm_to_gnd")) @@ -126,7 +126,7 @@ static ssize_t ad5624r_read_dac_powerdown(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); return sprintf(buf, "%d\n", @@ -140,7 +140,7 @@ static ssize_t ad5624r_write_dac_powerdown(struct device *dev, long readin; int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = strict_strtol(buf, 10, &readin); @@ -166,7 +166,7 @@ static ssize_t ad5624r_show_scale(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5624r_state *st = iio_dev_get_devdata(indio_dev); + struct ad5624r_state *st = iio_priv(indio_dev); /* Corresponds to Vref / 2^(bits) */ unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits; @@ -226,24 +226,26 @@ static const struct iio_info ad5624r_info = { static int __devinit ad5624r_probe(struct spi_device *spi) { struct ad5624r_state *st; + struct iio_dev *indio_dev; + struct regulator *reg; int ret, voltage_uv = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - spi_set_drvdata(spi, st); - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; - voltage_uv = regulator_get_voltage(st->reg); + voltage_uv = regulator_get_voltage(reg); } - + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_disable_reg; + } + st = iio_priv(indio_dev); + st->reg = reg; + spi_set_drvdata(spi, indio_dev); st->chip_info = &ad5624r_chip_info_tbl[spi_get_device_id(spi)->driver_data]; @@ -253,18 +255,13 @@ static int __devinit ad5624r_probe(struct spi_device *spi) st->vref_mv = st->chip_info->int_vref_mv; st->us = spi; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_disable_reg; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->info = &ad5624r_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->info = &ad5624r_info; + indio_dev->modes = INDIO_DIRECT_MODE; + + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -276,32 +273,29 @@ static int __devinit ad5624r_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) - regulator_disable(st->reg); + if (!IS_ERR(reg)) + regulator_disable(reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); + if (!IS_ERR(reg)) + regulator_put(reg); - kfree(st); -error_ret: return ret; } static int __devexit ad5624r_remove(struct spi_device *spi) { - struct ad5624r_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->indio_dev); - - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad5624r_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; + + iio_device_unregister(indio_dev); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); - return 0; } diff --git a/drivers/staging/iio/dac/ad5686.c b/drivers/staging/iio/dac/ad5686.c new file mode 100644 index 000000000000..fd67cfa5edb6 --- /dev/null +++ b/drivers/staging/iio/dac/ad5686.c @@ -0,0 +1,497 @@ +/* + * AD5686R, AD5685R, AD5684R Digital to analog converters driver + * + * Copyright 2011 Analog Devices Inc. + * + * Licensed under the GPL-2. + */ + +#include <linux/interrupt.h> +#include <linux/gpio.h> +#include <linux/fs.h> +#include <linux/device.h> +#include <linux/kernel.h> +#include <linux/spi/spi.h> +#include <linux/slab.h> +#include <linux/sysfs.h> +#include <linux/regulator/consumer.h> + +#include "../iio.h" +#include "../sysfs.h" +#include "dac.h" + +#define AD5686_DAC_CHANNELS 4 + +#define AD5686_ADDR(x) ((x) << 16) +#define AD5686_CMD(x) ((x) << 20) + +#define AD5686_ADDR_DAC0 0x1 +#define AD5686_ADDR_DAC1 0x2 +#define AD5686_ADDR_DAC2 0x4 +#define AD5686_ADDR_DAC3 0x8 +#define AD5686_ADDR_ALL_DAC 0xF + +#define AD5686_CMD_NOOP 0x0 +#define AD5686_CMD_WRITE_INPUT_N 0x1 +#define AD5686_CMD_UPDATE_DAC_N 0x2 +#define AD5686_CMD_WRITE_INPUT_N_UPDATE_N 0x3 +#define AD5686_CMD_POWERDOWN_DAC 0x4 +#define AD5686_CMD_LDAC_MASK 0x5 +#define AD5686_CMD_RESET 0x6 +#define AD5686_CMD_INTERNAL_REFER_SETUP 0x7 +#define AD5686_CMD_DAISY_CHAIN_ENABLE 0x8 +#define AD5686_CMD_READBACK_ENABLE 0x9 + +#define AD5686_LDAC_PWRDN_NONE 0x0 +#define AD5686_LDAC_PWRDN_1K 0x1 +#define AD5686_LDAC_PWRDN_100K 0x2 +#define AD5686_LDAC_PWRDN_3STATE 0x3 + +/** + * struct ad5686_chip_info - chip specific information + * @int_vref_mv: AD5620/40/60: the internal reference voltage + * @channel: channel specification +*/ + +struct ad5686_chip_info { + u16 int_vref_mv; + struct iio_chan_spec channel[AD5686_DAC_CHANNELS]; +}; + +/** + * struct ad5446_state - driver instance specific data + * @spi: spi_device + * @chip_info: chip model specific constants, available modes etc + * @reg: supply regulator + * @vref_mv: actual reference voltage used + * @pwr_down_mask: power down mask + * @pwr_down_mode: current power down mode + * @data: spi transfer buffers + */ + +struct ad5686_state { + struct spi_device *spi; + const struct ad5686_chip_info *chip_info; + struct regulator *reg; + unsigned short vref_mv; + unsigned pwr_down_mask; + unsigned pwr_down_mode; + /* + * DMA (thus cache coherency maintenance) requires the + * transfer buffers to live in their own cache lines. + */ + + union { + u32 d32; + u8 d8[4]; + } data[3] ____cacheline_aligned; +}; + +/** + * ad5686_supported_device_ids: + */ + +enum ad5686_supported_device_ids { + ID_AD5684, + ID_AD5685, + ID_AD5686, +}; + +static const struct ad5686_chip_info ad5686_chip_info_tbl[] = { + [ID_AD5684] = { + .channel[0] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC0, + 0, IIO_ST('u', 12, 16, 4), 0), + .channel[1] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 1, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC1, + 1, IIO_ST('u', 12, 16, 4), 0), + .channel[2] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 2, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC2, + 2, IIO_ST('u', 12, 16, 4), 0), + .channel[3] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 3, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC3, + 3, IIO_ST('u', 12, 16, 4), 0), + .int_vref_mv = 2500, + }, + [ID_AD5685] = { + .channel[0] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC0, + 0, IIO_ST('u', 14, 16, 2), 0), + .channel[1] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 1, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC1, + 1, IIO_ST('u', 14, 16, 2), 0), + .channel[2] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 2, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC2, + 2, IIO_ST('u', 14, 16, 2), 0), + .channel[3] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 3, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC3, + 3, IIO_ST('u', 14, 16, 2), 0), + .int_vref_mv = 2500, + }, + [ID_AD5686] = { + .channel[0] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 0, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC0, + 0, IIO_ST('u', 16, 16, 0), 0), + .channel[1] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 1, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC1, + 1, IIO_ST('u', 16, 16, 0), 0), + .channel[2] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 2, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC2, + 2, IIO_ST('u', 16, 16, 0), 0), + .channel[3] = IIO_CHAN(IIO_OUT, 0, 1, 0, NULL, 3, 0, + (1 << IIO_CHAN_INFO_SCALE_SHARED), + AD5686_ADDR_DAC3, + 3, IIO_ST('u', 16, 16, 0), 0), + .int_vref_mv = 2500, + }, +}; + +static int ad5686_spi_write(struct ad5686_state *st, + u8 cmd, u8 addr, u16 val, u8 shift) +{ + val <<= shift; + + st->data[0].d32 = cpu_to_be32(AD5686_CMD(cmd) | + AD5686_ADDR(addr) | + val); + + return spi_write(st->spi, &st->data[0].d8[1], 3); +} + +static int ad5686_spi_read(struct ad5686_state *st, u8 addr) +{ + struct spi_transfer t[] = { + { + .tx_buf = &st->data[0].d8[1], + .len = 3, + .cs_change = 1, + }, { + .tx_buf = &st->data[1].d8[1], + .rx_buf = &st->data[2].d8[1], + .len = 3, + }, + }; + struct spi_message m; + int ret; + + spi_message_init(&m); + spi_message_add_tail(&t[0], &m); + spi_message_add_tail(&t[1], &m); + + st->data[0].d32 = cpu_to_be32(AD5686_CMD(AD5686_CMD_READBACK_ENABLE) | + AD5686_ADDR(addr)); + st->data[1].d32 = cpu_to_be32(AD5686_CMD(AD5686_CMD_NOOP)); + + ret = spi_sync(st->spi, &m); + if (ret < 0) + return ret; + + return be32_to_cpu(st->data[2].d32); +} + +static ssize_t ad5686_read_powerdown_mode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad5686_state *st = iio_priv(indio_dev); + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); + + char mode[][15] = {"", "1kohm_to_gnd", "100kohm_to_gnd", "three_state"}; + + return sprintf(buf, "%s\n", mode[(st->pwr_down_mode >> + (this_attr->address * 2)) & 0x3]); +} + +static ssize_t ad5686_write_powerdown_mode(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad5686_state *st = iio_priv(indio_dev); + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); + unsigned mode; + + if (sysfs_streq(buf, "1kohm_to_gnd")) + mode = AD5686_LDAC_PWRDN_1K; + else if (sysfs_streq(buf, "100kohm_to_gnd")) + mode = AD5686_LDAC_PWRDN_100K; + else if (sysfs_streq(buf, "three_state")) + mode = AD5686_LDAC_PWRDN_3STATE; + else + return -EINVAL; + + st->pwr_down_mode &= ~(0x3 << (this_attr->address * 2)); + st->pwr_down_mode |= (mode << (this_attr->address * 2)); + + return len; +} + +static ssize_t ad5686_read_dac_powerdown(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad5686_state *st = iio_priv(indio_dev); + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); + + return sprintf(buf, "%d\n", !!(st->pwr_down_mask & + (0x3 << (this_attr->address * 2)))); +} + +static ssize_t ad5686_write_dac_powerdown(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t len) +{ + bool readin; + int ret; + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct ad5686_state *st = iio_priv(indio_dev); + struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); + + ret = strtobool(buf, &readin); + if (ret) + return ret; + + if (readin == true) + st->pwr_down_mask |= (0x3 << (this_attr->address * 2)); + else + st->pwr_down_mask &= ~(0x3 << (this_attr->address * 2)); + + ret = ad5686_spi_write(st, AD5686_CMD_POWERDOWN_DAC, 0, + st->pwr_down_mask & st->pwr_down_mode, 0); + + return ret ? ret : len; +} + +static IIO_CONST_ATTR(out_powerdown_mode_available, + "1kohm_to_gnd 100kohm_to_gnd three_state"); + +#define IIO_DEV_ATTR_DAC_POWERDOWN_MODE(_num) \ + IIO_DEVICE_ATTR(out##_num##_powerdown_mode, S_IRUGO | S_IWUSR, \ + ad5686_read_powerdown_mode, \ + ad5686_write_powerdown_mode, _num) + +static IIO_DEV_ATTR_DAC_POWERDOWN_MODE(0); +static IIO_DEV_ATTR_DAC_POWERDOWN_MODE(1); +static IIO_DEV_ATTR_DAC_POWERDOWN_MODE(2); +static IIO_DEV_ATTR_DAC_POWERDOWN_MODE(3); + +#define IIO_DEV_ATTR_DAC_POWERDOWN(_num) \ + IIO_DEVICE_ATTR(out##_num##_powerdown, S_IRUGO | S_IWUSR, \ + ad5686_read_dac_powerdown, \ + ad5686_write_dac_powerdown, _num) + +static IIO_DEV_ATTR_DAC_POWERDOWN(0); +static IIO_DEV_ATTR_DAC_POWERDOWN(1); +static IIO_DEV_ATTR_DAC_POWERDOWN(2); +static IIO_DEV_ATTR_DAC_POWERDOWN(3); + +static struct attribute *ad5686_attributes[] = { + &iio_dev_attr_out0_powerdown.dev_attr.attr, + &iio_dev_attr_out1_powerdown.dev_attr.attr, + &iio_dev_attr_out2_powerdown.dev_attr.attr, + &iio_dev_attr_out3_powerdown.dev_attr.attr, + &iio_dev_attr_out0_powerdown_mode.dev_attr.attr, + &iio_dev_attr_out1_powerdown_mode.dev_attr.attr, + &iio_dev_attr_out2_powerdown_mode.dev_attr.attr, + &iio_dev_attr_out3_powerdown_mode.dev_attr.attr, + &iio_const_attr_out_powerdown_mode_available.dev_attr.attr, + NULL, +}; + +static const struct attribute_group ad5686_attribute_group = { + .attrs = ad5686_attributes, +}; + +static int ad5686_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, + int *val2, + long m) +{ + struct ad5686_state *st = iio_priv(indio_dev); + unsigned long scale_uv; + int ret; + + switch (m) { + case 0: + mutex_lock(&indio_dev->mlock); + ret = ad5686_spi_read(st, chan->address); + mutex_unlock(&indio_dev->mlock); + if (ret < 0) + return ret; + *val = ret; + return IIO_VAL_INT; + break; + case (1 << IIO_CHAN_INFO_SCALE_SHARED): + scale_uv = (st->vref_mv * 100000) + >> (chan->scan_type.realbits); + *val = scale_uv / 100000; + *val2 = (scale_uv % 100000) * 10; + return IIO_VAL_INT_PLUS_MICRO; + + } + return -EINVAL; +} + +static int ad5686_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, + int val2, + long mask) +{ + struct ad5686_state *st = iio_priv(indio_dev); + int ret; + + switch (mask) { + case 0: + if (val > (1 << chan->scan_type.realbits)) + return -EINVAL; + + mutex_lock(&indio_dev->mlock); + ret = ad5686_spi_write(st, + AD5686_CMD_WRITE_INPUT_N_UPDATE_N, + chan->address, + val, + chan->scan_type.shift); + mutex_unlock(&indio_dev->mlock); + break; + default: + ret = -EINVAL; + } + + return ret; +} + +static const struct iio_info ad5686_info = { + .read_raw = ad5686_read_raw, + .write_raw = ad5686_write_raw, + .attrs = &ad5686_attribute_group, + .driver_module = THIS_MODULE, +}; + +static int __devinit ad5686_probe(struct spi_device *spi) +{ + struct ad5686_state *st; + struct iio_dev *indio_dev; + int ret, regdone = 0, voltage_uv = 0; + + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) + return -ENOMEM; + + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); + + st->reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(st->reg)) { + ret = regulator_enable(st->reg); + if (ret) + goto error_put_reg; + + voltage_uv = regulator_get_voltage(st->reg); + } + + st->chip_info = + &ad5686_chip_info_tbl[spi_get_device_id(spi)->driver_data]; + + if (voltage_uv) + st->vref_mv = voltage_uv / 1000; + else + st->vref_mv = st->chip_info->int_vref_mv; + + st->spi = spi; + + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->info = &ad5686_info; + indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = st->chip_info->channel; + indio_dev->num_channels = AD5686_DAC_CHANNELS; + + ret = iio_device_register(indio_dev); + if (ret) + goto error_disable_reg; + + regdone = 1; + ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, + !!voltage_uv, 0); + if (ret) + goto error_disable_reg; + + return 0; + +error_disable_reg: + if (!IS_ERR(st->reg)) + regulator_disable(st->reg); +error_put_reg: + if (!IS_ERR(st->reg)) + regulator_put(st->reg); + + if (regdone) + iio_device_unregister(indio_dev); + else + iio_free_device(indio_dev); + + return ret; +} + +static int __devexit ad5686_remove(struct spi_device *spi) +{ + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad5686_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; + + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); + } + + iio_device_unregister(indio_dev); + + return 0; +} + +static const struct spi_device_id ad5686_id[] = { + {"ad5684", ID_AD5684}, + {"ad5685", ID_AD5685}, + {"ad5686", ID_AD5686}, + {} +}; + +static struct spi_driver ad5686_driver = { + .driver = { + .name = "ad5686", + .owner = THIS_MODULE, + }, + .probe = ad5686_probe, + .remove = __devexit_p(ad5686_remove), + .id_table = ad5686_id, +}; + +static __init int ad5686_spi_init(void) +{ + return spi_register_driver(&ad5686_driver); +} +module_init(ad5686_spi_init); + +static __exit void ad5686_spi_exit(void) +{ + spi_unregister_driver(&ad5686_driver); +} +module_exit(ad5686_spi_exit); + +MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); +MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/staging/iio/dac/ad5791.c b/drivers/staging/iio/dac/ad5791.c index 4eda25cba870..64770d2a1b4c 100644 --- a/drivers/staging/iio/dac/ad5791.c +++ b/drivers/staging/iio/dac/ad5791.c @@ -76,7 +76,7 @@ static ssize_t ad5791_write_dac(struct device *dev, const char *buf, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); long readin; int ret; @@ -98,7 +98,7 @@ static ssize_t ad5791_read_dac(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret; int val; @@ -118,7 +118,7 @@ static ssize_t ad5791_read_powerdown_mode(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); const char mode[][14] = {"6kohm_to_gnd", "three_state"}; @@ -130,7 +130,7 @@ static ssize_t ad5791_write_powerdown_mode(struct device *dev, const char *buf, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); int ret; if (sysfs_streq(buf, "6kohm_to_gnd")) @@ -148,7 +148,7 @@ static ssize_t ad5791_read_dac_powerdown(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); return sprintf(buf, "%d\n", st->pwr_down); } @@ -160,7 +160,7 @@ static ssize_t ad5791_write_dac_powerdown(struct device *dev, long readin; int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); ret = strict_strtol(buf, 10, &readin); if (ret) @@ -188,7 +188,7 @@ static ssize_t ad5791_show_scale(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); /* Corresponds to Vref / 2^(bits) */ unsigned int scale_uv = (st->vref_mv * 1000) >> st->chip_info->bits; @@ -201,7 +201,7 @@ static ssize_t ad5791_show_name(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ad5791_state *st = iio_dev_get_devdata(indio_dev); + struct ad5791_state *st = iio_priv(indio_dev); return sprintf(buf, "%s\n", spi_get_device_id(st->spi)->name); } @@ -295,36 +295,39 @@ static const struct iio_info ad5791_info = { static int __devinit ad5791_probe(struct spi_device *spi) { struct ad5791_platform_data *pdata = spi->dev.platform_data; + struct iio_dev *indio_dev; + struct regulator *reg_vdd, *reg_vss; struct ad5791_state *st; int ret, pos_voltage_uv = 0, neg_voltage_uv = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - - spi_set_drvdata(spi, st); - - st->reg_vdd = regulator_get(&spi->dev, "vdd"); - if (!IS_ERR(st->reg_vdd)) { - ret = regulator_enable(st->reg_vdd); + reg_vdd = regulator_get(&spi->dev, "vdd"); + if (!IS_ERR(reg_vdd)) { + ret = regulator_enable(reg_vdd); if (ret) goto error_put_reg_pos; - pos_voltage_uv = regulator_get_voltage(st->reg_vdd); + pos_voltage_uv = regulator_get_voltage(reg_vdd); } - st->reg_vss = regulator_get(&spi->dev, "vss"); - if (!IS_ERR(st->reg_vss)) { - ret = regulator_enable(st->reg_vss); + reg_vss = regulator_get(&spi->dev, "vss"); + if (!IS_ERR(reg_vss)) { + ret = regulator_enable(reg_vss); if (ret) goto error_put_reg_neg; - neg_voltage_uv = regulator_get_voltage(st->reg_vss); + neg_voltage_uv = regulator_get_voltage(reg_vss); } - if (!IS_ERR(st->reg_vss) && !IS_ERR(st->reg_vdd)) + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; + goto error_disable_reg_neg; + } + st = iio_priv(indio_dev); + st->pwr_down = true; + st->spi = spi; + + if (!IS_ERR(reg_vss) && !IS_ERR(reg_vdd)) st->vref_mv = (pos_voltage_uv - neg_voltage_uv) / 1000; else if (pdata) st->vref_mv = pdata->vref_pos_mv - pdata->vref_neg_mv; @@ -333,7 +336,7 @@ static int __devinit ad5791_probe(struct spi_device *spi) ret = ad5791_spi_write(spi, AD5791_ADDR_SW_CTRL, AD5791_SWCTRL_RESET); if (ret) - goto error_disable_reg_neg; + goto error_free_dev; st->chip_info = &ad5791_chip_info_tbl[spi_get_device_id(spi)->driver_data]; @@ -346,66 +349,61 @@ static int __devinit ad5791_probe(struct spi_device *spi) ret = ad5791_spi_write(spi, AD5791_ADDR_CTRL, st->ctrl | AD5791_CTRL_OPGND | AD5791_CTRL_DACTRI); if (ret) - goto error_disable_reg_neg; + goto error_free_dev; - st->pwr_down = true; + st->reg_vdd = reg_vdd; + st->reg_vss = reg_vss; - st->spi = spi; - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_disable_reg_neg; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->info = &ad5791_info; - st->indio_dev->modes = INDIO_DIRECT_MODE; + spi_set_drvdata(spi, indio_dev); + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ad5791_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; return 0; error_free_dev: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg_neg: - if (!IS_ERR(st->reg_vss)) - regulator_disable(st->reg_vss); + if (!IS_ERR(reg_vss)) + regulator_disable(reg_vss); error_put_reg_neg: - if (!IS_ERR(st->reg_vss)) - regulator_put(st->reg_vss); + if (!IS_ERR(reg_vss)) + regulator_put(reg_vss); - if (!IS_ERR(st->reg_vdd)) - regulator_disable(st->reg_vdd); + if (!IS_ERR(reg_vdd)) + regulator_disable(reg_vdd); error_put_reg_pos: - if (!IS_ERR(st->reg_vdd)) - regulator_put(st->reg_vdd); + if (!IS_ERR(reg_vdd)) + regulator_put(reg_vdd); - kfree(st); error_ret: return ret; } static int __devexit ad5791_remove(struct spi_device *spi) { - struct ad5791_state *st = spi_get_drvdata(spi); + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad5791_state *st = iio_priv(indio_dev); + struct regulator *reg_vdd = st->reg_vdd; + struct regulator *reg_vss = st->reg_vss; - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); if (!IS_ERR(st->reg_vdd)) { - regulator_disable(st->reg_vdd); - regulator_put(st->reg_vdd); + regulator_disable(reg_vdd); + regulator_put(reg_vdd); } if (!IS_ERR(st->reg_vss)) { - regulator_disable(st->reg_vss); - regulator_put(st->reg_vss); + regulator_disable(reg_vss); + regulator_put(reg_vss); } - kfree(st); - return 0; } diff --git a/drivers/staging/iio/dac/ad5791.h b/drivers/staging/iio/dac/ad5791.h index f09ad9a430c3..c807f26539db 100644 --- a/drivers/staging/iio/dac/ad5791.h +++ b/drivers/staging/iio/dac/ad5791.h @@ -81,7 +81,6 @@ struct ad5791_chip_info { /** * struct ad5791_state - driver instance specific data - * @indio_dev: the industrial I/O device * @us: spi_device * @reg_vdd: positive supply regulator * @reg_vss: negative supply regulator @@ -91,7 +90,6 @@ struct ad5791_chip_info { */ struct ad5791_state { - struct iio_dev *indio_dev; struct spi_device *spi; struct regulator *reg_vdd; struct regulator *reg_vss; diff --git a/drivers/staging/iio/dac/max517.c b/drivers/staging/iio/dac/max517.c index 2fe34d21b6aa..ed5d351b2387 100644 --- a/drivers/staging/iio/dac/max517.c +++ b/drivers/staging/iio/dac/max517.c @@ -59,7 +59,7 @@ static ssize_t max517_set_value(struct device *dev, const char *buf, size_t count, int channel) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct max517_data *data = iio_dev_get_devdata(dev_info); + struct max517_data *data = iio_priv(dev_info); struct i2c_client *client = data->client; u8 outbuf[4]; /* 1x or 2x command + value */ int outbuf_size = 0; @@ -127,7 +127,7 @@ static ssize_t max517_show_scale(struct device *dev, char *buf, int channel) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct max517_data *data = iio_dev_get_devdata(dev_info); + struct max517_data *data = iio_priv(dev_info); /* Corresponds to Vref / 2^(bits) */ unsigned int scale_uv = (data->vref_mv[channel - 1] * 1000) >> 8; @@ -203,35 +203,28 @@ static int max517_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct max517_data *data; + struct iio_dev *indio_dev; struct max517_platform_data *platform_data = client->dev.platform_data; int err; - data = kzalloc(sizeof(struct max517_data), GFP_KERNEL); - if (!data) { + indio_dev = iio_allocate_device(sizeof(*data)); + if (indio_dev == NULL) { err = -ENOMEM; goto exit; } - - i2c_set_clientdata(client, data); - + data = iio_priv(indio_dev); + i2c_set_clientdata(client, indio_dev); data->client = client; - data->indio_dev = iio_allocate_device(0); - if (data->indio_dev == NULL) { - err = -ENOMEM; - goto exit_free_data; - } - /* establish that the iio_dev is a child of the i2c device */ - data->indio_dev->dev.parent = &client->dev; + indio_dev->dev.parent = &client->dev; /* reduced attribute set for MAX517 */ if (id->driver_data == ID_MAX517) - data->indio_dev->info = &max517_info; + indio_dev->info = &max517_info; else - data->indio_dev->info = &max518_info; - data->indio_dev->dev_data = (void *)(data); - data->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->info = &max518_info; + indio_dev->modes = INDIO_DIRECT_MODE; /* * Reference voltage on MAX518 and default is 5V, else take vref_mv @@ -244,7 +237,7 @@ static int max517_probe(struct i2c_client *client, data->vref_mv[1] = platform_data->vref_mv[1]; } - err = iio_device_register(data->indio_dev); + err = iio_device_register(indio_dev); if (err) goto exit_free_device; @@ -253,19 +246,14 @@ static int max517_probe(struct i2c_client *client, return 0; exit_free_device: - iio_free_device(data->indio_dev); -exit_free_data: - kfree(data); + iio_free_device(indio_dev); exit: return err; } static int max517_remove(struct i2c_client *client) { - struct max517_data *data = i2c_get_clientdata(client); - - iio_free_device(data->indio_dev); - kfree(data); + iio_free_device(i2c_get_clientdata(client)); return 0; } diff --git a/drivers/staging/iio/dds/ad5930.c b/drivers/staging/iio/dds/ad5930.c index 490c3637bc8e..0b2aa4cafdd8 100644 --- a/drivers/staging/iio/dds/ad5930.c +++ b/drivers/staging/iio/dds/ad5930.c @@ -35,7 +35,6 @@ struct ad5903_config { struct ad5930_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; }; @@ -49,7 +48,7 @@ static ssize_t ad5930_set_parameter(struct device *dev, int ret; struct ad5903_config *config = (struct ad5903_config *)buf; struct iio_dev *idev = dev_get_drvdata(dev); - struct ad5930_state *st = idev->dev_data; + struct ad5930_state *st = iio_priv(idev); config->control = (config->control & ~value_mask); config->incnum = (config->control & ~value_mask) | (1 << addr_shift); @@ -83,42 +82,35 @@ static struct attribute *ad5930_attributes[] = { }; static const struct attribute_group ad5930_attribute_group = { - .name = DRV_NAME, .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; + struct iio_dev *idev; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + idev = iio_allocate_device(sizeof(*st)); + if (idev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, idev); + st = iio_priv(idev); mutex_init(&st->lock); st->sdev = spi; + idev->dev.parent = &spi->dev; + idev->info = &ad5930_info; + idev->modes = INDIO_DIRECT_MODE; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; - st->idev->dev_data = (void *)(st); - st->idev->info = &ad5930_info; - st->idev->modes = INDIO_DIRECT_MODE; - - ret = iio_device_register(st->idev); + ret = iio_device_register(idev); if (ret) goto error_free_dev; spi->max_speed_hz = 2000000; @@ -129,19 +121,14 @@ static int __devinit ad5930_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(idev); error_ret: return ret; } static int __devexit ad5930_remove(struct spi_device *spi) { - struct ad5930_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/dds/ad9832.c b/drivers/staging/iio/dds/ad9832.c index e8fe1426a329..e3e61a469bb8 100644 --- a/drivers/staging/iio/dds/ad9832.c +++ b/drivers/staging/iio/dds/ad9832.c @@ -77,7 +77,7 @@ static ssize_t ad9832_write(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9832_state *st = dev_info->dev_data; + struct ad9832_state *st = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret; long val; @@ -203,7 +203,9 @@ static const struct iio_info ad9832_info = { static int __devinit ad9832_probe(struct spi_device *spi) { struct ad9832_platform_data *pdata = spi->dev.platform_data; + struct iio_dev *indio_dev; struct ad9832_state *st; + struct regulator *reg; int ret; if (!pdata) { @@ -211,35 +213,28 @@ static int __devinit ad9832_probe(struct spi_device *spi) return -ENODEV; } - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; } - st->mclk = pdata->mclk; - - spi_set_drvdata(spi, st); - st->spi = spi; - - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_disable_reg; } + spi_set_drvdata(spi, indio_dev); + st = iio_priv(indio_dev); + st->reg = reg; + st->mclk = pdata->mclk; + st->spi = spi; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->info = &ad9832_info; - st->indio_dev->dev_data = (void *) st; - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->info = &ad9832_info; + indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default messages */ @@ -310,35 +305,35 @@ static int __devinit ad9832_probe(struct spi_device *spi) if (ret) goto error_free_device; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_device; return 0; error_free_device: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) - regulator_disable(st->reg); + if (!IS_ERR(reg)) + regulator_disable(reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); - kfree(st); -error_ret: + if (!IS_ERR(reg)) + regulator_put(reg); + return ret; } static int __devexit ad9832_remove(struct spi_device *spi) { - struct ad9832_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->indio_dev); - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad9832_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; + + iio_device_unregister(indio_dev); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); return 0; } diff --git a/drivers/staging/iio/dds/ad9832.h b/drivers/staging/iio/dds/ad9832.h index 5d474543dfce..c5b701f8aabb 100644 --- a/drivers/staging/iio/dds/ad9832.h +++ b/drivers/staging/iio/dds/ad9832.h @@ -57,7 +57,6 @@ /** * struct ad9832_state - driver instance specific data - * @indio_dev: the industrial I/O device * @spi: spi_device * @reg: supply regulator * @mclk: external master clock @@ -76,7 +75,6 @@ */ struct ad9832_state { - struct iio_dev *indio_dev; struct spi_device *spi; struct regulator *reg; unsigned long mclk; diff --git a/drivers/staging/iio/dds/ad9834.c b/drivers/staging/iio/dds/ad9834.c index 0ebe8d58e92e..e6454d58fe41 100644 --- a/drivers/staging/iio/dds/ad9834.c +++ b/drivers/staging/iio/dds/ad9834.c @@ -66,7 +66,7 @@ static ssize_t ad9834_write(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9834_state *st = dev_info->dev_data; + struct ad9834_state *st = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret; long val; @@ -145,7 +145,7 @@ static ssize_t ad9834_store_wavetype(struct device *dev, size_t len) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9834_state *st = dev_info->dev_data; + struct ad9834_state *st = iio_priv(dev_info); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); int ret = 0; bool is_ad9833_7 = (st->devid == ID_AD9833) || (st->devid == ID_AD9837); @@ -203,7 +203,7 @@ static ssize_t ad9834_show_out0_wavetype_available(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9834_state *st = iio_dev_get_devdata(dev_info); + struct ad9834_state *st = iio_priv(dev_info); char *str; if ((st->devid == ID_AD9833) || (st->devid == ID_AD9837)) @@ -225,7 +225,7 @@ static ssize_t ad9834_show_out1_wavetype_available(struct device *dev, char *buf) { struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9834_state *st = iio_dev_get_devdata(dev_info); + struct ad9834_state *st = iio_priv(dev_info); char *str; if (st->control & AD9834_MODE) @@ -285,7 +285,7 @@ static mode_t ad9834_attr_is_visible(struct kobject *kobj, { struct device *dev = container_of(kobj, struct device, kobj); struct iio_dev *dev_info = dev_get_drvdata(dev); - struct ad9834_state *st = iio_dev_get_devdata(dev_info); + struct ad9834_state *st = iio_priv(dev_info); mode_t mode = attr->mode; @@ -314,6 +314,8 @@ static int __devinit ad9834_probe(struct spi_device *spi) { struct ad9834_platform_data *pdata = spi->dev.platform_data; struct ad9834_state *st; + struct iio_dev *indio_dev; + struct regulator *reg; int ret; if (!pdata) { @@ -321,37 +323,28 @@ static int __devinit ad9834_probe(struct spi_device *spi) return -ENODEV; } - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { - ret = -ENOMEM; - goto error_ret; - } - - st->reg = regulator_get(&spi->dev, "vcc"); - if (!IS_ERR(st->reg)) { - ret = regulator_enable(st->reg); + reg = regulator_get(&spi->dev, "vcc"); + if (!IS_ERR(reg)) { + ret = regulator_enable(reg); if (ret) goto error_put_reg; } - st->mclk = pdata->mclk; - - spi_set_drvdata(spi, st); - - st->spi = spi; - st->devid = spi_get_device_id(spi)->driver_data; - - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_disable_reg; } - - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->name = spi_get_device_id(spi)->name; - st->indio_dev->info = &ad9834_info; - st->indio_dev->dev_data = (void *) st; - st->indio_dev->modes = INDIO_DIRECT_MODE; + spi_set_drvdata(spi, indio_dev); + st = iio_priv(indio_dev); + st->mclk = pdata->mclk; + st->spi = spi; + st->devid = spi_get_device_id(spi)->driver_data; + st->reg = reg; + indio_dev->dev.parent = &spi->dev; + indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->info = &ad9834_info; + indio_dev->modes = INDIO_DIRECT_MODE; /* Setup default messages */ @@ -402,35 +395,35 @@ static int __devinit ad9834_probe(struct spi_device *spi) if (ret) goto error_free_device; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_device; return 0; error_free_device: - iio_free_device(st->indio_dev); + iio_free_device(indio_dev); error_disable_reg: - if (!IS_ERR(st->reg)) - regulator_disable(st->reg); + if (!IS_ERR(reg)) + regulator_disable(reg); error_put_reg: - if (!IS_ERR(st->reg)) - regulator_put(st->reg); - kfree(st); -error_ret: + if (!IS_ERR(reg)) + regulator_put(reg); return ret; } static int __devexit ad9834_remove(struct spi_device *spi) { - struct ad9834_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->indio_dev); - if (!IS_ERR(st->reg)) { - regulator_disable(st->reg); - regulator_put(st->reg); + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad9834_state *st = iio_priv(indio_dev); + struct regulator *reg = st->reg; + + iio_device_unregister(indio_dev); + if (!IS_ERR(reg)) { + regulator_disable(reg); + regulator_put(reg); } - kfree(st); + return 0; } diff --git a/drivers/staging/iio/dds/ad9834.h b/drivers/staging/iio/dds/ad9834.h index 2abd63587e03..ed5ed8d0007f 100644 --- a/drivers/staging/iio/dds/ad9834.h +++ b/drivers/staging/iio/dds/ad9834.h @@ -38,7 +38,6 @@ /** * struct ad9834_state - driver instance specific data - * @indio_dev: the industrial I/O device * @spi: spi_device * @reg: supply regulator * @mclk: external master clock @@ -52,7 +51,6 @@ */ struct ad9834_state { - struct iio_dev *indio_dev; struct spi_device *spi; struct regulator *reg; unsigned int mclk; diff --git a/drivers/staging/iio/dds/ad9850.c b/drivers/staging/iio/dds/ad9850.c index b580d852a1ee..d7c9d05f6359 100644 --- a/drivers/staging/iio/dds/ad9850.c +++ b/drivers/staging/iio/dds/ad9850.c @@ -30,7 +30,6 @@ struct ad9850_config { struct ad9850_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; }; @@ -44,7 +43,7 @@ static ssize_t ad9850_set_parameter(struct device *dev, int ret; struct ad9850_config *config = (struct ad9850_config *)buf; struct iio_dev *idev = dev_get_drvdata(dev); - struct ad9850_state *st = idev->dev_data; + struct ad9850_state *st = iio_priv(idev); xfer.len = len; xfer.tx_buf = config; @@ -69,7 +68,6 @@ static struct attribute *ad9850_attributes[] = { }; static const struct attribute_group ad9850_attribute_group = { - .name = DRV_NAME, .attrs = ad9850_attributes, }; @@ -81,30 +79,24 @@ static const struct iio_info ad9850_info = { static int __devinit ad9850_probe(struct spi_device *spi) { struct ad9850_state *st; + struct iio_dev *idev; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + idev = iio_allocate_device(sizeof(*st)); + if (idev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, idev); + st = iio_priv(idev); mutex_init(&st->lock); st->sdev = spi; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; - - st->idev->info = &ad9850_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; + idev->dev.parent = &spi->dev; + idev->info = &ad9850_info; + idev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->idev); + ret = iio_device_register(idev); if (ret) goto error_free_dev; spi->max_speed_hz = 2000000; @@ -115,19 +107,14 @@ static int __devinit ad9850_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(idev); error_ret: return ret; } static int __devexit ad9850_remove(struct spi_device *spi) { - struct ad9850_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/dds/ad9852.c b/drivers/staging/iio/dds/ad9852.c index 08020f96300a..0184585425d8 100644 --- a/drivers/staging/iio/dds/ad9852.c +++ b/drivers/staging/iio/dds/ad9852.c @@ -58,7 +58,6 @@ struct ad9852_config { struct ad9852_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; }; @@ -72,7 +71,7 @@ static ssize_t ad9852_set_parameter(struct device *dev, int ret; struct ad9852_config *config = (struct ad9852_config *)buf; struct iio_dev *idev = dev_get_drvdata(dev); - struct ad9852_state *st = idev->dev_data; + struct ad9852_state *st = iio_priv(idev); xfer.len = 3; xfer.tx_buf = &config->phajst0[0]; @@ -230,30 +229,24 @@ static const struct iio_info ad9852_info = { static int __devinit ad9852_probe(struct spi_device *spi) { struct ad9852_state *st; + struct iio_dev *idev; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + idev = iio_allocate_device(sizeof(*st)); + if (idev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - + st = iio_priv(idev); + spi_set_drvdata(spi, idev); mutex_init(&st->lock); st->sdev = spi; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; + idev->dev.parent = &spi->dev; + idev->info = &ad9852_info; + idev->modes = INDIO_DIRECT_MODE; - st->idev->info = &ad9852_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; - - ret = iio_device_register(st->idev); + ret = iio_device_register(idev); if (ret) goto error_free_dev; spi->max_speed_hz = 2000000; @@ -261,22 +254,19 @@ static int __devinit ad9852_probe(struct spi_device *spi) spi->bits_per_word = 8; spi_setup(spi); ad9852_init(st); + return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(idev); + error_ret: return ret; } static int __devexit ad9852_remove(struct spi_device *spi) { - struct ad9852_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/dds/ad9910.c b/drivers/staging/iio/dds/ad9910.c index 97d75d755824..0fa217f7b901 100644 --- a/drivers/staging/iio/dds/ad9910.c +++ b/drivers/staging/iio/dds/ad9910.c @@ -110,7 +110,6 @@ struct ad9910_config { struct ad9910_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; }; @@ -124,7 +123,7 @@ static ssize_t ad9910_set_parameter(struct device *dev, int ret; struct ad9910_config *config = (struct ad9910_config *)buf; struct iio_dev *idev = dev_get_drvdata(dev); - struct ad9910_state *st = idev->dev_data; + struct ad9910_state *st = iio_priv(idev); xfer.len = 5; xfer.tx_buf = &config->auxdac[0]; @@ -365,30 +364,24 @@ static const struct iio_info ad9910_info = { static int __devinit ad9910_probe(struct spi_device *spi) { struct ad9910_state *st; + struct iio_dev *idev; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + idev = iio_allocate_device(sizeof(*st)); + if (idev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, idev); + st = iio_priv(idev); mutex_init(&st->lock); st->sdev = spi; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; - - st->idev->info = &ad9910_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; + idev->dev.parent = &spi->dev; + idev->info = &ad9910_info; + idev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->idev); + ret = iio_device_register(idev); if (ret) goto error_free_dev; spi->max_speed_hz = 2000000; @@ -399,19 +392,14 @@ static int __devinit ad9910_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(idev); error_ret: return ret; } static int __devexit ad9910_remove(struct spi_device *spi) { - struct ad9910_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/dds/ad9951.c b/drivers/staging/iio/dds/ad9951.c index d4dfcd41d5f9..d361d1f125de 100644 --- a/drivers/staging/iio/dds/ad9951.c +++ b/drivers/staging/iio/dds/ad9951.c @@ -51,7 +51,6 @@ struct ad9951_config { struct ad9951_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; }; @@ -65,7 +64,7 @@ static ssize_t ad9951_set_parameter(struct device *dev, int ret; struct ad9951_config *config = (struct ad9951_config *)buf; struct iio_dev *idev = dev_get_drvdata(dev); - struct ad9951_state *st = idev->dev_data; + struct ad9951_state *st = iio_priv(idev); xfer.len = 3; xfer.tx_buf = &config->asf[0]; @@ -174,30 +173,25 @@ static const struct iio_info ad9951_info = { static int __devinit ad9951_probe(struct spi_device *spi) { struct ad9951_state *st; + struct iio_dev *idev; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + idev = iio_allocate_device(sizeof(*st)); + if (idev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, idev); + st = iio_priv(idev); mutex_init(&st->lock); st->sdev = spi; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; + idev->dev.parent = &spi->dev; - st->idev->info = &ad9951_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; + idev->info = &ad9951_info; + idev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->idev); + ret = iio_device_register(idev); if (ret) goto error_free_dev; spi->max_speed_hz = 2000000; @@ -208,19 +202,15 @@ static int __devinit ad9951_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(idev); + error_ret: return ret; } static int __devexit ad9951_remove(struct spi_device *spi) { - struct ad9951_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/gyro/adis16060_core.c b/drivers/staging/iio/gyro/adis16060_core.c index edf9e3bf3efd..afa52d1961a9 100644 --- a/drivers/staging/iio/gyro/adis16060_core.c +++ b/drivers/staging/iio/gyro/adis16060_core.c @@ -29,27 +29,25 @@ * struct adis16060_state - device instance specific data * @us_w: actual spi_device to write config * @us_r: actual spi_device to read back data - * @indio_dev: industrial I/O device structure * @buf: transmit or receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16060_state { struct spi_device *us_w; struct spi_device *us_r; - struct iio_dev *indio_dev; struct mutex buf_lock; u8 buf[3] ____cacheline_aligned; }; -static struct adis16060_state *adis16060_st; +static struct iio_dev *adis16060_iio_dev; static int adis16060_spi_write(struct device *dev, u8 val) { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16060_state *st = iio_dev_get_devdata(indio_dev); + struct adis16060_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->buf[2] = val; /* The last 8 bits clocked in are latched */ @@ -64,7 +62,7 @@ static int adis16060_spi_read(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16060_state *st = iio_dev_get_devdata(indio_dev); + struct adis16060_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); @@ -141,43 +139,38 @@ static const struct iio_info adis16060_info = { static int __devinit adis16060_r_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16060_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16060_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, indio_dev); + st = iio_priv(indio_dev); st->us_r = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16060_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16060_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; - adis16060_st = st; + adis16060_iio_dev = indio_dev; return 0; error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } @@ -185,11 +178,7 @@ error_ret: /* fixme, confirm ordering in this function */ static int adis16060_r_remove(struct spi_device *spi) { - struct adis16060_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; - - iio_device_unregister(indio_dev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } @@ -197,12 +186,14 @@ static int adis16060_r_remove(struct spi_device *spi) static int __devinit adis16060_w_probe(struct spi_device *spi) { int ret; - struct adis16060_state *st = adis16060_st; - if (!st) { + struct iio_dev *indio_dev = adis16060_iio_dev; + struct adis16060_state *st; + if (!indio_dev) { ret = -ENODEV; goto error_ret; } - spi_set_drvdata(spi, st); + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); st->us_w = spi; return 0; diff --git a/drivers/staging/iio/gyro/adis16080_core.c b/drivers/staging/iio/gyro/adis16080_core.c index d42690bea066..ad2db4d723df 100644 --- a/drivers/staging/iio/gyro/adis16080_core.c +++ b/drivers/staging/iio/gyro/adis16080_core.c @@ -34,13 +34,11 @@ /** * struct adis16080_state - device instance specific data * @us: actual spi_device to write data - * @indio_dev: industrial I/O device structure * @buf: transmit or receive buffer * @buf_lock: mutex to protect tx and rx **/ struct adis16080_state { struct spi_device *us; - struct iio_dev *indio_dev; struct mutex buf_lock; u8 buf[2] ____cacheline_aligned; @@ -51,7 +49,7 @@ static int adis16080_spi_write(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16080_state *st = iio_dev_get_devdata(indio_dev); + struct adis16080_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->buf[0] = val >> 8; @@ -68,7 +66,7 @@ static int adis16080_spi_read(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16080_state *st = iio_dev_get_devdata(indio_dev); + struct adis16080_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); @@ -131,31 +129,29 @@ static const struct iio_info adis16080_info = { static int __devinit adis16080_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adis16080_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16080_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + st = iio_priv(indio_dev); /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); /* Allocate the comms buffers */ st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16080_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16080_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; @@ -164,11 +160,9 @@ static int __devinit adis16080_probe(struct spi_device *spi) error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } @@ -176,11 +170,7 @@ error_ret: /* fixme, confirm ordering in this function */ static int adis16080_remove(struct spi_device *spi) { - struct adis16080_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; - - iio_device_unregister(indio_dev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/gyro/adis16130_core.c b/drivers/staging/iio/gyro/adis16130_core.c index 14d5a34ab441..c80e908d8acf 100644 --- a/drivers/staging/iio/gyro/adis16130_core.c +++ b/drivers/staging/iio/gyro/adis16130_core.c @@ -41,14 +41,12 @@ /** * struct adis16130_state - device instance specific data * @us: actual spi_device to write data - * @indio_dev: industrial I/O device structure * @mode: 24 bits (1) or 16 bits (0) * @buf_lock: mutex to protect tx and rx * @buf: unified tx/rx buffer **/ struct adis16130_state { struct spi_device *us; - struct iio_dev *indio_dev; u32 mode; struct mutex buf_lock; u8 buf[4] ____cacheline_aligned; @@ -59,7 +57,7 @@ static int adis16130_spi_write(struct device *dev, u8 reg_addr, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16130_state *st = iio_dev_get_devdata(indio_dev); + struct adis16130_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->buf[0] = reg_addr; @@ -76,7 +74,7 @@ static int adis16130_spi_read(struct device *dev, u8 reg_addr, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16130_state *st = iio_dev_get_devdata(indio_dev); + struct adis16130_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); @@ -125,7 +123,7 @@ static ssize_t adis16130_bitsmode_read(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16130_state *st = iio_dev_get_devdata(indio_dev); + struct adis16130_state *st = iio_priv(indio_dev); if (st->mode == 1) return sprintf(buf, "s24\n"); @@ -183,39 +181,35 @@ static const struct iio_info adis16130_info = { static int __devinit adis16130_probe(struct spi_device *spi) { int ret; - struct adis16130_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16130_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + st = iio_priv(indio_dev); /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16130_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16130_info; + indio_dev->modes = INDIO_DIRECT_MODE; st->mode = 1; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; return 0; error_free_dev: - iio_free_device(st->indio_dev); -error_free_st: - kfree(st); + iio_free_device(indio_dev); + error_ret: return ret; } @@ -223,11 +217,7 @@ error_ret: /* fixme, confirm ordering in this function */ static int adis16130_remove(struct spi_device *spi) { - struct adis16130_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; - - iio_device_unregister(indio_dev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/gyro/adis16260.h b/drivers/staging/iio/gyro/adis16260.h index 24bf70e4b29b..969b624be6d3 100644 --- a/drivers/staging/iio/gyro/adis16260.h +++ b/drivers/staging/iio/gyro/adis16260.h @@ -85,21 +85,19 @@ /** * struct adis16260_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @trig: data ready trigger registered with iio - * @tx: transmit buffer - * @rx: receive buffer * @buf_lock: mutex to protect tx and rx * @negate: negate the scale parameter + * @tx: transmit buffer + * @rx: receive buffer **/ struct adis16260_state { - struct spi_device *us; - struct iio_dev *indio_dev; - struct iio_trigger *trig; - u8 *tx; - u8 *rx; - struct mutex buf_lock; - unsigned negate:1; + struct spi_device *us; + struct iio_trigger *trig; + struct mutex buf_lock; + unsigned negate:1; + u8 tx[ADIS16260_MAX_TX] ____cacheline_aligned; + u8 rx[ADIS16260_MAX_RX]; }; int adis16260_set_irq(struct iio_dev *indio_dev, bool enable); diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c index 3dc9a272749d..05797f404bea 100644 --- a/drivers/staging/iio/gyro/adis16260_core.c +++ b/drivers/staging/iio/gyro/adis16260_core.c @@ -41,7 +41,7 @@ static int adis16260_spi_write_reg_8(struct iio_dev *indio_dev, u8 val) { int ret; - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADIS16260_WRITE_REG(reg_address); @@ -66,7 +66,7 @@ static int adis16260_spi_write_reg_16(struct iio_dev *indio_dev, { int ret; struct spi_message msg; - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); struct spi_transfer xfers[] = { { .tx_buf = st->tx, @@ -109,7 +109,7 @@ static int adis16260_spi_read_reg_16(struct iio_dev *indio_dev, u16 *val) { struct spi_message msg; - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -152,7 +152,7 @@ static ssize_t adis16260_read_frequency_available(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); if (spi_get_device_id(st->us)->driver_data) return sprintf(buf, "%s\n", "0.129 ~ 256"); else @@ -164,7 +164,7 @@ static ssize_t adis16260_read_frequency(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); int ret, len = 0; u16 t; int sps; @@ -189,7 +189,7 @@ static ssize_t adis16260_write_frequency(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); long val; int ret; u8 t; @@ -435,7 +435,7 @@ static int adis16260_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); int ret; int bits; u8 addr; @@ -576,71 +576,58 @@ static int __devinit adis16260_probe(struct spi_device *spi) { int ret, regdone = 0; struct adis16260_platform_data *pd = spi->dev.platform_data; - struct adis16260_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct adis16260_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } + st = iio_priv(indio_dev); if (pd) st->negate = pd->negate; /* this is only used for removal purposes */ spi_set_drvdata(spi, st); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADIS16260_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADIS16260_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi_get_device_id(st->us)->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adis16260_info; - st->indio_dev->num_channels + indio_dev->name = spi_get_device_id(st->us)->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adis16260_info; + indio_dev->num_channels = ARRAY_SIZE(adis16260_channels_x); if (pd && pd->direction) switch (pd->direction) { case 'x': - st->indio_dev->channels = adis16260_channels_x; + indio_dev->channels = adis16260_channels_x; break; case 'y': - st->indio_dev->channels = adis16260_channels_y; + indio_dev->channels = adis16260_channels_y; break; case 'z': - st->indio_dev->channels = adis16260_channels_z; + indio_dev->channels = adis16260_channels_z; break; default: return -EINVAL; } else - st->indio_dev->channels = adis16260_channels_x; - - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->channels = adis16260_channels_x; + indio_dev->num_channels = ARRAY_SIZE(adis16260_channels_x); + indio_dev->modes = INDIO_DIRECT_MODE; - ret = adis16260_configure_ring(st->indio_dev); + ret = adis16260_configure_ring(indio_dev); if (ret) goto error_free_dev; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_unreg_ring_funcs; regdone = 1; - ret = iio_ring_buffer_register_ex(st->indio_dev->ring, 0, - st->indio_dev->channels, + ret = iio_ring_buffer_register_ex(indio_dev->ring, 0, + indio_dev->channels, ARRAY_SIZE(adis16260_channels_x)); if (ret) { printk(KERN_ERR "failed to initialize the ring\n"); @@ -648,34 +635,28 @@ static int __devinit adis16260_probe(struct spi_device *spi) } if (spi->irq) { - ret = adis16260_probe_trigger(st->indio_dev); + ret = adis16260_probe_trigger(indio_dev); if (ret) goto error_uninitialize_ring; } /* Get the device into a sane initial state */ - ret = adis16260_initial_setup(st->indio_dev); + ret = adis16260_initial_setup(indio_dev); if (ret) goto error_remove_trigger; return 0; error_remove_trigger: - adis16260_remove_trigger(st->indio_dev); + adis16260_remove_trigger(indio_dev); error_uninitialize_ring: - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); error_unreg_ring_funcs: - adis16260_unconfigure_ring(st->indio_dev); + adis16260_unconfigure_ring(indio_dev); error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } @@ -683,8 +664,7 @@ error_ret: static int adis16260_remove(struct spi_device *spi) { int ret; - struct adis16260_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); ret = adis16260_stop_device(indio_dev); if (ret) @@ -693,13 +673,9 @@ static int adis16260_remove(struct spi_device *spi) flush_scheduled_work(); adis16260_remove_trigger(indio_dev); - - iio_ring_buffer_unregister(st->indio_dev->ring); + iio_ring_buffer_unregister(indio_dev->ring); iio_device_unregister(indio_dev); adis16260_unconfigure_ring(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); err_ret: return ret; diff --git a/drivers/staging/iio/gyro/adis16260_ring.c b/drivers/staging/iio/gyro/adis16260_ring.c index a0925044eaa5..a4df8b32251e 100644 --- a/drivers/staging/iio/gyro/adis16260_ring.c +++ b/drivers/staging/iio/gyro/adis16260_ring.c @@ -17,7 +17,6 @@ #include "../trigger.h" #include "adis16260.h" - /** * adis16260_read_ring_data() read data registers which will be placed into ring * @dev: device associated with child of actual device (iio_dev or iio_trig) @@ -27,7 +26,7 @@ static int adis16260_read_ring_data(struct device *dev, u8 *rx) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); struct spi_transfer xfers[ADIS16260_OUTPUTS + 1]; int ret; int i; @@ -70,7 +69,7 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p) { struct iio_poll_func *pf = p; struct iio_dev *indio_dev = pf->private_data; - struct adis16260_state *st = iio_dev_get_devdata(indio_dev); + struct adis16260_state *st = iio_priv(indio_dev); struct iio_ring_buffer *ring = indio_dev->ring; int i = 0; s16 *data; @@ -83,7 +82,7 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p) } if (ring->scan_count && - adis16260_read_ring_data(&st->indio_dev->dev, st->rx) >= 0) + adis16260_read_ring_data(&indio_dev->dev, st->rx) >= 0) for (; i < ring->scan_count; i++) data[i] = be16_to_cpup((__be16 *)&(st->rx[i*2])); @@ -93,7 +92,7 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p) ring->access->store_to(ring, (u8 *)data, pf->timestamp); - iio_trigger_notify_done(st->indio_dev->trig); + iio_trigger_notify_done(indio_dev->trig); kfree(data); return IRQ_HANDLED; diff --git a/drivers/staging/iio/gyro/adis16260_trigger.c b/drivers/staging/iio/gyro/adis16260_trigger.c index 4f10fb543356..01094d0e714a 100644 --- a/drivers/staging/iio/gyro/adis16260_trigger.c +++ b/drivers/staging/iio/gyro/adis16260_trigger.c @@ -18,8 +18,7 @@ static int adis16260_data_rdy_trigger_set_state(struct iio_trigger *trig, bool state) { - struct adis16260_state *st = trig->private_data; - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = trig->private_data; dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state); return adis16260_set_irq(indio_dev, state); @@ -28,7 +27,7 @@ static int adis16260_data_rdy_trigger_set_state(struct iio_trigger *trig, int adis16260_probe_trigger(struct iio_dev *indio_dev) { int ret; - struct adis16260_state *st = indio_dev->dev_data; + struct adis16260_state *st = iio_priv(indio_dev); st->trig = iio_allocate_trigger("%s-dev%d", spi_get_device_id(st->us)->name, @@ -48,7 +47,7 @@ int adis16260_probe_trigger(struct iio_dev *indio_dev) st->trig->dev.parent = &st->us->dev; st->trig->owner = THIS_MODULE; - st->trig->private_data = st; + st->trig->private_data = indio_dev; st->trig->set_trigger_state = &adis16260_data_rdy_trigger_set_state; ret = iio_trigger_register(st->trig); @@ -69,9 +68,9 @@ error_ret: void adis16260_remove_trigger(struct iio_dev *indio_dev) { - struct adis16260_state *state = indio_dev->dev_data; + struct adis16260_state *st = iio_priv(indio_dev); - iio_trigger_unregister(state->trig); - free_irq(state->us->irq, state->trig); - iio_free_trigger(state->trig); + iio_trigger_unregister(st->trig); + free_irq(st->us->irq, st->trig); + iio_free_trigger(st->trig); } diff --git a/drivers/staging/iio/gyro/adxrs450.h b/drivers/staging/iio/gyro/adxrs450.h index c92f6945f00f..b6b682876406 100644 --- a/drivers/staging/iio/gyro/adxrs450.h +++ b/drivers/staging/iio/gyro/adxrs450.h @@ -42,17 +42,16 @@ /** * struct adxrs450_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure + * @buf_lock: mutex to protect tx and rx * @tx: transmit buffer * @rx: recieve buffer - * @buf_lock: mutex to protect tx and rx **/ struct adxrs450_state { - struct spi_device *us; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct mutex buf_lock; + u8 tx[ADXRS450_MAX_RX] ____cacheline_aligned; + u8 rx[ADXRS450_MAX_TX]; + }; #endif /* SPI_ADXRS450_H_ */ diff --git a/drivers/staging/iio/gyro/adxrs450_core.c b/drivers/staging/iio/gyro/adxrs450_core.c index 3714e4aadc23..7502a264770b 100644 --- a/drivers/staging/iio/gyro/adxrs450_core.c +++ b/drivers/staging/iio/gyro/adxrs450_core.c @@ -38,7 +38,7 @@ static int adxrs450_spi_read_reg_16(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adxrs450_state *st = iio_dev_get_devdata(indio_dev); + struct adxrs450_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -92,7 +92,7 @@ static int adxrs450_spi_write_reg_16(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adxrs450_state *st = iio_dev_get_devdata(indio_dev); + struct adxrs450_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers = { .tx_buf = st->tx, @@ -130,7 +130,7 @@ static int adxrs450_spi_sensor_data(struct device *dev, s16 *val) { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct adxrs450_state *st = iio_dev_get_devdata(indio_dev); + struct adxrs450_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -267,12 +267,13 @@ static ssize_t adxrs450_read_sensor_data(struct device *dev, } /* Recommended Startup Sequence by spec */ -static int adxrs450_initial_setup(struct adxrs450_state *st) +static int adxrs450_initial_setup(struct iio_dev *indio_dev) { u32 t; u16 data; int ret; - struct device *dev = &st->indio_dev->dev; + struct device *dev = &indio_dev->dev; + struct adxrs450_state *st = iio_priv(indio_dev); msleep(ADXRS450_STARTUP_DELAY*2); ret = adxrs450_spi_initial(st, &t, 1); @@ -357,46 +358,32 @@ static const struct iio_info adxrs450_info = { static int __devinit adxrs450_probe(struct spi_device *spi) { int ret, regdone = 0; - struct adxrs450_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - goto error_ret; - } - /* This is only used for removal purposes */ - spi_set_drvdata(spi, st); + struct adxrs450_state *st; + struct iio_dev *indio_dev; - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADXRS450_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADXRS450_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; - goto error_free_rx; + goto error_ret; } + st = iio_priv(indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } + /* This is only used for removal purposes */ + spi_set_drvdata(spi, indio_dev); - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &adxrs450_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &adxrs450_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; /* Get the device into a sane initial state */ - ret = adxrs450_initial_setup(st); + ret = adxrs450_initial_setup(indio_dev); if (ret) goto error_initial; return 0; @@ -404,27 +391,17 @@ static int __devinit adxrs450_probe(struct spi_device *spi) error_initial: error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); + error_ret: return ret; } static int adxrs450_remove(struct spi_device *spi) { - struct adxrs450_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h index 38f1425f4645..7a6ce4d0fb7b 100644 --- a/drivers/staging/iio/iio.h +++ b/drivers/staging/iio/iio.h @@ -30,6 +30,7 @@ enum iio_chan_type { /* real channel types */ IIO_IN, + IIO_OUT, IIO_CURRENT, IIO_POWER, IIO_ACCEL, @@ -202,6 +203,9 @@ 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 +#define IIO_VAL_INT_PLUS_NANO 3 + +struct iio_trigger; /* forward declaration */ /** * struct iio_info - constant information about device @@ -217,12 +221,17 @@ static inline s64 iio_get_time_ns(void) * 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. + * @write_raw_get_fmt: callback function to query the expected + * format/precision. If not set by the driver, write_raw + * returns IIO_VAL_INT_PLUS_MICRO. * @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. + * @validate_trigger: function to validate the trigger when the + * current trigger gets changed. **/ struct iio_info { struct module *driver_module; @@ -242,6 +251,10 @@ struct iio_info { int val2, long mask); + int (*write_raw_get_fmt)(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + long mask); + int (*read_event_config)(struct iio_dev *indio_dev, int event_code); @@ -255,6 +268,9 @@ struct iio_info { int (*write_event_value)(struct iio_dev *indio_dev, int event_code, int val); + int (*validate_trigger)(struct iio_dev *indio_dev, + struct iio_trigger *trig); + }; /** diff --git a/drivers/staging/iio/imu/adis16400.h b/drivers/staging/iio/imu/adis16400.h index e87715b9acc6..1f8f0c60c2c3 100644 --- a/drivers/staging/iio/imu/adis16400.h +++ b/drivers/staging/iio/imu/adis16400.h @@ -41,6 +41,9 @@ #define ADIS16350_YTEMP_OUT 0x12 /* Y-axis gyroscope temperature measurement */ #define ADIS16350_ZTEMP_OUT 0x14 /* Z-axis gyroscope temperature measurement */ +#define ADIS16300_PITCH_OUT 0x12 /* X axis inclinometer output measurement */ +#define ADIS16300_ROLL_OUT 0x12 /* Y axis inclinometer output measurement */ + /* Calibration parameters */ #define ADIS16400_XGYRO_OFF 0x1A /* X-axis gyroscope bias offset factor */ #define ADIS16400_YGYRO_OFF 0x1C /* Y-axis gyroscope bias offset factor */ diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index fe89802e3fe7..a2c3b67dcbdf 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c @@ -441,10 +441,12 @@ enum adis16400_chan { magn_z, temp, temp0, temp1, temp2, - in1 + in1, + incli_x, + incli_y, }; -static u8 adis16400_addresses[16][2] = { +static u8 adis16400_addresses[17][2] = { [in_supply] = { ADIS16400_SUPPLY_OUT, 0 }, [gyro_x] = { ADIS16400_XGYRO_OUT, ADIS16400_XGYRO_OFF }, [gyro_y] = { ADIS16400_YGYRO_OUT, ADIS16400_YGYRO_OFF }, @@ -459,7 +461,9 @@ static u8 adis16400_addresses[16][2] = { [temp0] = { ADIS16350_XTEMP_OUT }, [temp1] = { ADIS16350_YTEMP_OUT }, [temp2] = { ADIS16350_ZTEMP_OUT }, - [in1] = { ADIS16400_AUX_ADC , 0 }, + [in1] = { ADIS16400_AUX_ADC, 0 }, + [incli_x] = { ADIS16300_PITCH_OUT, 0 }, + [incli_y] = { ADIS16300_ROLL_OUT, 0 } }; static int adis16400_write_raw(struct iio_dev *indio_dev, @@ -612,82 +616,82 @@ static struct iio_chan_spec adis16400_channels[] = { static struct iio_chan_spec adis16350_channels[] = { IIO_CHAN(IIO_IN, 0, 1, 0, "supply", 0, 0, (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16400_SCAN_SUPPLY, IIO_ST('u', 12, 16, 0), 0), + in_supply, ADIS16400_SCAN_SUPPLY, IIO_ST('u', 12, 16, 0), 0), IIO_CHAN(IIO_GYRO, 1, 0, 0, NULL, 0, IIO_MOD_X, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 1, ADIS16400_SCAN_GYRO_X, IIO_ST('s', 14, 16, 0), 0), + gyro_x, ADIS16400_SCAN_GYRO_X, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_GYRO, 1, 0, 0, NULL, 0, IIO_MOD_Y, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 2, ADIS16400_SCAN_GYRO_Y, IIO_ST('s', 14, 16, 0), 0), + gyro_y, ADIS16400_SCAN_GYRO_Y, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_GYRO, 1, 0, 0, NULL, 0, IIO_MOD_Z, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 3, ADIS16400_SCAN_GYRO_Z, IIO_ST('s', 14, 16, 0), 0), + gyro_z, ADIS16400_SCAN_GYRO_Z, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 4, ADIS16400_SCAN_ACC_X, IIO_ST('s', 14, 16, 0), 0), + accel_x, ADIS16400_SCAN_ACC_X, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16400_SCAN_ACC_Y, IIO_ST('s', 14, 16, 0), 0), + accel_y, ADIS16400_SCAN_ACC_Y, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Z, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16400_SCAN_ACC_Z, IIO_ST('s', 14, 16, 0), 0), + accel_z, ADIS16400_SCAN_ACC_Z, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_TEMP, 0, 1, 0, "x", 0, 0, (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16350_SCAN_TEMP_X, IIO_ST('s', 12, 16, 0), 0), + temp0, ADIS16350_SCAN_TEMP_X, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN(IIO_TEMP, 0, 1, 0, "y", 1, 0, (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16350_SCAN_TEMP_Y, IIO_ST('s', 12, 16, 0), 0), + temp1, ADIS16350_SCAN_TEMP_Y, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN(IIO_TEMP, 0, 1, 0, "z", 2, 0, (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16350_SCAN_TEMP_Z, IIO_ST('s', 12, 16, 0), 0), + temp2, ADIS16350_SCAN_TEMP_Z, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 1, 0, (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16350_SCAN_ADC_0, IIO_ST('s', 12, 16, 0), 0), + in1, ADIS16350_SCAN_ADC_0, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN_SOFT_TIMESTAMP(11) }; static struct iio_chan_spec adis16300_channels[] = { IIO_CHAN(IIO_IN, 0, 1, 0, "supply", 0, 0, (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16400_SCAN_SUPPLY, IIO_ST('u', 12, 16, 0), 0), + in_supply, ADIS16400_SCAN_SUPPLY, IIO_ST('u', 12, 16, 0), 0), IIO_CHAN(IIO_GYRO, 1, 0, 0, NULL, 0, IIO_MOD_X, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 1, ADIS16400_SCAN_GYRO_X, IIO_ST('s', 14, 16, 0), 0), + gyro_x, ADIS16400_SCAN_GYRO_X, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_X, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 4, ADIS16400_SCAN_ACC_X, IIO_ST('s', 14, 16, 0), 0), + accel_x, ADIS16400_SCAN_ACC_X, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Y, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16400_SCAN_ACC_Y, IIO_ST('s', 14, 16, 0), 0), + accel_y, ADIS16400_SCAN_ACC_Y, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_ACCEL, 1, 0, 0, NULL, 0, IIO_MOD_Z, (1 << IIO_CHAN_INFO_CALIBBIAS_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16400_SCAN_ACC_Z, IIO_ST('s', 14, 16, 0), 0), + accel_z, ADIS16400_SCAN_ACC_Z, IIO_ST('s', 14, 16, 0), 0), IIO_CHAN(IIO_TEMP, 0, 1, 0, NULL, 0, 0, (1 << IIO_CHAN_INFO_OFFSET_SEPARATE) | (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16400_SCAN_TEMP, IIO_ST('s', 12, 16, 0), 0), + temp, ADIS16400_SCAN_TEMP, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 1, 0, (1 << IIO_CHAN_INFO_SCALE_SEPARATE), - 0, ADIS16350_SCAN_ADC_0, IIO_ST('s', 12, 16, 0), 0), + in1, ADIS16350_SCAN_ADC_0, IIO_ST('s', 12, 16, 0), 0), IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_X, (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16300_SCAN_INCLI_X, IIO_ST('s', 13, 16, 0), 0), + incli_x, ADIS16300_SCAN_INCLI_X, IIO_ST('s', 13, 16, 0), 0), IIO_CHAN(IIO_INCLI, 1, 0, 0, NULL, 0, IIO_MOD_Y, (1 << IIO_CHAN_INFO_SCALE_SHARED), - 0, ADIS16300_SCAN_INCLI_Y, IIO_ST('s', 13, 16, 0), 0), + incli_y, ADIS16300_SCAN_INCLI_Y, IIO_ST('s', 13, 16, 0), 0), IIO_CHAN_SOFT_TIMESTAMP(14) }; diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c index 94d3bfaa061d..19819e7578c6 100644 --- a/drivers/staging/iio/industrialio-core.c +++ b/drivers/staging/iio/industrialio-core.c @@ -44,20 +44,22 @@ struct bus_type iio_bus_type = { EXPORT_SYMBOL(iio_bus_type); static const char * const iio_chan_type_name_spec_shared[] = { - [IIO_TIMESTAMP] = "timestamp", - [IIO_ACCEL] = "accel", [IIO_IN] = "in", + [IIO_OUT] = "out", [IIO_CURRENT] = "current", [IIO_POWER] = "power", + [IIO_ACCEL] = "accel", [IIO_IN_DIFF] = "in-in", [IIO_GYRO] = "gyro", - [IIO_TEMP] = "temp", [IIO_MAGN] = "magn", + [IIO_LIGHT] = "illuminance", + [IIO_INTENSITY] = "intensity", + [IIO_PROXIMITY] = "proximity", + [IIO_TEMP] = "temp", [IIO_INCLI] = "incli", [IIO_ROT] = "rot", - [IIO_INTENSITY] = "intensity", - [IIO_LIGHT] = "illuminance", [IIO_ANGL] = "angl", + [IIO_TIMESTAMP] = "timestamp", }; static const char * const iio_chan_type_name_spec_complex[] = { @@ -396,6 +398,11 @@ static ssize_t iio_read_channel_info(struct device *dev, return sprintf(buf, "-%d.%06u\n", val, -val2); else return sprintf(buf, "%d.%06u\n", val, val2); + } else if (ret == IIO_VAL_INT_PLUS_NANO) { + if (val2 < 0) + return sprintf(buf, "-%d.%09u\n", val, -val2); + else + return sprintf(buf, "%d.%09u\n", val, val2); } else return 0; } @@ -407,25 +414,40 @@ static ssize_t iio_write_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 ret, integer = 0, micro = 0, micro_mult = 100000; + int ret, integer = 0, fract = 0, fract_mult = 100000; bool integer_part = true, negative = false; /* Assumes decimal - precision based on number of digits */ if (!indio_dev->info->write_raw) return -EINVAL; + + if (indio_dev->info->write_raw_get_fmt) + switch (indio_dev->info->write_raw_get_fmt(indio_dev, + this_attr->c, this_attr->address)) { + case IIO_VAL_INT_PLUS_MICRO: + fract_mult = 100000; + break; + case IIO_VAL_INT_PLUS_NANO: + fract_mult = 100000000; + break; + default: + return -EINVAL; + } + if (buf[0] == '-') { negative = true; buf++; } + while (*buf) { if ('0' <= *buf && *buf <= '9') { if (integer_part) integer = integer*10 + *buf - '0'; else { - micro += micro_mult*(*buf - '0'); - if (micro_mult == 1) + fract += fract_mult*(*buf - '0'); + if (fract_mult == 1) break; - micro_mult /= 10; + fract_mult /= 10; } } else if (*buf == '\n') { if (*(buf + 1) == '\0') @@ -443,11 +465,11 @@ static ssize_t iio_write_channel_info(struct device *dev, if (integer) integer = -integer; else - micro = -micro; + fract = -fract; } ret = indio_dev->info->write_raw(indio_dev, this_attr->c, - integer, micro, this_attr->address); + integer, fract, this_attr->address); if (ret) return ret; @@ -655,7 +677,8 @@ static int iio_device_add_channel_sysfs(struct iio_dev *dev_info, else ret = __iio_add_chan_devattr("raw", NULL, chan, &iio_read_channel_info, - NULL, + (chan->type == IIO_OUT ? + &iio_write_channel_info : NULL), 0, 0, &dev_info->dev, diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c index d504aa251ced..90ca2df23eab 100644 --- a/drivers/staging/iio/industrialio-trigger.c +++ b/drivers/staging/iio/industrialio-trigger.c @@ -340,6 +340,9 @@ static ssize_t iio_trigger_write_current(struct device *dev, { struct iio_dev *dev_info = dev_get_drvdata(dev); struct iio_trigger *oldtrig = dev_info->trig; + struct iio_trigger *trig; + int ret; + mutex_lock(&dev_info->mlock); if (dev_info->currentmode == INDIO_RING_TRIGGERED) { mutex_unlock(&dev_info->mlock); @@ -347,7 +350,22 @@ static ssize_t iio_trigger_write_current(struct device *dev, } mutex_unlock(&dev_info->mlock); - dev_info->trig = iio_trigger_find_by_name(buf, len); + trig = iio_trigger_find_by_name(buf, len); + + if (trig && dev_info->info->validate_trigger) { + ret = dev_info->info->validate_trigger(dev_info, trig); + if (ret) + return ret; + } + + if (trig && trig->validate_device) { + ret = trig->validate_device(trig, dev_info); + if (ret) + return ret; + } + + dev_info->trig = trig; + if (oldtrig && dev_info->trig != oldtrig) iio_put_trigger(oldtrig); if (dev_info->trig) diff --git a/drivers/staging/iio/kfifo_buf.c b/drivers/staging/iio/kfifo_buf.c index cc14b96d814c..6002368fdcfa 100644 --- a/drivers/staging/iio/kfifo_buf.c +++ b/drivers/staging/iio/kfifo_buf.c @@ -110,9 +110,7 @@ struct iio_ring_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev) iio_ring_buffer_init(&kf->ring, indio_dev); __iio_init_kfifo(kf); kf->ring.dev.type = &iio_kfifo_type; - device_initialize(&kf->ring.dev); kf->ring.dev.parent = &indio_dev->dev; - kf->ring.dev.bus = &iio_bus_type; dev_set_drvdata(&kf->ring.dev, (void *)&(kf->ring)); return &kf->ring; diff --git a/drivers/staging/iio/light/Kconfig b/drivers/staging/iio/light/Kconfig index 46d62d1b0370..1ad2d56c8ba8 100644 --- a/drivers/staging/iio/light/Kconfig +++ b/drivers/staging/iio/light/Kconfig @@ -1,4 +1,4 @@ -\# +# # Light sensors # comment "Light sensors" diff --git a/drivers/staging/iio/light/isl29018.c b/drivers/staging/iio/light/isl29018.c index 4794ffd5e446..426b6af70807 100644 --- a/drivers/staging/iio/light/isl29018.c +++ b/drivers/staging/iio/light/isl29018.c @@ -54,9 +54,9 @@ #define ISL29018_MAX_REGS ISL29018_REG_ADD_DATA_MSB struct isl29018_chip { - struct iio_dev *indio_dev; struct i2c_client *client; struct mutex lock; + unsigned int lux_scale; unsigned int range; unsigned int adc_bit; int prox_scheme; @@ -68,7 +68,7 @@ static int isl29018_write_data(struct i2c_client *client, u8 reg, { u8 regval; int ret = 0; - struct isl29018_chip *chip = i2c_get_clientdata(client); + struct isl29018_chip *chip = iio_priv(i2c_get_clientdata(client)); regval = chip->reg_cache[reg]; regval &= ~mask; @@ -158,7 +158,7 @@ static int isl29018_read_sensor_input(struct i2c_client *client, int mode) static int isl29018_read_lux(struct i2c_client *client, int *lux) { int lux_data; - struct isl29018_chip *chip = i2c_get_clientdata(client); + struct isl29018_chip *chip = iio_priv(i2c_get_clientdata(client)); lux_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_ALS_ONCE); @@ -166,7 +166,7 @@ static int isl29018_read_lux(struct i2c_client *client, int *lux) if (lux_data < 0) return lux_data; - *lux = (lux_data * chip->range) >> chip->adc_bit; + *lux = (lux_data * chip->range * chip->lux_scale) >> chip->adc_bit; return 0; } @@ -224,52 +224,13 @@ static int isl29018_read_proximity_ir(struct i2c_client *client, int scheme, return 0; } -static ssize_t get_sensor_data(struct device *dev, char *buf, int mode) -{ - struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; - struct i2c_client *client = chip->client; - int value = 0; - int status; - - mutex_lock(&chip->lock); - switch (mode) { - case COMMMAND1_OPMODE_PROX_ONCE: - status = isl29018_read_proximity_ir(client, - chip->prox_scheme, &value); - break; - - case COMMMAND1_OPMODE_ALS_ONCE: - status = isl29018_read_lux(client, &value); - break; - - case COMMMAND1_OPMODE_IR_ONCE: - status = isl29018_read_ir(client, &value); - break; - - default: - dev_err(&client->dev, "Mode %d is not supported\n", mode); - mutex_unlock(&chip->lock); - return -EBUSY; - } - if (status < 0) { - dev_err(&client->dev, "Error in Reading data"); - mutex_unlock(&chip->lock); - return status; - } - - mutex_unlock(&chip->lock); - - return sprintf(buf, "%d\n", value); -} - /* Sysfs interface */ /* range */ static ssize_t show_range(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); return sprintf(buf, "%u\n", chip->range); } @@ -278,7 +239,7 @@ static ssize_t store_range(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); struct i2c_client *client = chip->client; int status; unsigned long lval; @@ -311,7 +272,7 @@ static ssize_t show_resolution(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); return sprintf(buf, "%u\n", chip->adc_bit); } @@ -320,7 +281,7 @@ static ssize_t store_resolution(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); struct i2c_client *client = chip->client; int status; unsigned long lval; @@ -351,7 +312,7 @@ static ssize_t show_prox_infrared_supression(struct device *dev, struct device_attribute *attr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); /* return the "proximity scheme" i.e. if the chip does on chip infrared supression (1 means perform on chip supression) */ @@ -362,7 +323,7 @@ static ssize_t store_prox_infrared_supression(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct isl29018_chip *chip = indio_dev->dev_data; + struct isl29018_chip *chip = iio_priv(indio_dev); unsigned long lval; if (strict_strtoul(buf, 10, &lval)) @@ -381,27 +342,87 @@ static ssize_t store_prox_infrared_supression(struct device *dev, return count; } -/* Read lux */ -static ssize_t show_lux(struct device *dev, - struct device_attribute *devattr, char *buf) +/* Channel IO */ +static int isl29018_write_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int val, + int val2, + long mask) { - return get_sensor_data(dev, buf, COMMMAND1_OPMODE_ALS_ONCE); -} + struct isl29018_chip *chip = iio_priv(indio_dev); + int ret = -EINVAL; -/* Read ir */ -static ssize_t show_ir(struct device *dev, - struct device_attribute *devattr, char *buf) -{ - return get_sensor_data(dev, buf, COMMMAND1_OPMODE_IR_ONCE); + mutex_lock(&chip->lock); + if (mask == (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) && + chan->type == IIO_LIGHT) { + chip->lux_scale = val; + ret = 0; + } + mutex_unlock(&chip->lock); + + return 0; } -/* Read nearest ir */ -static ssize_t show_proxim_ir(struct device *dev, - struct device_attribute *devattr, char *buf) +static int isl29018_read_raw(struct iio_dev *indio_dev, + struct iio_chan_spec const *chan, + int *val, + int *val2, + long mask) { - return get_sensor_data(dev, buf, COMMMAND1_OPMODE_PROX_ONCE); + int ret = -EINVAL; + struct isl29018_chip *chip = iio_priv(indio_dev); + struct i2c_client *client = chip->client; + + mutex_lock(&chip->lock); + switch (mask) { + case 0: + switch (chan->type) { + case IIO_LIGHT: + ret = isl29018_read_lux(client, val); + break; + case IIO_INTENSITY: + ret = isl29018_read_ir(client, val); + break; + case IIO_PROXIMITY: + ret = isl29018_read_proximity_ir(client, + chip->prox_scheme, val); + break; + default: + break; + } + if (!ret) + ret = IIO_VAL_INT; + break; + case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE): + if (chan->type == IIO_LIGHT) { + *val = chip->lux_scale; + ret = IIO_VAL_INT; + } + break; + default: + break; + } + mutex_unlock(&chip->lock); + return ret; } +static const struct iio_chan_spec isl29018_channels[] = { + { + .type = IIO_LIGHT, + .indexed = 1, + .channel = 0, + .processed_val = 1, + .info_mask = (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE), + }, { + .type = IIO_INTENSITY, + .modified = 1, + .channel2 = IIO_MOD_LIGHT_IR, + }, { + /* Unindexed in current ABI. But perhaps it should be. */ + .type = IIO_PROXIMITY, + } +}; + static IIO_DEVICE_ATTR(range, S_IRUGO | S_IWUSR, show_range, store_range, 0); static IIO_CONST_ATTR(range_available, "1000 4000 16000 64000"); static IIO_CONST_ATTR(adc_resolution_available, "4 8 12 16"); @@ -411,9 +432,6 @@ static IIO_DEVICE_ATTR(proximity_on_chip_ambient_infrared_supression, S_IRUGO | S_IWUSR, show_prox_infrared_supression, store_prox_infrared_supression, 0); -static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0); -static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0); -static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0); #define ISL29018_DEV_ATTR(name) (&iio_dev_attr_##name.dev_attr.attr) #define ISL29018_CONST_ATTR(name) (&iio_const_attr_##name.dev_attr.attr) @@ -423,9 +441,6 @@ static struct attribute *isl29018_attributes[] = { ISL29018_DEV_ATTR(adc_resolution), ISL29018_CONST_ATTR(adc_resolution_available), ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_supression), - ISL29018_DEV_ATTR(illuminance0_input), - ISL29018_DEV_ATTR(intensity_infrared_raw), - ISL29018_DEV_ATTR(proximity_raw), NULL }; @@ -435,7 +450,7 @@ static const struct attribute_group isl29108_group = { static int isl29018_chip_init(struct i2c_client *client) { - struct isl29018_chip *chip = i2c_get_clientdata(client); + struct isl29018_chip *chip = iio_priv(i2c_get_clientdata(client)); int status; int new_adc_bit; unsigned int new_range; @@ -458,44 +473,45 @@ static int isl29018_chip_init(struct i2c_client *client) static const struct iio_info isl29108_info = { .attrs = &isl29108_group, .driver_module = THIS_MODULE, + .read_raw = &isl29018_read_raw, + .write_raw = &isl29018_write_raw, }; static int __devinit isl29018_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct isl29018_chip *chip; + struct iio_dev *indio_dev; int err; - chip = kzalloc(sizeof(struct isl29018_chip), GFP_KERNEL); - if (!chip) { - dev_err(&client->dev, "Memory allocation fails\n"); + indio_dev = iio_allocate_device(sizeof(*chip)); + if (indio_dev == NULL) { + dev_err(&client->dev, "iio allocation fails\n"); err = -ENOMEM; goto exit; } + chip = iio_priv(indio_dev); - i2c_set_clientdata(client, chip); + i2c_set_clientdata(client, indio_dev); chip->client = client; mutex_init(&chip->lock); + chip->lux_scale = 1; chip->range = 1000; chip->adc_bit = 16; err = isl29018_chip_init(client); if (err) - goto exit_free; + goto exit_iio_free; - chip->indio_dev = iio_allocate_device(0); - if (!chip->indio_dev) { - dev_err(&client->dev, "iio allocation fails\n"); - goto exit_free; - } - 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->modes = INDIO_DIRECT_MODE; - err = iio_device_register(chip->indio_dev); + indio_dev->info = &isl29108_info; + indio_dev->channels = isl29018_channels; + indio_dev->num_channels = ARRAY_SIZE(isl29018_channels); + indio_dev->name = id->name; + indio_dev->dev.parent = &client->dev; + indio_dev->modes = INDIO_DIRECT_MODE; + err = iio_device_register(indio_dev); if (err) { dev_err(&client->dev, "iio registration fails\n"); goto exit_iio_free; @@ -503,20 +519,17 @@ static int __devinit isl29018_probe(struct i2c_client *client, return 0; exit_iio_free: - iio_free_device(chip->indio_dev); -exit_free: - kfree(chip); + iio_free_device(indio_dev); exit: return err; } static int __devexit isl29018_remove(struct i2c_client *client) { - struct isl29018_chip *chip = i2c_get_clientdata(client); + struct iio_dev *indio_dev = i2c_get_clientdata(client); dev_dbg(&client->dev, "%s()\n", __func__); - iio_device_unregister(chip->indio_dev); - kfree(chip); + iio_device_unregister(indio_dev); return 0; } diff --git a/drivers/staging/iio/light/tsl2563.c b/drivers/staging/iio/light/tsl2563.c index 9cffa2ecb0ee..f25243b08472 100644 --- a/drivers/staging/iio/light/tsl2563.c +++ b/drivers/staging/iio/light/tsl2563.c @@ -137,37 +137,14 @@ struct tsl2563_chip { u32 data1; }; -static int tsl2563_write(struct i2c_client *client, u8 reg, u8 value) -{ - int ret; - u8 buf[2]; - - buf[0] = TSL2563_CMD | reg; - buf[1] = value; - - ret = i2c_master_send(client, buf, sizeof(buf)); - return (ret == sizeof(buf)) ? 0 : ret; -} - -static int tsl2563_read(struct i2c_client *client, u8 reg, void *buf, int len) -{ - int ret; - u8 cmd = TSL2563_CMD | reg; - - ret = i2c_master_send(client, &cmd, sizeof(cmd)); - if (ret != sizeof(cmd)) - return ret; - - return i2c_master_recv(client, buf, len); -} - static int tsl2563_set_power(struct tsl2563_chip *chip, int on) { struct i2c_client *client = chip->client; u8 cmd; cmd = on ? TSL2563_CMD_POWER_ON : TSL2563_CMD_POWER_OFF; - return tsl2563_write(client, TSL2563_REG_CTRL, cmd); + return i2c_smbus_write_byte_data(client, + TSL2563_CMD | TSL2563_REG_CTRL, cmd); } /* @@ -178,36 +155,40 @@ static int tsl2563_get_power(struct tsl2563_chip *chip) { struct i2c_client *client = chip->client; int ret; - u8 val; - ret = tsl2563_read(client, TSL2563_REG_CTRL, &val, sizeof(val)); - if (ret != sizeof(val)) + ret = i2c_smbus_read_byte_data(client, TSL2563_CMD | TSL2563_REG_CTRL); + if (ret < 0) return ret; - return (val & TSL2563_CTRL_POWER_MASK) == TSL2563_CMD_POWER_ON; + return (ret & TSL2563_CTRL_POWER_MASK) == TSL2563_CMD_POWER_ON; } static int tsl2563_configure(struct tsl2563_chip *chip) { int ret; - ret = tsl2563_write(chip->client, TSL2563_REG_TIMING, + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_TIMING, chip->gainlevel->gaintime); if (ret) goto error_ret; - ret = tsl2563_write(chip->client, TSL2563_REG_HIGHLOW, + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_HIGHLOW, chip->high_thres & 0xFF); if (ret) goto error_ret; - ret = tsl2563_write(chip->client, TSL2563_REG_HIGHHIGH, + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_HIGHHIGH, (chip->high_thres >> 8) & 0xFF); if (ret) goto error_ret; - ret = tsl2563_write(chip->client, TSL2563_REG_LOWLOW, + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_LOWLOW, chip->low_thres & 0xFF); if (ret) goto error_ret; - ret = tsl2563_write(chip->client, TSL2563_REG_LOWHIGH, + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_LOWHIGH, (chip->low_thres >> 8) & 0xFF); /* Interrupt register is automatically written anyway if it is relevant so is not here */ @@ -242,8 +223,8 @@ static int tsl2563_read_id(struct tsl2563_chip *chip, u8 *id) struct i2c_client *client = chip->client; int ret; - ret = tsl2563_read(client, TSL2563_REG_ID, id, sizeof(*id)); - if (ret != sizeof(*id)) + ret = i2c_smbus_read_byte_data(client, TSL2563_CMD | TSL2563_REG_ID); + if (ret < 0) return ret; return 0; @@ -313,8 +294,9 @@ static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc) (adc > chip->gainlevel->max) ? chip->gainlevel++ : chip->gainlevel--; - tsl2563_write(client, TSL2563_REG_TIMING, - chip->gainlevel->gaintime); + i2c_smbus_write_byte_data(client, + TSL2563_CMD | TSL2563_REG_TIMING, + chip->gainlevel->gaintime); tsl2563_wait_adc(chip); tsl2563_wait_adc(chip); @@ -327,7 +309,6 @@ static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc) static int tsl2563_get_adc(struct tsl2563_chip *chip) { struct i2c_client *client = chip->client; - u8 buf0[2], buf1[2]; u16 adc0, adc1; int retry = 1; int ret = 0; @@ -350,19 +331,17 @@ static int tsl2563_get_adc(struct tsl2563_chip *chip) } while (retry) { - ret = tsl2563_read(client, - TSL2563_REG_DATA0LOW, - buf0, sizeof(buf0)); - if (ret != sizeof(buf0)) + ret = i2c_smbus_read_word_data(client, + TSL2563_CMD | TSL2563_REG_DATA0LOW); + if (ret < 0) goto out; + adc0 = ret; - ret = tsl2563_read(client, TSL2563_REG_DATA1LOW, - buf1, sizeof(buf1)); - if (ret != sizeof(buf1)) + ret = i2c_smbus_read_word_data(client, + TSL2563_CMD | TSL2563_REG_DATA1LOW); + if (ret < 0) goto out; - - adc0 = (buf0[1] << 8) + buf0[0]; - adc1 = (buf1[1] << 8) + buf1[0]; + adc1 = ret; retry = tsl2563_adjust_gainlevel(chip, adc0); } @@ -548,15 +527,16 @@ error_ret: return ret; } +#define INFO_MASK (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE) +#define EVENT_MASK (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | \ + IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING)) +#define IIO_CHAN_2563(type, mod, proc, chan, imask, emask) \ + IIO_CHAN(type, mod, 1, proc, NULL, chan, 0, imask, 0, 0, {}, emask) + static const struct iio_chan_spec tsl2563_channels[] = { - IIO_CHAN(IIO_LIGHT, 0, 1, 1, NULL, 0, 0, 0, 0, 0, {}, 0), - IIO_CHAN(IIO_INTENSITY, 1, 1, 0, "both", 0, - (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE), 0, 0, 0, {}, - IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | - IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING)), - IIO_CHAN(IIO_INTENSITY, 1, 1, 0, "ir", 1, - (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE), 0, 0, 0, {}, - 0) + IIO_CHAN_2563(IIO_LIGHT, 0, 1, 0, 0, 0), + IIO_CHAN_2563(IIO_INTENSITY, 1, 0, 0, INFO_MASK, EVENT_MASK), + IIO_CHAN_2563(IIO_INTENSITY, 1, 0, 1, INFO_MASK, 0), }; static int tsl2563_read_thresh(struct iio_dev *indio_dev, @@ -592,11 +572,13 @@ static ssize_t tsl2563_write_thresh(struct iio_dev *indio_dev, else address = TSL2563_REG_LOWLOW; mutex_lock(&chip->lock); - ret = tsl2563_write(chip->client, address, val & 0xFF); + ret = i2c_smbus_write_byte_data(chip->client, TSL2563_CMD | address, + val & 0xFF); if (ret) goto error_ret; - ret = tsl2563_write(chip->client, address + 1, - (val >> 8) & 0xFF); + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | (address + 1), + (val >> 8) & 0xFF); if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_RISING) chip->high_thres = val; else @@ -612,7 +594,6 @@ static irqreturn_t tsl2563_event_handler(int irq, void *private) { struct iio_dev *dev_info = private; struct tsl2563_chip *chip = iio_priv(dev_info); - u8 cmd = TSL2563_CMD | TSL2563_CLEARINT; iio_push_event(dev_info, 0, IIO_UNMOD_EVENT_CODE(IIO_EV_CLASS_LIGHT, @@ -622,7 +603,7 @@ static irqreturn_t tsl2563_event_handler(int irq, void *private) iio_get_time_ns()); /* clear the interrupt and push the event */ - i2c_master_send(chip->client, &cmd, sizeof(cmd)); + i2c_smbus_write_byte(chip->client, TSL2563_CMD | TSL2563_CLEARINT); return IRQ_HANDLED; } @@ -647,13 +628,17 @@ static int tsl2563_write_interrupt_config(struct iio_dev *indio_dev, if (ret) goto out; } - ret = tsl2563_write(chip->client, TSL2563_REG_INT, chip->intr); + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_INT, + chip->intr); chip->int_enabled = true; } if (!state && (chip->intr & 0x30)) { chip->intr |= ~0x30; - ret = tsl2563_write(chip->client, TSL2563_REG_INT, chip->intr); + ret = i2c_smbus_write_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_INT, + chip->intr); chip->int_enabled = false; /* now the interrupt is not enabled, we can go to sleep */ schedule_delayed_work(&chip->poweroff_work, 5 * HZ); @@ -668,16 +653,15 @@ static int tsl2563_read_interrupt_config(struct iio_dev *indio_dev, int event_code) { struct tsl2563_chip *chip = iio_priv(indio_dev); - u8 rxbuf; int ret; mutex_lock(&chip->lock); - ret = tsl2563_read(chip->client, TSL2563_REG_INT, - &rxbuf, sizeof(rxbuf)); + ret = i2c_smbus_read_byte_data(chip->client, + TSL2563_CMD | TSL2563_REG_INT); mutex_unlock(&chip->lock); if (ret < 0) goto error_ret; - ret = !!(rxbuf & 0x30); + ret = !!(ret & 0x30); error_ret: return ret; @@ -690,6 +674,8 @@ static struct i2c_driver tsl2563_i2c_driver; static const struct iio_info tsl2563_info_no_irq = { .driver_module = THIS_MODULE, + .read_raw = &tsl2563_read_raw, + .write_raw = &tsl2563_write_raw, }; static const struct iio_info tsl2563_info = { @@ -797,7 +783,8 @@ static int tsl2563_remove(struct i2c_client *client) cancel_delayed_work(&chip->poweroff_work); /* Ensure that interrupts are disabled - then flush any bottom halves */ chip->intr |= ~0x30; - tsl2563_write(chip->client, TSL2563_REG_INT, chip->intr); + i2c_smbus_write_byte_data(chip->client, TSL2563_CMD | TSL2563_REG_INT, + chip->intr); flush_scheduled_work(); tsl2563_set_power(chip, 0); if (client->irq) diff --git a/drivers/staging/iio/magnetometer/ak8975.c b/drivers/staging/iio/magnetometer/ak8975.c index 700f96c70273..33919e87e7ce 100644 --- a/drivers/staging/iio/magnetometer/ak8975.c +++ b/drivers/staging/iio/magnetometer/ak8975.c @@ -89,7 +89,6 @@ */ struct ak8975_data { struct i2c_client *client; - struct iio_dev *indio_dev; struct attribute_group attrs; struct mutex lock; u8 asa[3]; @@ -221,7 +220,7 @@ static ssize_t show_mode(struct device *dev, struct device_attribute *devattr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ak8975_data *data = indio_dev->dev_data; + struct ak8975_data *data = iio_priv(indio_dev); return sprintf(buf, "%lu\n", data->mode); } @@ -234,7 +233,7 @@ static ssize_t store_mode(struct device *dev, struct device_attribute *devattr, const char *buf, size_t count) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ak8975_data *data = indio_dev->dev_data; + struct ak8975_data *data = iio_priv(indio_dev); struct i2c_client *client = data->client; unsigned long oval; int ret; @@ -310,7 +309,7 @@ static ssize_t show_scale(struct device *dev, struct device_attribute *devattr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ak8975_data *data = indio_dev->dev_data; + struct ak8975_data *data = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(devattr); return sprintf(buf, "%ld\n", data->raw_to_gauss[this_attr->address]); @@ -376,7 +375,7 @@ static ssize_t show_raw(struct device *dev, struct device_attribute *devattr, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ak8975_data *data = indio_dev->dev_data; + struct ak8975_data *data = iio_priv(indio_dev); struct i2c_client *client = data->client; struct iio_dev_attr *this_attr = to_iio_dev_attr(devattr); u16 meas_reg; @@ -483,46 +482,41 @@ static int ak8975_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ak8975_data *data; + struct iio_dev *indio_dev; + int eoc_gpio; int err; - /* Allocate our device context. */ - data = kzalloc(sizeof(struct ak8975_data), GFP_KERNEL); - if (!data) { - dev_err(&client->dev, "Memory allocation fails\n"); - err = -ENOMEM; - goto exit; - } - - i2c_set_clientdata(client, data); - data->client = client; - - mutex_init(&data->lock); - /* Grab and set up the supplied GPIO. */ - data->eoc_irq = client->irq; - data->eoc_gpio = irq_to_gpio(client->irq); + eoc_gpio = irq_to_gpio(client->irq); /* We may not have a GPIO based IRQ to scan, that is fine, we will poll if so */ - if (data->eoc_gpio > 0) { - err = gpio_request(data->eoc_gpio, "ak_8975"); + if (eoc_gpio > 0) { + err = gpio_request(eoc_gpio, "ak_8975"); if (err < 0) { dev_err(&client->dev, "failed to request GPIO %d, error %d\n", - data->eoc_gpio, err); - goto exit_free; + eoc_gpio, err); + goto exit; } - err = gpio_direction_input(data->eoc_gpio); + err = gpio_direction_input(eoc_gpio); if (err < 0) { dev_err(&client->dev, "Failed to configure input direction for GPIO %d, error %d\n", - data->eoc_gpio, err); + eoc_gpio, err); goto exit_gpio; } } else - data->eoc_gpio = 0; /* No GPIO available */ + eoc_gpio = 0; /* No GPIO available */ + /* Register with IIO */ + indio_dev = iio_allocate_device(sizeof(*data)); + if (indio_dev == NULL) { + err = -ENOMEM; + goto exit_gpio; + } + data = iio_priv(indio_dev); /* Perform some basic start-of-day setup of the device. */ err = ak8975_setup(client); if (err < 0) { @@ -530,46 +524,41 @@ static int ak8975_probe(struct i2c_client *client, goto exit_gpio; } - /* Register with IIO */ - data->indio_dev = iio_allocate_device(0); - if (data->indio_dev == NULL) { - err = -ENOMEM; - goto exit_gpio; - } - - data->indio_dev->dev.parent = &client->dev; - data->indio_dev->info = &ak8975_info; - data->indio_dev->dev_data = (void *)(data); - data->indio_dev->modes = INDIO_DIRECT_MODE; + i2c_set_clientdata(client, indio_dev); + data->client = client; + mutex_init(&data->lock); + data->eoc_irq = client->irq; + data->eoc_gpio = eoc_gpio; + indio_dev->dev.parent = &client->dev; + indio_dev->info = &ak8975_info; + indio_dev->modes = INDIO_DIRECT_MODE; - err = iio_device_register(data->indio_dev); + err = iio_device_register(indio_dev); if (err < 0) goto exit_free_iio; return 0; exit_free_iio: - iio_free_device(data->indio_dev); + iio_free_device(indio_dev); exit_gpio: - if (data->eoc_gpio) - gpio_free(data->eoc_gpio); -exit_free: - kfree(data); + if (eoc_gpio) + gpio_free(eoc_gpio); exit: return err; } static int ak8975_remove(struct i2c_client *client) { - struct ak8975_data *data = i2c_get_clientdata(client); - - iio_device_unregister(data->indio_dev); - iio_free_device(data->indio_dev); + struct iio_dev *indio_dev = i2c_get_clientdata(client); + struct ak8975_data *data = iio_priv(indio_dev); + int eoc_gpio = data->eoc_gpio; - if (data->eoc_gpio) - gpio_free(data->eoc_gpio); + iio_device_unregister(indio_dev); + iio_free_device(indio_dev); - kfree(data); + if (eoc_gpio) + gpio_free(eoc_gpio); return 0; } diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c index dd9a3bb6aa01..b44c273a91a8 100644 --- a/drivers/staging/iio/magnetometer/hmc5843.c +++ b/drivers/staging/iio/magnetometer/hmc5843.c @@ -131,7 +131,6 @@ static const unsigned short normal_i2c[] = { HMC5843_I2C_ADDRESS, /* Each client has this additional data */ struct hmc5843_data { - struct iio_dev *indio_dev; struct mutex lock; u8 rate; u8 meas_conf; @@ -159,7 +158,7 @@ static ssize_t hmc5843_read_measurement(struct device *dev, struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); s16 coordinate_val; struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); s32 result; mutex_lock(&data->lock); @@ -202,7 +201,7 @@ static ssize_t hmc5843_show_operating_mode(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); return sprintf(buf, "%d\n", data->operating_mode); } @@ -213,7 +212,7 @@ static ssize_t hmc5843_set_operating_mode(struct device *dev, { struct iio_dev *indio_dev = dev_get_drvdata(dev); struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); unsigned long operating_mode = 0; s32 status; @@ -278,7 +277,7 @@ static ssize_t hmc5843_show_measurement_configuration(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); return sprintf(buf, "%d\n", data->meas_conf); } @@ -350,7 +349,7 @@ static ssize_t set_sampling_frequency(struct device *dev, struct iio_dev *indio_dev = dev_get_drvdata(dev); struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); unsigned long rate = 0; if (strncmp(buf, "0.5" , 3) == 0) @@ -422,7 +421,7 @@ static ssize_t show_range(struct device *dev, { u8 range; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); range = data->range; return sprintf(buf, "%d\n", regval_to_input_field_mg[range]); @@ -436,7 +435,7 @@ static ssize_t set_range(struct device *dev, struct iio_dev *indio_dev = dev_get_drvdata(dev); struct i2c_client *client = to_i2c_client(indio_dev->dev.parent); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); unsigned long range = 0; int error; mutex_lock(&data->lock); @@ -473,7 +472,7 @@ static ssize_t show_scale(struct device *dev, char *buf) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct hmc5843_data *data = indio_dev->dev_data; + struct hmc5843_data *data = iio_priv(indio_dev); return strlen(strcpy(buf, regval_to_scale[data->range])); } static IIO_DEVICE_ATTR(magn_scale, @@ -538,53 +537,46 @@ static int hmc5843_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct hmc5843_data *data; + struct iio_dev *indio_dev; int err = 0; - data = kzalloc(sizeof(struct hmc5843_data), GFP_KERNEL); - if (!data) { + indio_dev = iio_allocate_device(sizeof(*data)); + if (indio_dev == NULL) { err = -ENOMEM; goto exit; } - + data = iio_priv(indio_dev); /* default settings at probe */ data->meas_conf = CONF_NORMAL; data->range = RANGE_1_0; data->operating_mode = MODE_CONVERSION_CONTINUOUS; - i2c_set_clientdata(client, data); + i2c_set_clientdata(client, indio_dev); /* Initialize the HMC5843 chip */ hmc5843_init_client(client); - data->indio_dev = iio_allocate_device(0); - if (!data->indio_dev) { - err = -ENOMEM; - goto exit_free1; - } - data->indio_dev->info = &hmc5843_info; - data->indio_dev->dev.parent = &client->dev; - data->indio_dev->dev_data = (void *)(data); - data->indio_dev->modes = INDIO_DIRECT_MODE; - err = iio_device_register(data->indio_dev); + indio_dev->info = &hmc5843_info; + indio_dev->dev.parent = &client->dev; + indio_dev->modes = INDIO_DIRECT_MODE; + err = iio_device_register(indio_dev); if (err) goto exit_free2; return 0; exit_free2: - iio_free_device(data->indio_dev); -exit_free1: - kfree(data); + iio_free_device(indio_dev); exit: return err; } static int hmc5843_remove(struct i2c_client *client) { - struct hmc5843_data *data = i2c_get_clientdata(client); + struct iio_dev *indio_dev = i2c_get_clientdata(client); /* sleep mode to save power */ hmc5843_configure(client, MODE_SLEEP); - iio_device_unregister(data->indio_dev); - kfree(i2c_get_clientdata(client)); + iio_device_unregister(indio_dev); + return 0; } diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c index 6c9c23fc4aed..4d1bd42ff9e0 100644 --- a/drivers/staging/iio/meter/ade7753.c +++ b/drivers/staging/iio/meter/ade7753.c @@ -29,7 +29,7 @@ static int ade7753_spi_write_reg_8(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7753_WRITE_REG(reg_address); @@ -47,7 +47,7 @@ static int ade7753_spi_write_reg_16(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7753_WRITE_REG(reg_address); @@ -64,7 +64,7 @@ static int ade7753_spi_read_reg_8(struct device *dev, u8 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); ssize_t ret; ret = spi_w8r8(st->us, ADE7753_READ_REG(reg_address)); @@ -83,7 +83,7 @@ static int ade7753_spi_read_reg_16(struct device *dev, u16 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); ssize_t ret; ret = spi_w8r16(st->us, ADE7753_READ_REG(reg_address)); @@ -105,7 +105,7 @@ static int ade7753_spi_read_reg_24(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -369,10 +369,11 @@ static int ade7753_stop_device(struct device *dev) return ade7753_spi_write_reg_16(dev, ADE7753_MODE, val); } -static int ade7753_initial_setup(struct ade7753_state *st) +static int ade7753_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct device *dev = &indio_dev->dev; + struct ade7753_state *st = iio_priv(indio_dev); /* use low spi speed for init */ st->us->mode = SPI_MODE_3; @@ -397,9 +398,9 @@ static ssize_t ade7753_read_frequency(struct device *dev, char *buf) { int ret, len = 0; - u8 t; + u16 t; int sps; - ret = ade7753_spi_read_reg_8(dev, ADE7753_MODE, &t); + ret = ade7753_spi_read_reg_16(dev, ADE7753_MODE, &t); if (ret) return ret; @@ -416,7 +417,7 @@ static ssize_t ade7753_write_frequency(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7753_state *st = iio_dev_get_devdata(indio_dev); + struct ade7753_state *st = iio_priv(indio_dev); unsigned long val; int ret; u16 reg, t; @@ -512,62 +513,44 @@ static const struct iio_info ade7753_info = { static int __devinit ade7753_probe(struct spi_device *spi) { int ret, regdone = 0; - struct ade7753_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct ade7753_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADE7753_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADE7753_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } + st = iio_priv(indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &ade7753_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ade7753_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; /* Get the device into a sane initial state */ - ret = ade7753_initial_setup(st); + ret = ade7753_initial_setup(indio_dev); if (ret) goto error_free_dev; return 0; error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); + error_ret: return ret; } @@ -576,19 +559,13 @@ error_ret: static int ade7753_remove(struct spi_device *spi) { int ret; - struct ade7753_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); ret = ade7753_stop_device(&(indio_dev->dev)); if (ret) goto err_ret; iio_device_unregister(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); - - return 0; err_ret: return ret; diff --git a/drivers/staging/iio/meter/ade7753.h b/drivers/staging/iio/meter/ade7753.h index 3b9c7f6a50e7..3f059d3d9392 100644 --- a/drivers/staging/iio/meter/ade7753.h +++ b/drivers/staging/iio/meter/ade7753.h @@ -60,17 +60,15 @@ /** * struct ade7753_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure * @tx: transmit buffer * @rx: receive buffer * @buf_lock: mutex to protect tx and rx **/ struct ade7753_state { - struct spi_device *us; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct mutex buf_lock; + u8 tx[ADE7753_MAX_TX] ____cacheline_aligned; + u8 rx[ADE7753_MAX_RX]; }; #endif diff --git a/drivers/staging/iio/meter/ade7754.c b/drivers/staging/iio/meter/ade7754.c index 378f2c87086f..f4f85fd5619b 100644 --- a/drivers/staging/iio/meter/ade7754.c +++ b/drivers/staging/iio/meter/ade7754.c @@ -29,7 +29,7 @@ static int ade7754_spi_write_reg_8(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7754_WRITE_REG(reg_address); @@ -47,7 +47,7 @@ static int ade7754_spi_write_reg_16(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7754_WRITE_REG(reg_address); @@ -64,7 +64,7 @@ static int ade7754_spi_read_reg_8(struct device *dev, u8 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); int ret; ret = spi_w8r8(st->us, ADE7754_READ_REG(reg_address)); @@ -83,7 +83,7 @@ static int ade7754_spi_read_reg_16(struct device *dev, u16 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); int ret; ret = spi_w8r16(st->us, ADE7754_READ_REG(reg_address)); @@ -105,7 +105,7 @@ static int ade7754_spi_read_reg_24(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -388,10 +388,11 @@ static int ade7754_stop_device(struct device *dev) return ade7754_spi_write_reg_8(dev, ADE7754_OPMODE, val); } -static int ade7754_initial_setup(struct ade7754_state *st) +static int ade7754_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct ade7754_state *st = iio_priv(indio_dev); + struct device *dev = &indio_dev->dev; /* use low spi speed for init */ st->us->mode = SPI_MODE_3; @@ -436,7 +437,7 @@ static ssize_t ade7754_write_frequency(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7754_state *st = iio_dev_get_devdata(indio_dev); + struct ade7754_state *st = iio_priv(indio_dev); unsigned long val; int ret; u8 reg, t; @@ -535,62 +536,44 @@ static const struct iio_info ade7754_info = { static int __devinit ade7754_probe(struct spi_device *spi) { int ret, regdone = 0; - struct ade7754_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct ade7754_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADE7754_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADE7754_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } + st = iio_priv(indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - st->indio_dev->info = &ade7754_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ade7754_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; regdone = 1; /* Get the device into a sane initial state */ - ret = ade7754_initial_setup(st); + ret = ade7754_initial_setup(indio_dev); if (ret) goto error_free_dev; return 0; error_free_dev: if (regdone) - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); else - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); + error_ret: return ret; } @@ -599,22 +582,17 @@ error_ret: static int ade7754_remove(struct spi_device *spi) { int ret; - struct ade7754_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); ret = ade7754_stop_device(&(indio_dev->dev)); if (ret) goto err_ret; iio_device_unregister(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); - - return 0; err_ret: return ret; + } static struct spi_driver ade7754_driver = { diff --git a/drivers/staging/iio/meter/ade7754.h b/drivers/staging/iio/meter/ade7754.h index 0aa0522a33a3..6121125520f6 100644 --- a/drivers/staging/iio/meter/ade7754.h +++ b/drivers/staging/iio/meter/ade7754.h @@ -78,17 +78,15 @@ /** * struct ade7754_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure + * @buf_lock: mutex to protect tx and rx * @tx: transmit buffer * @rx: receive buffer - * @buf_lock: mutex to protect tx and rx **/ struct ade7754_state { - struct spi_device *us; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct mutex buf_lock; + u8 tx[ADE7754_MAX_TX] ____cacheline_aligned; + u8 rx[ADE7754_MAX_RX]; }; #endif diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c index 730f6d9074a6..a51a64cad034 100644 --- a/drivers/staging/iio/meter/ade7759.c +++ b/drivers/staging/iio/meter/ade7759.c @@ -29,7 +29,7 @@ static int ade7759_spi_write_reg_8(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7759_WRITE_REG(reg_address); @@ -47,7 +47,7 @@ static int ade7759_spi_write_reg_16(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = ADE7759_WRITE_REG(reg_address); @@ -64,7 +64,7 @@ static int ade7759_spi_read_reg_8(struct device *dev, u8 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); int ret; ret = spi_w8r8(st->us, ADE7759_READ_REG(reg_address)); @@ -83,7 +83,7 @@ static int ade7759_spi_read_reg_16(struct device *dev, u16 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); int ret; ret = spi_w8r16(st->us, ADE7759_READ_REG(reg_address)); @@ -105,7 +105,7 @@ static int ade7759_spi_read_reg_40(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -328,10 +328,11 @@ static int ade7759_stop_device(struct device *dev) return ade7759_spi_write_reg_16(dev, ADE7759_MODE, val); } -static int ade7759_initial_setup(struct ade7759_state *st) +static int ade7759_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct ade7759_state *st = iio_priv(indio_dev); + struct device *dev = &indio_dev->dev; /* use low spi speed for init */ st->us->mode = SPI_MODE_3; @@ -376,7 +377,7 @@ static ssize_t ade7759_write_frequency(struct device *dev, size_t len) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7759_state *st = iio_dev_get_devdata(indio_dev); + struct ade7759_state *st = iio_priv(indio_dev); unsigned long val; int ret; u16 reg, t; @@ -458,62 +459,41 @@ static const struct iio_info ade7759_info = { static int __devinit ade7759_probe(struct spi_device *spi) { int ret; - struct ade7759_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; + struct ade7759_state *st; + struct iio_dev *indio_dev; + + /* setup the industrialio driver allocated elements */ + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { + ret = -ENOMEM; goto error_ret; } /* this is only used for removal purposes */ - spi_set_drvdata(spi, st); + spi_set_drvdata(spi, indio_dev); - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADE7759_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADE7759_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } + st = iio_priv(indio_dev); st->us = spi; mutex_init(&st->buf_lock); - /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } - - st->indio_dev->name = spi->dev.driver->name; - st->indio_dev->dev.parent = &spi->dev; - - st->indio_dev->info = &ade7759_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->name = spi->dev.driver->name; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ade7759_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; /* Get the device into a sane initial state */ - ret = ade7759_initial_setup(st); + ret = ade7759_initial_setup(indio_dev); if (ret) goto error_unreg_dev; return 0; error_unreg_dev: - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: return ret; } @@ -522,19 +502,13 @@ error_ret: static int ade7759_remove(struct spi_device *spi) { int ret; - struct ade7759_state *st = spi_get_drvdata(spi); - struct iio_dev *indio_dev = st->indio_dev; + struct iio_dev *indio_dev = spi_get_drvdata(spi); ret = ade7759_stop_device(&(indio_dev->dev)); if (ret) goto err_ret; iio_device_unregister(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); - - return 0; err_ret: return ret; diff --git a/drivers/staging/iio/meter/ade7759.h b/drivers/staging/iio/meter/ade7759.h index cc76c2c4c039..c81d23d730d2 100644 --- a/drivers/staging/iio/meter/ade7759.h +++ b/drivers/staging/iio/meter/ade7759.h @@ -41,17 +41,15 @@ /** * struct ade7759_state - device instance specific data * @us: actual spi_device - * @indio_dev: industrial I/O device structure + * @buf_lock: mutex to protect tx and rx * @tx: transmit buffer * @rx: receive buffer - * @buf_lock: mutex to protect tx and rx **/ struct ade7759_state { - struct spi_device *us; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - struct mutex buf_lock; + struct spi_device *us; + struct mutex buf_lock; + u8 tx[ADE7759_MAX_TX] ____cacheline_aligned; + u8 rx[ADE7759_MAX_RX]; }; #endif diff --git a/drivers/staging/iio/meter/ade7854-i2c.c b/drivers/staging/iio/meter/ade7854-i2c.c index 4578e7b7f460..dd7234353405 100644 --- a/drivers/staging/iio/meter/ade7854-i2c.c +++ b/drivers/staging/iio/meter/ade7854-i2c.c @@ -20,7 +20,7 @@ static int ade7854_i2c_write_reg_8(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = (reg_address >> 8) & 0xFF; @@ -39,7 +39,7 @@ static int ade7854_i2c_write_reg_16(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = (reg_address >> 8) & 0xFF; @@ -59,7 +59,7 @@ static int ade7854_i2c_write_reg_24(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = (reg_address >> 8) & 0xFF; @@ -80,7 +80,7 @@ static int ade7854_i2c_write_reg_32(struct device *dev, { int ret; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); mutex_lock(&st->buf_lock); st->tx[0] = (reg_address >> 8) & 0xFF; @@ -101,7 +101,7 @@ static int ade7854_i2c_read_reg_8(struct device *dev, u8 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->buf_lock); @@ -127,7 +127,7 @@ static int ade7854_i2c_read_reg_16(struct device *dev, u16 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->buf_lock); @@ -153,7 +153,7 @@ static int ade7854_i2c_read_reg_24(struct device *dev, u32 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->buf_lock); @@ -179,7 +179,7 @@ static int ade7854_i2c_read_reg_32(struct device *dev, u32 *val) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; mutex_lock(&st->buf_lock); @@ -204,13 +204,14 @@ static int __devinit ade7854_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) { int ret; - struct ade7854_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - return ret; - } - - i2c_set_clientdata(client, st); + struct ade7854_state *st; + struct iio_dev *indio_dev; + + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) + return -ENOMEM; + st = iio_priv(indio_dev); + i2c_set_clientdata(client, indio_dev); st->read_reg_8 = ade7854_i2c_read_reg_8; st->read_reg_16 = ade7854_i2c_read_reg_16; st->read_reg_24 = ade7854_i2c_read_reg_24; @@ -222,11 +223,9 @@ static int __devinit ade7854_i2c_probe(struct i2c_client *client, st->i2c = client; st->irq = client->irq; - ret = ade7854_probe(st, &client->dev); - if (ret) { - kfree(st); - return ret; - } + ret = ade7854_probe(indio_dev, &client->dev); + if (ret) + iio_free_device(indio_dev); return ret; } diff --git a/drivers/staging/iio/meter/ade7854-spi.c b/drivers/staging/iio/meter/ade7854-spi.c index 84da8fbde022..e0d10865590a 100644 --- a/drivers/staging/iio/meter/ade7854-spi.c +++ b/drivers/staging/iio/meter/ade7854-spi.c @@ -21,7 +21,7 @@ static int ade7854_spi_write_reg_8(struct device *dev, int ret; struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct spi_transfer xfer = { .tx_buf = st->tx, .bits_per_word = 8, @@ -49,7 +49,7 @@ static int ade7854_spi_write_reg_16(struct device *dev, int ret; struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct spi_transfer xfer = { .tx_buf = st->tx, .bits_per_word = 8, @@ -78,7 +78,7 @@ static int ade7854_spi_write_reg_24(struct device *dev, int ret; struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct spi_transfer xfer = { .tx_buf = st->tx, .bits_per_word = 8, @@ -108,7 +108,7 @@ static int ade7854_spi_write_reg_32(struct device *dev, int ret; struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct spi_transfer xfer = { .tx_buf = st->tx, .bits_per_word = 8, @@ -138,7 +138,7 @@ static int ade7854_spi_read_reg_8(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -180,7 +180,7 @@ static int ade7854_spi_read_reg_16(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -221,7 +221,7 @@ static int ade7854_spi_read_reg_24(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -263,7 +263,7 @@ static int ade7854_spi_read_reg_32(struct device *dev, { struct spi_message msg; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; struct spi_transfer xfers[] = { { @@ -302,13 +302,14 @@ error_ret: static int __devinit ade7854_spi_probe(struct spi_device *spi) { int ret; - struct ade7854_state *st = kzalloc(sizeof *st, GFP_KERNEL); - if (!st) { - ret = -ENOMEM; - return ret; - } - - spi_set_drvdata(spi, st); + struct ade7854_state *st; + struct iio_dev *indio_dev; + + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) + return -ENOMEM; + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); st->read_reg_8 = ade7854_spi_read_reg_8; st->read_reg_16 = ade7854_spi_read_reg_16; st->read_reg_24 = ade7854_spi_read_reg_24; @@ -320,11 +321,10 @@ static int __devinit ade7854_spi_probe(struct spi_device *spi) st->irq = spi->irq; st->spi = spi; - ret = ade7854_probe(st, &spi->dev); - if (ret) { - kfree(st); - return ret; - } + + ret = ade7854_probe(indio_dev, &spi->dev); + if (ret) + iio_free_device(indio_dev); return 0; } diff --git a/drivers/staging/iio/meter/ade7854.c b/drivers/staging/iio/meter/ade7854.c index 44cd3ec546ae..b82659f43bc6 100644 --- a/drivers/staging/iio/meter/ade7854.c +++ b/drivers/staging/iio/meter/ade7854.c @@ -29,7 +29,7 @@ static ssize_t ade7854_read_8bit(struct device *dev, int ret; u8 val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = st->read_reg_8(dev, this_attr->address, &val); @@ -46,7 +46,7 @@ static ssize_t ade7854_read_16bit(struct device *dev, int ret; u16 val = 0; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = st->read_reg_16(dev, this_attr->address, &val); @@ -63,7 +63,7 @@ static ssize_t ade7854_read_24bit(struct device *dev, int ret; u32 val; struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); ret = st->read_reg_24(dev, this_attr->address, &val); @@ -81,7 +81,7 @@ static ssize_t ade7854_read_32bit(struct device *dev, u32 val = 0; struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); ret = st->read_reg_32(dev, this_attr->address, &val); if (ret) @@ -97,7 +97,7 @@ static ssize_t ade7854_write_8bit(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; long val; @@ -118,7 +118,7 @@ static ssize_t ade7854_write_16bit(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; long val; @@ -139,7 +139,7 @@ static ssize_t ade7854_write_24bit(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; long val; @@ -160,7 +160,7 @@ static ssize_t ade7854_write_32bit(struct device *dev, { struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; long val; @@ -177,7 +177,7 @@ error_ret: static int ade7854_reset(struct device *dev) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); u16 val; st->read_reg_16(dev, ADE7854_CONFIG, &val); @@ -426,7 +426,7 @@ static IIO_DEV_ATTR_CVAHR(ade7854_read_32bit, static int ade7854_set_irq(struct device *dev, bool enable) { struct iio_dev *indio_dev = dev_get_drvdata(dev); - struct ade7854_state *st = iio_dev_get_devdata(indio_dev); + struct ade7854_state *st = iio_priv(indio_dev); int ret; u32 irqen; @@ -449,10 +449,10 @@ error_ret: return ret; } -static int ade7854_initial_setup(struct ade7854_state *st) +static int ade7854_initial_setup(struct iio_dev *indio_dev) { int ret; - struct device *dev = &st->indio_dev->dev; + struct device *dev = &indio_dev->dev; /* Disable IRQ */ ret = ade7854_set_irq(dev, false); @@ -556,68 +556,40 @@ static const struct iio_info ade7854_info = { .driver_module = THIS_MODULE, }; -int ade7854_probe(struct ade7854_state *st, struct device *dev) +int ade7854_probe(struct iio_dev *indio_dev, struct device *dev) { int ret; - - /* Allocate the comms buffers */ - st->rx = kzalloc(sizeof(*st->rx)*ADE7854_MAX_RX, GFP_KERNEL); - if (st->rx == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->tx = kzalloc(sizeof(*st->tx)*ADE7854_MAX_TX, GFP_KERNEL); - if (st->tx == NULL) { - ret = -ENOMEM; - goto error_free_rx; - } - mutex_init(&st->buf_lock); + struct ade7854_state *st = iio_priv(indio_dev); /* setup the industrialio driver allocated elements */ - st->indio_dev = iio_allocate_device(0); - if (st->indio_dev == NULL) { - ret = -ENOMEM; - goto error_free_tx; - } + mutex_init(&st->buf_lock); - st->indio_dev->dev.parent = dev; - st->indio_dev->info = &ade7854_info; - st->indio_dev->dev_data = (void *)(st); - st->indio_dev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = dev; + indio_dev->info = &ade7854_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->indio_dev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; /* Get the device into a sane initial state */ - ret = ade7854_initial_setup(st); + ret = ade7854_initial_setup(indio_dev); if (ret) goto error_unreg_dev; return 0; error_unreg_dev: - iio_device_unregister(st->indio_dev); + iio_device_unregister(indio_dev); error_free_dev: - iio_free_device(st->indio_dev); -error_free_tx: - kfree(st->tx); -error_free_rx: - kfree(st->rx); -error_free_st: - kfree(st); - + iio_free_device(indio_dev); +error_ret: return ret; } EXPORT_SYMBOL(ade7854_probe); -int ade7854_remove(struct ade7854_state *st) +int ade7854_remove(struct iio_dev *indio_dev) { - struct iio_dev *indio_dev = st->indio_dev; - iio_device_unregister(indio_dev); - kfree(st->tx); - kfree(st->rx); - kfree(st); return 0; } diff --git a/drivers/staging/iio/meter/ade7854.h b/drivers/staging/iio/meter/ade7854.h index 79a21109f4e2..2c96e8695d57 100644 --- a/drivers/staging/iio/meter/ade7854.h +++ b/drivers/staging/iio/meter/ade7854.h @@ -148,29 +148,29 @@ * struct ade7854_state - device instance specific data * @spi: actual spi_device * @indio_dev: industrial I/O device structure + * @buf_lock: mutex to protect tx and rx * @tx: transmit buffer * @rx: receive buffer - * @buf_lock: mutex to protect tx and rx **/ struct ade7854_state { - struct spi_device *spi; - struct i2c_client *i2c; - struct iio_dev *indio_dev; - u8 *tx; - u8 *rx; - int (*read_reg_8) (struct device *, u16, u8 *); - int (*read_reg_16) (struct device *, u16, u16 *); - int (*read_reg_24) (struct device *, u16, u32 *); - int (*read_reg_32) (struct device *, u16, u32 *); - int (*write_reg_8) (struct device *, u16, u8); - int (*write_reg_16) (struct device *, u16, u16); - int (*write_reg_24) (struct device *, u16, u32); - int (*write_reg_32) (struct device *, u16, u32); - int irq; - struct mutex buf_lock; + struct spi_device *spi; + struct i2c_client *i2c; + int (*read_reg_8) (struct device *, u16, u8 *); + int (*read_reg_16) (struct device *, u16, u16 *); + int (*read_reg_24) (struct device *, u16, u32 *); + int (*read_reg_32) (struct device *, u16, u32 *); + int (*write_reg_8) (struct device *, u16, u8); + int (*write_reg_16) (struct device *, u16, u16); + int (*write_reg_24) (struct device *, u16, u32); + int (*write_reg_32) (struct device *, u16, u32); + int irq; + struct mutex buf_lock; + u8 tx[ADE7854_MAX_TX] ____cacheline_aligned; + u8 rx[ADE7854_MAX_RX]; + }; -extern int ade7854_probe(struct ade7854_state *st, struct device *dev); -extern int ade7854_remove(struct ade7854_state *st); +extern int ade7854_probe(struct iio_dev *indio_dev, struct device *dev); +extern int ade7854_remove(struct iio_dev *indio_dev); #endif diff --git a/drivers/staging/iio/resolver/Kconfig b/drivers/staging/iio/resolver/Kconfig index a4a363429355..6ecd79e30038 100644 --- a/drivers/staging/iio/resolver/Kconfig +++ b/drivers/staging/iio/resolver/Kconfig @@ -25,30 +25,3 @@ config AD2S1210 Say yes here to build support for Analog Devices spi resolver to digital converters, ad2s1210, provides direct access via sysfs. -choice - prompt "Resolution Control" - depends on AD2S1210 - default AD2S1210_GPIO_NONE - help - In normal mode, the resolution of the digital output is selected - using the RES0 and RES1 input pins. In configuration mode, the - resolution is selected by setting the RES0 and RES1 bits in the - control regsiter. When switching between normal mode and configuration - mode, there are some schemes to keep them matchs. - -config AD2S1210_GPIO_INPUT - bool "read resolution from gpio pins" - help - GPIO pins are sampling RES0 and RES1 pins, read the resolution - settings from the GPIO pins. - -config AD2S1210_GPIO_OUTPUT - bool "set gpio pins to set resolution" - help - RES0 and RES1 pins are controlled by GPIOs, setting GPIO pins to - set the resolution. - -config AD2S1210_GPIO_NONE - bool "take the responsibility by user" - -endchoice diff --git a/drivers/staging/iio/resolver/ad2s120x.c b/drivers/staging/iio/resolver/ad2s120x.c index f83e1422fd29..bed4c725f2df 100644 --- a/drivers/staging/iio/resolver/ad2s120x.c +++ b/drivers/staging/iio/resolver/ad2s120x.c @@ -32,161 +32,46 @@ struct ad2s120x_state { struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; - unsigned short sample; - unsigned short rdvel; - u8 rx[2]; - u8 tx[2]; + int sample; + int rdvel; + u8 rx[2] ____cacheline_aligned; }; -static ssize_t ad2s120x_show_pos_vel(struct device *dev, +static ssize_t ad2s120x_show_val(struct device *dev, struct device_attribute *attr, char *buf) { - struct spi_message msg; - struct spi_transfer xfer; int ret = 0; ssize_t len = 0; u16 pos; s16 vel; u8 status; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s120x_state *st = idev->dev_data; + struct ad2s120x_state *st = iio_priv(dev_get_drvdata(dev)); + struct iio_dev_attr *iattr = to_iio_dev_attr(attr); - xfer.len = 1; - xfer.tx_buf = st->tx; - xfer.rx_buf = st->rx; mutex_lock(&st->lock); gpio_set_value(st->sample, 0); /* delay (6 * AD2S120X_TSCLK + 20) nano seconds */ udelay(1); gpio_set_value(st->sample, 1); - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) - goto error_ret; - status = st->rx[1]; - pos = (((u16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); - len = sprintf(buf, "%d %c%c%c%c ", pos, - (status & 0x8) ? 'P' : 'V', - (status & 0x4) ? 'd' : '_', - (status & 0x2) ? 'l' : '_', - (status & 0x1) ? '1' : '0'); - - /* delay 18 ns */ - /* ndelay(18); */ - - gpio_set_value(st->rdvel, 0); - /* ndelay(5);*/ - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) + gpio_set_value(st->rdvel, iattr->address); + ret = spi_read(st->sdev, st->rx, 2); + if (ret < 0) goto error_ret; status = st->rx[1]; - vel = (st->rx[0] & 0x80) ? 0xf000 : 0; - vel |= (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); - len += sprintf(buf + len, "%d %c%c%c%c\n", vel, - (status & 0x8) ? 'P' : 'V', - (status & 0x4) ? 'd' : '_', - (status & 0x2) ? 'l' : '_', - (status & 0x1) ? '1' : '0'); -error_ret: - gpio_set_value(st->rdvel, 1); - /* delay (2 * AD2S120X_TSCLK + 20) ns for sample pulse */ - udelay(1); - mutex_unlock(&st->lock); - - return ret ? ret : len; -} - -static ssize_t ad2s120x_show_pos(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct spi_message msg; - struct spi_transfer xfer; - int ret = 0; - ssize_t len = 0; - u16 pos; - u8 status; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s120x_state *st = idev->dev_data; - - xfer.len = 1; - xfer.tx_buf = st->tx; - xfer.rx_buf = st->rx; - mutex_lock(&st->lock); - - gpio_set_value(st->sample, 0); - /* delay (6 * AD2S120X_TSCLK + 20) nano seconds */ - udelay(1); - gpio_set_value(st->sample, 1); - gpio_set_value(st->rdvel, 1); - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) - goto error_ret; - status = st->rx[1]; - pos = (((u16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); - len = sprintf(buf, "%d %c%c%c%c ", pos, - (status & 0x8) ? 'P' : 'V', - (status & 0x4) ? 'd' : '_', - (status & 0x2) ? 'l' : '_', - (status & 0x1) ? '1' : '0'); -error_ret: - /* delay (2 * AD2S120X_TSCLK + 20) ns for sample pulse */ - udelay(1); - mutex_unlock(&st->lock); - - return ret ? ret : len; -} - -static ssize_t ad2s120x_show_vel(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct spi_message msg; - struct spi_transfer xfer; - int ret = 0; - ssize_t len = 0; - s16 vel; - u8 status; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s120x_state *st = idev->dev_data; - - xfer.len = 1; - xfer.tx_buf = st->tx; - xfer.rx_buf = st->rx; - mutex_lock(&st->lock); - - gpio_set_value(st->sample, 0); - /* delay (6 * AD2S120X_TSCLK + 20) nano seconds */ - udelay(1); - gpio_set_value(st->sample, 1); - - gpio_set_value(st->rdvel, 0); - /* ndelay(5);*/ - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) - goto error_ret; - status = st->rx[1]; - vel = (st->rx[0] & 0x80) ? 0xf000 : 0; - vel |= (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); - len += sprintf(buf + len, "%d %c%c%c%c\n", vel, + if (iattr->address) + pos = (((u16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); + else { + vel = (st->rx[0] & 0x80) ? 0xf000 : 0; + vel |= (((s16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); + } + len = sprintf(buf, "%d %c%c%c%c ", iattr->address ? pos : vel, (status & 0x8) ? 'P' : 'V', (status & 0x4) ? 'd' : '_', (status & 0x2) ? 'l' : '_', (status & 0x1) ? '1' : '0'); error_ret: - gpio_set_value(st->rdvel, 1); /* delay (2 * AD2S120X_TSCLK + 20) ns for sample pulse */ udelay(1); mutex_unlock(&st->lock); @@ -194,15 +79,10 @@ error_ret: return ret ? ret : len; } -static IIO_CONST_ATTR(description, - "12-Bit R/D Converter with Reference Oscillator"); -static IIO_DEVICE_ATTR(pos_vel, S_IRUGO, ad2s120x_show_pos_vel, NULL, 0); -static IIO_DEVICE_ATTR(pos, S_IRUGO, ad2s120x_show_pos, NULL, 0); -static IIO_DEVICE_ATTR(vel, S_IRUGO, ad2s120x_show_vel, NULL, 0); +static IIO_DEVICE_ATTR(pos, S_IRUGO, ad2s120x_show_val, NULL, 1); +static IIO_DEVICE_ATTR(vel, S_IRUGO, ad2s120x_show_val, NULL, 0); static struct attribute *ad2s120x_attributes[] = { - &iio_const_attr_description.dev_attr.attr, - &iio_dev_attr_pos_vel.dev_attr.attr, &iio_dev_attr_pos.dev_attr.attr, &iio_dev_attr_vel.dev_attr.attr, NULL, @@ -220,42 +100,33 @@ static const struct iio_info ad2s120x_info = { static int __devinit ad2s120x_probe(struct spi_device *spi) { struct ad2s120x_state *st; + struct iio_dev *indio_dev; int pn, ret = 0; unsigned short *pins = spi->dev.platform_data; - for (pn = 0; pn < AD2S120X_PN; pn++) { - if (gpio_request(pins[pn], DRV_NAME)) { + for (pn = 0; pn < AD2S120X_PN; pn++) + if (gpio_request_one(pins[pn], GPIOF_DIR_OUT, DRV_NAME)) { pr_err("%s: request gpio pin %d failed\n", DRV_NAME, pins[pn]); goto error_ret; } - gpio_direction_output(pins[pn], 1); - } - - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); - + spi_set_drvdata(spi, indio_dev); + st = iio_priv(indio_dev); mutex_init(&st->lock); st->sdev = spi; st->sample = pins[0]; st->rdvel = pins[1]; - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ad2s120x_info; + indio_dev->modes = INDIO_DIRECT_MODE; - st->idev->info = &ad2s120x_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; - - ret = iio_device_register(st->idev); + ret = iio_device_register(indio_dev); if (ret) goto error_free_dev; @@ -266,9 +137,7 @@ static int __devinit ad2s120x_probe(struct spi_device *spi) return 0; error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: for (--pn; pn >= 0; pn--) gpio_free(pins[pn]); @@ -277,10 +146,7 @@ error_ret: static int __devexit ad2s120x_remove(struct spi_device *spi) { - struct ad2s120x_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/resolver/ad2s1210.c b/drivers/staging/iio/resolver/ad2s1210.c index 09f4fcfda73a..ecaf7bb790fe 100644 --- a/drivers/staging/iio/resolver/ad2s1210.c +++ b/drivers/staging/iio/resolver/ad2s1210.c @@ -19,44 +19,41 @@ #include "../iio.h" #include "../sysfs.h" +#include "ad2s1210.h" #define DRV_NAME "ad2s1210" -#define DEF_CONTROL 0x7E - -#define MSB_IS_HIGH 0x80 -#define MSB_IS_LOW 0x7F -#define PHASE_LOCK_RANGE_44 0x20 -#define ENABLE_HYSTERESIS 0x10 -#define SET_ENRES1 0x08 -#define SET_ENRES0 0x04 -#define SET_RES1 0x02 -#define SET_RES0 0x01 - -#define SET_ENRESOLUTION (SET_ENRES1 | SET_ENRES0) -#define SET_RESOLUTION (SET_RES1 | SET_RES0) - -#define REG_POSITION 0x80 -#define REG_VELOCITY 0x82 -#define REG_LOS_THRD 0x88 -#define REG_DOS_OVR_THRD 0x89 -#define REG_DOS_MIS_THRD 0x8A -#define REG_DOS_RST_MAX_THRD 0x8B -#define REG_DOS_RST_MIN_THRD 0x8C -#define REG_LOT_HIGH_THRD 0x8D -#define REG_LOT_LOW_THRD 0x8E -#define REG_EXCIT_FREQ 0x91 -#define REG_CONTROL 0x92 -#define REG_SOFT_RESET 0xF0 -#define REG_FAULT 0xFF +#define AD2S1210_DEF_CONTROL 0x7E + +#define AD2S1210_MSB_IS_HIGH 0x80 +#define AD2S1210_MSB_IS_LOW 0x7F +#define AD2S1210_PHASE_LOCK_RANGE_44 0x20 +#define AD2S1210_ENABLE_HYSTERESIS 0x10 +#define AD2S1210_SET_ENRES1 0x08 +#define AD2S1210_SET_ENRES0 0x04 +#define AD2S1210_SET_RES1 0x02 +#define AD2S1210_SET_RES0 0x01 + +#define AD2S1210_SET_ENRESOLUTION (AD2S1210_SET_ENRES1 | \ + AD2S1210_SET_ENRES0) +#define AD2S1210_SET_RESOLUTION (AD2S1210_SET_RES1 | AD2S1210_SET_RES0) + +#define AD2S1210_REG_POSITION 0x80 +#define AD2S1210_REG_VELOCITY 0x82 +#define AD2S1210_REG_LOS_THRD 0x88 +#define AD2S1210_REG_DOS_OVR_THRD 0x89 +#define AD2S1210_REG_DOS_MIS_THRD 0x8A +#define AD2S1210_REG_DOS_RST_MAX_THRD 0x8B +#define AD2S1210_REG_DOS_RST_MIN_THRD 0x8C +#define AD2S1210_REG_LOT_HIGH_THRD 0x8D +#define AD2S1210_REG_LOT_LOW_THRD 0x8E +#define AD2S1210_REG_EXCIT_FREQ 0x91 +#define AD2S1210_REG_CONTROL 0x92 +#define AD2S1210_REG_SOFT_RESET 0xF0 +#define AD2S1210_REG_FAULT 0xFF /* pin SAMPLE, A0, A1, RES0, RES1, is controlled by driver */ #define AD2S1210_SAA 3 -#if defined(CONFIG_AD2S1210_GPIO_INPUT) || defined(CONFIG_AD2S1210_GPIO_OUTPUT) -# define AD2S1210_RES 2 -#else -# define AD2S1210_RES 0 -#endif #define AD2S1210_PN (AD2S1210_SAA + AD2S1210_RES) #define AD2S1210_MIN_CLKIN 6144000 @@ -75,190 +72,153 @@ enum ad2s1210_mode { MOD_POS = 0, MOD_VEL, - MOD_RESERVED, MOD_CONFIG, + MOD_RESERVED, }; -enum ad2s1210_res { - RES_10 = 10, - RES_12 = 12, - RES_14 = 14, - RES_16 = 16, -}; - -static unsigned int resolution_value[] = { - RES_10, RES_12, RES_14, RES_16}; +static const unsigned int ad2s1210_resolution_value[] = { 10, 12, 14, 16 }; struct ad2s1210_state { + const struct ad2s1210_platform_data *pdata; struct mutex lock; - struct iio_dev *idev; struct spi_device *sdev; - struct spi_transfer xfer; - unsigned int hysteresis; - unsigned int old_data; - enum ad2s1210_mode mode; - enum ad2s1210_res resolution; unsigned int fclkin; unsigned int fexcit; - unsigned short sample; - unsigned short a0; - unsigned short a1; - unsigned short res0; - unsigned short res1; - u8 rx[3]; - u8 tx[3]; + bool hysteresis; + bool old_data; + u8 resolution; + enum ad2s1210_mode mode; + u8 rx[2] ____cacheline_aligned; + u8 tx[2] ____cacheline_aligned; }; -static inline void start_sample(struct ad2s1210_state *st) -{ - gpio_set_value(st->sample, 0); -} - -static inline void stop_sample(struct ad2s1210_state *st) -{ - gpio_set_value(st->sample, 1); -} - -static inline void set_mode(enum ad2s1210_mode mode, struct ad2s1210_state *st) +static const int ad2s1210_mode_vals[4][2] = { + [MOD_POS] = { 0, 0 }, + [MOD_VEL] = { 0, 1 }, + [MOD_CONFIG] = { 1, 0 }, +}; +static inline void ad2s1210_set_mode(enum ad2s1210_mode mode, + struct ad2s1210_state *st) { - switch (mode) { - case MOD_POS: - gpio_set_value(st->a0, 0); - gpio_set_value(st->a1, 0); - break; - case MOD_VEL: - gpio_set_value(st->a0, 0); - gpio_set_value(st->a1, 1); - break; - case MOD_CONFIG: - gpio_set_value(st->a0, 1); - gpio_set_value(st->a1, 1); - break; - default: - /* set to reserved mode */ - gpio_set_value(st->a0, 1); - gpio_set_value(st->a1, 0); - } + gpio_set_value(st->pdata->a[0], ad2s1210_mode_vals[mode][0]); + gpio_set_value(st->pdata->a[1], ad2s1210_mode_vals[mode][1]); st->mode = mode; } /* write 1 bytes (address or data) to the chip */ -static int config_write(struct ad2s1210_state *st, - unsigned char data) +static int ad2s1210_config_write(struct ad2s1210_state *st, u8 data) { - struct spi_message msg; - int ret = 0; - - st->xfer.len = 1; - set_mode(MOD_CONFIG, st); + int ret; - spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); + ad2s1210_set_mode(MOD_CONFIG, st); st->tx[0] = data; - ret = spi_sync(st->sdev, &msg); - if (ret) + ret = spi_write(st->sdev, st->tx, 1); + if (ret < 0) return ret; - st->old_data = 1; - return ret; + st->old_data = true; + + return 0; } /* read value from one of the registers */ -static int config_read(struct ad2s1210_state *st, - unsigned char address, - unsigned char *data) -{ +static int ad2s1210_config_read(struct ad2s1210_state *st, + unsigned char address) +{ + struct spi_transfer xfer = { + .len = 2, + .rx_buf = st->rx, + .tx_buf = st->tx, + }; struct spi_message msg; int ret = 0; - st->xfer.len = 2; - set_mode(MOD_CONFIG, st); - + ad2s1210_set_mode(MOD_CONFIG, st); spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); - st->tx[0] = address | MSB_IS_HIGH; - st->tx[1] = REG_FAULT; + spi_message_add_tail(&xfer, &msg); + st->tx[0] = address | AD2S1210_MSB_IS_HIGH; + st->tx[1] = AD2S1210_REG_FAULT; ret = spi_sync(st->sdev, &msg); - if (ret) + if (ret < 0) return ret; - *data = st->rx[1]; - st->old_data = 1; - return ret; + st->old_data = true; + + return st->rx[1]; } -static inline void update_frequency_control_word(struct ad2s1210_state *st) +static inline +int ad2s1210_update_frequency_control_word(struct ad2s1210_state *st) { + int ret; unsigned char fcw; + fcw = (unsigned char)(st->fexcit * (1 << 15) / st->fclkin); - if (fcw >= AD2S1210_MIN_FCW && fcw <= AD2S1210_MAX_FCW) { - config_write(st, REG_EXCIT_FREQ); - config_write(st, fcw); - } else + if (fcw < AD2S1210_MIN_FCW || fcw > AD2S1210_MAX_FCW) { pr_err("ad2s1210: FCW out of range\n"); + return -ERANGE; + } + + ret = ad2s1210_config_write(st, AD2S1210_REG_EXCIT_FREQ); + if (ret < 0) + return ret; + + return ad2s1210_config_write(st, fcw); } -#if defined(CONFIG_AD2S1210_GPIO_INPUT) -static inline unsigned char read_resolution_pin(struct ad2s1210_state *st) +static unsigned char ad2s1210_read_resolution_pin(struct ad2s1210_state *st) { - unsigned int data; - data = (gpio_get_value(st->res0) << 1) | - gpio_get_value(st->res1); - return resolution_value[data]; + return ad2s1210_resolution_value[ + (gpio_get_value(st->pdata->res[0]) << 1) | + gpio_get_value(st->pdata->res[1])]; } -#elif defined(CONFIG_AD2S1210_GPIO_OUTPUT) -static inline void set_resolution_pin(struct ad2s1210_state *st) + +static const int ad2s1210_res_pins[4][2] = { + { 0, 0 }, {0, 1}, {1, 0}, {1, 1} +}; + +static inline void ad2s1210_set_resolution_pin(struct ad2s1210_state *st) { - switch (st->resolution) { - case RES_10: - gpio_set_value(st->res0, 0); - gpio_set_value(st->res1, 0); - break; - case RES_12: - gpio_set_value(st->res0, 0); - gpio_set_value(st->res1, 1); - break; - case RES_14: - gpio_set_value(st->res0, 1); - gpio_set_value(st->res1, 0); - break; - case RES_16: - gpio_set_value(st->res0, 1); - gpio_set_value(st->res1, 1); - break; - } + gpio_set_value(st->pdata->res[0], + ad2s1210_res_pins[(st->resolution - 10)/2][0]); + gpio_set_value(st->pdata->res[1], + ad2s1210_res_pins[(st->resolution - 10)/2][1]); } -#endif -static inline void soft_reset(struct ad2s1210_state *st) +static inline int ad2s1210_soft_reset(struct ad2s1210_state *st) { - config_write(st, REG_SOFT_RESET); - config_write(st, 0x0); + int ret; + + ret = ad2s1210_config_write(st, AD2S1210_REG_SOFT_RESET); + if (ret < 0) + return ret; + + return ad2s1210_config_write(st, 0x0); } /* return the OLD DATA since last spi bus write */ static ssize_t ad2s1210_show_raw(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; - int ret; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); + int ret = 0; mutex_lock(&st->lock); if (st->old_data) { ret = sprintf(buf, "0x%x\n", st->rx[0]); - st->old_data = 0; - } else - ret = 0; + st->old_data = false; + } mutex_unlock(&st->lock); + return ret; } static ssize_t ad2s1210_store_raw(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, + size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned long udata; unsigned char data; int ret; @@ -266,139 +226,157 @@ static ssize_t ad2s1210_store_raw(struct device *dev, ret = strict_strtoul(buf, 16, &udata); if (ret) return -EINVAL; + data = udata & 0xff; mutex_lock(&st->lock); - config_write(st, data); + ret = ad2s1210_config_write(st, data); mutex_unlock(&st->lock); - return 1; + + return ret < 0 ? ret : len; } static ssize_t ad2s1210_store_softreset(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, + size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); + int ret; + mutex_lock(&st->lock); - soft_reset(st); + ret = ad2s1210_soft_reset(st); mutex_unlock(&st->lock); - return len; + + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_fclkin(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); return sprintf(buf, "%d\n", st->fclkin); } static ssize_t ad2s1210_store_fclkin(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, + size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned long fclkin; int ret; ret = strict_strtoul(buf, 10, &fclkin); - if (!ret && fclkin >= AD2S1210_MIN_CLKIN && - fclkin <= AD2S1210_MAX_CLKIN) { - mutex_lock(&st->lock); - st->fclkin = fclkin; - } else { + if (ret) + return ret; + if (fclkin < AD2S1210_MIN_CLKIN || fclkin > AD2S1210_MAX_CLKIN) { pr_err("ad2s1210: fclkin out of range\n"); return -EINVAL; } - update_frequency_control_word(st); - soft_reset(st); + + mutex_lock(&st->lock); + st->fclkin = fclkin; + + ret = ad2s1210_update_frequency_control_word(st); + if (ret < 0) + goto error_ret; + ret = ad2s1210_soft_reset(st); +error_ret: mutex_unlock(&st->lock); - return len; + + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_fexcit(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); return sprintf(buf, "%d\n", st->fexcit); } static ssize_t ad2s1210_store_fexcit(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned long fexcit; int ret; ret = strict_strtoul(buf, 10, &fexcit); - if (!ret && fexcit >= AD2S1210_MIN_EXCIT && - fexcit <= AD2S1210_MAX_EXCIT) { - mutex_lock(&st->lock); - st->fexcit = fexcit; - } else { + if (ret < 0) + return ret; + if (fexcit < AD2S1210_MIN_EXCIT || fexcit > AD2S1210_MAX_EXCIT) { pr_err("ad2s1210: excitation frequency out of range\n"); return -EINVAL; } - update_frequency_control_word(st); - soft_reset(st); + mutex_lock(&st->lock); + st->fexcit = fexcit; + ret = ad2s1210_update_frequency_control_word(st); + if (ret < 0) + goto error_ret; + ret = ad2s1210_soft_reset(st); +error_ret: mutex_unlock(&st->lock); - return len; + + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_control(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; - unsigned char data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); + int ret; mutex_lock(&st->lock); - config_read(st, REG_CONTROL, &data); + ret = ad2s1210_config_read(st, AD2S1210_REG_CONTROL); mutex_unlock(&st->lock); - return sprintf(buf, "0x%x\n", data); + return ret < 0 ? ret : sprintf(buf, "0x%x\n", ret); } static ssize_t ad2s1210_store_control(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned long udata; unsigned char data; int ret; ret = strict_strtoul(buf, 16, &udata); - if (ret) { - ret = -EINVAL; - goto error_ret; - } + if (ret) + return -EINVAL; + mutex_lock(&st->lock); - config_write(st, REG_CONTROL); - data = udata & MSB_IS_LOW; - config_write(st, data); - config_read(st, REG_CONTROL, &data); - if (data & MSB_IS_HIGH) { + ret = ad2s1210_config_write(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + data = udata & AD2S1210_MSB_IS_LOW; + ret = ad2s1210_config_write(st, data); + if (ret < 0) + goto error_ret; + + ret = ad2s1210_config_read(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + if (ret & AD2S1210_MSB_IS_HIGH) { ret = -EIO; pr_err("ad2s1210: write control register fail\n"); goto error_ret; } - st->resolution = resolution_value[data & SET_RESOLUTION]; -#if defined(CONFIG_AD2S1210_GPIO_INPUT) - data = read_resolution_pin(st); - if (data != st->resolution) - pr_warning("ad2s1210: resolution settings not match\n"); -#elif defined(CONFIG_AD2S1210_GPIO_OUTPUT) - set_resolution_pin(st); -#endif + st->resolution + = ad2s1210_resolution_value[data & AD2S1210_SET_RESOLUTION]; + if (st->pdata->gpioin) { + data = ad2s1210_read_resolution_pin(st); + if (data != st->resolution) + pr_warning("ad2s1210: resolution settings not match\n"); + } else + ad2s1210_set_resolution_pin(st); + ret = len; - if (data & ENABLE_HYSTERESIS) - st->hysteresis = 1; - else - st->hysteresis = 0; + st->hysteresis = !!(data & AD2S1210_ENABLE_HYSTERESIS); + error_ret: mutex_unlock(&st->lock); return ret; @@ -407,8 +385,7 @@ error_ret: static ssize_t ad2s1210_show_resolution(struct device *dev, struct device_attribute *attr, char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); return sprintf(buf, "%d\n", st->resolution); } @@ -416,103 +393,109 @@ static ssize_t ad2s1210_store_resolution(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned char data; unsigned long udata; int ret; ret = strict_strtoul(buf, 10, &udata); - if (ret || udata < RES_10 || udata > RES_16) { + if (ret || udata < 10 || udata > 16) { pr_err("ad2s1210: resolution out of range\n"); return -EINVAL; } mutex_lock(&st->lock); - config_read(st, REG_CONTROL, &data); - data &= ~SET_RESOLUTION; - data |= (udata - RES_10) >> 1; - config_write(st, REG_CONTROL); - config_write(st, data & MSB_IS_LOW); - config_read(st, REG_CONTROL, &data); - if (data & MSB_IS_HIGH) { + ret = ad2s1210_config_read(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + data = ret; + data &= ~AD2S1210_SET_RESOLUTION; + data |= (udata - 10) >> 1; + ret = ad2s1210_config_write(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + ret = ad2s1210_config_write(st, data & AD2S1210_MSB_IS_LOW); + if (ret < 0) + goto error_ret; + ret = ad2s1210_config_read(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + data = ret; + if (data & AD2S1210_MSB_IS_HIGH) { ret = -EIO; pr_err("ad2s1210: setting resolution fail\n"); goto error_ret; } - st->resolution = resolution_value[data & SET_RESOLUTION]; -#if defined(CONFIG_AD2S1210_GPIO_INPUT) - data = read_resolution_pin(st); - if (data != st->resolution) - pr_warning("ad2s1210: resolution settings not match\n"); -#elif defined(CONFIG_AD2S1210_GPIO_OUTPUT) - set_resolution_pin(st); -#endif + st->resolution + = ad2s1210_resolution_value[data & AD2S1210_SET_RESOLUTION]; + if (st->pdata->gpioin) { + data = ad2s1210_read_resolution_pin(st); + if (data != st->resolution) + pr_warning("ad2s1210: resolution settings not match\n"); + } else + ad2s1210_set_resolution_pin(st); ret = len; error_ret: mutex_unlock(&st->lock); return ret; } + /* read the fault register since last sample */ static ssize_t ad2s1210_show_fault(struct device *dev, struct device_attribute *attr, char *buf) { - int ret = 0; - ssize_t len = 0; - unsigned char data; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); + int ret; mutex_lock(&st->lock); - ret = config_read(st, REG_FAULT, &data); - - if (ret) - goto error_ret; - len = sprintf(buf, "0x%x\n", data); -error_ret: + ret = ad2s1210_config_read(st, AD2S1210_REG_FAULT); mutex_unlock(&st->lock); - return ret ? ret : len; + + return ret ? ret : sprintf(buf, "0x%x\n", ret); } static ssize_t ad2s1210_clear_fault(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + struct device_attribute *attr, + const char *buf, + size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; - unsigned char data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); + int ret; mutex_lock(&st->lock); - start_sample(st); + gpio_set_value(st->pdata->sample, 0); /* delay (2 * tck + 20) nano seconds */ udelay(1); - stop_sample(st); - config_read(st, REG_FAULT, &data); - start_sample(st); - stop_sample(st); + gpio_set_value(st->pdata->sample, 1); + ret = ad2s1210_config_read(st, AD2S1210_REG_FAULT); + if (ret < 0) + goto error_ret; + gpio_set_value(st->pdata->sample, 0); + gpio_set_value(st->pdata->sample, 1); +error_ret: mutex_unlock(&st->lock); - return 0; + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_reg(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; - unsigned char data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); struct iio_dev_attr *iattr = to_iio_dev_attr(attr); + int ret; mutex_lock(&st->lock); - config_read(st, iattr->address, &data); + ret = ad2s1210_config_read(st, iattr->address); mutex_unlock(&st->lock); - return sprintf(buf, "%d\n", data); + + return ret < 0 ? ret : sprintf(buf, "%d\n", ret); } static ssize_t ad2s1210_store_reg(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); unsigned long data; int ret; struct iio_dev_attr *iattr = to_iio_dev_attr(attr); @@ -521,183 +504,121 @@ static ssize_t ad2s1210_store_reg(struct device *dev, if (ret) return -EINVAL; mutex_lock(&st->lock); - config_write(st, iattr->address); - config_write(st, data & MSB_IS_LOW); + ret = ad2s1210_config_write(st, iattr->address); + if (ret < 0) + goto error_ret; + ret = ad2s1210_config_write(st, data & AD2S1210_MSB_IS_LOW); +error_ret: mutex_unlock(&st->lock); - return len; + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_pos(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct spi_message msg; int ret = 0; ssize_t len = 0; u16 pos; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); - st->xfer.len = 2; mutex_lock(&st->lock); - start_sample(st); + gpio_set_value(st->pdata->sample, 0); /* delay (6 * tck + 20) nano seconds */ udelay(1); - set_mode(MOD_POS, st); - - spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); - ret = spi_sync(st->sdev, &msg); + ad2s1210_set_mode(MOD_POS, st); + ret = spi_read(st->sdev, st->rx, 2); if (ret) goto error_ret; - pos = ((((u16)(st->rx[0])) << 8) | (st->rx[1])); + pos = be16_to_cpup((u16 *)st->rx); if (st->hysteresis) pos >>= 16 - st->resolution; len = sprintf(buf, "%d\n", pos); error_ret: - stop_sample(st); + gpio_set_value(st->pdata->sample, 1); /* delay (2 * tck + 20) nano seconds */ udelay(1); mutex_unlock(&st->lock); - return ret ? ret : len; + return ret < 0 ? ret : len; } static ssize_t ad2s1210_show_vel(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { - struct spi_message msg; unsigned short negative; int ret = 0; ssize_t len = 0; s16 vel; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; + struct ad2s1210_state *st = iio_priv(dev_get_drvdata(dev)); - st->xfer.len = 2; mutex_lock(&st->lock); - start_sample(st); + gpio_set_value(st->pdata->sample, 0); /* delay (6 * tck + 20) nano seconds */ udelay(1); - set_mode(MOD_VEL, st); - - spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); - ret = spi_sync(st->sdev, &msg); + ad2s1210_set_mode(MOD_VEL, st); + ret = spi_read(st->sdev, st->rx, 2); if (ret) goto error_ret; negative = st->rx[0] & 0x80; - vel = ((((s16)(st->rx[0])) << 8) | (st->rx[1])); + vel = be16_to_cpup((s16 *)st->rx); vel >>= 16 - st->resolution; - if (negative) { + if (vel & 0x8000) { negative = (0xffff >> st->resolution) << st->resolution; vel |= negative; } len = sprintf(buf, "%d\n", vel); error_ret: - stop_sample(st); + gpio_set_value(st->pdata->sample, 1); /* delay (2 * tck + 20) nano seconds */ udelay(1); mutex_unlock(&st->lock); - return ret ? ret : len; + return ret < 0 ? ret : len; } -static ssize_t ad2s1210_show_pos_vel(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct spi_message msg; - unsigned short negative; - int ret = 0; - ssize_t len = 0; - u16 pos; - s16 vel; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s1210_state *st = idev->dev_data; - - st->xfer.len = 2; - mutex_lock(&st->lock); - start_sample(st); - /* delay (6 * tck + 20) nano seconds */ - udelay(1); - - set_mode(MOD_POS, st); - - spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) - goto error_ret; - pos = ((((u16)(st->rx[0])) << 8) | (st->rx[1])); - if (st->hysteresis) - pos >>= 16 - st->resolution; - len = sprintf(buf, "%d ", pos); - - st->xfer.len = 2; - set_mode(MOD_VEL, st); - spi_message_init(&msg); - spi_message_add_tail(&st->xfer, &msg); - ret = spi_sync(st->sdev, &msg); - if (ret) - goto error_ret; - negative = st->rx[0] & 0x80; - vel = ((((s16)(st->rx[0])) << 8) | (st->rx[1])); - vel >>= 16 - st->resolution; - if (negative) { - negative = (0xffff >> st->resolution) << st->resolution; - vel |= negative; - } - len += sprintf(buf + len, "%d\n", vel); -error_ret: - stop_sample(st); - /* delay (2 * tck + 20) nano seconds */ - udelay(1); - mutex_unlock(&st->lock); - - return ret ? ret : len; -} - -static IIO_CONST_ATTR(description, - "Variable Resolution, 10-Bit to 16Bit R/D\n\ -Converter with Reference Oscillator"); static IIO_DEVICE_ATTR(raw_io, S_IRUGO | S_IWUSR, - ad2s1210_show_raw, ad2s1210_store_raw, 0); + ad2s1210_show_raw, ad2s1210_store_raw, 0); static IIO_DEVICE_ATTR(reset, S_IWUSR, - NULL, ad2s1210_store_softreset, 0); + NULL, ad2s1210_store_softreset, 0); static IIO_DEVICE_ATTR(fclkin, S_IRUGO | S_IWUSR, - ad2s1210_show_fclkin, ad2s1210_store_fclkin, 0); + ad2s1210_show_fclkin, ad2s1210_store_fclkin, 0); static IIO_DEVICE_ATTR(fexcit, S_IRUGO | S_IWUSR, - ad2s1210_show_fexcit, ad2s1210_store_fexcit, 0); + ad2s1210_show_fexcit, ad2s1210_store_fexcit, 0); static IIO_DEVICE_ATTR(control, S_IRUGO | S_IWUSR, - ad2s1210_show_control, ad2s1210_store_control, 0); + ad2s1210_show_control, ad2s1210_store_control, 0); static IIO_DEVICE_ATTR(bits, S_IRUGO | S_IWUSR, - ad2s1210_show_resolution, ad2s1210_store_resolution, 0); + ad2s1210_show_resolution, ad2s1210_store_resolution, 0); static IIO_DEVICE_ATTR(fault, S_IRUGO | S_IWUSR, - ad2s1210_show_fault, ad2s1210_clear_fault, 0); -static IIO_DEVICE_ATTR(pos, S_IRUGO, - ad2s1210_show_pos, NULL, 0); -static IIO_DEVICE_ATTR(vel, S_IRUGO, - ad2s1210_show_vel, NULL, 0); -static IIO_DEVICE_ATTR(pos_vel, S_IRUGO, - ad2s1210_show_pos_vel, NULL, 0); + ad2s1210_show_fault, ad2s1210_clear_fault, 0); +static IIO_DEVICE_ATTR(pos, S_IRUGO, ad2s1210_show_pos, NULL, 0); +static IIO_DEVICE_ATTR(vel, S_IRUGO, ad2s1210_show_vel, NULL, 0); static IIO_DEVICE_ATTR(los_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_LOS_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_LOS_THRD); static IIO_DEVICE_ATTR(dos_ovr_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_DOS_OVR_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_DOS_OVR_THRD); static IIO_DEVICE_ATTR(dos_mis_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_DOS_MIS_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_DOS_MIS_THRD); static IIO_DEVICE_ATTR(dos_rst_max_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_DOS_RST_MAX_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_DOS_RST_MAX_THRD); static IIO_DEVICE_ATTR(dos_rst_min_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_DOS_RST_MIN_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_DOS_RST_MIN_THRD); static IIO_DEVICE_ATTR(lot_high_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_LOT_HIGH_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_LOT_HIGH_THRD); static IIO_DEVICE_ATTR(lot_low_thrd, S_IRUGO | S_IWUSR, - ad2s1210_show_reg, ad2s1210_store_reg, REG_LOT_LOW_THRD); + ad2s1210_show_reg, ad2s1210_store_reg, + AD2S1210_REG_LOT_LOW_THRD); static struct attribute *ad2s1210_attributes[] = { - &iio_const_attr_description.dev_attr.attr, &iio_dev_attr_raw_io.dev_attr.attr, &iio_dev_attr_reset.dev_attr.attr, &iio_dev_attr_fclkin.dev_attr.attr, @@ -707,7 +628,6 @@ static struct attribute *ad2s1210_attributes[] = { &iio_dev_attr_fault.dev_attr.attr, &iio_dev_attr_pos.dev_attr.attr, &iio_dev_attr_vel.dev_attr.attr, - &iio_dev_attr_pos_vel.dev_attr.attr, &iio_dev_attr_los_thrd.dev_attr.attr, &iio_dev_attr_dos_ovr_thrd.dev_attr.attr, &iio_dev_attr_dos_mis_thrd.dev_attr.attr, @@ -729,27 +649,32 @@ static int __devinit ad2s1210_initial(struct ad2s1210_state *st) int ret; mutex_lock(&st->lock); -#if defined(CONFIG_AD2S1210_GPIO_INPUT) - st->resolution = read_resolution_pin(st); -#elif defined(CONFIG_AD2S1210_GPIO_OUTPUT) - set_resolution_pin(st); -#endif - - config_write(st, REG_CONTROL); - data = DEF_CONTROL & ~(SET_RESOLUTION); - data |= (st->resolution - RES_10) >> 1; - config_write(st, data); - ret = config_read(st, REG_CONTROL, &data); - if (ret) + if (st->pdata->gpioin) + st->resolution = ad2s1210_read_resolution_pin(st); + else + ad2s1210_set_resolution_pin(st); + + ret = ad2s1210_config_write(st, AD2S1210_REG_CONTROL); + if (ret < 0) + goto error_ret; + data = AD2S1210_DEF_CONTROL & ~(AD2S1210_SET_RESOLUTION); + data |= (st->resolution - 10) >> 1; + ret = ad2s1210_config_write(st, data); + if (ret < 0) + goto error_ret; + ret = ad2s1210_config_read(st, AD2S1210_REG_CONTROL); + if (ret < 0) goto error_ret; - if (data & MSB_IS_HIGH) { + if (ret & AD2S1210_MSB_IS_HIGH) { ret = -EIO; goto error_ret; } - update_frequency_control_word(st); - soft_reset(st); + ret = ad2s1210_update_frequency_control_word(st); + if (ret < 0) + goto error_ret; + ret = ad2s1210_soft_reset(st); error_ret: mutex_unlock(&st->lock); return ret; @@ -760,90 +685,107 @@ static const struct iio_info ad2s1210_info = { .driver_module = THIS_MODULE, }; +static int ad2s1210_setup_gpios(struct ad2s1210_state *st) +{ + int ret; + unsigned long flags = st->pdata->gpioin ? GPIOF_DIR_IN : GPIOF_DIR_OUT; + + ret = gpio_request_one(st->pdata->sample, GPIOF_DIR_IN, "sample"); + if (ret < 0) + goto error_ret; + ret = gpio_request_one(st->pdata->a[0], flags, "a0"); + if (ret < 0) + goto error_free_sample; + ret = gpio_request_one(st->pdata->a[1], flags, "a1"); + if (ret < 0) + goto error_free_a0; + ret = gpio_request_one(st->pdata->res[1], flags, "res0"); + if (ret < 0) + goto error_free_a1; + ret = gpio_request_one(st->pdata->res[1], flags, "res1"); + if (ret < 0) + goto error_free_res0; + + return 0; +error_free_res0: + gpio_free(st->pdata->res[0]); +error_free_a1: + gpio_free(st->pdata->a[1]); +error_free_a0: + gpio_free(st->pdata->a[0]); +error_free_sample: + gpio_free(st->pdata->sample); +error_ret: + return ret; +} + +static void ad2s1210_free_gpios(struct ad2s1210_state *st) +{ + gpio_free(st->pdata->res[1]); + gpio_free(st->pdata->res[0]); + gpio_free(st->pdata->a[1]); + gpio_free(st->pdata->a[0]); + gpio_free(st->pdata->sample); +} + static int __devinit ad2s1210_probe(struct spi_device *spi) { + struct iio_dev *indio_dev; struct ad2s1210_state *st; - int pn, ret = 0; - unsigned short *pins = spi->dev.platform_data; - - for (pn = 0; pn < AD2S1210_PN; pn++) { - if (gpio_request(pins[pn], DRV_NAME)) { - pr_err("%s: request gpio pin %d failed\n", - DRV_NAME, pins[pn]); - goto error_ret; - } - if (pn < AD2S1210_SAA) - gpio_direction_output(pins[pn], 1); - else { -#if defined(CONFIG_AD2S1210_GPIO_INPUT) - gpio_direction_input(pins[pn]); -#elif defined(CONFIG_AD2S1210_GPIO_OUTPUT) - gpio_direction_output(pins[pn], 1); -#endif - } - } + int ret; + + if (spi->dev.platform_data == NULL) + return -EINVAL; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); + st = iio_priv(indio_dev); + st->pdata = spi->dev.platform_data; + ret = ad2s1210_setup_gpios(st); + if (ret < 0) + goto error_free_dev; + + spi_set_drvdata(spi, indio_dev); mutex_init(&st->lock); st->sdev = spi; - st->xfer.tx_buf = st->tx; - st->xfer.rx_buf = st->rx; - st->hysteresis = 1; + st->hysteresis = true; st->mode = MOD_CONFIG; - st->resolution = RES_12; - st->fclkin = AD2S1210_DEF_CLKIN; + st->resolution = 12; st->fexcit = AD2S1210_DEF_EXCIT; - st->sample = pins[0]; - st->a0 = pins[1]; - st->a1 = pins[2]; - st->res0 = pins[3]; - st->res1 = pins[4]; - - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; - st->idev->info = &ad2s1210_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ad2s1210_info; + indio_dev->modes = INDIO_DIRECT_MODE; - ret = iio_device_register(st->idev); + ret = iio_device_register(indio_dev); if (ret) - goto error_free_dev; + goto error_free_gpios; - if (spi->max_speed_hz != AD2S1210_DEF_CLKIN) - st->fclkin = spi->max_speed_hz; + st->fclkin = spi->max_speed_hz; spi->mode = SPI_MODE_3; spi_setup(spi); - ad2s1210_initial(st); + return 0; +error_free_gpios: + ad2s1210_free_gpios(st); error_free_dev: - iio_free_device(st->idev); -error_free_st: - kfree(st); + iio_free_device(indio_dev); error_ret: - for (--pn; pn >= 0; pn--) - gpio_free(pins[pn]); return ret; } static int __devexit ad2s1210_remove(struct spi_device *spi) { - struct ad2s1210_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + struct iio_dev *indio_dev = spi_get_drvdata(spi); + struct ad2s1210_state *st = iio_priv(indio_dev); + iio_device_unregister(indio_dev); + ad2s1210_free_gpios(st); return 0; } diff --git a/drivers/staging/iio/resolver/ad2s1210.h b/drivers/staging/iio/resolver/ad2s1210.h new file mode 100644 index 000000000000..aec0bdca16a4 --- /dev/null +++ b/drivers/staging/iio/resolver/ad2s1210.h @@ -0,0 +1,17 @@ +/* + * ad2s1210.h plaform data for the ADI Resolver to Digital Converters: + * AD2S1210 + * + * Copyright (c) 2010-2010 Analog Devices Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +struct ad2s1210_platform_data { + unsigned sample; + unsigned a[2]; + unsigned res[2]; + bool gpioin; +}; diff --git a/drivers/staging/iio/resolver/ad2s90.c b/drivers/staging/iio/resolver/ad2s90.c index 9b72a952f2bc..166e2414ac85 100644 --- a/drivers/staging/iio/resolver/ad2s90.c +++ b/drivers/staging/iio/resolver/ad2s90.c @@ -24,29 +24,19 @@ struct ad2s90_state { struct mutex lock; struct iio_dev *idev; struct spi_device *sdev; - u8 rx[2]; - u8 tx[2]; + u8 rx[2] ____cacheline_aligned; }; static ssize_t ad2s90_show_angular(struct device *dev, struct device_attribute *attr, char *buf) { - struct spi_message msg; - struct spi_transfer xfer; int ret; ssize_t len = 0; u16 val; - struct iio_dev *idev = dev_get_drvdata(dev); - struct ad2s90_state *st = idev->dev_data; + struct ad2s90_state *st = iio_priv(dev_get_drvdata(dev)); - xfer.len = 1; - xfer.tx_buf = st->tx; - xfer.rx_buf = st->rx; mutex_lock(&st->lock); - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - ret = spi_sync(st->sdev, &msg); + ret = spi_read(st->sdev, st->rx, 2); if (ret) goto error_ret; val = (((u16)(st->rx[0])) << 4) | ((st->rx[1] & 0xF0) >> 4); @@ -60,12 +50,9 @@ error_ret: #define IIO_DEV_ATTR_SIMPLE_RESOLVER(_show) \ IIO_DEVICE_ATTR(angular, S_IRUGO, _show, NULL, 0) -static IIO_CONST_ATTR(description, - "Low Cost, Complete 12-Bit Resolver-to-Digital Converter"); static IIO_DEV_ATTR_SIMPLE_RESOLVER(ad2s90_show_angular); static struct attribute *ad2s90_attributes[] = { - &iio_const_attr_description.dev_attr.attr, &iio_dev_attr_angular.dev_attr.attr, NULL, }; @@ -82,29 +69,23 @@ static const struct iio_info ad2s90_info = { static int __devinit ad2s90_probe(struct spi_device *spi) { + struct iio_dev *indio_dev; struct ad2s90_state *st; int ret = 0; - st = kzalloc(sizeof(*st), GFP_KERNEL); - if (st == NULL) { + indio_dev = iio_allocate_device(sizeof(*st)); + if (indio_dev == NULL) { ret = -ENOMEM; goto error_ret; } - spi_set_drvdata(spi, st); + st = iio_priv(indio_dev); + spi_set_drvdata(spi, indio_dev); mutex_init(&st->lock); st->sdev = spi; - - st->idev = iio_allocate_device(0); - if (st->idev == NULL) { - ret = -ENOMEM; - goto error_free_st; - } - st->idev->dev.parent = &spi->dev; - - st->idev->info = &ad2s90_info; - st->idev->dev_data = (void *)(st); - st->idev->modes = INDIO_DIRECT_MODE; + indio_dev->dev.parent = &spi->dev; + indio_dev->info = &ad2s90_info; + indio_dev->modes = INDIO_DIRECT_MODE; ret = iio_device_register(st->idev); if (ret) @@ -119,18 +100,13 @@ static int __devinit ad2s90_probe(struct spi_device *spi) error_free_dev: iio_free_device(st->idev); -error_free_st: - kfree(st); error_ret: return ret; } static int __devexit ad2s90_remove(struct spi_device *spi) { - struct ad2s90_state *st = spi_get_drvdata(spi); - - iio_device_unregister(st->idev); - kfree(st); + iio_device_unregister(spi_get_drvdata(spi)); return 0; } diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h index f329fe10fa2f..e0b58ed749b8 100644 --- a/drivers/staging/iio/trigger.h +++ b/drivers/staging/iio/trigger.h @@ -29,6 +29,8 @@ struct iio_subirq { * @set_trigger_state: [DRIVER] switch on/off the trigger on demand * @try_reenable: function to reenable the trigger when the * use count is zero (may be NULL) + * @validate_device: function to validate the device when the + * current trigger gets changed. * @subirq_chip: [INTERN] associate 'virtual' irq chip. * @subirq_base: [INTERN] base number for irqs provided by trigger. * @subirqs: [INTERN] information about the 'child' irqs. @@ -48,6 +50,8 @@ struct iio_trigger { int (*set_trigger_state)(struct iio_trigger *trig, bool state); int (*try_reenable)(struct iio_trigger *trig); + int (*validate_device)(struct iio_trigger *trig, + struct iio_dev *indio_dev); struct irq_chip subirq_chip; int subirq_base; @@ -57,6 +61,30 @@ struct iio_trigger { struct mutex pool_lock; }; +/** + * struct iio_poll_func - poll function pair + * + * @private_data: data specific to device (passed into poll func) + * @h: the function that is actually run on trigger + * @thread: threaded interrupt part + * @type: the type of interrupt (basically if oneshot) + * @name: name used to identify the trigger consumer. + * @irq: the corresponding irq as allocated from the + * trigger pool + * @timestamp: some devices need a timestamp grabbed as soon + * as possible after the trigger - hence handler + * passes it via here. + **/ +struct iio_poll_func { + void *private_data; + irqreturn_t (*h)(int irq, void *p); + irqreturn_t (*thread)(int irq, void *p); + int type; + char *name; + int irq; + s64 timestamp; +}; + static inline struct iio_trigger *to_iio_trigger(struct device *d) { return container_of(d, struct iio_trigger, dev); @@ -136,30 +164,6 @@ static inline void iio_trigger_put_irq(struct iio_trigger *trig, int irq) mutex_unlock(&trig->pool_lock); }; -/** - * struct iio_poll_func - poll function pair - * - * @private_data: data specific to device (passed into poll func) - * @h: the function that is actually run on trigger - * @thread: threaded interrupt part - * @type: the type of interrupt (basically if oneshot) - * @name: name used to identify the trigger consumer. - * @irq: the corresponding irq as allocated from the - * trigger pool - * @timestamp: some devices need a timestamp grabbed as soon - * as possible after the trigger - hence handler - * passes it via here. - **/ -struct iio_poll_func { - void *private_data; - irqreturn_t (*h)(int irq, void *p); - irqreturn_t (*thread)(int irq, void *p); - int type; - char *name; - int irq; - s64 timestamp; -}; - struct iio_poll_func *iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p), irqreturn_t (*thread)(int irq, void *p), diff --git a/drivers/staging/iio/trigger/iio-trig-gpio.c b/drivers/staging/iio/trigger/iio-trig-gpio.c index b188635c3460..f1fb795e6410 100644 --- a/drivers/staging/iio/trigger/iio-trig-gpio.c +++ b/drivers/staging/iio/trigger/iio-trig-gpio.c @@ -7,7 +7,7 @@ * under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. * - * Currently this is more of a functioning proof of concept that a fully + * Currently this is more of a functioning proof of concept than a full * fledged trigger driver. * * TODO: |