summaryrefslogtreecommitdiff
path: root/drivers/staging/iio
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/iio')
-rw-r--r--drivers/staging/iio/adc/ad7192.c2
-rw-r--r--drivers/staging/iio/adc/ad7280a.c2
-rw-r--r--drivers/staging/iio/adc/ad7291.c217
-rw-r--r--drivers/staging/iio/adc/ad7291.h12
-rw-r--r--drivers/staging/iio/adc/ad7606_core.c12
-rw-r--r--drivers/staging/iio/adc/ad7606_par.c2
-rw-r--r--drivers/staging/iio/adc/ad7816.c8
-rw-r--r--drivers/staging/iio/adc/ad799x_core.c4
-rw-r--r--drivers/staging/iio/adc/lpc32xx_adc.c1
-rw-r--r--drivers/staging/iio/adc/mxs-lradc.c8
-rw-r--r--drivers/staging/iio/adc/spear_adc.c3
-rw-r--r--drivers/staging/iio/gyro/Kconfig7
-rw-r--r--drivers/staging/iio/gyro/Makefile3
-rw-r--r--drivers/staging/iio/gyro/adis16130_core.c178
-rw-r--r--drivers/staging/iio/trigger/Kconfig17
-rw-r--r--drivers/staging/iio/trigger/Makefile2
-rw-r--r--drivers/staging/iio/trigger/iio-trig-gpio.c167
-rw-r--r--drivers/staging/iio/trigger/iio-trig-sysfs.c227
18 files changed, 111 insertions, 761 deletions
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c
index 5047019..3283e28 100644
--- a/drivers/staging/iio/adc/ad7192.c
+++ b/drivers/staging/iio/adc/ad7192.c
@@ -326,7 +326,7 @@ static ssize_t ad7192_write_frequency(struct device *dev,
unsigned long lval;
int div, ret;
- ret = strict_strtoul(buf, 10, &lval);
+ ret = kstrtoul(buf, 10, &lval);
if (ret)
return ret;
if (lval == 0)
diff --git a/drivers/staging/iio/adc/ad7280a.c b/drivers/staging/iio/adc/ad7280a.c
index 2fd6ee3..c19618b 100644
--- a/drivers/staging/iio/adc/ad7280a.c
+++ b/drivers/staging/iio/adc/ad7280a.c
@@ -632,7 +632,7 @@ static ssize_t ad7280_write_channel_config(struct device *dev,
long val;
int ret;
- ret = strict_strtol(buf, 10, &val);
+ ret = kstrtol(buf, 10, &val);
if (ret)
return ret;
diff --git a/drivers/staging/iio/adc/ad7291.c b/drivers/staging/iio/adc/ad7291.c
index d088c66..3fc79e5 100644
--- a/drivers/staging/iio/adc/ad7291.c
+++ b/drivers/staging/iio/adc/ad7291.c
@@ -21,6 +21,8 @@
#include <linux/iio/sysfs.h>
#include <linux/iio/events.h>
+#include "ad7291.h"
+
/*
* Simplified handling
*
@@ -39,33 +41,9 @@
#define AD7291_VOLTAGE 0x01
#define AD7291_T_SENSE 0x02
#define AD7291_T_AVERAGE 0x03
-#define AD7291_CH0_DATA_HIGH 0x04
-#define AD7291_CH0_DATA_LOW 0x05
-#define AD7291_CH0_HYST 0x06
-#define AD7291_CH1_DATA_HIGH 0x07
-#define AD7291_CH1_DATA_LOW 0x08
-#define AD7291_CH1_HYST 0x09
-#define AD7291_CH2_DATA_HIGH 0x0A
-#define AD7291_CH2_DATA_LOW 0x0B
-#define AD7291_CH2_HYST 0x0C
-#define AD7291_CH3_DATA_HIGH 0x0D
-#define AD7291_CH3_DATA_LOW 0x0E
-#define AD7291_CH3_HYST 0x0F
-#define AD7291_CH4_DATA_HIGH 0x10
-#define AD7291_CH4_DATA_LOW 0x11
-#define AD7291_CH4_HYST 0x12
-#define AD7291_CH5_DATA_HIGH 0x13
-#define AD7291_CH5_DATA_LOW 0x14
-#define AD7291_CH5_HYST 0x15
-#define AD7291_CH6_DATA_HIGH 0x16
-#define AD7291_CH6_DATA_LOW 0x17
-#define AD7291_CH6_HYST 0x18
-#define AD7291_CH7_DATA_HIGH 0x19
-#define AD7291_CH7_DATA_LOW 0x1A
-#define AD7291_CH7_HYST 0x2B
-#define AD7291_T_SENSE_HIGH 0x1C
-#define AD7291_T_SENSE_LOW 0x1D
-#define AD7291_T_SENSE_HYST 0x1E
+#define AD7291_DATA_HIGH(x) ((x) * 3 + 0x4)
+#define AD7291_DATA_LOW(x) ((x) * 3 + 0x5)
+#define AD7291_HYST(x) ((x) * 3 + 0x6)
#define AD7291_VOLTAGE_ALERT_STATUS 0x1F
#define AD7291_T_ALERT_STATUS 0x20
@@ -100,7 +78,6 @@
struct ad7291_chip_info {
struct i2c_client *client;
struct regulator *reg;
- u16 int_vref_mv;
u16 command;
u16 c_mask; /* Active voltage channels for events */
struct mutex state_lock;
@@ -111,45 +88,22 @@ static int ad7291_i2c_read(struct ad7291_chip_info *chip, u8 reg, u16 *data)
struct i2c_client *client = chip->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 = ret;
return 0;
}
static int ad7291_i2c_write(struct ad7291_chip_info *chip, u8 reg, u16 data)
{
- return i2c_smbus_write_word_data(chip->client, reg, swab16(data));
-}
-
-static ssize_t ad7291_store_reset(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct ad7291_chip_info *chip = iio_priv(indio_dev);
-
- return ad7291_i2c_write(chip, AD7291_COMMAND,
- chip->command | AD7291_RESET);
+ return i2c_smbus_write_word_swapped(chip->client, reg, data);
}
-static IIO_DEVICE_ATTR(reset, S_IWUSR, NULL, ad7291_store_reset, 0);
-
-static struct attribute *ad7291_attributes[] = {
- &iio_dev_attr_reset.dev_attr.attr,
- NULL,
-};
-
-static const struct attribute_group ad7291_attribute_group = {
- .attrs = ad7291_attributes,
-};
-
static irqreturn_t ad7291_event_handler(int irq, void *private)
{
struct iio_dev *indio_dev = private;
@@ -255,31 +209,31 @@ static inline ssize_t ad7291_set_hyst(struct device *dev,
static IIO_DEVICE_ATTR(in_temp0_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
ad7291_show_hyst, ad7291_set_hyst,
- AD7291_T_SENSE_HYST);
+ AD7291_HYST(8));
static IIO_DEVICE_ATTR(in_voltage0_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH0_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(0));
static IIO_DEVICE_ATTR(in_voltage1_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH1_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(1));
static IIO_DEVICE_ATTR(in_voltage2_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH2_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(2));
static IIO_DEVICE_ATTR(in_voltage3_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH3_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(3));
static IIO_DEVICE_ATTR(in_voltage4_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH4_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(4));
static IIO_DEVICE_ATTR(in_voltage5_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH5_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(5));
static IIO_DEVICE_ATTR(in_voltage6_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH6_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(6));
static IIO_DEVICE_ATTR(in_voltage7_thresh_both_hyst_raw,
S_IRUGO | S_IWUSR,
- ad7291_show_hyst, ad7291_set_hyst, AD7291_CH7_HYST);
+ ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(7));
static struct attribute *ad7291_event_attributes[] = {
&iio_dev_attr_in_temp0_thresh_both_hyst_raw.dev_attr.attr,
@@ -294,53 +248,45 @@ static struct attribute *ad7291_event_attributes[] = {
NULL,
};
-/* high / low */
-static u8 ad7291_limit_regs[9][2] = {
- { AD7291_CH0_DATA_HIGH, AD7291_CH0_DATA_LOW },
- { AD7291_CH1_DATA_HIGH, AD7291_CH1_DATA_LOW },
- { AD7291_CH2_DATA_HIGH, AD7291_CH2_DATA_LOW },
- { AD7291_CH3_DATA_HIGH, AD7291_CH3_DATA_LOW }, /* FIXME: ? */
- { AD7291_CH4_DATA_HIGH, AD7291_CH4_DATA_LOW },
- { AD7291_CH5_DATA_HIGH, AD7291_CH5_DATA_LOW },
- { AD7291_CH6_DATA_HIGH, AD7291_CH6_DATA_LOW },
- { AD7291_CH7_DATA_HIGH, AD7291_CH7_DATA_LOW },
- /* temp */
- { AD7291_T_SENSE_HIGH, AD7291_T_SENSE_LOW },
-};
+static unsigned int ad7291_threshold_reg(u64 event_code)
+{
+ unsigned int offset;
+
+ switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
+ case IIO_VOLTAGE:
+ offset = IIO_EVENT_CODE_EXTRACT_CHAN(event_code);
+ break;
+ case IIO_TEMP:
+ offset = 8;
+ break;
+ default:
+ return 0;
+ }
+
+ if (IIO_EVENT_CODE_EXTRACT_DIR(event_code) == IIO_EV_DIR_FALLING)
+ return AD7291_DATA_LOW(offset);
+ else
+ return AD7291_DATA_HIGH(offset);
+}
static int ad7291_read_event_value(struct iio_dev *indio_dev,
u64 event_code,
int *val)
{
struct ad7291_chip_info *chip = iio_priv(indio_dev);
-
int ret;
- u8 reg;
u16 uval;
- s16 signval;
+
+ ret = ad7291_i2c_read(chip, ad7291_threshold_reg(event_code), &uval);
+ if (ret < 0)
+ return ret;
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
case IIO_VOLTAGE:
- reg = ad7291_limit_regs[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)]
- [!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
- IIO_EV_DIR_RISING)];
-
- ret = ad7291_i2c_read(chip, reg, &uval);
- if (ret < 0)
- return ret;
*val = uval & AD7291_VALUE_MASK;
return 0;
-
case IIO_TEMP:
- reg = ad7291_limit_regs[8]
- [!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
- IIO_EV_DIR_RISING)];
-
- ret = ad7291_i2c_read(chip, reg, &signval);
- if (ret < 0)
- return ret;
- signval = (s16)((signval & AD7291_VALUE_MASK) << 4) >> 4;
- *val = signval;
+ *val = sign_extend32(uval, 11);
return 0;
default:
return -EINVAL;
@@ -352,28 +298,21 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev,
int val)
{
struct ad7291_chip_info *chip = iio_priv(indio_dev);
- u8 reg;
- s16 signval;
switch (IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(event_code)) {
case IIO_VOLTAGE:
if (val > AD7291_VALUE_MASK || val < 0)
return -EINVAL;
- reg = ad7291_limit_regs[IIO_EVENT_CODE_EXTRACT_CHAN(event_code)]
- [!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
- IIO_EV_DIR_RISING)];
- return ad7291_i2c_write(chip, reg, val);
+ break;
case IIO_TEMP:
if (val > 2047 || val < -2048)
return -EINVAL;
- reg = ad7291_limit_regs[8]
- [!(IIO_EVENT_CODE_EXTRACT_DIR(event_code) ==
- IIO_EV_DIR_RISING)];
- signval = val;
- return ad7291_i2c_write(chip, reg, *(u16 *)&signval);
+ break;
default:
return -EINVAL;
- };
+ }
+
+ return ad7291_i2c_write(chip, ad7291_threshold_reg(event_code), val);
}
static int ad7291_read_event_config(struct iio_dev *indio_dev,
@@ -456,9 +395,7 @@ static int ad7291_read_raw(struct iio_dev *indio_dev,
{
int ret;
struct ad7291_chip_info *chip = iio_priv(indio_dev);
- unsigned int scale_uv;
u16 regval;
- s16 signval;
switch (mask) {
case IIO_CHAN_INFO_RAW:
@@ -479,44 +416,47 @@ static int ad7291_read_raw(struct iio_dev *indio_dev,
return ret;
}
/* Read voltage */
- ret = i2c_smbus_read_word_data(chip->client,
+ ret = i2c_smbus_read_word_swapped(chip->client,
AD7291_VOLTAGE);
if (ret < 0) {
mutex_unlock(&chip->state_lock);
return ret;
}
- *val = swab16((u16)ret) & AD7291_VALUE_MASK;
+ *val = ret & AD7291_VALUE_MASK;
mutex_unlock(&chip->state_lock);
return IIO_VAL_INT;
case IIO_TEMP:
/* Assumes tsense bit of command register always set */
- ret = i2c_smbus_read_word_data(chip->client,
+ ret = i2c_smbus_read_word_swapped(chip->client,
AD7291_T_SENSE);
if (ret < 0)
return ret;
- signval = (s16)((swab16((u16)ret) &
- AD7291_VALUE_MASK) << 4) >> 4;
- *val = signval;
+ *val = sign_extend32(ret, 11);
return IIO_VAL_INT;
default:
return -EINVAL;
}
case IIO_CHAN_INFO_AVERAGE_RAW:
- ret = i2c_smbus_read_word_data(chip->client,
+ ret = i2c_smbus_read_word_swapped(chip->client,
AD7291_T_AVERAGE);
if (ret < 0)
return ret;
- signval = (s16)((swab16((u16)ret) &
- AD7291_VALUE_MASK) << 4) >> 4;
- *val = signval;
+ *val = sign_extend32(ret, 11);
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
switch (chan->type) {
case IIO_VOLTAGE:
- scale_uv = (chip->int_vref_mv * 1000) >> AD7291_BITS;
- *val = scale_uv / 1000;
- *val2 = (scale_uv % 1000) * 1000;
- return IIO_VAL_INT_PLUS_MICRO;
+ if (chip->reg) {
+ int vref;
+ vref = regulator_get_voltage(chip->reg);
+ if (vref < 0)
+ return vref;
+ *val = vref / 1000;
+ } else {
+ *val = 2500;
+ }
+ *val2 = AD7291_BITS;
+ return IIO_VAL_FRACTIONAL_LOG2;
case IIO_TEMP:
/*
* One LSB of the ADC corresponds to 0.25 deg C.
@@ -571,7 +511,6 @@ static struct attribute_group ad7291_event_attribute_group = {
};
static const struct iio_info ad7291_info = {
- .attrs = &ad7291_attribute_group,
.read_raw = &ad7291_read_raw,
.read_event_config = &ad7291_read_event_config,
.write_event_config = &ad7291_write_event_config,
@@ -583,9 +522,10 @@ static const struct iio_info ad7291_info = {
static int ad7291_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
+ struct ad7291_platform_data *pdata = client->dev.platform_data;
struct ad7291_chip_info *chip;
struct iio_dev *indio_dev;
- int ret = 0, voltage_uv = 0;
+ int ret = 0;
indio_dev = iio_device_alloc(sizeof(*chip));
if (indio_dev == NULL) {
@@ -594,12 +534,14 @@ static int ad7291_probe(struct i2c_client *client,
}
chip = iio_priv(indio_dev);
- chip->reg = regulator_get(&client->dev, "vcc");
- if (!IS_ERR(chip->reg)) {
+ if (pdata && pdata->use_external_ref) {
+ chip->reg = regulator_get(&client->dev, "vref");
+ if (IS_ERR(chip->reg))
+ goto error_free;
+
ret = regulator_enable(chip->reg);
if (ret)
goto error_put_reg;
- voltage_uv = regulator_get_voltage(chip->reg);
}
mutex_init(&chip->state_lock);
@@ -612,12 +554,8 @@ static int ad7291_probe(struct i2c_client *client,
AD7291_T_SENSE_MASK | /* Tsense always enabled */
AD7291_ALERT_POLARITY; /* set irq polarity low level */
- if (voltage_uv) {
- chip->int_vref_mv = voltage_uv / 1000;
+ if (pdata && pdata->use_external_ref)
chip->command |= AD7291_EXT_REF;
- } else {
- chip->int_vref_mv = 2500; /* Build-in ref */
- }
indio_dev->name = id->name;
indio_dev->channels = ad7291_channels;
@@ -654,21 +592,18 @@ static int ad7291_probe(struct i2c_client *client,
if (ret)
goto error_unreg_irq;
- dev_info(&client->dev, "%s ADC registered.\n",
- id->name);
-
return 0;
error_unreg_irq:
if (client->irq)
free_irq(client->irq, indio_dev);
error_disable_reg:
- if (!IS_ERR(chip->reg))
+ if (chip->reg)
regulator_disable(chip->reg);
error_put_reg:
- if (!IS_ERR(chip->reg))
+ if (chip->reg)
regulator_put(chip->reg);
-
+error_free:
iio_device_free(indio_dev);
error_ret:
return ret;
@@ -684,7 +619,7 @@ static int ad7291_remove(struct i2c_client *client)
if (client->irq)
free_irq(client->irq, indio_dev);
- if (!IS_ERR(chip->reg)) {
+ if (chip->reg) {
regulator_disable(chip->reg);
regulator_put(chip->reg);
}
diff --git a/drivers/staging/iio/adc/ad7291.h b/drivers/staging/iio/adc/ad7291.h
new file mode 100644
index 0000000..bbd89fa
--- /dev/null
+++ b/drivers/staging/iio/adc/ad7291.h
@@ -0,0 +1,12 @@
+#ifndef __IIO_AD7291_H__
+#define __IIO_AD7291_H__
+
+/**
+ * struct ad7291_platform_data - AD7291 platform data
+ * @use_external_ref: Whether to use an external or internal reference voltage
+ */
+struct ad7291_platform_data {
+ bool use_external_ref;
+};
+
+#endif
diff --git a/drivers/staging/iio/adc/ad7606_core.c b/drivers/staging/iio/adc/ad7606_core.c
index d104b43..72868ce 100644
--- a/drivers/staging/iio/adc/ad7606_core.c
+++ b/drivers/staging/iio/adc/ad7606_core.c
@@ -125,9 +125,12 @@ static ssize_t ad7606_store_range(struct device *dev,
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ad7606_state *st = iio_priv(indio_dev);
unsigned long lval;
+ int ret;
+
+ ret = kstrtoul(buf, 10, &lval);
+ if (ret)
+ return ret;
- if (strict_strtoul(buf, 10, &lval))
- return -EINVAL;
if (!(lval == 5000 || lval == 10000)) {
dev_err(dev, "range is not supported\n");
return -EINVAL;
@@ -173,8 +176,9 @@ static ssize_t ad7606_store_oversampling_ratio(struct device *dev,
unsigned long lval;
int ret;
- if (strict_strtoul(buf, 10, &lval))
- return -EINVAL;
+ ret = kstrtoul(buf, 10, &lval);
+ if (ret)
+ return ret;
ret = ad7606_oversampling_get_index(lval);
if (ret < 0) {
diff --git a/drivers/staging/iio/adc/ad7606_par.c b/drivers/staging/iio/adc/ad7606_par.c
index 58cfdde..8a48d18 100644
--- a/drivers/staging/iio/adc/ad7606_par.c
+++ b/drivers/staging/iio/adc/ad7606_par.c
@@ -112,8 +112,6 @@ static int ad7606_par_remove(struct platform_device *pdev)
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(res->start, resource_size(res));
- platform_set_drvdata(pdev, NULL);
-
return 0;
}
diff --git a/drivers/staging/iio/adc/ad7816.c b/drivers/staging/iio/adc/ad7816.c
index 9284771..8470036 100644
--- a/drivers/staging/iio/adc/ad7816.c
+++ b/drivers/staging/iio/adc/ad7816.c
@@ -175,9 +175,9 @@ static ssize_t ad7816_store_channel(struct device *dev,
unsigned long data;
int ret;
- ret = strict_strtoul(buf, 10, &data);
+ ret = kstrtoul(buf, 10, &data);
if (ret)
- return -EINVAL;
+ return ret;
if (data > AD7816_CS_MAX && data != AD7816_CS_MASK) {
dev_err(&chip->spi_dev->dev, "Invalid channel id %lu for %s.\n",
@@ -290,7 +290,9 @@ static inline ssize_t ad7816_set_oti(struct device *dev,
u8 data;
int ret;
- ret = strict_strtol(buf, 10, &value);
+ ret = kstrtol(buf, 10, &value);
+ if (ret)
+ return ret;
if (chip->channel_id > AD7816_CS_MAX) {
dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
diff --git a/drivers/staging/iio/adc/ad799x_core.c b/drivers/staging/iio/adc/ad799x_core.c
index 8dc97b3..2b2049c 100644
--- a/drivers/staging/iio/adc/ad799x_core.c
+++ b/drivers/staging/iio/adc/ad799x_core.c
@@ -226,7 +226,7 @@ static ssize_t ad799x_write_frequency(struct device *dev,
int ret, i;
u8 t;
- ret = strict_strtol(buf, 10, &val);
+ ret = kstrtol(buf, 10, &val);
if (ret)
return ret;
@@ -337,7 +337,7 @@ static ssize_t ad799x_write_channel_config(struct device *dev,
long val;
int ret;
- ret = strict_strtol(buf, 10, &val);
+ ret = kstrtol(buf, 10, &val);
if (ret)
return ret;
diff --git a/drivers/staging/iio/adc/lpc32xx_adc.c b/drivers/staging/iio/adc/lpc32xx_adc.c
index 2f2f7fd..9a4bb09 100644
--- a/drivers/staging/iio/adc/lpc32xx_adc.c
+++ b/drivers/staging/iio/adc/lpc32xx_adc.c
@@ -215,7 +215,6 @@ static int lpc32xx_adc_remove(struct platform_device *pdev)
iio_device_unregister(iodev);
free_irq(irq, info);
- platform_set_drvdata(pdev, NULL);
clk_put(info->clk);
iounmap(info->adc_base);
iio_device_free(iodev);
diff --git a/drivers/staging/iio/adc/mxs-lradc.c b/drivers/staging/iio/adc/mxs-lradc.c
index 163c638..d92c97a 100644
--- a/drivers/staging/iio/adc/mxs-lradc.c
+++ b/drivers/staging/iio/adc/mxs-lradc.c
@@ -620,7 +620,7 @@ static irqreturn_t mxs_lradc_trigger_handler(int irq, void *p)
((LRADC_DELAY_TIMER_LOOP - 1) << LRADC_CH_NUM_SAMPLES_OFFSET);
unsigned int i, j = 0;
- for_each_set_bit(i, iio->active_scan_mask, iio->masklength) {
+ for_each_set_bit(i, iio->active_scan_mask, LRADC_MAX_TOTAL_CHANS) {
lradc->buffer[j] = readl(lradc->base + LRADC_CH(j));
writel(chan_value, lradc->base + LRADC_CH(j));
lradc->buffer[j] &= LRADC_CH_VALUE_MASK;
@@ -774,8 +774,7 @@ static bool mxs_lradc_validate_scan_mask(struct iio_dev *iio,
const unsigned long *mask)
{
struct mxs_lradc *lradc = iio_priv(iio);
- const int len = iio->masklength;
- const int map_chans = bitmap_weight(mask, len);
+ const int map_chans = bitmap_weight(mask, LRADC_MAX_TOTAL_CHANS);
int rsvd_chans = 0;
unsigned long rsvd_mask = 0;
@@ -792,7 +791,7 @@ static bool mxs_lradc_validate_scan_mask(struct iio_dev *iio,
rsvd_chans++;
/* Test for attempts to map channels with special mode of operation. */
- if (bitmap_intersects(mask, &rsvd_mask, len))
+ if (bitmap_intersects(mask, &rsvd_mask, LRADC_MAX_TOTAL_CHANS))
return false;
/* Test for attempts to map more channels then available slots. */
@@ -968,6 +967,7 @@ static int mxs_lradc_probe(struct platform_device *pdev)
iio->modes = INDIO_DIRECT_MODE;
iio->channels = mxs_lradc_chan_spec;
iio->num_channels = ARRAY_SIZE(mxs_lradc_chan_spec);
+ iio->masklength = LRADC_MAX_TOTAL_CHANS;
ret = iio_triggered_buffer_setup(iio, &iio_pollfunc_store_time,
&mxs_lradc_trigger_handler,
diff --git a/drivers/staging/iio/adc/spear_adc.c b/drivers/staging/iio/adc/spear_adc.c
index f45da42..736219c 100644
--- a/drivers/staging/iio/adc/spear_adc.c
+++ b/drivers/staging/iio/adc/spear_adc.c
@@ -407,7 +407,6 @@ static int spear_adc_remove(struct platform_device *pdev)
struct spear_adc_info *info = iio_priv(iodev);
iio_device_unregister(iodev);
- platform_set_drvdata(pdev, NULL);
clk_disable_unprepare(info->clk);
clk_put(info->clk);
iounmap(info->adc_base_spear6xx);
@@ -416,11 +415,13 @@ static int spear_adc_remove(struct platform_device *pdev)
return 0;
}
+#ifdef CONFIG_OF
static const struct of_device_id spear_adc_dt_ids[] = {
{ .compatible = "st,spear600-adc", },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, spear_adc_dt_ids);
+#endif
static struct platform_driver spear_adc_driver = {
.probe = spear_adc_probe,
diff --git a/drivers/staging/iio/gyro/Kconfig b/drivers/staging/iio/gyro/Kconfig
index 8360662..b433371 100644
--- a/drivers/staging/iio/gyro/Kconfig
+++ b/drivers/staging/iio/gyro/Kconfig
@@ -10,13 +10,6 @@ config ADIS16060
Say yes here to build support for Analog Devices adis16060 wide bandwidth
yaw rate gyroscope with SPI.
-config ADIS16130
- tristate "Analog Devices ADIS16130 High Precision Angular Rate Sensor driver"
- depends on SPI
- help
- Say yes here to build support for Analog Devices ADIS16130 High Precision
- Angular Rate Sensor driver.
-
config ADIS16260
tristate "Analog Devices ADIS16260 Digital Gyroscope Sensor SPI driver"
depends on SPI
diff --git a/drivers/staging/iio/gyro/Makefile b/drivers/staging/iio/gyro/Makefile
index 98e6500..975f95b 100644
--- a/drivers/staging/iio/gyro/Makefile
+++ b/drivers/staging/iio/gyro/Makefile
@@ -5,8 +5,5 @@
adis16060-y := adis16060_core.o
obj-$(CONFIG_ADIS16060) += adis16060.o
-adis16130-y := adis16130_core.o
-obj-$(CONFIG_ADIS16130) += adis16130.o
-
adis16260-y := adis16260_core.o
obj-$(CONFIG_ADIS16260) += adis16260.o
diff --git a/drivers/staging/iio/gyro/adis16130_core.c b/drivers/staging/iio/gyro/adis16130_core.c
deleted file mode 100644
index 531b803..0000000
--- a/drivers/staging/iio/gyro/adis16130_core.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * ADIS16130 Digital Output, High Precision Angular Rate Sensor driver
- *
- * Copyright 2010 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- */
-
-#include <linux/delay.h>
-#include <linux/mutex.h>
-#include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/spi/spi.h>
-#include <linux/slab.h>
-#include <linux/sysfs.h>
-#include <linux/list.h>
-#include <linux/module.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
-
-#define ADIS16130_CON 0x0
-#define ADIS16130_CON_RD (1 << 6)
-#define ADIS16130_IOP 0x1
-
-/* 1 = data-ready signal low when unread data on all channels; */
-#define ADIS16130_IOP_ALL_RDY (1 << 3)
-#define ADIS16130_IOP_SYNC (1 << 0) /* 1 = synchronization enabled */
-#define ADIS16130_RATEDATA 0x8 /* Gyroscope output, rate of rotation */
-#define ADIS16130_TEMPDATA 0xA /* Temperature output */
-#define ADIS16130_RATECS 0x28 /* Gyroscope channel setup */
-#define ADIS16130_RATECS_EN (1 << 3) /* 1 = channel enable; */
-#define ADIS16130_TEMPCS 0x2A /* Temperature channel setup */
-#define ADIS16130_TEMPCS_EN (1 << 3)
-#define ADIS16130_RATECONV 0x30
-#define ADIS16130_TEMPCONV 0x32
-#define ADIS16130_MODE 0x38
-#define ADIS16130_MODE_24BIT (1 << 1) /* 1 = 24-bit resolution; */
-
-/**
- * struct adis16130_state - device instance specific data
- * @us: actual spi_device to write data
- * @buf_lock: mutex to protect tx and rx
- * @buf: unified tx/rx buffer
- **/
-struct adis16130_state {
- struct spi_device *us;
- struct mutex buf_lock;
- u8 buf[4] ____cacheline_aligned;
-};
-
-static int adis16130_spi_read(struct iio_dev *indio_dev, u8 reg_addr, u32 *val)
-{
- int ret;
- struct adis16130_state *st = iio_priv(indio_dev);
- struct spi_message msg;
- struct spi_transfer xfer = {
- .tx_buf = st->buf,
- .rx_buf = st->buf,
- .len = 4,
- };
-
- mutex_lock(&st->buf_lock);
-
- st->buf[0] = ADIS16130_CON_RD | reg_addr;
- st->buf[1] = st->buf[2] = st->buf[3] = 0;
-
- spi_message_init(&msg);
- spi_message_add_tail(&xfer, &msg);
- ret = spi_sync(st->us, &msg);
- ret = spi_read(st->us, st->buf, 4);
-
- if (ret == 0)
- *val = (st->buf[1] << 16) | (st->buf[2] << 8) | st->buf[3];
- mutex_unlock(&st->buf_lock);
-
- return ret;
-}
-
-static int adis16130_read_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- int *val, int *val2,
- long mask)
-{
- int ret;
- u32 temp;
-
- /* Take the iio_dev status lock */
- mutex_lock(&indio_dev->mlock);
- ret = adis16130_spi_read(indio_dev, chan->address, &temp);
- mutex_unlock(&indio_dev->mlock);
- if (ret)
- return ret;
- *val = temp;
- return IIO_VAL_INT;
-}
-
-static const struct iio_chan_spec adis16130_channels[] = {
- {
- .type = IIO_ANGL_VEL,
- .modified = 1,
- .channel2 = IIO_MOD_Z,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
- .address = ADIS16130_RATEDATA,
- }, {
- .type = IIO_TEMP,
- .indexed = 1,
- .channel = 0,
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
- .address = ADIS16130_TEMPDATA,
- }
-};
-
-static const struct iio_info adis16130_info = {
- .read_raw = &adis16130_read_raw,
- .driver_module = THIS_MODULE,
-};
-
-static int adis16130_probe(struct spi_device *spi)
-{
- int ret;
- struct adis16130_state *st;
- struct iio_dev *indio_dev;
-
- /* setup the industrialio driver allocated elements */
- indio_dev = iio_device_alloc(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, indio_dev);
- st->us = spi;
- mutex_init(&st->buf_lock);
- indio_dev->name = spi->dev.driver->name;
- indio_dev->channels = adis16130_channels;
- indio_dev->num_channels = ARRAY_SIZE(adis16130_channels);
- indio_dev->dev.parent = &spi->dev;
- indio_dev->info = &adis16130_info;
- indio_dev->modes = INDIO_DIRECT_MODE;
-
- ret = iio_device_register(indio_dev);
- if (ret)
- goto error_free_dev;
-
- return 0;
-
-error_free_dev:
- iio_device_free(indio_dev);
-
-error_ret:
- return ret;
-}
-
-/* fixme, confirm ordering in this function */
-static int adis16130_remove(struct spi_device *spi)
-{
- iio_device_unregister(spi_get_drvdata(spi));
- iio_device_free(spi_get_drvdata(spi));
-
- return 0;
-}
-
-static struct spi_driver adis16130_driver = {
- .driver = {
- .name = "adis16130",
- .owner = THIS_MODULE,
- },
- .probe = adis16130_probe,
- .remove = adis16130_remove,
-};
-module_spi_driver(adis16130_driver);
-
-MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
-MODULE_DESCRIPTION("Analog Devices ADIS16130 High Precision Angular Rate");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("spi:adis16130");
diff --git a/drivers/staging/iio/trigger/Kconfig b/drivers/staging/iio/trigger/Kconfig
index 1a051da..2fd18c6 100644
--- a/drivers/staging/iio/trigger/Kconfig
+++ b/drivers/staging/iio/trigger/Kconfig
@@ -12,23 +12,6 @@ config IIO_PERIODIC_RTC_TRIGGER
Provides support for using periodic capable real time
clocks as IIO triggers.
-config IIO_GPIO_TRIGGER
- tristate "GPIO trigger"
- depends on GPIOLIB
- help
- Provides support for using GPIO pins as IIO triggers.
-
-config IIO_SYSFS_TRIGGER
- tristate "SYSFS trigger"
- depends on SYSFS
- select IRQ_WORK
- help
- Provides support for using SYSFS entry as IIO triggers.
- 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 iio-trig-sysfs.
-
config IIO_BFIN_TMR_TRIGGER
tristate "Blackfin TIMER trigger"
depends on BLACKFIN
diff --git a/drivers/staging/iio/trigger/Makefile b/drivers/staging/iio/trigger/Makefile
index b088b57..238481b 100644
--- a/drivers/staging/iio/trigger/Makefile
+++ b/drivers/staging/iio/trigger/Makefile
@@ -3,6 +3,4 @@
#
obj-$(CONFIG_IIO_PERIODIC_RTC_TRIGGER) += iio-trig-periodic-rtc.o
-obj-$(CONFIG_IIO_GPIO_TRIGGER) += iio-trig-gpio.o
-obj-$(CONFIG_IIO_SYSFS_TRIGGER) += iio-trig-sysfs.o
obj-$(CONFIG_IIO_BFIN_TMR_TRIGGER) += iio-trig-bfin-timer.o
diff --git a/drivers/staging/iio/trigger/iio-trig-gpio.c b/drivers/staging/iio/trigger/iio-trig-gpio.c
deleted file mode 100644
index 7c593d1..0000000
--- a/drivers/staging/iio/trigger/iio-trig-gpio.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Industrial I/O - gpio based trigger support
- *
- * Copyright (c) 2008 Jonathan Cameron
- *
- * 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.
- *
- * Currently this is more of a functioning proof of concept than a full
- * fledged trigger driver.
- *
- * TODO:
- *
- * Add board config elements to allow specification of startup settings.
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/interrupt.h>
-#include <linux/gpio.h>
-#include <linux/slab.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/trigger.h>
-
-static LIST_HEAD(iio_gpio_trigger_list);
-static DEFINE_MUTEX(iio_gpio_trigger_list_lock);
-
-struct iio_gpio_trigger_info {
- struct mutex in_use;
- unsigned int irq;
-};
-/*
- * Need to reference count these triggers and only enable gpio interrupts
- * as appropriate.
- */
-
-/* So what functionality do we want in here?... */
-/* set high / low as interrupt type? */
-
-static irqreturn_t iio_gpio_trigger_poll(int irq, void *private)
-{
- /* Timestamp not currently provided */
- iio_trigger_poll(private, 0);
- return IRQ_HANDLED;
-}
-
-static const struct iio_trigger_ops iio_gpio_trigger_ops = {
- .owner = THIS_MODULE,
-};
-
-static int iio_gpio_trigger_probe(struct platform_device *pdev)
-{
- struct iio_gpio_trigger_info *trig_info;
- struct iio_trigger *trig, *trig2;
- unsigned long irqflags;
- struct resource *irq_res;
- int irq, ret = 0, irq_res_cnt = 0;
-
- do {
- irq_res = platform_get_resource(pdev,
- IORESOURCE_IRQ, irq_res_cnt);
-
- if (irq_res == NULL) {
- if (irq_res_cnt == 0)
- dev_err(&pdev->dev, "No GPIO IRQs specified");
- break;
- }
- irqflags = (irq_res->flags & IRQF_TRIGGER_MASK) | IRQF_SHARED;
-
- for (irq = irq_res->start; irq <= irq_res->end; irq++) {
-
- trig = iio_trigger_alloc("irqtrig%d", irq);
- if (!trig) {
- ret = -ENOMEM;
- goto error_free_completed_registrations;
- }
-
- trig_info = kzalloc(sizeof(*trig_info), GFP_KERNEL);
- if (!trig_info) {
- ret = -ENOMEM;
- goto error_put_trigger;
- }
- 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,
- irqflags, trig->name, trig);
- if (ret) {
- dev_err(&pdev->dev,
- "request IRQ-%d failed", irq);
- goto error_free_trig_info;
- }
-
- ret = iio_trigger_register(trig);
- if (ret)
- goto error_release_irq;
-
- list_add_tail(&trig->alloc_list,
- &iio_gpio_trigger_list);
- }
-
- irq_res_cnt++;
- } while (irq_res != NULL);
-
-
- return 0;
-
-/* First clean up the partly allocated trigger */
-error_release_irq:
- free_irq(irq, trig);
-error_free_trig_info:
- kfree(trig_info);
-error_put_trigger:
- iio_trigger_put(trig);
-error_free_completed_registrations:
- /* The rest should have been added to the iio_gpio_trigger_list */
- list_for_each_entry_safe(trig,
- trig2,
- &iio_gpio_trigger_list,
- alloc_list) {
- trig_info = iio_trigger_get_drvdata(trig);
- free_irq(gpio_to_irq(trig_info->irq), trig);
- kfree(trig_info);
- iio_trigger_unregister(trig);
- }
-
- return ret;
-}
-
-static int iio_gpio_trigger_remove(struct platform_device *pdev)
-{
- struct iio_trigger *trig, *trig2;
- struct iio_gpio_trigger_info *trig_info;
-
- mutex_lock(&iio_gpio_trigger_list_lock);
- list_for_each_entry_safe(trig,
- trig2,
- &iio_gpio_trigger_list,
- alloc_list) {
- trig_info = iio_trigger_get_drvdata(trig);
- iio_trigger_unregister(trig);
- free_irq(trig_info->irq, trig);
- kfree(trig_info);
- iio_trigger_put(trig);
- }
- mutex_unlock(&iio_gpio_trigger_list_lock);
-
- return 0;
-}
-
-static struct platform_driver iio_gpio_trigger_driver = {
- .probe = iio_gpio_trigger_probe,
- .remove = iio_gpio_trigger_remove,
- .driver = {
- .name = "iio_gpio_trigger",
- .owner = THIS_MODULE,
- },
-};
-
-module_platform_driver(iio_gpio_trigger_driver);
-
-MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
-MODULE_DESCRIPTION("Example gpio trigger for the iio subsystem");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/staging/iio/trigger/iio-trig-sysfs.c b/drivers/staging/iio/trigger/iio-trig-sysfs.c
deleted file mode 100644
index b727bde..0000000
--- a/drivers/staging/iio/trigger/iio-trig-sysfs.c
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright 2011 Analog Devices Inc.
- *
- * Licensed under the GPL-2.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/list.h>
-#include <linux/irq_work.h>
-
-#include <linux/iio/iio.h>
-#include <linux/iio/trigger.h>
-
-struct iio_sysfs_trig {
- struct iio_trigger *trig;
- struct irq_work work;
- int id;
- struct list_head l;
-};
-
-static LIST_HEAD(iio_sysfs_trig_list);
-static DEFINE_MUTEX(iio_syfs_trig_list_mut);
-
-static int iio_sysfs_trigger_probe(int id);
-static ssize_t iio_sysfs_trig_add(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- int ret;
- unsigned long input;
-
- ret = strict_strtoul(buf, 10, &input);
- if (ret)
- return ret;
- ret = iio_sysfs_trigger_probe(input);
- if (ret)
- return ret;
- return len;
-}
-static DEVICE_ATTR(add_trigger, S_IWUSR, NULL, &iio_sysfs_trig_add);
-
-static int iio_sysfs_trigger_remove(int id);
-static ssize_t iio_sysfs_trig_remove(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len)
-{
- int ret;
- unsigned long input;
-
- ret = strict_strtoul(buf, 10, &input);
- if (ret)
- return ret;
- ret = iio_sysfs_trigger_remove(input);
- if (ret)
- return ret;
- return len;
-}
-
-static DEVICE_ATTR(remove_trigger, S_IWUSR, NULL, &iio_sysfs_trig_remove);
-
-static struct attribute *iio_sysfs_trig_attrs[] = {
- &dev_attr_add_trigger.attr,
- &dev_attr_remove_trigger.attr,
- NULL,
-};
-
-static const struct attribute_group iio_sysfs_trig_group = {
- .attrs = iio_sysfs_trig_attrs,
-};
-
-static const struct attribute_group *iio_sysfs_trig_groups[] = {
- &iio_sysfs_trig_group,
- NULL
-};
-
-
-/* Nothing to actually do upon release */
-static void iio_trigger_sysfs_release(struct device *dev)
-{
-}
-
-static struct device iio_sysfs_trig_dev = {
- .bus = &iio_bus_type,
- .groups = iio_sysfs_trig_groups,
- .release = &iio_trigger_sysfs_release,
-};
-
-static void iio_sysfs_trigger_work(struct irq_work *work)
-{
- struct iio_sysfs_trig *trig = container_of(work, struct iio_sysfs_trig,
- work);
-
- iio_trigger_poll(trig->trig, 0);
-}
-
-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 = iio_trigger_get_drvdata(trig);
-
- irq_work_queue(&sysfs_trig->work);
-
- return count;
-}
-
-static DEVICE_ATTR(trigger_now, S_IWUSR, NULL, iio_sysfs_trigger_poll);
-
-static struct attribute *iio_sysfs_trigger_attrs[] = {
- &dev_attr_trigger_now.attr,
- NULL,
-};
-
-static const struct attribute_group iio_sysfs_trigger_attr_group = {
- .attrs = iio_sysfs_trigger_attrs,
-};
-
-static const struct attribute_group *iio_sysfs_trigger_attr_groups[] = {
- &iio_sysfs_trigger_attr_group,
- NULL
-};
-
-static const struct iio_trigger_ops iio_sysfs_trigger_ops = {
- .owner = THIS_MODULE,
-};
-
-static int iio_sysfs_trigger_probe(int id)
-{
- struct iio_sysfs_trig *t;
- int ret;
- bool foundit = false;
- mutex_lock(&iio_syfs_trig_list_mut);
- list_for_each_entry(t, &iio_sysfs_trig_list, l)
- if (id == t->id) {
- foundit = true;
- break;
- }
- if (foundit) {
- ret = -EINVAL;
- goto out1;
- }
- t = kmalloc(sizeof(*t), GFP_KERNEL);
- if (t == NULL) {
- ret = -ENOMEM;
- goto out1;
- }
- t->id = id;
- t->trig = iio_trigger_alloc("sysfstrig%d", id);
- if (!t->trig) {
- ret = -ENOMEM;
- goto free_t;
- }
-
- t->trig->dev.groups = iio_sysfs_trigger_attr_groups;
- t->trig->ops = &iio_sysfs_trigger_ops;
- t->trig->dev.parent = &iio_sysfs_trig_dev;
- iio_trigger_set_drvdata(t->trig, t);
-
- init_irq_work(&t->work, iio_sysfs_trigger_work);
-
- ret = iio_trigger_register(t->trig);
- if (ret)
- goto out2;
- list_add(&t->l, &iio_sysfs_trig_list);
- __module_get(THIS_MODULE);
- mutex_unlock(&iio_syfs_trig_list_mut);
- return 0;
-
-out2:
- iio_trigger_put(t->trig);
-free_t:
- kfree(t);
-out1:
- mutex_unlock(&iio_syfs_trig_list_mut);
- return ret;
-}
-
-static int iio_sysfs_trigger_remove(int id)
-{
- bool foundit = false;
- struct iio_sysfs_trig *t;
- mutex_lock(&iio_syfs_trig_list_mut);
- list_for_each_entry(t, &iio_sysfs_trig_list, l)
- if (id == t->id) {
- foundit = true;
- break;
- }
- if (!foundit) {
- mutex_unlock(&iio_syfs_trig_list_mut);
- return -EINVAL;
- }
-
- iio_trigger_unregister(t->trig);
- iio_trigger_free(t->trig);
-
- list_del(&t->l);
- kfree(t);
- module_put(THIS_MODULE);
- mutex_unlock(&iio_syfs_trig_list_mut);
- return 0;
-}
-
-
-static int __init iio_sysfs_trig_init(void)
-{
- device_initialize(&iio_sysfs_trig_dev);
- dev_set_name(&iio_sysfs_trig_dev, "iio_sysfs_trigger");
- return device_add(&iio_sysfs_trig_dev);
-}
-module_init(iio_sysfs_trig_init);
-
-static void __exit iio_sysfs_trig_exit(void)
-{
- device_unregister(&iio_sysfs_trig_dev);
-}
-module_exit(iio_sysfs_trig_exit);
-
-MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>");
-MODULE_DESCRIPTION("Sysfs based trigger for the iio subsystem");
-MODULE_LICENSE("GPL v2");
-MODULE_ALIAS("platform:iio-trig-sysfs");