Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

Jonathan writes:

3rd round of IIO new drivers, cleanups and functionality for the 3.17 cycle.

New drivers
* isl29125 digital color light sensor driver
* TAOS/AMS tcs3414 digital color sensor

Staging graduation
* ad7291 ADC driver.

New functionality
* st_sensors - device tree support and bindings
* mma8452 - device tree support

Cleanups
* Drop redundant variables in a number of drivers.
* Reorder a structure definition to ealy wiht a warning about static
not being at the beginning in the hid-sensors driver.
* Switch a few more drivers away from using explicit sampling_frequency
attribute to providing this through the core.
* Make hid_sensor_get_reporting_interval static as only used within a single
file.
* Drop a redundant check for negative values in an unsigned variable from
ad9832
* Drop some duplicate case labels in the event monitor example code.
* Use devm_ioremap_resource to simplify error handling.
* Use devm_kzalloc within the blackfin timer driver to simplify error
handling and removal.
* A number of cleanups of the ad7291 from Hartmut Knaack in response
to a patch moving it out of staging.
* Core support for the period info element about events. It has been
in the abi for a while, but not added until now to the newer handling
of information related to events.
* Add HAS_IOMEM dependency to mxs_lradc to avoid build issues when testing
enabled.

+1392 -481
+1
Documentation/devicetree/bindings/i2c/trivial-devices.txt
··· 50 50 fsl,mag3110 MAG3110: Xtrinsic High Accuracy, 3D Magnetometer 51 51 fsl,mc13892 MC13892: Power Management Integrated Circuit (PMIC) for i.MX35/51 52 52 fsl,mma8450 MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer 53 + fsl,mma8452 MMA8452Q: 3-axis 12-bit / 8-bit Digital Accelerometer 53 54 fsl,mpr121 MPR121: Proximity Capacitive Touch Sensor Controller 54 55 fsl,sgtl5000 SGTL5000: Ultra Low-Power Audio Codec 55 56 gmt,g751 G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface
+54
Documentation/devicetree/bindings/iio/st-sensors.txt
··· 1 + STMicroelectronics MEMS sensors 2 + 3 + The STMicroelectronics sensor devices are pretty straight-forward I2C or 4 + SPI devices, all sharing the same device tree descriptions no matter what 5 + type of sensor it is. 6 + 7 + Required properties: 8 + - compatible: see the list of valid compatible strings below 9 + - reg: the I2C or SPI address the device will respond to 10 + 11 + Optional properties: 12 + - vdd-supply: an optional regulator that needs to be on to provide VDD 13 + power to the sensor. 14 + - vddio-supply: an optional regulator that needs to be on to provide the 15 + VDD IO power to the sensor. 16 + - st,drdy-int-pin: the pin on the package that will be used to signal 17 + "data ready" (valid values: 1 or 2). This property is not configurable 18 + on all sensors. 19 + 20 + Sensors may also have applicable pin control settings, those use the 21 + standard bindings from pinctrl/pinctrl-bindings.txt. 22 + 23 + Valid compatible strings: 24 + 25 + Accelerometers: 26 + - st,lsm303dlh-accel 27 + - st,lsm303dlhc-accel 28 + - st,lis3dh-accel 29 + - st,lsm330d-accel 30 + - st,lsm330dl-accel 31 + - st,lsm330dlc-accel 32 + - st,lis331dlh-accel 33 + - st,lsm303dl-accel 34 + - st,lsm303dlm-accel 35 + - st,lsm330-accel 36 + 37 + Gyroscopes: 38 + - st,l3g4200d-gyro 39 + - st,lsm330d-gyro 40 + - st,lsm330dl-gyro 41 + - st,lsm330dlc-gyro 42 + - st,l3gd20-gyro 43 + - st,l3g4is-gyro 44 + - st,lsm330-gyro 45 + 46 + Magnetometers: 47 + - st,lsm303dlhc-magn 48 + - st,lsm303dlm-magn 49 + - st,lis3mdl-magn 50 + 51 + Pressure sensors: 52 + - st,lps001wp-press 53 + - st,lps25h-press 54 + - st,lps331ap-press
+6
drivers/iio/accel/mma8452.c
··· 423 423 }; 424 424 MODULE_DEVICE_TABLE(i2c, mma8452_id); 425 425 426 + static const struct of_device_id mma8452_dt_ids[] = { 427 + { .compatible = "fsl,mma8452" }, 428 + { } 429 + }; 430 + 426 431 static struct i2c_driver mma8452_driver = { 427 432 .driver = { 428 433 .name = "mma8452", 434 + .of_match_table = of_match_ptr(mma8452_dt_ids), 429 435 .pm = MMA8452_PM_OPS, 430 436 }, 431 437 .probe = mma8452_probe,
+10 -2
drivers/iio/accel/st_accel_core.c
··· 393 393 *val = 0; 394 394 *val2 = adata->current_fullscale->gain; 395 395 return IIO_VAL_INT_PLUS_MICRO; 396 + case IIO_CHAN_INFO_SAMP_FREQ: 397 + *val = adata->odr; 398 + return IIO_VAL_INT; 396 399 default: 397 400 return -EINVAL; 398 401 } ··· 413 410 case IIO_CHAN_INFO_SCALE: 414 411 err = st_sensors_set_fullscale_by_gain(indio_dev, val2); 415 412 break; 413 + case IIO_CHAN_INFO_SAMP_FREQ: 414 + if (val2) 415 + return -EINVAL; 416 + mutex_lock(&indio_dev->mlock); 417 + err = st_sensors_set_odr(indio_dev, val); 418 + mutex_unlock(&indio_dev->mlock); 419 + return err; 416 420 default: 417 421 return -EINVAL; 418 422 } ··· 427 417 return err; 428 418 } 429 419 430 - static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); 431 420 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); 432 421 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_accel_scale_available); 433 422 434 423 static struct attribute *st_accel_attributes[] = { 435 424 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 436 425 &iio_dev_attr_in_accel_scale_available.dev_attr.attr, 437 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 438 426 NULL, 439 427 }; 440 428
+51
drivers/iio/accel/st_accel_i2c.c
··· 18 18 #include <linux/iio/common/st_sensors_i2c.h> 19 19 #include "st_accel.h" 20 20 21 + #ifdef CONFIG_OF 22 + static const struct of_device_id st_accel_of_match[] = { 23 + { 24 + .compatible = "st,lsm303dlh-accel", 25 + .data = LSM303DLH_ACCEL_DEV_NAME, 26 + }, 27 + { 28 + .compatible = "st,lsm303dlhc-accel", 29 + .data = LSM303DLHC_ACCEL_DEV_NAME, 30 + }, 31 + { 32 + .compatible = "st,lis3dh-accel", 33 + .data = LIS3DH_ACCEL_DEV_NAME, 34 + }, 35 + { 36 + .compatible = "st,lsm330d-accel", 37 + .data = LSM330D_ACCEL_DEV_NAME, 38 + }, 39 + { 40 + .compatible = "st,lsm330dl-accel", 41 + .data = LSM330DL_ACCEL_DEV_NAME, 42 + }, 43 + { 44 + .compatible = "st,lsm330dlc-accel", 45 + .data = LSM330DLC_ACCEL_DEV_NAME, 46 + }, 47 + { 48 + .compatible = "st,lis331dlh-accel", 49 + .data = LIS331DLH_ACCEL_DEV_NAME, 50 + }, 51 + { 52 + .compatible = "st,lsm303dl-accel", 53 + .data = LSM303DL_ACCEL_DEV_NAME, 54 + }, 55 + { 56 + .compatible = "st,lsm303dlm-accel", 57 + .data = LSM303DLM_ACCEL_DEV_NAME, 58 + }, 59 + { 60 + .compatible = "st,lsm330-accel", 61 + .data = LSM330_ACCEL_DEV_NAME, 62 + }, 63 + {}, 64 + }; 65 + MODULE_DEVICE_TABLE(of, st_accel_of_match); 66 + #else 67 + #define st_accel_of_match NULL 68 + #endif 69 + 21 70 static int st_accel_i2c_probe(struct i2c_client *client, 22 71 const struct i2c_device_id *id) 23 72 { ··· 80 31 81 32 adata = iio_priv(indio_dev); 82 33 adata->dev = &client->dev; 34 + st_sensors_of_i2c_probe(client, st_accel_of_match); 83 35 84 36 st_sensors_i2c_configure(indio_dev, client, adata); 85 37 ··· 117 67 .driver = { 118 68 .owner = THIS_MODULE, 119 69 .name = "st-accel-i2c", 70 + .of_match_table = of_match_ptr(st_accel_of_match), 120 71 }, 121 72 .probe = st_accel_i2c_probe, 122 73 .remove = st_accel_i2c_remove,
+10
drivers/iio/adc/Kconfig
··· 20 20 Say yes here to build support for Analog Devices AD7265 and AD7266 21 21 ADCs. 22 22 23 + config AD7291 24 + tristate "Analog Devices AD7291 ADC driver" 25 + depends on I2C 26 + help 27 + Say yes here to build support for Analog Devices AD7291 28 + 8 Channel ADC with temperature sensor. 29 + 30 + To compile this driver as a module, choose M here: the 31 + module will be called ad7291. 32 + 23 33 config AD7298 24 34 tristate "Analog Devices AD7298 ADC driver" 25 35 depends on SPI
+1
drivers/iio/adc/Makefile
··· 5 5 # When adding new entries keep the list in alphabetical order 6 6 obj-$(CONFIG_AD_SIGMA_DELTA) += ad_sigma_delta.o 7 7 obj-$(CONFIG_AD7266) += ad7266.o 8 + obj-$(CONFIG_AD7291) += ad7291.o 8 9 obj-$(CONFIG_AD7298) += ad7298.o 9 10 obj-$(CONFIG_AD7923) += ad7923.o 10 11 obj-$(CONFIG_AD7476) += ad7476.o
-6
drivers/iio/adc/xilinx-xadc-events.c
··· 31 31 static void xadc_handle_event(struct iio_dev *indio_dev, unsigned int event) 32 32 { 33 33 const struct iio_chan_spec *chan; 34 - unsigned int offset; 35 34 36 35 /* Temperature threshold error, we don't handle this yet */ 37 36 if (event == 0) 38 37 return; 39 - 40 - if (event < 4) 41 - offset = event; 42 - else 43 - offset = event + 4; 44 38 45 39 chan = xadc_event_to_channel(indio_dev, event); 46 40
+3 -2
drivers/iio/common/hid-sensors/hid-sensor-attributes.c
··· 26 26 #include <linux/iio/iio.h> 27 27 #include <linux/iio/sysfs.h> 28 28 29 - struct { 29 + static struct { 30 30 u32 usage_id; 31 31 int unit; /* 0 for default others from HID sensor spec */ 32 32 int scale_val0; /* scale, whole number */ 33 33 int scale_val1; /* scale, fraction in micros */ 34 - } static unit_conversion[] = { 34 + } unit_conversion[] = { 35 35 {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, 36 36 {HID_USAGE_SENSOR_ACCEL_3D, 37 37 HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, ··· 343 343 } 344 344 EXPORT_SYMBOL(hid_sensor_format_scale); 345 345 346 + static 346 347 int hid_sensor_get_reporting_interval(struct hid_sensor_hub_device *hsdev, 347 348 u32 usage_id, 348 349 struct hid_sensor_common *st)
+34 -30
drivers/iio/common/st_sensors/st_sensors_core.c
··· 14 14 #include <linux/delay.h> 15 15 #include <linux/iio/iio.h> 16 16 #include <linux/regulator/consumer.h> 17 + #include <linux/of.h> 17 18 #include <asm/unaligned.h> 18 - 19 19 #include <linux/iio/common/st_sensors.h> 20 20 21 21 ··· 265 265 return 0; 266 266 } 267 267 268 + #ifdef CONFIG_OF 269 + static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev, 270 + struct st_sensors_platform_data *defdata) 271 + { 272 + struct st_sensors_platform_data *pdata; 273 + struct device_node *np = dev->of_node; 274 + u32 val; 275 + 276 + if (!np) 277 + return NULL; 278 + 279 + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); 280 + if (!of_property_read_u32(np, "st,drdy-int-pin", &val) && (val <= 2)) 281 + pdata->drdy_int_pin = (u8) val; 282 + else 283 + pdata->drdy_int_pin = defdata ? defdata->drdy_int_pin : 1; 284 + 285 + return pdata; 286 + } 287 + #else 288 + static struct st_sensors_platform_data *st_sensors_of_probe(struct device *dev, 289 + struct st_sensors_platform_data *defdata) 290 + { 291 + return NULL; 292 + } 293 + #endif 294 + 268 295 int st_sensors_init_sensor(struct iio_dev *indio_dev, 269 296 struct st_sensors_platform_data *pdata) 270 297 { 271 298 struct st_sensor_data *sdata = iio_priv(indio_dev); 299 + struct st_sensors_platform_data *of_pdata; 272 300 int err = 0; 273 301 274 302 mutex_init(&sdata->tb.buf_lock); 303 + 304 + /* If OF/DT pdata exists, it will take precedence of anything else */ 305 + of_pdata = st_sensors_of_probe(indio_dev->dev.parent, pdata); 306 + if (of_pdata) 307 + pdata = of_pdata; 275 308 276 309 if (pdata) 277 310 err = st_sensors_set_drdy_int_pin(indio_dev, pdata); ··· 495 462 return err; 496 463 } 497 464 EXPORT_SYMBOL(st_sensors_check_device_support); 498 - 499 - ssize_t st_sensors_sysfs_get_sampling_frequency(struct device *dev, 500 - struct device_attribute *attr, char *buf) 501 - { 502 - struct st_sensor_data *adata = iio_priv(dev_get_drvdata(dev)); 503 - 504 - return sprintf(buf, "%d\n", adata->odr); 505 - } 506 - EXPORT_SYMBOL(st_sensors_sysfs_get_sampling_frequency); 507 - 508 - ssize_t st_sensors_sysfs_set_sampling_frequency(struct device *dev, 509 - struct device_attribute *attr, const char *buf, size_t size) 510 - { 511 - int err; 512 - unsigned int odr; 513 - struct iio_dev *indio_dev = dev_get_drvdata(dev); 514 - 515 - err = kstrtoint(buf, 10, &odr); 516 - if (err < 0) 517 - goto conversion_error; 518 - 519 - mutex_lock(&indio_dev->mlock); 520 - err = st_sensors_set_odr(indio_dev, odr); 521 - mutex_unlock(&indio_dev->mlock); 522 - 523 - conversion_error: 524 - return err < 0 ? err : size; 525 - } 526 - EXPORT_SYMBOL(st_sensors_sysfs_set_sampling_frequency); 527 465 528 466 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, 529 467 struct device_attribute *attr, char *buf)
+30
drivers/iio/common/st_sensors/st_sensors_i2c.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/slab.h> 14 14 #include <linux/iio/iio.h> 15 + #include <linux/of_device.h> 15 16 16 17 #include <linux/iio/common/st_sensors_i2c.h> 17 18 ··· 76 75 sdata->get_irq_data_ready = st_sensors_i2c_get_irq; 77 76 } 78 77 EXPORT_SYMBOL(st_sensors_i2c_configure); 78 + 79 + #ifdef CONFIG_OF 80 + /** 81 + * st_sensors_of_i2c_probe() - device tree probe for ST I2C sensors 82 + * @client: the I2C client device for the sensor 83 + * @match: the OF match table for the device, containing compatible strings 84 + * but also a .data field with the corresponding internal kernel name 85 + * used by this sensor. 86 + * 87 + * In effect this function matches a compatible string to an internal kernel 88 + * name for a certain sensor device, so that the rest of the autodetection can 89 + * rely on that name from this point on. I2C client devices will be renamed 90 + * to match the internal kernel convention. 91 + */ 92 + void st_sensors_of_i2c_probe(struct i2c_client *client, 93 + const struct of_device_id *match) 94 + { 95 + const struct of_device_id *of_id; 96 + 97 + of_id = of_match_device(match, &client->dev); 98 + if (!of_id) 99 + return; 100 + 101 + /* The name from the OF match takes precedence if present */ 102 + strncpy(client->name, of_id->data, sizeof(client->name)); 103 + client->name[sizeof(client->name) - 1] = '\0'; 104 + } 105 + EXPORT_SYMBOL(st_sensors_of_i2c_probe); 106 + #endif 79 107 80 108 MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>"); 81 109 MODULE_DESCRIPTION("STMicroelectronics ST-sensors i2c driver");
+1 -4
drivers/iio/dac/ad5504.c
··· 125 125 long mask) 126 126 { 127 127 struct ad5504_state *st = iio_priv(indio_dev); 128 - int ret; 129 128 130 129 switch (mask) { 131 130 case IIO_CHAN_INFO_RAW: ··· 133 134 134 135 return ad5504_spi_write(st, chan->address, val); 135 136 default: 136 - ret = -EINVAL; 137 + return -EINVAL; 137 138 } 138 - 139 - return -EINVAL; 140 139 } 141 140 142 141 static const char * const ad5504_powerdown_modes[] = {
+1 -4
drivers/iio/dac/ad5624r_spi.c
··· 67 67 long mask) 68 68 { 69 69 struct ad5624r_state *st = iio_priv(indio_dev); 70 - int ret; 71 70 72 71 switch (mask) { 73 72 case IIO_CHAN_INFO_RAW: ··· 78 79 chan->address, val, 79 80 chan->scan_type.shift); 80 81 default: 81 - ret = -EINVAL; 82 + return -EINVAL; 82 83 } 83 - 84 - return -EINVAL; 85 84 } 86 85 87 86 static const char * const ad5624r_powerdown_modes[] = {
+1 -2
drivers/iio/dac/ad5686.c
··· 313 313 { 314 314 struct ad5686_state *st; 315 315 struct iio_dev *indio_dev; 316 - int ret, regdone = 0, voltage_uv = 0; 316 + int ret, voltage_uv = 0; 317 317 318 318 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 319 319 if (indio_dev == NULL) ··· 355 355 indio_dev->channels = st->chip_info->channel; 356 356 indio_dev->num_channels = AD5686_DAC_CHANNELS; 357 357 358 - regdone = 1; 359 358 ret = ad5686_spi_write(st, AD5686_CMD_INTERNAL_REFER_SETUP, 0, 360 359 !!voltage_uv, 0); 361 360 if (ret)
+46 -78
drivers/iio/gyro/adis16260.c
··· 101 101 #define ADIS16260_SCAN_TEMP 3 102 102 #define ADIS16260_SCAN_ANGL 4 103 103 104 - static ssize_t adis16260_read_frequency(struct device *dev, 105 - struct device_attribute *attr, 106 - char *buf) 107 - { 108 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 109 - struct adis *adis = iio_priv(indio_dev); 110 - int ret, len = 0; 111 - u16 t; 112 - int sps; 113 - ret = adis_read_reg_16(adis, ADIS16260_SMPL_PRD, &t); 114 - if (ret) 115 - return ret; 116 - 117 - if (spi_get_device_id(adis->spi)->driver_data) /* If an adis16251 */ 118 - sps = (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 8 : 256; 119 - else 120 - sps = (t & ADIS16260_SMPL_PRD_TIME_BASE) ? 66 : 2048; 121 - sps /= (t & ADIS16260_SMPL_PRD_DIV_MASK) + 1; 122 - len = sprintf(buf, "%d\n", sps); 123 - return len; 124 - } 125 - 126 - static ssize_t adis16260_write_frequency(struct device *dev, 127 - struct device_attribute *attr, 128 - const char *buf, 129 - size_t len) 130 - { 131 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 132 - struct adis *adis = iio_priv(indio_dev); 133 - unsigned int val; 134 - int ret; 135 - u8 t; 136 - 137 - ret = kstrtouint(buf, 10, &val); 138 - if (ret) 139 - return ret; 140 - 141 - mutex_lock(&indio_dev->mlock); 142 - if (spi_get_device_id(adis->spi)->driver_data) 143 - t = 256 / val; 144 - else 145 - t = 2048 / val; 146 - 147 - if (t > ADIS16260_SMPL_PRD_DIV_MASK) 148 - t = ADIS16260_SMPL_PRD_DIV_MASK; 149 - else if (t > 0) 150 - t--; 151 - 152 - if (t >= 0x0A) 153 - adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; 154 - else 155 - adis->spi->max_speed_hz = ADIS16260_SPI_FAST; 156 - ret = adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); 157 - 158 - mutex_unlock(&indio_dev->mlock); 159 - 160 - return ret ? ret : len; 161 - } 162 - 163 104 /* Power down the device */ 164 105 static int adis16260_stop_device(struct iio_dev *indio_dev) 165 106 { ··· 115 174 return ret; 116 175 } 117 176 118 - static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 119 - adis16260_read_frequency, 120 - adis16260_write_frequency); 121 - 122 177 static const struct iio_chan_spec adis16260_channels[] = { 123 178 ADIS_GYRO_CHAN(X, ADIS16260_GYRO_OUT, ADIS16260_SCAN_GYRO, 124 179 BIT(IIO_CHAN_INFO_CALIBBIAS) | 125 - BIT(IIO_CHAN_INFO_CALIBSCALE), 14), 126 - ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0, 14), 127 - ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP, 12), 128 - ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY, 12), 129 - ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC, 12), 180 + BIT(IIO_CHAN_INFO_CALIBSCALE), 181 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), 182 + ADIS_INCLI_CHAN(X, ADIS16260_ANGL_OUT, ADIS16260_SCAN_ANGL, 0, 183 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 14), 184 + ADIS_TEMP_CHAN(ADIS16260_TEMP_OUT, ADIS16260_SCAN_TEMP, 185 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), 186 + ADIS_SUPPLY_CHAN(ADIS16260_SUPPLY_OUT, ADIS16260_SCAN_SUPPLY, 187 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), 188 + ADIS_AUX_ADC_CHAN(ADIS16260_AUX_ADC, ADIS16260_SCAN_AUX_ADC, 189 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 12), 130 190 IIO_CHAN_SOFT_TIMESTAMP(5), 131 191 }; 132 192 ··· 200 258 201 259 *val = val16; 202 260 return IIO_VAL_INT; 261 + case IIO_CHAN_INFO_SAMP_FREQ: 262 + ret = adis_read_reg_16(adis, ADIS16260_SMPL_PRD, &val16); 263 + if (ret) 264 + return ret; 265 + 266 + if (spi_get_device_id(adis->spi)->driver_data) 267 + /* If an adis16251 */ 268 + *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? 269 + 8 : 256; 270 + else 271 + *val = (val16 & ADIS16260_SMPL_PRD_TIME_BASE) ? 272 + 66 : 2048; 273 + *val /= (val16 & ADIS16260_SMPL_PRD_DIV_MASK) + 1; 274 + return IIO_VAL_INT; 203 275 } 204 276 return -EINVAL; 205 277 } ··· 225 269 long mask) 226 270 { 227 271 struct adis *adis = iio_priv(indio_dev); 272 + int ret; 228 273 u8 addr; 274 + u8 t; 229 275 230 276 switch (mask) { 231 277 case IIO_CHAN_INFO_CALIBBIAS: ··· 242 284 243 285 addr = adis16260_addresses[chan->scan_index][1]; 244 286 return adis_write_reg_16(adis, addr, val); 287 + case IIO_CHAN_INFO_SAMP_FREQ: 288 + mutex_lock(&indio_dev->mlock); 289 + if (spi_get_device_id(adis->spi)->driver_data) 290 + t = 256 / val; 291 + else 292 + t = 2048 / val; 293 + 294 + if (t > ADIS16260_SMPL_PRD_DIV_MASK) 295 + t = ADIS16260_SMPL_PRD_DIV_MASK; 296 + else if (t > 0) 297 + t--; 298 + 299 + if (t >= 0x0A) 300 + adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; 301 + else 302 + adis->spi->max_speed_hz = ADIS16260_SPI_FAST; 303 + ret = adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); 304 + 305 + mutex_unlock(&indio_dev->mlock); 306 + return ret; 245 307 } 246 308 return -EINVAL; 247 309 } 248 310 249 - static struct attribute *adis16260_attributes[] = { 250 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 251 - NULL 252 - }; 253 - 254 - static const struct attribute_group adis16260_attribute_group = { 255 - .attrs = adis16260_attributes, 256 - }; 257 - 258 311 static const struct iio_info adis16260_info = { 259 - .attrs = &adis16260_attribute_group, 260 312 .read_raw = &adis16260_read_raw, 261 313 .write_raw = &adis16260_write_raw, 262 314 .update_scan_mode = adis_update_scan_mode,
+45 -60
drivers/iio/gyro/itg3200_core.c
··· 90 90 { 91 91 int ret = 0; 92 92 u8 reg; 93 + u8 regval; 93 94 94 95 switch (info) { 95 96 case IIO_CHAN_INFO_RAW: ··· 108 107 /* Only the temperature channel has an offset */ 109 108 *val = 23000; 110 109 return IIO_VAL_INT; 110 + case IIO_CHAN_INFO_SAMP_FREQ: 111 + ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &regval); 112 + if (ret) 113 + return ret; 114 + 115 + *val = (regval & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000; 116 + 117 + ret = itg3200_read_reg_8(indio_dev, 118 + ITG3200_REG_SAMPLE_RATE_DIV, 119 + &regval); 120 + if (ret) 121 + return ret; 122 + 123 + *val /= regval + 1; 124 + return IIO_VAL_INT; 125 + 111 126 default: 112 127 return -EINVAL; 113 128 } 114 129 } 115 130 116 - static ssize_t itg3200_read_frequency(struct device *dev, 117 - struct device_attribute *attr, char *buf) 131 + static int itg3200_write_raw(struct iio_dev *indio_dev, 132 + struct iio_chan_spec const *chan, 133 + int val, 134 + int val2, 135 + long mask) 118 136 { 119 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 120 - int ret, sps; 121 - u8 val; 122 - 123 - ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &val); 124 - if (ret) 125 - return ret; 126 - 127 - sps = (val & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000; 128 - 129 - ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, &val); 130 - if (ret) 131 - return ret; 132 - 133 - sps /= val + 1; 134 - 135 - return sprintf(buf, "%d\n", sps); 136 - } 137 - 138 - static ssize_t itg3200_write_frequency(struct device *dev, 139 - struct device_attribute *attr, 140 - const char *buf, 141 - size_t len) 142 - { 143 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 144 - unsigned val; 145 137 int ret; 146 138 u8 t; 147 139 148 - ret = kstrtouint(buf, 10, &val); 149 - if (ret) 150 - return ret; 140 + switch (mask) { 141 + case IIO_CHAN_INFO_SAMP_FREQ: 142 + if (val == 0 || val2 != 0) 143 + return -EINVAL; 151 144 152 - mutex_lock(&indio_dev->mlock); 145 + mutex_lock(&indio_dev->mlock); 153 146 154 - ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t); 155 - if (ret) 156 - goto err_ret; 147 + ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t); 148 + if (ret) { 149 + mutex_unlock(&indio_dev->mlock); 150 + return ret; 151 + } 152 + t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1; 157 153 158 - if (val == 0) { 159 - ret = -EINVAL; 160 - goto err_ret; 154 + ret = itg3200_write_reg_8(indio_dev, 155 + ITG3200_REG_SAMPLE_RATE_DIV, 156 + t); 157 + 158 + mutex_unlock(&indio_dev->mlock); 159 + return ret; 160 + 161 + default: 162 + return -EINVAL; 161 163 } 162 - t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1; 163 - 164 - ret = itg3200_write_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, t); 165 - 166 - err_ret: 167 - mutex_unlock(&indio_dev->mlock); 168 - 169 - return ret ? ret : len; 170 164 } 171 165 172 166 /* ··· 251 255 .channel2 = IIO_MOD_ ## _mod, \ 252 256 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 253 257 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 258 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 254 259 .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \ 255 260 .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \ 256 261 .scan_type = ITG3200_ST, \ ··· 264 267 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 265 268 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 266 269 BIT(IIO_CHAN_INFO_SCALE), 270 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 267 271 .address = ITG3200_REG_TEMP_OUT_H, 268 272 .scan_index = ITG3200_SCAN_TEMP, 269 273 .scan_type = ITG3200_ST, ··· 275 277 IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS), 276 278 }; 277 279 278 - /* IIO device attributes */ 279 - static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency, 280 - itg3200_write_frequency); 281 - 282 - static struct attribute *itg3200_attributes[] = { 283 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 284 - NULL 285 - }; 286 - 287 - static const struct attribute_group itg3200_attribute_group = { 288 - .attrs = itg3200_attributes, 289 - }; 290 - 291 280 static const struct iio_info itg3200_info = { 292 - .attrs = &itg3200_attribute_group, 293 281 .read_raw = &itg3200_read_raw, 282 + .write_raw = &itg3200_write_raw, 294 283 .driver_module = THIS_MODULE, 295 284 }; 296 285
+10 -2
drivers/iio/gyro/st_gyro_core.c
··· 245 245 *val = 0; 246 246 *val2 = gdata->current_fullscale->gain; 247 247 return IIO_VAL_INT_PLUS_MICRO; 248 + case IIO_CHAN_INFO_SAMP_FREQ: 249 + *val = gdata->odr; 250 + return IIO_VAL_INT; 248 251 default: 249 252 return -EINVAL; 250 253 } ··· 265 262 case IIO_CHAN_INFO_SCALE: 266 263 err = st_sensors_set_fullscale_by_gain(indio_dev, val2); 267 264 break; 265 + case IIO_CHAN_INFO_SAMP_FREQ: 266 + if (val2) 267 + return -EINVAL; 268 + mutex_lock(&indio_dev->mlock); 269 + err = st_sensors_set_odr(indio_dev, val); 270 + mutex_unlock(&indio_dev->mlock); 271 + return err; 268 272 default: 269 273 err = -EINVAL; 270 274 } ··· 279 269 return err; 280 270 } 281 271 282 - static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); 283 272 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); 284 273 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_anglvel_scale_available); 285 274 286 275 static struct attribute *st_gyro_attributes[] = { 287 276 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 288 277 &iio_dev_attr_in_anglvel_scale_available.dev_attr.attr, 289 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 290 278 NULL, 291 279 }; 292 280
+39
drivers/iio/gyro/st_gyro_i2c.c
··· 18 18 #include <linux/iio/common/st_sensors_i2c.h> 19 19 #include "st_gyro.h" 20 20 21 + #ifdef CONFIG_OF 22 + static const struct of_device_id st_gyro_of_match[] = { 23 + { 24 + .compatible = "st,l3g4200d-gyro", 25 + .data = L3G4200D_GYRO_DEV_NAME, 26 + }, 27 + { 28 + .compatible = "st,lsm330d-gyro", 29 + .data = LSM330D_GYRO_DEV_NAME, 30 + }, 31 + { 32 + .compatible = "st,lsm330dl-gyro", 33 + .data = LSM330DL_GYRO_DEV_NAME, 34 + }, 35 + { 36 + .compatible = "st,lsm330dlc-gyro", 37 + .data = LSM330DLC_GYRO_DEV_NAME, 38 + }, 39 + { 40 + .compatible = "st,l3gd20-gyro", 41 + .data = L3GD20_GYRO_DEV_NAME, 42 + }, 43 + { 44 + .compatible = "st,l3g4is-gyro", 45 + .data = L3G4IS_GYRO_DEV_NAME, 46 + }, 47 + { 48 + .compatible = "st,lsm330-gyro", 49 + .data = LSM330_GYRO_DEV_NAME, 50 + }, 51 + {}, 52 + }; 53 + MODULE_DEVICE_TABLE(of, st_gyro_of_match); 54 + #else 55 + #define st_gyro_of_match NULL 56 + #endif 57 + 21 58 static int st_gyro_i2c_probe(struct i2c_client *client, 22 59 const struct i2c_device_id *id) 23 60 { ··· 68 31 69 32 gdata = iio_priv(indio_dev); 70 33 gdata->dev = &client->dev; 34 + st_sensors_of_i2c_probe(client, st_gyro_of_match); 71 35 72 36 st_sensors_i2c_configure(indio_dev, client, gdata); 73 37 ··· 103 65 .driver = { 104 66 .owner = THIS_MODULE, 105 67 .name = "st-gyro-i2c", 68 + .of_match_table = of_match_ptr(st_gyro_of_match), 106 69 }, 107 70 .probe = st_gyro_i2c_probe, 108 71 .remove = st_gyro_i2c_remove,
+1 -2
drivers/iio/imu/adis16400_buffer.c
··· 18 18 { 19 19 struct adis16400_state *st = iio_priv(indio_dev); 20 20 struct adis *adis = &st->adis; 21 - uint16_t *tx, *rx; 21 + uint16_t *tx; 22 22 23 23 if (st->variant->flags & ADIS16400_NO_BURST) 24 24 return adis_update_scan_mode(indio_dev, scan_mask); ··· 35 35 if (!adis->buffer) 36 36 return -ENOMEM; 37 37 38 - rx = adis->buffer; 39 38 tx = adis->buffer + indio_dev->scan_bytes; 40 39 41 40 tx[0] = ADIS_READ_REG(ADIS16400_GLOB_CMD);
+25 -53
drivers/iio/imu/adis16400_core.c
··· 214 214 return adis_write_reg_8(&st->adis, ADIS16400_SMPL_PRD, val); 215 215 } 216 216 217 - static ssize_t adis16400_read_frequency(struct device *dev, 218 - struct device_attribute *attr, 219 - char *buf) 220 - { 221 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 222 - struct adis16400_state *st = iio_priv(indio_dev); 223 - int ret; 224 - 225 - ret = st->variant->get_freq(st); 226 - if (ret < 0) 227 - return ret; 228 - 229 - return sprintf(buf, "%d.%.3d\n", ret / 1000, ret % 1000); 230 - } 231 - 232 217 static const unsigned adis16400_3db_divisors[] = { 233 218 [0] = 2, /* Special case */ 234 219 [1] = 6, ··· 243 258 ret = adis_write_reg_16(&st->adis, ADIS16400_SENS_AVG, 244 259 (val16 & ~0x07) | i); 245 260 return ret; 246 - } 247 - 248 - static ssize_t adis16400_write_frequency(struct device *dev, 249 - struct device_attribute *attr, const char *buf, size_t len) 250 - { 251 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 252 - struct adis16400_state *st = iio_priv(indio_dev); 253 - int i, f, val; 254 - int ret; 255 - 256 - ret = iio_str_to_fixpoint(buf, 100, &i, &f); 257 - if (ret) 258 - return ret; 259 - 260 - val = i * 1000 + f; 261 - 262 - if (val <= 0) 263 - return -EINVAL; 264 - 265 - mutex_lock(&indio_dev->mlock); 266 - st->variant->set_freq(st, val); 267 - mutex_unlock(&indio_dev->mlock); 268 - 269 - return len; 270 261 } 271 262 272 263 /* Power down the device */ ··· 311 350 return ret; 312 351 } 313 352 314 - static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 315 - adis16400_read_frequency, 316 - adis16400_write_frequency); 317 - 318 353 static const uint8_t adis16400_addresses[] = { 319 354 [ADIS16400_SCAN_GYRO_X] = ADIS16400_XGYRO_OFF, 320 355 [ADIS16400_SCAN_GYRO_Y] = ADIS16400_YGYRO_OFF, ··· 349 392 350 393 ret = adis16400_set_filter(indio_dev, sps, 351 394 val * 1000 + val2 / 1000); 395 + mutex_unlock(&indio_dev->mlock); 396 + return ret; 397 + case IIO_CHAN_INFO_SAMP_FREQ: 398 + sps = val * 1000 + val2 / 1000; 399 + 400 + if (sps <= 0) 401 + return -EINVAL; 402 + 403 + mutex_lock(&indio_dev->mlock); 404 + ret = st->variant->set_freq(st, sps); 352 405 mutex_unlock(&indio_dev->mlock); 353 406 return ret; 354 407 default: ··· 441 474 if (ret < 0) 442 475 return ret; 443 476 return IIO_VAL_INT_PLUS_MICRO; 477 + case IIO_CHAN_INFO_SAMP_FREQ: 478 + ret = st->variant->get_freq(st); 479 + if (ret < 0) 480 + return ret; 481 + *val = ret / 1000; 482 + *val2 = (ret % 1000) * 1000; 483 + return IIO_VAL_INT_PLUS_MICRO; 444 484 default: 445 485 return -EINVAL; 446 486 } ··· 460 486 .extend_name = name, \ 461 487 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 462 488 BIT(IIO_CHAN_INFO_SCALE), \ 489 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 463 490 .address = (addr), \ 464 491 .scan_index = (si), \ 465 492 .scan_type = { \ ··· 486 511 BIT(IIO_CHAN_INFO_CALIBBIAS), \ 487 512 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 488 513 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ 514 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 489 515 .address = addr, \ 490 516 .scan_index = ADIS16400_SCAN_GYRO_ ## mod, \ 491 517 .scan_type = { \ ··· 506 530 BIT(IIO_CHAN_INFO_CALIBBIAS), \ 507 531 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 508 532 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ 533 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 509 534 .address = (addr), \ 510 535 .scan_index = ADIS16400_SCAN_ACC_ ## mod, \ 511 536 .scan_type = { \ ··· 525 548 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 526 549 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 527 550 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ 551 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 528 552 .address = (addr), \ 529 553 .scan_index = ADIS16400_SCAN_MAGN_ ## mod, \ 530 554 .scan_type = { \ ··· 551 573 BIT(IIO_CHAN_INFO_SCALE), \ 552 574 .info_mask_shared_by_type = \ 553 575 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \ 576 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 554 577 .address = (addr), \ 555 578 .scan_index = ADIS16350_SCAN_TEMP_ ## mod, \ 556 579 .scan_type = { \ ··· 570 591 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 571 592 BIT(IIO_CHAN_INFO_OFFSET) | \ 572 593 BIT(IIO_CHAN_INFO_SCALE), \ 594 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 573 595 .address = (addr), \ 574 596 .scan_index = ADIS16350_SCAN_TEMP_X, \ 575 597 .scan_type = { \ ··· 588 608 .channel2 = IIO_MOD_ ## mod, \ 589 609 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 590 610 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 611 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 591 612 .address = (addr), \ 592 613 .scan_index = ADIS16300_SCAN_INCLI_ ## mod, \ 593 614 .scan_type = { \ ··· 630 649 .type = IIO_PRESSURE, 631 650 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), 632 651 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), 652 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), 633 653 .address = ADIS16448_BARO_OUT, 634 654 .scan_index = ADIS16400_SCAN_BARO, 635 655 .scan_type = { ··· 684 702 ADIS16400_ACCEL_CHAN(Z, ADIS16400_ZACCL_OUT, 14), 685 703 ADIS16400_TEMP_CHAN(ADIS16350_XTEMP_OUT, 12), 686 704 IIO_CHAN_SOFT_TIMESTAMP(ADIS16400_SCAN_TIMESTAMP), 687 - }; 688 - 689 - static struct attribute *adis16400_attributes[] = { 690 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 691 - NULL 692 - }; 693 - 694 - static const struct attribute_group adis16400_attribute_group = { 695 - .attrs = adis16400_attributes, 696 705 }; 697 706 698 707 static struct adis16400_chip_info adis16400_chips[] = { ··· 786 813 .driver_module = THIS_MODULE, 787 814 .read_raw = &adis16400_read_raw, 788 815 .write_raw = &adis16400_write_raw, 789 - .attrs = &adis16400_attribute_group, 790 816 .update_scan_mode = adis16400_update_scan_mode, 791 817 .debugfs_reg_access = adis_debugfs_reg_access, 792 818 };
+22 -60
drivers/iio/imu/adis16480.c
··· 257 257 258 258 #endif 259 259 260 - static int adis16480_set_freq(struct adis16480 *st, unsigned int freq) 260 + static int adis16480_set_freq(struct iio_dev *indio_dev, int val, int val2) 261 261 { 262 + struct adis16480 *st = iio_priv(indio_dev); 262 263 unsigned int t; 263 264 264 - t = 2460000 / freq; 265 + t = val * 1000 + val2 / 1000; 266 + if (t <= 0) 267 + return -EINVAL; 268 + 269 + t = 2460000 / t; 265 270 if (t > 2048) 266 271 t = 2048; 267 272 ··· 276 271 return adis_write_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, t); 277 272 } 278 273 279 - static int adis16480_get_freq(struct adis16480 *st, unsigned int *freq) 274 + static int adis16480_get_freq(struct iio_dev *indio_dev, int *val, int *val2) 280 275 { 276 + struct adis16480 *st = iio_priv(indio_dev); 281 277 uint16_t t; 282 278 int ret; 279 + unsigned freq; 283 280 284 281 ret = adis_read_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, &t); 285 282 if (ret < 0) 286 283 return ret; 287 284 288 - *freq = 2460000 / (t + 1); 285 + freq = 2460000 / (t + 1); 286 + *val = freq / 1000; 287 + *val2 = (freq % 1000) * 1000; 289 288 290 - return 0; 289 + return IIO_VAL_INT_PLUS_MICRO; 291 290 } 292 - 293 - static ssize_t adis16480_read_frequency(struct device *dev, 294 - struct device_attribute *attr, 295 - char *buf) 296 - { 297 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 298 - struct adis16480 *st = iio_priv(indio_dev); 299 - unsigned int freq; 300 - int ret; 301 - 302 - ret = adis16480_get_freq(st, &freq); 303 - if (ret < 0) 304 - return ret; 305 - 306 - return sprintf(buf, "%d.%.3d\n", freq / 1000, freq % 1000); 307 - } 308 - 309 - static ssize_t adis16480_write_frequency(struct device *dev, 310 - struct device_attribute *attr, 311 - const char *buf, 312 - size_t len) 313 - { 314 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 315 - struct adis16480 *st = iio_priv(indio_dev); 316 - int freq_int, freq_fract; 317 - long val; 318 - int ret; 319 - 320 - ret = iio_str_to_fixpoint(buf, 100, &freq_int, &freq_fract); 321 - if (ret) 322 - return ret; 323 - 324 - val = freq_int * 1000 + freq_fract; 325 - 326 - if (val <= 0) 327 - return -EINVAL; 328 - 329 - ret = adis16480_set_freq(st, val); 330 - 331 - return ret ? ret : len; 332 - } 333 - 334 - static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 335 - adis16480_read_frequency, 336 - adis16480_write_frequency); 337 291 338 292 enum { 339 293 ADIS16480_SCAN_GYRO_X, ··· 535 571 return adis16480_get_calibscale(indio_dev, chan, val); 536 572 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: 537 573 return adis16480_get_filter_freq(indio_dev, chan, val); 574 + case IIO_CHAN_INFO_SAMP_FREQ: 575 + return adis16480_get_freq(indio_dev, val, val2); 538 576 default: 539 577 return -EINVAL; 540 578 } ··· 552 586 return adis16480_set_calibscale(indio_dev, chan, val); 553 587 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: 554 588 return adis16480_set_filter_freq(indio_dev, chan, val); 589 + case IIO_CHAN_INFO_SAMP_FREQ: 590 + return adis16480_set_freq(indio_dev, val, val2); 591 + 555 592 default: 556 593 return -EINVAL; 557 594 } ··· 569 600 BIT(IIO_CHAN_INFO_CALIBBIAS) | \ 570 601 _info_sep, \ 571 602 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 603 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 572 604 .address = (_address), \ 573 605 .scan_index = (_si), \ 574 606 .scan_type = { \ ··· 608 638 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 609 639 BIT(IIO_CHAN_INFO_CALIBBIAS) | \ 610 640 BIT(IIO_CHAN_INFO_SCALE), \ 641 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 611 642 .address = ADIS16480_REG_BAROM_OUT, \ 612 643 .scan_index = ADIS16480_SCAN_BARO, \ 613 644 .scan_type = { \ ··· 626 655 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 627 656 BIT(IIO_CHAN_INFO_SCALE) | \ 628 657 BIT(IIO_CHAN_INFO_OFFSET), \ 658 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 629 659 .address = ADIS16480_REG_TEMP_OUT, \ 630 660 .scan_index = ADIS16480_SCAN_TEMP, \ 631 661 .scan_type = { \ ··· 689 717 }, 690 718 }; 691 719 692 - static struct attribute *adis16480_attributes[] = { 693 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 694 - NULL 695 - }; 696 - 697 - static const struct attribute_group adis16480_attribute_group = { 698 - .attrs = adis16480_attributes, 699 - }; 700 - 701 720 static const struct iio_info adis16480_info = { 702 - .attrs = &adis16480_attribute_group, 703 721 .read_raw = &adis16480_read_raw, 704 722 .write_raw = &adis16480_write_raw, 705 723 .update_scan_mode = adis_update_scan_mode,
+1
drivers/iio/industrialio-event.c
··· 209 209 [IIO_EV_INFO_ENABLE] = "en", 210 210 [IIO_EV_INFO_VALUE] = "value", 211 211 [IIO_EV_INFO_HYSTERESIS] = "hysteresis", 212 + [IIO_EV_INFO_PERIOD] = "period", 212 213 }; 213 214 214 215 static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr)
+24
drivers/iio/light/Kconfig
··· 62 62 To compile this driver as a module, choose M here: the 63 63 module will be called gp2ap020a00f. 64 64 65 + config ISL29125 66 + tristate "Intersil ISL29125 digital color light sensor" 67 + depends on I2C 68 + select IIO_BUFFER 69 + select IIO_TRIGGERED_BUFFER 70 + help 71 + Say Y here if you want to build a driver for the Intersil ISL29125 72 + RGB light sensor for I2C. 73 + 74 + To compile this driver as a module, choose M here: the module will be 75 + called isl29125. 76 + 65 77 config HID_SENSOR_ALS 66 78 depends on HID_SENSOR_HUB 67 79 select IIO_BUFFER ··· 127 115 128 116 This driver can also be built as a module. If so, the module 129 117 will be called ltr501. 118 + 119 + config TCS3414 120 + tristate "TAOS TCS3414 digital color sensor" 121 + depends on I2C 122 + select IIO_BUFFER 123 + select IIO_TRIGGERED_BUFFER 124 + help 125 + If you say yes here you get support for the TAOS TCS3414 126 + family of digital color sensors. 127 + 128 + This driver can also be built as a module. If so, the module 129 + will be called tcs3414. 130 130 131 131 config TCS3472 132 132 tristate "TAOS TCS3472 color light-to-digital converter"
+2
drivers/iio/light/Makefile
··· 10 10 obj-$(CONFIG_GP2AP020A00F) += gp2ap020a00f.o 11 11 obj-$(CONFIG_HID_SENSOR_ALS) += hid-sensor-als.o 12 12 obj-$(CONFIG_HID_SENSOR_PROX) += hid-sensor-prox.o 13 + obj-$(CONFIG_ISL29125) += isl29125.o 13 14 obj-$(CONFIG_SENSORS_LM3533) += lm3533-als.o 14 15 obj-$(CONFIG_LTR501) += ltr501.o 15 16 obj-$(CONFIG_SENSORS_TSL2563) += tsl2563.o 17 + obj-$(CONFIG_TCS3414) += tcs3414.o 16 18 obj-$(CONFIG_TCS3472) += tcs3472.o 17 19 obj-$(CONFIG_TSL4531) += tsl4531.o 18 20 obj-$(CONFIG_VCNL4000) += vcnl4000.o
+347
drivers/iio/light/isl29125.c
··· 1 + /* 2 + * isl29125.c - Support for Intersil ISL29125 RGB light sensor 3 + * 4 + * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> 5 + * 6 + * This file is subject to the terms and conditions of version 2 of 7 + * the GNU General Public License. See the file COPYING in the main 8 + * directory of this archive for more details. 9 + * 10 + * RGB light sensor with 16-bit channels for red, green, blue); 11 + * 7-bit I2C slave address 0x44 12 + * 13 + * TODO: interrupt support, IR compensation, thresholds, 12bit 14 + */ 15 + 16 + #include <linux/module.h> 17 + #include <linux/i2c.h> 18 + #include <linux/delay.h> 19 + #include <linux/pm.h> 20 + 21 + #include <linux/iio/iio.h> 22 + #include <linux/iio/sysfs.h> 23 + #include <linux/iio/trigger_consumer.h> 24 + #include <linux/iio/buffer.h> 25 + #include <linux/iio/triggered_buffer.h> 26 + 27 + #define ISL29125_DRV_NAME "isl29125" 28 + 29 + #define ISL29125_DEVICE_ID 0x00 30 + #define ISL29125_CONF1 0x01 31 + #define ISL29125_CONF2 0x02 32 + #define ISL29125_CONF3 0x03 33 + #define ISL29125_STATUS 0x08 34 + #define ISL29125_GREEN_DATA 0x09 35 + #define ISL29125_RED_DATA 0x0b 36 + #define ISL29125_BLUE_DATA 0x0d 37 + 38 + #define ISL29125_ID 0x7d 39 + 40 + #define ISL29125_MODE_MASK GENMASK(2, 0) 41 + #define ISL29125_MODE_PD 0x0 42 + #define ISL29125_MODE_G 0x1 43 + #define ISL29125_MODE_R 0x2 44 + #define ISL29125_MODE_B 0x3 45 + #define ISL29125_MODE_RGB 0x5 46 + 47 + #define ISL29125_MODE_RANGE BIT(3) 48 + 49 + #define ISL29125_STATUS_CONV BIT(1) 50 + 51 + struct isl29125_data { 52 + struct i2c_client *client; 53 + struct mutex lock; 54 + u8 conf1; 55 + u16 buffer[8]; /* 3x 16-bit, padding, 8 bytes timestamp */ 56 + }; 57 + 58 + #define ISL29125_CHANNEL(_color, _si) { \ 59 + .type = IIO_INTENSITY, \ 60 + .modified = 1, \ 61 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 62 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 63 + .channel2 = IIO_MOD_LIGHT_##_color, \ 64 + .scan_index = _si, \ 65 + .scan_type = { \ 66 + .sign = 'u', \ 67 + .realbits = 16, \ 68 + .storagebits = 16, \ 69 + .endianness = IIO_CPU, \ 70 + }, \ 71 + } 72 + 73 + static const struct iio_chan_spec isl29125_channels[] = { 74 + ISL29125_CHANNEL(GREEN, 0), 75 + ISL29125_CHANNEL(RED, 1), 76 + ISL29125_CHANNEL(BLUE, 2), 77 + IIO_CHAN_SOFT_TIMESTAMP(3), 78 + }; 79 + 80 + static const struct { 81 + u8 mode, data; 82 + } isl29125_regs[] = { 83 + {ISL29125_MODE_G, ISL29125_GREEN_DATA}, 84 + {ISL29125_MODE_R, ISL29125_RED_DATA}, 85 + {ISL29125_MODE_B, ISL29125_BLUE_DATA}, 86 + }; 87 + 88 + static int isl29125_read_data(struct isl29125_data *data, int si) 89 + { 90 + int tries = 5; 91 + int ret; 92 + 93 + ret = i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 94 + data->conf1 | isl29125_regs[si].mode); 95 + if (ret < 0) 96 + return ret; 97 + 98 + msleep(101); 99 + 100 + while (tries--) { 101 + ret = i2c_smbus_read_byte_data(data->client, ISL29125_STATUS); 102 + if (ret < 0) 103 + goto fail; 104 + if (ret & ISL29125_STATUS_CONV) 105 + break; 106 + msleep(20); 107 + } 108 + 109 + if (tries < 0) { 110 + dev_err(&data->client->dev, "data not ready\n"); 111 + ret = -EIO; 112 + goto fail; 113 + } 114 + 115 + ret = i2c_smbus_read_word_data(data->client, isl29125_regs[si].data); 116 + 117 + fail: 118 + i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, data->conf1); 119 + return ret; 120 + } 121 + 122 + static int isl29125_read_raw(struct iio_dev *indio_dev, 123 + struct iio_chan_spec const *chan, 124 + int *val, int *val2, long mask) 125 + { 126 + struct isl29125_data *data = iio_priv(indio_dev); 127 + int ret; 128 + 129 + switch (mask) { 130 + case IIO_CHAN_INFO_RAW: 131 + if (iio_buffer_enabled(indio_dev)) 132 + return -EBUSY; 133 + mutex_lock(&data->lock); 134 + ret = isl29125_read_data(data, chan->scan_index); 135 + mutex_unlock(&data->lock); 136 + if (ret < 0) 137 + return ret; 138 + *val = ret; 139 + return IIO_VAL_INT; 140 + case IIO_CHAN_INFO_SCALE: 141 + *val = 0; 142 + if (data->conf1 & ISL29125_MODE_RANGE) 143 + *val2 = 152590; /* 10k lux full range */ 144 + else 145 + *val2 = 5722; /* 375 lux full range */ 146 + return IIO_VAL_INT_PLUS_MICRO; 147 + } 148 + return -EINVAL; 149 + } 150 + 151 + static int isl29125_write_raw(struct iio_dev *indio_dev, 152 + struct iio_chan_spec const *chan, 153 + int val, int val2, long mask) 154 + { 155 + struct isl29125_data *data = iio_priv(indio_dev); 156 + 157 + switch (mask) { 158 + case IIO_CHAN_INFO_SCALE: 159 + if (val != 0) 160 + return -EINVAL; 161 + if (val2 == 152590) 162 + data->conf1 |= ISL29125_MODE_RANGE; 163 + else if (val2 == 5722) 164 + data->conf1 &= ~ISL29125_MODE_RANGE; 165 + else 166 + return -EINVAL; 167 + return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 168 + data->conf1); 169 + default: 170 + return -EINVAL; 171 + } 172 + } 173 + 174 + static irqreturn_t isl29125_trigger_handler(int irq, void *p) 175 + { 176 + struct iio_poll_func *pf = p; 177 + struct iio_dev *indio_dev = pf->indio_dev; 178 + struct isl29125_data *data = iio_priv(indio_dev); 179 + int i, j = 0; 180 + 181 + for_each_set_bit(i, indio_dev->active_scan_mask, 182 + indio_dev->masklength) { 183 + int ret = i2c_smbus_read_word_data(data->client, 184 + isl29125_regs[i].data); 185 + if (ret < 0) 186 + goto done; 187 + 188 + data->buffer[j++] = ret; 189 + } 190 + 191 + iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 192 + iio_get_time_ns()); 193 + 194 + done: 195 + iio_trigger_notify_done(indio_dev->trig); 196 + 197 + return IRQ_HANDLED; 198 + } 199 + 200 + static const struct iio_info isl29125_info = { 201 + .read_raw = isl29125_read_raw, 202 + .write_raw = isl29125_write_raw, 203 + .driver_module = THIS_MODULE, 204 + }; 205 + 206 + static int isl29125_buffer_preenable(struct iio_dev *indio_dev) 207 + { 208 + struct isl29125_data *data = iio_priv(indio_dev); 209 + 210 + data->conf1 |= ISL29125_MODE_RGB; 211 + return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 212 + data->conf1); 213 + } 214 + 215 + static int isl29125_buffer_predisable(struct iio_dev *indio_dev) 216 + { 217 + struct isl29125_data *data = iio_priv(indio_dev); 218 + int ret; 219 + 220 + ret = iio_triggered_buffer_predisable(indio_dev); 221 + if (ret < 0) 222 + return ret; 223 + 224 + data->conf1 &= ~ISL29125_MODE_MASK; 225 + data->conf1 |= ISL29125_MODE_PD; 226 + return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 227 + data->conf1); 228 + } 229 + 230 + static const struct iio_buffer_setup_ops isl29125_buffer_setup_ops = { 231 + .preenable = isl29125_buffer_preenable, 232 + .postenable = &iio_triggered_buffer_postenable, 233 + .predisable = isl29125_buffer_predisable, 234 + }; 235 + 236 + static int isl29125_probe(struct i2c_client *client, 237 + const struct i2c_device_id *id) 238 + { 239 + struct isl29125_data *data; 240 + struct iio_dev *indio_dev; 241 + int ret; 242 + 243 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 244 + if (indio_dev == NULL) 245 + return -ENOMEM; 246 + 247 + data = iio_priv(indio_dev); 248 + i2c_set_clientdata(client, indio_dev); 249 + data->client = client; 250 + mutex_init(&data->lock); 251 + 252 + indio_dev->dev.parent = &client->dev; 253 + indio_dev->info = &isl29125_info; 254 + indio_dev->name = ISL29125_DRV_NAME; 255 + indio_dev->channels = isl29125_channels; 256 + indio_dev->num_channels = ARRAY_SIZE(isl29125_channels); 257 + indio_dev->modes = INDIO_DIRECT_MODE; 258 + 259 + ret = i2c_smbus_read_byte_data(data->client, ISL29125_DEVICE_ID); 260 + if (ret < 0) 261 + return ret; 262 + if (ret != ISL29125_ID) 263 + return -ENODEV; 264 + 265 + data->conf1 = ISL29125_MODE_PD | ISL29125_MODE_RANGE; 266 + ret = i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 267 + data->conf1); 268 + if (ret < 0) 269 + return ret; 270 + 271 + ret = i2c_smbus_write_byte_data(data->client, ISL29125_STATUS, 0); 272 + if (ret < 0) 273 + return ret; 274 + 275 + ret = iio_triggered_buffer_setup(indio_dev, NULL, 276 + isl29125_trigger_handler, &isl29125_buffer_setup_ops); 277 + if (ret < 0) 278 + return ret; 279 + 280 + ret = iio_device_register(indio_dev); 281 + if (ret < 0) 282 + goto buffer_cleanup; 283 + 284 + return 0; 285 + 286 + buffer_cleanup: 287 + iio_triggered_buffer_cleanup(indio_dev); 288 + return ret; 289 + } 290 + 291 + static int isl29125_powerdown(struct isl29125_data *data) 292 + { 293 + return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 294 + (data->conf1 & ~ISL29125_MODE_MASK) | ISL29125_MODE_PD); 295 + } 296 + 297 + static int isl29125_remove(struct i2c_client *client) 298 + { 299 + struct iio_dev *indio_dev = i2c_get_clientdata(client); 300 + 301 + iio_device_unregister(indio_dev); 302 + iio_triggered_buffer_cleanup(indio_dev); 303 + isl29125_powerdown(iio_priv(indio_dev)); 304 + 305 + return 0; 306 + } 307 + 308 + #ifdef CONFIG_PM_SLEEP 309 + static int isl29125_suspend(struct device *dev) 310 + { 311 + struct isl29125_data *data = iio_priv(i2c_get_clientdata( 312 + to_i2c_client(dev))); 313 + return isl29125_powerdown(data); 314 + } 315 + 316 + static int isl29125_resume(struct device *dev) 317 + { 318 + struct isl29125_data *data = iio_priv(i2c_get_clientdata( 319 + to_i2c_client(dev))); 320 + return i2c_smbus_write_byte_data(data->client, ISL29125_CONF1, 321 + data->conf1); 322 + } 323 + #endif 324 + 325 + static SIMPLE_DEV_PM_OPS(isl29125_pm_ops, isl29125_suspend, isl29125_resume); 326 + 327 + static const struct i2c_device_id isl29125_id[] = { 328 + { "isl29125", 0 }, 329 + { } 330 + }; 331 + MODULE_DEVICE_TABLE(i2c, isl29125_id); 332 + 333 + static struct i2c_driver isl29125_driver = { 334 + .driver = { 335 + .name = ISL29125_DRV_NAME, 336 + .pm = &isl29125_pm_ops, 337 + .owner = THIS_MODULE, 338 + }, 339 + .probe = isl29125_probe, 340 + .remove = isl29125_remove, 341 + .id_table = isl29125_id, 342 + }; 343 + module_i2c_driver(isl29125_driver); 344 + 345 + MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 346 + MODULE_DESCRIPTION("ISL29125 RGB light sensor driver"); 347 + MODULE_LICENSE("GPL");
+405
drivers/iio/light/tcs3414.c
··· 1 + /* 2 + * tcs3414.c - Support for TAOS TCS3414 digital color sensor 3 + * 4 + * Copyright (c) 2014 Peter Meerwald <pmeerw@pmeerw.net> 5 + * 6 + * This file is subject to the terms and conditions of version 2 of 7 + * the GNU General Public License. See the file COPYING in the main 8 + * directory of this archive for more details. 9 + * 10 + * Digital color sensor with 16-bit channels for red, green, blue, clear); 11 + * 7-bit I2C slave address 0x39 (TCS3414) or 0x29, 0x49, 0x59 (TCS3413, 12 + * TCS3415, TCS3416, resp.) 13 + * 14 + * TODO: sync, interrupt support, thresholds, prescaler 15 + */ 16 + 17 + #include <linux/module.h> 18 + #include <linux/i2c.h> 19 + #include <linux/delay.h> 20 + #include <linux/pm.h> 21 + 22 + #include <linux/iio/iio.h> 23 + #include <linux/iio/sysfs.h> 24 + #include <linux/iio/trigger_consumer.h> 25 + #include <linux/iio/buffer.h> 26 + #include <linux/iio/triggered_buffer.h> 27 + 28 + #define TCS3414_DRV_NAME "tcs3414" 29 + 30 + #define TCS3414_COMMAND BIT(7) 31 + #define TCS3414_COMMAND_WORD (TCS3414_COMMAND | BIT(5)) 32 + 33 + #define TCS3414_CONTROL (TCS3414_COMMAND | 0x00) 34 + #define TCS3414_TIMING (TCS3414_COMMAND | 0x01) 35 + #define TCS3414_ID (TCS3414_COMMAND | 0x04) 36 + #define TCS3414_GAIN (TCS3414_COMMAND | 0x07) 37 + #define TCS3414_DATA_GREEN (TCS3414_COMMAND_WORD | 0x10) 38 + #define TCS3414_DATA_RED (TCS3414_COMMAND_WORD | 0x12) 39 + #define TCS3414_DATA_BLUE (TCS3414_COMMAND_WORD | 0x14) 40 + #define TCS3414_DATA_CLEAR (TCS3414_COMMAND_WORD | 0x16) 41 + 42 + #define TCS3414_CONTROL_ADC_VALID BIT(4) 43 + #define TCS3414_CONTROL_ADC_EN BIT(1) 44 + #define TCS3414_CONTROL_POWER BIT(0) 45 + 46 + #define TCS3414_INTEG_MASK GENMASK(1, 0) 47 + #define TCS3414_INTEG_12MS 0x0 48 + #define TCS3414_INTEG_100MS 0x1 49 + #define TCS3414_INTEG_400MS 0x2 50 + 51 + #define TCS3414_GAIN_MASK GENMASK(5, 4) 52 + #define TCS3414_GAIN_SHIFT 4 53 + 54 + struct tcs3414_data { 55 + struct i2c_client *client; 56 + struct mutex lock; 57 + u8 control; 58 + u8 gain; 59 + u8 timing; 60 + u16 buffer[8]; /* 4x 16-bit + 8 bytes timestamp */ 61 + }; 62 + 63 + #define TCS3414_CHANNEL(_color, _si, _addr) { \ 64 + .type = IIO_INTENSITY, \ 65 + .modified = 1, \ 66 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ 67 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ 68 + BIT(IIO_CHAN_INFO_INT_TIME), \ 69 + .channel2 = IIO_MOD_LIGHT_##_color, \ 70 + .address = _addr, \ 71 + .scan_index = _si, \ 72 + .scan_type = { \ 73 + .sign = 'u', \ 74 + .realbits = 16, \ 75 + .storagebits = 16, \ 76 + .endianness = IIO_CPU, \ 77 + }, \ 78 + } 79 + 80 + /* scale factors: 1/gain */ 81 + static const int tcs3414_scales[][2] = { 82 + {1, 0}, {0, 250000}, {0, 62500}, {0, 15625} 83 + }; 84 + 85 + /* integration time in ms */ 86 + static const int tcs3414_times[] = { 12, 100, 400 }; 87 + 88 + static const struct iio_chan_spec tcs3414_channels[] = { 89 + TCS3414_CHANNEL(GREEN, 0, TCS3414_DATA_GREEN), 90 + TCS3414_CHANNEL(RED, 1, TCS3414_DATA_RED), 91 + TCS3414_CHANNEL(BLUE, 2, TCS3414_DATA_BLUE), 92 + TCS3414_CHANNEL(CLEAR, 3, TCS3414_DATA_CLEAR), 93 + IIO_CHAN_SOFT_TIMESTAMP(4), 94 + }; 95 + 96 + static int tcs3414_req_data(struct tcs3414_data *data) 97 + { 98 + int tries = 25; 99 + int ret; 100 + 101 + ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 102 + data->control | TCS3414_CONTROL_ADC_EN); 103 + if (ret < 0) 104 + return ret; 105 + 106 + while (tries--) { 107 + ret = i2c_smbus_read_byte_data(data->client, TCS3414_CONTROL); 108 + if (ret < 0) 109 + return ret; 110 + if (ret & TCS3414_CONTROL_ADC_VALID) 111 + break; 112 + msleep(20); 113 + } 114 + 115 + ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 116 + data->control); 117 + if (ret < 0) 118 + return ret; 119 + 120 + if (tries < 0) { 121 + dev_err(&data->client->dev, "data not ready\n"); 122 + return -EIO; 123 + } 124 + 125 + return 0; 126 + } 127 + 128 + static int tcs3414_read_raw(struct iio_dev *indio_dev, 129 + struct iio_chan_spec const *chan, 130 + int *val, int *val2, long mask) 131 + { 132 + struct tcs3414_data *data = iio_priv(indio_dev); 133 + int i, ret; 134 + 135 + switch (mask) { 136 + case IIO_CHAN_INFO_RAW: 137 + if (iio_buffer_enabled(indio_dev)) 138 + return -EBUSY; 139 + mutex_lock(&data->lock); 140 + ret = tcs3414_req_data(data); 141 + if (ret < 0) { 142 + mutex_unlock(&data->lock); 143 + return ret; 144 + } 145 + ret = i2c_smbus_read_word_data(data->client, chan->address); 146 + mutex_unlock(&data->lock); 147 + if (ret < 0) 148 + return ret; 149 + *val = ret; 150 + return IIO_VAL_INT; 151 + case IIO_CHAN_INFO_SCALE: 152 + i = (data->gain & TCS3414_GAIN_MASK) >> TCS3414_GAIN_SHIFT; 153 + *val = tcs3414_scales[i][0]; 154 + *val2 = tcs3414_scales[i][1]; 155 + return IIO_VAL_INT_PLUS_MICRO; 156 + case IIO_CHAN_INFO_INT_TIME: 157 + *val = 0; 158 + *val2 = tcs3414_times[data->timing & TCS3414_INTEG_MASK] * 1000; 159 + return IIO_VAL_INT_PLUS_MICRO; 160 + } 161 + return -EINVAL; 162 + } 163 + 164 + static int tcs3414_write_raw(struct iio_dev *indio_dev, 165 + struct iio_chan_spec const *chan, 166 + int val, int val2, long mask) 167 + { 168 + struct tcs3414_data *data = iio_priv(indio_dev); 169 + int i; 170 + 171 + switch (mask) { 172 + case IIO_CHAN_INFO_SCALE: 173 + for (i = 0; i < ARRAY_SIZE(tcs3414_scales); i++) { 174 + if (val == tcs3414_scales[i][0] && 175 + val2 == tcs3414_scales[i][1]) { 176 + data->gain &= ~TCS3414_GAIN_MASK; 177 + data->gain |= i << TCS3414_GAIN_SHIFT; 178 + return i2c_smbus_write_byte_data( 179 + data->client, TCS3414_GAIN, 180 + data->gain); 181 + } 182 + } 183 + return -EINVAL; 184 + case IIO_CHAN_INFO_INT_TIME: 185 + if (val != 0) 186 + return -EINVAL; 187 + for (i = 0; i < ARRAY_SIZE(tcs3414_times); i++) { 188 + if (val == tcs3414_times[i] * 1000) { 189 + data->timing &= ~TCS3414_INTEG_MASK; 190 + data->timing |= i; 191 + return i2c_smbus_write_byte_data( 192 + data->client, TCS3414_TIMING, 193 + data->timing); 194 + } 195 + } 196 + return -EINVAL; 197 + default: 198 + return -EINVAL; 199 + } 200 + } 201 + 202 + static irqreturn_t tcs3414_trigger_handler(int irq, void *p) 203 + { 204 + struct iio_poll_func *pf = p; 205 + struct iio_dev *indio_dev = pf->indio_dev; 206 + struct tcs3414_data *data = iio_priv(indio_dev); 207 + int i, j = 0; 208 + 209 + for_each_set_bit(i, indio_dev->active_scan_mask, 210 + indio_dev->masklength) { 211 + int ret = i2c_smbus_read_word_data(data->client, 212 + TCS3414_DATA_GREEN + 2*i); 213 + if (ret < 0) 214 + goto done; 215 + 216 + data->buffer[j++] = ret; 217 + } 218 + 219 + iio_push_to_buffers_with_timestamp(indio_dev, data->buffer, 220 + iio_get_time_ns()); 221 + 222 + done: 223 + iio_trigger_notify_done(indio_dev->trig); 224 + 225 + return IRQ_HANDLED; 226 + } 227 + 228 + static IIO_CONST_ATTR(scale_available, "1 0.25 0.0625 0.015625"); 229 + static IIO_CONST_ATTR_INT_TIME_AVAIL("0.012 0.1 0.4"); 230 + 231 + static struct attribute *tcs3414_attributes[] = { 232 + &iio_const_attr_scale_available.dev_attr.attr, 233 + &iio_const_attr_integration_time_available.dev_attr.attr, 234 + NULL 235 + }; 236 + 237 + static const struct attribute_group tcs3414_attribute_group = { 238 + .attrs = tcs3414_attributes, 239 + }; 240 + 241 + static const struct iio_info tcs3414_info = { 242 + .read_raw = tcs3414_read_raw, 243 + .write_raw = tcs3414_write_raw, 244 + .attrs = &tcs3414_attribute_group, 245 + .driver_module = THIS_MODULE, 246 + }; 247 + 248 + static int tcs3414_buffer_preenable(struct iio_dev *indio_dev) 249 + { 250 + struct tcs3414_data *data = iio_priv(indio_dev); 251 + 252 + data->control |= TCS3414_CONTROL_ADC_EN; 253 + return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 254 + data->control); 255 + } 256 + 257 + static int tcs3414_buffer_predisable(struct iio_dev *indio_dev) 258 + { 259 + struct tcs3414_data *data = iio_priv(indio_dev); 260 + int ret; 261 + 262 + ret = iio_triggered_buffer_predisable(indio_dev); 263 + if (ret < 0) 264 + return ret; 265 + 266 + data->control &= ~TCS3414_CONTROL_ADC_EN; 267 + return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 268 + data->control); 269 + } 270 + 271 + static const struct iio_buffer_setup_ops tcs3414_buffer_setup_ops = { 272 + .preenable = tcs3414_buffer_preenable, 273 + .postenable = &iio_triggered_buffer_postenable, 274 + .predisable = tcs3414_buffer_predisable, 275 + }; 276 + 277 + static int tcs3414_probe(struct i2c_client *client, 278 + const struct i2c_device_id *id) 279 + { 280 + struct tcs3414_data *data; 281 + struct iio_dev *indio_dev; 282 + int ret; 283 + 284 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 285 + if (indio_dev == NULL) 286 + return -ENOMEM; 287 + 288 + data = iio_priv(indio_dev); 289 + i2c_set_clientdata(client, indio_dev); 290 + data->client = client; 291 + mutex_init(&data->lock); 292 + 293 + indio_dev->dev.parent = &client->dev; 294 + indio_dev->info = &tcs3414_info; 295 + indio_dev->name = TCS3414_DRV_NAME; 296 + indio_dev->channels = tcs3414_channels; 297 + indio_dev->num_channels = ARRAY_SIZE(tcs3414_channels); 298 + indio_dev->modes = INDIO_DIRECT_MODE; 299 + 300 + ret = i2c_smbus_read_byte_data(data->client, TCS3414_ID); 301 + if (ret < 0) 302 + return ret; 303 + 304 + switch (ret & 0xf0) { 305 + case 0x00: 306 + dev_info(&client->dev, "TCS3404 found\n"); 307 + break; 308 + case 0x10: 309 + dev_info(&client->dev, "TCS3413/14/15/16 found\n"); 310 + break; 311 + default: 312 + return -ENODEV; 313 + } 314 + 315 + data->control = TCS3414_CONTROL_POWER; 316 + ret = i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 317 + data->control); 318 + if (ret < 0) 319 + return ret; 320 + 321 + data->timing = TCS3414_INTEG_12MS; /* free running */ 322 + ret = i2c_smbus_write_byte_data(data->client, TCS3414_TIMING, 323 + data->timing); 324 + if (ret < 0) 325 + return ret; 326 + 327 + ret = i2c_smbus_read_byte_data(data->client, TCS3414_GAIN); 328 + if (ret < 0) 329 + return ret; 330 + data->gain = ret; 331 + 332 + ret = iio_triggered_buffer_setup(indio_dev, NULL, 333 + tcs3414_trigger_handler, &tcs3414_buffer_setup_ops); 334 + if (ret < 0) 335 + return ret; 336 + 337 + ret = iio_device_register(indio_dev); 338 + if (ret < 0) 339 + goto buffer_cleanup; 340 + 341 + return 0; 342 + 343 + buffer_cleanup: 344 + iio_triggered_buffer_cleanup(indio_dev); 345 + return ret; 346 + } 347 + 348 + static int tcs3414_powerdown(struct tcs3414_data *data) 349 + { 350 + return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 351 + data->control & ~(TCS3414_CONTROL_POWER | 352 + TCS3414_CONTROL_ADC_EN)); 353 + } 354 + 355 + static int tcs3414_remove(struct i2c_client *client) 356 + { 357 + struct iio_dev *indio_dev = i2c_get_clientdata(client); 358 + 359 + iio_device_unregister(indio_dev); 360 + iio_triggered_buffer_cleanup(indio_dev); 361 + tcs3414_powerdown(iio_priv(indio_dev)); 362 + 363 + return 0; 364 + } 365 + 366 + #ifdef CONFIG_PM_SLEEP 367 + static int tcs3414_suspend(struct device *dev) 368 + { 369 + struct tcs3414_data *data = iio_priv(i2c_get_clientdata( 370 + to_i2c_client(dev))); 371 + return tcs3414_powerdown(data); 372 + } 373 + 374 + static int tcs3414_resume(struct device *dev) 375 + { 376 + struct tcs3414_data *data = iio_priv(i2c_get_clientdata( 377 + to_i2c_client(dev))); 378 + return i2c_smbus_write_byte_data(data->client, TCS3414_CONTROL, 379 + data->control); 380 + } 381 + #endif 382 + 383 + static SIMPLE_DEV_PM_OPS(tcs3414_pm_ops, tcs3414_suspend, tcs3414_resume); 384 + 385 + static const struct i2c_device_id tcs3414_id[] = { 386 + { "tcs3414", 0 }, 387 + { } 388 + }; 389 + MODULE_DEVICE_TABLE(i2c, tcs3414_id); 390 + 391 + static struct i2c_driver tcs3414_driver = { 392 + .driver = { 393 + .name = TCS3414_DRV_NAME, 394 + .pm = &tcs3414_pm_ops, 395 + .owner = THIS_MODULE, 396 + }, 397 + .probe = tcs3414_probe, 398 + .remove = tcs3414_remove, 399 + .id_table = tcs3414_id, 400 + }; 401 + module_i2c_driver(tcs3414_driver); 402 + 403 + MODULE_AUTHOR("Peter Meerwald <pmeerw@pmeerw.net>"); 404 + MODULE_DESCRIPTION("TCS3414 digital color sensors driver"); 405 + MODULE_LICENSE("GPL");
+10 -2
drivers/iio/magnetometer/st_magn_core.c
··· 299 299 else 300 300 *val2 = mdata->current_fullscale->gain; 301 301 return IIO_VAL_INT_PLUS_MICRO; 302 + case IIO_CHAN_INFO_SAMP_FREQ: 303 + *val = mdata->odr; 304 + return IIO_VAL_INT; 302 305 default: 303 306 return -EINVAL; 304 307 } ··· 319 316 case IIO_CHAN_INFO_SCALE: 320 317 err = st_sensors_set_fullscale_by_gain(indio_dev, val2); 321 318 break; 319 + case IIO_CHAN_INFO_SAMP_FREQ: 320 + if (val2) 321 + return -EINVAL; 322 + mutex_lock(&indio_dev->mlock); 323 + err = st_sensors_set_odr(indio_dev, val); 324 + mutex_unlock(&indio_dev->mlock); 325 + return err; 322 326 default: 323 327 err = -EINVAL; 324 328 } ··· 333 323 return err; 334 324 } 335 325 336 - static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); 337 326 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); 338 327 static ST_SENSORS_DEV_ATTR_SCALE_AVAIL(in_magn_scale_available); 339 328 340 329 static struct attribute *st_magn_attributes[] = { 341 330 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 342 331 &iio_dev_attr_in_magn_scale_available.dev_attr.attr, 343 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 344 332 NULL, 345 333 }; 346 334
+23
drivers/iio/magnetometer/st_magn_i2c.c
··· 18 18 #include <linux/iio/common/st_sensors_i2c.h> 19 19 #include "st_magn.h" 20 20 21 + #ifdef CONFIG_OF 22 + static const struct of_device_id st_magn_of_match[] = { 23 + { 24 + .compatible = "st,lsm303dlhc-magn", 25 + .data = LSM303DLHC_MAGN_DEV_NAME, 26 + }, 27 + { 28 + .compatible = "st,lsm303dlm-magn", 29 + .data = LSM303DLM_MAGN_DEV_NAME, 30 + }, 31 + { 32 + .compatible = "st,lis3mdl-magn", 33 + .data = LIS3MDL_MAGN_DEV_NAME, 34 + }, 35 + {}, 36 + }; 37 + MODULE_DEVICE_TABLE(of, st_magn_of_match); 38 + #else 39 + #define st_magn_of_match NULL 40 + #endif 41 + 21 42 static int st_magn_i2c_probe(struct i2c_client *client, 22 43 const struct i2c_device_id *id) 23 44 { ··· 52 31 53 32 mdata = iio_priv(indio_dev); 54 33 mdata->dev = &client->dev; 34 + st_sensors_of_i2c_probe(client, st_magn_of_match); 55 35 56 36 st_sensors_i2c_configure(indio_dev, client, mdata); 57 37 ··· 83 61 .driver = { 84 62 .owner = THIS_MODULE, 85 63 .name = "st-magn-i2c", 64 + .of_match_table = of_match_ptr(st_magn_of_match), 86 65 }, 87 66 .probe = st_magn_i2c_probe, 88 67 .remove = st_magn_i2c_remove,
+25 -2
drivers/iio/pressure/st_pressure_core.c
··· 307 307 }, 308 308 }; 309 309 310 + static int st_press_write_raw(struct iio_dev *indio_dev, 311 + struct iio_chan_spec const *ch, 312 + int val, 313 + int val2, 314 + long mask) 315 + { 316 + int err; 317 + 318 + switch (mask) { 319 + case IIO_CHAN_INFO_SAMP_FREQ: 320 + if (val2) 321 + return -EINVAL; 322 + mutex_lock(&indio_dev->mlock); 323 + err = st_sensors_set_odr(indio_dev, val); 324 + mutex_unlock(&indio_dev->mlock); 325 + return err; 326 + default: 327 + return -EINVAL; 328 + } 329 + } 330 + 310 331 static int st_press_read_raw(struct iio_dev *indio_dev, 311 332 struct iio_chan_spec const *ch, int *val, 312 333 int *val2, long mask) ··· 370 349 } 371 350 372 351 return IIO_VAL_FRACTIONAL; 352 + case IIO_CHAN_INFO_SAMP_FREQ: 353 + *val = pdata->odr; 354 + return IIO_VAL_INT; 373 355 default: 374 356 return -EINVAL; 375 357 } ··· 381 357 return err; 382 358 } 383 359 384 - static ST_SENSOR_DEV_ATTR_SAMP_FREQ(); 385 360 static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL(); 386 361 387 362 static struct attribute *st_press_attributes[] = { 388 363 &iio_dev_attr_sampling_frequency_available.dev_attr.attr, 389 - &iio_dev_attr_sampling_frequency.dev_attr.attr, 390 364 NULL, 391 365 }; 392 366 ··· 396 374 .driver_module = THIS_MODULE, 397 375 .attrs = &st_press_attribute_group, 398 376 .read_raw = &st_press_read_raw, 377 + .write_raw = &st_press_write_raw, 399 378 }; 400 379 401 380 #ifdef CONFIG_IIO_TRIGGER
+23
drivers/iio/pressure/st_pressure_i2c.c
··· 18 18 #include <linux/iio/common/st_sensors_i2c.h> 19 19 #include "st_pressure.h" 20 20 21 + #ifdef CONFIG_OF 22 + static const struct of_device_id st_press_of_match[] = { 23 + { 24 + .compatible = "st,lps001wp-press", 25 + .data = LPS001WP_PRESS_DEV_NAME, 26 + }, 27 + { 28 + .compatible = "st,lps25h-press", 29 + .data = LPS25H_PRESS_DEV_NAME, 30 + }, 31 + { 32 + .compatible = "st,lps331ap-press", 33 + .data = LPS331AP_PRESS_DEV_NAME, 34 + }, 35 + {}, 36 + }; 37 + MODULE_DEVICE_TABLE(of, st_press_of_match); 38 + #else 39 + #define st_press_of_match NULL 40 + #endif 41 + 21 42 static int st_press_i2c_probe(struct i2c_client *client, 22 43 const struct i2c_device_id *id) 23 44 { ··· 52 31 53 32 pdata = iio_priv(indio_dev); 54 33 pdata->dev = &client->dev; 34 + st_sensors_of_i2c_probe(client, st_press_of_match); 55 35 56 36 st_sensors_i2c_configure(indio_dev, client, pdata); 57 37 ··· 82 60 .driver = { 83 61 .owner = THIS_MODULE, 84 62 .name = "st-press-i2c", 63 + .of_match_table = of_match_ptr(st_press_of_match), 85 64 }, 86 65 .probe = st_press_i2c_probe, 87 66 .remove = st_press_i2c_remove,
-2
drivers/staging/iio/Documentation/iio_event_monitor.c
··· 122 122 case IIO_MOD_LIGHT_IR: 123 123 case IIO_MOD_ROOT_SUM_SQUARED_X_Y: 124 124 case IIO_MOD_SUM_SQUARED_X_Y_Z: 125 - case IIO_MOD_LIGHT_BOTH: 126 - case IIO_MOD_LIGHT_IR: 127 125 case IIO_MOD_LIGHT_CLEAR: 128 126 case IIO_MOD_LIGHT_RED: 129 127 case IIO_MOD_LIGHT_GREEN:
+7 -7
drivers/staging/iio/accel/adis16201_core.c
··· 131 131 } 132 132 133 133 static const struct iio_chan_spec adis16201_channels[] = { 134 - ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT, ADIS16201_SCAN_SUPPLY, 12), 135 - ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT, ADIS16201_SCAN_TEMP, 12), 134 + ADIS_SUPPLY_CHAN(ADIS16201_SUPPLY_OUT, ADIS16201_SCAN_SUPPLY, 0, 12), 135 + ADIS_TEMP_CHAN(ADIS16201_TEMP_OUT, ADIS16201_SCAN_TEMP, 0, 12), 136 136 ADIS_ACCEL_CHAN(X, ADIS16201_XACCL_OUT, ADIS16201_SCAN_ACC_X, 137 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 137 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 138 138 ADIS_ACCEL_CHAN(Y, ADIS16201_YACCL_OUT, ADIS16201_SCAN_ACC_Y, 139 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 140 - ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC, ADIS16201_SCAN_AUX_ADC, 12), 139 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 140 + ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC, ADIS16201_SCAN_AUX_ADC, 0, 12), 141 141 ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT, ADIS16201_SCAN_INCLI_X, 142 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 142 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 143 143 ADIS_INCLI_CHAN(X, ADIS16201_YINCL_OUT, ADIS16201_SCAN_INCLI_Y, 144 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 144 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 145 145 IIO_CHAN_SOFT_TIMESTAMP(7) 146 146 }; 147 147
+6 -5
drivers/staging/iio/accel/adis16203_core.c
··· 99 99 } 100 100 101 101 static const struct iio_chan_spec adis16203_channels[] = { 102 - ADIS_SUPPLY_CHAN(ADIS16203_SUPPLY_OUT, ADIS16203_SCAN_SUPPLY, 12), 103 - ADIS_AUX_ADC_CHAN(ADIS16203_AUX_ADC, ADIS16203_SCAN_AUX_ADC, 12), 102 + ADIS_SUPPLY_CHAN(ADIS16203_SUPPLY_OUT, ADIS16203_SCAN_SUPPLY, 0, 12), 103 + ADIS_AUX_ADC_CHAN(ADIS16203_AUX_ADC, ADIS16203_SCAN_AUX_ADC, 0, 12), 104 104 ADIS_INCLI_CHAN(X, ADIS16203_XINCL_OUT, ADIS16203_SCAN_INCLI_X, 105 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 105 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 106 106 /* Fixme: Not what it appears to be - see data sheet */ 107 - ADIS_INCLI_CHAN(Y, ADIS16203_YINCL_OUT, ADIS16203_SCAN_INCLI_Y, 0, 14), 108 - ADIS_TEMP_CHAN(ADIS16203_TEMP_OUT, ADIS16203_SCAN_TEMP, 12), 107 + ADIS_INCLI_CHAN(Y, ADIS16203_YINCL_OUT, ADIS16203_SCAN_INCLI_Y, 108 + 0, 0, 14), 109 + ADIS_TEMP_CHAN(ADIS16203_TEMP_OUT, ADIS16203_SCAN_TEMP, 0, 12), 109 110 IIO_CHAN_SOFT_TIMESTAMP(5), 110 111 }; 111 112
+6 -6
drivers/staging/iio/accel/adis16204_core.c
··· 136 136 } 137 137 138 138 static const struct iio_chan_spec adis16204_channels[] = { 139 - ADIS_SUPPLY_CHAN(ADIS16204_SUPPLY_OUT, ADIS16204_SCAN_SUPPLY, 12), 140 - ADIS_AUX_ADC_CHAN(ADIS16204_AUX_ADC, ADIS16204_SCAN_AUX_ADC, 12), 141 - ADIS_TEMP_CHAN(ADIS16204_TEMP_OUT, ADIS16204_SCAN_TEMP, 12), 139 + ADIS_SUPPLY_CHAN(ADIS16204_SUPPLY_OUT, ADIS16204_SCAN_SUPPLY, 0, 12), 140 + ADIS_AUX_ADC_CHAN(ADIS16204_AUX_ADC, ADIS16204_SCAN_AUX_ADC, 0, 12), 141 + ADIS_TEMP_CHAN(ADIS16204_TEMP_OUT, ADIS16204_SCAN_TEMP, 0, 12), 142 142 ADIS_ACCEL_CHAN(X, ADIS16204_XACCL_OUT, ADIS16204_SCAN_ACC_X, 143 - BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 14), 143 + BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 14), 144 144 ADIS_ACCEL_CHAN(Y, ADIS16204_YACCL_OUT, ADIS16204_SCAN_ACC_Y, 145 - BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 14), 145 + BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 14), 146 146 ADIS_ACCEL_CHAN(ROOT_SUM_SQUARED_X_Y, ADIS16204_XY_RSS_OUT, 147 - ADIS16204_SCAN_ACC_XY, BIT(IIO_CHAN_INFO_PEAK), 14), 147 + ADIS16204_SCAN_ACC_XY, BIT(IIO_CHAN_INFO_PEAK), 0, 14), 148 148 IIO_CHAN_SOFT_TIMESTAMP(5), 149 149 }; 150 150
+10 -8
drivers/staging/iio/accel/adis16209_core.c
··· 130 130 } 131 131 132 132 static const struct iio_chan_spec adis16209_channels[] = { 133 - ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT, ADIS16209_SCAN_SUPPLY, 14), 134 - ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT, ADIS16209_SCAN_TEMP, 12), 133 + ADIS_SUPPLY_CHAN(ADIS16209_SUPPLY_OUT, ADIS16209_SCAN_SUPPLY, 0, 14), 134 + ADIS_TEMP_CHAN(ADIS16209_TEMP_OUT, ADIS16209_SCAN_TEMP, 0, 12), 135 135 ADIS_ACCEL_CHAN(X, ADIS16209_XACCL_OUT, ADIS16209_SCAN_ACC_X, 136 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 136 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 137 137 ADIS_ACCEL_CHAN(Y, ADIS16209_YACCL_OUT, ADIS16209_SCAN_ACC_Y, 138 - BIT(IIO_CHAN_INFO_CALIBBIAS), 14), 139 - ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC, ADIS16209_SCAN_AUX_ADC, 12), 140 - ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT, ADIS16209_SCAN_INCLI_X, 0, 14), 141 - ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT, ADIS16209_SCAN_INCLI_Y, 0, 14), 142 - ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT, ADIS16209_SCAN_ROT, 0, 14), 138 + BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14), 139 + ADIS_AUX_ADC_CHAN(ADIS16209_AUX_ADC, ADIS16209_SCAN_AUX_ADC, 0, 12), 140 + ADIS_INCLI_CHAN(X, ADIS16209_XINCL_OUT, ADIS16209_SCAN_INCLI_X, 141 + 0, 0, 14), 142 + ADIS_INCLI_CHAN(Y, ADIS16209_YINCL_OUT, ADIS16209_SCAN_INCLI_Y, 143 + 0, 0, 14), 144 + ADIS_ROT_CHAN(X, ADIS16209_ROT_OUT, ADIS16209_SCAN_ROT, 0, 0, 14), 143 145 IIO_CHAN_SOFT_TIMESTAMP(8) 144 146 }; 145 147
+6 -6
drivers/staging/iio/accel/adis16240_core.c
··· 173 173 } 174 174 175 175 static const struct iio_chan_spec adis16240_channels[] = { 176 - ADIS_SUPPLY_CHAN(ADIS16240_SUPPLY_OUT, ADIS16240_SCAN_SUPPLY, 10), 177 - ADIS_AUX_ADC_CHAN(ADIS16240_AUX_ADC, ADIS16240_SCAN_AUX_ADC, 10), 176 + ADIS_SUPPLY_CHAN(ADIS16240_SUPPLY_OUT, ADIS16240_SCAN_SUPPLY, 0, 10), 177 + ADIS_AUX_ADC_CHAN(ADIS16240_AUX_ADC, ADIS16240_SCAN_AUX_ADC, 0, 10), 178 178 ADIS_ACCEL_CHAN(X, ADIS16240_XACCL_OUT, ADIS16240_SCAN_ACC_X, 179 - BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), 179 + BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), 180 180 ADIS_ACCEL_CHAN(Y, ADIS16240_YACCL_OUT, ADIS16240_SCAN_ACC_Y, 181 - BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), 181 + BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), 182 182 ADIS_ACCEL_CHAN(Z, ADIS16240_ZACCL_OUT, ADIS16240_SCAN_ACC_Z, 183 - BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 10), 184 - ADIS_TEMP_CHAN(ADIS16240_TEMP_OUT, ADIS16240_SCAN_TEMP, 10), 183 + BIT(IIO_CHAN_INFO_CALIBBIAS) | BIT(IIO_CHAN_INFO_PEAK), 0, 10), 184 + ADIS_TEMP_CHAN(ADIS16240_TEMP_OUT, ADIS16240_SCAN_TEMP, 0, 10), 185 185 IIO_CHAN_SOFT_TIMESTAMP(6) 186 186 }; 187 187
+1 -8
drivers/staging/iio/adc/Kconfig
··· 3 3 # 4 4 menu "Analog to digital converters" 5 5 6 - config AD7291 7 - tristate "Analog Devices AD7291 ADC driver" 8 - depends on I2C 9 - help 10 - Say yes here to build support for Analog Devices AD7291 11 - 8 Channel ADC with temperature sensor. 12 - 13 6 config AD7606 14 7 tristate "Analog Devices AD7606 ADC driver" 15 8 depends on GPIOLIB ··· 87 94 88 95 config MXS_LRADC 89 96 tristate "Freescale i.MX23/i.MX28 LRADC" 90 - depends on ARCH_MXS || COMPILE_TEST 97 + depends on (ARCH_MXS || COMPILE_TEST) && HAS_IOMEM 91 98 depends on INPUT 92 99 select STMP_DEVICE 93 100 select IIO_BUFFER
-1
drivers/staging/iio/adc/Makefile
··· 8 8 ad7606-$(CONFIG_AD7606_IFACE_SPI) += ad7606_spi.o 9 9 obj-$(CONFIG_AD7606) += ad7606.o 10 10 11 - obj-$(CONFIG_AD7291) += ad7291.o 12 11 obj-$(CONFIG_AD7780) += ad7780.o 13 12 obj-$(CONFIG_AD7816) += ad7816.o 14 13 obj-$(CONFIG_AD7192) += ad7192.o
+56 -51
drivers/staging/iio/adc/ad7291.c drivers/iio/adc/ad7291.c
··· 6 6 * Licensed under the GPL-2 or later. 7 7 */ 8 8 9 - #include <linux/interrupt.h> 10 9 #include <linux/device.h> 11 - #include <linux/kernel.h> 12 - #include <linux/slab.h> 13 - #include <linux/sysfs.h> 10 + #include <linux/err.h> 14 11 #include <linux/i2c.h> 12 + #include <linux/interrupt.h> 13 + #include <linux/kernel.h> 15 14 #include <linux/module.h> 16 15 #include <linux/mutex.h> 17 16 #include <linux/regulator/consumer.h> 18 - #include <linux/err.h> 17 + #include <linux/slab.h> 18 + #include <linux/sysfs.h> 19 19 20 20 #include <linux/iio/iio.h> 21 21 #include <linux/iio/sysfs.h> 22 22 #include <linux/iio/events.h> 23 23 24 - #include "ad7291.h" 24 + #include <linux/platform_data/ad7291.h> 25 25 26 26 /* 27 27 * Simplified handling ··· 31 31 * is in the read mask. 32 32 * 33 33 * The noise-delayed bit as per datasheet suggestion is always enabled. 34 - * 35 34 */ 36 35 37 36 /* ··· 46 47 #define AD7291_VOLTAGE_ALERT_STATUS 0x1F 47 48 #define AD7291_T_ALERT_STATUS 0x20 48 49 50 + #define AD7291_BITS 12 49 51 #define AD7291_VOLTAGE_LIMIT_COUNT 8 50 52 51 53 52 54 /* 53 55 * AD7291 command 54 56 */ 55 - #define AD7291_AUTOCYCLE (1 << 0) 56 - #define AD7291_RESET (1 << 1) 57 - #define AD7291_ALERT_CLEAR (1 << 2) 58 - #define AD7291_ALERT_POLARITY (1 << 3) 59 - #define AD7291_EXT_REF (1 << 4) 60 - #define AD7291_NOISE_DELAY (1 << 5) 61 - #define AD7291_T_SENSE_MASK (1 << 7) 62 - #define AD7291_VOLTAGE_MASK 0xFF00 63 - #define AD7291_VOLTAGE_OFFSET 0x8 57 + #define AD7291_AUTOCYCLE BIT(0) 58 + #define AD7291_RESET BIT(1) 59 + #define AD7291_ALERT_CLEAR BIT(2) 60 + #define AD7291_ALERT_POLARITY BIT(3) 61 + #define AD7291_EXT_REF BIT(4) 62 + #define AD7291_NOISE_DELAY BIT(5) 63 + #define AD7291_T_SENSE_MASK BIT(7) 64 + #define AD7291_VOLTAGE_MASK GENMASK(15, 8) 65 + #define AD7291_VOLTAGE_OFFSET 8 64 66 65 67 /* 66 68 * AD7291 value masks 67 69 */ 68 - #define AD7291_CHANNEL_MASK 0xF000 69 - #define AD7291_BITS 12 70 - #define AD7291_VALUE_MASK 0xFFF 71 - #define AD7291_T_VALUE_SIGN 0x400 72 - #define AD7291_T_VALUE_FLOAT_OFFSET 2 73 - #define AD7291_T_VALUE_FLOAT_MASK 0x2 70 + #define AD7291_VALUE_MASK GENMASK(11, 0) 74 71 75 - #define AD7291_BITS 12 72 + /* 73 + * AD7291 alert register bits 74 + */ 75 + #define AD7291_T_LOW BIT(0) 76 + #define AD7291_T_HIGH BIT(1) 77 + #define AD7291_T_AVG_LOW BIT(2) 78 + #define AD7291_T_AVG_HIGH BIT(3) 79 + #define AD7291_V_LOW(x) BIT((x) * 2) 80 + #define AD7291_V_HIGH(x) BIT((x) * 2 + 1) 81 + 76 82 77 83 struct ad7291_chip_info { 78 84 struct i2c_client *client; ··· 133 129 ad7291_i2c_write(chip, AD7291_COMMAND, command); 134 130 135 131 /* For now treat t_sense and t_sense_average the same */ 136 - if ((t_status & (1 << 0)) || (t_status & (1 << 2))) 132 + if ((t_status & AD7291_T_LOW) || (t_status & AD7291_T_AVG_LOW)) 137 133 iio_push_event(indio_dev, 138 134 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 139 135 0, 140 136 IIO_EV_TYPE_THRESH, 141 137 IIO_EV_DIR_FALLING), 142 138 timestamp); 143 - if ((t_status & (1 << 1)) || (t_status & (1 << 3))) 139 + if ((t_status & AD7291_T_HIGH) || (t_status & AD7291_T_AVG_HIGH)) 144 140 iio_push_event(indio_dev, 145 141 IIO_UNMOD_EVENT_CODE(IIO_TEMP, 146 142 0, ··· 148 144 IIO_EV_DIR_RISING), 149 145 timestamp); 150 146 151 - for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT*2; i += 2) { 152 - if (v_status & (1 << i)) 147 + for (i = 0; i < AD7291_VOLTAGE_LIMIT_COUNT; i++) { 148 + if (v_status & AD7291_V_LOW(i)) 153 149 iio_push_event(indio_dev, 154 150 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 155 - i/2, 151 + i, 156 152 IIO_EV_TYPE_THRESH, 157 153 IIO_EV_DIR_FALLING), 158 154 timestamp); 159 - if (v_status & (1 << (i + 1))) 155 + if (v_status & AD7291_V_HIGH(i)) 160 156 iio_push_event(indio_dev, 161 157 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, 162 - i/2, 158 + i, 163 159 IIO_EV_TYPE_THRESH, 164 160 IIO_EV_DIR_RISING), 165 161 timestamp); ··· 169 165 } 170 166 171 167 static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan, 172 - enum iio_event_direction dir, enum iio_event_info info) 168 + enum iio_event_direction dir, 169 + enum iio_event_info info) 173 170 { 174 171 unsigned int offset; 175 172 ··· 179 174 offset = chan->channel; 180 175 break; 181 176 case IIO_TEMP: 182 - offset = 8; 177 + offset = AD7291_VOLTAGE_OFFSET; 183 178 break; 184 179 default: 185 180 return 0; ··· 187 182 188 183 switch (info) { 189 184 case IIO_EV_INFO_VALUE: 190 - if (dir == IIO_EV_DIR_FALLING) 191 - return AD7291_DATA_HIGH(offset); 192 - else 193 - return AD7291_DATA_LOW(offset); 185 + if (dir == IIO_EV_DIR_FALLING) 186 + return AD7291_DATA_HIGH(offset); 187 + else 188 + return AD7291_DATA_LOW(offset); 194 189 case IIO_EV_INFO_HYSTERESIS: 195 - return AD7291_HYST(offset); 190 + return AD7291_HYST(offset); 196 191 default: 197 - break; 192 + break; 198 193 } 199 194 return 0; 200 195 } ··· 211 206 u16 uval; 212 207 213 208 ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info), 214 - &uval); 209 + &uval); 215 210 if (ret < 0) 216 211 return ret; 217 212 ··· 242 237 } 243 238 244 239 return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info), 245 - val); 240 + val); 246 241 } 247 242 248 243 static int ad7291_read_event_config(struct iio_dev *indio_dev, ··· 251 246 enum iio_event_direction dir) 252 247 { 253 248 struct ad7291_chip_info *chip = iio_priv(indio_dev); 254 - /* To be enabled the channel must simply be on. If any are enabled 255 - we are in continuous sampling mode */ 249 + /* 250 + * To be enabled the channel must simply be on. If any are enabled 251 + * we are in continuous sampling mode 252 + */ 256 253 257 254 switch (chan->type) { 258 255 case IIO_VOLTAGE: 259 - if (chip->c_mask & (1 << (15 - chan->channel))) 260 - return 1; 261 - else 262 - return 0; 256 + return !!(chip->c_mask & BIT(15 - chan->channel)); 263 257 case IIO_TEMP: 264 258 /* always on */ 265 259 return 1; ··· 340 336 } 341 337 /* Enable this channel alone */ 342 338 regval = chip->command & (~AD7291_VOLTAGE_MASK); 343 - regval |= 1 << (15 - chan->channel); 339 + regval |= BIT(15 - chan->channel); 344 340 ret = ad7291_i2c_write(chip, AD7291_COMMAND, regval); 345 341 if (ret < 0) { 346 342 mutex_unlock(&chip->state_lock); ··· 348 344 } 349 345 /* Read voltage */ 350 346 ret = i2c_smbus_read_word_swapped(chip->client, 351 - AD7291_VOLTAGE); 347 + AD7291_VOLTAGE); 352 348 if (ret < 0) { 353 349 mutex_unlock(&chip->state_lock); 354 350 return ret; ··· 359 355 case IIO_TEMP: 360 356 /* Assumes tsense bit of command register always set */ 361 357 ret = i2c_smbus_read_word_swapped(chip->client, 362 - AD7291_T_SENSE); 358 + AD7291_T_SENSE); 363 359 if (ret < 0) 364 360 return ret; 365 361 *val = sign_extend32(ret, 11); ··· 369 365 } 370 366 case IIO_CHAN_INFO_AVERAGE_RAW: 371 367 ret = i2c_smbus_read_word_swapped(chip->client, 372 - AD7291_T_AVERAGE); 368 + AD7291_T_AVERAGE); 373 369 if (ret < 0) 374 370 return ret; 375 371 *val = sign_extend32(ret, 11); ··· 379 375 case IIO_VOLTAGE: 380 376 if (chip->reg) { 381 377 int vref; 378 + 382 379 vref = regulator_get_voltage(chip->reg); 383 380 if (vref < 0) 384 381 return vref; ··· 465 460 }; 466 461 467 462 static int ad7291_probe(struct i2c_client *client, 468 - const struct i2c_device_id *id) 463 + const struct i2c_device_id *id) 469 464 { 470 465 struct ad7291_platform_data *pdata = client->dev.platform_data; 471 466 struct ad7291_chip_info *chip;
drivers/staging/iio/adc/ad7291.h include/linux/platform_data/ad7291.h
+6 -31
drivers/staging/iio/adc/ad7606_par.c
··· 53 53 struct iio_dev *indio_dev; 54 54 void __iomem *addr; 55 55 resource_size_t remap_size; 56 - int ret, irq; 56 + int irq; 57 57 58 58 irq = platform_get_irq(pdev, 0); 59 59 if (irq < 0) { ··· 62 62 } 63 63 64 64 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 65 - if (!res) 66 - return -ENODEV; 65 + addr = devm_ioremap_resource(&pdev->dev, res); 66 + if (IS_ERR(addr)) 67 + return PTR_ERR(addr); 67 68 68 69 remap_size = resource_size(res); 69 - 70 - /* Request the regions */ 71 - if (!request_mem_region(res->start, remap_size, "iio-ad7606")) { 72 - ret = -EBUSY; 73 - goto out1; 74 - } 75 - addr = ioremap(res->start, remap_size); 76 - if (!addr) { 77 - ret = -ENOMEM; 78 - goto out1; 79 - } 80 70 81 71 indio_dev = ad7606_probe(&pdev->dev, irq, addr, 82 72 platform_get_device_id(pdev)->driver_data, 83 73 remap_size > 1 ? &ad7606_par16_bops : 84 74 &ad7606_par8_bops); 85 75 86 - if (IS_ERR(indio_dev)) { 87 - ret = PTR_ERR(indio_dev); 88 - goto out2; 89 - } 76 + if (IS_ERR(indio_dev)) 77 + return PTR_ERR(indio_dev); 90 78 91 79 platform_set_drvdata(pdev, indio_dev); 92 80 93 81 return 0; 94 - 95 - out2: 96 - iounmap(addr); 97 - out1: 98 - release_mem_region(res->start, remap_size); 99 - 100 - return ret; 101 82 } 102 83 103 84 static int ad7606_par_remove(struct platform_device *pdev) 104 85 { 105 86 struct iio_dev *indio_dev = platform_get_drvdata(pdev); 106 - struct resource *res; 107 - struct ad7606_state *st = iio_priv(indio_dev); 108 87 109 88 ad7606_remove(indio_dev, platform_get_irq(pdev, 0)); 110 - 111 - iounmap(st->base_address); 112 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 113 - release_mem_region(res->start, resource_size(res)); 114 89 115 90 return 0; 116 91 }
+1 -1
drivers/staging/iio/frequency/ad9832.c
··· 120 120 ret = spi_sync(st->spi, &st->msg); 121 121 break; 122 122 case AD9832_PHASE_SYM: 123 - if (val < 0 || val > 3) { 123 + if (val > 3) { 124 124 ret = -EINVAL; 125 125 break; 126 126 }
+11 -20
drivers/staging/iio/trigger/iio-trig-bfin-timer.c
··· 182 182 unsigned int config; 183 183 int ret; 184 184 185 - st = kzalloc(sizeof(*st), GFP_KERNEL); 186 - if (st == NULL) { 187 - ret = -ENOMEM; 188 - goto out; 189 - } 185 + st = devm_kzalloc(&pdev->dev, sizeof(*st), GFP_KERNEL); 186 + if (st == NULL) 187 + return -ENOMEM; 190 188 191 189 st->irq = platform_get_irq(pdev, 0); 192 190 if (!st->irq) { 193 191 dev_err(&pdev->dev, "No IRQs specified"); 194 - ret = -ENODEV; 195 - goto out1; 192 + return -ENODEV; 196 193 } 197 194 198 195 ret = iio_bfin_tmr_get_number(st->irq); 199 196 if (ret < 0) 200 - goto out1; 197 + return ret; 201 198 202 199 st->timer_num = ret; 203 200 st->t = &iio_bfin_timer_code[st->timer_num]; 204 201 205 202 st->trig = iio_trigger_alloc("bfintmr%d", st->timer_num); 206 - if (!st->trig) { 207 - ret = -ENOMEM; 208 - goto out1; 209 - } 203 + if (!st->trig) 204 + return -ENOMEM; 210 205 211 206 st->trig->ops = &iio_bfin_tmr_trigger_ops; 212 207 st->trig->dev.groups = iio_bfin_tmr_trigger_attr_groups; 213 208 iio_trigger_set_drvdata(st->trig, st); 214 209 ret = iio_trigger_register(st->trig); 215 210 if (ret) 216 - goto out2; 211 + goto out; 217 212 218 213 ret = request_irq(st->irq, iio_bfin_tmr_trigger_isr, 219 214 0, st->trig->name, st); 220 215 if (ret) { 221 216 dev_err(&pdev->dev, 222 217 "request IRQ-%d failed", st->irq); 223 - goto out4; 218 + goto out1; 224 219 } 225 220 226 221 config = PWM_OUT | PERIOD_CNT | IRQ_ENA; ··· 255 260 return 0; 256 261 out_free_irq: 257 262 free_irq(st->irq, st); 258 - out4: 259 - iio_trigger_unregister(st->trig); 260 - out2: 261 - iio_trigger_put(st->trig); 262 263 out1: 263 - kfree(st); 264 + iio_trigger_unregister(st->trig); 264 265 out: 266 + iio_trigger_put(st->trig); 265 267 return ret; 266 268 } 267 269 ··· 272 280 free_irq(st->irq, st); 273 281 iio_trigger_unregister(st->trig); 274 282 iio_trigger_put(st->trig); 275 - kfree(st); 276 283 277 284 return 0; 278 285 }
+1 -11
include/linux/iio/common/st_sensors.h
··· 47 47 .type = device_type, \ 48 48 .modified = mod, \ 49 49 .info_mask_separate = mask, \ 50 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 50 51 .scan_index = index, \ 51 52 .channel2 = ch2, \ 52 53 .address = addr, \ ··· 59 58 .endianness = endian, \ 60 59 }, \ 61 60 } 62 - 63 - #define ST_SENSOR_DEV_ATTR_SAMP_FREQ() \ 64 - IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, \ 65 - st_sensors_sysfs_get_sampling_frequency, \ 66 - st_sensors_sysfs_set_sampling_frequency) 67 61 68 62 #define ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL() \ 69 63 IIO_DEV_ATTR_SAMP_FREQ_AVAIL( \ ··· 280 284 281 285 int st_sensors_check_device_support(struct iio_dev *indio_dev, 282 286 int num_sensors_list, const struct st_sensors *sensors); 283 - 284 - ssize_t st_sensors_sysfs_get_sampling_frequency(struct device *dev, 285 - struct device_attribute *attr, char *buf); 286 - 287 - ssize_t st_sensors_sysfs_set_sampling_frequency(struct device *dev, 288 - struct device_attribute *attr, const char *buf, size_t size); 289 287 290 288 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, 291 289 struct device_attribute *attr, char *buf);
+11
include/linux/iio/common/st_sensors_i2c.h
··· 13 13 14 14 #include <linux/i2c.h> 15 15 #include <linux/iio/common/st_sensors.h> 16 + #include <linux/of.h> 16 17 17 18 void st_sensors_i2c_configure(struct iio_dev *indio_dev, 18 19 struct i2c_client *client, struct st_sensor_data *sdata); 20 + 21 + #ifdef CONFIG_OF 22 + void st_sensors_of_i2c_probe(struct i2c_client *client, 23 + const struct of_device_id *match); 24 + #else 25 + static inline void st_sensors_of_i2c_probe(struct i2c_client *client, 26 + const struct of_device_id *match) 27 + { 28 + } 29 + #endif 19 30 20 31 #endif /* ST_SENSORS_I2C_H */
+18 -15
include/linux/iio/imu/adis.h
··· 157 157 const struct iio_chan_spec *chan, unsigned int error_mask, 158 158 int *val); 159 159 160 - #define ADIS_VOLTAGE_CHAN(addr, si, chan, name, bits) { \ 160 + #define ADIS_VOLTAGE_CHAN(addr, si, chan, name, info_all, bits) { \ 161 161 .type = IIO_VOLTAGE, \ 162 162 .indexed = 1, \ 163 163 .channel = (chan), \ 164 164 .extend_name = name, \ 165 165 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 166 166 BIT(IIO_CHAN_INFO_SCALE), \ 167 + .info_mask_shared_by_all = info_all, \ 167 168 .address = (addr), \ 168 169 .scan_index = (si), \ 169 170 .scan_type = { \ ··· 175 174 }, \ 176 175 } 177 176 178 - #define ADIS_SUPPLY_CHAN(addr, si, bits) \ 179 - ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", bits) 177 + #define ADIS_SUPPLY_CHAN(addr, si, info_all, bits) \ 178 + ADIS_VOLTAGE_CHAN(addr, si, 0, "supply", info_all, bits) 180 179 181 - #define ADIS_AUX_ADC_CHAN(addr, si, bits) \ 182 - ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, bits) 180 + #define ADIS_AUX_ADC_CHAN(addr, si, info_all, bits) \ 181 + ADIS_VOLTAGE_CHAN(addr, si, 1, NULL, info_all, bits) 183 182 184 - #define ADIS_TEMP_CHAN(addr, si, bits) { \ 183 + #define ADIS_TEMP_CHAN(addr, si, info_all, bits) { \ 185 184 .type = IIO_TEMP, \ 186 185 .indexed = 1, \ 187 186 .channel = 0, \ 188 187 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 189 188 BIT(IIO_CHAN_INFO_SCALE) | \ 190 189 BIT(IIO_CHAN_INFO_OFFSET), \ 190 + .info_mask_shared_by_all = info_all, \ 191 191 .address = (addr), \ 192 192 .scan_index = (si), \ 193 193 .scan_type = { \ ··· 199 197 }, \ 200 198 } 201 199 202 - #define ADIS_MOD_CHAN(_type, mod, addr, si, info_sep, bits) { \ 200 + #define ADIS_MOD_CHAN(_type, mod, addr, si, info_sep, info_all, bits) { \ 203 201 .type = (_type), \ 204 202 .modified = 1, \ 205 203 .channel2 = IIO_MOD_ ## mod, \ 206 204 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 207 205 info_sep, \ 208 206 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \ 207 + .info_mask_shared_by_all = info_all, \ 209 208 .address = (addr), \ 210 209 .scan_index = (si), \ 211 210 .scan_type = { \ ··· 217 214 }, \ 218 215 } 219 216 220 - #define ADIS_ACCEL_CHAN(mod, addr, si, info_sep, bits) \ 221 - ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, bits) 217 + #define ADIS_ACCEL_CHAN(mod, addr, si, info_sep, info_all, bits) \ 218 + ADIS_MOD_CHAN(IIO_ACCEL, mod, addr, si, info_sep, info_all, bits) 222 219 223 - #define ADIS_GYRO_CHAN(mod, addr, si, info_sep, bits) \ 224 - ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, bits) 220 + #define ADIS_GYRO_CHAN(mod, addr, si, info_sep, info_all, bits) \ 221 + ADIS_MOD_CHAN(IIO_ANGL_VEL, mod, addr, si, info_sep, info_all, bits) 225 222 226 - #define ADIS_INCLI_CHAN(mod, addr, si, info_sep, bits) \ 227 - ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, bits) 223 + #define ADIS_INCLI_CHAN(mod, addr, si, info_sep, info_all, bits) \ 224 + ADIS_MOD_CHAN(IIO_INCLI, mod, addr, si, info_sep, info_all, bits) 228 225 229 - #define ADIS_ROT_CHAN(mod, addr, si, info_sep, bits) \ 230 - ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, bits) 226 + #define ADIS_ROT_CHAN(mod, addr, si, info_sep, info_all, bits) \ 227 + ADIS_MOD_CHAN(IIO_ROT, mod, addr, si, info_sep, info_all, bits) 231 228 232 229 #ifdef CONFIG_IIO_ADIS_LIB_BUFFER 233 230
+1
include/linux/iio/types.h
··· 70 70 IIO_EV_INFO_ENABLE, 71 71 IIO_EV_INFO_VALUE, 72 72 IIO_EV_INFO_HYSTERESIS, 73 + IIO_EV_INFO_PERIOD, 73 74 }; 74 75 75 76 enum iio_event_direction {