diff options
Diffstat (limited to 'drivers/staging/iio')
-rw-r--r-- | drivers/staging/iio/adc/ad7192.c | 2 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7280a.c | 2 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7291.c | 217 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7291.h | 12 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7606_core.c | 12 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7606_par.c | 2 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad7816.c | 8 | ||||
-rw-r--r-- | drivers/staging/iio/adc/ad799x_core.c | 4 | ||||
-rw-r--r-- | drivers/staging/iio/adc/lpc32xx_adc.c | 1 | ||||
-rw-r--r-- | drivers/staging/iio/adc/mxs-lradc.c | 8 | ||||
-rw-r--r-- | drivers/staging/iio/adc/spear_adc.c | 3 | ||||
-rw-r--r-- | drivers/staging/iio/gyro/Kconfig | 7 | ||||
-rw-r--r-- | drivers/staging/iio/gyro/Makefile | 3 | ||||
-rw-r--r-- | drivers/staging/iio/gyro/adis16130_core.c | 178 | ||||
-rw-r--r-- | drivers/staging/iio/trigger/Kconfig | 17 | ||||
-rw-r--r-- | drivers/staging/iio/trigger/Makefile | 2 | ||||
-rw-r--r-- | drivers/staging/iio/trigger/iio-trig-gpio.c | 167 | ||||
-rw-r--r-- | drivers/staging/iio/trigger/iio-trig-sysfs.c | 227 |
18 files changed, 111 insertions, 761 deletions
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c index 504701940585..3283e2829536 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 2fd6ee3c1902..c19618bc37c4 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 d088c662d5cd..3fc79e582750 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 000000000000..bbd89fa51188 --- /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 d104b4378424..72868ceda360 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 58cfddea9637..8a48d18de788 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 928477146c2f..8470036a3378 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 8dc97b36e05a..2b2049c8bc6b 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 2f2f7fdd0691..9a4bb0999b51 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 163c638e4095..d92c97a59d61 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 f45da4266950..736219c30308 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 836066287192..b4333715536e 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 98e650061a3a..975f95b141da 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 531b803cb2ac..000000000000 --- 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 1a051da62505..2fd18c60323d 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 b088b57da335..238481b78e72 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 7c593d18a910..000000000000 --- 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 b727bde8b7fe..000000000000 --- 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"); |