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

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

Jonathan writes:

First round of new drivers, features and cleanups for IIO in the 3.19 cycle.

New drivers / supported parts
* rockchip - rk3066-tsadc variant
* si7020 humidity and temperature sensor
* mcp320x - add mcp3001, mcp3002, mcp3004, mcp3008, mcp3201, mcp3202
* bmp280 pressure and temperature sensor
* Qualcomm SPMI PMIC current ADC driver
* Exynos_adc - support exynos7

New features
* vf610-adc - add temperature sensor support
* Documentation of current attributes, scaled pressure, offset and
scaled humidity, RGBC intensity gain factor and scale applied to
differential voltage channels.
* Bring iio_event_monitor up to date with newer modifiers.
* Add of_xlate function to allow for complex channel mappings from the
device tree.
* Add -g parameter to generic_buffer example to allow for devices with
directly fed (no trigger) buffers.
* Move exynos driver over to syscon for PMU register access.

Cleanups, fixes for new drivers
* lis3l02dq drop an unneeded else.
* st sensors - renam st_sensors to st_sensor_settings (for clarity)
* st sensors - drop an unused parameter from all the probe utility
functions.
* vf610 better error handling and tidy up.
* si7020 - cleanups following merge
* as3935 - drop some unnecessary semicolons.
* bmp280 - fix the pressure calculation.

+1908 -277
+23
Documentation/ABI/testing/sysfs-bus-iio
··· 200 200 Raw pressure measurement from channel Y. Units after 201 201 application of scale and offset are kilopascal. 202 202 203 + What: /sys/bus/iio/devices/iio:deviceX/in_pressureY_input 204 + What: /sys/bus/iio/devices/iio:deviceX/in_pressure_input 205 + KernelVersion: 3.8 206 + Contact: linux-iio@vger.kernel.org 207 + Description: 208 + Scaled pressure measurement from channel Y, in kilopascal. 209 + 203 210 What: /sys/bus/iio/devices/iio:deviceX/in_humidityrelative_raw 204 211 KernelVersion: 3.14 205 212 Contact: linux-iio@vger.kernel.org ··· 238 231 What: /sys/bus/iio/devices/iio:deviceX/in_temp_offset 239 232 What: /sys/bus/iio/devices/iio:deviceX/in_pressureY_offset 240 233 What: /sys/bus/iio/devices/iio:deviceX/in_pressure_offset 234 + What: /sys/bus/iio/devices/iio:deviceX/in_humidityrelative_offset 241 235 KernelVersion: 2.6.35 242 236 Contact: linux-iio@vger.kernel.org 243 237 Description: ··· 259 251 What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_scale 260 252 What: /sys/bus/iio/devices/iio:deviceX/in_voltageY_supply_scale 261 253 What: /sys/bus/iio/devices/iio:deviceX/in_voltage_scale 254 + What: /sys/bus/iio/devices/iio:deviceX/in_voltage-voltage_scale 262 255 What: /sys/bus/iio/devices/iio:deviceX/out_voltageY_scale 263 256 What: /sys/bus/iio/devices/iio:deviceX/out_altvoltageY_scale 264 257 What: /sys/bus/iio/devices/iio:deviceX/in_accel_scale ··· 275 266 What: /sys/bus/iio/devices/iio:deviceX/in_rot_from_north_true_tilt_comp_scale 276 267 What: /sys/bus/iio/devices/iio:deviceX/in_pressureY_scale 277 268 What: /sys/bus/iio/devices/iio:deviceX/in_pressure_scale 269 + What: /sys/bus/iio/devices/iio:deviceX/in_humidityrelative_scale 278 270 KernelVersion: 2.6.35 279 271 Contact: linux-iio@vger.kernel.org 280 272 Description: ··· 338 328 are listed in this attribute. 339 329 340 330 What /sys/bus/iio/devices/iio:deviceX/out_voltageY_hardwaregain 331 + What: /sys/bus/iio/devices/iio:deviceX/in_intensity_red_hardwaregain 332 + What: /sys/bus/iio/devices/iio:deviceX/in_intensity_green_hardwaregain 333 + What: /sys/bus/iio/devices/iio:deviceX/in_intensity_blue_hardwaregain 334 + What: /sys/bus/iio/devices/iio:deviceX/in_intensity_clear_hardwaregain 341 335 KernelVersion: 2.6.35 342 336 Contact: linux-iio@vger.kernel.org 343 337 Description: ··· 1042 1028 Description: 1043 1029 Raw value of rotation from true/magnetic north measured with 1044 1030 or without compensation from tilt sensors. 1031 + 1032 + What: /sys/bus/iio/devices/iio:deviceX/in_currentX_raw 1033 + KernelVersion: 3.18 1034 + Contact: linux-iio@vger.kernel.org 1035 + Description: 1036 + Raw current measurement from channel X. Units are in milliamps 1037 + after application of scale and offset. If no offset or scale is 1038 + present, output should be considered as processed with the 1039 + unit in milliamps.
+9 -2
Documentation/devicetree/bindings/arm/samsung/exynos-adc.txt
··· 16 16 future controllers. 17 17 Must be "samsung,exynos3250-adc" for 18 18 controllers compatible with ADC of Exynos3250. 19 + Must be "samsung,exynos7-adc" for 20 + the ADC in Exynos7 and compatibles 19 21 Must be "samsung,s3c2410-adc" for 20 22 the ADC in s3c2410 and compatibles 21 23 Must be "samsung,s3c2416-adc" for ··· 45 43 compatible ADC block) 46 44 - vdd-supply VDD input supply. 47 45 46 + - samsung,syscon-phandle Contains the PMU system controller node 47 + (To access the ADC_PHY register on Exynos5250/5420/5800/3250) 48 + 48 49 Note: child nodes can be added for auto probing from device tree. 49 50 50 51 Example: adding device info in dtsi file 51 52 52 53 adc: adc@12D10000 { 53 54 compatible = "samsung,exynos-adc-v1"; 54 - reg = <0x12D10000 0x100>, <0x10040718 0x4>; 55 + reg = <0x12D10000 0x100>; 55 56 interrupts = <0 106 0>; 56 57 #io-channel-cells = <1>; 57 58 io-channel-ranges; ··· 63 58 clock-names = "adc"; 64 59 65 60 vdd-supply = <&buck5_reg>; 61 + samsung,syscon-phandle = <&pmu_system_controller>; 66 62 }; 67 63 68 64 Example: adding device info in dtsi file for Exynos3250 with additional sclk 69 65 70 66 adc: adc@126C0000 { 71 67 compatible = "samsung,exynos3250-adc", "samsung,exynos-adc-v2; 72 - reg = <0x126C0000 0x100>, <0x10020718 0x4>; 68 + reg = <0x126C0000 0x100>; 73 69 interrupts = <0 137 0>; 74 70 #io-channel-cells = <1>; 75 71 io-channel-ranges; ··· 79 73 clock-names = "adc", "sclk"; 80 74 81 75 vdd-supply = <&buck5_reg>; 76 + samsung,syscon-phandle = <&pmu_system_controller>; 82 77 }; 83 78 84 79 Example: Adding child nodes in dts file
+46
Documentation/devicetree/bindings/iio/adc/qcom,spmi-iadc.txt
··· 1 + Qualcomm's SPMI PMIC current ADC 2 + 3 + QPNP PMIC current ADC (IADC) provides interface to clients to read current. 4 + A 16 bit ADC is used for current measurements. IADC can measure the current 5 + through an external resistor (channel 1) or internal (built-in) resistor 6 + (channel 0). When using an external resistor it is to be described by 7 + qcom,external-resistor-micro-ohms property. 8 + 9 + IADC node: 10 + 11 + - compatible: 12 + Usage: required 13 + Value type: <string> 14 + Definition: Should contain "qcom,spmi-iadc". 15 + 16 + - reg: 17 + Usage: required 18 + Value type: <prop-encoded-array> 19 + Definition: IADC base address and length in the SPMI PMIC register map 20 + 21 + - interrupts: 22 + Usage: optional 23 + Value type: <prop-encoded-array> 24 + Definition: End of ADC conversion. 25 + 26 + - qcom,external-resistor-micro-ohms: 27 + Usage: optional 28 + Value type: <u32> 29 + Definition: Sense resister value in micro Ohm. 30 + If not defined value of 10000 micro Ohms will be used. 31 + 32 + Example: 33 + /* IADC node */ 34 + pmic_iadc: iadc@3600 { 35 + compatible = "qcom,spmi-iadc"; 36 + reg = <0x3600 0x100>; 37 + interrupts = <0x0 0x36 0x0 IRQ_TYPE_EDGE_RISING>; 38 + qcom,external-resistor-micro-ohms = <10000>; 39 + #io-channel-cells = <1>; 40 + }; 41 + 42 + /* IIO client node */ 43 + bat { 44 + io-channels = <&pmic_iadc 0>; 45 + io-channel-names = "iadc"; 46 + };
+1 -1
Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt
··· 1 1 Rockchip Successive Approximation Register (SAR) A/D Converter bindings 2 2 3 3 Required properties: 4 - - compatible: Should be "rockchip,saradc" 4 + - compatible: Should be "rockchip,saradc" or "rockchip,rk3066-tsadc" 5 5 - reg: physical base address of the controller and length of memory mapped 6 6 region. 7 7 - interrupts: The interrupt number to the cpu. The interrupt specifier format
+2 -1
arch/arm/boot/dts/exynos3250.dtsi
··· 311 311 adc: adc@126C0000 { 312 312 compatible = "samsung,exynos3250-adc", 313 313 "samsung,exynos-adc-v2"; 314 - reg = <0x126C0000 0x100>, <0x10020718 0x4>; 314 + reg = <0x126C0000 0x100>; 315 315 interrupts = <0 137 0>; 316 316 clock-names = "adc", "sclk"; 317 317 clocks = <&cmu CLK_TSADC>, <&cmu CLK_SCLK_TSADC>; 318 318 #io-channel-cells = <1>; 319 319 io-channel-ranges; 320 + samsung,syscon-phandle = <&pmu_system_controller>; 320 321 status = "disabled"; 321 322 }; 322 323
+2 -1
arch/arm/boot/dts/exynos4x12.dtsi
··· 108 108 109 109 adc: adc@126C0000 { 110 110 compatible = "samsung,exynos-adc-v1"; 111 - reg = <0x126C0000 0x100>, <0x10020718 0x4>; 111 + reg = <0x126C0000 0x100>; 112 112 interrupt-parent = <&combiner>; 113 113 interrupts = <10 3>; 114 114 clocks = <&clock CLK_TSADC>; 115 115 clock-names = "adc"; 116 116 #io-channel-cells = <1>; 117 117 io-channel-ranges; 118 + samsung,syscon-phandle = <&pmu_system_controller>; 118 119 status = "disabled"; 119 120 }; 120 121
+2 -1
arch/arm/boot/dts/exynos5250.dtsi
··· 750 750 751 751 adc: adc@12D10000 { 752 752 compatible = "samsung,exynos-adc-v1"; 753 - reg = <0x12D10000 0x100>, <0x10040718 0x4>; 753 + reg = <0x12D10000 0x100>; 754 754 interrupts = <0 106 0>; 755 755 clocks = <&clock CLK_ADC>; 756 756 clock-names = "adc"; 757 757 #io-channel-cells = <1>; 758 758 io-channel-ranges; 759 + samsung,syscon-phandle = <&pmu_system_controller>; 759 760 status = "disabled"; 760 761 }; 761 762
+2 -1
arch/arm/boot/dts/exynos5420.dtsi
··· 541 541 542 542 adc: adc@12D10000 { 543 543 compatible = "samsung,exynos-adc-v2"; 544 - reg = <0x12D10000 0x100>, <0x10040720 0x4>; 544 + reg = <0x12D10000 0x100>; 545 545 interrupts = <0 106 0>; 546 546 clocks = <&clock CLK_TSADC>; 547 547 clock-names = "adc"; 548 548 #io-channel-cells = <1>; 549 549 io-channel-ranges; 550 + samsung,syscon-phandle = <&pmu_system_controller>; 550 551 status = "disabled"; 551 552 }; 552 553
+1 -2
drivers/iio/accel/st_accel.h
··· 33 33 .drdy_int_pin = 1, 34 34 }; 35 35 36 - int st_accel_common_probe(struct iio_dev *indio_dev, 37 - struct st_sensors_platform_data *pdata); 36 + int st_accel_common_probe(struct iio_dev *indio_dev); 38 37 void st_accel_common_remove(struct iio_dev *indio_dev); 39 38 40 39 #ifdef CONFIG_IIO_BUFFER
+11 -11
drivers/iio/accel/st_accel_core.c
··· 161 161 IIO_CHAN_SOFT_TIMESTAMP(3) 162 162 }; 163 163 164 - static const struct st_sensors st_accel_sensors[] = { 164 + static const struct st_sensor_settings st_accel_sensors_settings[] = { 165 165 { 166 166 .wai = ST_ACCEL_1_WAI_EXP, 167 167 .sensors_supported = { ··· 457 457 #define ST_ACCEL_TRIGGER_OPS NULL 458 458 #endif 459 459 460 - int st_accel_common_probe(struct iio_dev *indio_dev, 461 - struct st_sensors_platform_data *plat_data) 460 + int st_accel_common_probe(struct iio_dev *indio_dev) 462 461 { 463 462 struct st_sensor_data *adata = iio_priv(indio_dev); 464 463 int irq = adata->get_irq_data_ready(indio_dev); ··· 469 470 st_sensors_power_enable(indio_dev); 470 471 471 472 err = st_sensors_check_device_support(indio_dev, 472 - ARRAY_SIZE(st_accel_sensors), st_accel_sensors); 473 + ARRAY_SIZE(st_accel_sensors_settings), 474 + st_accel_sensors_settings); 473 475 if (err < 0) 474 476 return err; 475 477 476 478 adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS; 477 - adata->multiread_bit = adata->sensor->multi_read_bit; 478 - indio_dev->channels = adata->sensor->ch; 479 + adata->multiread_bit = adata->sensor_settings->multi_read_bit; 480 + indio_dev->channels = adata->sensor_settings->ch; 479 481 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 480 482 481 483 adata->current_fullscale = (struct st_sensor_fullscale_avl *) 482 - &adata->sensor->fs.fs_avl[0]; 483 - adata->odr = adata->sensor->odr.odr_avl[0].hz; 484 + &adata->sensor_settings->fs.fs_avl[0]; 485 + adata->odr = adata->sensor_settings->odr.odr_avl[0].hz; 484 486 485 - if (!plat_data) 486 - plat_data = 487 + if (!adata->dev->platform_data) 488 + adata->dev->platform_data = 487 489 (struct st_sensors_platform_data *)&default_accel_pdata; 488 490 489 - err = st_sensors_init_sensor(indio_dev, plat_data); 491 + err = st_sensors_init_sensor(indio_dev, adata->dev->platform_data); 490 492 if (err < 0) 491 493 return err; 492 494
+1 -2
drivers/iio/accel/st_accel_i2c.c
··· 79 79 return -ENOMEM; 80 80 81 81 adata = iio_priv(indio_dev); 82 - adata->dev = &client->dev; 83 82 st_sensors_of_i2c_probe(client, st_accel_of_match); 84 83 85 84 st_sensors_i2c_configure(indio_dev, client, adata); 86 85 87 - err = st_accel_common_probe(indio_dev, client->dev.platform_data); 86 + err = st_accel_common_probe(indio_dev); 88 87 if (err < 0) 89 88 return err; 90 89
+1 -2
drivers/iio/accel/st_accel_spi.c
··· 29 29 return -ENOMEM; 30 30 31 31 adata = iio_priv(indio_dev); 32 - adata->dev = &spi->dev; 33 32 34 33 st_sensors_spi_configure(indio_dev, spi, adata); 35 34 36 - err = st_accel_common_probe(indio_dev, spi->dev.platform_data); 35 + err = st_accel_common_probe(indio_dev); 37 36 if (err < 0) 38 37 return err; 39 38
+14
drivers/iio/adc/Kconfig
··· 206 206 To compile this driver as a module, choose M here: the 207 207 module will be called nau7802. 208 208 209 + config QCOM_SPMI_IADC 210 + tristate "Qualcomm SPMI PMIC current ADC" 211 + depends on SPMI 212 + select REGMAP_SPMI 213 + help 214 + This is the IIO Current ADC driver for Qualcomm QPNP IADC Chip. 215 + 216 + The driver supports single mode operation to read from one of two 217 + channels (external or internal). Hardware have additional 218 + channels internally used for gain and offset calibration. 219 + 220 + To compile this driver as a module, choose M here: the module will 221 + be called qcom-spmi-iadc. 222 + 209 223 config ROCKCHIP_SARADC 210 224 tristate "Rockchip SARADC driver" 211 225 depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST)
+1
drivers/iio/adc/Makefile
··· 22 22 obj-$(CONFIG_MCP3422) += mcp3422.o 23 23 obj-$(CONFIG_MEN_Z188_ADC) += men_z188_adc.o 24 24 obj-$(CONFIG_NAU7802) += nau7802.o 25 + obj-$(CONFIG_QCOM_SPMI_IADC) += qcom-spmi-iadc.o 25 26 obj-$(CONFIG_ROCKCHIP_SARADC) += rockchip_saradc.o 26 27 obj-$(CONFIG_TI_ADC081C) += ti-adc081c.o 27 28 obj-$(CONFIG_TI_ADC128S052) += ti-adc128s052.o
+53 -9
drivers/iio/adc/exynos_adc.c
··· 39 39 #include <linux/iio/iio.h> 40 40 #include <linux/iio/machine.h> 41 41 #include <linux/iio/driver.h> 42 + #include <linux/mfd/syscon.h> 43 + #include <linux/regmap.h> 42 44 43 45 /* S3C/EXYNOS4412/5250 ADC_V1 registers definitions */ 44 46 #define ADC_V1_CON(x) ((x) + 0x00) ··· 92 90 93 91 #define EXYNOS_ADC_TIMEOUT (msecs_to_jiffies(100)) 94 92 93 + #define EXYNOS_ADCV1_PHY_OFFSET 0x0718 94 + #define EXYNOS_ADCV2_PHY_OFFSET 0x0720 95 + 95 96 struct exynos_adc { 96 97 struct exynos_adc_data *data; 97 98 struct device *dev; 98 99 void __iomem *regs; 99 - void __iomem *enable_reg; 100 + struct regmap *pmu_map; 100 101 struct clk *clk; 101 102 struct clk *sclk; 102 103 unsigned int irq; ··· 115 110 int num_channels; 116 111 bool needs_sclk; 117 112 bool needs_adc_phy; 113 + int phy_offset; 118 114 u32 mask; 119 115 120 116 void (*init_hw)(struct exynos_adc *info); ··· 189 183 u32 con1; 190 184 191 185 if (info->data->needs_adc_phy) 192 - writel(1, info->enable_reg); 186 + regmap_write(info->pmu_map, info->data->phy_offset, 1); 193 187 194 188 /* set default prescaler values and Enable prescaler */ 195 189 con1 = ADC_V1_CON_PRSCLV(49) | ADC_V1_CON_PRSCEN; ··· 204 198 u32 con; 205 199 206 200 if (info->data->needs_adc_phy) 207 - writel(0, info->enable_reg); 201 + regmap_write(info->pmu_map, info->data->phy_offset, 0); 208 202 209 203 con = readl(ADC_V1_CON(info->regs)); 210 204 con |= ADC_V1_CON_STANDBY; ··· 231 225 .num_channels = MAX_ADC_V1_CHANNELS, 232 226 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 233 227 .needs_adc_phy = true, 228 + .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, 234 229 235 230 .init_hw = exynos_adc_v1_init_hw, 236 231 .exit_hw = exynos_adc_v1_exit_hw, ··· 321 314 u32 con1, con2; 322 315 323 316 if (info->data->needs_adc_phy) 324 - writel(1, info->enable_reg); 317 + regmap_write(info->pmu_map, info->data->phy_offset, 1); 325 318 326 319 con1 = ADC_V2_CON1_SOFT_RESET; 327 320 writel(con1, ADC_V2_CON1(info->regs)); ··· 339 332 u32 con; 340 333 341 334 if (info->data->needs_adc_phy) 342 - writel(0, info->enable_reg); 335 + regmap_write(info->pmu_map, info->data->phy_offset, 0); 343 336 344 337 con = readl(ADC_V2_CON1(info->regs)); 345 338 con &= ~ADC_CON_EN_START; ··· 369 362 .num_channels = MAX_ADC_V2_CHANNELS, 370 363 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 371 364 .needs_adc_phy = true, 365 + .phy_offset = EXYNOS_ADCV2_PHY_OFFSET, 372 366 373 367 .init_hw = exynos_adc_v2_init_hw, 374 368 .exit_hw = exynos_adc_v2_exit_hw, ··· 382 374 .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 383 375 .needs_sclk = true, 384 376 .needs_adc_phy = true, 377 + .phy_offset = EXYNOS_ADCV1_PHY_OFFSET, 385 378 386 379 .init_hw = exynos_adc_v2_init_hw, 380 + .exit_hw = exynos_adc_v2_exit_hw, 381 + .clear_irq = exynos_adc_v2_clear_irq, 382 + .start_conv = exynos_adc_v2_start_conv, 383 + }; 384 + 385 + static void exynos_adc_exynos7_init_hw(struct exynos_adc *info) 386 + { 387 + u32 con1, con2; 388 + 389 + if (info->data->needs_adc_phy) 390 + regmap_write(info->pmu_map, info->data->phy_offset, 1); 391 + 392 + con1 = ADC_V2_CON1_SOFT_RESET; 393 + writel(con1, ADC_V2_CON1(info->regs)); 394 + 395 + con2 = readl(ADC_V2_CON2(info->regs)); 396 + con2 &= ~ADC_V2_CON2_C_TIME(7); 397 + con2 |= ADC_V2_CON2_C_TIME(0); 398 + writel(con2, ADC_V2_CON2(info->regs)); 399 + 400 + /* Enable interrupts */ 401 + writel(1, ADC_V2_INT_EN(info->regs)); 402 + } 403 + 404 + static const struct exynos_adc_data exynos7_adc_data = { 405 + .num_channels = MAX_ADC_V1_CHANNELS, 406 + .mask = ADC_DATX_MASK, /* 12 bit ADC resolution */ 407 + 408 + .init_hw = exynos_adc_exynos7_init_hw, 387 409 .exit_hw = exynos_adc_v2_exit_hw, 388 410 .clear_irq = exynos_adc_v2_clear_irq, 389 411 .start_conv = exynos_adc_v2_start_conv, ··· 444 406 }, { 445 407 .compatible = "samsung,exynos3250-adc", 446 408 .data = &exynos3250_adc_data, 409 + }, { 410 + .compatible = "samsung,exynos7-adc", 411 + .data = &exynos7_adc_data, 447 412 }, 448 413 {}, 449 414 }; ··· 599 558 600 559 601 560 if (info->data->needs_adc_phy) { 602 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); 603 - info->enable_reg = devm_ioremap_resource(&pdev->dev, mem); 604 - if (IS_ERR(info->enable_reg)) 605 - return PTR_ERR(info->enable_reg); 561 + info->pmu_map = syscon_regmap_lookup_by_phandle( 562 + pdev->dev.of_node, 563 + "samsung,syscon-phandle"); 564 + if (IS_ERR(info->pmu_map)) { 565 + dev_err(&pdev->dev, "syscon regmap lookup failed.\n"); 566 + return PTR_ERR(info->pmu_map); 567 + } 606 568 } 607 569 608 570 irq = platform_get_irq(pdev, 0);
+187 -35
drivers/iio/adc/mcp320x.c
··· 1 1 /* 2 2 * Copyright (C) 2013 Oskar Andero <oskar.andero@gmail.com> 3 + * Copyright (C) 2014 Rose Technology 4 + * Allan Bendorff Jensen <abj@rosetechnology.dk> 5 + * Soren Andersen <san@rosetechnology.dk> 3 6 * 4 - * Driver for Microchip Technology's MCP3204 and MCP3208 ADC chips. 7 + * Driver for following ADC chips from Microchip Technology's: 8 + * 10 Bit converter 9 + * MCP3001 10 + * MCP3002 11 + * MCP3004 12 + * MCP3008 13 + * ------------ 14 + * 12 bit converter 15 + * MCP3201 16 + * MCP3202 17 + * MCP3204 18 + * MCP3208 19 + * ------------ 20 + * 5 21 * Datasheet can be found here: 6 - * http://ww1.microchip.com/downloads/en/devicedoc/21298c.pdf 22 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21293C.pdf mcp3001 23 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21294E.pdf mcp3002 24 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21295d.pdf mcp3004/08 25 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21290D.pdf mcp3201 26 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf mcp3202 27 + * http://ww1.microchip.com/downloads/en/DeviceDoc/21298c.pdf mcp3204/08 7 28 * 8 29 * This program is free software; you can redistribute it and/or modify 9 30 * it under the terms of the GNU General Public License version 2 as ··· 32 11 */ 33 12 34 13 #include <linux/err.h> 14 + #include <linux/delay.h> 35 15 #include <linux/spi/spi.h> 36 16 #include <linux/module.h> 37 17 #include <linux/iio/iio.h> 38 18 #include <linux/regulator/consumer.h> 39 19 40 - #define MCP_SINGLE_ENDED (1 << 3) 41 - #define MCP_START_BIT (1 << 4) 42 - 43 20 enum { 21 + mcp3001, 22 + mcp3002, 23 + mcp3004, 24 + mcp3008, 25 + mcp3201, 26 + mcp3202, 44 27 mcp3204, 45 28 mcp3208, 29 + }; 30 + 31 + struct mcp320x_chip_info { 32 + const struct iio_chan_spec *channels; 33 + unsigned int num_channels; 34 + unsigned int resolution; 46 35 }; 47 36 48 37 struct mcp320x { ··· 65 34 66 35 struct regulator *reg; 67 36 struct mutex lock; 37 + const struct mcp320x_chip_info *chip_info; 68 38 }; 69 39 70 - static int mcp320x_adc_conversion(struct mcp320x *adc, u8 msg) 40 + static int mcp320x_channel_to_tx_data(int device_index, 41 + const unsigned int channel, bool differential) 42 + { 43 + int start_bit = 1; 44 + 45 + switch (device_index) { 46 + case mcp3001: 47 + case mcp3201: 48 + return 0; 49 + case mcp3002: 50 + case mcp3202: 51 + return ((start_bit << 4) | (!differential << 3) | 52 + (channel << 2)); 53 + case mcp3004: 54 + case mcp3204: 55 + case mcp3008: 56 + case mcp3208: 57 + return ((start_bit << 6) | (!differential << 5) | 58 + (channel << 2)); 59 + default: 60 + return -EINVAL; 61 + } 62 + } 63 + 64 + static int mcp320x_adc_conversion(struct mcp320x *adc, u8 channel, 65 + bool differential, int device_index) 71 66 { 72 67 int ret; 73 68 74 - adc->tx_buf = msg; 75 - ret = spi_sync(adc->spi, &adc->msg); 76 - if (ret < 0) 77 - return ret; 69 + adc->rx_buf[0] = 0; 70 + adc->rx_buf[1] = 0; 71 + adc->tx_buf = mcp320x_channel_to_tx_data(device_index, 72 + channel, differential); 78 73 79 - return ((adc->rx_buf[0] & 0x3f) << 6) | 80 - (adc->rx_buf[1] >> 2); 74 + if (device_index != mcp3001 && device_index != mcp3201) { 75 + ret = spi_sync(adc->spi, &adc->msg); 76 + if (ret < 0) 77 + return ret; 78 + } else { 79 + ret = spi_read(adc->spi, &adc->rx_buf, sizeof(adc->rx_buf)); 80 + if (ret < 0) 81 + return ret; 82 + } 83 + 84 + switch (device_index) { 85 + case mcp3001: 86 + return (adc->rx_buf[0] << 5 | adc->rx_buf[1] >> 3); 87 + case mcp3002: 88 + case mcp3004: 89 + case mcp3008: 90 + return (adc->rx_buf[0] << 2 | adc->rx_buf[1] >> 6); 91 + case mcp3201: 92 + return (adc->rx_buf[0] << 7 | adc->rx_buf[1] >> 1); 93 + case mcp3202: 94 + case mcp3204: 95 + case mcp3208: 96 + return (adc->rx_buf[0] << 4 | adc->rx_buf[1] >> 4); 97 + default: 98 + return -EINVAL; 99 + } 81 100 } 82 101 83 102 static int mcp320x_read_raw(struct iio_dev *indio_dev, ··· 136 55 { 137 56 struct mcp320x *adc = iio_priv(indio_dev); 138 57 int ret = -EINVAL; 58 + int device_index = 0; 139 59 140 60 mutex_lock(&adc->lock); 141 61 62 + device_index = spi_get_device_id(adc->spi)->driver_data; 63 + 142 64 switch (mask) { 143 65 case IIO_CHAN_INFO_RAW: 144 - if (channel->differential) 145 - ret = mcp320x_adc_conversion(adc, 146 - MCP_START_BIT | channel->address); 147 - else 148 - ret = mcp320x_adc_conversion(adc, 149 - MCP_START_BIT | MCP_SINGLE_ENDED | 150 - channel->address); 66 + ret = mcp320x_adc_conversion(adc, channel->address, 67 + channel->differential, device_index); 68 + 151 69 if (ret < 0) 152 70 goto out; 153 71 ··· 155 75 break; 156 76 157 77 case IIO_CHAN_INFO_SCALE: 158 - /* Digital output code = (4096 * Vin) / Vref */ 159 78 ret = regulator_get_voltage(adc->reg); 160 79 if (ret < 0) 161 80 goto out; 162 81 82 + /* convert regulator output voltage to mV */ 163 83 *val = ret / 1000; 164 - *val2 = 12; 84 + *val2 = adc->chip_info->resolution; 165 85 ret = IIO_VAL_FRACTIONAL_LOG2; 166 - break; 167 - 168 - default: 169 86 break; 170 87 } 171 88 ··· 194 117 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) \ 195 118 } 196 119 120 + static const struct iio_chan_spec mcp3201_channels[] = { 121 + MCP320X_VOLTAGE_CHANNEL_DIFF(0), 122 + }; 123 + 124 + static const struct iio_chan_spec mcp3202_channels[] = { 125 + MCP320X_VOLTAGE_CHANNEL(0), 126 + MCP320X_VOLTAGE_CHANNEL(1), 127 + MCP320X_VOLTAGE_CHANNEL_DIFF(0), 128 + }; 129 + 197 130 static const struct iio_chan_spec mcp3204_channels[] = { 198 131 MCP320X_VOLTAGE_CHANNEL(0), 199 132 MCP320X_VOLTAGE_CHANNEL(1), ··· 233 146 .driver_module = THIS_MODULE, 234 147 }; 235 148 236 - struct mcp3208_chip_info { 237 - const struct iio_chan_spec *channels; 238 - unsigned int num_channels; 239 - }; 240 - 241 - static const struct mcp3208_chip_info mcp3208_chip_infos[] = { 149 + static const struct mcp320x_chip_info mcp320x_chip_infos[] = { 150 + [mcp3001] = { 151 + .channels = mcp3201_channels, 152 + .num_channels = ARRAY_SIZE(mcp3201_channels), 153 + .resolution = 10 154 + }, 155 + [mcp3002] = { 156 + .channels = mcp3202_channels, 157 + .num_channels = ARRAY_SIZE(mcp3202_channels), 158 + .resolution = 10 159 + }, 160 + [mcp3004] = { 161 + .channels = mcp3204_channels, 162 + .num_channels = ARRAY_SIZE(mcp3204_channels), 163 + .resolution = 10 164 + }, 165 + [mcp3008] = { 166 + .channels = mcp3208_channels, 167 + .num_channels = ARRAY_SIZE(mcp3208_channels), 168 + .resolution = 10 169 + }, 170 + [mcp3201] = { 171 + .channels = mcp3201_channels, 172 + .num_channels = ARRAY_SIZE(mcp3201_channels), 173 + .resolution = 12 174 + }, 175 + [mcp3202] = { 176 + .channels = mcp3202_channels, 177 + .num_channels = ARRAY_SIZE(mcp3202_channels), 178 + .resolution = 12 179 + }, 242 180 [mcp3204] = { 243 181 .channels = mcp3204_channels, 244 - .num_channels = ARRAY_SIZE(mcp3204_channels) 182 + .num_channels = ARRAY_SIZE(mcp3204_channels), 183 + .resolution = 12 245 184 }, 246 185 [mcp3208] = { 247 186 .channels = mcp3208_channels, 248 - .num_channels = ARRAY_SIZE(mcp3208_channels) 187 + .num_channels = ARRAY_SIZE(mcp3208_channels), 188 + .resolution = 12 249 189 }, 250 190 }; 251 191 ··· 280 166 { 281 167 struct iio_dev *indio_dev; 282 168 struct mcp320x *adc; 283 - const struct mcp3208_chip_info *chip_info; 169 + const struct mcp320x_chip_info *chip_info; 284 170 int ret; 285 171 286 172 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adc)); ··· 295 181 indio_dev->modes = INDIO_DIRECT_MODE; 296 182 indio_dev->info = &mcp320x_info; 297 183 298 - chip_info = &mcp3208_chip_infos[spi_get_device_id(spi)->driver_data]; 184 + chip_info = &mcp320x_chip_infos[spi_get_device_id(spi)->driver_data]; 299 185 indio_dev->channels = chip_info->channels; 300 186 indio_dev->num_channels = chip_info->num_channels; 301 187 ··· 340 226 return 0; 341 227 } 342 228 229 + #if defined(CONFIG_OF) 230 + static const struct of_device_id mcp320x_dt_ids[] = { 231 + { 232 + .compatible = "mcp3001", 233 + .data = &mcp320x_chip_infos[mcp3001], 234 + }, { 235 + .compatible = "mcp3002", 236 + .data = &mcp320x_chip_infos[mcp3002], 237 + }, { 238 + .compatible = "mcp3004", 239 + .data = &mcp320x_chip_infos[mcp3004], 240 + }, { 241 + .compatible = "mcp3008", 242 + .data = &mcp320x_chip_infos[mcp3008], 243 + }, { 244 + .compatible = "mcp3201", 245 + .data = &mcp320x_chip_infos[mcp3201], 246 + }, { 247 + .compatible = "mcp3202", 248 + .data = &mcp320x_chip_infos[mcp3202], 249 + }, { 250 + .compatible = "mcp3204", 251 + .data = &mcp320x_chip_infos[mcp3204], 252 + }, { 253 + .compatible = "mcp3208", 254 + .data = &mcp320x_chip_infos[mcp3208], 255 + }, { 256 + } 257 + }; 258 + MODULE_DEVICE_TABLE(of, mcp320x_dt_ids); 259 + #endif 260 + 343 261 static const struct spi_device_id mcp320x_id[] = { 262 + { "mcp3001", mcp3001 }, 263 + { "mcp3002", mcp3002 }, 264 + { "mcp3004", mcp3004 }, 265 + { "mcp3008", mcp3008 }, 266 + { "mcp3201", mcp3201 }, 267 + { "mcp3202", mcp3202 }, 344 268 { "mcp3204", mcp3204 }, 345 269 { "mcp3208", mcp3208 }, 346 270 { } ··· 397 245 module_spi_driver(mcp320x_driver); 398 246 399 247 MODULE_AUTHOR("Oskar Andero <oskar.andero@gmail.com>"); 400 - MODULE_DESCRIPTION("Microchip Technology MCP3204/08"); 248 + MODULE_DESCRIPTION("Microchip Technology MCP3x01/02/04/08"); 401 249 MODULE_LICENSE("GPL v2");
+595
drivers/iio/adc/qcom-spmi-iadc.c
··· 1 + /* 2 + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. 3 + * 4 + * This program is free software; you can redistribute it and/or modify 5 + * it under the terms of the GNU General Public License version 2 and 6 + * only version 2 as published by the Free Software Foundation. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + */ 13 + 14 + #include <linux/bitops.h> 15 + #include <linux/completion.h> 16 + #include <linux/delay.h> 17 + #include <linux/err.h> 18 + #include <linux/iio/iio.h> 19 + #include <linux/interrupt.h> 20 + #include <linux/kernel.h> 21 + #include <linux/mutex.h> 22 + #include <linux/module.h> 23 + #include <linux/of.h> 24 + #include <linux/of_device.h> 25 + #include <linux/platform_device.h> 26 + #include <linux/regmap.h> 27 + #include <linux/slab.h> 28 + 29 + /* IADC register and bit definition */ 30 + #define IADC_REVISION2 0x1 31 + #define IADC_REVISION2_SUPPORTED_IADC 1 32 + 33 + #define IADC_PERPH_TYPE 0x4 34 + #define IADC_PERPH_TYPE_ADC 8 35 + 36 + #define IADC_PERPH_SUBTYPE 0x5 37 + #define IADC_PERPH_SUBTYPE_IADC 3 38 + 39 + #define IADC_STATUS1 0x8 40 + #define IADC_STATUS1_OP_MODE 4 41 + #define IADC_STATUS1_REQ_STS BIT(1) 42 + #define IADC_STATUS1_EOC BIT(0) 43 + #define IADC_STATUS1_REQ_STS_EOC_MASK 0x3 44 + 45 + #define IADC_MODE_CTL 0x40 46 + #define IADC_OP_MODE_SHIFT 3 47 + #define IADC_OP_MODE_NORMAL 0 48 + #define IADC_TRIM_EN BIT(0) 49 + 50 + #define IADC_EN_CTL1 0x46 51 + #define IADC_EN_CTL1_SET BIT(7) 52 + 53 + #define IADC_CH_SEL_CTL 0x48 54 + 55 + #define IADC_DIG_PARAM 0x50 56 + #define IADC_DIG_DEC_RATIO_SEL_SHIFT 2 57 + 58 + #define IADC_HW_SETTLE_DELAY 0x51 59 + 60 + #define IADC_CONV_REQ 0x52 61 + #define IADC_CONV_REQ_SET BIT(7) 62 + 63 + #define IADC_FAST_AVG_CTL 0x5a 64 + #define IADC_FAST_AVG_EN 0x5b 65 + #define IADC_FAST_AVG_EN_SET BIT(7) 66 + 67 + #define IADC_PERH_RESET_CTL3 0xda 68 + #define IADC_FOLLOW_WARM_RB BIT(2) 69 + 70 + #define IADC_DATA 0x60 /* 16 bits */ 71 + 72 + #define IADC_SEC_ACCESS 0xd0 73 + #define IADC_SEC_ACCESS_DATA 0xa5 74 + 75 + #define IADC_NOMINAL_RSENSE 0xf4 76 + #define IADC_NOMINAL_RSENSE_SIGN_MASK BIT(7) 77 + 78 + #define IADC_REF_GAIN_MICRO_VOLTS 17857 79 + 80 + #define IADC_INT_RSENSE_DEVIATION 15625 /* nano Ohms per bit */ 81 + 82 + #define IADC_INT_RSENSE_IDEAL_VALUE 10000 /* micro Ohms */ 83 + #define IADC_INT_RSENSE_DEFAULT_VALUE 7800 /* micro Ohms */ 84 + #define IADC_INT_RSENSE_DEFAULT_GF 9000 /* micro Ohms */ 85 + #define IADC_INT_RSENSE_DEFAULT_SMIC 9700 /* micro Ohms */ 86 + 87 + #define IADC_CONV_TIME_MIN_US 2000 88 + #define IADC_CONV_TIME_MAX_US 2100 89 + 90 + #define IADC_DEF_PRESCALING 0 /* 1:1 */ 91 + #define IADC_DEF_DECIMATION 0 /* 512 */ 92 + #define IADC_DEF_HW_SETTLE_TIME 0 /* 0 us */ 93 + #define IADC_DEF_AVG_SAMPLES 0 /* 1 sample */ 94 + 95 + /* IADC channel list */ 96 + #define IADC_INT_RSENSE 0 97 + #define IADC_EXT_RSENSE 1 98 + #define IADC_GAIN_17P857MV 3 99 + #define IADC_EXT_OFFSET_CSP_CSN 5 100 + #define IADC_INT_OFFSET_CSP2_CSN2 6 101 + 102 + /** 103 + * struct iadc_chip - IADC Current ADC device structure. 104 + * @regmap: regmap for register read/write. 105 + * @dev: This device pointer. 106 + * @base: base offset for the ADC peripheral. 107 + * @rsense: Values of the internal and external sense resister in micro Ohms. 108 + * @poll_eoc: Poll for end of conversion instead of waiting for IRQ. 109 + * @offset: Raw offset values for the internal and external channels. 110 + * @gain: Raw gain of the channels. 111 + * @lock: ADC lock for access to the peripheral. 112 + * @complete: ADC notification after end of conversion interrupt is received. 113 + */ 114 + struct iadc_chip { 115 + struct regmap *regmap; 116 + struct device *dev; 117 + u16 base; 118 + bool poll_eoc; 119 + u32 rsense[2]; 120 + u16 offset[2]; 121 + u16 gain; 122 + struct mutex lock; 123 + struct completion complete; 124 + }; 125 + 126 + static int iadc_read(struct iadc_chip *iadc, u16 offset, u8 *data) 127 + { 128 + unsigned int val; 129 + int ret; 130 + 131 + ret = regmap_read(iadc->regmap, iadc->base + offset, &val); 132 + if (ret < 0) 133 + return ret; 134 + 135 + *data = val; 136 + return 0; 137 + } 138 + 139 + static int iadc_write(struct iadc_chip *iadc, u16 offset, u8 data) 140 + { 141 + return regmap_write(iadc->regmap, iadc->base + offset, data); 142 + } 143 + 144 + static int iadc_reset(struct iadc_chip *iadc) 145 + { 146 + u8 data; 147 + int ret; 148 + 149 + ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); 150 + if (ret < 0) 151 + return ret; 152 + 153 + ret = iadc_read(iadc, IADC_PERH_RESET_CTL3, &data); 154 + if (ret < 0) 155 + return ret; 156 + 157 + ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); 158 + if (ret < 0) 159 + return ret; 160 + 161 + data |= IADC_FOLLOW_WARM_RB; 162 + 163 + return iadc_write(iadc, IADC_PERH_RESET_CTL3, data); 164 + } 165 + 166 + static int iadc_set_state(struct iadc_chip *iadc, bool state) 167 + { 168 + return iadc_write(iadc, IADC_EN_CTL1, state ? IADC_EN_CTL1_SET : 0); 169 + } 170 + 171 + static void iadc_status_show(struct iadc_chip *iadc) 172 + { 173 + u8 mode, sta1, chan, dig, en, req; 174 + int ret; 175 + 176 + ret = iadc_read(iadc, IADC_MODE_CTL, &mode); 177 + if (ret < 0) 178 + return; 179 + 180 + ret = iadc_read(iadc, IADC_DIG_PARAM, &dig); 181 + if (ret < 0) 182 + return; 183 + 184 + ret = iadc_read(iadc, IADC_CH_SEL_CTL, &chan); 185 + if (ret < 0) 186 + return; 187 + 188 + ret = iadc_read(iadc, IADC_CONV_REQ, &req); 189 + if (ret < 0) 190 + return; 191 + 192 + ret = iadc_read(iadc, IADC_STATUS1, &sta1); 193 + if (ret < 0) 194 + return; 195 + 196 + ret = iadc_read(iadc, IADC_EN_CTL1, &en); 197 + if (ret < 0) 198 + return; 199 + 200 + dev_err(iadc->dev, 201 + "mode:%02x en:%02x chan:%02x dig:%02x req:%02x sta1:%02x\n", 202 + mode, en, chan, dig, req, sta1); 203 + } 204 + 205 + static int iadc_configure(struct iadc_chip *iadc, int channel) 206 + { 207 + u8 decim, mode; 208 + int ret; 209 + 210 + /* Mode selection */ 211 + mode = (IADC_OP_MODE_NORMAL << IADC_OP_MODE_SHIFT) | IADC_TRIM_EN; 212 + ret = iadc_write(iadc, IADC_MODE_CTL, mode); 213 + if (ret < 0) 214 + return ret; 215 + 216 + /* Channel selection */ 217 + ret = iadc_write(iadc, IADC_CH_SEL_CTL, channel); 218 + if (ret < 0) 219 + return ret; 220 + 221 + /* Digital parameter setup */ 222 + decim = IADC_DEF_DECIMATION << IADC_DIG_DEC_RATIO_SEL_SHIFT; 223 + ret = iadc_write(iadc, IADC_DIG_PARAM, decim); 224 + if (ret < 0) 225 + return ret; 226 + 227 + /* HW settle time delay */ 228 + ret = iadc_write(iadc, IADC_HW_SETTLE_DELAY, IADC_DEF_HW_SETTLE_TIME); 229 + if (ret < 0) 230 + return ret; 231 + 232 + ret = iadc_write(iadc, IADC_FAST_AVG_CTL, IADC_DEF_AVG_SAMPLES); 233 + if (ret < 0) 234 + return ret; 235 + 236 + if (IADC_DEF_AVG_SAMPLES) 237 + ret = iadc_write(iadc, IADC_FAST_AVG_EN, IADC_FAST_AVG_EN_SET); 238 + else 239 + ret = iadc_write(iadc, IADC_FAST_AVG_EN, 0); 240 + 241 + if (ret < 0) 242 + return ret; 243 + 244 + if (!iadc->poll_eoc) 245 + reinit_completion(&iadc->complete); 246 + 247 + ret = iadc_set_state(iadc, true); 248 + if (ret < 0) 249 + return ret; 250 + 251 + /* Request conversion */ 252 + return iadc_write(iadc, IADC_CONV_REQ, IADC_CONV_REQ_SET); 253 + } 254 + 255 + static int iadc_poll_wait_eoc(struct iadc_chip *iadc, unsigned int interval_us) 256 + { 257 + unsigned int count, retry; 258 + int ret; 259 + u8 sta1; 260 + 261 + retry = interval_us / IADC_CONV_TIME_MIN_US; 262 + 263 + for (count = 0; count < retry; count++) { 264 + ret = iadc_read(iadc, IADC_STATUS1, &sta1); 265 + if (ret < 0) 266 + return ret; 267 + 268 + sta1 &= IADC_STATUS1_REQ_STS_EOC_MASK; 269 + if (sta1 == IADC_STATUS1_EOC) 270 + return 0; 271 + 272 + usleep_range(IADC_CONV_TIME_MIN_US, IADC_CONV_TIME_MAX_US); 273 + } 274 + 275 + iadc_status_show(iadc); 276 + 277 + return -ETIMEDOUT; 278 + } 279 + 280 + static int iadc_read_result(struct iadc_chip *iadc, u16 *data) 281 + { 282 + return regmap_bulk_read(iadc->regmap, iadc->base + IADC_DATA, data, 2); 283 + } 284 + 285 + static int iadc_do_conversion(struct iadc_chip *iadc, int chan, u16 *data) 286 + { 287 + unsigned int wait; 288 + int ret; 289 + 290 + ret = iadc_configure(iadc, chan); 291 + if (ret < 0) 292 + goto exit; 293 + 294 + wait = BIT(IADC_DEF_AVG_SAMPLES) * IADC_CONV_TIME_MIN_US * 2; 295 + 296 + if (iadc->poll_eoc) { 297 + ret = iadc_poll_wait_eoc(iadc, wait); 298 + } else { 299 + ret = wait_for_completion_timeout(&iadc->complete, wait); 300 + if (!ret) 301 + ret = -ETIMEDOUT; 302 + else 303 + /* double check conversion status */ 304 + ret = iadc_poll_wait_eoc(iadc, IADC_CONV_TIME_MIN_US); 305 + } 306 + 307 + if (!ret) 308 + ret = iadc_read_result(iadc, data); 309 + exit: 310 + iadc_set_state(iadc, false); 311 + if (ret < 0) 312 + dev_err(iadc->dev, "conversion failed\n"); 313 + 314 + return ret; 315 + } 316 + 317 + static int iadc_read_raw(struct iio_dev *indio_dev, 318 + struct iio_chan_spec const *chan, 319 + int *val, int *val2, long mask) 320 + { 321 + struct iadc_chip *iadc = iio_priv(indio_dev); 322 + s32 isense_ua, vsense_uv; 323 + u16 adc_raw, vsense_raw; 324 + int ret; 325 + 326 + switch (mask) { 327 + case IIO_CHAN_INFO_RAW: 328 + mutex_lock(&iadc->lock); 329 + ret = iadc_do_conversion(iadc, chan->channel, &adc_raw); 330 + mutex_unlock(&iadc->lock); 331 + if (ret < 0) 332 + return ret; 333 + 334 + vsense_raw = adc_raw - iadc->offset[chan->channel]; 335 + 336 + vsense_uv = vsense_raw * IADC_REF_GAIN_MICRO_VOLTS; 337 + vsense_uv /= (s32)iadc->gain - iadc->offset[chan->channel]; 338 + 339 + isense_ua = vsense_uv / iadc->rsense[chan->channel]; 340 + 341 + dev_dbg(iadc->dev, "off %d gain %d adc %d %duV I %duA\n", 342 + iadc->offset[chan->channel], iadc->gain, 343 + adc_raw, vsense_uv, isense_ua); 344 + 345 + *val = isense_ua; 346 + return IIO_VAL_INT; 347 + case IIO_CHAN_INFO_SCALE: 348 + *val = 0; 349 + *val2 = 1000; 350 + return IIO_VAL_INT_PLUS_MICRO; 351 + } 352 + 353 + return -EINVAL; 354 + } 355 + 356 + static const struct iio_info iadc_info = { 357 + .read_raw = iadc_read_raw, 358 + .driver_module = THIS_MODULE, 359 + }; 360 + 361 + static irqreturn_t iadc_isr(int irq, void *dev_id) 362 + { 363 + struct iadc_chip *iadc = dev_id; 364 + 365 + complete(&iadc->complete); 366 + 367 + return IRQ_HANDLED; 368 + } 369 + 370 + static int iadc_update_offset(struct iadc_chip *iadc) 371 + { 372 + int ret; 373 + 374 + ret = iadc_do_conversion(iadc, IADC_GAIN_17P857MV, &iadc->gain); 375 + if (ret < 0) 376 + return ret; 377 + 378 + ret = iadc_do_conversion(iadc, IADC_INT_OFFSET_CSP2_CSN2, 379 + &iadc->offset[IADC_INT_RSENSE]); 380 + if (ret < 0) 381 + return ret; 382 + 383 + if (iadc->gain == iadc->offset[IADC_INT_RSENSE]) { 384 + dev_err(iadc->dev, "error: internal offset == gain %d\n", 385 + iadc->gain); 386 + return -EINVAL; 387 + } 388 + 389 + ret = iadc_do_conversion(iadc, IADC_EXT_OFFSET_CSP_CSN, 390 + &iadc->offset[IADC_EXT_RSENSE]); 391 + if (ret < 0) 392 + return ret; 393 + 394 + if (iadc->gain == iadc->offset[IADC_EXT_RSENSE]) { 395 + dev_err(iadc->dev, "error: external offset == gain %d\n", 396 + iadc->gain); 397 + return -EINVAL; 398 + } 399 + 400 + return 0; 401 + } 402 + 403 + static int iadc_version_check(struct iadc_chip *iadc) 404 + { 405 + u8 val; 406 + int ret; 407 + 408 + ret = iadc_read(iadc, IADC_PERPH_TYPE, &val); 409 + if (ret < 0) 410 + return ret; 411 + 412 + if (val < IADC_PERPH_TYPE_ADC) { 413 + dev_err(iadc->dev, "%d is not ADC\n", val); 414 + return -EINVAL; 415 + } 416 + 417 + ret = iadc_read(iadc, IADC_PERPH_SUBTYPE, &val); 418 + if (ret < 0) 419 + return ret; 420 + 421 + if (val < IADC_PERPH_SUBTYPE_IADC) { 422 + dev_err(iadc->dev, "%d is not IADC\n", val); 423 + return -EINVAL; 424 + } 425 + 426 + ret = iadc_read(iadc, IADC_REVISION2, &val); 427 + if (ret < 0) 428 + return ret; 429 + 430 + if (val < IADC_REVISION2_SUPPORTED_IADC) { 431 + dev_err(iadc->dev, "revision %d not supported\n", val); 432 + return -EINVAL; 433 + } 434 + 435 + return 0; 436 + } 437 + 438 + static int iadc_rsense_read(struct iadc_chip *iadc, struct device_node *node) 439 + { 440 + int ret, sign, int_sense; 441 + u8 deviation; 442 + 443 + ret = of_property_read_u32(node, "qcom,external-resistor-micro-ohms", 444 + &iadc->rsense[IADC_EXT_RSENSE]); 445 + if (ret < 0) 446 + iadc->rsense[IADC_EXT_RSENSE] = IADC_INT_RSENSE_IDEAL_VALUE; 447 + 448 + if (!iadc->rsense[IADC_EXT_RSENSE]) { 449 + dev_err(iadc->dev, "external resistor can't be zero Ohms"); 450 + return -EINVAL; 451 + } 452 + 453 + ret = iadc_read(iadc, IADC_NOMINAL_RSENSE, &deviation); 454 + if (ret < 0) 455 + return ret; 456 + 457 + /* 458 + * Deviation value stored is an offset from 10 mili Ohms, bit 7 is 459 + * the sign, the remaining bits have an LSB of 15625 nano Ohms. 460 + */ 461 + sign = (deviation & IADC_NOMINAL_RSENSE_SIGN_MASK) ? -1 : 1; 462 + 463 + deviation &= ~IADC_NOMINAL_RSENSE_SIGN_MASK; 464 + 465 + /* Scale it to nono Ohms */ 466 + int_sense = IADC_INT_RSENSE_IDEAL_VALUE * 1000; 467 + int_sense += sign * deviation * IADC_INT_RSENSE_DEVIATION; 468 + int_sense /= 1000; /* micro Ohms */ 469 + 470 + iadc->rsense[IADC_INT_RSENSE] = int_sense; 471 + return 0; 472 + } 473 + 474 + static const struct iio_chan_spec iadc_channels[] = { 475 + { 476 + .type = IIO_CURRENT, 477 + .datasheet_name = "INTERNAL_RSENSE", 478 + .channel = 0, 479 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 480 + BIT(IIO_CHAN_INFO_SCALE), 481 + .indexed = 1, 482 + }, 483 + { 484 + .type = IIO_CURRENT, 485 + .datasheet_name = "EXTERNAL_RSENSE", 486 + .channel = 1, 487 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 488 + BIT(IIO_CHAN_INFO_SCALE), 489 + .indexed = 1, 490 + }, 491 + }; 492 + 493 + static int iadc_probe(struct platform_device *pdev) 494 + { 495 + struct device_node *node = pdev->dev.of_node; 496 + struct device *dev = &pdev->dev; 497 + struct iio_dev *indio_dev; 498 + struct iadc_chip *iadc; 499 + int ret, irq_eoc; 500 + u32 res; 501 + 502 + indio_dev = devm_iio_device_alloc(dev, sizeof(*iadc)); 503 + if (!indio_dev) 504 + return -ENOMEM; 505 + 506 + iadc = iio_priv(indio_dev); 507 + iadc->dev = dev; 508 + 509 + iadc->regmap = dev_get_regmap(dev->parent, NULL); 510 + if (!iadc->regmap) 511 + return -ENODEV; 512 + 513 + init_completion(&iadc->complete); 514 + mutex_init(&iadc->lock); 515 + 516 + ret = of_property_read_u32(node, "reg", &res); 517 + if (ret < 0) 518 + return -ENODEV; 519 + 520 + iadc->base = res; 521 + 522 + ret = iadc_version_check(iadc); 523 + if (ret < 0) 524 + return -ENODEV; 525 + 526 + ret = iadc_rsense_read(iadc, node); 527 + if (ret < 0) 528 + return -ENODEV; 529 + 530 + dev_dbg(iadc->dev, "sense resistors %d and %d micro Ohm\n", 531 + iadc->rsense[IADC_INT_RSENSE], 532 + iadc->rsense[IADC_EXT_RSENSE]); 533 + 534 + irq_eoc = platform_get_irq(pdev, 0); 535 + if (irq_eoc == -EPROBE_DEFER) 536 + return irq_eoc; 537 + 538 + if (irq_eoc < 0) 539 + iadc->poll_eoc = true; 540 + 541 + ret = iadc_reset(iadc); 542 + if (ret < 0) { 543 + dev_err(dev, "reset failed\n"); 544 + return ret; 545 + } 546 + 547 + if (!iadc->poll_eoc) { 548 + ret = devm_request_irq(dev, irq_eoc, iadc_isr, 0, 549 + "spmi-iadc", iadc); 550 + if (!ret) 551 + enable_irq_wake(irq_eoc); 552 + else 553 + return ret; 554 + } else { 555 + device_init_wakeup(iadc->dev, 1); 556 + } 557 + 558 + ret = iadc_update_offset(iadc); 559 + if (ret < 0) { 560 + dev_err(dev, "failed offset calibration\n"); 561 + return ret; 562 + } 563 + 564 + indio_dev->dev.parent = dev; 565 + indio_dev->dev.of_node = node; 566 + indio_dev->name = pdev->name; 567 + indio_dev->modes = INDIO_DIRECT_MODE; 568 + indio_dev->info = &iadc_info; 569 + indio_dev->channels = iadc_channels; 570 + indio_dev->num_channels = ARRAY_SIZE(iadc_channels); 571 + 572 + return devm_iio_device_register(dev, indio_dev); 573 + } 574 + 575 + static const struct of_device_id iadc_match_table[] = { 576 + { .compatible = "qcom,spmi-iadc" }, 577 + { } 578 + }; 579 + 580 + MODULE_DEVICE_TABLE(of, iadc_match_table); 581 + 582 + static struct platform_driver iadc_driver = { 583 + .driver = { 584 + .name = "qcom-spmi-iadc", 585 + .of_match_table = iadc_match_table, 586 + }, 587 + .probe = iadc_probe, 588 + }; 589 + 590 + module_platform_driver(iadc_driver); 591 + 592 + MODULE_ALIAS("platform:qcom-spmi-iadc"); 593 + MODULE_DESCRIPTION("Qualcomm SPMI PMIC current ADC driver"); 594 + MODULE_LICENSE("GPL v2"); 595 + MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");
+50 -14
drivers/iio/adc/rockchip_saradc.c
··· 18 18 #include <linux/interrupt.h> 19 19 #include <linux/io.h> 20 20 #include <linux/of.h> 21 + #include <linux/of_device.h> 21 22 #include <linux/clk.h> 22 23 #include <linux/completion.h> 23 24 #include <linux/regulator/consumer.h> 24 25 #include <linux/iio/iio.h> 25 26 26 27 #define SARADC_DATA 0x00 27 - #define SARADC_DATA_MASK 0x3ff 28 28 29 29 #define SARADC_STAS 0x04 30 30 #define SARADC_STAS_BUSY BIT(0) ··· 38 38 #define SARADC_DLY_PU_SOC 0x0c 39 39 #define SARADC_DLY_PU_SOC_MASK 0x3f 40 40 41 - #define SARADC_BITS 10 42 41 #define SARADC_TIMEOUT msecs_to_jiffies(100) 42 + 43 + struct rockchip_saradc_data { 44 + int num_bits; 45 + const struct iio_chan_spec *channels; 46 + int num_channels; 47 + unsigned long clk_rate; 48 + }; 43 49 44 50 struct rockchip_saradc { 45 51 void __iomem *regs; ··· 53 47 struct clk *clk; 54 48 struct completion completion; 55 49 struct regulator *vref; 50 + const struct rockchip_saradc_data *data; 56 51 u16 last_val; 57 52 }; 58 53 ··· 97 90 } 98 91 99 92 *val = ret / 1000; 100 - *val2 = SARADC_BITS; 93 + *val2 = info->data->num_bits; 101 94 return IIO_VAL_FRACTIONAL_LOG2; 102 95 default: 103 96 return -EINVAL; ··· 110 103 111 104 /* Read value */ 112 105 info->last_val = readl_relaxed(info->regs + SARADC_DATA); 113 - info->last_val &= SARADC_DATA_MASK; 106 + info->last_val &= GENMASK(info->data->num_bits - 1, 0); 114 107 115 108 /* Clear irq & power down adc */ 116 109 writel_relaxed(0, info->regs + SARADC_CTRL); ··· 140 133 ADC_CHANNEL(2, "adc2"), 141 134 }; 142 135 136 + static const struct rockchip_saradc_data saradc_data = { 137 + .num_bits = 10, 138 + .channels = rockchip_saradc_iio_channels, 139 + .num_channels = ARRAY_SIZE(rockchip_saradc_iio_channels), 140 + .clk_rate = 1000000, 141 + }; 142 + 143 + static const struct iio_chan_spec rockchip_rk3066_tsadc_iio_channels[] = { 144 + ADC_CHANNEL(0, "adc0"), 145 + ADC_CHANNEL(1, "adc1"), 146 + }; 147 + 148 + static const struct rockchip_saradc_data rk3066_tsadc_data = { 149 + .num_bits = 12, 150 + .channels = rockchip_rk3066_tsadc_iio_channels, 151 + .num_channels = ARRAY_SIZE(rockchip_rk3066_tsadc_iio_channels), 152 + .clk_rate = 50000, 153 + }; 154 + 155 + static const struct of_device_id rockchip_saradc_match[] = { 156 + { 157 + .compatible = "rockchip,saradc", 158 + .data = &saradc_data, 159 + }, { 160 + .compatible = "rockchip,rk3066-tsadc", 161 + .data = &rk3066_tsadc_data, 162 + }, 163 + {}, 164 + }; 165 + MODULE_DEVICE_TABLE(of, rockchip_saradc_match); 166 + 143 167 static int rockchip_saradc_probe(struct platform_device *pdev) 144 168 { 145 169 struct rockchip_saradc *info = NULL; 146 170 struct device_node *np = pdev->dev.of_node; 147 171 struct iio_dev *indio_dev = NULL; 148 172 struct resource *mem; 173 + const struct of_device_id *match; 149 174 int ret; 150 175 int irq; 151 176 ··· 190 151 return -ENOMEM; 191 152 } 192 153 info = iio_priv(indio_dev); 154 + 155 + match = of_match_device(rockchip_saradc_match, &pdev->dev); 156 + info->data = match->data; 193 157 194 158 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 195 159 info->regs = devm_ioremap_resource(&pdev->dev, mem); ··· 234 192 } 235 193 236 194 /* 237 - * Use a default of 1MHz for the converter clock. 195 + * Use a default value for the converter clock. 238 196 * This may become user-configurable in the future. 239 197 */ 240 - ret = clk_set_rate(info->clk, 1000000); 198 + ret = clk_set_rate(info->clk, info->data->clk_rate); 241 199 if (ret < 0) { 242 200 dev_err(&pdev->dev, "failed to set adc clk rate, %d\n", ret); 243 201 return ret; ··· 269 227 indio_dev->info = &rockchip_saradc_iio_info; 270 228 indio_dev->modes = INDIO_DIRECT_MODE; 271 229 272 - indio_dev->channels = rockchip_saradc_iio_channels; 273 - indio_dev->num_channels = ARRAY_SIZE(rockchip_saradc_iio_channels); 230 + indio_dev->channels = info->data->channels; 231 + indio_dev->num_channels = info->data->num_channels; 274 232 275 233 ret = iio_device_register(indio_dev); 276 234 if (ret) ··· 337 295 338 296 static SIMPLE_DEV_PM_OPS(rockchip_saradc_pm_ops, 339 297 rockchip_saradc_suspend, rockchip_saradc_resume); 340 - 341 - static const struct of_device_id rockchip_saradc_match[] = { 342 - { .compatible = "rockchip,saradc" }, 343 - {}, 344 - }; 345 - MODULE_DEVICE_TABLE(of, rockchip_saradc_match); 346 298 347 299 static struct platform_driver rockchip_saradc_driver = { 348 300 .probe = rockchip_saradc_probe,
+35 -10
drivers/iio/adc/vf610_adc.c
··· 91 91 #define VF610_ADC_CAL 0x80 92 92 93 93 /* Other field define */ 94 - #define VF610_ADC_ADCHC(x) ((x) & 0xF) 94 + #define VF610_ADC_ADCHC(x) ((x) & 0x1F) 95 95 #define VF610_ADC_AIEN (0x1 << 7) 96 96 #define VF610_ADC_CONV_DISABLE 0x1F 97 97 #define VF610_ADC_HS_COCO0 0x1 ··· 153 153 BIT(IIO_CHAN_INFO_SAMP_FREQ), \ 154 154 } 155 155 156 + #define VF610_ADC_TEMPERATURE_CHAN(_idx, _chan_type) { \ 157 + .type = (_chan_type), \ 158 + .channel = (_idx), \ 159 + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), \ 160 + } 161 + 156 162 static const struct iio_chan_spec vf610_adc_iio_channels[] = { 157 163 VF610_ADC_CHAN(0, IIO_VOLTAGE), 158 164 VF610_ADC_CHAN(1, IIO_VOLTAGE), ··· 176 170 VF610_ADC_CHAN(13, IIO_VOLTAGE), 177 171 VF610_ADC_CHAN(14, IIO_VOLTAGE), 178 172 VF610_ADC_CHAN(15, IIO_VOLTAGE), 173 + VF610_ADC_TEMPERATURE_CHAN(26, IIO_TEMP), 179 174 /* sentinel */ 180 175 }; 181 176 ··· 458 451 459 452 switch (mask) { 460 453 case IIO_CHAN_INFO_RAW: 454 + case IIO_CHAN_INFO_PROCESSED: 461 455 mutex_lock(&indio_dev->mlock); 462 456 reinit_completion(&info->completion); 463 457 ··· 476 468 return ret; 477 469 } 478 470 479 - *val = info->value; 471 + switch (chan->type) { 472 + case IIO_VOLTAGE: 473 + *val = info->value; 474 + break; 475 + case IIO_TEMP: 476 + /* 477 + * Calculate in degree Celsius times 1000 478 + * Using sensor slope of 1.84 mV/°C and 479 + * V at 25°C of 696 mV 480 + */ 481 + *val = 25000 - ((int)info->value - 864) * 1000000 / 1840; 482 + break; 483 + default: 484 + mutex_unlock(&indio_dev->mlock); 485 + return -EINVAL; 486 + } 487 + 480 488 mutex_unlock(&indio_dev->mlock); 481 489 return IIO_VAL_INT; 482 490 ··· 593 569 return PTR_ERR(info->regs); 594 570 595 571 irq = platform_get_irq(pdev, 0); 596 - if (irq <= 0) { 572 + if (irq < 0) { 597 573 dev_err(&pdev->dev, "no irq resource?\n"); 598 - return -EINVAL; 574 + return irq; 599 575 } 600 576 601 577 ret = devm_request_irq(info->dev, irq, ··· 610 586 if (IS_ERR(info->clk)) { 611 587 dev_err(&pdev->dev, "failed getting clock, err = %ld\n", 612 588 PTR_ERR(info->clk)); 613 - ret = PTR_ERR(info->clk); 614 - return ret; 589 + return PTR_ERR(info->clk); 615 590 } 616 591 617 592 info->vref = devm_regulator_get(&pdev->dev, "vref"); ··· 704 681 705 682 ret = clk_prepare_enable(info->clk); 706 683 if (ret) 707 - return ret; 684 + goto disable_reg; 708 685 709 686 vf610_adc_hw_init(info); 710 687 711 688 return 0; 689 + 690 + disable_reg: 691 + regulator_disable(info->vref); 692 + return ret; 712 693 } 713 694 #endif 714 695 715 - static SIMPLE_DEV_PM_OPS(vf610_adc_pm_ops, 716 - vf610_adc_suspend, 717 - vf610_adc_resume); 696 + static SIMPLE_DEV_PM_OPS(vf610_adc_pm_ops, vf610_adc_suspend, vf610_adc_resume); 718 697 719 698 static struct platform_driver vf610_adc_driver = { 720 699 .probe = vf610_adc_probe,
+68 -58
drivers/iio/common/st_sensors/st_sensors_core.c
··· 44 44 return err; 45 45 } 46 46 47 - static int st_sensors_match_odr(struct st_sensors *sensor, 47 + static int st_sensors_match_odr(struct st_sensor_settings *sensor_settings, 48 48 unsigned int odr, struct st_sensor_odr_avl *odr_out) 49 49 { 50 50 int i, ret = -EINVAL; 51 51 52 52 for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { 53 - if (sensor->odr.odr_avl[i].hz == 0) 53 + if (sensor_settings->odr.odr_avl[i].hz == 0) 54 54 goto st_sensors_match_odr_error; 55 55 56 - if (sensor->odr.odr_avl[i].hz == odr) { 57 - odr_out->hz = sensor->odr.odr_avl[i].hz; 58 - odr_out->value = sensor->odr.odr_avl[i].value; 56 + if (sensor_settings->odr.odr_avl[i].hz == odr) { 57 + odr_out->hz = sensor_settings->odr.odr_avl[i].hz; 58 + odr_out->value = sensor_settings->odr.odr_avl[i].value; 59 59 ret = 0; 60 60 break; 61 61 } ··· 71 71 struct st_sensor_odr_avl odr_out = {0, 0}; 72 72 struct st_sensor_data *sdata = iio_priv(indio_dev); 73 73 74 - err = st_sensors_match_odr(sdata->sensor, odr, &odr_out); 74 + err = st_sensors_match_odr(sdata->sensor_settings, odr, &odr_out); 75 75 if (err < 0) 76 76 goto st_sensors_match_odr_error; 77 77 78 - if ((sdata->sensor->odr.addr == sdata->sensor->pw.addr) && 79 - (sdata->sensor->odr.mask == sdata->sensor->pw.mask)) { 78 + if ((sdata->sensor_settings->odr.addr == 79 + sdata->sensor_settings->pw.addr) && 80 + (sdata->sensor_settings->odr.mask == 81 + sdata->sensor_settings->pw.mask)) { 80 82 if (sdata->enabled == true) { 81 83 err = st_sensors_write_data_with_mask(indio_dev, 82 - sdata->sensor->odr.addr, 83 - sdata->sensor->odr.mask, 84 + sdata->sensor_settings->odr.addr, 85 + sdata->sensor_settings->odr.mask, 84 86 odr_out.value); 85 87 } else { 86 88 err = 0; 87 89 } 88 90 } else { 89 91 err = st_sensors_write_data_with_mask(indio_dev, 90 - sdata->sensor->odr.addr, sdata->sensor->odr.mask, 92 + sdata->sensor_settings->odr.addr, 93 + sdata->sensor_settings->odr.mask, 91 94 odr_out.value); 92 95 } 93 96 if (err >= 0) ··· 101 98 } 102 99 EXPORT_SYMBOL(st_sensors_set_odr); 103 100 104 - static int st_sensors_match_fs(struct st_sensors *sensor, 101 + static int st_sensors_match_fs(struct st_sensor_settings *sensor_settings, 105 102 unsigned int fs, int *index_fs_avl) 106 103 { 107 104 int i, ret = -EINVAL; 108 105 109 106 for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { 110 - if (sensor->fs.fs_avl[i].num == 0) 107 + if (sensor_settings->fs.fs_avl[i].num == 0) 111 108 goto st_sensors_match_odr_error; 112 109 113 - if (sensor->fs.fs_avl[i].num == fs) { 110 + if (sensor_settings->fs.fs_avl[i].num == fs) { 114 111 *index_fs_avl = i; 115 112 ret = 0; 116 113 break; ··· 121 118 return ret; 122 119 } 123 120 124 - static int st_sensors_set_fullscale(struct iio_dev *indio_dev, 125 - unsigned int fs) 121 + static int st_sensors_set_fullscale(struct iio_dev *indio_dev, unsigned int fs) 126 122 { 127 123 int err, i = 0; 128 124 struct st_sensor_data *sdata = iio_priv(indio_dev); 129 125 130 - err = st_sensors_match_fs(sdata->sensor, fs, &i); 126 + err = st_sensors_match_fs(sdata->sensor_settings, fs, &i); 131 127 if (err < 0) 132 128 goto st_accel_set_fullscale_error; 133 129 134 130 err = st_sensors_write_data_with_mask(indio_dev, 135 - sdata->sensor->fs.addr, 136 - sdata->sensor->fs.mask, 137 - sdata->sensor->fs.fs_avl[i].value); 131 + sdata->sensor_settings->fs.addr, 132 + sdata->sensor_settings->fs.mask, 133 + sdata->sensor_settings->fs.fs_avl[i].value); 138 134 if (err < 0) 139 135 goto st_accel_set_fullscale_error; 140 136 141 137 sdata->current_fullscale = (struct st_sensor_fullscale_avl *) 142 - &sdata->sensor->fs.fs_avl[i]; 138 + &sdata->sensor_settings->fs.fs_avl[i]; 143 139 return err; 144 140 145 141 st_accel_set_fullscale_error: ··· 155 153 struct st_sensor_data *sdata = iio_priv(indio_dev); 156 154 157 155 if (enable) { 158 - tmp_value = sdata->sensor->pw.value_on; 159 - if ((sdata->sensor->odr.addr == sdata->sensor->pw.addr) && 160 - (sdata->sensor->odr.mask == sdata->sensor->pw.mask)) { 161 - err = st_sensors_match_odr(sdata->sensor, 156 + tmp_value = sdata->sensor_settings->pw.value_on; 157 + if ((sdata->sensor_settings->odr.addr == 158 + sdata->sensor_settings->pw.addr) && 159 + (sdata->sensor_settings->odr.mask == 160 + sdata->sensor_settings->pw.mask)) { 161 + err = st_sensors_match_odr(sdata->sensor_settings, 162 162 sdata->odr, &odr_out); 163 163 if (err < 0) 164 164 goto set_enable_error; ··· 168 164 found = true; 169 165 } 170 166 err = st_sensors_write_data_with_mask(indio_dev, 171 - sdata->sensor->pw.addr, 172 - sdata->sensor->pw.mask, tmp_value); 167 + sdata->sensor_settings->pw.addr, 168 + sdata->sensor_settings->pw.mask, tmp_value); 173 169 if (err < 0) 174 170 goto set_enable_error; 175 171 ··· 179 175 sdata->odr = odr_out.hz; 180 176 } else { 181 177 err = st_sensors_write_data_with_mask(indio_dev, 182 - sdata->sensor->pw.addr, 183 - sdata->sensor->pw.mask, 184 - sdata->sensor->pw.value_off); 178 + sdata->sensor_settings->pw.addr, 179 + sdata->sensor_settings->pw.mask, 180 + sdata->sensor_settings->pw.value_off); 185 181 if (err < 0) 186 182 goto set_enable_error; 187 183 ··· 198 194 struct st_sensor_data *sdata = iio_priv(indio_dev); 199 195 200 196 return st_sensors_write_data_with_mask(indio_dev, 201 - sdata->sensor->enable_axis.addr, 202 - sdata->sensor->enable_axis.mask, axis_enable); 197 + sdata->sensor_settings->enable_axis.addr, 198 + sdata->sensor_settings->enable_axis.mask, 199 + axis_enable); 203 200 } 204 201 EXPORT_SYMBOL(st_sensors_set_axis_enable); 205 202 ··· 241 236 EXPORT_SYMBOL(st_sensors_power_disable); 242 237 243 238 static int st_sensors_set_drdy_int_pin(struct iio_dev *indio_dev, 244 - struct st_sensors_platform_data *pdata) 239 + struct st_sensors_platform_data *pdata) 245 240 { 246 241 struct st_sensor_data *sdata = iio_priv(indio_dev); 247 242 248 243 switch (pdata->drdy_int_pin) { 249 244 case 1: 250 - if (sdata->sensor->drdy_irq.mask_int1 == 0) { 245 + if (sdata->sensor_settings->drdy_irq.mask_int1 == 0) { 251 246 dev_err(&indio_dev->dev, 252 247 "DRDY on INT1 not available.\n"); 253 248 return -EINVAL; ··· 255 250 sdata->drdy_int_pin = 1; 256 251 break; 257 252 case 2: 258 - if (sdata->sensor->drdy_irq.mask_int2 == 0) { 253 + if (sdata->sensor_settings->drdy_irq.mask_int2 == 0) { 259 254 dev_err(&indio_dev->dev, 260 255 "DRDY on INT2 not available.\n"); 261 256 return -EINVAL; ··· 323 318 324 319 if (sdata->current_fullscale) { 325 320 err = st_sensors_set_fullscale(indio_dev, 326 - sdata->current_fullscale->num); 321 + sdata->current_fullscale->num); 327 322 if (err < 0) 328 323 return err; 329 324 } else ··· 335 330 336 331 /* set BDU */ 337 332 err = st_sensors_write_data_with_mask(indio_dev, 338 - sdata->sensor->bdu.addr, sdata->sensor->bdu.mask, true); 333 + sdata->sensor_settings->bdu.addr, 334 + sdata->sensor_settings->bdu.mask, true); 339 335 if (err < 0) 340 336 return err; 341 337 ··· 352 346 u8 drdy_mask; 353 347 struct st_sensor_data *sdata = iio_priv(indio_dev); 354 348 355 - if (!sdata->sensor->drdy_irq.addr) 349 + if (!sdata->sensor_settings->drdy_irq.addr) 356 350 return 0; 357 351 358 352 /* Enable/Disable the interrupt generator 1. */ 359 - if (sdata->sensor->drdy_irq.ig1.en_addr > 0) { 353 + if (sdata->sensor_settings->drdy_irq.ig1.en_addr > 0) { 360 354 err = st_sensors_write_data_with_mask(indio_dev, 361 - sdata->sensor->drdy_irq.ig1.en_addr, 362 - sdata->sensor->drdy_irq.ig1.en_mask, (int)enable); 355 + sdata->sensor_settings->drdy_irq.ig1.en_addr, 356 + sdata->sensor_settings->drdy_irq.ig1.en_mask, 357 + (int)enable); 363 358 if (err < 0) 364 359 goto st_accel_set_dataready_irq_error; 365 360 } 366 361 367 362 if (sdata->drdy_int_pin == 1) 368 - drdy_mask = sdata->sensor->drdy_irq.mask_int1; 363 + drdy_mask = sdata->sensor_settings->drdy_irq.mask_int1; 369 364 else 370 - drdy_mask = sdata->sensor->drdy_irq.mask_int2; 365 + drdy_mask = sdata->sensor_settings->drdy_irq.mask_int2; 371 366 372 367 /* Enable/Disable the interrupt generator for data ready. */ 373 368 err = st_sensors_write_data_with_mask(indio_dev, 374 - sdata->sensor->drdy_irq.addr, drdy_mask, (int)enable); 369 + sdata->sensor_settings->drdy_irq.addr, 370 + drdy_mask, (int)enable); 375 371 376 372 st_accel_set_dataready_irq_error: 377 373 return err; ··· 386 378 struct st_sensor_data *sdata = iio_priv(indio_dev); 387 379 388 380 for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { 389 - if ((sdata->sensor->fs.fs_avl[i].gain == scale) && 390 - (sdata->sensor->fs.fs_avl[i].gain != 0)) { 381 + if ((sdata->sensor_settings->fs.fs_avl[i].gain == scale) && 382 + (sdata->sensor_settings->fs.fs_avl[i].gain != 0)) { 391 383 err = 0; 392 384 break; 393 385 } ··· 396 388 goto st_sensors_match_scale_error; 397 389 398 390 err = st_sensors_set_fullscale(indio_dev, 399 - sdata->sensor->fs.fs_avl[i].num); 391 + sdata->sensor_settings->fs.fs_avl[i].num); 400 392 401 393 st_sensors_match_scale_error: 402 394 return err; ··· 447 439 if (err < 0) 448 440 goto out; 449 441 450 - msleep((sdata->sensor->bootime * 1000) / sdata->odr); 442 + msleep((sdata->sensor_settings->bootime * 1000) / sdata->odr); 451 443 err = st_sensors_read_axis_data(indio_dev, ch, val); 452 444 if (err < 0) 453 445 goto out; ··· 464 456 EXPORT_SYMBOL(st_sensors_read_info_raw); 465 457 466 458 int st_sensors_check_device_support(struct iio_dev *indio_dev, 467 - int num_sensors_list, const struct st_sensors *sensors) 459 + int num_sensors_list, 460 + const struct st_sensor_settings *sensor_settings) 468 461 { 469 462 u8 wai; 470 463 int i, n, err; ··· 479 470 } 480 471 481 472 for (i = 0; i < num_sensors_list; i++) { 482 - if (sensors[i].wai == wai) 473 + if (sensor_settings[i].wai == wai) 483 474 break; 484 475 } 485 476 if (i == num_sensors_list) 486 477 goto device_not_supported; 487 478 488 - for (n = 0; n < ARRAY_SIZE(sensors[i].sensors_supported); n++) { 479 + for (n = 0; n < ARRAY_SIZE(sensor_settings[i].sensors_supported); n++) { 489 480 if (strcmp(indio_dev->name, 490 - &sensors[i].sensors_supported[n][0]) == 0) 481 + &sensor_settings[i].sensors_supported[n][0]) == 0) 491 482 break; 492 483 } 493 - if (n == ARRAY_SIZE(sensors[i].sensors_supported)) { 484 + if (n == ARRAY_SIZE(sensor_settings[i].sensors_supported)) { 494 485 dev_err(&indio_dev->dev, "device name and WhoAmI mismatch.\n"); 495 486 goto sensor_name_mismatch; 496 487 } 497 488 498 - sdata->sensor = (struct st_sensors *)&sensors[i]; 489 + sdata->sensor_settings = 490 + (struct st_sensor_settings *)&sensor_settings[i]; 499 491 500 492 return i; 501 493 ··· 518 508 519 509 mutex_lock(&indio_dev->mlock); 520 510 for (i = 0; i < ST_SENSORS_ODR_LIST_MAX; i++) { 521 - if (sdata->sensor->odr.odr_avl[i].hz == 0) 511 + if (sdata->sensor_settings->odr.odr_avl[i].hz == 0) 522 512 break; 523 513 524 514 len += scnprintf(buf + len, PAGE_SIZE - len, "%d ", 525 - sdata->sensor->odr.odr_avl[i].hz); 515 + sdata->sensor_settings->odr.odr_avl[i].hz); 526 516 } 527 517 mutex_unlock(&indio_dev->mlock); 528 518 buf[len - 1] = '\n'; ··· 540 530 541 531 mutex_lock(&indio_dev->mlock); 542 532 for (i = 0; i < ST_SENSORS_FULLSCALE_AVL_MAX; i++) { 543 - if (sdata->sensor->fs.fs_avl[i].num == 0) 533 + if (sdata->sensor_settings->fs.fs_avl[i].num == 0) 544 534 break; 545 535 546 536 len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06u ", 547 - sdata->sensor->fs.fs_avl[i].gain); 537 + sdata->sensor_settings->fs.fs_avl[i].gain); 548 538 } 549 539 mutex_unlock(&indio_dev->mlock); 550 540 buf[len - 1] = '\n';
+1
drivers/iio/common/st_sensors/st_sensors_i2c.c
··· 72 72 indio_dev->dev.parent = &client->dev; 73 73 indio_dev->name = client->name; 74 74 75 + sdata->dev = &client->dev; 75 76 sdata->tf = &st_sensors_tf_i2c; 76 77 sdata->get_irq_data_ready = st_sensors_i2c_get_irq; 77 78 }
+1
drivers/iio/common/st_sensors/st_sensors_spi.c
··· 111 111 indio_dev->dev.parent = &spi->dev; 112 112 indio_dev->name = spi->modalias; 113 113 114 + sdata->dev = &spi->dev; 114 115 sdata->tf = &st_sensors_tf_spi; 115 116 sdata->get_irq_data_ready = st_sensors_spi_get_irq; 116 117 }
+1 -2
drivers/iio/gyro/st_gyro.h
··· 30 30 .drdy_int_pin = 2, 31 31 }; 32 32 33 - int st_gyro_common_probe(struct iio_dev *indio_dev, 34 - struct st_sensors_platform_data *pdata); 33 + int st_gyro_common_probe(struct iio_dev *indio_dev); 35 34 void st_gyro_common_remove(struct iio_dev *indio_dev); 36 35 37 36 #ifdef CONFIG_IIO_BUFFER
+10 -9
drivers/iio/gyro/st_gyro_core.c
··· 103 103 IIO_CHAN_SOFT_TIMESTAMP(3) 104 104 }; 105 105 106 - static const struct st_sensors st_gyro_sensors[] = { 106 + static const struct st_sensor_settings st_gyro_sensors_settings[] = { 107 107 { 108 108 .wai = ST_GYRO_1_WAI_EXP, 109 109 .sensors_supported = { ··· 309 309 #define ST_GYRO_TRIGGER_OPS NULL 310 310 #endif 311 311 312 - int st_gyro_common_probe(struct iio_dev *indio_dev, 313 - struct st_sensors_platform_data *pdata) 312 + int st_gyro_common_probe(struct iio_dev *indio_dev) 314 313 { 315 314 struct st_sensor_data *gdata = iio_priv(indio_dev); 316 315 int irq = gdata->get_irq_data_ready(indio_dev); ··· 321 322 st_sensors_power_enable(indio_dev); 322 323 323 324 err = st_sensors_check_device_support(indio_dev, 324 - ARRAY_SIZE(st_gyro_sensors), st_gyro_sensors); 325 + ARRAY_SIZE(st_gyro_sensors_settings), 326 + st_gyro_sensors_settings); 325 327 if (err < 0) 326 328 return err; 327 329 328 330 gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS; 329 - gdata->multiread_bit = gdata->sensor->multi_read_bit; 330 - indio_dev->channels = gdata->sensor->ch; 331 + gdata->multiread_bit = gdata->sensor_settings->multi_read_bit; 332 + indio_dev->channels = gdata->sensor_settings->ch; 331 333 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 332 334 333 335 gdata->current_fullscale = (struct st_sensor_fullscale_avl *) 334 - &gdata->sensor->fs.fs_avl[0]; 335 - gdata->odr = gdata->sensor->odr.odr_avl[0].hz; 336 + &gdata->sensor_settings->fs.fs_avl[0]; 337 + gdata->odr = gdata->sensor_settings->odr.odr_avl[0].hz; 336 338 337 - err = st_sensors_init_sensor(indio_dev, pdata); 339 + err = st_sensors_init_sensor(indio_dev, 340 + (struct st_sensors_platform_data *)&gyro_pdata); 338 341 if (err < 0) 339 342 return err; 340 343
+1 -3
drivers/iio/gyro/st_gyro_i2c.c
··· 67 67 return -ENOMEM; 68 68 69 69 gdata = iio_priv(indio_dev); 70 - gdata->dev = &client->dev; 71 70 st_sensors_of_i2c_probe(client, st_gyro_of_match); 72 71 73 72 st_sensors_i2c_configure(indio_dev, client, gdata); 74 73 75 - err = st_gyro_common_probe(indio_dev, 76 - (struct st_sensors_platform_data *)&gyro_pdata); 74 + err = st_gyro_common_probe(indio_dev); 77 75 if (err < 0) 78 76 return err; 79 77
+1 -3
drivers/iio/gyro/st_gyro_spi.c
··· 29 29 return -ENOMEM; 30 30 31 31 gdata = iio_priv(indio_dev); 32 - gdata->dev = &spi->dev; 33 32 34 33 st_sensors_spi_configure(indio_dev, spi, gdata); 35 34 36 - err = st_gyro_common_probe(indio_dev, 37 - (struct st_sensors_platform_data *)&gyro_pdata); 35 + err = st_gyro_common_probe(indio_dev); 38 36 if (err < 0) 39 37 return err; 40 38
+10
drivers/iio/humidity/Kconfig
··· 22 22 To compile this driver as a module, choose M here: the module 23 23 will be called si7005. 24 24 25 + config SI7020 26 + tristate "Si7013/20/21 Relative Humidity and Temperature Sensors" 27 + depends on I2C 28 + help 29 + Say yes here to build support for the Silicon Labs Si7013/20/21 30 + Relative Humidity and Temperature Sensors. 31 + 32 + To compile this driver as a module, choose M here: the module 33 + will be called si7020. 34 + 25 35 endmenu
+1
drivers/iio/humidity/Makefile
··· 4 4 5 5 obj-$(CONFIG_DHT11) += dht11.o 6 6 obj-$(CONFIG_SI7005) += si7005.o 7 + obj-$(CONFIG_SI7020) += si7020.o
+161
drivers/iio/humidity/si7020.c
··· 1 + /* 2 + * si7020.c - Silicon Labs Si7013/20/21 Relative Humidity and Temp Sensors 3 + * Copyright (c) 2013,2014 Uplogix, Inc. 4 + * David Barksdale <dbarksdale@uplogix.com> 5 + * 6 + * This program is free software; you can redistribute it and/or modify it 7 + * under the terms and conditions of the GNU General Public License, 8 + * version 2, as published by the Free Software Foundation. 9 + * 10 + * This program is distributed in the hope that it will be useful, 11 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 + * GNU General Public License for more details. 14 + */ 15 + 16 + /* 17 + * The Silicon Labs Si7013/20/21 Relative Humidity and Temperature Sensors 18 + * are i2c devices which have an identical programming interface for 19 + * measuring relative humidity and temperature. The Si7013 has an additional 20 + * temperature input which this driver does not support. 21 + * 22 + * Data Sheets: 23 + * Si7013: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7013.pdf 24 + * Si7020: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7020.pdf 25 + * Si7021: http://www.silabs.com/Support%20Documents/TechnicalDocs/Si7021.pdf 26 + */ 27 + 28 + #include <linux/delay.h> 29 + #include <linux/i2c.h> 30 + #include <linux/module.h> 31 + #include <linux/slab.h> 32 + #include <linux/sysfs.h> 33 + 34 + #include <linux/iio/iio.h> 35 + #include <linux/iio/sysfs.h> 36 + 37 + /* Measure Relative Humidity, Hold Master Mode */ 38 + #define SI7020CMD_RH_HOLD 0xE5 39 + /* Measure Temperature, Hold Master Mode */ 40 + #define SI7020CMD_TEMP_HOLD 0xE3 41 + /* Software Reset */ 42 + #define SI7020CMD_RESET 0xFE 43 + 44 + static int si7020_read_raw(struct iio_dev *indio_dev, 45 + struct iio_chan_spec const *chan, int *val, 46 + int *val2, long mask) 47 + { 48 + struct i2c_client *client = iio_priv(indio_dev); 49 + int ret; 50 + 51 + switch (mask) { 52 + case IIO_CHAN_INFO_RAW: 53 + ret = i2c_smbus_read_word_data(client, 54 + chan->type == IIO_TEMP ? 55 + SI7020CMD_TEMP_HOLD : 56 + SI7020CMD_RH_HOLD); 57 + if (ret < 0) 58 + return ret; 59 + *val = ret >> 2; 60 + if (chan->type == IIO_HUMIDITYRELATIVE) 61 + *val &= GENMASK(11, 0); 62 + return IIO_VAL_INT; 63 + case IIO_CHAN_INFO_SCALE: 64 + if (chan->type == IIO_TEMP) 65 + *val = 175720; /* = 175.72 * 1000 */ 66 + else 67 + *val = 125 * 1000; 68 + *val2 = 65536 >> 2; 69 + return IIO_VAL_FRACTIONAL; 70 + case IIO_CHAN_INFO_OFFSET: 71 + /* 72 + * Since iio_convert_raw_to_processed_unlocked assumes offset 73 + * is an integer we have to round these values and lose 74 + * accuracy. 75 + * Relative humidity will be 0.0032959% too high and 76 + * temperature will be 0.00277344 degrees too high. 77 + * This is no big deal because it's within the accuracy of the 78 + * sensor. 79 + */ 80 + if (chan->type == IIO_TEMP) 81 + *val = -4368; /* = -46.85 * (65536 >> 2) / 175.72 */ 82 + else 83 + *val = -786; /* = -6 * (65536 >> 2) / 125 */ 84 + return IIO_VAL_INT; 85 + default: 86 + break; 87 + } 88 + 89 + return -EINVAL; 90 + } 91 + 92 + static const struct iio_chan_spec si7020_channels[] = { 93 + { 94 + .type = IIO_HUMIDITYRELATIVE, 95 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 96 + BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), 97 + }, 98 + { 99 + .type = IIO_TEMP, 100 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 101 + BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), 102 + } 103 + }; 104 + 105 + static const struct iio_info si7020_info = { 106 + .read_raw = si7020_read_raw, 107 + .driver_module = THIS_MODULE, 108 + }; 109 + 110 + static int si7020_probe(struct i2c_client *client, 111 + const struct i2c_device_id *id) 112 + { 113 + struct iio_dev *indio_dev; 114 + struct i2c_client **data; 115 + int ret; 116 + 117 + if (!i2c_check_functionality(client->adapter, 118 + I2C_FUNC_SMBUS_WRITE_BYTE | 119 + I2C_FUNC_SMBUS_READ_WORD_DATA)) 120 + return -ENODEV; 121 + 122 + /* Reset device, loads default settings. */ 123 + ret = i2c_smbus_write_byte(client, SI7020CMD_RESET); 124 + if (ret < 0) 125 + return ret; 126 + /* Wait the maximum power-up time after software reset. */ 127 + msleep(15); 128 + 129 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*client)); 130 + if (!indio_dev) 131 + return -ENOMEM; 132 + 133 + data = iio_priv(indio_dev); 134 + *data = client; 135 + 136 + indio_dev->dev.parent = &client->dev; 137 + indio_dev->name = dev_name(&client->dev); 138 + indio_dev->modes = INDIO_DIRECT_MODE; 139 + indio_dev->info = &si7020_info; 140 + indio_dev->channels = si7020_channels; 141 + indio_dev->num_channels = ARRAY_SIZE(si7020_channels); 142 + 143 + return devm_iio_device_register(&client->dev, indio_dev); 144 + } 145 + 146 + static const struct i2c_device_id si7020_id[] = { 147 + { "si7020", 0 }, 148 + { } 149 + }; 150 + MODULE_DEVICE_TABLE(i2c, si7020_id); 151 + 152 + static struct i2c_driver si7020_driver = { 153 + .driver.name = "si7020", 154 + .probe = si7020_probe, 155 + .id_table = si7020_id, 156 + }; 157 + 158 + module_i2c_driver(si7020_driver); 159 + MODULE_DESCRIPTION("Silicon Labs Si7013/20/21 Relative Humidity and Temperature Sensors"); 160 + MODULE_AUTHOR("David Barksdale <dbarksdale@uplogix.com>"); 161 + MODULE_LICENSE("GPL");
+28 -5
drivers/iio/inkern.c
··· 100 100 return dev->of_node == data && dev->type == &iio_device_type; 101 101 } 102 102 103 + /** 104 + * __of_iio_simple_xlate - translate iiospec to the IIO channel index 105 + * @indio_dev: pointer to the iio_dev structure 106 + * @iiospec: IIO specifier as found in the device tree 107 + * 108 + * This is simple translation function, suitable for the most 1:1 mapped 109 + * channels in IIO chips. This function performs only one sanity check: 110 + * whether IIO index is less than num_channels (that is specified in the 111 + * iio_dev). 112 + */ 113 + static int __of_iio_simple_xlate(struct iio_dev *indio_dev, 114 + const struct of_phandle_args *iiospec) 115 + { 116 + if (!iiospec->args_count) 117 + return 0; 118 + 119 + if (iiospec->args[0] >= indio_dev->num_channels) 120 + return -EINVAL; 121 + 122 + return iiospec->args[0]; 123 + } 124 + 103 125 static int __of_iio_channel_get(struct iio_channel *channel, 104 126 struct device_node *np, int index) 105 127 { ··· 144 122 145 123 indio_dev = dev_to_iio_dev(idev); 146 124 channel->indio_dev = indio_dev; 147 - index = iiospec.args_count ? iiospec.args[0] : 0; 148 - if (index >= indio_dev->num_channels) { 149 - err = -EINVAL; 125 + if (indio_dev->info->of_xlate) 126 + index = indio_dev->info->of_xlate(indio_dev, &iiospec); 127 + else 128 + index = __of_iio_simple_xlate(indio_dev, &iiospec); 129 + if (index < 0) 150 130 goto err_put; 151 - } 152 131 channel->channel = &indio_dev->channels[index]; 153 132 154 133 return 0; 155 134 156 135 err_put: 157 136 iio_device_put(indio_dev); 158 - return err; 137 + return index; 159 138 } 160 139 161 140 static struct iio_channel *of_iio_channel_get(struct device_node *np, int index)
+1 -2
drivers/iio/magnetometer/st_magn.h
··· 18 18 #define LSM303DLM_MAGN_DEV_NAME "lsm303dlm_magn" 19 19 #define LIS3MDL_MAGN_DEV_NAME "lis3mdl" 20 20 21 - int st_magn_common_probe(struct iio_dev *indio_dev, 22 - struct st_sensors_platform_data *pdata); 21 + int st_magn_common_probe(struct iio_dev *indio_dev); 23 22 void st_magn_common_remove(struct iio_dev *indio_dev); 24 23 25 24 #ifdef CONFIG_IIO_BUFFER
+9 -9
drivers/iio/magnetometer/st_magn_core.c
··· 149 149 IIO_CHAN_SOFT_TIMESTAMP(3) 150 150 }; 151 151 152 - static const struct st_sensors st_magn_sensors[] = { 152 + static const struct st_sensor_settings st_magn_sensors_settings[] = { 153 153 { 154 154 .wai = ST_MAGN_1_WAI_EXP, 155 155 .sensors_supported = { ··· 361 361 .write_raw = &st_magn_write_raw, 362 362 }; 363 363 364 - int st_magn_common_probe(struct iio_dev *indio_dev, 365 - struct st_sensors_platform_data *pdata) 364 + int st_magn_common_probe(struct iio_dev *indio_dev) 366 365 { 367 366 struct st_sensor_data *mdata = iio_priv(indio_dev); 368 367 int irq = mdata->get_irq_data_ready(indio_dev); ··· 373 374 st_sensors_power_enable(indio_dev); 374 375 375 376 err = st_sensors_check_device_support(indio_dev, 376 - ARRAY_SIZE(st_magn_sensors), st_magn_sensors); 377 + ARRAY_SIZE(st_magn_sensors_settings), 378 + st_magn_sensors_settings); 377 379 if (err < 0) 378 380 return err; 379 381 380 382 mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS; 381 - mdata->multiread_bit = mdata->sensor->multi_read_bit; 382 - indio_dev->channels = mdata->sensor->ch; 383 + mdata->multiread_bit = mdata->sensor_settings->multi_read_bit; 384 + indio_dev->channels = mdata->sensor_settings->ch; 383 385 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 384 386 385 387 mdata->current_fullscale = (struct st_sensor_fullscale_avl *) 386 - &mdata->sensor->fs.fs_avl[0]; 387 - mdata->odr = mdata->sensor->odr.odr_avl[0].hz; 388 + &mdata->sensor_settings->fs.fs_avl[0]; 389 + mdata->odr = mdata->sensor_settings->odr.odr_avl[0].hz; 388 390 389 - err = st_sensors_init_sensor(indio_dev, pdata); 391 + err = st_sensors_init_sensor(indio_dev, NULL); 390 392 if (err < 0) 391 393 return err; 392 394
+1 -2
drivers/iio/magnetometer/st_magn_i2c.c
··· 51 51 return -ENOMEM; 52 52 53 53 mdata = iio_priv(indio_dev); 54 - mdata->dev = &client->dev; 55 54 st_sensors_of_i2c_probe(client, st_magn_of_match); 56 55 57 56 st_sensors_i2c_configure(indio_dev, client, mdata); 58 57 59 - err = st_magn_common_probe(indio_dev, NULL); 58 + err = st_magn_common_probe(indio_dev); 60 59 if (err < 0) 61 60 return err; 62 61
+1 -2
drivers/iio/magnetometer/st_magn_spi.c
··· 29 29 return -ENOMEM; 30 30 31 31 mdata = iio_priv(indio_dev); 32 - mdata->dev = &spi->dev; 33 32 34 33 st_sensors_spi_configure(indio_dev, spi, mdata); 35 34 36 - err = st_magn_common_probe(indio_dev, NULL); 35 + err = st_magn_common_probe(indio_dev); 37 36 if (err < 0) 38 37 return err; 39 38
+11
drivers/iio/pressure/Kconfig
··· 5 5 6 6 menu "Pressure sensors" 7 7 8 + config BMP280 9 + tristate "Bosch Sensortec BMP280 pressure sensor driver" 10 + depends on I2C 11 + select REGMAP_I2C 12 + help 13 + Say yes here to build support for Bosch Sensortec BMP280 14 + pressure and temperature sensor. 15 + 16 + To compile this driver as a module, choose M here: the module 17 + will be called bmp280. 18 + 8 19 config HID_SENSOR_PRESS 9 20 depends on HID_SENSOR_HUB 10 21 select IIO_BUFFER
+1
drivers/iio/pressure/Makefile
··· 3 3 # 4 4 5 5 # When adding new entries keep the list in alphabetical order 6 + obj-$(CONFIG_BMP280) += bmp280.o 6 7 obj-$(CONFIG_HID_SENSOR_PRESS) += hid-sensor-press.o 7 8 obj-$(CONFIG_MPL115) += mpl115.o 8 9 obj-$(CONFIG_MPL3115) += mpl3115.o
+455
drivers/iio/pressure/bmp280.c
··· 1 + /* 2 + * Copyright (c) 2014 Intel Corporation 3 + * 4 + * Driver for Bosch Sensortec BMP280 digital pressure sensor. 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 as 8 + * published by the Free Software Foundation. 9 + * 10 + */ 11 + 12 + #define pr_fmt(fmt) "bmp280: " fmt 13 + 14 + #include <linux/module.h> 15 + #include <linux/i2c.h> 16 + #include <linux/acpi.h> 17 + #include <linux/regmap.h> 18 + #include <linux/iio/iio.h> 19 + #include <linux/iio/sysfs.h> 20 + 21 + #define BMP280_REG_TEMP_XLSB 0xFC 22 + #define BMP280_REG_TEMP_LSB 0xFB 23 + #define BMP280_REG_TEMP_MSB 0xFA 24 + #define BMP280_REG_PRESS_XLSB 0xF9 25 + #define BMP280_REG_PRESS_LSB 0xF8 26 + #define BMP280_REG_PRESS_MSB 0xF7 27 + 28 + #define BMP280_REG_CONFIG 0xF5 29 + #define BMP280_REG_CTRL_MEAS 0xF4 30 + #define BMP280_REG_STATUS 0xF3 31 + #define BMP280_REG_RESET 0xE0 32 + #define BMP280_REG_ID 0xD0 33 + 34 + #define BMP280_REG_COMP_TEMP_START 0x88 35 + #define BMP280_COMP_TEMP_REG_COUNT 6 36 + 37 + #define BMP280_REG_COMP_PRESS_START 0x8E 38 + #define BMP280_COMP_PRESS_REG_COUNT 18 39 + 40 + #define BMP280_FILTER_MASK (BIT(4) | BIT(3) | BIT(2)) 41 + #define BMP280_FILTER_OFF 0 42 + #define BMP280_FILTER_2X BIT(2) 43 + #define BMP280_FILTER_4X BIT(3) 44 + #define BMP280_FILTER_8X (BIT(3) | BIT(2)) 45 + #define BMP280_FILTER_16X BIT(4) 46 + 47 + #define BMP280_OSRS_TEMP_MASK (BIT(7) | BIT(6) | BIT(5)) 48 + #define BMP280_OSRS_TEMP_SKIP 0 49 + #define BMP280_OSRS_TEMP_1X BIT(5) 50 + #define BMP280_OSRS_TEMP_2X BIT(6) 51 + #define BMP280_OSRS_TEMP_4X (BIT(6) | BIT(5)) 52 + #define BMP280_OSRS_TEMP_8X BIT(7) 53 + #define BMP280_OSRS_TEMP_16X (BIT(7) | BIT(5)) 54 + 55 + #define BMP280_OSRS_PRESS_MASK (BIT(4) | BIT(3) | BIT(2)) 56 + #define BMP280_OSRS_PRESS_SKIP 0 57 + #define BMP280_OSRS_PRESS_1X BIT(2) 58 + #define BMP280_OSRS_PRESS_2X BIT(3) 59 + #define BMP280_OSRS_PRESS_4X (BIT(3) | BIT(2)) 60 + #define BMP280_OSRS_PRESS_8X BIT(4) 61 + #define BMP280_OSRS_PRESS_16X (BIT(4) | BIT(2)) 62 + 63 + #define BMP280_MODE_MASK (BIT(1) | BIT(0)) 64 + #define BMP280_MODE_SLEEP 0 65 + #define BMP280_MODE_FORCED BIT(0) 66 + #define BMP280_MODE_NORMAL (BIT(1) | BIT(0)) 67 + 68 + #define BMP280_CHIP_ID 0x58 69 + #define BMP280_SOFT_RESET_VAL 0xB6 70 + 71 + struct bmp280_data { 72 + struct i2c_client *client; 73 + struct mutex lock; 74 + struct regmap *regmap; 75 + 76 + /* 77 + * Carryover value from temperature conversion, used in pressure 78 + * calculation. 79 + */ 80 + s32 t_fine; 81 + }; 82 + 83 + /* Compensation parameters. */ 84 + struct bmp280_comp_temp { 85 + u16 dig_t1; 86 + s16 dig_t2, dig_t3; 87 + }; 88 + 89 + struct bmp280_comp_press { 90 + u16 dig_p1; 91 + s16 dig_p2, dig_p3, dig_p4, dig_p5, dig_p6, dig_p7, dig_p8, dig_p9; 92 + }; 93 + 94 + static const struct iio_chan_spec bmp280_channels[] = { 95 + { 96 + .type = IIO_PRESSURE, 97 + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 98 + }, 99 + { 100 + .type = IIO_TEMP, 101 + .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED), 102 + }, 103 + }; 104 + 105 + static bool bmp280_is_writeable_reg(struct device *dev, unsigned int reg) 106 + { 107 + switch (reg) { 108 + case BMP280_REG_CONFIG: 109 + case BMP280_REG_CTRL_MEAS: 110 + case BMP280_REG_RESET: 111 + return true; 112 + default: 113 + return false; 114 + }; 115 + } 116 + 117 + static bool bmp280_is_volatile_reg(struct device *dev, unsigned int reg) 118 + { 119 + switch (reg) { 120 + case BMP280_REG_TEMP_XLSB: 121 + case BMP280_REG_TEMP_LSB: 122 + case BMP280_REG_TEMP_MSB: 123 + case BMP280_REG_PRESS_XLSB: 124 + case BMP280_REG_PRESS_LSB: 125 + case BMP280_REG_PRESS_MSB: 126 + case BMP280_REG_STATUS: 127 + return true; 128 + default: 129 + return false; 130 + } 131 + } 132 + 133 + static const struct regmap_config bmp280_regmap_config = { 134 + .reg_bits = 8, 135 + .val_bits = 8, 136 + 137 + .max_register = BMP280_REG_TEMP_XLSB, 138 + .cache_type = REGCACHE_RBTREE, 139 + 140 + .writeable_reg = bmp280_is_writeable_reg, 141 + .volatile_reg = bmp280_is_volatile_reg, 142 + }; 143 + 144 + static int bmp280_read_compensation_temp(struct bmp280_data *data, 145 + struct bmp280_comp_temp *comp) 146 + { 147 + int ret; 148 + __le16 buf[BMP280_COMP_TEMP_REG_COUNT / 2]; 149 + 150 + ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_TEMP_START, 151 + buf, BMP280_COMP_TEMP_REG_COUNT); 152 + if (ret < 0) { 153 + dev_err(&data->client->dev, 154 + "failed to read temperature calibration parameters\n"); 155 + return ret; 156 + } 157 + 158 + comp->dig_t1 = (u16) le16_to_cpu(buf[0]); 159 + comp->dig_t2 = (s16) le16_to_cpu(buf[1]); 160 + comp->dig_t3 = (s16) le16_to_cpu(buf[2]); 161 + 162 + return 0; 163 + } 164 + 165 + static int bmp280_read_compensation_press(struct bmp280_data *data, 166 + struct bmp280_comp_press *comp) 167 + { 168 + int ret; 169 + __le16 buf[BMP280_COMP_PRESS_REG_COUNT / 2]; 170 + 171 + ret = regmap_bulk_read(data->regmap, BMP280_REG_COMP_PRESS_START, 172 + buf, BMP280_COMP_PRESS_REG_COUNT); 173 + if (ret < 0) { 174 + dev_err(&data->client->dev, 175 + "failed to read pressure calibration parameters\n"); 176 + return ret; 177 + } 178 + 179 + comp->dig_p1 = (u16) le16_to_cpu(buf[0]); 180 + comp->dig_p2 = (s16) le16_to_cpu(buf[1]); 181 + comp->dig_p3 = (s16) le16_to_cpu(buf[2]); 182 + comp->dig_p4 = (s16) le16_to_cpu(buf[3]); 183 + comp->dig_p5 = (s16) le16_to_cpu(buf[4]); 184 + comp->dig_p6 = (s16) le16_to_cpu(buf[5]); 185 + comp->dig_p7 = (s16) le16_to_cpu(buf[6]); 186 + comp->dig_p8 = (s16) le16_to_cpu(buf[7]); 187 + comp->dig_p9 = (s16) le16_to_cpu(buf[8]); 188 + 189 + return 0; 190 + } 191 + 192 + /* 193 + * Returns temperature in DegC, resolution is 0.01 DegC. Output value of 194 + * "5123" equals 51.23 DegC. t_fine carries fine temperature as global 195 + * value. 196 + * 197 + * Taken from datasheet, Section 3.11.3, "Compensation formula". 198 + */ 199 + static s32 bmp280_compensate_temp(struct bmp280_data *data, 200 + struct bmp280_comp_temp *comp, 201 + s32 adc_temp) 202 + { 203 + s32 var1, var2, t; 204 + 205 + var1 = (((adc_temp >> 3) - ((s32) comp->dig_t1 << 1)) * 206 + ((s32) comp->dig_t2)) >> 11; 207 + var2 = (((((adc_temp >> 4) - ((s32) comp->dig_t1)) * 208 + ((adc_temp >> 4) - ((s32) comp->dig_t1))) >> 12) * 209 + ((s32) comp->dig_t3)) >> 14; 210 + 211 + data->t_fine = var1 + var2; 212 + t = (data->t_fine * 5 + 128) >> 8; 213 + 214 + return t; 215 + } 216 + 217 + /* 218 + * Returns pressure in Pa as unsigned 32 bit integer in Q24.8 format (24 219 + * integer bits and 8 fractional bits). Output value of "24674867" 220 + * represents 24674867/256 = 96386.2 Pa = 963.862 hPa 221 + * 222 + * Taken from datasheet, Section 3.11.3, "Compensation formula". 223 + */ 224 + static u32 bmp280_compensate_press(struct bmp280_data *data, 225 + struct bmp280_comp_press *comp, 226 + s32 adc_press) 227 + { 228 + s64 var1, var2, p; 229 + 230 + var1 = ((s64) data->t_fine) - 128000; 231 + var2 = var1 * var1 * (s64) comp->dig_p6; 232 + var2 = var2 + ((var1 * (s64) comp->dig_p5) << 17); 233 + var2 = var2 + (((s64) comp->dig_p4) << 35); 234 + var1 = ((var1 * var1 * (s64) comp->dig_p3) >> 8) + 235 + ((var1 * (s64) comp->dig_p2) << 12); 236 + var1 = (((((s64) 1) << 47) + var1)) * ((s64) comp->dig_p1) >> 33; 237 + 238 + if (var1 == 0) 239 + return 0; 240 + 241 + p = ((((s64) 1048576 - adc_press) << 31) - var2) * 3125; 242 + p = div64_s64(p, var1); 243 + var1 = (((s64) comp->dig_p9) * (p >> 13) * (p >> 13)) >> 25; 244 + var2 = (((s64) comp->dig_p8) * p) >> 19; 245 + p = ((p + var1 + var2) >> 8) + (((s64) comp->dig_p7) << 4); 246 + 247 + return (u32) p; 248 + } 249 + 250 + static int bmp280_read_temp(struct bmp280_data *data, 251 + int *val) 252 + { 253 + int ret; 254 + __be32 tmp = 0; 255 + s32 adc_temp, comp_temp; 256 + struct bmp280_comp_temp comp; 257 + 258 + ret = bmp280_read_compensation_temp(data, &comp); 259 + if (ret < 0) 260 + return ret; 261 + 262 + ret = regmap_bulk_read(data->regmap, BMP280_REG_TEMP_MSB, 263 + (u8 *) &tmp, 3); 264 + if (ret < 0) { 265 + dev_err(&data->client->dev, "failed to read temperature\n"); 266 + return ret; 267 + } 268 + 269 + adc_temp = be32_to_cpu(tmp) >> 12; 270 + comp_temp = bmp280_compensate_temp(data, &comp, adc_temp); 271 + 272 + /* 273 + * val might be NULL if we're called by the read_press routine, 274 + * who only cares about the carry over t_fine value. 275 + */ 276 + if (val) { 277 + *val = comp_temp * 10; 278 + return IIO_VAL_INT; 279 + } 280 + 281 + return 0; 282 + } 283 + 284 + static int bmp280_read_press(struct bmp280_data *data, 285 + int *val, int *val2) 286 + { 287 + int ret; 288 + __be32 tmp = 0; 289 + s32 adc_press; 290 + u32 comp_press; 291 + struct bmp280_comp_press comp; 292 + 293 + ret = bmp280_read_compensation_press(data, &comp); 294 + if (ret < 0) 295 + return ret; 296 + 297 + /* Read and compensate temperature so we get a reading of t_fine. */ 298 + ret = bmp280_read_temp(data, NULL); 299 + if (ret < 0) 300 + return ret; 301 + 302 + ret = regmap_bulk_read(data->regmap, BMP280_REG_PRESS_MSB, 303 + (u8 *) &tmp, 3); 304 + if (ret < 0) { 305 + dev_err(&data->client->dev, "failed to read pressure\n"); 306 + return ret; 307 + } 308 + 309 + adc_press = be32_to_cpu(tmp) >> 12; 310 + comp_press = bmp280_compensate_press(data, &comp, adc_press); 311 + 312 + *val = comp_press; 313 + *val2 = 256000; 314 + 315 + return IIO_VAL_FRACTIONAL; 316 + } 317 + 318 + static int bmp280_read_raw(struct iio_dev *indio_dev, 319 + struct iio_chan_spec const *chan, 320 + int *val, int *val2, long mask) 321 + { 322 + int ret; 323 + struct bmp280_data *data = iio_priv(indio_dev); 324 + 325 + mutex_lock(&data->lock); 326 + 327 + switch (mask) { 328 + case IIO_CHAN_INFO_PROCESSED: 329 + switch (chan->type) { 330 + case IIO_PRESSURE: 331 + ret = bmp280_read_press(data, val, val2); 332 + break; 333 + case IIO_TEMP: 334 + ret = bmp280_read_temp(data, val); 335 + break; 336 + default: 337 + ret = -EINVAL; 338 + break; 339 + } 340 + break; 341 + default: 342 + ret = -EINVAL; 343 + break; 344 + } 345 + 346 + mutex_unlock(&data->lock); 347 + 348 + return ret; 349 + } 350 + 351 + static const struct iio_info bmp280_info = { 352 + .driver_module = THIS_MODULE, 353 + .read_raw = &bmp280_read_raw, 354 + }; 355 + 356 + static int bmp280_chip_init(struct bmp280_data *data) 357 + { 358 + int ret; 359 + 360 + ret = regmap_update_bits(data->regmap, BMP280_REG_CTRL_MEAS, 361 + BMP280_OSRS_TEMP_MASK | 362 + BMP280_OSRS_PRESS_MASK | 363 + BMP280_MODE_MASK, 364 + BMP280_OSRS_TEMP_2X | 365 + BMP280_OSRS_PRESS_16X | 366 + BMP280_MODE_NORMAL); 367 + if (ret < 0) { 368 + dev_err(&data->client->dev, 369 + "failed to write config register\n"); 370 + return ret; 371 + } 372 + 373 + ret = regmap_update_bits(data->regmap, BMP280_REG_CONFIG, 374 + BMP280_FILTER_MASK, 375 + BMP280_FILTER_4X); 376 + if (ret < 0) { 377 + dev_err(&data->client->dev, 378 + "failed to write config register\n"); 379 + return ret; 380 + } 381 + 382 + return ret; 383 + } 384 + 385 + static int bmp280_probe(struct i2c_client *client, 386 + const struct i2c_device_id *id) 387 + { 388 + int ret; 389 + struct iio_dev *indio_dev; 390 + struct bmp280_data *data; 391 + unsigned int chip_id; 392 + 393 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); 394 + if (!indio_dev) 395 + return -ENOMEM; 396 + 397 + i2c_set_clientdata(client, indio_dev); 398 + data = iio_priv(indio_dev); 399 + mutex_init(&data->lock); 400 + data->client = client; 401 + 402 + indio_dev->dev.parent = &client->dev; 403 + indio_dev->name = id->name; 404 + indio_dev->channels = bmp280_channels; 405 + indio_dev->num_channels = ARRAY_SIZE(bmp280_channels); 406 + indio_dev->info = &bmp280_info; 407 + indio_dev->modes = INDIO_DIRECT_MODE; 408 + 409 + data->regmap = devm_regmap_init_i2c(client, &bmp280_regmap_config); 410 + if (IS_ERR(data->regmap)) { 411 + dev_err(&client->dev, "failed to allocate register map\n"); 412 + return PTR_ERR(data->regmap); 413 + } 414 + 415 + ret = regmap_read(data->regmap, BMP280_REG_ID, &chip_id); 416 + if (ret < 0) 417 + return ret; 418 + if (chip_id != BMP280_CHIP_ID) { 419 + dev_err(&client->dev, "bad chip id. expected %x got %x\n", 420 + BMP280_CHIP_ID, chip_id); 421 + return -EINVAL; 422 + } 423 + 424 + ret = bmp280_chip_init(data); 425 + if (ret < 0) 426 + return ret; 427 + 428 + return devm_iio_device_register(&client->dev, indio_dev); 429 + } 430 + 431 + static const struct acpi_device_id bmp280_acpi_match[] = { 432 + {"BMP0280", 0}, 433 + { }, 434 + }; 435 + MODULE_DEVICE_TABLE(acpi, bmp280_acpi_match); 436 + 437 + static const struct i2c_device_id bmp280_id[] = { 438 + {"bmp280", 0}, 439 + { }, 440 + }; 441 + MODULE_DEVICE_TABLE(i2c, bmp280_id); 442 + 443 + static struct i2c_driver bmp280_driver = { 444 + .driver = { 445 + .name = "bmp280", 446 + .acpi_match_table = ACPI_PTR(bmp280_acpi_match), 447 + }, 448 + .probe = bmp280_probe, 449 + .id_table = bmp280_id, 450 + }; 451 + module_i2c_driver(bmp280_driver); 452 + 453 + MODULE_AUTHOR("Vlad Dogaru <vlad.dogaru@intel.com>"); 454 + MODULE_DESCRIPTION("Driver for Bosch Sensortec BMP280 pressure and temperature sensor"); 455 + MODULE_LICENSE("GPL v2");
+1 -2
drivers/iio/pressure/st_pressure.h
··· 26 26 .drdy_int_pin = 1, 27 27 }; 28 28 29 - int st_press_common_probe(struct iio_dev *indio_dev, 30 - struct st_sensors_platform_data *pdata); 29 + int st_press_common_probe(struct iio_dev *indio_dev); 31 30 void st_press_common_remove(struct iio_dev *indio_dev); 32 31 33 32 #ifdef CONFIG_IIO_BUFFER
+6 -6
drivers/iio/pressure/st_pressure_buffer.c
··· 38 38 static int st_press_buffer_postenable(struct iio_dev *indio_dev) 39 39 { 40 40 int err; 41 - struct st_sensor_data *pdata = iio_priv(indio_dev); 41 + struct st_sensor_data *press_data = iio_priv(indio_dev); 42 42 43 - pdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 44 - if (pdata->buffer_data == NULL) { 43 + press_data->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 44 + if (press_data->buffer_data == NULL) { 45 45 err = -ENOMEM; 46 46 goto allocate_memory_error; 47 47 } ··· 53 53 return err; 54 54 55 55 st_press_buffer_postenable_error: 56 - kfree(pdata->buffer_data); 56 + kfree(press_data->buffer_data); 57 57 allocate_memory_error: 58 58 return err; 59 59 } ··· 61 61 static int st_press_buffer_predisable(struct iio_dev *indio_dev) 62 62 { 63 63 int err; 64 - struct st_sensor_data *pdata = iio_priv(indio_dev); 64 + struct st_sensor_data *press_data = iio_priv(indio_dev); 65 65 66 66 err = iio_triggered_buffer_predisable(indio_dev); 67 67 if (err < 0) ··· 70 70 err = st_sensors_set_enable(indio_dev, false); 71 71 72 72 st_press_buffer_predisable_error: 73 - kfree(pdata->buffer_data); 73 + kfree(press_data->buffer_data); 74 74 return err; 75 75 } 76 76
+25 -24
drivers/iio/pressure/st_pressure_core.c
··· 175 175 IIO_CHAN_SOFT_TIMESTAMP(1) 176 176 }; 177 177 178 - static const struct st_sensors st_press_sensors[] = { 178 + static const struct st_sensor_settings st_press_sensors_settings[] = { 179 179 { 180 180 .wai = ST_PRESS_LPS331AP_WAI_EXP, 181 181 .sensors_supported = { ··· 333 333 int *val2, long mask) 334 334 { 335 335 int err; 336 - struct st_sensor_data *pdata = iio_priv(indio_dev); 336 + struct st_sensor_data *press_data = iio_priv(indio_dev); 337 337 338 338 switch (mask) { 339 339 case IIO_CHAN_INFO_RAW: ··· 347 347 348 348 switch (ch->type) { 349 349 case IIO_PRESSURE: 350 - *val2 = pdata->current_fullscale->gain; 350 + *val2 = press_data->current_fullscale->gain; 351 351 break; 352 352 case IIO_TEMP: 353 - *val2 = pdata->current_fullscale->gain2; 353 + *val2 = press_data->current_fullscale->gain2; 354 354 break; 355 355 default: 356 356 err = -EINVAL; ··· 371 371 372 372 return IIO_VAL_FRACTIONAL; 373 373 case IIO_CHAN_INFO_SAMP_FREQ: 374 - *val = pdata->odr; 374 + *val = press_data->odr; 375 375 return IIO_VAL_INT; 376 376 default: 377 377 return -EINVAL; ··· 409 409 #define ST_PRESS_TRIGGER_OPS NULL 410 410 #endif 411 411 412 - int st_press_common_probe(struct iio_dev *indio_dev, 413 - struct st_sensors_platform_data *plat_data) 412 + int st_press_common_probe(struct iio_dev *indio_dev) 414 413 { 415 - struct st_sensor_data *pdata = iio_priv(indio_dev); 416 - int irq = pdata->get_irq_data_ready(indio_dev); 414 + struct st_sensor_data *press_data = iio_priv(indio_dev); 415 + int irq = press_data->get_irq_data_ready(indio_dev); 417 416 int err; 418 417 419 418 indio_dev->modes = INDIO_DIRECT_MODE; ··· 421 422 st_sensors_power_enable(indio_dev); 422 423 423 424 err = st_sensors_check_device_support(indio_dev, 424 - ARRAY_SIZE(st_press_sensors), 425 - st_press_sensors); 425 + ARRAY_SIZE(st_press_sensors_settings), 426 + st_press_sensors_settings); 426 427 if (err < 0) 427 428 return err; 428 429 429 - pdata->num_data_channels = ST_PRESS_NUMBER_DATA_CHANNELS; 430 - pdata->multiread_bit = pdata->sensor->multi_read_bit; 431 - indio_dev->channels = pdata->sensor->ch; 432 - indio_dev->num_channels = pdata->sensor->num_ch; 430 + press_data->num_data_channels = ST_PRESS_NUMBER_DATA_CHANNELS; 431 + press_data->multiread_bit = press_data->sensor_settings->multi_read_bit; 432 + indio_dev->channels = press_data->sensor_settings->ch; 433 + indio_dev->num_channels = press_data->sensor_settings->num_ch; 433 434 434 - if (pdata->sensor->fs.addr != 0) 435 - pdata->current_fullscale = (struct st_sensor_fullscale_avl *) 436 - &pdata->sensor->fs.fs_avl[0]; 435 + if (press_data->sensor_settings->fs.addr != 0) 436 + press_data->current_fullscale = 437 + (struct st_sensor_fullscale_avl *) 438 + &press_data->sensor_settings->fs.fs_avl[0]; 437 439 438 - pdata->odr = pdata->sensor->odr.odr_avl[0].hz; 440 + press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz; 439 441 440 442 /* Some devices don't support a data ready pin. */ 441 - if (!plat_data && pdata->sensor->drdy_irq.addr) 442 - plat_data = 443 + if (!press_data->dev->platform_data && 444 + press_data->sensor_settings->drdy_irq.addr) 445 + press_data->dev->platform_data = 443 446 (struct st_sensors_platform_data *)&default_press_pdata; 444 447 445 - err = st_sensors_init_sensor(indio_dev, plat_data); 448 + err = st_sensors_init_sensor(indio_dev, press_data->dev->platform_data); 446 449 if (err < 0) 447 450 return err; 448 451 ··· 480 479 481 480 void st_press_common_remove(struct iio_dev *indio_dev) 482 481 { 483 - struct st_sensor_data *pdata = iio_priv(indio_dev); 482 + struct st_sensor_data *press_data = iio_priv(indio_dev); 484 483 485 484 st_sensors_power_disable(indio_dev); 486 485 487 486 iio_device_unregister(indio_dev); 488 - if (pdata->get_irq_data_ready(indio_dev) > 0) 487 + if (press_data->get_irq_data_ready(indio_dev) > 0) 489 488 st_sensors_deallocate_trigger(indio_dev); 490 489 491 490 st_press_deallocate_ring(indio_dev);
+5 -6
drivers/iio/pressure/st_pressure_i2c.c
··· 43 43 const struct i2c_device_id *id) 44 44 { 45 45 struct iio_dev *indio_dev; 46 - struct st_sensor_data *pdata; 46 + struct st_sensor_data *press_data; 47 47 int err; 48 48 49 - indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*pdata)); 49 + indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*press_data)); 50 50 if (!indio_dev) 51 51 return -ENOMEM; 52 52 53 - pdata = iio_priv(indio_dev); 54 - pdata->dev = &client->dev; 53 + press_data = iio_priv(indio_dev); 55 54 st_sensors_of_i2c_probe(client, st_press_of_match); 56 55 57 - st_sensors_i2c_configure(indio_dev, client, pdata); 56 + st_sensors_i2c_configure(indio_dev, client, press_data); 58 57 59 - err = st_press_common_probe(indio_dev, client->dev.platform_data); 58 + err = st_press_common_probe(indio_dev); 60 59 if (err < 0) 61 60 return err; 62 61
+5 -6
drivers/iio/pressure/st_pressure_spi.c
··· 21 21 static int st_press_spi_probe(struct spi_device *spi) 22 22 { 23 23 struct iio_dev *indio_dev; 24 - struct st_sensor_data *pdata; 24 + struct st_sensor_data *press_data; 25 25 int err; 26 26 27 - indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*pdata)); 27 + indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*press_data)); 28 28 if (indio_dev == NULL) 29 29 return -ENOMEM; 30 30 31 - pdata = iio_priv(indio_dev); 32 - pdata->dev = &spi->dev; 31 + press_data = iio_priv(indio_dev); 33 32 34 - st_sensors_spi_configure(indio_dev, spi, pdata); 33 + st_sensors_spi_configure(indio_dev, spi, press_data); 35 34 36 - err = st_press_common_probe(indio_dev, spi->dev.platform_data); 35 + err = st_press_common_probe(indio_dev); 37 36 if (err < 0) 38 37 return err; 39 38
+8 -8
drivers/iio/proximity/as3935.c
··· 95 95 *val = ret; 96 96 97 97 return 0; 98 - }; 98 + } 99 99 100 100 static int as3935_write(struct as3935_state *st, 101 101 unsigned int reg, ··· 107 107 buf[1] = val; 108 108 109 109 return spi_write(st->spi, buf, 2); 110 - }; 110 + } 111 111 112 112 static ssize_t as3935_sensor_sensitivity_show(struct device *dev, 113 113 struct device_attribute *attr, ··· 122 122 val = (val & AS3935_AFE_MASK) >> 1; 123 123 124 124 return sprintf(buf, "%d\n", val); 125 - }; 125 + } 126 126 127 127 static ssize_t as3935_sensor_sensitivity_store(struct device *dev, 128 128 struct device_attribute *attr, ··· 142 142 as3935_write(st, AS3935_AFE_GAIN, val << 1); 143 143 144 144 return len; 145 - }; 145 + } 146 146 147 147 static IIO_DEVICE_ATTR(sensor_sensitivity, S_IRUGO | S_IWUSR, 148 148 as3935_sensor_sensitivity_show, as3935_sensor_sensitivity_store, 0); ··· 214 214 iio_trigger_notify_done(indio_dev->trig); 215 215 216 216 return IRQ_HANDLED; 217 - }; 217 + } 218 218 219 219 static const struct iio_trigger_ops iio_interrupt_trigger_ops = { 220 220 .owner = THIS_MODULE, ··· 238 238 dev_warn(&st->spi->dev, "noise level is too high"); 239 239 break; 240 240 } 241 - }; 241 + } 242 242 243 243 static irqreturn_t as3935_interrupt_handler(int irq, void *private) 244 244 { ··· 417 417 iio_trigger_unregister(st->trig); 418 418 419 419 return ret; 420 - }; 420 + } 421 421 422 422 static int as3935_remove(struct spi_device *spi) 423 423 { ··· 429 429 iio_trigger_unregister(st->trig); 430 430 431 431 return 0; 432 - }; 432 + } 433 433 434 434 static const struct spi_device_id as3935_id[] = { 435 435 {"as3935", 0},
+46 -33
drivers/staging/iio/Documentation/generic_buffer.c
··· 162 162 char *buffer_access; 163 163 int scan_size; 164 164 int noevents = 0; 165 + int notrigger = 0; 165 166 char *dummy; 166 167 167 168 struct iio_channel_info *channels; 168 169 169 - while ((c = getopt(argc, argv, "l:w:c:et:n:")) != -1) { 170 + while ((c = getopt(argc, argv, "l:w:c:et:n:g")) != -1) { 170 171 switch (c) { 171 172 case 'n': 172 173 device_name = optarg; ··· 188 187 case 'l': 189 188 buf_len = strtoul(optarg, &dummy, 10); 190 189 break; 190 + case 'g': 191 + notrigger = 1; 192 + break; 191 193 case '?': 192 194 return -1; 193 195 } ··· 209 205 printf("iio device number being used is %d\n", dev_num); 210 206 211 207 asprintf(&dev_dir_name, "%siio:device%d", iio_dir, dev_num); 212 - if (trigger_name == NULL) { 213 - /* 214 - * Build the trigger name. If it is device associated its 215 - * name is <device_name>_dev[n] where n matches the device 216 - * number found above 217 - */ 218 - ret = asprintf(&trigger_name, 219 - "%s-dev%d", device_name, dev_num); 220 - if (ret < 0) { 221 - ret = -ENOMEM; 222 - goto error_ret; 223 - } 224 - } 225 208 226 - /* Verify the trigger exists */ 227 - trig_num = find_type_by_name(trigger_name, "trigger"); 228 - if (trig_num < 0) { 229 - printf("Failed to find the trigger %s\n", trigger_name); 230 - ret = -ENODEV; 231 - goto error_free_triggername; 232 - } 233 - printf("iio trigger number being used is %d\n", trig_num); 209 + if (!notrigger) { 210 + if (trigger_name == NULL) { 211 + /* 212 + * Build the trigger name. If it is device associated 213 + * its name is <device_name>_dev[n] where n matches 214 + * the device number found above. 215 + */ 216 + ret = asprintf(&trigger_name, 217 + "%s-dev%d", device_name, dev_num); 218 + if (ret < 0) { 219 + ret = -ENOMEM; 220 + goto error_ret; 221 + } 222 + } 223 + 224 + /* Verify the trigger exists */ 225 + trig_num = find_type_by_name(trigger_name, "trigger"); 226 + if (trig_num < 0) { 227 + printf("Failed to find the trigger %s\n", trigger_name); 228 + ret = -ENODEV; 229 + goto error_free_triggername; 230 + } 231 + printf("iio trigger number being used is %d\n", trig_num); 232 + } else 233 + printf("trigger-less mode selected\n"); 234 234 235 235 /* 236 236 * Parse the files in scan_elements to identify what channels are ··· 258 250 ret = -ENOMEM; 259 251 goto error_free_triggername; 260 252 } 261 - printf("%s %s\n", dev_dir_name, trigger_name); 262 - /* Set the device trigger to be the data ready trigger found above */ 263 - ret = write_sysfs_string_and_verify("trigger/current_trigger", 264 - dev_dir_name, 265 - trigger_name); 266 - if (ret < 0) { 267 - printf("Failed to write current_trigger file\n"); 268 - goto error_free_buf_dir_name; 253 + 254 + if (!notrigger) { 255 + printf("%s %s\n", dev_dir_name, trigger_name); 256 + /* Set the device trigger to be the data ready trigger found 257 + * above */ 258 + ret = write_sysfs_string_and_verify("trigger/current_trigger", 259 + dev_dir_name, 260 + trigger_name); 261 + if (ret < 0) { 262 + printf("Failed to write current_trigger file\n"); 263 + goto error_free_buf_dir_name; 264 + } 269 265 } 270 266 271 267 /* Setup ring buffer parameters */ ··· 339 327 if (ret < 0) 340 328 goto error_close_buffer_access; 341 329 342 - /* Disconnect the trigger - just write a dummy name. */ 343 - write_sysfs_string("trigger/current_trigger", 344 - dev_dir_name, "NULL"); 330 + if (!notrigger) 331 + /* Disconnect the trigger - just write a dummy name. */ 332 + write_sysfs_string("trigger/current_trigger", 333 + dev_dir_name, "NULL"); 345 334 346 335 error_close_buffer_access: 347 336 close(fp);
+1
drivers/staging/iio/accel/lis3l02dq_ring.c
··· 35 35 iio_trigger_poll(st->trig); 36 36 return IRQ_HANDLED; 37 37 } 38 + 38 39 return IRQ_WAKE_THREAD; 39 40 } 40 41
+5 -5
include/linux/iio/common/st_sensors.h
··· 164 164 }; 165 165 166 166 /** 167 - * struct st_sensors - ST sensors list 167 + * struct st_sensor_settings - ST specific sensor settings 168 168 * @wai: Contents of WhoAmI register. 169 169 * @sensors_supported: List of supported sensors by struct itself. 170 170 * @ch: IIO channels for the sensor. ··· 177 177 * @multi_read_bit: Use or not particular bit for [I2C/SPI] multi-read. 178 178 * @bootime: samples to discard when sensor passing from power-down to power-up. 179 179 */ 180 - struct st_sensors { 180 + struct st_sensor_settings { 181 181 u8 wai; 182 182 char sensors_supported[ST_SENSORS_MAX_4WAI][ST_SENSORS_MAX_NAME]; 183 183 struct iio_chan_spec *ch; ··· 196 196 * struct st_sensor_data - ST sensor device status 197 197 * @dev: Pointer to instance of struct device (I2C or SPI). 198 198 * @trig: The trigger in use by the core driver. 199 - * @sensor: Pointer to the current sensor struct in use. 199 + * @sensor_settings: Pointer to the specific sensor settings in use. 200 200 * @current_fullscale: Maximum range of measure by the sensor. 201 201 * @vdd: Pointer to sensor's Vdd power supply 202 202 * @vdd_io: Pointer to sensor's Vdd-IO power supply ··· 213 213 struct st_sensor_data { 214 214 struct device *dev; 215 215 struct iio_trigger *trig; 216 - struct st_sensors *sensor; 216 + struct st_sensor_settings *sensor_settings; 217 217 struct st_sensor_fullscale_avl *current_fullscale; 218 218 struct regulator *vdd; 219 219 struct regulator *vdd_io; ··· 279 279 struct iio_chan_spec const *ch, int *val); 280 280 281 281 int st_sensors_check_device_support(struct iio_dev *indio_dev, 282 - int num_sensors_list, const struct st_sensors *sensors); 282 + int num_sensors_list, const struct st_sensor_settings *sensor_settings); 283 283 284 284 ssize_t st_sensors_sysfs_sampling_frequency_avail(struct device *dev, 285 285 struct device_attribute *attr, char *buf);
+8
include/linux/iio/iio.h
··· 13 13 #include <linux/device.h> 14 14 #include <linux/cdev.h> 15 15 #include <linux/iio/types.h> 16 + #include <linux/of.h> 16 17 /* IIO TODO LIST */ 17 18 /* 18 19 * Provide means of adjusting timer accuracy. ··· 327 326 * @update_scan_mode: function to configure device and scan buffer when 328 327 * channels have changed 329 328 * @debugfs_reg_access: function to read or write register value of device 329 + * @of_xlate: function pointer to obtain channel specifier index. 330 + * When #iio-cells is greater than '0', the driver could 331 + * provide a custom of_xlate function that reads the 332 + * *args* and returns the appropriate index in registered 333 + * IIO channels array. 330 334 **/ 331 335 struct iio_info { 332 336 struct module *driver_module; ··· 391 385 int (*debugfs_reg_access)(struct iio_dev *indio_dev, 392 386 unsigned reg, unsigned writeval, 393 387 unsigned *readval); 388 + int (*of_xlate)(struct iio_dev *indio_dev, 389 + const struct of_phandle_args *iiospec); 394 390 }; 395 391 396 392 /**