Second round of IIO cleanups for the 3.10 cycle

1) A nice little removal of the unwanted private pointer from
    struct iio_trigger.
 2) Some clean up of the ad799x driver.
 3) Couple of cleanups for the exynos_adc driver and some documentation.
 4) Move the mxs-lradc initialization a little earlier in the driver to avoid
    wiping out the configuration just after setting it.
 
 A nice small set of worthy bits and bobs.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2.0.19 (GNU/Linux)
 
 iQIcBAABAgAGBQJRVWQ/AAoJEFSFNJnE9BaIPY4P/1Z8Vgv0WEdMTrak8VBkzwUj
 09uzZNizxs01F1Oe2bdVuPg73UOAZV4U04SwYvB/6fcFUDmtc0L1olh5znxFopW2
 GnO+Qq4xXhNRDrXfR4auEiz9Ua0BPnFlOaLdnpdbuXgFyLocuerFtC4ewmw3uVoa
 Y4fRoGX1p2oSrZLvAPjaWMSyWKeSuk5xZHOD7VuIWEmBFfF55kk1qyE8qprewiwE
 Jx4tqX1QJ6hWT/7wZc1EP5riUbyXKYBT4Qq0tHE+eF40F+JUL/Fa2C2NVyjlcYuJ
 9rwS6mri22sMeEjup/Aqba7QJNeQRcmRlbKZdFVLuNwJj12XEALh02KxjVjKY0Ay
 N4HxIuM2c4Fab+9nQmv5R8gSYXsBUmCxIuWWbuvksH319KtxBckwPZnu8DDxEjMT
 nE7pc0EHRILywtQ1dMPvZTHu5Ecu8MZcyNRWLE9CYgmuxuzpm9a4RHD3s4TLa8Lp
 9buhoVcbEH1ZKhIhPfyhgtDiTrZgnO4wJ/GwEmZtsmooTXJZyyGNQSoYKs1v2BEs
 tW+0e78636X82yuJwvZv1LFTQPCIDdfYrVptE9lgqRzu+MB3GwU6iwq6z3N829Js
 yB6t11SCZCoH4rv7YnJyZ47fdTHcdjDR7372fSRkc2bxP7xJq+iSfZ/eeG7kety8
 9kPVP4kKbL6WgprToUGz
 =20Ps
 -----END PGP SIGNATURE-----

Merge tag 'iio-for-3.10b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-next

Jonathan writes:

	Second round of IIO cleanups for the 3.10 cycle

	1) A nice little removal of the unwanted private pointer from
	   struct iio_trigger.
	2) Some clean up of the ad799x driver.
	3) Couple of cleanups for the exynos_adc driver and some documentation.
	4) Move the mxs-lradc initialization a little earlier in the driver to avoid
	   wiping out the configuration just after setting it.

	A nice small set of worthy bits and bobs.
This commit is contained in:
Greg Kroah-Hartman 2013-03-29 08:37:58 -07:00
commit f7046bf085
23 changed files with 154 additions and 409 deletions

View File

@ -1,6 +1,6 @@
Samsung Exynos Analog to Digital Converter bindings
This devicetree binding are for the new adc driver written fori
The devicetree bindings are for the new ADC driver written for
Exynos4 and upward SoCs from Samsung.
New driver handles the following
@ -20,6 +20,9 @@ Required properties:
format is being dependent on which interrupt controller
the Samsung device uses.
- #io-channel-cells = <1>; As ADC has multiple outputs
- clocks From common clock binding: handle to adc clock.
- clock-names From common clock binding: Shall be "adc".
- vdd-supply VDD input supply.
Note: child nodes can be added for auto probing from device tree.
@ -31,6 +34,11 @@ adc: adc@12D10000 {
interrupts = <0 106 0>;
#io-channel-cells = <1>;
io-channel-ranges;
clocks = <&clock 303>;
clock-names = "adc";
vdd-supply = <&buck5_reg>;
};
@ -49,4 +57,4 @@ adc@12D10000 {
};
Note: Does not apply to ADC driver under arch/arm/plat-samsung/
Note: The child node can be added under the adc node or seperately.
Note: The child node can be added under the adc node or separately.

View File

@ -25,7 +25,7 @@
int st_accel_trig_set_state(struct iio_trigger *trig, bool state)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
return st_sensors_set_dataready_irq(indio_dev, state);
}

View File

@ -470,7 +470,7 @@ static int ad_sd_probe_trigger(struct iio_dev *indio_dev)
disable_irq_nosync(sigma_delta->spi->irq);
}
sigma_delta->trig->dev.parent = &sigma_delta->spi->dev;
sigma_delta->trig->private_data = sigma_delta;
iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
ret = iio_trigger_register(sigma_delta->trig);
if (ret)

View File

@ -188,7 +188,7 @@ static u8 at91_adc_get_trigger_value_by_name(struct iio_dev *idev,
static int at91_adc_configure_trigger(struct iio_trigger *trig, bool state)
{
struct iio_dev *idev = trig->private_data;
struct iio_dev *idev = iio_trigger_get_drvdata(trig);
struct at91_adc_state *st = iio_priv(idev);
struct iio_buffer *buffer = idev->buffer;
struct at91_adc_reg_desc *reg = st->registers;
@ -254,7 +254,7 @@ static struct iio_trigger *at91_adc_allocate_trigger(struct iio_dev *idev,
return NULL;
trig->dev.parent = idev->dev.parent;
trig->private_data = idev;
iio_trigger_set_drvdata(trig, idev);
trig->ops = &at91_adc_trigger_ops;
ret = iio_trigger_register(trig);

View File

@ -440,7 +440,7 @@ static struct platform_driver exynos_adc_driver = {
.driver = {
.name = "exynos-adc",
.owner = THIS_MODULE,
.of_match_table = of_match_ptr(exynos_adc_match),
.of_match_table = exynos_adc_match,
.pm = &exynos_adc_pm_ops,
},
};

View File

@ -31,7 +31,7 @@
static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
struct hid_sensor_common *st = trig->private_data;
struct hid_sensor_common *st = iio_trigger_get_drvdata(trig);
int state_val;
state_val = state ? 1 : 0;
@ -76,7 +76,7 @@ int hid_sensor_setup_trigger(struct iio_dev *indio_dev, const char *name,
}
trig->dev.parent = indio_dev->dev.parent;
trig->private_data = attrb;
iio_trigger_set_drvdata(trig, attrb);
trig->ops = &hid_sensor_trigger_ops;
ret = iio_trigger_register(trig);

View File

@ -40,7 +40,7 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,
if (err)
goto request_irq_error;
sdata->trig->private_data = indio_dev;
iio_trigger_set_drvdata(sdata->trig, indio_dev);
sdata->trig->ops = trigger_ops;
sdata->trig->dev.parent = sdata->dev;

View File

@ -81,7 +81,7 @@ void itg3200_buffer_unconfigure(struct iio_dev *indio_dev)
static int itg3200_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
int ret;
u8 msc;
@ -129,7 +129,7 @@ int itg3200_probe_trigger(struct iio_dev *indio_dev)
st->trig->dev.parent = &st->i2c->dev;
st->trig->ops = &itg3200_trigger_ops;
st->trig->private_data = indio_dev;
iio_trigger_set_drvdata(st->trig, indio_dev);
ret = iio_trigger_register(st->trig);
if (ret)
goto error_free_irq;

View File

@ -25,7 +25,7 @@
int st_gyro_trig_set_state(struct iio_trigger *trig, bool state)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
return st_sensors_set_dataready_irq(indio_dev, state);
}

View File

@ -19,7 +19,7 @@
static int adis_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
struct adis *adis = trig->private_data;
struct adis *adis = iio_trigger_get_drvdata(trig);
return adis_enable_irq(adis, state);
}
@ -57,7 +57,7 @@ int adis_probe_trigger(struct adis *adis, struct iio_dev *indio_dev)
adis->trig->dev.parent = &adis->spi->dev;
adis->trig->ops = &adis_trigger_ops;
adis->trig->private_data = adis;
iio_trigger_set_drvdata(adis->trig, adis);
ret = iio_trigger_register(adis->trig);
indio_dev->trig = adis->trig;

View File

@ -103,7 +103,7 @@ static int inv_mpu6050_set_enable(struct iio_dev *indio_dev, bool enable)
static int inv_mpu_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
return inv_mpu6050_set_enable(trig->private_data, state);
return inv_mpu6050_set_enable(iio_trigger_get_drvdata(trig), state);
}
static const struct iio_trigger_ops inv_mpu_trigger_ops = {
@ -130,8 +130,8 @@ int inv_mpu6050_probe_trigger(struct iio_dev *indio_dev)
if (ret)
goto error_free_trig;
st->trig->dev.parent = &st->client->dev;
st->trig->private_data = indio_dev;
st->trig->ops = &inv_mpu_trigger_ops;
iio_trigger_set_drvdata(st->trig, indio_dev);
ret = iio_trigger_register(st->trig);
if (ret)
goto error_free_irq;

View File

@ -10,9 +10,6 @@ struct iio_trig *trig = iio_trigger_alloc("<trigger format string>", ...);
allocates a trigger structure. The key elements to then fill in within
a driver are:
trig->private_data
Device specific private data.
trig->owner
Typically set to THIS_MODULE. Used to ensure correct
ownership of core allocated resources.

View File

@ -228,7 +228,7 @@ __lis3l02dq_write_data_ready_config(struct iio_dev *indio_dev, bool state)
static int lis3l02dq_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
int ret = 0;
u8 t;
@ -252,7 +252,7 @@ static int lis3l02dq_data_rdy_trigger_set_state(struct iio_trigger *trig,
*/
static int lis3l02dq_trig_try_reen(struct iio_trigger *trig)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
struct lis3l02dq_state *st = iio_priv(indio_dev);
int i;
@ -290,7 +290,7 @@ int lis3l02dq_probe_trigger(struct iio_dev *indio_dev)
st->trig->dev.parent = &st->us->dev;
st->trig->ops = &lis3l02dq_trigger_ops;
st->trig->private_data = indio_dev;
iio_trigger_set_drvdata(st->trig, indio_dev);
ret = iio_trigger_register(st->trig);
if (ret)
goto error_free_trig;

View File

@ -87,7 +87,6 @@ struct ad799x_state;
* struct ad799x_chip_info - chip specifc information
* @channel: channel specification
* @num_channels: number of channels
* @int_vref_mv: the internal reference voltage
* @monitor_mode: whether the chip supports monitor interrupts
* @default_config: device default configuration
* @event_attrs: pointer to the monitor event attribute group
@ -96,7 +95,6 @@ struct ad799x_state;
struct ad799x_chip_info {
struct iio_chan_spec channel[9];
int num_channels;
u16 int_vref_mv;
u16 default_config;
const struct iio_info *info;
};
@ -104,12 +102,13 @@ struct ad799x_chip_info {
struct ad799x_state {
struct i2c_client *client;
const struct ad799x_chip_info *chip_info;
struct iio_trigger *trig;
struct regulator *reg;
u16 int_vref_mv;
unsigned id;
char *name;
u16 config;
u8 *rx_buf;
unsigned int transfer_size;
};
/*

View File

@ -48,13 +48,13 @@ static int ad799x_i2c_read16(struct ad799x_state *st, u8 reg, u16 *data)
struct i2c_client *client = st->client;
int ret = 0;
ret = i2c_smbus_read_word_data(client, reg);
ret = i2c_smbus_read_word_swapped(client, reg);
if (ret < 0) {
dev_err(&client->dev, "I2C read error\n");
return ret;
}
*data = swab16((u16)ret);
*data = (u16)ret;
return 0;
}
@ -80,7 +80,7 @@ static int ad799x_i2c_write16(struct ad799x_state *st, u8 reg, u16 data)
struct i2c_client *client = st->client;
int ret = 0;
ret = i2c_smbus_write_word_data(client, reg, swab16(data));
ret = i2c_smbus_write_word_swapped(client, reg, data);
if (ret < 0)
dev_err(&client->dev, "I2C write error\n");
@ -104,6 +104,13 @@ static int ad7997_8_update_scan_mode(struct iio_dev *indio_dev,
{
struct ad799x_state *st = iio_priv(indio_dev);
kfree(st->rx_buf);
st->rx_buf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
if (!st->rx_buf)
return -ENOMEM;
st->transfer_size = bitmap_weight(scan_mask, indio_dev->masklength) * 2;
switch (st->id) {
case ad7997:
case ad7998:
@ -460,395 +467,114 @@ static const struct iio_info ad7993_4_7_8_info = {
#define AD799X_EV_MASK (IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING) | \
IIO_EV_BIT(IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING))
#define AD799X_CHANNEL(_index, _realbits, _evmask) { \
.type = IIO_VOLTAGE, \
.indexed = 1, \
.channel = (_index), \
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
.scan_index = (_index), \
.scan_type = IIO_ST('u', _realbits, 16, 12 - (_realbits)), \
.event_mask = (_evmask), \
}
static const struct ad799x_chip_info ad799x_chip_info_tbl[] = {
[ad7991] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[4] = IIO_CHAN_SOFT_TIMESTAMP(4),
AD799X_CHANNEL(0, 12, 0),
AD799X_CHANNEL(1, 12, 0),
AD799X_CHANNEL(2, 12, 0),
AD799X_CHANNEL(3, 12, 0),
IIO_CHAN_SOFT_TIMESTAMP(4),
},
.num_channels = 5,
.int_vref_mv = 4096,
.info = &ad7991_info,
},
[ad7995] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[4] = IIO_CHAN_SOFT_TIMESTAMP(4),
AD799X_CHANNEL(0, 10, 0),
AD799X_CHANNEL(1, 10, 0),
AD799X_CHANNEL(2, 10, 0),
AD799X_CHANNEL(3, 10, 0),
IIO_CHAN_SOFT_TIMESTAMP(4),
},
.num_channels = 5,
.int_vref_mv = 1024,
.info = &ad7991_info,
},
[ad7999] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 8, 16, 4),
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 8, 16, 4),
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 8, 16, 4),
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 8, 16, 4),
},
[4] = IIO_CHAN_SOFT_TIMESTAMP(4),
AD799X_CHANNEL(0, 8, 0),
AD799X_CHANNEL(1, 8, 0),
AD799X_CHANNEL(2, 8, 0),
AD799X_CHANNEL(3, 8, 0),
IIO_CHAN_SOFT_TIMESTAMP(4),
},
.num_channels = 5,
.int_vref_mv = 1024,
.info = &ad7991_info,
},
[ad7992] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[2] = IIO_CHAN_SOFT_TIMESTAMP(2),
AD799X_CHANNEL(0, 12, AD799X_EV_MASK),
AD799X_CHANNEL(1, 12, AD799X_EV_MASK),
IIO_CHAN_SOFT_TIMESTAMP(3),
},
.num_channels = 3,
.int_vref_mv = 4096,
.default_config = AD7998_ALERT_EN,
.info = &ad7992_info,
},
[ad7993] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.scan_index = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[4] = IIO_CHAN_SOFT_TIMESTAMP(4),
AD799X_CHANNEL(0, 10, AD799X_EV_MASK),
AD799X_CHANNEL(1, 10, AD799X_EV_MASK),
AD799X_CHANNEL(2, 10, AD799X_EV_MASK),
AD799X_CHANNEL(3, 10, AD799X_EV_MASK),
IIO_CHAN_SOFT_TIMESTAMP(4),
},
.num_channels = 5,
.int_vref_mv = 1024,
.default_config = AD7998_ALERT_EN,
.info = &ad7993_4_7_8_info,
},
[ad7994] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[4] = IIO_CHAN_SOFT_TIMESTAMP(4),
AD799X_CHANNEL(0, 12, AD799X_EV_MASK),
AD799X_CHANNEL(1, 12, AD799X_EV_MASK),
AD799X_CHANNEL(2, 12, AD799X_EV_MASK),
AD799X_CHANNEL(3, 12, AD799X_EV_MASK),
IIO_CHAN_SOFT_TIMESTAMP(4),
},
.num_channels = 5,
.int_vref_mv = 4096,
.default_config = AD7998_ALERT_EN,
.info = &ad7993_4_7_8_info,
},
[ad7997] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 10, 16, 2),
.event_mask = AD799X_EV_MASK,
},
[4] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 4,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 4,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[5] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 5,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 5,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[6] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 6,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 6,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[7] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 7,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 7,
.scan_type = IIO_ST('u', 10, 16, 2),
},
[8] = IIO_CHAN_SOFT_TIMESTAMP(8),
AD799X_CHANNEL(0, 10, AD799X_EV_MASK),
AD799X_CHANNEL(1, 10, AD799X_EV_MASK),
AD799X_CHANNEL(2, 10, AD799X_EV_MASK),
AD799X_CHANNEL(3, 10, AD799X_EV_MASK),
AD799X_CHANNEL(4, 10, 0),
AD799X_CHANNEL(5, 10, 0),
AD799X_CHANNEL(6, 10, 0),
AD799X_CHANNEL(7, 10, 0),
IIO_CHAN_SOFT_TIMESTAMP(8),
},
.num_channels = 9,
.int_vref_mv = 1024,
.default_config = AD7998_ALERT_EN,
.info = &ad7993_4_7_8_info,
},
[ad7998] = {
.channel = {
[0] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 0,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[1] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 1,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[2] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 2,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 2,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[3] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 3,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 3,
.scan_type = IIO_ST('u', 12, 16, 0),
.event_mask = AD799X_EV_MASK,
},
[4] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 4,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 4,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[5] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 5,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 5,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[6] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 6,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 6,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[7] = {
.type = IIO_VOLTAGE,
.indexed = 1,
.channel = 7,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.scan_index = 7,
.scan_type = IIO_ST('u', 12, 16, 0),
},
[8] = IIO_CHAN_SOFT_TIMESTAMP(8),
AD799X_CHANNEL(0, 12, AD799X_EV_MASK),
AD799X_CHANNEL(1, 12, AD799X_EV_MASK),
AD799X_CHANNEL(2, 12, AD799X_EV_MASK),
AD799X_CHANNEL(3, 12, AD799X_EV_MASK),
AD799X_CHANNEL(4, 12, 0),
AD799X_CHANNEL(5, 12, 0),
AD799X_CHANNEL(6, 12, 0),
AD799X_CHANNEL(7, 12, 0),
IIO_CHAN_SOFT_TIMESTAMP(8),
},
.num_channels = 9,
.int_vref_mv = 4096,
.default_config = AD7998_ALERT_EN,
.info = &ad7993_4_7_8_info,
},
@ -875,10 +601,10 @@ static int ad799x_probe(struct i2c_client *client,
/* TODO: Add pdata options for filtering and bit delay */
if (pdata)
st->int_vref_mv = pdata->vref_mv;
else
st->int_vref_mv = st->chip_info->int_vref_mv;
if (!pdata)
return -EINVAL;
st->int_vref_mv = pdata->vref_mv;
st->reg = regulator_get(&client->dev, "vcc");
if (!IS_ERR(st->reg)) {
@ -946,6 +672,7 @@ static int ad799x_remove(struct i2c_client *client)
regulator_disable(st->reg);
regulator_put(st->reg);
}
kfree(st->rx_buf);
iio_device_free(indio_dev);
return 0;

View File

@ -36,14 +36,9 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
struct iio_dev *indio_dev = pf->indio_dev;
struct ad799x_state *st = iio_priv(indio_dev);
s64 time_ns;
__u8 *rxbuf;
int b_sent;
u8 cmd;
rxbuf = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
if (rxbuf == NULL)
goto out;
switch (st->id) {
case ad7991:
case ad7995:
@ -66,20 +61,17 @@ static irqreturn_t ad799x_trigger_handler(int irq, void *p)
}
b_sent = i2c_smbus_read_i2c_block_data(st->client,
cmd, bitmap_weight(indio_dev->active_scan_mask,
indio_dev->masklength) * 2, rxbuf);
cmd, st->transfer_size, st->rx_buf);
if (b_sent < 0)
goto done;
goto out;
time_ns = iio_get_time_ns();
if (indio_dev->scan_timestamp)
memcpy(rxbuf + indio_dev->scan_bytes - sizeof(s64),
memcpy(st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns));
iio_push_to_buffers(indio_dev, rxbuf);
done:
kfree(rxbuf);
iio_push_to_buffers(indio_dev, st->rx_buf);
out:
iio_trigger_notify_done(indio_dev->trig);

View File

@ -646,7 +646,7 @@ static irqreturn_t mxs_lradc_trigger_handler(int irq, void *p)
static int mxs_lradc_configure_trigger(struct iio_trigger *trig, bool state)
{
struct iio_dev *iio = trig->private_data;
struct iio_dev *iio = iio_trigger_get_drvdata(trig);
struct mxs_lradc *lradc = iio_priv(iio);
const uint32_t st = state ? STMP_OFFSET_REG_SET : STMP_OFFSET_REG_CLR;
@ -670,7 +670,7 @@ static int mxs_lradc_trigger_init(struct iio_dev *iio)
return -ENOMEM;
trig->dev.parent = iio->dev.parent;
trig->private_data = iio;
iio_trigger_set_drvdata(trig, iio);
trig->ops = &mxs_lradc_trigger_ops;
ret = iio_trigger_register(trig);
@ -983,6 +983,9 @@ static int mxs_lradc_probe(struct platform_device *pdev)
if (ret)
goto err_trig;
/* Configure the hardware. */
mxs_lradc_hw_init(lradc);
/* Register the touchscreen input device. */
ret = mxs_lradc_ts_register(lradc);
if (ret)
@ -995,9 +998,6 @@ static int mxs_lradc_probe(struct platform_device *pdev)
goto err_ts;
}
/* Configure the hardware. */
mxs_lradc_hw_init(lradc);
return 0;
err_ts:

View File

@ -32,7 +32,7 @@ static irqreturn_t ade7758_data_rdy_trig_poll(int irq, void *private)
static int ade7758_data_rdy_trigger_set_state(struct iio_trigger *trig,
bool state)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
dev_dbg(&indio_dev->dev, "%s (%d)\n", __func__, state);
return ade7758_set_irq(&indio_dev->dev, state);
@ -44,7 +44,7 @@ static int ade7758_data_rdy_trigger_set_state(struct iio_trigger *trig,
**/
static int ade7758_trig_try_reen(struct iio_trigger *trig)
{
struct iio_dev *indio_dev = trig->private_data;
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
struct ade7758_state *st = iio_priv(indio_dev);
enable_irq(st->us->irq);
@ -81,7 +81,7 @@ int ade7758_probe_trigger(struct iio_dev *indio_dev)
st->trig->dev.parent = &st->us->dev;
st->trig->ops = &ade7758_trigger_ops;
st->trig->private_data = indio_dev;
iio_trigger_set_drvdata(st->trig, indio_dev);
ret = iio_trigger_register(st->trig);
/* select default trigger */

View File

@ -65,7 +65,7 @@ struct bfin_tmr_state {
static int iio_bfin_tmr_set_state(struct iio_trigger *trig, bool state)
{
struct bfin_tmr_state *st = trig->private_data;
struct bfin_tmr_state *st = iio_trigger_get_drvdata(trig);
if (get_gptimer_period(st->t->id) == 0)
return -EINVAL;
@ -82,7 +82,7 @@ static ssize_t iio_bfin_tmr_frequency_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct iio_trigger *trig = to_iio_trigger(dev);
struct bfin_tmr_state *st = trig->private_data;
struct bfin_tmr_state *st = iio_trigger_get_drvdata(trig);
unsigned long val;
bool enabled;
int ret;
@ -125,7 +125,7 @@ static ssize_t iio_bfin_tmr_frequency_show(struct device *dev,
char *buf)
{
struct iio_trigger *trig = to_iio_trigger(dev);
struct bfin_tmr_state *st = trig->private_data;
struct bfin_tmr_state *st = iio_trigger_get_drvdata(trig);
unsigned int period = get_gptimer_period(st->t->id);
unsigned long val;
@ -213,9 +213,9 @@ static int iio_bfin_tmr_trigger_probe(struct platform_device *pdev)
goto out1;
}
st->trig->private_data = st;
st->trig->ops = &iio_bfin_tmr_trigger_ops;
st->trig->dev.groups = iio_bfin_tmr_trigger_attr_groups;
iio_trigger_set_drvdata(st->trig, st);
ret = iio_trigger_register(st->trig);
if (ret)
goto out2;

View File

@ -83,7 +83,7 @@ static int iio_gpio_trigger_probe(struct platform_device *pdev)
ret = -ENOMEM;
goto error_put_trigger;
}
trig->private_data = trig_info;
iio_trigger_set_drvdata(trig, trig_info);
trig_info->irq = irq;
trig->ops = &iio_gpio_trigger_ops;
ret = request_irq(irq, iio_gpio_trigger_poll,
@ -121,7 +121,7 @@ static int iio_gpio_trigger_probe(struct platform_device *pdev)
trig2,
&iio_gpio_trigger_list,
alloc_list) {
trig_info = trig->private_data;
trig_info = iio_trigger_get_drvdata(trig);
free_irq(gpio_to_irq(trig_info->irq), trig);
kfree(trig_info);
iio_trigger_unregister(trig);
@ -140,7 +140,7 @@ static int iio_gpio_trigger_remove(struct platform_device *pdev)
trig2,
&iio_gpio_trigger_list,
alloc_list) {
trig_info = trig->private_data;
trig_info = iio_trigger_get_drvdata(trig);
iio_trigger_unregister(trig);
free_irq(trig_info->irq, trig);
kfree(trig_info);

View File

@ -30,7 +30,7 @@ struct iio_prtc_trigger_info {
static int iio_trig_periodic_rtc_set_state(struct iio_trigger *trig, bool state)
{
struct iio_prtc_trigger_info *trig_info = trig->private_data;
struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig);
if (trig_info->frequency == 0)
return -EINVAL;
printk(KERN_INFO "trigger frequency is %d\n", trig_info->frequency);
@ -42,7 +42,7 @@ static ssize_t iio_trig_periodic_read_freq(struct device *dev,
char *buf)
{
struct iio_trigger *trig = to_iio_trigger(dev);
struct iio_prtc_trigger_info *trig_info = trig->private_data;
struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig);
return sprintf(buf, "%u\n", trig_info->frequency);
}
@ -52,7 +52,7 @@ static ssize_t iio_trig_periodic_write_freq(struct device *dev,
size_t len)
{
struct iio_trigger *trig = to_iio_trigger(dev);
struct iio_prtc_trigger_info *trig_info = trig->private_data;
struct iio_prtc_trigger_info *trig_info = iio_trigger_get_drvdata(trig);
unsigned long val;
int ret;
@ -124,7 +124,7 @@ static int iio_trig_periodic_rtc_probe(struct platform_device *dev)
ret = -ENOMEM;
goto error_put_trigger_and_remove_from_list;
}
trig->private_data = trig_info;
iio_trigger_set_drvdata(trig, trig_info);
trig->ops = &iio_prtc_trigger_ops;
/* RTC access */
trig_info->rtc
@ -158,7 +158,7 @@ static int iio_trig_periodic_rtc_probe(struct platform_device *dev)
trig2,
&iio_prtc_trigger_list,
alloc_list) {
trig_info = trig->private_data;
trig_info = iio_trigger_get_drvdata(trig);
rtc_irq_unregister(trig_info->rtc, &trig_info->task);
rtc_class_close(trig_info->rtc);
kfree(trig_info);
@ -176,7 +176,7 @@ static int iio_trig_periodic_rtc_remove(struct platform_device *dev)
trig2,
&iio_prtc_trigger_list,
alloc_list) {
trig_info = trig->private_data;
trig_info = iio_trigger_get_drvdata(trig);
rtc_irq_unregister(trig_info->rtc, &trig_info->task);
rtc_class_close(trig_info->rtc);
kfree(trig_info);

View File

@ -103,7 +103,7 @@ static ssize_t iio_sysfs_trigger_poll(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct iio_trigger *trig = to_iio_trigger(dev);
struct iio_sysfs_trig *sysfs_trig = trig->private_data;
struct iio_sysfs_trig *sysfs_trig = iio_trigger_get_drvdata(trig);
irq_work_queue(&sysfs_trig->work);
@ -160,7 +160,7 @@ static int iio_sysfs_trigger_probe(int id)
t->trig->dev.groups = iio_sysfs_trigger_attr_groups;
t->trig->ops = &iio_sysfs_trigger_ops;
t->trig->dev.parent = &iio_sysfs_trig_dev;
t->trig->private_data = t;
iio_trigger_set_drvdata(t->trig, t);
init_irq_work(&t->work, iio_sysfs_trigger_work);

View File

@ -44,7 +44,6 @@ struct iio_trigger_ops {
* @id: [INTERN] unique id number
* @name: [DRIVER] unique name
* @dev: [DRIVER] associated device (if relevant)
* @private_data: [DRIVER] device specific data
* @list: [INTERN] used in maintenance of global trigger list
* @alloc_list: [DRIVER] used for driver specific trigger list
* @use_count: use count for the trigger
@ -60,7 +59,6 @@ struct iio_trigger {
const char *name;
struct device dev;
void *private_data;
struct list_head list;
struct list_head alloc_list;
int use_count;
@ -91,6 +89,30 @@ static inline void iio_trigger_get(struct iio_trigger *trig)
__module_get(trig->ops->owner);
}
/**
* iio_device_set_drvdata() - Set trigger driver data
* @trig: IIO trigger structure
* @data: Driver specific data
*
* Allows to attach an arbitrary pointer to an IIO trigger, which can later be
* retrieved by iio_trigger_get_drvdata().
*/
static inline void iio_trigger_set_drvdata(struct iio_trigger *trig, void *data)
{
dev_set_drvdata(&trig->dev, data);
}
/**
* iio_trigger_get_drvdata() - Get trigger driver data
* @trig: IIO trigger structure
*
* Returns the data previously set with iio_trigger_set_drvdata()
*/
static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig)
{
return dev_get_drvdata(&trig->dev);
}
/**
* iio_trigger_register() - register a trigger with the IIO core
* @trig_info: trigger to be registered