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

Merge tag 'iio-for-6.11b' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio into char-misc-next

Jonathan writes:

IIO: 2nd set of new device support, features and cleanup for 6.11

The big one here is we finally have Paul Cercueil's (and others)
DMA buffer support for IIO devices enabling high speed zero
copy transfer of data to and from sensors supported by IIO (and for
example USB). This should aid with upstream support of a range of
higher performance ADCs and DACs.

Two merges from other trees
- spi/spi_devm_optimize used for simplification in ad7944.
- dmaengine/topic_dma_vec to enable the DMABUF series.

One feature with impact outside IIO.
- Richer set of dev_err_probe() like helpers to cover ERR_PTR() cases.

New device support
==================
adi,ad7173
- Add support for AD4111, AD4112, AD4114, AD4115 and ADC4116 pseudo
differential ADCs. Major driver rework was needed to enabled these.
adi,ad7944
- Use devm_spi_optimize_message() to avoid a local devm cleanup
callback. This is the example case from the patch set, others will
follow.
mediatek,mt6359-auxadc
- New driver for this ADC IP found in MT6357, MT6358 and MT6359 PMICs.
st,accel
- Add support for the LIS2DS12 accelerometer
ti,ads1119
- New driver for this 16 bit 2-differential or 4-single ended channel
ADC.

Features
========
dt-bindings
- Introduce new common-mode-channel property to help handle pseudo
differential ADCs where we have something that looks like one side
of differential input, but which is only suited for use with a
slow moving reference.
adi,adf4350
- Support use as a clock provider.
iio-hmwon
- Support reading of labels from IIO devices by their consumers and
use this in the hwmon bridge.

Cleanup and minor fixes
=======================
Treewide
- Use regmap_clear_bits() / regmap_set_bits() to simplify open coded
equivalents.
- Use devm_regulator_get_enable_read_voltage() to replace equivalent
opencoded boilerplate. In some cases enabled complete conversion to
devm handling and removal of explicit remove() callbacks.
- Introduce dev_err_ptr_probe() and other variants and make use of
of them in a couple of examples driver cleanups. Will find use in
many more drivers soon.
adi,ad7192
- Introduce local struct device *dev and use dev_err_probe() to give
more readable code.
adi,adi-axi-adc/dac
- Improved consistency of messages using dev_err_probe()
adi,adis
- Split the trigger handling into cases that needed paging and those that
don't resulting in more readable code.
- Use cleanup.h to simplify error paths via scoped cleanup.
- Add adis specific lock helpers and make use of them in a number of drivers.
adi,ad7192
- Update maintainer (Alisa-Dariana Roman)
adi,ad7606
- dt-binding cleanup.
avago,apds9306
- Add a maintainer entry (Subhajit Ghosh)
linear,ltc2309
- Fix a wrong endian type.
st,stm32-dfsdm
- Fix a missing port property in the dt-binding.
st,sensors
- Relax whoami match failure to a warning print rather than probe failure.
This enables fallback compatibles to existing parts from those that don't
necessarily even exit yet.

* tag 'iio-for-6.11b' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jic23/iio: (112 commits)
iio: adc: ad7173: Fix uninitialized symbol is_current_chan
iio: adc: Add support for MediaTek MT6357/8/9 Auxiliary ADC
math.h: Add unsigned 8 bits fractional numbers type
dt-bindings: iio: adc: Add MediaTek MT6359 PMIC AUXADC
iio: common: scmi_iio: convert to dev_err_probe()
iio: backend: make use of dev_err_cast_probe()
iio: temperature: ltc2983: convert to dev_err_probe()
dev_printk: add new dev_err_probe() helpers
iio: xilinx-ams: Add labels
iio: adc: ad7944: use devm_spi_optimize_message()
Documentation: iio: Document high-speed DMABUF based API
iio: buffer-dmaengine: Support new DMABUF based userspace API
iio: buffer-dma: Enable support for DMABUFs
iio: core: Add new DMABUF interface infrastructure
MAINTAINERS: Update AD7192 driver maintainer
iio: adc: ad7192: use devm_regulator_get_enable_read_voltage
iio: st_sensors: relax WhoAmI check in st_sensors_verify_id()
MAINTAINERS: Add AVAGO APDS9306
dt-bindings: iio: adc: adi,ad7606: comment and sort the compatible names
dt-bindings: iio: adc: adi,ad7606: add missing datasheet link
...

+4446 -1493
+11
Documentation/devicetree/bindings/iio/adc/adc.yaml
··· 46 46 differential channels). If this and diff-channels are not present reg 47 47 shall be used instead. 48 48 49 + common-mode-channel: 50 + $ref: /schemas/types.yaml#/definitions/uint32 51 + description: 52 + Some ADCs have differential input pins that can be used to measure 53 + single-ended or pseudo-differential inputs. This property can be used 54 + in addition to single-channel to signal software that this channel is 55 + not differential but still specify two inputs. 56 + 57 + The input pair is specified by setting single-channel to the positive 58 + input pin and common-mode-channel to the negative pin. 59 + 49 60 settling-time-us: 50 61 description: 51 62 Time between enabling the channel and first stable readings.
+192 -2
Documentation/devicetree/bindings/iio/adc/adi,ad7173.yaml
··· 19 19 primarily for measurement of signals close to DC but also delivers 20 20 outstanding performance with input bandwidths out to ~10kHz. 21 21 22 + Analog Devices AD411x ADC's: 23 + The AD411X family encompasses a series of low power, low noise, 24-bit, 24 + sigma-delta analog-to-digital converters that offer a versatile range of 25 + specifications. They integrate an analog front end suitable for processing 26 + fully differential/single-ended and bipolar voltage inputs. 27 + 22 28 Datasheets for supported chips: 29 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD4111.pdf 30 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD4112.pdf 31 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD4114.pdf 32 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD4115.pdf 33 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD4116.pdf 23 34 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7172-2.pdf 24 35 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7172-4.pdf 25 36 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7173-8.pdf ··· 42 31 properties: 43 32 compatible: 44 33 enum: 34 + - adi,ad4111 35 + - adi,ad4112 36 + - adi,ad4114 37 + - adi,ad4115 38 + - adi,ad4116 45 39 - adi,ad7172-2 46 40 - adi,ad7172-4 47 41 - adi,ad7173-8 ··· 145 129 maximum: 15 146 130 147 131 diff-channels: 132 + description: | 133 + This property is used for defining the inputs of a differential 134 + voltage channel. The first value is the positive input and the second 135 + value is the negative input of the channel. 136 + 137 + Family AD411x supports a dedicated VINCOM voltage input. 138 + To select it set the second channel to 16. 139 + (VIN2, VINCOM) -> diff-channels = <2 16> 140 + 141 + There are special values that can be selected besides the voltage 142 + analog inputs: 143 + 21: REF+ 144 + 22: REF− 145 + 146 + Supported only by AD7172-2, AD7172-4, AD7175-2, AD7175-8, AD7177-2, 147 + must be paired together and can be used to monitor the power supply 148 + of the ADC: 149 + 19: ((AVDD1 − AVSS)/5)+ 150 + 20: ((AVDD1 − AVSS)/5)− 151 + 148 152 items: 149 153 minimum: 0 150 154 maximum: 31 155 + 156 + single-channel: 157 + description: | 158 + This property is used for defining a current channel or the positive 159 + input of a voltage channel (single-ended or pseudo-differential). 160 + 161 + Models AD4111 and AD4112 support current channels. 162 + Example: (IIN2+, IIN2−) -> single-channel = <2> 163 + To correctly configure a current channel set the "adi,current-channel" 164 + property to true. 165 + 166 + To configure a single-ended/pseudo-differential channel set the 167 + "common-mode-channel" property to the desired negative voltage input. 168 + 169 + When used as a voltage channel, special inputs are valid as well. 170 + minimum: 0 171 + maximum: 31 172 + 173 + common-mode-channel: 174 + description: 175 + This property is used for defining the negative input of a 176 + single-ended or pseudo-differential voltage channel. 177 + 178 + Special inputs are valid as well. 179 + minimum: 0 180 + maximum: 31 151 181 152 182 adi,reference-select: 153 183 description: | ··· 216 154 - avdd 217 155 default: refout-avss 218 156 157 + adi,current-channel: 158 + $ref: /schemas/types.yaml#/definitions/flag 159 + description: | 160 + Signal that the selected inputs are current channels. 161 + Only available on AD4111 and AD4112. 162 + 219 163 required: 220 164 - reg 221 - - diff-channels 165 + 166 + allOf: 167 + - oneOf: 168 + - required: [single-channel] 169 + properties: 170 + diff-channels: false 171 + - required: [diff-channels] 172 + properties: 173 + single-channel: false 174 + adi,current-channel: false 175 + common-mode-channel: false 176 + 177 + - if: 178 + required: [common-mode-channel] 179 + then: 180 + properties: 181 + adi,current-channel: false 222 182 223 183 required: 224 184 - compatible ··· 250 166 - $ref: /schemas/spi/spi-peripheral-props.yaml# 251 167 252 168 # Only ad7172-4, ad7173-8 and ad7175-8 support vref2 253 - # Other models have [0-3] channel registers 254 169 - if: 255 170 properties: 256 171 compatible: ··· 270 187 - vref 271 188 - refout-avss 272 189 - avdd 190 + 191 + - if: 192 + properties: 193 + compatible: 194 + contains: 195 + enum: 196 + - adi,ad4114 197 + - adi,ad4115 198 + - adi,ad4116 199 + - adi,ad7173-8 200 + - adi,ad7175-8 201 + then: 202 + patternProperties: 203 + "^channel@[0-9a-f]$": 204 + properties: 205 + reg: 206 + maximum: 15 207 + 208 + - if: 209 + properties: 210 + compatible: 211 + contains: 212 + enum: 213 + - adi,ad7172-2 214 + - adi,ad7175-2 215 + - adi,ad7176-2 216 + - adi,ad7177-2 217 + then: 218 + patternProperties: 219 + "^channel@[0-9a-f]$": 220 + properties: 273 221 reg: 274 222 maximum: 3 275 223 ··· 325 211 - adi,reference-select 326 212 327 213 - if: 214 + properties: 215 + compatible: 216 + contains: 217 + enum: 218 + - adi,ad4111 219 + - adi,ad4112 220 + - adi,ad4114 221 + - adi,ad4115 222 + - adi,ad4116 223 + then: 224 + properties: 225 + avdd2-supply: false 226 + 227 + - if: 228 + properties: 229 + compatible: 230 + not: 231 + contains: 232 + enum: 233 + - adi,ad4111 234 + - adi,ad4112 235 + then: 236 + patternProperties: 237 + "^channel@[0-9a-f]$": 238 + properties: 239 + adi,current-channel: false 240 + 241 + - if: 328 242 anyOf: 329 243 - required: [clock-names] 330 244 - required: [clocks] ··· 363 221 unevaluatedProperties: false 364 222 365 223 examples: 224 + # Example AD7173-8 with external reference connected to REF+/REF-: 366 225 - | 367 226 #include <dt-bindings/gpio/gpio.h> 368 227 #include <dt-bindings/interrupt-controller/irq.h> ··· 417 274 reg = <4>; 418 275 diff-channels = <8 9>; 419 276 adi,reference-select = "avdd"; 277 + }; 278 + }; 279 + }; 280 + 281 + # Example AD4111 with current channel and single-ended channel: 282 + - | 283 + #include <dt-bindings/gpio/gpio.h> 284 + #include <dt-bindings/interrupt-controller/irq.h> 285 + 286 + spi { 287 + #address-cells = <1>; 288 + #size-cells = <0>; 289 + 290 + adc@0 { 291 + compatible = "adi,ad4111"; 292 + reg = <0>; 293 + 294 + #address-cells = <1>; 295 + #size-cells = <0>; 296 + 297 + interrupts = <25 IRQ_TYPE_EDGE_FALLING>; 298 + interrupt-names = "rdy"; 299 + interrupt-parent = <&gpio>; 300 + spi-max-frequency = <5000000>; 301 + gpio-controller; 302 + #gpio-cells = <2>; 303 + #clock-cells = <0>; 304 + 305 + channel@0 { 306 + reg = <0>; 307 + bipolar; 308 + diff-channels = <4 5>; 309 + }; 310 + 311 + // Single ended channel VIN2/VINCOM 312 + channel@1 { 313 + reg = <1>; 314 + bipolar; 315 + single-channel = <2>; 316 + common-mode-channel = <16>; 317 + }; 318 + 319 + // Current channel IN2+/IN2- 320 + channel@2 { 321 + reg = <2>; 322 + single-channel = <2>; 323 + adi,current-channel; 420 324 }; 421 325 }; 422 326 };
+3 -2
Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
··· 11 11 12 12 description: | 13 13 Analog Devices AD7606 Simultaneous Sampling ADC 14 + https://www.analog.com/media/en/technical-documentation/data-sheets/AD7605-4.pdf 14 15 https://www.analog.com/media/en/technical-documentation/data-sheets/ad7606_7606-6_7606-4.pdf 15 16 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7606B.pdf 16 17 https://www.analog.com/media/en/technical-documentation/data-sheets/AD7616.pdf ··· 20 19 compatible: 21 20 enum: 22 21 - adi,ad7605-4 23 - - adi,ad7606-8 24 - - adi,ad7606-6 25 22 - adi,ad7606-4 23 + - adi,ad7606-6 24 + - adi,ad7606-8 # Referred to as AD7606 (without -8) in the datasheet 26 25 - adi,ad7606b 27 26 - adi,ad7616 28 27
+33
Documentation/devicetree/bindings/iio/adc/mediatek,mt6359-auxadc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/iio/adc/mediatek,mt6359-auxadc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: MediaTek MT6350 series PMIC AUXADC 8 + 9 + maintainers: 10 + - AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 11 + 12 + description: 13 + The Auxiliary Analog/Digital Converter (AUXADC) is an ADC found 14 + in some MediaTek PMICs, performing various PMIC related measurements 15 + such as battery and PMIC internal voltage regulators temperatures, 16 + accessory detection resistance (usually, for a 3.5mm audio jack) 17 + other than voltages for various PMIC internal components. 18 + 19 + properties: 20 + compatible: 21 + enum: 22 + - mediatek,mt6357-auxadc 23 + - mediatek,mt6358-auxadc 24 + - mediatek,mt6359-auxadc 25 + 26 + "#io-channel-cells": 27 + const: 1 28 + 29 + required: 30 + - compatible 31 + - "#io-channel-cells" 32 + 33 + additionalProperties: false
+4
Documentation/devicetree/bindings/iio/adc/st,stm32-dfsdm-adc.yaml
··· 246 246 From common IIO binding. Used to pipe external sigma delta 247 247 modulator or internal ADC output to DFSDM channel. 248 248 249 + port: 250 + $ref: /schemas/sound/audio-graph-port.yaml# 251 + unevaluatedProperties: false 252 + 249 253 required: 250 254 - compatible 251 255 - "#sound-dai-cells"
+155
Documentation/devicetree/bindings/iio/adc/ti,ads1119.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/iio/adc/ti,ads1119.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Texas Instruments ADS1119 ADC 8 + 9 + maintainers: 10 + - João Paulo Gonçalves <jpaulo.silvagoncalves@gmail.com> 11 + 12 + description: 13 + The TI ADS1119 is a precision 16-bit ADC over I2C that offers single-ended and 14 + differential measurements using a multiplexed input. It features a programmable 15 + gain, a programmable sample rate, an internal oscillator and voltage reference, 16 + and a 50/60Hz rejection filter. 17 + 18 + properties: 19 + compatible: 20 + const: ti,ads1119 21 + 22 + reg: 23 + maxItems: 1 24 + 25 + interrupts: 26 + maxItems: 1 27 + 28 + reset-gpios: 29 + maxItems: 1 30 + 31 + avdd-supply: true 32 + dvdd-supply: true 33 + 34 + vref-supply: 35 + description: 36 + ADC external reference voltage (VREF). 37 + 38 + "#address-cells": 39 + const: 1 40 + 41 + "#size-cells": 42 + const: 0 43 + 44 + "#io-channel-cells": 45 + const: 1 46 + 47 + required: 48 + - compatible 49 + - reg 50 + - "#address-cells" 51 + - "#size-cells" 52 + - avdd-supply 53 + - dvdd-supply 54 + 55 + patternProperties: 56 + "^channel@([0-6])$": 57 + $ref: adc.yaml 58 + type: object 59 + properties: 60 + reg: 61 + minimum: 0 62 + maximum: 6 63 + 64 + diff-channels: 65 + description: 66 + Differential input channels AIN0-AIN1, AIN2-AIN3 and AIN1-AIN2. 67 + oneOf: 68 + - items: 69 + - const: 0 70 + - const: 1 71 + - items: 72 + - const: 2 73 + - const: 3 74 + - items: 75 + - const: 1 76 + - const: 2 77 + 78 + single-channel: 79 + description: 80 + Single-ended input channels AIN0, AIN1, AIN2 and AIN3. 81 + minimum: 0 82 + maximum: 3 83 + 84 + oneOf: 85 + - required: 86 + - diff-channels 87 + - required: 88 + - single-channel 89 + 90 + required: 91 + - reg 92 + 93 + unevaluatedProperties: false 94 + 95 + additionalProperties: false 96 + 97 + examples: 98 + - | 99 + 100 + #include <dt-bindings/gpio/gpio.h> 101 + #include <dt-bindings/interrupt-controller/irq.h> 102 + 103 + i2c { 104 + #address-cells = <1>; 105 + #size-cells = <0>; 106 + 107 + adc@40 { 108 + compatible = "ti,ads1119"; 109 + reg = <0x40>; 110 + interrupt-parent = <&gpio1>; 111 + interrupts = <25 IRQ_TYPE_EDGE_FALLING>; 112 + reset-gpios = <&gpio1 10 GPIO_ACTIVE_LOW>; 113 + avdd-supply = <&reg_avdd_ads1119>; 114 + dvdd-supply = <&reg_dvdd_ads1119>; 115 + vref-supply = <&reg_vref_ads1119>; 116 + #address-cells = <1>; 117 + #size-cells = <0>; 118 + #io-channel-cells = <1>; 119 + 120 + channel@0 { 121 + reg = <0>; 122 + single-channel = <0>; 123 + }; 124 + 125 + channel@1 { 126 + reg = <1>; 127 + diff-channels = <0 1>; 128 + }; 129 + 130 + channel@2 { 131 + reg = <2>; 132 + single-channel = <3>; 133 + }; 134 + 135 + channel@3 { 136 + reg = <3>; 137 + single-channel = <1>; 138 + }; 139 + 140 + channel@4 { 141 + reg = <4>; 142 + single-channel = <2>; 143 + }; 144 + 145 + channel@5 { 146 + reg = <5>; 147 + diff-channels = <1 2>; 148 + }; 149 + 150 + channel@6 { 151 + reg = <6>; 152 + diff-channels = <2 3>; 153 + }; 154 + }; 155 + };
+6
Documentation/devicetree/bindings/iio/frequency/adi,adf4350.yaml
··· 28 28 clock-names: 29 29 const: clkin 30 30 31 + '#clock-cells': 32 + const: 0 33 + 34 + clock-output-names: 35 + maxItems: 1 36 + 31 37 gpios: 32 38 maxItems: 1 33 39 description: Lock detect GPIO.
+1
Documentation/devicetree/bindings/iio/st,st-sensors.yaml
··· 26 26 - st,lis2dw12 27 27 - st,lis2hh12 28 28 - st,lis2dh12-accel 29 + - st,lis2ds12 29 30 - st,lis302dl 30 31 - st,lis331dl-accel 31 32 - st,lis331dlh-accel
+9
Documentation/driver-api/dmaengine/client.rst
··· 80 80 81 81 - slave_sg: DMA a list of scatter gather buffers from/to a peripheral 82 82 83 + - peripheral_dma_vec: DMA an array of scatter gather buffers from/to a 84 + peripheral. Similar to slave_sg, but uses an array of dma_vec 85 + structures instead of a scatterlist. 86 + 83 87 - dma_cyclic: Perform a cyclic DMA operation from/to a peripheral till the 84 88 operation is explicitly stopped. 85 89 ··· 104 100 struct dma_async_tx_descriptor *dmaengine_prep_slave_sg( 105 101 struct dma_chan *chan, struct scatterlist *sgl, 106 102 unsigned int sg_len, enum dma_data_direction direction, 103 + unsigned long flags); 104 + 105 + struct dma_async_tx_descriptor *dmaengine_prep_peripheral_dma_vec( 106 + struct dma_chan *chan, const struct dma_vec *vecs, 107 + size_t nents, enum dma_data_direction direction, 107 108 unsigned long flags); 108 109 109 110 struct dma_async_tx_descriptor *dmaengine_prep_dma_cyclic(
+10
Documentation/driver-api/dmaengine/provider.rst
··· 433 433 - residue: Provides the residue bytes of the transfer for those that 434 434 support residue. 435 435 436 + - ``device_prep_peripheral_dma_vec`` 437 + 438 + - Similar to ``device_prep_slave_sg``, but it takes a pointer to a 439 + array of ``dma_vec`` structures, which (in the long run) will replace 440 + scatterlists. 441 + 436 442 - ``device_issue_pending`` 437 443 438 444 - Takes the first transaction descriptor in the pending queue, ··· 549 543 550 544 - Not really relevant any more since the introduction of ``virt-dma`` 551 545 that abstracts it away. 546 + 547 + dma_vec 548 + 549 + - A small structure that contains a DMA address and length. 552 550 553 551 DMA_CTRL_ACK 554 552
+3
Documentation/driver-api/driver-model/devres.rst
··· 464 464 SPI 465 465 devm_spi_alloc_master() 466 466 devm_spi_alloc_slave() 467 + devm_spi_optimize_message() 467 468 devm_spi_register_controller() 469 + devm_spi_register_host() 470 + devm_spi_register_target() 468 471 469 472 WATCHDOG 470 473 devm_watchdog_register_device()
+54
Documentation/iio/iio_dmabuf_api.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0 2 + 3 + =================================== 4 + High-speed DMABUF interface for IIO 5 + =================================== 6 + 7 + 1. Overview 8 + =========== 9 + 10 + The Industrial I/O subsystem supports access to buffers through a 11 + file-based interface, with read() and write() access calls through the 12 + IIO device's dev node. 13 + 14 + It additionally supports a DMABUF based interface, where the userspace 15 + can attach DMABUF objects (externally created) to an IIO buffer, and 16 + subsequently use them for data transfers. 17 + 18 + A userspace application can then use this interface to share DMABUF 19 + objects between several interfaces, allowing it to transfer data in a 20 + zero-copy fashion, for instance between IIO and the USB stack. 21 + 22 + The userspace application can also memory-map the DMABUF objects, and 23 + access the sample data directly. The advantage of doing this vs. the 24 + read() interface is that it avoids an extra copy of the data between the 25 + kernel and userspace. This is particularly useful for high-speed devices 26 + which produce several megabytes or even gigabytes of data per second. 27 + It does however increase the userspace-kernelspace synchronization 28 + overhead, as the DMA_BUF_SYNC_START and DMA_BUF_SYNC_END IOCTLs have to 29 + be used for data integrity. 30 + 31 + 2. User API 32 + =========== 33 + 34 + As part of this interface, three new IOCTLs have been added. These three 35 + IOCTLs have to be performed on the IIO buffer's file descriptor, which 36 + can be obtained using the IIO_BUFFER_GET_FD_IOCTL() ioctl. 37 + 38 + ``IIO_BUFFER_DMABUF_ATTACH_IOCTL(int fd)`` 39 + Attach the DMABUF object, identified by its file descriptor, to the 40 + IIO buffer. Returns zero on success, and a negative errno value on 41 + error. 42 + 43 + ``IIO_BUFFER_DMABUF_DETACH_IOCTL(int fd)`` 44 + Detach the given DMABUF object, identified by its file descriptor, 45 + from the IIO buffer. Returns zero on success, and a negative errno 46 + value on error. 47 + 48 + Note that closing the IIO buffer's file descriptor will 49 + automatically detach all previously attached DMABUF objects. 50 + 51 + ``IIO_BUFFER_DMABUF_ENQUEUE_IOCTL(struct iio_dmabuf *iio_dmabuf)`` 52 + Enqueue a previously attached DMABUF object to the buffer queue. 53 + Enqueued DMABUFs will be read from (if output buffer) or written to 54 + (if input buffer) as long as the buffer is enabled.
+1
Documentation/iio/index.rst
··· 9 9 10 10 iio_configfs 11 11 iio_devbuf 12 + iio_dmabuf_api 12 13 iio_tools 13 14 14 15 Industrial I/O Kernel Drivers
+16 -1
MAINTAINERS
··· 1217 1217 F: drivers/iio/adc/ad7091r* 1218 1218 1219 1219 ANALOG DEVICES INC AD7192 DRIVER 1220 - M: Alexandru Tachici <alexandru.tachici@analog.com> 1220 + M: Alisa-Dariana Roman <alisa.roman@analog.com> 1221 1221 L: linux-iio@vger.kernel.org 1222 1222 S: Supported 1223 1223 W: https://ez.analog.com/linux-software-drivers ··· 3530 3530 F: include/linux/cfag12864b.h 3531 3531 F: include/uapi/linux/map_to_14segment.h 3532 3532 F: include/uapi/linux/map_to_7segment.h 3533 + 3534 + AVAGO APDS9306 AMBIENT LIGHT SENSOR DRIVER 3535 + M: Subhajit Ghosh <subhajit.ghosh@tweaklogic.com> 3536 + L: linux-iio@vger.kernel.org 3537 + S: Maintained 3538 + F: Documentation/devicetree/bindings/iio/light/avago,apds9300.yaml 3539 + F: drivers/iio/light/apds9306.c 3533 3540 3534 3541 AVIA HX711 ANALOG DIGITAL CONVERTER IIO DRIVER 3535 3542 M: Andreas Klinger <ak@it-klinger.de> ··· 22403 22396 M: Robert Richter <rric@kernel.org> 22404 22397 S: Odd Fixes 22405 22398 F: drivers/gpio/gpio-thunderx.c 22399 + 22400 + TI ADS1119 ADC DRIVER 22401 + M: Francesco Dolcini <francesco@dolcini.it> 22402 + M: João Paulo Gonçalves <jpaulo.silvagoncalves@gmail.com> 22403 + L: linux-iio@vger.kernel.org 22404 + S: Maintained 22405 + F: Documentation/devicetree/bindings/iio/adc/ti,ads1119.yaml 22406 + F: drivers/iio/adc/ti-ads1119.c 22406 22407 22407 22408 TI ADS7924 ADC DRIVER 22408 22409 M: Hugo Villeneuve <hvilleneuve@dimonoff.com>
+40
drivers/dma/dma-axi-dmac.c
··· 620 620 return sg; 621 621 } 622 622 623 + static struct dma_async_tx_descriptor * 624 + axi_dmac_prep_peripheral_dma_vec(struct dma_chan *c, const struct dma_vec *vecs, 625 + size_t nb, enum dma_transfer_direction direction, 626 + unsigned long flags) 627 + { 628 + struct axi_dmac_chan *chan = to_axi_dmac_chan(c); 629 + struct axi_dmac_desc *desc; 630 + unsigned int num_sgs = 0; 631 + struct axi_dmac_sg *dsg; 632 + size_t i; 633 + 634 + if (direction != chan->direction) 635 + return NULL; 636 + 637 + for (i = 0; i < nb; i++) 638 + num_sgs += DIV_ROUND_UP(vecs[i].len, chan->max_length); 639 + 640 + desc = axi_dmac_alloc_desc(chan, num_sgs); 641 + if (!desc) 642 + return NULL; 643 + 644 + dsg = desc->sg; 645 + 646 + for (i = 0; i < nb; i++) { 647 + if (!axi_dmac_check_addr(chan, vecs[i].addr) || 648 + !axi_dmac_check_len(chan, vecs[i].len)) { 649 + kfree(desc); 650 + return NULL; 651 + } 652 + 653 + dsg = axi_dmac_fill_linear_sg(chan, direction, vecs[i].addr, 1, 654 + vecs[i].len, dsg); 655 + } 656 + 657 + desc->cyclic = false; 658 + 659 + return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags); 660 + } 661 + 623 662 static struct dma_async_tx_descriptor *axi_dmac_prep_slave_sg( 624 663 struct dma_chan *c, struct scatterlist *sgl, 625 664 unsigned int sg_len, enum dma_transfer_direction direction, ··· 1100 1061 dma_dev->device_tx_status = dma_cookie_status; 1101 1062 dma_dev->device_issue_pending = axi_dmac_issue_pending; 1102 1063 dma_dev->device_prep_slave_sg = axi_dmac_prep_slave_sg; 1064 + dma_dev->device_prep_peripheral_dma_vec = axi_dmac_prep_peripheral_dma_vec; 1103 1065 dma_dev->device_prep_dma_cyclic = axi_dmac_prep_dma_cyclic; 1104 1066 dma_dev->device_prep_interleaved_dma = axi_dmac_prep_interleaved; 1105 1067 dma_dev->device_terminate_all = axi_dmac_terminate_all;
+40 -5
drivers/hwmon/iio_hwmon.c
··· 33 33 struct attribute **attrs; 34 34 }; 35 35 36 + static ssize_t iio_hwmon_read_label(struct device *dev, 37 + struct device_attribute *attr, 38 + char *buf) 39 + { 40 + struct sensor_device_attribute *sattr = to_sensor_dev_attr(attr); 41 + struct iio_hwmon_state *state = dev_get_drvdata(dev); 42 + struct iio_channel *chan = &state->channels[sattr->index]; 43 + 44 + return iio_read_channel_label(chan, buf); 45 + } 46 + 36 47 /* 37 48 * Assumes that IIO and hwmon operate in the same base units. 38 49 * This is supposed to be true, but needs verification for ··· 79 68 struct device *dev = &pdev->dev; 80 69 struct iio_hwmon_state *st; 81 70 struct sensor_device_attribute *a; 82 - int ret, i; 71 + int ret, i, attr = 0; 83 72 int in_i = 1, temp_i = 1, curr_i = 1, humidity_i = 1, power_i = 1; 84 73 enum iio_chan_type type; 85 74 struct iio_channel *channels; 86 75 struct device *hwmon_dev; 87 76 char *sname; 77 + void *buf; 88 78 89 79 channels = devm_iio_channel_get_all(dev); 90 80 if (IS_ERR(channels)) { ··· 97 85 } 98 86 99 87 st = devm_kzalloc(dev, sizeof(*st), GFP_KERNEL); 100 - if (st == NULL) 88 + buf = (void *)devm_get_free_pages(dev, GFP_KERNEL, 0); 89 + if (!st || !buf) 101 90 return -ENOMEM; 102 91 103 92 st->channels = channels; 104 93 105 - /* count how many attributes we have */ 94 + /* count how many channels we have */ 106 95 while (st->channels[st->num_channels].indio_dev) 107 96 st->num_channels++; 108 97 109 98 st->attrs = devm_kcalloc(dev, 110 - st->num_channels + 1, sizeof(*st->attrs), 99 + 2 * st->num_channels + 1, sizeof(*st->attrs), 111 100 GFP_KERNEL); 112 101 if (st->attrs == NULL) 113 102 return -ENOMEM; ··· 160 147 a->dev_attr.show = iio_hwmon_read_val; 161 148 a->dev_attr.attr.mode = 0444; 162 149 a->index = i; 163 - st->attrs[i] = &a->dev_attr.attr; 150 + st->attrs[attr++] = &a->dev_attr.attr; 151 + 152 + /* Let's see if we have a label... */ 153 + if (iio_read_channel_label(&st->channels[i], buf) < 0) 154 + continue; 155 + 156 + a = devm_kzalloc(dev, sizeof(*a), GFP_KERNEL); 157 + if (a == NULL) 158 + return -ENOMEM; 159 + 160 + sysfs_attr_init(&a->dev_attr.attr); 161 + a->dev_attr.attr.name = devm_kasprintf(dev, GFP_KERNEL, 162 + "%s%d_label", 163 + prefix, n); 164 + if (!a->dev_attr.attr.name) 165 + return -ENOMEM; 166 + 167 + a->dev_attr.show = iio_hwmon_read_label; 168 + a->dev_attr.attr.mode = 0444; 169 + a->index = i; 170 + st->attrs[attr++] = &a->dev_attr.attr; 164 171 } 172 + 173 + devm_free_pages(dev, (unsigned long)buf); 165 174 166 175 st->attr_group.attrs = st->attrs; 167 176 st->groups[0] = &st->attr_group;
+1
drivers/iio/Kconfig
··· 14 14 15 15 config IIO_BUFFER 16 16 bool "Enable buffer support within IIO" 17 + select DMA_SHARED_BUFFER 17 18 help 18 19 Provide core support for various buffer based data 19 20 acquisition methods.
+8 -10
drivers/iio/accel/fxls8962af-core.c
··· 228 228 229 229 static int fxls8962af_standby(struct fxls8962af_data *data) 230 230 { 231 - return regmap_update_bits(data->regmap, FXLS8962AF_SENS_CONFIG1, 232 - FXLS8962AF_SENS_CONFIG1_ACTIVE, 0); 231 + return regmap_clear_bits(data->regmap, FXLS8962AF_SENS_CONFIG1, 232 + FXLS8962AF_SENS_CONFIG1_ACTIVE); 233 233 } 234 234 235 235 static int fxls8962af_active(struct fxls8962af_data *data) ··· 785 785 unsigned int reg; 786 786 int ret; 787 787 788 - ret = regmap_update_bits(data->regmap, FXLS8962AF_SENS_CONFIG1, 789 - FXLS8962AF_SENS_CONFIG1_RST, 790 - FXLS8962AF_SENS_CONFIG1_RST); 788 + ret = regmap_set_bits(data->regmap, FXLS8962AF_SENS_CONFIG1, 789 + FXLS8962AF_SENS_CONFIG1_RST); 791 790 if (ret) 792 791 return ret; 793 792 ··· 829 830 fxls8962af_standby(data); 830 831 831 832 /* Enable buffer interrupt */ 832 - ret = regmap_update_bits(data->regmap, FXLS8962AF_INT_EN, 833 - FXLS8962AF_INT_EN_BUF_EN, 834 - FXLS8962AF_INT_EN_BUF_EN); 833 + ret = regmap_set_bits(data->regmap, FXLS8962AF_INT_EN, 834 + FXLS8962AF_INT_EN_BUF_EN); 835 835 if (ret) 836 836 return ret; 837 837 ··· 849 851 fxls8962af_standby(data); 850 852 851 853 /* Disable buffer interrupt */ 852 - ret = regmap_update_bits(data->regmap, FXLS8962AF_INT_EN, 853 - FXLS8962AF_INT_EN_BUF_EN, 0); 854 + ret = regmap_clear_bits(data->regmap, FXLS8962AF_INT_EN, 855 + FXLS8962AF_INT_EN_BUF_EN); 854 856 if (ret) 855 857 return ret; 856 858
+1 -4
drivers/iio/accel/kxsd9.c
··· 370 370 * make sure we conserve power even if there are others users on the 371 371 * regulators. 372 372 */ 373 - ret = regmap_update_bits(st->map, 374 - KXSD9_REG_CTRL_B, 375 - KXSD9_CTRL_B_ENABLE, 376 - 0); 373 + ret = regmap_clear_bits(st->map, KXSD9_REG_CTRL_B, KXSD9_CTRL_B_ENABLE); 377 374 if (ret) 378 375 return ret; 379 376
+4 -4
drivers/iio/accel/msa311.c
··· 1034 1034 "failed to unmap map0/map1 interrupts\n"); 1035 1035 1036 1036 /* Disable all axes by default */ 1037 - err = regmap_update_bits(msa311->regs, MSA311_ODR_REG, 1038 - MSA311_GENMASK(F_X_AXIS_DIS) | 1039 - MSA311_GENMASK(F_Y_AXIS_DIS) | 1040 - MSA311_GENMASK(F_Z_AXIS_DIS), 0); 1037 + err = regmap_clear_bits(msa311->regs, MSA311_ODR_REG, 1038 + MSA311_GENMASK(F_X_AXIS_DIS) | 1039 + MSA311_GENMASK(F_Y_AXIS_DIS) | 1040 + MSA311_GENMASK(F_Z_AXIS_DIS)); 1041 1041 if (err) 1042 1042 return dev_err_probe(dev, err, "can't enable all axes\n"); 1043 1043
+1
drivers/iio/accel/st_accel.h
··· 35 35 #define LIS3DHH_ACCEL_DEV_NAME "lis3dhh" 36 36 #define LIS3DE_ACCEL_DEV_NAME "lis3de" 37 37 #define LIS2DE12_ACCEL_DEV_NAME "lis2de12" 38 + #define LIS2DS12_ACCEL_DEV_NAME "lis2ds12" 38 39 #define LIS2HH12_ACCEL_DEV_NAME "lis2hh12" 39 40 #define LIS302DL_ACCEL_DEV_NAME "lis302dl" 40 41 #define LSM303C_ACCEL_DEV_NAME "lsm303c_accel"
+81
drivers/iio/accel/st_accel_core.c
··· 926 926 .bootime = 2, 927 927 }, 928 928 { 929 + .wai = 0x43, 930 + .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 931 + .sensors_supported = { 932 + [0] = LIS2DS12_ACCEL_DEV_NAME, 933 + }, 934 + .ch = (struct iio_chan_spec *)st_accel_16bit_channels, 935 + .odr = { 936 + .addr = 0x20, 937 + .mask = 0xf0, 938 + .odr_avl = { 939 + { .hz = 10, .value = 0x01, }, 940 + { .hz = 50, .value = 0x02, }, 941 + { .hz = 100, .value = 0x03, }, 942 + { .hz = 200, .value = 0x04, }, 943 + { .hz = 400, .value = 0x05, }, 944 + { .hz = 800, .value = 0x06, }, 945 + }, 946 + }, 947 + .pw = { 948 + .addr = 0x20, 949 + .mask = 0xf0, 950 + .value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE, 951 + }, 952 + .enable_axis = { 953 + .addr = ST_SENSORS_DEFAULT_AXIS_ADDR, 954 + .mask = ST_SENSORS_DEFAULT_AXIS_MASK, 955 + }, 956 + .fs = { 957 + .addr = 0x20, 958 + .mask = 0x0c, 959 + .fs_avl = { 960 + [0] = { 961 + .num = ST_ACCEL_FS_AVL_2G, 962 + .value = 0x00, 963 + .gain = IIO_G_TO_M_S_2(61), 964 + }, 965 + [1] = { 966 + .num = ST_ACCEL_FS_AVL_4G, 967 + .value = 0x02, 968 + .gain = IIO_G_TO_M_S_2(122), 969 + }, 970 + [2] = { 971 + .num = ST_ACCEL_FS_AVL_8G, 972 + .value = 0x03, 973 + .gain = IIO_G_TO_M_S_2(244), 974 + }, 975 + [3] = { 976 + .num = ST_ACCEL_FS_AVL_16G, 977 + .value = 0x01, 978 + .gain = IIO_G_TO_M_S_2(488), 979 + }, 980 + }, 981 + }, 982 + .bdu = { 983 + .addr = 0x20, 984 + .mask = 0x01, 985 + }, 986 + .drdy_irq = { 987 + .int1 = { 988 + .addr = 0x23, 989 + .mask = 0x01, 990 + }, 991 + .int2 = { 992 + .addr = 0x24, 993 + .mask = 0x01, 994 + }, 995 + .addr_ihl = 0x22, 996 + .mask_ihl = 0x02, 997 + .stat_drdy = { 998 + .addr = ST_SENSORS_DEFAULT_STAT_ADDR, 999 + .mask = 0x01, 1000 + }, 1001 + }, 1002 + .sim = { 1003 + .addr = 0x21, 1004 + .value = BIT(0), 1005 + }, 1006 + .multi_read_bit = true, 1007 + .bootime = 2, 1008 + }, 1009 + { 929 1010 .wai = 0x41, 930 1011 .wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS, 931 1012 .sensors_supported = {
+5
drivers/iio/accel/st_accel_i2c.c
··· 103 103 .data = LIS2DE12_ACCEL_DEV_NAME, 104 104 }, 105 105 { 106 + .compatible = "st,lis2ds12", 107 + .data = LIS2DS12_ACCEL_DEV_NAME, 108 + }, 109 + { 106 110 .compatible = "st,lis2hh12", 107 111 .data = LIS2HH12_ACCEL_DEV_NAME, 108 112 }, ··· 158 154 { LIS2DW12_ACCEL_DEV_NAME }, 159 155 { LIS3DE_ACCEL_DEV_NAME }, 160 156 { LIS2DE12_ACCEL_DEV_NAME }, 157 + { LIS2DS12_ACCEL_DEV_NAME }, 161 158 { LIS2HH12_ACCEL_DEV_NAME }, 162 159 { LIS302DL_ACCEL_DEV_NAME }, 163 160 { LSM303C_ACCEL_DEV_NAME },
+5
drivers/iio/accel/st_accel_spi.c
··· 65 65 .data = LIS2DH12_ACCEL_DEV_NAME, 66 66 }, 67 67 { 68 + .compatible = "st,lis2ds12", 69 + .data = LIS2DS12_ACCEL_DEV_NAME, 70 + }, 71 + { 68 72 .compatible = "st,lis3l02dq", 69 73 .data = LIS3L02DQ_ACCEL_DEV_NAME, 70 74 }, ··· 155 151 { LSM330_ACCEL_DEV_NAME }, 156 152 { LSM303AGR_ACCEL_DEV_NAME }, 157 153 { LIS2DH12_ACCEL_DEV_NAME }, 154 + { LIS2DS12_ACCEL_DEV_NAME }, 158 155 { LIS3L02DQ_ACCEL_DEV_NAME }, 159 156 { LNG2DM_ACCEL_DEV_NAME }, 160 157 { H3LIS331DL_ACCEL_DEV_NAME },
+24
drivers/iio/adc/Kconfig
··· 892 892 This driver can also be built as a module. If so, the module will be 893 893 called mcp3911. 894 894 895 + config MEDIATEK_MT6359_AUXADC 896 + tristate "MediaTek MT6359 PMIC AUXADC driver" 897 + depends on MFD_MT6397 898 + help 899 + Say yes here to enable support for MediaTek MT6357, MT6358 and 900 + MT6359 PMICs Auxiliary ADC. 901 + This driver provides multiple channels for system monitoring, 902 + such as battery voltage, PMIC temperature, and others. 903 + 904 + This driver can also be built as a module. If so, the module will be 905 + called mt6359-auxadc. 906 + 895 907 config MEDIATEK_MT6360_ADC 896 908 tristate "Mediatek MT6360 ADC driver" 897 909 depends on MFD_MT6360 ··· 1362 1350 1363 1351 This driver can also be built as a module. If so, the module will be 1364 1352 called ti-ads1015. 1353 + 1354 + config TI_ADS1119 1355 + tristate "Texas Instruments ADS1119 ADC" 1356 + depends on I2C 1357 + select IIO_BUFFER 1358 + select IIO_TRIGGERED_BUFFER 1359 + help 1360 + If you say yes here you get support for Texas Instruments ADS1119 1361 + ADC chip. 1362 + 1363 + This driver can also be built as a module. If so, the module will be 1364 + called ti-ads1119. 1365 1365 1366 1366 config TI_ADS7924 1367 1367 tristate "Texas Instruments ADS7924 ADC"
+2
drivers/iio/adc/Makefile
··· 80 80 obj-$(CONFIG_MCP3422) += mcp3422.o 81 81 obj-$(CONFIG_MCP3564) += mcp3564.o 82 82 obj-$(CONFIG_MCP3911) += mcp3911.o 83 + obj-$(CONFIG_MEDIATEK_MT6359_AUXADC) += mt6359-auxadc.o 83 84 obj-$(CONFIG_MEDIATEK_MT6360_ADC) += mt6360-adc.o 84 85 obj-$(CONFIG_MEDIATEK_MT6370_ADC) += mt6370-adc.o 85 86 obj-$(CONFIG_MEDIATEK_MT6577_AUXADC) += mt6577_auxadc.o ··· 122 121 obj-$(CONFIG_TI_ADC161S626) += ti-adc161s626.o 123 122 obj-$(CONFIG_TI_ADS1015) += ti-ads1015.o 124 123 obj-$(CONFIG_TI_ADS1100) += ti-ads1100.o 124 + obj-$(CONFIG_TI_ADS1119) += ti-ads1119.o 125 125 obj-$(CONFIG_TI_ADS124S08) += ti-ads124s08.o 126 126 obj-$(CONFIG_TI_ADS1298) += ti-ads1298.o 127 127 obj-$(CONFIG_TI_ADS131E08) += ti-ads131e08.o
+2 -2
drivers/iio/adc/ad4130.c
··· 1883 1883 if (ret) 1884 1884 return ret; 1885 1885 1886 - ret = regmap_update_bits(st->regmap, AD4130_FIFO_CONTROL_REG, 1887 - AD4130_FIFO_CONTROL_HEADER_MASK, 0); 1886 + ret = regmap_clear_bits(st->regmap, AD4130_FIFO_CONTROL_REG, 1887 + AD4130_FIFO_CONTROL_HEADER_MASK); 1888 1888 if (ret) 1889 1889 return ret; 1890 1890
+8 -6
drivers/iio/adc/ad7124.c
··· 555 555 return 0; 556 556 } 557 557 558 + static int ad7124_disable_one(struct ad_sigma_delta *sd, unsigned int chan) 559 + { 560 + struct ad7124_state *st = container_of(sd, struct ad7124_state, sd); 561 + 562 + return ad7124_spi_write_mask(st, AD7124_CHANNEL(chan), AD7124_CHANNEL_EN_MSK, 0, 2); 563 + } 564 + 558 565 static const struct ad_sigma_delta_info ad7124_sigma_delta_info = { 559 566 .set_channel = ad7124_set_channel, 560 567 .append_status = ad7124_append_status, 561 568 .disable_all = ad7124_disable_all, 569 + .disable_one = ad7124_disable_one, 562 570 .set_mode = ad7124_set_mode, 563 571 .has_registers = true, 564 572 .addr_shift = 0, ··· 587 579 switch (info) { 588 580 case IIO_CHAN_INFO_RAW: 589 581 ret = ad_sigma_delta_single_conversion(indio_dev, chan, val); 590 - if (ret < 0) 591 - return ret; 592 - 593 - /* After the conversion is performed, disable the channel */ 594 - ret = ad_sd_write_reg(&st->sd, AD7124_CHANNEL(chan->address), 2, 595 - st->channels[chan->address].ain | AD7124_CHANNEL_EN(0)); 596 582 if (ret < 0) 597 583 return ret; 598 584
+490 -186
drivers/iio/adc/ad7173.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0+ 2 2 /* 3 - * AD717x family SPI ADC driver 3 + * AD717x and AD411x family SPI ADC driver 4 4 * 5 5 * Supported devices: 6 + * AD4111/AD4112/AD4114/AD4115/AD4116 6 7 * AD7172-2/AD7172-4/AD7173-8/AD7175-2 7 8 * AD7175-8/AD7176-2/AD7177-2 8 9 * ··· 61 60 #define AD7173_CH_SETUP_AINPOS_MASK GENMASK(9, 5) 62 61 #define AD7173_CH_SETUP_AINNEG_MASK GENMASK(4, 0) 63 62 63 + #define AD7173_NO_AINS_PER_CHANNEL 2 64 64 #define AD7173_CH_ADDRESS(pos, neg) \ 65 65 (FIELD_PREP(AD7173_CH_SETUP_AINPOS_MASK, pos) | \ 66 66 FIELD_PREP(AD7173_CH_SETUP_AINNEG_MASK, neg)) 67 67 #define AD7173_AIN_TEMP_POS 17 68 68 #define AD7173_AIN_TEMP_NEG 18 69 + #define AD7173_AIN_POW_MON_POS 19 70 + #define AD7173_AIN_POW_MON_NEG 20 71 + #define AD7173_AIN_REF_POS 21 72 + #define AD7173_AIN_REF_NEG 22 73 + 74 + #define AD7173_IS_REF_INPUT(x) ((x) == AD7173_AIN_REF_POS || \ 75 + (x) == AD7173_AIN_REF_NEG) 69 76 70 77 #define AD7172_2_ID 0x00d0 71 78 #define AD7175_ID 0x0cd0 ··· 81 72 #define AD7175_2_ID 0x0cd0 82 73 #define AD7172_4_ID 0x2050 83 74 #define AD7173_ID 0x30d0 75 + #define AD4111_ID AD7173_ID 76 + #define AD4112_ID AD7173_ID 77 + #define AD4114_ID AD7173_ID 78 + #define AD4116_ID 0x34d0 79 + #define AD4115_ID 0x38d0 84 80 #define AD7175_8_ID 0x3cd0 85 81 #define AD7177_ID 0x4fd0 86 82 #define AD7173_ID_MASK GENMASK(15, 4) ··· 116 102 117 103 #define AD7173_GPO12_DATA(x) BIT((x) + 0) 118 104 #define AD7173_GPO23_DATA(x) BIT((x) + 4) 105 + #define AD4111_GPO01_DATA(x) BIT((x) + 6) 119 106 #define AD7173_GPO_DATA(x) ((x) < 2 ? AD7173_GPO12_DATA(x) : AD7173_GPO23_DATA(x)) 120 107 121 108 #define AD7173_INTERFACE_DATA_STAT BIT(6) ··· 135 120 #define AD7173_VOLTAGE_INT_REF_uV 2500000 136 121 #define AD7173_TEMP_SENSIIVITY_uV_per_C 477 137 122 #define AD7177_ODR_START_VALUE 0x07 123 + #define AD4111_SHUNT_RESISTOR_OHM 50 124 + #define AD4111_DIVIDER_RATIO 10 125 + #define AD4111_CURRENT_CHAN_CUTOFF 16 126 + #define AD4111_VINCOM_INPUT 0x10 127 + 128 + /* pin < num_voltage_in is a normal voltage input */ 129 + /* pin >= num_voltage_in_div is a voltage input without a divider */ 130 + #define AD4111_IS_VINCOM_MISMATCH(pin1, pin2) ((pin1) == AD4111_VINCOM_INPUT && \ 131 + (pin2) < st->info->num_voltage_in && \ 132 + (pin2) >= st->info->num_voltage_in_div) 138 133 139 134 #define AD7173_FILTER_ODR0_MASK GENMASK(5, 0) 140 135 #define AD7173_MAX_CONFIGS 8 141 - 142 - enum ad7173_ids { 143 - ID_AD7172_2, 144 - ID_AD7172_4, 145 - ID_AD7173_8, 146 - ID_AD7175_2, 147 - ID_AD7175_8, 148 - ID_AD7176_2, 149 - ID_AD7177_2, 150 - }; 151 136 152 137 struct ad7173_device_info { 153 138 const unsigned int *sinc5_data_rates; 154 139 unsigned int num_sinc5_data_rates; 155 140 unsigned int odr_start_value; 141 + /* 142 + * AD4116 has both inputs with a voltage divider and without. 143 + * These inputs cannot be mixed in the channel configuration. 144 + * Does not include the VINCOM input. 145 + */ 146 + unsigned int num_voltage_in_div; 156 147 unsigned int num_channels; 157 148 unsigned int num_configs; 158 - unsigned int num_inputs; 149 + unsigned int num_voltage_in; 159 150 unsigned int clock; 160 151 unsigned int id; 161 152 char *name; 153 + bool has_current_inputs; 154 + bool has_vincom_input; 162 155 bool has_temp; 156 + /* ((AVDD1 − AVSS)/5) */ 157 + bool has_pow_supply_monitoring; 163 158 bool has_input_buf; 164 159 bool has_int_ref; 165 160 bool has_ref2; 161 + bool higher_gpio_bits; 166 162 u8 num_gpios; 167 163 }; 168 164 ··· 215 189 #endif 216 190 }; 217 191 192 + static unsigned int ad4115_sinc5_data_rates[] = { 193 + 24845000, 24845000, 20725000, 20725000, /* 0-3 */ 194 + 15564000, 13841000, 10390000, 10390000, /* 4-7 */ 195 + 4994000, 2499000, 1000000, 500000, /* 8-11 */ 196 + 395500, 200000, 100000, 59890, /* 12-15 */ 197 + 49920, 20000, 16660, 10000, /* 16-19 */ 198 + 5000, 2500, 2500, /* 20-22 */ 199 + }; 200 + 201 + static unsigned int ad4116_sinc5_data_rates[] = { 202 + 12422360, 12422360, 12422360, 12422360, /* 0-3 */ 203 + 10362690, 10362690, 7782100, 6290530, /* 4-7 */ 204 + 5194800, 2496900, 1007600, 499900, /* 8-11 */ 205 + 390600, 200300, 100000, 59750, /* 12-15 */ 206 + 49840, 20000, 16650, 10000, /* 16-19 */ 207 + 5000, 2500, 1250, /* 20-22 */ 208 + }; 209 + 218 210 static const unsigned int ad7173_sinc5_data_rates[] = { 219 211 6211000, 6211000, 6211000, 6211000, 6211000, 6211000, 5181000, 4444000, /* 0-7 */ 220 212 3115000, 2597000, 1007000, 503800, 381000, 200300, 100500, 59520, /* 8-15 */ ··· 248 204 5000, /* 20 */ 249 205 }; 250 206 251 - static const struct ad7173_device_info ad7173_device_info[] = { 252 - [ID_AD7172_2] = { 253 - .name = "ad7172-2", 254 - .id = AD7172_2_ID, 255 - .num_inputs = 5, 256 - .num_channels = 4, 257 - .num_configs = 4, 258 - .num_gpios = 2, 259 - .has_temp = true, 260 - .has_input_buf = true, 261 - .has_int_ref = true, 262 - .clock = 2 * HZ_PER_MHZ, 263 - .sinc5_data_rates = ad7173_sinc5_data_rates, 264 - .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 265 - }, 266 - [ID_AD7172_4] = { 267 - .name = "ad7172-4", 268 - .id = AD7172_4_ID, 269 - .num_inputs = 9, 270 - .num_channels = 8, 271 - .num_configs = 8, 272 - .num_gpios = 4, 273 - .has_temp = false, 274 - .has_input_buf = true, 275 - .has_ref2 = true, 276 - .clock = 2 * HZ_PER_MHZ, 277 - .sinc5_data_rates = ad7173_sinc5_data_rates, 278 - .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 279 - }, 280 - [ID_AD7173_8] = { 281 - .name = "ad7173-8", 282 - .id = AD7173_ID, 283 - .num_inputs = 17, 284 - .num_channels = 16, 285 - .num_configs = 8, 286 - .num_gpios = 4, 287 - .has_temp = true, 288 - .has_input_buf = true, 289 - .has_int_ref = true, 290 - .has_ref2 = true, 291 - .clock = 2 * HZ_PER_MHZ, 292 - .sinc5_data_rates = ad7173_sinc5_data_rates, 293 - .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 294 - }, 295 - [ID_AD7175_2] = { 296 - .name = "ad7175-2", 297 - .id = AD7175_2_ID, 298 - .num_inputs = 5, 299 - .num_channels = 4, 300 - .num_configs = 4, 301 - .num_gpios = 2, 302 - .has_temp = true, 303 - .has_input_buf = true, 304 - .has_int_ref = true, 305 - .clock = 16 * HZ_PER_MHZ, 306 - .sinc5_data_rates = ad7175_sinc5_data_rates, 307 - .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 308 - }, 309 - [ID_AD7175_8] = { 310 - .name = "ad7175-8", 311 - .id = AD7175_8_ID, 312 - .num_inputs = 17, 313 - .num_channels = 16, 314 - .num_configs = 8, 315 - .num_gpios = 4, 316 - .has_temp = true, 317 - .has_input_buf = true, 318 - .has_int_ref = true, 319 - .has_ref2 = true, 320 - .clock = 16 * HZ_PER_MHZ, 321 - .sinc5_data_rates = ad7175_sinc5_data_rates, 322 - .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 323 - }, 324 - [ID_AD7176_2] = { 325 - .name = "ad7176-2", 326 - .id = AD7176_ID, 327 - .num_inputs = 5, 328 - .num_channels = 4, 329 - .num_configs = 4, 330 - .num_gpios = 2, 331 - .has_temp = false, 332 - .has_input_buf = false, 333 - .has_int_ref = true, 334 - .clock = 16 * HZ_PER_MHZ, 335 - .sinc5_data_rates = ad7175_sinc5_data_rates, 336 - .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 337 - }, 338 - [ID_AD7177_2] = { 339 - .name = "ad7177-2", 340 - .id = AD7177_ID, 341 - .num_inputs = 5, 342 - .num_channels = 4, 343 - .num_configs = 4, 344 - .num_gpios = 2, 345 - .has_temp = true, 346 - .has_input_buf = true, 347 - .has_int_ref = true, 348 - .clock = 16 * HZ_PER_MHZ, 349 - .odr_start_value = AD7177_ODR_START_VALUE, 350 - .sinc5_data_rates = ad7175_sinc5_data_rates, 351 - .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 352 - }, 207 + static unsigned int ad4111_current_channel_config[] = { 208 + /* Ain sel: pos neg */ 209 + 0x1E8, /* 15:IIN0+ 8:IIN0− */ 210 + 0x1C9, /* 14:IIN1+ 9:IIN1− */ 211 + 0x1AA, /* 13:IIN2+ 10:IIN2− */ 212 + 0x18B, /* 12:IIN3+ 11:IIN3− */ 213 + }; 214 + 215 + static const struct ad7173_device_info ad4111_device_info = { 216 + .name = "ad4111", 217 + .id = AD4111_ID, 218 + .num_voltage_in_div = 8, 219 + .num_channels = 16, 220 + .num_configs = 8, 221 + .num_voltage_in = 8, 222 + .num_gpios = 2, 223 + .higher_gpio_bits = true, 224 + .has_temp = true, 225 + .has_vincom_input = true, 226 + .has_input_buf = true, 227 + .has_current_inputs = true, 228 + .has_int_ref = true, 229 + .clock = 2 * HZ_PER_MHZ, 230 + .sinc5_data_rates = ad7173_sinc5_data_rates, 231 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 232 + }; 233 + 234 + static const struct ad7173_device_info ad4112_device_info = { 235 + .name = "ad4112", 236 + .id = AD4112_ID, 237 + .num_voltage_in_div = 8, 238 + .num_channels = 16, 239 + .num_configs = 8, 240 + .num_voltage_in = 8, 241 + .num_gpios = 2, 242 + .higher_gpio_bits = true, 243 + .has_vincom_input = true, 244 + .has_temp = true, 245 + .has_input_buf = true, 246 + .has_current_inputs = true, 247 + .has_int_ref = true, 248 + .clock = 2 * HZ_PER_MHZ, 249 + .sinc5_data_rates = ad7173_sinc5_data_rates, 250 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 251 + }; 252 + 253 + static const struct ad7173_device_info ad4114_device_info = { 254 + .name = "ad4114", 255 + .id = AD4114_ID, 256 + .num_voltage_in_div = 16, 257 + .num_channels = 16, 258 + .num_configs = 8, 259 + .num_voltage_in = 16, 260 + .num_gpios = 4, 261 + .higher_gpio_bits = true, 262 + .has_vincom_input = true, 263 + .has_temp = true, 264 + .has_input_buf = true, 265 + .has_int_ref = true, 266 + .clock = 2 * HZ_PER_MHZ, 267 + .sinc5_data_rates = ad7173_sinc5_data_rates, 268 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 269 + }; 270 + 271 + static const struct ad7173_device_info ad4115_device_info = { 272 + .name = "ad4115", 273 + .id = AD4115_ID, 274 + .num_voltage_in_div = 16, 275 + .num_channels = 16, 276 + .num_configs = 8, 277 + .num_voltage_in = 16, 278 + .num_gpios = 4, 279 + .higher_gpio_bits = true, 280 + .has_vincom_input = true, 281 + .has_temp = true, 282 + .has_input_buf = true, 283 + .has_int_ref = true, 284 + .clock = 8 * HZ_PER_MHZ, 285 + .sinc5_data_rates = ad4115_sinc5_data_rates, 286 + .num_sinc5_data_rates = ARRAY_SIZE(ad4115_sinc5_data_rates), 287 + }; 288 + 289 + static const struct ad7173_device_info ad4116_device_info = { 290 + .name = "ad4116", 291 + .id = AD4116_ID, 292 + .num_voltage_in_div = 11, 293 + .num_channels = 16, 294 + .num_configs = 8, 295 + .num_voltage_in = 16, 296 + .num_gpios = 4, 297 + .higher_gpio_bits = true, 298 + .has_vincom_input = true, 299 + .has_temp = true, 300 + .has_input_buf = true, 301 + .has_int_ref = true, 302 + .clock = 4 * HZ_PER_MHZ, 303 + .sinc5_data_rates = ad4116_sinc5_data_rates, 304 + .num_sinc5_data_rates = ARRAY_SIZE(ad4116_sinc5_data_rates), 305 + }; 306 + 307 + static const struct ad7173_device_info ad7172_2_device_info = { 308 + .name = "ad7172-2", 309 + .id = AD7172_2_ID, 310 + .num_voltage_in = 5, 311 + .num_channels = 4, 312 + .num_configs = 4, 313 + .num_gpios = 2, 314 + .has_temp = true, 315 + .has_input_buf = true, 316 + .has_int_ref = true, 317 + .has_pow_supply_monitoring = true, 318 + .clock = 2 * HZ_PER_MHZ, 319 + .sinc5_data_rates = ad7173_sinc5_data_rates, 320 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 321 + }; 322 + 323 + static const struct ad7173_device_info ad7172_4_device_info = { 324 + .name = "ad7172-4", 325 + .id = AD7172_4_ID, 326 + .num_voltage_in = 9, 327 + .num_channels = 8, 328 + .num_configs = 8, 329 + .num_gpios = 4, 330 + .has_input_buf = true, 331 + .has_ref2 = true, 332 + .has_pow_supply_monitoring = true, 333 + .clock = 2 * HZ_PER_MHZ, 334 + .sinc5_data_rates = ad7173_sinc5_data_rates, 335 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 336 + }; 337 + 338 + static const struct ad7173_device_info ad7173_8_device_info = { 339 + .name = "ad7173-8", 340 + .id = AD7173_ID, 341 + .num_voltage_in = 17, 342 + .num_channels = 16, 343 + .num_configs = 8, 344 + .num_gpios = 4, 345 + .has_temp = true, 346 + .has_input_buf = true, 347 + .has_int_ref = true, 348 + .has_ref2 = true, 349 + .clock = 2 * HZ_PER_MHZ, 350 + .sinc5_data_rates = ad7173_sinc5_data_rates, 351 + .num_sinc5_data_rates = ARRAY_SIZE(ad7173_sinc5_data_rates), 352 + }; 353 + 354 + static const struct ad7173_device_info ad7175_2_device_info = { 355 + .name = "ad7175-2", 356 + .id = AD7175_2_ID, 357 + .num_voltage_in = 5, 358 + .num_channels = 4, 359 + .num_configs = 4, 360 + .num_gpios = 2, 361 + .has_temp = true, 362 + .has_input_buf = true, 363 + .has_int_ref = true, 364 + .has_pow_supply_monitoring = true, 365 + .clock = 16 * HZ_PER_MHZ, 366 + .sinc5_data_rates = ad7175_sinc5_data_rates, 367 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 368 + }; 369 + 370 + static const struct ad7173_device_info ad7175_8_device_info = { 371 + .name = "ad7175-8", 372 + .id = AD7175_8_ID, 373 + .num_voltage_in = 17, 374 + .num_channels = 16, 375 + .num_configs = 8, 376 + .num_gpios = 4, 377 + .has_temp = true, 378 + .has_input_buf = true, 379 + .has_int_ref = true, 380 + .has_ref2 = true, 381 + .has_pow_supply_monitoring = true, 382 + .clock = 16 * HZ_PER_MHZ, 383 + .sinc5_data_rates = ad7175_sinc5_data_rates, 384 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 385 + }; 386 + 387 + static const struct ad7173_device_info ad7176_2_device_info = { 388 + .name = "ad7176-2", 389 + .id = AD7176_ID, 390 + .num_voltage_in = 5, 391 + .num_channels = 4, 392 + .num_configs = 4, 393 + .num_gpios = 2, 394 + .has_int_ref = true, 395 + .clock = 16 * HZ_PER_MHZ, 396 + .sinc5_data_rates = ad7175_sinc5_data_rates, 397 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 398 + }; 399 + 400 + static const struct ad7173_device_info ad7177_2_device_info = { 401 + .name = "ad7177-2", 402 + .id = AD7177_ID, 403 + .num_voltage_in = 5, 404 + .num_channels = 4, 405 + .num_configs = 4, 406 + .num_gpios = 2, 407 + .has_temp = true, 408 + .has_input_buf = true, 409 + .has_int_ref = true, 410 + .has_pow_supply_monitoring = true, 411 + .clock = 16 * HZ_PER_MHZ, 412 + .odr_start_value = AD7177_ODR_START_VALUE, 413 + .sinc5_data_rates = ad7175_sinc5_data_rates, 414 + .num_sinc5_data_rates = ARRAY_SIZE(ad7175_sinc5_data_rates), 353 415 }; 354 416 355 417 static const char *const ad7173_ref_sel_str[] = { ··· 497 347 return 0; 498 348 } 499 349 350 + static int ad4111_mask_xlate(struct gpio_regmap *gpio, unsigned int base, 351 + unsigned int offset, unsigned int *reg, 352 + unsigned int *mask) 353 + { 354 + *mask = AD4111_GPO01_DATA(offset); 355 + *reg = base; 356 + return 0; 357 + } 358 + 500 359 static void ad7173_gpio_disable(void *data) 501 360 { 502 361 struct ad7173_state *st = data; ··· 538 379 gpio_regmap.regmap = st->reg_gpiocon_regmap; 539 380 gpio_regmap.ngpio = st->info->num_gpios; 540 381 gpio_regmap.reg_set_base = AD7173_REG_GPIO; 541 - gpio_regmap.reg_mask_xlate = ad7173_mask_xlate; 382 + if (st->info->higher_gpio_bits) 383 + gpio_regmap.reg_mask_xlate = ad4111_mask_xlate; 384 + else 385 + gpio_regmap.reg_mask_xlate = ad7173_mask_xlate; 542 386 543 387 st->gpio_regmap = devm_gpio_regmap_register(dev, &gpio_regmap); 544 388 ret = PTR_ERR_OR_ZERO(st->gpio_regmap); ··· 731 569 return 0; 732 570 } 733 571 572 + static int ad7173_disable_one(struct ad_sigma_delta *sd, unsigned int chan) 573 + { 574 + return ad_sd_write_reg(sd, AD7173_REG_CH(chan), 2, 0); 575 + } 576 + 734 577 static struct ad_sigma_delta_info ad7173_sigma_delta_info = { 735 578 .set_channel = ad7173_set_channel, 736 579 .append_status = ad7173_append_status, 737 580 .disable_all = ad7173_disable_all, 581 + .disable_one = ad7173_disable_one, 738 582 .set_mode = ad7173_set_mode, 739 583 .has_registers = true, 740 584 .addr_shift = 0, ··· 836 668 if (ret < 0) 837 669 return ret; 838 670 839 - /* disable channel after single conversion */ 840 - ret = ad_sd_write_reg(&st->sd, AD7173_REG_CH(chan->address), 2, 0); 841 - if (ret < 0) 842 - return ret; 843 - 844 671 return IIO_VAL_INT; 845 672 case IIO_CHAN_INFO_SCALE: 846 - if (chan->type == IIO_TEMP) { 673 + 674 + switch (chan->type) { 675 + case IIO_TEMP: 847 676 temp = AD7173_VOLTAGE_INT_REF_uV * MILLI; 848 677 temp /= AD7173_TEMP_SENSIIVITY_uV_per_C; 849 678 *val = temp; 850 679 *val2 = chan->scan_type.realbits; 851 - } else { 680 + return IIO_VAL_FRACTIONAL_LOG2; 681 + case IIO_VOLTAGE: 852 682 *val = ad7173_get_ref_voltage_milli(st, ch->cfg.ref_sel); 853 683 *val2 = chan->scan_type.realbits - !!(ch->cfg.bipolar); 684 + 685 + if (chan->channel < st->info->num_voltage_in_div) 686 + *val *= AD4111_DIVIDER_RATIO; 687 + return IIO_VAL_FRACTIONAL_LOG2; 688 + case IIO_CURRENT: 689 + *val = ad7173_get_ref_voltage_milli(st, ch->cfg.ref_sel); 690 + *val /= AD4111_SHUNT_RESISTOR_OHM; 691 + *val2 = chan->scan_type.realbits - ch->cfg.bipolar; 692 + return IIO_VAL_FRACTIONAL_LOG2; 693 + default: 694 + return -EINVAL; 854 695 } 855 - return IIO_VAL_FRACTIONAL_LOG2; 856 696 case IIO_CHAN_INFO_OFFSET: 857 - if (chan->type == IIO_TEMP) { 697 + 698 + switch (chan->type) { 699 + case IIO_TEMP: 858 700 /* 0 Kelvin -> raw sample */ 859 701 temp = -ABSOLUTE_ZERO_MILLICELSIUS; 860 702 temp *= AD7173_TEMP_SENSIIVITY_uV_per_C; ··· 873 695 AD7173_VOLTAGE_INT_REF_uV * 874 696 MILLI); 875 697 *val = -temp; 876 - } else { 698 + return IIO_VAL_INT; 699 + case IIO_VOLTAGE: 700 + case IIO_CURRENT: 877 701 *val = -BIT(chan->scan_type.realbits - 1); 702 + return IIO_VAL_INT; 703 + default: 704 + return -EINVAL; 878 705 } 879 - return IIO_VAL_INT; 880 706 case IIO_CHAN_INFO_SAMP_FREQ: 881 707 reg = st->channels[chan->address].cfg.odr; 882 708 ··· 907 725 return ret; 908 726 909 727 switch (info) { 728 + /* 729 + * This attribute sets the sampling frequency for each channel individually. 730 + * There are no issues for raw or buffered reads of an individual channel. 731 + * 732 + * When multiple channels are enabled in buffered mode, the effective 733 + * sampling rate of a channel is lowered in correlation to the number 734 + * of channels enabled and the sampling rate of the other channels. 735 + * 736 + * Example: 3 channels enabled with rates CH1:6211sps CH2,CH3:10sps 737 + * While the reading of CH1 takes only 0.16ms, the reading of CH2 and CH3 738 + * will take 100ms each. 739 + * 740 + * This will cause the reading of CH1 to be actually done once every 741 + * 200.16ms, an effective rate of 4.99sps. 742 + */ 910 743 case IIO_CHAN_INFO_SAMP_FREQ: 911 744 freq = val * MILLI + val2 / MILLI; 912 745 for (i = st->info->odr_start_value; i < st->info->num_sinc5_data_rates - 1; i++) ··· 1101 904 &st->int_clk_hw); 1102 905 } 1103 906 907 + static int ad4111_validate_current_ain(struct ad7173_state *st, 908 + const unsigned int ain[AD7173_NO_AINS_PER_CHANNEL]) 909 + { 910 + struct device *dev = &st->sd.spi->dev; 911 + 912 + if (!st->info->has_current_inputs) 913 + return dev_err_probe(dev, -EINVAL, 914 + "Model %s does not support current channels\n", 915 + st->info->name); 916 + 917 + if (ain[0] >= ARRAY_SIZE(ad4111_current_channel_config)) 918 + return dev_err_probe(dev, -EINVAL, 919 + "For current channels single-channel must be <[0-3]>\n"); 920 + 921 + return 0; 922 + } 923 + 924 + static int ad7173_validate_voltage_ain_inputs(struct ad7173_state *st, 925 + unsigned int ain0, unsigned int ain1) 926 + { 927 + struct device *dev = &st->sd.spi->dev; 928 + bool special_input0, special_input1; 929 + 930 + /* (AVDD1-AVSS)/5 power supply monitoring */ 931 + if (ain0 == AD7173_AIN_POW_MON_POS && ain1 == AD7173_AIN_POW_MON_NEG && 932 + st->info->has_pow_supply_monitoring) 933 + return 0; 934 + 935 + special_input0 = AD7173_IS_REF_INPUT(ain0) || 936 + (ain0 == AD4111_VINCOM_INPUT && st->info->has_vincom_input); 937 + special_input1 = AD7173_IS_REF_INPUT(ain1) || 938 + (ain1 == AD4111_VINCOM_INPUT && st->info->has_vincom_input); 939 + 940 + if ((ain0 >= st->info->num_voltage_in && !special_input0) || 941 + (ain1 >= st->info->num_voltage_in && !special_input1)) { 942 + if (ain0 == AD4111_VINCOM_INPUT || ain1 == AD4111_VINCOM_INPUT) 943 + return dev_err_probe(dev, -EINVAL, 944 + "VINCOM not supported for %s\n", st->info->name); 945 + 946 + return dev_err_probe(dev, -EINVAL, 947 + "Input pin number out of range for pair (%d %d).\n", 948 + ain0, ain1); 949 + } 950 + 951 + if (AD4111_IS_VINCOM_MISMATCH(ain0, ain1) || 952 + AD4111_IS_VINCOM_MISMATCH(ain1, ain0)) 953 + return dev_err_probe(dev, -EINVAL, 954 + "VINCOM must be paired with inputs having divider.\n"); 955 + 956 + if (!special_input0 && !special_input1 && 957 + ((ain0 >= st->info->num_voltage_in_div) != 958 + (ain1 >= st->info->num_voltage_in_div))) 959 + return dev_err_probe(dev, -EINVAL, 960 + "Both inputs must either have a voltage divider or not have: (%d %d).\n", 961 + ain0, ain1); 962 + 963 + return 0; 964 + } 965 + 966 + static int ad7173_validate_reference(struct ad7173_state *st, int ref_sel) 967 + { 968 + struct device *dev = &st->sd.spi->dev; 969 + int ret; 970 + 971 + if (ref_sel == AD7173_SETUP_REF_SEL_INT_REF && !st->info->has_int_ref) 972 + return dev_err_probe(dev, -EINVAL, 973 + "Internal reference is not available on current model.\n"); 974 + 975 + if (ref_sel == AD7173_SETUP_REF_SEL_EXT_REF2 && !st->info->has_ref2) 976 + return dev_err_probe(dev, -EINVAL, 977 + "External reference 2 is not available on current model.\n"); 978 + 979 + ret = ad7173_get_ref_voltage_milli(st, ref_sel); 980 + if (ret < 0) 981 + return dev_err_probe(dev, ret, "Cannot use reference %u\n", 982 + ref_sel); 983 + 984 + return 0; 985 + } 986 + 1104 987 static int ad7173_fw_parse_channel_config(struct iio_dev *indio_dev) 1105 988 { 1106 989 struct ad7173_channel *chans_st_arr, *chan_st_priv; 1107 990 struct ad7173_state *st = iio_priv(indio_dev); 1108 991 struct device *dev = indio_dev->dev.parent; 1109 992 struct iio_chan_spec *chan_arr, *chan; 1110 - unsigned int ain[2], chan_index = 0; 1111 - int ref_sel, ret; 993 + unsigned int ain[AD7173_NO_AINS_PER_CHANNEL], chan_index = 0; 994 + int ref_sel, ret, num_channels; 995 + 996 + num_channels = device_get_child_node_count(dev); 997 + 998 + if (st->info->has_temp) 999 + num_channels++; 1000 + 1001 + if (num_channels == 0) 1002 + return dev_err_probe(dev, -ENODATA, "No channels specified\n"); 1003 + 1004 + if (num_channels > st->info->num_channels) 1005 + return dev_err_probe(dev, -EINVAL, 1006 + "Too many channels specified. Maximum is %d, not including temperature channel if supported.\n", 1007 + st->info->num_channels); 1008 + 1009 + indio_dev->num_channels = num_channels; 1010 + st->num_channels = num_channels; 1112 1011 1113 1012 chan_arr = devm_kcalloc(dev, sizeof(*indio_dev->channels), 1114 1013 st->num_channels, GFP_KERNEL); ··· 1234 941 } 1235 942 1236 943 device_for_each_child_node_scoped(dev, child) { 944 + bool is_current_chan = false; 945 + 1237 946 chan = &chan_arr[chan_index]; 947 + *chan = ad7173_channel_template; 1238 948 chan_st_priv = &chans_st_arr[chan_index]; 1239 949 ret = fwnode_property_read_u32_array(child, "diff-channels", 1240 950 ain, ARRAY_SIZE(ain)); 1241 - if (ret) 1242 - return ret; 951 + if (ret) { 952 + ret = fwnode_property_read_u32(child, "single-channel", 953 + ain); 954 + if (ret) 955 + return dev_err_probe(dev, ret, 956 + "Channel must define one of diff-channels or single-channel.\n"); 1243 957 1244 - if (ain[0] >= st->info->num_inputs || 1245 - ain[1] >= st->info->num_inputs) 1246 - return dev_err_probe(dev, -EINVAL, 1247 - "Input pin number out of range for pair (%d %d).\n", 1248 - ain[0], ain[1]); 958 + is_current_chan = fwnode_property_read_bool(child, "adi,current-channel"); 959 + } else { 960 + chan->differential = true; 961 + } 962 + 963 + if (is_current_chan) { 964 + ret = ad4111_validate_current_ain(st, ain); 965 + if (ret) 966 + return ret; 967 + } else { 968 + if (!chan->differential) { 969 + ret = fwnode_property_read_u32(child, 970 + "common-mode-channel", ain + 1); 971 + if (ret) 972 + return dev_err_probe(dev, ret, 973 + "common-mode-channel must be defined for single-ended channels.\n"); 974 + } 975 + ret = ad7173_validate_voltage_ain_inputs(st, ain[0], ain[1]); 976 + if (ret) 977 + return ret; 978 + } 1249 979 1250 980 ret = fwnode_property_match_property_string(child, 1251 981 "adi,reference-select", ··· 1279 963 else 1280 964 ref_sel = ret; 1281 965 1282 - if (ref_sel == AD7173_SETUP_REF_SEL_INT_REF && 1283 - !st->info->has_int_ref) 1284 - return dev_err_probe(dev, -EINVAL, 1285 - "Internal reference is not available on current model.\n"); 1286 - 1287 - if (ref_sel == AD7173_SETUP_REF_SEL_EXT_REF2 && !st->info->has_ref2) 1288 - return dev_err_probe(dev, -EINVAL, 1289 - "External reference 2 is not available on current model.\n"); 1290 - 1291 - ret = ad7173_get_ref_voltage_milli(st, ref_sel); 1292 - if (ret < 0) 1293 - return dev_err_probe(dev, ret, 1294 - "Cannot use reference %u\n", ref_sel); 966 + ret = ad7173_validate_reference(st, ref_sel); 967 + if (ret) 968 + return ret; 1295 969 1296 970 if (ref_sel == AD7173_SETUP_REF_SEL_INT_REF) 1297 971 st->adc_mode |= AD7173_ADC_MODE_REF_EN; 1298 972 chan_st_priv->cfg.ref_sel = ref_sel; 1299 973 1300 - *chan = ad7173_channel_template; 1301 974 chan->address = chan_index; 1302 975 chan->scan_index = chan_index; 1303 976 chan->channel = ain[0]; 1304 - chan->channel2 = ain[1]; 1305 - chan->differential = true; 1306 - 1307 - chan_st_priv->ain = AD7173_CH_ADDRESS(ain[0], ain[1]); 1308 977 chan_st_priv->chan_reg = chan_index; 1309 978 chan_st_priv->cfg.input_buf = st->info->has_input_buf; 1310 979 chan_st_priv->cfg.odr = 0; ··· 1297 996 chan_st_priv->cfg.bipolar = fwnode_property_read_bool(child, "bipolar"); 1298 997 if (chan_st_priv->cfg.bipolar) 1299 998 chan->info_mask_separate |= BIT(IIO_CHAN_INFO_OFFSET); 999 + 1000 + if (is_current_chan) { 1001 + chan->type = IIO_CURRENT; 1002 + chan->differential = false; 1003 + chan->channel2 = 0; 1004 + chan_st_priv->ain = ad4111_current_channel_config[ain[0]]; 1005 + } else { 1006 + chan_st_priv->cfg.input_buf = st->info->has_input_buf; 1007 + chan->channel2 = ain[1]; 1008 + chan_st_priv->ain = AD7173_CH_ADDRESS(ain[0], ain[1]); 1009 + } 1300 1010 1301 1011 chan_index++; 1302 1012 } ··· 1318 1006 { 1319 1007 struct ad7173_state *st = iio_priv(indio_dev); 1320 1008 struct device *dev = indio_dev->dev.parent; 1321 - unsigned int num_channels; 1322 1009 int ret; 1323 1010 1324 1011 st->regulators[0].supply = ad7173_ref_sel_str[AD7173_SETUP_REF_SEL_EXT_REF]; ··· 1375 1064 return dev_err_probe(dev, ret, "Interrupt 'rdy' is required\n"); 1376 1065 1377 1066 ad7173_sigma_delta_info.irq_line = ret; 1378 - 1379 - num_channels = device_get_child_node_count(dev); 1380 - 1381 - if (st->info->has_temp) 1382 - num_channels++; 1383 - 1384 - if (num_channels == 0) 1385 - return dev_err_probe(dev, -ENODATA, "No channels specified\n"); 1386 - indio_dev->num_channels = num_channels; 1387 - st->num_channels = num_channels; 1388 1067 1389 1068 return ad7173_fw_parse_channel_config(indio_dev); 1390 1069 } ··· 1435 1134 } 1436 1135 1437 1136 static const struct of_device_id ad7173_of_match[] = { 1438 - { .compatible = "adi,ad7172-2", 1439 - .data = &ad7173_device_info[ID_AD7172_2]}, 1440 - { .compatible = "adi,ad7172-4", 1441 - .data = &ad7173_device_info[ID_AD7172_4]}, 1442 - { .compatible = "adi,ad7173-8", 1443 - .data = &ad7173_device_info[ID_AD7173_8]}, 1444 - { .compatible = "adi,ad7175-2", 1445 - .data = &ad7173_device_info[ID_AD7175_2]}, 1446 - { .compatible = "adi,ad7175-8", 1447 - .data = &ad7173_device_info[ID_AD7175_8]}, 1448 - { .compatible = "adi,ad7176-2", 1449 - .data = &ad7173_device_info[ID_AD7176_2]}, 1450 - { .compatible = "adi,ad7177-2", 1451 - .data = &ad7173_device_info[ID_AD7177_2]}, 1137 + { .compatible = "ad4111", .data = &ad4111_device_info }, 1138 + { .compatible = "ad4112", .data = &ad4112_device_info }, 1139 + { .compatible = "ad4114", .data = &ad4114_device_info }, 1140 + { .compatible = "ad4115", .data = &ad4115_device_info }, 1141 + { .compatible = "ad4116", .data = &ad4116_device_info }, 1142 + { .compatible = "adi,ad7172-2", .data = &ad7172_2_device_info }, 1143 + { .compatible = "adi,ad7172-4", .data = &ad7172_4_device_info }, 1144 + { .compatible = "adi,ad7173-8", .data = &ad7173_8_device_info }, 1145 + { .compatible = "adi,ad7175-2", .data = &ad7175_2_device_info }, 1146 + { .compatible = "adi,ad7175-8", .data = &ad7175_8_device_info }, 1147 + { .compatible = "adi,ad7176-2", .data = &ad7176_2_device_info }, 1148 + { .compatible = "adi,ad7177-2", .data = &ad7177_2_device_info }, 1452 1149 { } 1453 1150 }; 1454 1151 MODULE_DEVICE_TABLE(of, ad7173_of_match); 1455 1152 1456 1153 static const struct spi_device_id ad7173_id_table[] = { 1457 - { "ad7172-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7172_2]}, 1458 - { "ad7172-4", (kernel_ulong_t)&ad7173_device_info[ID_AD7172_4]}, 1459 - { "ad7173-8", (kernel_ulong_t)&ad7173_device_info[ID_AD7173_8]}, 1460 - { "ad7175-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7175_2]}, 1461 - { "ad7175-8", (kernel_ulong_t)&ad7173_device_info[ID_AD7175_8]}, 1462 - { "ad7176-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7176_2]}, 1463 - { "ad7177-2", (kernel_ulong_t)&ad7173_device_info[ID_AD7177_2]}, 1154 + { "ad4111", (kernel_ulong_t)&ad4111_device_info }, 1155 + { "ad4112", (kernel_ulong_t)&ad4112_device_info }, 1156 + { "ad4114", (kernel_ulong_t)&ad4114_device_info }, 1157 + { "ad4115", (kernel_ulong_t)&ad4115_device_info }, 1158 + { "ad4116", (kernel_ulong_t)&ad4116_device_info }, 1159 + { "ad7172-2", (kernel_ulong_t)&ad7172_2_device_info }, 1160 + { "ad7172-4", (kernel_ulong_t)&ad7172_4_device_info }, 1161 + { "ad7173-8", (kernel_ulong_t)&ad7173_8_device_info }, 1162 + { "ad7175-2", (kernel_ulong_t)&ad7175_2_device_info }, 1163 + { "ad7175-8", (kernel_ulong_t)&ad7175_8_device_info }, 1164 + { "ad7176-2", (kernel_ulong_t)&ad7176_2_device_info }, 1165 + { "ad7177-2", (kernel_ulong_t)&ad7177_2_device_info }, 1464 1166 { } 1465 1167 }; 1466 1168 MODULE_DEVICE_TABLE(spi, ad7173_id_table); ··· 1481 1177 MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA); 1482 1178 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafo.de>"); 1483 1179 MODULE_AUTHOR("Dumitru Ceclan <dumitru.ceclan@analog.com>"); 1484 - MODULE_DESCRIPTION("Analog Devices AD7172/AD7173/AD7175/AD7176 ADC driver"); 1180 + MODULE_DESCRIPTION("Analog Devices AD7173 and similar ADC driver"); 1485 1181 MODULE_LICENSE("GPL");
+46 -82
drivers/iio/adc/ad7192.c
··· 200 200 201 201 struct ad7192_state { 202 202 const struct ad7192_chip_info *chip_info; 203 - struct regulator *avdd; 204 - struct regulator *vref; 205 203 struct clk *mclk; 206 204 u16 int_vref_mv; 207 205 u32 aincom_mv; ··· 1187 1189 }, 1188 1190 }; 1189 1191 1190 - static void ad7192_reg_disable(void *reg) 1191 - { 1192 - regulator_disable(reg); 1193 - } 1194 - 1195 1192 static int ad7192_probe(struct spi_device *spi) 1196 1193 { 1194 + struct device *dev = &spi->dev; 1197 1195 struct ad7192_state *st; 1198 1196 struct iio_dev *indio_dev; 1199 - struct regulator *aincom; 1200 - int ret; 1197 + int ret, avdd_mv; 1201 1198 1202 - if (!spi->irq) { 1203 - dev_err(&spi->dev, "no IRQ?\n"); 1204 - return -ENODEV; 1205 - } 1199 + if (!spi->irq) 1200 + return dev_err_probe(dev, -ENODEV, "Failed to get IRQ\n"); 1206 1201 1207 - indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); 1202 + indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); 1208 1203 if (!indio_dev) 1209 1204 return -ENOMEM; 1210 1205 ··· 1210 1219 * Newer firmware should provide a zero volt fixed supply if wired to 1211 1220 * ground. 1212 1221 */ 1213 - aincom = devm_regulator_get_optional(&spi->dev, "aincom"); 1214 - if (IS_ERR(aincom)) { 1215 - if (PTR_ERR(aincom) != -ENODEV) 1216 - return dev_err_probe(&spi->dev, PTR_ERR(aincom), 1217 - "Failed to get AINCOM supply\n"); 1222 + ret = devm_regulator_get_enable_read_voltage(dev, "aincom"); 1223 + if (ret < 0 && ret != -ENODEV) 1224 + return dev_err_probe(dev, ret, "Failed to get AINCOM voltage\n"); 1218 1225 1219 - st->aincom_mv = 0; 1220 - } else { 1221 - ret = regulator_enable(aincom); 1222 - if (ret) 1223 - return dev_err_probe(&spi->dev, ret, 1224 - "Failed to enable specified AINCOM supply\n"); 1226 + st->aincom_mv = ret == -ENODEV ? 0 : ret / MILLI; 1225 1227 1226 - ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, aincom); 1227 - if (ret) 1228 - return ret; 1228 + /* AVDD can optionally be used as reference voltage */ 1229 + ret = devm_regulator_get_enable_read_voltage(dev, "avdd"); 1230 + if (ret == -ENODEV || ret == -EINVAL) { 1231 + int ret2; 1229 1232 1230 - ret = regulator_get_voltage(aincom); 1231 - if (ret < 0) 1232 - return dev_err_probe(&spi->dev, ret, 1233 - "Device tree error, AINCOM voltage undefined\n"); 1234 - st->aincom_mv = ret / MILLI; 1233 + /* 1234 + * We get -EINVAL if avdd is a supply with unknown voltage. We 1235 + * still need to enable it since it is also a power supply. 1236 + */ 1237 + ret2 = devm_regulator_get_enable(dev, "avdd"); 1238 + if (ret2) 1239 + return dev_err_probe(dev, ret2, 1240 + "Failed to enable AVDD supply\n"); 1241 + } else if (ret < 0) { 1242 + return dev_err_probe(dev, ret, "Failed to get AVDD voltage\n"); 1235 1243 } 1236 1244 1237 - st->avdd = devm_regulator_get(&spi->dev, "avdd"); 1238 - if (IS_ERR(st->avdd)) 1239 - return PTR_ERR(st->avdd); 1245 + avdd_mv = ret == -ENODEV || ret == -EINVAL ? 0 : ret / MILLI; 1240 1246 1241 - ret = regulator_enable(st->avdd); 1242 - if (ret) { 1243 - dev_err(&spi->dev, "Failed to enable specified AVdd supply\n"); 1247 + ret = devm_regulator_get_enable(dev, "dvdd"); 1248 + if (ret) 1249 + return dev_err_probe(dev, ret, "Failed to enable specified DVdd supply\n"); 1250 + 1251 + /* 1252 + * This is either REFIN1 or REFIN2 depending on adi,refin2-pins-enable. 1253 + * If this supply is not present, fall back to AVDD as reference. 1254 + */ 1255 + ret = devm_regulator_get_enable_read_voltage(dev, "vref"); 1256 + if (ret == -ENODEV) { 1257 + if (avdd_mv == 0) 1258 + return dev_err_probe(dev, -ENODEV, 1259 + "No reference voltage available\n"); 1260 + } else if (ret < 0) { 1244 1261 return ret; 1245 1262 } 1246 1263 1247 - ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, st->avdd); 1248 - if (ret) 1249 - return ret; 1250 - 1251 - ret = devm_regulator_get_enable(&spi->dev, "dvdd"); 1252 - if (ret) 1253 - return dev_err_probe(&spi->dev, ret, "Failed to enable specified DVdd supply\n"); 1254 - 1255 - st->vref = devm_regulator_get_optional(&spi->dev, "vref"); 1256 - if (IS_ERR(st->vref)) { 1257 - if (PTR_ERR(st->vref) != -ENODEV) 1258 - return PTR_ERR(st->vref); 1259 - 1260 - ret = regulator_get_voltage(st->avdd); 1261 - if (ret < 0) 1262 - return dev_err_probe(&spi->dev, ret, 1263 - "Device tree error, AVdd voltage undefined\n"); 1264 - } else { 1265 - ret = regulator_enable(st->vref); 1266 - if (ret) { 1267 - dev_err(&spi->dev, "Failed to enable specified Vref supply\n"); 1268 - return ret; 1269 - } 1270 - 1271 - ret = devm_add_action_or_reset(&spi->dev, ad7192_reg_disable, st->vref); 1272 - if (ret) 1273 - return ret; 1274 - 1275 - ret = regulator_get_voltage(st->vref); 1276 - if (ret < 0) 1277 - return dev_err_probe(&spi->dev, ret, 1278 - "Device tree error, Vref voltage undefined\n"); 1279 - } 1280 - st->int_vref_mv = ret / 1000; 1264 + st->int_vref_mv = ret == -ENODEV ? avdd_mv : ret / MILLI; 1281 1265 1282 1266 st->chip_info = spi_get_device_match_data(spi); 1283 1267 indio_dev->name = st->chip_info->name; ··· 1271 1305 if (ret) 1272 1306 return ret; 1273 1307 1274 - ret = devm_ad_sd_setup_buffer_and_trigger(&spi->dev, indio_dev); 1308 + ret = devm_ad_sd_setup_buffer_and_trigger(dev, indio_dev); 1275 1309 if (ret) 1276 1310 return ret; 1277 1311 1278 1312 st->fclk = AD7192_INT_FREQ_MHZ; 1279 1313 1280 - st->mclk = devm_clk_get_optional_enabled(&spi->dev, "mclk"); 1314 + st->mclk = devm_clk_get_optional_enabled(dev, "mclk"); 1281 1315 if (IS_ERR(st->mclk)) 1282 1316 return PTR_ERR(st->mclk); 1283 1317 ··· 1286 1320 if (st->clock_sel == AD7192_CLK_EXT_MCLK1_2 || 1287 1321 st->clock_sel == AD7192_CLK_EXT_MCLK2) { 1288 1322 st->fclk = clk_get_rate(st->mclk); 1289 - if (!ad7192_valid_external_frequency(st->fclk)) { 1290 - dev_err(&spi->dev, 1291 - "External clock frequency out of bounds\n"); 1292 - return -EINVAL; 1293 - } 1323 + if (!ad7192_valid_external_frequency(st->fclk)) 1324 + return dev_err_probe(dev, -EINVAL, 1325 + "External clock frequency out of bounds\n"); 1294 1326 } 1295 1327 1296 - ret = ad7192_setup(indio_dev, &spi->dev); 1328 + ret = ad7192_setup(indio_dev, dev); 1297 1329 if (ret) 1298 1330 return ret; 1299 1331 1300 - return devm_iio_device_register(&spi->dev, indio_dev); 1332 + return devm_iio_device_register(dev, indio_dev); 1301 1333 } 1302 1334 1303 1335 static const struct of_device_id ad7192_of_match[] = {
+6 -27
drivers/iio/adc/ad7266.c
··· 23 23 24 24 #include <linux/platform_data/ad7266.h> 25 25 26 + #define AD7266_INTERNAL_REF_MV 2500 27 + 26 28 struct ad7266_state { 27 29 struct spi_device *spi; 28 - struct regulator *reg; 29 30 unsigned long vref_mv; 30 31 31 32 struct spi_transfer single_xfer[3]; ··· 380 379 "ad0", "ad1", "ad2", 381 380 }; 382 381 383 - static void ad7266_reg_disable(void *reg) 384 - { 385 - regulator_disable(reg); 386 - } 387 - 388 382 static int ad7266_probe(struct spi_device *spi) 389 383 { 390 384 struct ad7266_platform_data *pdata = spi->dev.platform_data; ··· 394 398 395 399 st = iio_priv(indio_dev); 396 400 397 - st->reg = devm_regulator_get_optional(&spi->dev, "vref"); 398 - if (!IS_ERR(st->reg)) { 399 - ret = regulator_enable(st->reg); 400 - if (ret) 401 - return ret; 401 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); 402 + if (ret < 0 && ret != -ENODEV) 403 + return ret; 402 404 403 - ret = devm_add_action_or_reset(&spi->dev, ad7266_reg_disable, st->reg); 404 - if (ret) 405 - return ret; 406 - 407 - ret = regulator_get_voltage(st->reg); 408 - if (ret < 0) 409 - return ret; 410 - 411 - st->vref_mv = ret / 1000; 412 - } else { 413 - /* Any other error indicates that the regulator does exist */ 414 - if (PTR_ERR(st->reg) != -ENODEV) 415 - return PTR_ERR(st->reg); 416 - /* Use internal reference */ 417 - st->vref_mv = 2500; 418 - } 405 + st->vref_mv = ret == -ENODEV ? AD7266_INTERNAL_REF_MV : ret / 1000; 419 406 420 407 if (pdata) { 421 408 st->fixed_addr = pdata->fixed_addr;
+6 -30
drivers/iio/adc/ad7292.c
··· 17 17 18 18 #define ADI_VENDOR_ID 0x0018 19 19 20 + #define AD7292_INTERNAL_REF_MV 1250 21 + 20 22 /* AD7292 registers definition */ 21 23 #define AD7292_REG_VENDOR_ID 0x00 22 24 #define AD7292_REG_CONF_BANK 0x05 ··· 81 79 82 80 struct ad7292_state { 83 81 struct spi_device *spi; 84 - struct regulator *reg; 85 82 unsigned short vref_mv; 86 83 87 84 __be16 d16 __aligned(IIO_DMA_MINALIGN); ··· 251 250 .read_raw = ad7292_read_raw, 252 251 }; 253 252 254 - static void ad7292_regulator_disable(void *data) 255 - { 256 - struct ad7292_state *st = data; 257 - 258 - regulator_disable(st->reg); 259 - } 260 - 261 253 static int ad7292_probe(struct spi_device *spi) 262 254 { 263 255 struct ad7292_state *st; ··· 271 277 return -EINVAL; 272 278 } 273 279 274 - st->reg = devm_regulator_get_optional(&spi->dev, "vref"); 275 - if (!IS_ERR(st->reg)) { 276 - ret = regulator_enable(st->reg); 277 - if (ret) { 278 - dev_err(&spi->dev, 279 - "Failed to enable external vref supply\n"); 280 - return ret; 281 - } 280 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); 281 + if (ret < 0 && ret != -ENODEV) 282 + return ret; 282 283 283 - ret = devm_add_action_or_reset(&spi->dev, 284 - ad7292_regulator_disable, st); 285 - if (ret) 286 - return ret; 287 - 288 - ret = regulator_get_voltage(st->reg); 289 - if (ret < 0) 290 - return ret; 291 - 292 - st->vref_mv = ret / 1000; 293 - } else { 294 - /* Use the internal voltage reference. */ 295 - st->vref_mv = 1250; 296 - } 284 + st->vref_mv = ret == -ENODEV ? AD7292_INTERNAL_REF_MV : ret / 1000; 297 285 298 286 indio_dev->name = spi_get_device_id(spi)->name; 299 287 indio_dev->modes = INDIO_DIRECT_MODE;
+3 -21
drivers/iio/adc/ad7793.c
··· 152 152 153 153 struct ad7793_state { 154 154 const struct ad7793_chip_info *chip_info; 155 - struct regulator *reg; 156 155 u16 int_vref_mv; 157 156 u16 mode; 158 157 u16 conf; ··· 768 769 }, 769 770 }; 770 771 771 - static void ad7793_reg_disable(void *reg) 772 - { 773 - regulator_disable(reg); 774 - } 775 - 776 772 static int ad7793_probe(struct spi_device *spi) 777 773 { 778 774 const struct ad7793_platform_data *pdata = spi->dev.platform_data; ··· 794 800 ad_sd_init(&st->sd, indio_dev, spi, &ad7793_sigma_delta_info); 795 801 796 802 if (pdata->refsel != AD7793_REFSEL_INTERNAL) { 797 - st->reg = devm_regulator_get(&spi->dev, "refin"); 798 - if (IS_ERR(st->reg)) 799 - return PTR_ERR(st->reg); 800 - 801 - ret = regulator_enable(st->reg); 802 - if (ret) 803 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "refin"); 804 + if (ret < 0) 803 805 return ret; 804 806 805 - ret = devm_add_action_or_reset(&spi->dev, ad7793_reg_disable, st->reg); 806 - if (ret) 807 - return ret; 808 - 809 - vref_mv = regulator_get_voltage(st->reg); 810 - if (vref_mv < 0) 811 - return vref_mv; 812 - 813 - vref_mv /= 1000; 807 + vref_mv = ret / 1000; 814 808 } else { 815 809 vref_mv = 1170; /* Build-in ref */ 816 810 }
+15 -65
drivers/iio/adc/ad7944.c
··· 134 134 /* fully differential */ 135 135 AD7944_DEFINE_CHIP_INFO(ad7986, ad7986, 18, 1); 136 136 137 - static void ad7944_unoptimize_msg(void *msg) 138 - { 139 - spi_unoptimize_message(msg); 140 - } 141 - 142 137 static int ad7944_3wire_cs_mode_init_msg(struct device *dev, struct ad7944_adc *adc, 143 138 const struct iio_chan_spec *chan) 144 139 { 145 140 unsigned int t_conv_ns = adc->always_turbo ? adc->timing_spec->turbo_conv_ns 146 141 : adc->timing_spec->conv_ns; 147 142 struct spi_transfer *xfers = adc->xfers; 148 - int ret; 149 143 150 144 /* 151 145 * NB: can get better performance from some SPI controllers if we use ··· 169 175 170 176 spi_message_init_with_transfers(&adc->msg, xfers, 3); 171 177 172 - ret = spi_optimize_message(adc->spi, &adc->msg); 173 - if (ret) 174 - return ret; 175 - 176 - return devm_add_action_or_reset(dev, ad7944_unoptimize_msg, &adc->msg); 178 + return devm_spi_optimize_message(dev, adc->spi, &adc->msg); 177 179 } 178 180 179 181 static int ad7944_4wire_mode_init_msg(struct device *dev, struct ad7944_adc *adc, ··· 178 188 unsigned int t_conv_ns = adc->always_turbo ? adc->timing_spec->turbo_conv_ns 179 189 : adc->timing_spec->conv_ns; 180 190 struct spi_transfer *xfers = adc->xfers; 181 - int ret; 182 191 183 192 /* 184 193 * NB: can get better performance from some SPI controllers if we use ··· 198 209 199 210 spi_message_init_with_transfers(&adc->msg, xfers, 2); 200 211 201 - ret = spi_optimize_message(adc->spi, &adc->msg); 202 - if (ret) 203 - return ret; 204 - 205 - return devm_add_action_or_reset(dev, ad7944_unoptimize_msg, &adc->msg); 212 + return devm_spi_optimize_message(dev, adc->spi, &adc->msg); 206 213 } 207 214 208 215 static int ad7944_chain_mode_init_msg(struct device *dev, struct ad7944_adc *adc, ··· 206 221 u32 n_chain_dev) 207 222 { 208 223 struct spi_transfer *xfers = adc->xfers; 209 - int ret; 210 224 211 225 /* 212 226 * NB: SCLK has to be low before we toggle CS to avoid triggering the ··· 233 249 234 250 spi_message_init_with_transfers(&adc->msg, xfers, 2); 235 251 236 - ret = spi_optimize_message(adc->spi, &adc->msg); 237 - if (ret) 238 - return ret; 239 - 240 - return devm_add_action_or_reset(dev, ad7944_unoptimize_msg, &adc->msg); 252 + return devm_spi_optimize_message(dev, adc->spi, &adc->msg); 241 253 } 242 254 243 255 /** ··· 444 464 "avdd", "dvdd", "bvdd", "vio" 445 465 }; 446 466 447 - static void ad7944_ref_disable(void *ref) 448 - { 449 - regulator_disable(ref); 450 - } 451 - 452 467 static int ad7944_probe(struct spi_device *spi) 453 468 { 454 469 const struct ad7944_chip_info *chip_info; 455 470 struct device *dev = &spi->dev; 456 471 struct iio_dev *indio_dev; 457 472 struct ad7944_adc *adc; 458 - bool have_refin = false; 459 - struct regulator *ref; 473 + bool have_refin; 460 474 struct iio_chan_spec *chain_chan; 461 475 unsigned long *chain_scan_masks; 462 476 u32 n_chain_dev; 463 - int ret; 477 + int ret, ref_mv; 464 478 465 479 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); 466 480 if (!indio_dev) ··· 505 531 * - external reference: REF is connected, REFIN is not connected 506 532 */ 507 533 508 - ref = devm_regulator_get_optional(dev, "ref"); 509 - if (IS_ERR(ref)) { 510 - if (PTR_ERR(ref) != -ENODEV) 511 - return dev_err_probe(dev, PTR_ERR(ref), 512 - "failed to get REF supply\n"); 534 + ret = devm_regulator_get_enable_read_voltage(dev, "ref"); 535 + if (ret < 0 && ret != -ENODEV) 536 + return dev_err_probe(dev, ret, "failed to get REF voltage\n"); 513 537 514 - ref = NULL; 515 - } 538 + ref_mv = ret == -ENODEV ? 0 : ret / 1000; 516 539 517 540 ret = devm_regulator_get_enable_optional(dev, "refin"); 518 - if (ret == 0) 519 - have_refin = true; 520 - else if (ret != -ENODEV) 521 - return dev_err_probe(dev, ret, 522 - "failed to get and enable REFIN supply\n"); 541 + if (ret < 0 && ret != -ENODEV) 542 + return dev_err_probe(dev, ret, "failed to get REFIN voltage\n"); 523 543 524 - if (have_refin && ref) 544 + have_refin = ret != -ENODEV; 545 + 546 + if (have_refin && ref_mv) 525 547 return dev_err_probe(dev, -EINVAL, 526 548 "cannot have both refin and ref supplies\n"); 527 549 528 - if (ref) { 529 - ret = regulator_enable(ref); 530 - if (ret) 531 - return dev_err_probe(dev, ret, 532 - "failed to enable REF supply\n"); 533 - 534 - ret = devm_add_action_or_reset(dev, ad7944_ref_disable, ref); 535 - if (ret) 536 - return ret; 537 - 538 - ret = regulator_get_voltage(ref); 539 - if (ret < 0) 540 - return dev_err_probe(dev, ret, 541 - "failed to get REF voltage\n"); 542 - 543 - /* external reference */ 544 - adc->ref_mv = ret / 1000; 545 - } else { 546 - /* internal reference */ 547 - adc->ref_mv = AD7944_INTERNAL_REF_MV; 548 - } 550 + adc->ref_mv = ref_mv ?: AD7944_INTERNAL_REF_MV; 549 551 550 552 adc->cnv = devm_gpiod_get_optional(dev, "cnv", GPIOD_OUT_LOW); 551 553 if (IS_ERR(adc->cnv))
+1
drivers/iio/adc/ad_sigma_delta.c
··· 321 321 322 322 sigma_delta->keep_cs_asserted = false; 323 323 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); 324 + ad_sigma_delta_disable_one(sigma_delta, chan->address); 324 325 sigma_delta->bus_locked = false; 325 326 spi_bus_unlock(sigma_delta->spi->controller); 326 327 iio_device_release_direct_mode(indio_dev);
+6 -3
drivers/iio/adc/adi-axi-adc.c
··· 308 308 st->regmap = devm_regmap_init_mmio(&pdev->dev, base, 309 309 &axi_adc_regmap_config); 310 310 if (IS_ERR(st->regmap)) 311 - return PTR_ERR(st->regmap); 311 + return dev_err_probe(&pdev->dev, PTR_ERR(st->regmap), 312 + "failed to init register map\n"); 312 313 313 314 expected_ver = device_get_match_data(&pdev->dev); 314 315 if (!expected_ver) ··· 317 316 318 317 clk = devm_clk_get_enabled(&pdev->dev, NULL); 319 318 if (IS_ERR(clk)) 320 - return PTR_ERR(clk); 319 + return dev_err_probe(&pdev->dev, PTR_ERR(clk), 320 + "failed to get clock\n"); 321 321 322 322 /* 323 323 * Force disable the core. Up to the frontend to enable us. And we can ··· 346 344 347 345 ret = devm_iio_backend_register(&pdev->dev, &adi_axi_adc_generic, st); 348 346 if (ret) 349 - return ret; 347 + return dev_err_probe(&pdev->dev, ret, 348 + "failed to register iio backend\n"); 350 349 351 350 dev_info(&pdev->dev, "AXI ADC IP core (%d.%.2d.%c) probed\n", 352 351 ADI_AXI_PCORE_VER_MAJOR(ver),
+8 -22
drivers/iio/adc/aspeed_adc.c
··· 108 108 struct aspeed_adc_data { 109 109 struct device *dev; 110 110 const struct aspeed_adc_model_data *model_data; 111 - struct regulator *regulator; 112 111 void __iomem *base; 113 112 spinlock_t clk_lock; 114 113 struct clk_hw *fixed_div_clk; ··· 403 404 priv_data->base + ASPEED_REG_ENGINE_CONTROL); 404 405 } 405 406 406 - static void aspeed_adc_reg_disable(void *data) 407 - { 408 - struct regulator *reg = data; 409 - 410 - regulator_disable(reg); 411 - } 412 - 413 407 static int aspeed_adc_vref_config(struct iio_dev *indio_dev) 414 408 { 415 409 struct aspeed_adc_data *data = iio_priv(indio_dev); ··· 415 423 } 416 424 adc_engine_control_reg_val = 417 425 readl(data->base + ASPEED_REG_ENGINE_CONTROL); 418 - data->regulator = devm_regulator_get_optional(data->dev, "vref"); 419 - if (!IS_ERR(data->regulator)) { 420 - ret = regulator_enable(data->regulator); 421 - if (ret) 422 - return ret; 423 - ret = devm_add_action_or_reset( 424 - data->dev, aspeed_adc_reg_disable, data->regulator); 425 - if (ret) 426 - return ret; 427 - data->vref_mv = regulator_get_voltage(data->regulator); 428 - /* Conversion from uV to mV */ 429 - data->vref_mv /= 1000; 426 + 427 + ret = devm_regulator_get_enable_read_voltage(data->dev, "vref"); 428 + if (ret < 0 && ret != -ENODEV) 429 + return ret; 430 + 431 + if (ret != -ENODEV) { 432 + data->vref_mv = ret / 1000; 433 + 430 434 if ((data->vref_mv >= 1550) && (data->vref_mv <= 2700)) 431 435 writel(adc_engine_control_reg_val | 432 436 FIELD_PREP( ··· 441 453 return -EOPNOTSUPP; 442 454 } 443 455 } else { 444 - if (PTR_ERR(data->regulator) != -ENODEV) 445 - return PTR_ERR(data->regulator); 446 456 data->vref_mv = 2500000; 447 457 of_property_read_u32(data->dev->of_node, 448 458 "aspeed,int-vref-microvolt",
+2 -3
drivers/iio/adc/axp20x_adc.c
··· 991 991 regmap_write(info->regmap, AXP20X_ADC_EN1, info->data->adc_en1_mask); 992 992 993 993 if (info->data->adc_en2_mask) 994 - regmap_update_bits(info->regmap, AXP20X_ADC_EN2, 995 - info->data->adc_en2_mask, 996 - info->data->adc_en2_mask); 994 + regmap_set_bits(info->regmap, AXP20X_ADC_EN2, 995 + info->data->adc_en2_mask); 997 996 998 997 /* Configure ADCs rate */ 999 998 info->data->adc_rate(info, 100);
+2 -2
drivers/iio/adc/axp288_adc.c
··· 247 247 return ret; 248 248 249 249 /* Turn on the ADC for all channels except TS, leave TS as is */ 250 - return regmap_update_bits(info->regmap, AXP20X_ADC_EN1, 251 - AXP288_ADC_EN_MASK, AXP288_ADC_EN_MASK); 250 + return regmap_set_bits(info->regmap, AXP20X_ADC_EN1, 251 + AXP288_ADC_EN_MASK); 252 252 } 253 253 254 254 static const struct iio_info axp288_adc_iio_info = {
+4 -4
drivers/iio/adc/bcm_iproc_adc.c
··· 357 357 int ret; 358 358 359 359 /* Set i_amux = 3b'000, select channel 0 */ 360 - ret = regmap_update_bits(adc_priv->regmap, IPROC_ANALOG_CONTROL, 361 - IPROC_ADC_CHANNEL_SEL_MASK, 0); 360 + ret = regmap_clear_bits(adc_priv->regmap, IPROC_ANALOG_CONTROL, 361 + IPROC_ADC_CHANNEL_SEL_MASK); 362 362 if (ret) { 363 363 dev_err(&indio_dev->dev, 364 364 "failed to write IPROC_ANALOG_CONTROL %d\n", ret); ··· 543 543 if (adc_priv->irqno < 0) 544 544 return adc_priv->irqno; 545 545 546 - ret = regmap_update_bits(adc_priv->regmap, IPROC_REGCTL2, 547 - IPROC_ADC_AUXIN_SCAN_ENA, 0); 546 + ret = regmap_clear_bits(adc_priv->regmap, IPROC_REGCTL2, 547 + IPROC_ADC_AUXIN_SCAN_ENA); 548 548 if (ret) { 549 549 dev_err(&pdev->dev, "failed to write IPROC_REGCTL2 %d\n", ret); 550 550 return ret;
+11 -13
drivers/iio/adc/berlin2-adc.c
··· 129 129 msecs_to_jiffies(1000)); 130 130 131 131 /* Disable the interrupts */ 132 - regmap_update_bits(priv->regmap, BERLIN2_SM_ADC_STATUS, 133 - BERLIN2_SM_ADC_STATUS_INT_EN(channel), 0); 132 + regmap_clear_bits(priv->regmap, BERLIN2_SM_ADC_STATUS, 133 + BERLIN2_SM_ADC_STATUS_INT_EN(channel)); 134 134 135 135 if (ret == 0) 136 136 ret = -ETIMEDOUT; ··· 139 139 return ret; 140 140 } 141 141 142 - regmap_update_bits(priv->regmap, BERLIN2_SM_CTRL, 143 - BERLIN2_SM_CTRL_ADC_START, 0); 142 + regmap_clear_bits(priv->regmap, BERLIN2_SM_CTRL, 143 + BERLIN2_SM_CTRL_ADC_START); 144 144 145 145 data = priv->data; 146 146 priv->data_available = false; ··· 180 180 msecs_to_jiffies(1000)); 181 181 182 182 /* Disable interrupts */ 183 - regmap_update_bits(priv->regmap, BERLIN2_SM_TSEN_STATUS, 184 - BERLIN2_SM_TSEN_STATUS_INT_EN, 0); 183 + regmap_clear_bits(priv->regmap, BERLIN2_SM_TSEN_STATUS, 184 + BERLIN2_SM_TSEN_STATUS_INT_EN); 185 185 186 186 if (ret == 0) 187 187 ret = -ETIMEDOUT; ··· 190 190 return ret; 191 191 } 192 192 193 - regmap_update_bits(priv->regmap, BERLIN2_SM_TSEN_CTRL, 194 - BERLIN2_SM_TSEN_CTRL_START, 0); 193 + regmap_clear_bits(priv->regmap, BERLIN2_SM_TSEN_CTRL, 194 + BERLIN2_SM_TSEN_CTRL_START); 195 195 196 196 data = priv->data; 197 197 priv->data_available = false; ··· 284 284 285 285 static void berlin2_adc_powerdown(void *regmap) 286 286 { 287 - regmap_update_bits(regmap, BERLIN2_SM_CTRL, 288 - BERLIN2_SM_CTRL_ADC_POWER, 0); 287 + regmap_clear_bits(regmap, BERLIN2_SM_CTRL, BERLIN2_SM_CTRL_ADC_POWER); 289 288 290 289 } 291 290 ··· 338 339 indio_dev->num_channels = ARRAY_SIZE(berlin2_adc_channels); 339 340 340 341 /* Power up the ADC */ 341 - regmap_update_bits(priv->regmap, BERLIN2_SM_CTRL, 342 - BERLIN2_SM_CTRL_ADC_POWER, 343 - BERLIN2_SM_CTRL_ADC_POWER); 342 + regmap_set_bits(priv->regmap, BERLIN2_SM_CTRL, 343 + BERLIN2_SM_CTRL_ADC_POWER); 344 344 345 345 ret = devm_add_action_or_reset(&pdev->dev, berlin2_adc_powerdown, 346 346 priv->regmap);
+19 -27
drivers/iio/adc/cpcap-adc.c
··· 385 385 struct cpcap_adc *ddata = iio_priv(indio_dev); 386 386 int error; 387 387 388 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 389 - CPCAP_BIT_ADTRIG_DIS, 390 - CPCAP_BIT_ADTRIG_DIS); 388 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, 389 + CPCAP_BIT_ADTRIG_DIS); 391 390 if (error) 392 391 return IRQ_NONE; 393 392 ··· 423 424 if (error) 424 425 return; 425 426 426 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 427 - CPCAP_BIT_ATOX_PS_FACTOR | 428 - CPCAP_BIT_ADC_PS_FACTOR1 | 429 - CPCAP_BIT_ADC_PS_FACTOR0, 430 - 0); 427 + error = regmap_clear_bits(ddata->reg, CPCAP_REG_ADCC2, 428 + CPCAP_BIT_ATOX_PS_FACTOR | 429 + CPCAP_BIT_ADC_PS_FACTOR1 | 430 + CPCAP_BIT_ADC_PS_FACTOR0); 431 431 if (error) 432 432 return; 433 433 434 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 435 - CPCAP_BIT_ADTRIG_DIS, 436 - CPCAP_BIT_ADTRIG_DIS); 434 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, 435 + CPCAP_BIT_ADTRIG_DIS); 437 436 if (error) 438 437 return; 439 438 440 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 441 - CPCAP_BIT_ASC, 442 - CPCAP_BIT_ASC); 439 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, CPCAP_BIT_ASC); 443 440 if (error) 444 441 return; 445 442 ··· 450 455 dev_err(ddata->dev, 451 456 "Timeout waiting for calibration to complete\n"); 452 457 453 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC1, 454 - CPCAP_BIT_CAL_MODE, 0); 458 + error = regmap_clear_bits(ddata->reg, CPCAP_REG_ADCC1, 459 + CPCAP_BIT_CAL_MODE); 455 460 if (error) 456 461 return; 457 462 } ··· 597 602 return; 598 603 599 604 if (req->timing == CPCAP_ADC_TIMING_IMM) { 600 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 601 - CPCAP_BIT_ADTRIG_DIS, 602 - CPCAP_BIT_ADTRIG_DIS); 605 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, 606 + CPCAP_BIT_ADTRIG_DIS); 603 607 if (error) 604 608 return; 605 609 606 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 607 - CPCAP_BIT_ASC, 608 - CPCAP_BIT_ASC); 610 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, 611 + CPCAP_BIT_ASC); 609 612 if (error) 610 613 return; 611 614 } else { 612 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 613 - CPCAP_BIT_ADTRIG_ONESHOT, 614 - CPCAP_BIT_ADTRIG_ONESHOT); 615 + error = regmap_set_bits(ddata->reg, CPCAP_REG_ADCC2, 616 + CPCAP_BIT_ADTRIG_ONESHOT); 615 617 if (error) 616 618 return; 617 619 618 - error = regmap_update_bits(ddata->reg, CPCAP_REG_ADCC2, 619 - CPCAP_BIT_ADTRIG_DIS, 0); 620 + error = regmap_clear_bits(ddata->reg, CPCAP_REG_ADCC2, 621 + CPCAP_BIT_ADTRIG_DIS); 620 622 if (error) 621 623 return; 622 624 }
+7 -9
drivers/iio/adc/fsl-imx25-gcq.c
··· 87 87 regmap_read(priv->regs, MX25_ADCQ_SR, &stats); 88 88 89 89 if (stats & MX25_ADCQ_SR_EOQ) { 90 - regmap_update_bits(priv->regs, MX25_ADCQ_MR, 91 - MX25_ADCQ_MR_EOQ_IRQ, MX25_ADCQ_MR_EOQ_IRQ); 90 + regmap_set_bits(priv->regs, MX25_ADCQ_MR, 91 + MX25_ADCQ_MR_EOQ_IRQ); 92 92 complete(&priv->completed); 93 93 } 94 94 95 95 /* Disable conversion queue run */ 96 - regmap_update_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS, 0); 96 + regmap_clear_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS); 97 97 98 98 /* Acknowledge all possible irqs */ 99 99 regmap_write(priv->regs, MX25_ADCQ_SR, MX25_ADCQ_SR_FRR | ··· 115 115 regmap_write(priv->regs, MX25_ADCQ_ITEM_7_0, 116 116 MX25_ADCQ_ITEM(0, chan->channel)); 117 117 118 - regmap_update_bits(priv->regs, MX25_ADCQ_MR, MX25_ADCQ_MR_EOQ_IRQ, 0); 118 + regmap_clear_bits(priv->regs, MX25_ADCQ_MR, MX25_ADCQ_MR_EOQ_IRQ); 119 119 120 120 /* Trigger queue for one run */ 121 - regmap_update_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS, 122 - MX25_ADCQ_CR_FQS); 121 + regmap_set_bits(priv->regs, MX25_ADCQ_CR, MX25_ADCQ_CR_FQS); 123 122 124 123 time_left = wait_for_completion_interruptible_timeout( 125 124 &priv->completed, MX25_GCQ_TIMEOUT); ··· 271 272 MX25_ADCQ_CFG_REFN_MASK, 272 273 refp | refn); 273 274 } 274 - regmap_update_bits(priv->regs, MX25_ADCQ_CR, 275 - MX25_ADCQ_CR_FRST | MX25_ADCQ_CR_QRST, 276 - MX25_ADCQ_CR_FRST | MX25_ADCQ_CR_QRST); 275 + regmap_set_bits(priv->regs, MX25_ADCQ_CR, 276 + MX25_ADCQ_CR_FRST | MX25_ADCQ_CR_QRST); 277 277 278 278 regmap_write(priv->regs, MX25_ADCQ_CR, 279 279 MX25_ADCQ_CR_PDMSK | MX25_ADCQ_CR_QSM_FQS);
+18 -60
drivers/iio/adc/hx711.c
··· 80 80 struct device *dev; 81 81 struct gpio_desc *gpiod_pd_sck; 82 82 struct gpio_desc *gpiod_dout; 83 - struct regulator *reg_avdd; 84 83 int gain_set; /* gain set on device */ 85 84 int gain_chan_a; /* gain for channel A */ 86 85 struct mutex lock; ··· 464 465 int i; 465 466 466 467 indio_dev = devm_iio_device_alloc(dev, sizeof(struct hx711_data)); 467 - if (!indio_dev) { 468 - dev_err(dev, "failed to allocate IIO device\n"); 469 - return -ENOMEM; 470 - } 468 + if (!indio_dev) 469 + return dev_err_probe(dev, -ENOMEM, "failed to allocate IIO device\n"); 471 470 472 471 hx711_data = iio_priv(indio_dev); 473 472 hx711_data->dev = dev; ··· 477 480 * in the driver it is an output 478 481 */ 479 482 hx711_data->gpiod_pd_sck = devm_gpiod_get(dev, "sck", GPIOD_OUT_LOW); 480 - if (IS_ERR(hx711_data->gpiod_pd_sck)) { 481 - dev_err(dev, "failed to get sck-gpiod: err=%ld\n", 482 - PTR_ERR(hx711_data->gpiod_pd_sck)); 483 - return PTR_ERR(hx711_data->gpiod_pd_sck); 484 - } 483 + if (IS_ERR(hx711_data->gpiod_pd_sck)) 484 + return dev_err_probe(dev, PTR_ERR(hx711_data->gpiod_pd_sck), 485 + "failed to get sck-gpiod\n"); 485 486 486 487 /* 487 488 * DOUT stands for serial data output of HX711 488 489 * for the driver it is an input 489 490 */ 490 491 hx711_data->gpiod_dout = devm_gpiod_get(dev, "dout", GPIOD_IN); 491 - if (IS_ERR(hx711_data->gpiod_dout)) { 492 - dev_err(dev, "failed to get dout-gpiod: err=%ld\n", 493 - PTR_ERR(hx711_data->gpiod_dout)); 494 - return PTR_ERR(hx711_data->gpiod_dout); 495 - } 492 + if (IS_ERR(hx711_data->gpiod_dout)) 493 + return dev_err_probe(dev, PTR_ERR(hx711_data->gpiod_dout), 494 + "failed to get dout-gpiod\n"); 496 495 497 - hx711_data->reg_avdd = devm_regulator_get(dev, "avdd"); 498 - if (IS_ERR(hx711_data->reg_avdd)) 499 - return PTR_ERR(hx711_data->reg_avdd); 500 - 501 - ret = regulator_enable(hx711_data->reg_avdd); 496 + ret = devm_regulator_get_enable_read_voltage(dev, "avdd"); 502 497 if (ret < 0) 503 498 return ret; 504 499 ··· 506 517 * approximately to fit into a 32 bit number: 507 518 * 1 LSB = (AVDD * 100) / GAIN / 1678 [10^-9 mV] 508 519 */ 509 - ret = regulator_get_voltage(hx711_data->reg_avdd); 510 - if (ret < 0) 511 - goto error_regulator; 512 520 513 521 /* we need 10^-9 mV */ 514 522 ret *= 100; ··· 533 547 hx711_data->data_ready_delay_ns = 534 548 1000000000 / hx711_data->clock_frequency; 535 549 536 - platform_set_drvdata(pdev, indio_dev); 537 - 538 550 indio_dev->name = "hx711"; 539 551 indio_dev->info = &hx711_iio_info; 540 552 indio_dev->modes = INDIO_DIRECT_MODE; 541 553 indio_dev->channels = hx711_chan_spec; 542 554 indio_dev->num_channels = ARRAY_SIZE(hx711_chan_spec); 543 555 544 - ret = iio_triggered_buffer_setup(indio_dev, iio_pollfunc_store_time, 545 - hx711_trigger, NULL); 546 - if (ret < 0) { 547 - dev_err(dev, "setup of iio triggered buffer failed\n"); 548 - goto error_regulator; 549 - } 556 + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, 557 + iio_pollfunc_store_time, 558 + hx711_trigger, NULL); 559 + if (ret < 0) 560 + return dev_err_probe(dev, ret, 561 + "setup of iio triggered buffer failed\n"); 550 562 551 - ret = iio_device_register(indio_dev); 552 - if (ret < 0) { 553 - dev_err(dev, "Couldn't register the device\n"); 554 - goto error_buffer; 555 - } 563 + ret = devm_iio_device_register(dev, indio_dev); 564 + if (ret < 0) 565 + return dev_err_probe(dev, ret, "Couldn't register the device\n"); 556 566 557 567 return 0; 558 - 559 - error_buffer: 560 - iio_triggered_buffer_cleanup(indio_dev); 561 - 562 - error_regulator: 563 - regulator_disable(hx711_data->reg_avdd); 564 - 565 - return ret; 566 - } 567 - 568 - static void hx711_remove(struct platform_device *pdev) 569 - { 570 - struct hx711_data *hx711_data; 571 - struct iio_dev *indio_dev; 572 - 573 - indio_dev = platform_get_drvdata(pdev); 574 - hx711_data = iio_priv(indio_dev); 575 - 576 - iio_device_unregister(indio_dev); 577 - 578 - iio_triggered_buffer_cleanup(indio_dev); 579 - 580 - regulator_disable(hx711_data->reg_avdd); 581 568 } 582 569 583 570 static const struct of_device_id of_hx711_match[] = { ··· 562 603 563 604 static struct platform_driver hx711_driver = { 564 605 .probe = hx711_probe, 565 - .remove_new = hx711_remove, 566 606 .driver = { 567 607 .name = "hx711-gpio", 568 608 .of_match_table = of_hx711_match,
+1 -2
drivers/iio/adc/ina2xx-adc.c
··· 1046 1046 iio_device_unregister(indio_dev); 1047 1047 1048 1048 /* Powerdown */ 1049 - ret = regmap_update_bits(chip->regmap, INA2XX_CONFIG, 1050 - INA2XX_MODE_MASK, 0); 1049 + ret = regmap_clear_bits(chip->regmap, INA2XX_CONFIG, INA2XX_MODE_MASK); 1051 1050 if (ret) 1052 1051 dev_warn(&client->dev, "Failed to power down device (%pe)\n", 1053 1052 ERR_PTR(ret));
+2 -2
drivers/iio/adc/intel_mrfld_adc.c
··· 81 81 82 82 reinit_completion(&adc->completion); 83 83 84 - regmap_update_bits(regmap, BCOVE_MADCIRQ, BCOVE_ADCIRQ_ALL, 0); 85 - regmap_update_bits(regmap, BCOVE_MIRQLVL1, BCOVE_LVL1_ADC, 0); 84 + regmap_clear_bits(regmap, BCOVE_MADCIRQ, BCOVE_ADCIRQ_ALL); 85 + regmap_clear_bits(regmap, BCOVE_MIRQLVL1, BCOVE_LVL1_ADC); 86 86 87 87 ret = regmap_read_poll_timeout(regmap, BCOVE_GPADCREQ, req, 88 88 !(req & BCOVE_GPADCREQ_BUSY),
+7 -38
drivers/iio/adc/ltc2309.c
··· 16 16 #include <linux/regulator/consumer.h> 17 17 18 18 #define LTC2309_ADC_RESOLUTION 12 19 + #define LTC2309_INTERNAL_REF_MV 4096 19 20 20 21 #define LTC2309_DIN_CH_MASK GENMASK(7, 4) 21 22 #define LTC2309_DIN_SDN BIT(7) ··· 30 29 * struct ltc2309 - internal device data structure 31 30 * @dev: Device reference 32 31 * @client: I2C reference 33 - * @vref: External reference source 34 32 * @lock: Lock to serialize data access 35 33 * @vref_mv: Internal voltage reference 36 34 */ 37 35 struct ltc2309 { 38 36 struct device *dev; 39 37 struct i2c_client *client; 40 - struct regulator *vref; 41 38 struct mutex lock; /* serialize data access */ 42 39 int vref_mv; 43 40 }; ··· 103 104 unsigned long address, int *val) 104 105 { 105 106 int ret; 106 - u16 buf; 107 + __be16 buf; 107 108 u8 din; 108 109 109 110 din = FIELD_PREP(LTC2309_DIN_CH_MASK, address & 0x0f) | ··· 156 157 .read_raw = ltc2309_read_raw, 157 158 }; 158 159 159 - static void ltc2309_regulator_disable(void *regulator) 160 - { 161 - regulator_disable(regulator); 162 - } 163 - 164 160 static int ltc2309_probe(struct i2c_client *client) 165 161 { 166 162 struct iio_dev *indio_dev; ··· 169 175 ltc2309 = iio_priv(indio_dev); 170 176 ltc2309->dev = &indio_dev->dev; 171 177 ltc2309->client = client; 172 - ltc2309->vref_mv = 4096; /* Default to the internal ref */ 173 178 174 179 indio_dev->name = "ltc2309"; 175 180 indio_dev->modes = INDIO_DIRECT_MODE; ··· 176 183 indio_dev->num_channels = ARRAY_SIZE(ltc2309_channels); 177 184 indio_dev->info = &ltc2309_info; 178 185 179 - ltc2309->vref = devm_regulator_get_optional(&client->dev, "vref"); 180 - if (IS_ERR(ltc2309->vref)) { 181 - ret = PTR_ERR(ltc2309->vref); 182 - if (ret == -ENODEV) 183 - ltc2309->vref = NULL; 184 - else 185 - return ret; 186 - } 186 + ret = devm_regulator_get_enable_read_voltage(&client->dev, "vref"); 187 + if (ret < 0 && ret != -ENODEV) 188 + return dev_err_probe(ltc2309->dev, ret, 189 + "failed to get vref voltage\n"); 187 190 188 - if (ltc2309->vref) { 189 - ret = regulator_enable(ltc2309->vref); 190 - if (ret) 191 - return dev_err_probe(ltc2309->dev, ret, 192 - "failed to enable vref\n"); 193 - 194 - ret = devm_add_action_or_reset(ltc2309->dev, 195 - ltc2309_regulator_disable, 196 - ltc2309->vref); 197 - if (ret) { 198 - return dev_err_probe(ltc2309->dev, ret, 199 - "failed to add regulator_disable action: %d\n", 200 - ret); 201 - } 202 - 203 - ret = regulator_get_voltage(ltc2309->vref); 204 - if (ret < 0) 205 - return ret; 206 - 207 - ltc2309->vref_mv = ret / 1000; 208 - } 191 + ltc2309->vref_mv = ret == -ENODEV ? LTC2309_INTERNAL_REF_MV : ret / 1000; 209 192 210 193 mutex_init(&ltc2309->lock); 211 194
+4 -24
drivers/iio/adc/max1363.c
··· 1561 1561 }; 1562 1562 MODULE_DEVICE_TABLE(of, max1363_of_match); 1563 1563 1564 - static void max1363_reg_disable(void *reg) 1565 - { 1566 - regulator_disable(reg); 1567 - } 1568 - 1569 1564 static int max1363_probe(struct i2c_client *client) 1570 1565 { 1571 1566 const struct i2c_device_id *id = i2c_client_get_device_id(client); 1572 1567 int ret; 1573 1568 struct max1363_state *st; 1574 1569 struct iio_dev *indio_dev; 1575 - struct regulator *vref; 1576 1570 1577 1571 indio_dev = devm_iio_device_alloc(&client->dev, 1578 1572 sizeof(struct max1363_state)); ··· 1583 1589 st->chip_info = i2c_get_match_data(client); 1584 1590 st->client = client; 1585 1591 1586 - st->vref_uv = st->chip_info->int_vref_mv * 1000; 1587 - vref = devm_regulator_get_optional(&client->dev, "vref"); 1588 - if (!IS_ERR(vref)) { 1589 - int vref_uv; 1592 + ret = devm_regulator_get_enable_read_voltage(&client->dev, "vref"); 1593 + if (ret < 0 && ret != -ENODEV) 1594 + return ret; 1590 1595 1591 - ret = regulator_enable(vref); 1592 - if (ret) 1593 - return ret; 1594 1596 1595 - ret = devm_add_action_or_reset(&client->dev, max1363_reg_disable, vref); 1596 - if (ret) 1597 - return ret; 1598 - 1599 - st->vref = vref; 1600 - vref_uv = regulator_get_voltage(vref); 1601 - if (vref_uv <= 0) 1602 - return -EINVAL; 1603 - 1604 - st->vref_uv = vref_uv; 1605 - } 1597 + st->vref_uv = ret == -ENODEV ? st->chip_info->int_vref_mv * 1000 : ret; 1606 1598 1607 1599 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 1608 1600 st->send = i2c_master_send;
+44 -57
drivers/iio/adc/meson_saradc.c
··· 546 546 547 547 reinit_completion(&priv->done); 548 548 549 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 550 - MESON_SAR_ADC_REG0_FIFO_IRQ_EN, 551 - MESON_SAR_ADC_REG0_FIFO_IRQ_EN); 549 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG0, 550 + MESON_SAR_ADC_REG0_FIFO_IRQ_EN); 552 551 553 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 554 - MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE, 555 - MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE); 552 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG0, 553 + MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE); 556 554 557 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 558 - MESON_SAR_ADC_REG0_SAMPLING_START, 559 - MESON_SAR_ADC_REG0_SAMPLING_START); 555 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG0, 556 + MESON_SAR_ADC_REG0_SAMPLING_START); 560 557 } 561 558 562 559 static void meson_sar_adc_stop_sample_engine(struct iio_dev *indio_dev) 563 560 { 564 561 struct meson_sar_adc_priv *priv = iio_priv(indio_dev); 565 562 566 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 567 - MESON_SAR_ADC_REG0_FIFO_IRQ_EN, 0); 563 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG0, 564 + MESON_SAR_ADC_REG0_FIFO_IRQ_EN); 568 565 569 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 570 - MESON_SAR_ADC_REG0_SAMPLING_STOP, 571 - MESON_SAR_ADC_REG0_SAMPLING_STOP); 566 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG0, 567 + MESON_SAR_ADC_REG0_SAMPLING_STOP); 572 568 573 569 /* wait until all modules are stopped */ 574 570 meson_sar_adc_wait_busy_clear(indio_dev); 575 571 576 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 577 - MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE, 0); 572 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG0, 573 + MESON_SAR_ADC_REG0_SAMPLE_ENGINE_ENABLE); 578 574 } 579 575 580 576 static int meson_sar_adc_lock(struct iio_dev *indio_dev) ··· 582 586 583 587 if (priv->param->has_bl30_integration) { 584 588 /* prevent BL30 from using the SAR ADC while we are using it */ 585 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY, 586 - MESON_SAR_ADC_DELAY_KERNEL_BUSY, 587 - MESON_SAR_ADC_DELAY_KERNEL_BUSY); 589 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_DELAY, 590 + MESON_SAR_ADC_DELAY_KERNEL_BUSY); 588 591 589 592 udelay(1); 590 593 ··· 609 614 610 615 if (priv->param->has_bl30_integration) 611 616 /* allow BL30 to use the SAR ADC again */ 612 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY, 613 - MESON_SAR_ADC_DELAY_KERNEL_BUSY, 0); 617 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_DELAY, 618 + MESON_SAR_ADC_DELAY_KERNEL_BUSY); 614 619 615 620 mutex_unlock(&priv->lock); 616 621 } ··· 864 869 * disable this bit as seems to be only relevant for Meson6 (based 865 870 * on the vendor driver), which we don't support at the moment. 866 871 */ 867 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG0, 868 - MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL, 0); 872 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG0, 873 + MESON_SAR_ADC_REG0_ADC_TEMP_SEN_SEL); 869 874 870 875 /* disable all channels by default */ 871 876 regmap_write(priv->regmap, MESON_SAR_ADC_CHAN_LIST, 0x0); 872 877 873 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, 874 - MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE, 0); 875 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, 876 - MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY, 877 - MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY); 878 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG3, 879 + MESON_SAR_ADC_REG3_CTRL_SAMPLING_CLOCK_PHASE); 880 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG3, 881 + MESON_SAR_ADC_REG3_CNTL_USE_SC_DLY); 878 882 879 883 /* delay between two samples = (10+1) * 1uS */ 880 884 regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELAY, ··· 908 914 MESON_SAR_ADC_CHAN_10_SW_CHAN1_MUX_SEL_MASK, 909 915 regval); 910 916 911 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 912 - MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW, 913 - MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW); 917 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 918 + MESON_SAR_ADC_CHAN_10_SW_CHAN0_XP_DRIVE_SW); 914 919 915 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 916 - MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW, 917 - MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW); 920 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 921 + MESON_SAR_ADC_CHAN_10_SW_CHAN0_YP_DRIVE_SW); 918 922 919 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 920 - MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW, 921 - MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW); 923 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 924 + MESON_SAR_ADC_CHAN_10_SW_CHAN1_XP_DRIVE_SW); 922 925 923 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 924 - MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW, 925 - MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW); 926 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_CHAN_10_SW, 927 + MESON_SAR_ADC_CHAN_10_SW_CHAN1_YP_DRIVE_SW); 926 928 927 929 /* 928 930 * set up the input channel muxes in MESON_SAR_ADC_AUX_SW ··· 934 944 regmap_write(priv->regmap, MESON_SAR_ADC_AUX_SW, regval); 935 945 936 946 if (priv->temperature_sensor_calibrated) { 937 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 938 - MESON_SAR_ADC_DELTA_10_TS_REVE1, 939 - MESON_SAR_ADC_DELTA_10_TS_REVE1); 940 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 941 - MESON_SAR_ADC_DELTA_10_TS_REVE0, 942 - MESON_SAR_ADC_DELTA_10_TS_REVE0); 947 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 948 + MESON_SAR_ADC_DELTA_10_TS_REVE1); 949 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 950 + MESON_SAR_ADC_DELTA_10_TS_REVE0); 943 951 944 952 /* 945 953 * set bits [3:0] of the TSC (temperature sensor coefficient) ··· 964 976 regval); 965 977 } 966 978 } else { 967 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 968 - MESON_SAR_ADC_DELTA_10_TS_REVE1, 0); 969 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 970 - MESON_SAR_ADC_DELTA_10_TS_REVE0, 0); 979 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 980 + MESON_SAR_ADC_DELTA_10_TS_REVE1); 981 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_DELTA_10, 982 + MESON_SAR_ADC_DELTA_10_TS_REVE0); 971 983 } 972 984 973 985 regval = FIELD_PREP(MESON_SAR_ADC_REG3_CTRL_CONT_RING_COUNTER_EN, ··· 1050 1062 1051 1063 meson_sar_adc_set_bandgap(indio_dev, true); 1052 1064 1053 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, 1054 - MESON_SAR_ADC_REG3_ADC_EN, 1055 - MESON_SAR_ADC_REG3_ADC_EN); 1065 + regmap_set_bits(priv->regmap, MESON_SAR_ADC_REG3, 1066 + MESON_SAR_ADC_REG3_ADC_EN); 1056 1067 1057 1068 udelay(5); 1058 1069 ··· 1066 1079 return 0; 1067 1080 1068 1081 err_adc_clk: 1069 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, 1070 - MESON_SAR_ADC_REG3_ADC_EN, 0); 1082 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG3, 1083 + MESON_SAR_ADC_REG3_ADC_EN); 1071 1084 meson_sar_adc_set_bandgap(indio_dev, false); 1072 1085 regulator_disable(priv->vref); 1073 1086 err_vref: ··· 1091 1104 1092 1105 clk_disable_unprepare(priv->adc_clk); 1093 1106 1094 - regmap_update_bits(priv->regmap, MESON_SAR_ADC_REG3, 1095 - MESON_SAR_ADC_REG3_ADC_EN, 0); 1107 + regmap_clear_bits(priv->regmap, MESON_SAR_ADC_REG3, 1108 + MESON_SAR_ADC_REG3_ADC_EN); 1096 1109 1097 1110 meson_sar_adc_set_bandgap(indio_dev, false); 1098 1111
+8 -11
drivers/iio/adc/mp2629_adc.c
··· 131 131 info->dev = dev; 132 132 platform_set_drvdata(pdev, indio_dev); 133 133 134 - ret = regmap_update_bits(info->regmap, MP2629_REG_ADC_CTRL, 135 - MP2629_ADC_START | MP2629_ADC_CONTINUOUS, 136 - MP2629_ADC_START | MP2629_ADC_CONTINUOUS); 134 + ret = regmap_set_bits(info->regmap, MP2629_REG_ADC_CTRL, 135 + MP2629_ADC_START | MP2629_ADC_CONTINUOUS); 137 136 if (ret) { 138 137 dev_err(dev, "adc enable fail: %d\n", ret); 139 138 return ret; ··· 162 163 iio_map_array_unregister(indio_dev); 163 164 164 165 fail_disable: 165 - regmap_update_bits(info->regmap, MP2629_REG_ADC_CTRL, 166 - MP2629_ADC_CONTINUOUS, 0); 167 - regmap_update_bits(info->regmap, MP2629_REG_ADC_CTRL, 168 - MP2629_ADC_START, 0); 166 + regmap_clear_bits(info->regmap, MP2629_REG_ADC_CTRL, 167 + MP2629_ADC_CONTINUOUS); 168 + regmap_clear_bits(info->regmap, MP2629_REG_ADC_CTRL, MP2629_ADC_START); 169 169 170 170 return ret; 171 171 } ··· 178 180 179 181 iio_map_array_unregister(indio_dev); 180 182 181 - regmap_update_bits(info->regmap, MP2629_REG_ADC_CTRL, 182 - MP2629_ADC_CONTINUOUS, 0); 183 - regmap_update_bits(info->regmap, MP2629_REG_ADC_CTRL, 184 - MP2629_ADC_START, 0); 183 + regmap_clear_bits(info->regmap, MP2629_REG_ADC_CTRL, 184 + MP2629_ADC_CONTINUOUS); 185 + regmap_clear_bits(info->regmap, MP2629_REG_ADC_CTRL, MP2629_ADC_START); 185 186 } 186 187 187 188 static const struct of_device_id mp2629_adc_of_match[] = {
+606
drivers/iio/adc/mt6359-auxadc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * MediaTek MT6359 PMIC AUXADC IIO driver 4 + * 5 + * Copyright (c) 2021 MediaTek Inc. 6 + * Copyright (c) 2024 Collabora Ltd 7 + * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 8 + */ 9 + 10 + #include <linux/bits.h> 11 + #include <linux/cleanup.h> 12 + #include <linux/delay.h> 13 + #include <linux/module.h> 14 + #include <linux/mod_devicetable.h> 15 + #include <linux/platform_device.h> 16 + #include <linux/property.h> 17 + #include <linux/regmap.h> 18 + #include <linux/types.h> 19 + 20 + #include <linux/iio/iio.h> 21 + 22 + #include <linux/mfd/mt6397/core.h> 23 + 24 + #include <dt-bindings/iio/adc/mediatek,mt6357-auxadc.h> 25 + #include <dt-bindings/iio/adc/mediatek,mt6358-auxadc.h> 26 + #include <dt-bindings/iio/adc/mediatek,mt6359-auxadc.h> 27 + 28 + #define AUXADC_AVG_TIME_US 10 29 + #define AUXADC_POLL_DELAY_US 100 30 + #define AUXADC_TIMEOUT_US 32000 31 + #define AUXADC_VOLT_FULL 1800 32 + #define IMP_STOP_DELAY_US 150 33 + #define IMP_POLL_DELAY_US 1000 34 + 35 + /* For PMIC_RG_RESET_VAL and MT6358_IMP0_CLEAR, the bits specific purpose is unknown. */ 36 + #define PMIC_RG_RESET_VAL (BIT(0) | BIT(3)) 37 + #define PMIC_AUXADC_RDY_BIT BIT(15) 38 + #define MT6357_IMP_ADC_NUM 30 39 + #define MT6358_IMP_ADC_NUM 28 40 + 41 + #define MT6358_DCM_CK_SW_EN GENMASK(1, 0) 42 + #define MT6358_IMP0_CLEAR (BIT(14) | BIT(7)) 43 + #define MT6358_IMP0_IRQ_RDY BIT(8) 44 + #define MT6358_IMP1_AUTOREPEAT_EN BIT(15) 45 + 46 + #define MT6359_IMP0_CONV_EN BIT(0) 47 + #define MT6359_IMP1_IRQ_RDY BIT(15) 48 + 49 + enum mtk_pmic_auxadc_regs { 50 + PMIC_AUXADC_ADC0, 51 + PMIC_AUXADC_DCM_CON, 52 + PMIC_AUXADC_IMP0, 53 + PMIC_AUXADC_IMP1, 54 + PMIC_AUXADC_IMP3, 55 + PMIC_AUXADC_RQST0, 56 + PMIC_AUXADC_RQST1, 57 + PMIC_HK_TOP_WKEY, 58 + PMIC_HK_TOP_RST_CON0, 59 + PMIC_FGADC_R_CON0, 60 + PMIC_AUXADC_REGS_MAX 61 + }; 62 + 63 + enum mtk_pmic_auxadc_channels { 64 + PMIC_AUXADC_CHAN_BATADC, 65 + PMIC_AUXADC_CHAN_ISENSE, 66 + PMIC_AUXADC_CHAN_VCDT, 67 + PMIC_AUXADC_CHAN_BAT_TEMP, 68 + PMIC_AUXADC_CHAN_BATID, 69 + PMIC_AUXADC_CHAN_CHIP_TEMP, 70 + PMIC_AUXADC_CHAN_VCORE_TEMP, 71 + PMIC_AUXADC_CHAN_VPROC_TEMP, 72 + PMIC_AUXADC_CHAN_VGPU_TEMP, 73 + PMIC_AUXADC_CHAN_ACCDET, 74 + PMIC_AUXADC_CHAN_VDCXO, 75 + PMIC_AUXADC_CHAN_TSX_TEMP, 76 + PMIC_AUXADC_CHAN_HPOFS_CAL, 77 + PMIC_AUXADC_CHAN_DCXO_TEMP, 78 + PMIC_AUXADC_CHAN_VBIF, 79 + PMIC_AUXADC_CHAN_IBAT, 80 + PMIC_AUXADC_CHAN_VBAT, 81 + PMIC_AUXADC_CHAN_MAX 82 + }; 83 + 84 + /** 85 + * struct mt6359_auxadc - Main driver structure 86 + * @dev: Device pointer 87 + * @regmap: Regmap from SoC PMIC Wrapper 88 + * @chip_info: PMIC specific chip info 89 + * @lock: Mutex to serialize AUXADC reading vs configuration 90 + * @timed_out: Signals whether the last read timed out 91 + */ 92 + struct mt6359_auxadc { 93 + struct device *dev; 94 + struct regmap *regmap; 95 + const struct mtk_pmic_auxadc_info *chip_info; 96 + struct mutex lock; 97 + bool timed_out; 98 + }; 99 + 100 + /** 101 + * struct mtk_pmic_auxadc_chan - PMIC AUXADC channel data 102 + * @req_idx: Request register number 103 + * @req_mask: Bitmask to activate a channel 104 + * @num_samples: Number of AUXADC samples for averaging 105 + * @r_ratio: Resistance ratio fractional 106 + */ 107 + struct mtk_pmic_auxadc_chan { 108 + u8 req_idx; 109 + u16 req_mask; 110 + u16 num_samples; 111 + struct u8_fract r_ratio; 112 + }; 113 + 114 + /** 115 + * struct mtk_pmic_auxadc_info - PMIC specific chip info 116 + * @model_name: PMIC model name 117 + * @channels: IIO specification of ADC channels 118 + * @num_channels: Number of ADC channels 119 + * @desc: PMIC AUXADC channel data 120 + * @regs: List of PMIC specific registers 121 + * @sec_unlock_key: Security unlock key for HK_TOP writes 122 + * @imp_adc_num: ADC channel for battery impedance readings 123 + * @read_imp: Callback to read impedance channels 124 + */ 125 + struct mtk_pmic_auxadc_info { 126 + const char *model_name; 127 + const struct iio_chan_spec *channels; 128 + u8 num_channels; 129 + const struct mtk_pmic_auxadc_chan *desc; 130 + const u16 *regs; 131 + u16 sec_unlock_key; 132 + u8 imp_adc_num; 133 + int (*read_imp)(struct mt6359_auxadc *adc_dev, int *vbat, int *ibat); 134 + }; 135 + 136 + #define MTK_PMIC_ADC_CHAN(_ch_idx, _req_idx, _req_bit, _samples, _rnum, _rdiv) \ 137 + [PMIC_AUXADC_CHAN_##_ch_idx] = { \ 138 + .req_idx = _req_idx, \ 139 + .req_mask = BIT(_req_bit), \ 140 + .num_samples = _samples, \ 141 + .r_ratio = { _rnum, _rdiv } \ 142 + } 143 + 144 + #define MTK_PMIC_IIO_CHAN(_model, _name, _ch_idx, _adc_idx, _nbits, _ch_type) \ 145 + { \ 146 + .type = _ch_type, \ 147 + .channel = _model##_AUXADC_##_ch_idx, \ 148 + .address = _adc_idx, \ 149 + .scan_index = PMIC_AUXADC_CHAN_##_ch_idx, \ 150 + .datasheet_name = __stringify(_name), \ 151 + .scan_type = { \ 152 + .sign = 'u', \ 153 + .realbits = _nbits, \ 154 + .storagebits = 16, \ 155 + .endianness = IIO_CPU \ 156 + }, \ 157 + .indexed = 1, \ 158 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE) \ 159 + } 160 + 161 + static const struct iio_chan_spec mt6357_auxadc_channels[] = { 162 + MTK_PMIC_IIO_CHAN(MT6357, bat_adc, BATADC, 0, 15, IIO_RESISTANCE), 163 + MTK_PMIC_IIO_CHAN(MT6357, isense, ISENSE, 1, 12, IIO_CURRENT), 164 + MTK_PMIC_IIO_CHAN(MT6357, cdt_v, VCDT, 2, 12, IIO_TEMP), 165 + MTK_PMIC_IIO_CHAN(MT6357, batt_temp, BAT_TEMP, 3, 12, IIO_TEMP), 166 + MTK_PMIC_IIO_CHAN(MT6357, chip_temp, CHIP_TEMP, 4, 12, IIO_TEMP), 167 + MTK_PMIC_IIO_CHAN(MT6357, acc_det, ACCDET, 5, 12, IIO_RESISTANCE), 168 + MTK_PMIC_IIO_CHAN(MT6357, dcxo_v, VDCXO, 6, 12, IIO_VOLTAGE), 169 + MTK_PMIC_IIO_CHAN(MT6357, tsx_temp, TSX_TEMP, 7, 15, IIO_TEMP), 170 + MTK_PMIC_IIO_CHAN(MT6357, hp_ofs_cal, HPOFS_CAL, 9, 15, IIO_RESISTANCE), 171 + MTK_PMIC_IIO_CHAN(MT6357, dcxo_temp, DCXO_TEMP, 36, 15, IIO_TEMP), 172 + MTK_PMIC_IIO_CHAN(MT6357, vcore_temp, VCORE_TEMP, 40, 12, IIO_TEMP), 173 + MTK_PMIC_IIO_CHAN(MT6357, vproc_temp, VPROC_TEMP, 41, 12, IIO_TEMP), 174 + 175 + /* Battery impedance channels */ 176 + MTK_PMIC_IIO_CHAN(MT6357, batt_v, VBAT, 0, 15, IIO_VOLTAGE), 177 + }; 178 + 179 + static const struct mtk_pmic_auxadc_chan mt6357_auxadc_ch_desc[] = { 180 + MTK_PMIC_ADC_CHAN(BATADC, PMIC_AUXADC_RQST0, 0, 128, 3, 1), 181 + MTK_PMIC_ADC_CHAN(ISENSE, PMIC_AUXADC_RQST0, 0, 128, 3, 1), 182 + MTK_PMIC_ADC_CHAN(VCDT, PMIC_AUXADC_RQST0, 0, 8, 1, 1), 183 + MTK_PMIC_ADC_CHAN(BAT_TEMP, PMIC_AUXADC_RQST0, 3, 8, 1, 1), 184 + MTK_PMIC_ADC_CHAN(CHIP_TEMP, PMIC_AUXADC_RQST0, 4, 8, 1, 1), 185 + MTK_PMIC_ADC_CHAN(ACCDET, PMIC_AUXADC_RQST0, 5, 8, 1, 1), 186 + MTK_PMIC_ADC_CHAN(TSX_TEMP, PMIC_AUXADC_RQST0, 7, 128, 1, 1), 187 + MTK_PMIC_ADC_CHAN(HPOFS_CAL, PMIC_AUXADC_RQST0, 9, 256, 1, 1), 188 + MTK_PMIC_ADC_CHAN(DCXO_TEMP, PMIC_AUXADC_RQST0, 10, 16, 1, 1), 189 + MTK_PMIC_ADC_CHAN(VBIF, PMIC_AUXADC_RQST0, 11, 8, 1, 1), 190 + MTK_PMIC_ADC_CHAN(VCORE_TEMP, PMIC_AUXADC_RQST1, 5, 8, 1, 1), 191 + MTK_PMIC_ADC_CHAN(VPROC_TEMP, PMIC_AUXADC_RQST1, 6, 8, 1, 1), 192 + 193 + /* Battery impedance channels */ 194 + MTK_PMIC_ADC_CHAN(VBAT, 0, 0, 128, 3, 1), 195 + }; 196 + 197 + static const u16 mt6357_auxadc_regs[] = { 198 + [PMIC_HK_TOP_RST_CON0] = 0x0f90, 199 + [PMIC_AUXADC_DCM_CON] = 0x122e, 200 + [PMIC_AUXADC_ADC0] = 0x1088, 201 + [PMIC_AUXADC_IMP0] = 0x119c, 202 + [PMIC_AUXADC_IMP1] = 0x119e, 203 + [PMIC_AUXADC_RQST0] = 0x110e, 204 + [PMIC_AUXADC_RQST1] = 0x1114, 205 + }; 206 + 207 + static const struct iio_chan_spec mt6358_auxadc_channels[] = { 208 + MTK_PMIC_IIO_CHAN(MT6358, bat_adc, BATADC, 0, 15, IIO_RESISTANCE), 209 + MTK_PMIC_IIO_CHAN(MT6358, cdt_v, VCDT, 2, 12, IIO_TEMP), 210 + MTK_PMIC_IIO_CHAN(MT6358, batt_temp, BAT_TEMP, 3, 12, IIO_TEMP), 211 + MTK_PMIC_IIO_CHAN(MT6358, chip_temp, CHIP_TEMP, 4, 12, IIO_TEMP), 212 + MTK_PMIC_IIO_CHAN(MT6358, acc_det, ACCDET, 5, 12, IIO_RESISTANCE), 213 + MTK_PMIC_IIO_CHAN(MT6358, dcxo_v, VDCXO, 6, 12, IIO_VOLTAGE), 214 + MTK_PMIC_IIO_CHAN(MT6358, tsx_temp, TSX_TEMP, 7, 15, IIO_TEMP), 215 + MTK_PMIC_IIO_CHAN(MT6358, hp_ofs_cal, HPOFS_CAL, 9, 15, IIO_RESISTANCE), 216 + MTK_PMIC_IIO_CHAN(MT6358, dcxo_temp, DCXO_TEMP, 10, 15, IIO_TEMP), 217 + MTK_PMIC_IIO_CHAN(MT6358, bif_v, VBIF, 11, 12, IIO_VOLTAGE), 218 + MTK_PMIC_IIO_CHAN(MT6358, vcore_temp, VCORE_TEMP, 38, 12, IIO_TEMP), 219 + MTK_PMIC_IIO_CHAN(MT6358, vproc_temp, VPROC_TEMP, 39, 12, IIO_TEMP), 220 + MTK_PMIC_IIO_CHAN(MT6358, vgpu_temp, VGPU_TEMP, 40, 12, IIO_TEMP), 221 + 222 + /* Battery impedance channels */ 223 + MTK_PMIC_IIO_CHAN(MT6358, batt_v, VBAT, 0, 15, IIO_VOLTAGE), 224 + }; 225 + 226 + static const struct mtk_pmic_auxadc_chan mt6358_auxadc_ch_desc[] = { 227 + MTK_PMIC_ADC_CHAN(BATADC, PMIC_AUXADC_RQST0, 0, 128, 3, 1), 228 + MTK_PMIC_ADC_CHAN(VCDT, PMIC_AUXADC_RQST0, 0, 8, 1, 1), 229 + MTK_PMIC_ADC_CHAN(BAT_TEMP, PMIC_AUXADC_RQST0, 3, 8, 2, 1), 230 + MTK_PMIC_ADC_CHAN(CHIP_TEMP, PMIC_AUXADC_RQST0, 4, 8, 1, 1), 231 + MTK_PMIC_ADC_CHAN(ACCDET, PMIC_AUXADC_RQST0, 5, 8, 1, 1), 232 + MTK_PMIC_ADC_CHAN(VDCXO, PMIC_AUXADC_RQST0, 6, 8, 3, 2), 233 + MTK_PMIC_ADC_CHAN(TSX_TEMP, PMIC_AUXADC_RQST0, 7, 128, 1, 1), 234 + MTK_PMIC_ADC_CHAN(HPOFS_CAL, PMIC_AUXADC_RQST0, 9, 256, 1, 1), 235 + MTK_PMIC_ADC_CHAN(DCXO_TEMP, PMIC_AUXADC_RQST0, 10, 16, 1, 1), 236 + MTK_PMIC_ADC_CHAN(VBIF, PMIC_AUXADC_RQST0, 11, 8, 2, 1), 237 + MTK_PMIC_ADC_CHAN(VCORE_TEMP, PMIC_AUXADC_RQST1, 8, 8, 1, 1), 238 + MTK_PMIC_ADC_CHAN(VPROC_TEMP, PMIC_AUXADC_RQST1, 9, 8, 1, 1), 239 + MTK_PMIC_ADC_CHAN(VGPU_TEMP, PMIC_AUXADC_RQST1, 10, 8, 1, 1), 240 + 241 + /* Battery impedance channels */ 242 + MTK_PMIC_ADC_CHAN(VBAT, 0, 0, 128, 7, 2), 243 + }; 244 + 245 + static const u16 mt6358_auxadc_regs[] = { 246 + [PMIC_HK_TOP_RST_CON0] = 0x0f90, 247 + [PMIC_AUXADC_DCM_CON] = 0x1260, 248 + [PMIC_AUXADC_ADC0] = 0x1088, 249 + [PMIC_AUXADC_IMP0] = 0x1208, 250 + [PMIC_AUXADC_IMP1] = 0x120a, 251 + [PMIC_AUXADC_RQST0] = 0x1108, 252 + [PMIC_AUXADC_RQST1] = 0x110a, 253 + }; 254 + 255 + static const struct iio_chan_spec mt6359_auxadc_channels[] = { 256 + MTK_PMIC_IIO_CHAN(MT6359, bat_adc, BATADC, 0, 15, IIO_RESISTANCE), 257 + MTK_PMIC_IIO_CHAN(MT6359, batt_temp, BAT_TEMP, 3, 12, IIO_TEMP), 258 + MTK_PMIC_IIO_CHAN(MT6359, chip_temp, CHIP_TEMP, 4, 12, IIO_TEMP), 259 + MTK_PMIC_IIO_CHAN(MT6359, acc_det, ACCDET, 5, 12, IIO_RESISTANCE), 260 + MTK_PMIC_IIO_CHAN(MT6359, dcxo_v, VDCXO, 6, 12, IIO_VOLTAGE), 261 + MTK_PMIC_IIO_CHAN(MT6359, tsx_temp, TSX_TEMP, 7, 15, IIO_TEMP), 262 + MTK_PMIC_IIO_CHAN(MT6359, hp_ofs_cal, HPOFS_CAL, 9, 15, IIO_RESISTANCE), 263 + MTK_PMIC_IIO_CHAN(MT6359, dcxo_temp, DCXO_TEMP, 10, 15, IIO_TEMP), 264 + MTK_PMIC_IIO_CHAN(MT6359, bif_v, VBIF, 11, 12, IIO_VOLTAGE), 265 + MTK_PMIC_IIO_CHAN(MT6359, vcore_temp, VCORE_TEMP, 30, 12, IIO_TEMP), 266 + MTK_PMIC_IIO_CHAN(MT6359, vproc_temp, VPROC_TEMP, 31, 12, IIO_TEMP), 267 + MTK_PMIC_IIO_CHAN(MT6359, vgpu_temp, VGPU_TEMP, 32, 12, IIO_TEMP), 268 + 269 + /* Battery impedance channels */ 270 + MTK_PMIC_IIO_CHAN(MT6359, batt_v, VBAT, 0, 15, IIO_VOLTAGE), 271 + MTK_PMIC_IIO_CHAN(MT6359, batt_i, IBAT, 0, 15, IIO_CURRENT), 272 + }; 273 + 274 + static const struct mtk_pmic_auxadc_chan mt6359_auxadc_ch_desc[] = { 275 + MTK_PMIC_ADC_CHAN(BATADC, PMIC_AUXADC_RQST0, 0, 128, 7, 2), 276 + MTK_PMIC_ADC_CHAN(BAT_TEMP, PMIC_AUXADC_RQST0, 3, 8, 5, 2), 277 + MTK_PMIC_ADC_CHAN(CHIP_TEMP, PMIC_AUXADC_RQST0, 4, 8, 1, 1), 278 + MTK_PMIC_ADC_CHAN(ACCDET, PMIC_AUXADC_RQST0, 5, 8, 1, 1), 279 + MTK_PMIC_ADC_CHAN(VDCXO, PMIC_AUXADC_RQST0, 6, 8, 3, 2), 280 + MTK_PMIC_ADC_CHAN(TSX_TEMP, PMIC_AUXADC_RQST0, 7, 128, 1, 1), 281 + MTK_PMIC_ADC_CHAN(HPOFS_CAL, PMIC_AUXADC_RQST0, 9, 256, 1, 1), 282 + MTK_PMIC_ADC_CHAN(DCXO_TEMP, PMIC_AUXADC_RQST0, 10, 16, 1, 1), 283 + MTK_PMIC_ADC_CHAN(VBIF, PMIC_AUXADC_RQST0, 11, 8, 5, 2), 284 + MTK_PMIC_ADC_CHAN(VCORE_TEMP, PMIC_AUXADC_RQST1, 8, 8, 1, 1), 285 + MTK_PMIC_ADC_CHAN(VPROC_TEMP, PMIC_AUXADC_RQST1, 9, 8, 1, 1), 286 + MTK_PMIC_ADC_CHAN(VGPU_TEMP, PMIC_AUXADC_RQST1, 10, 8, 1, 1), 287 + 288 + /* Battery impedance channels */ 289 + MTK_PMIC_ADC_CHAN(VBAT, 0, 0, 128, 7, 2), 290 + MTK_PMIC_ADC_CHAN(IBAT, 0, 0, 128, 7, 2), 291 + }; 292 + 293 + static const u16 mt6359_auxadc_regs[] = { 294 + [PMIC_FGADC_R_CON0] = 0x0d88, 295 + [PMIC_HK_TOP_WKEY] = 0x0fb4, 296 + [PMIC_HK_TOP_RST_CON0] = 0x0f90, 297 + [PMIC_AUXADC_RQST0] = 0x1108, 298 + [PMIC_AUXADC_RQST1] = 0x110a, 299 + [PMIC_AUXADC_ADC0] = 0x1088, 300 + [PMIC_AUXADC_IMP0] = 0x1208, 301 + [PMIC_AUXADC_IMP1] = 0x120a, 302 + [PMIC_AUXADC_IMP3] = 0x120e, 303 + }; 304 + 305 + static void mt6358_stop_imp_conv(struct mt6359_auxadc *adc_dev) 306 + { 307 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 308 + struct regmap *regmap = adc_dev->regmap; 309 + 310 + regmap_set_bits(regmap, cinfo->regs[PMIC_AUXADC_IMP0], MT6358_IMP0_CLEAR); 311 + regmap_clear_bits(regmap, cinfo->regs[PMIC_AUXADC_IMP0], MT6358_IMP0_CLEAR); 312 + regmap_clear_bits(regmap, cinfo->regs[PMIC_AUXADC_IMP1], MT6358_IMP1_AUTOREPEAT_EN); 313 + regmap_clear_bits(regmap, cinfo->regs[PMIC_AUXADC_DCM_CON], MT6358_DCM_CK_SW_EN); 314 + } 315 + 316 + static int mt6358_start_imp_conv(struct mt6359_auxadc *adc_dev) 317 + { 318 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 319 + struct regmap *regmap = adc_dev->regmap; 320 + u32 val; 321 + int ret; 322 + 323 + regmap_set_bits(regmap, cinfo->regs[PMIC_AUXADC_DCM_CON], MT6358_DCM_CK_SW_EN); 324 + regmap_set_bits(regmap, cinfo->regs[PMIC_AUXADC_IMP1], MT6358_IMP1_AUTOREPEAT_EN); 325 + 326 + ret = regmap_read_poll_timeout(adc_dev->regmap, cinfo->regs[PMIC_AUXADC_IMP0], 327 + val, val & MT6358_IMP0_IRQ_RDY, 328 + IMP_POLL_DELAY_US, AUXADC_TIMEOUT_US); 329 + if (ret) { 330 + mt6358_stop_imp_conv(adc_dev); 331 + return ret; 332 + } 333 + 334 + return 0; 335 + } 336 + 337 + static int mt6358_read_imp(struct mt6359_auxadc *adc_dev, int *vbat, int *ibat) 338 + { 339 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 340 + struct regmap *regmap = adc_dev->regmap; 341 + u16 reg_adc0 = cinfo->regs[PMIC_AUXADC_ADC0]; 342 + u32 val_v; 343 + int ret; 344 + 345 + ret = mt6358_start_imp_conv(adc_dev); 346 + if (ret) 347 + return ret; 348 + 349 + /* Read the params before stopping */ 350 + regmap_read(regmap, reg_adc0 + (cinfo->imp_adc_num << 1), &val_v); 351 + 352 + mt6358_stop_imp_conv(adc_dev); 353 + 354 + if (vbat) 355 + *vbat = val_v; 356 + if (ibat) 357 + *ibat = 0; 358 + 359 + return 0; 360 + } 361 + 362 + static int mt6359_read_imp(struct mt6359_auxadc *adc_dev, int *vbat, int *ibat) 363 + { 364 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 365 + struct regmap *regmap = adc_dev->regmap; 366 + u32 val, val_v, val_i; 367 + int ret; 368 + 369 + /* Start conversion */ 370 + regmap_write(regmap, cinfo->regs[PMIC_AUXADC_IMP0], MT6359_IMP0_CONV_EN); 371 + ret = regmap_read_poll_timeout(regmap, cinfo->regs[PMIC_AUXADC_IMP1], 372 + val, val & MT6359_IMP1_IRQ_RDY, 373 + IMP_POLL_DELAY_US, AUXADC_TIMEOUT_US); 374 + 375 + /* Stop conversion regardless of the result */ 376 + regmap_write(regmap, cinfo->regs[PMIC_AUXADC_IMP0], 0); 377 + if (ret) 378 + return ret; 379 + 380 + /* If it succeeded, wait for the registers to be populated */ 381 + fsleep(IMP_STOP_DELAY_US); 382 + 383 + ret = regmap_read(regmap, cinfo->regs[PMIC_AUXADC_IMP3], &val_v); 384 + if (ret) 385 + return ret; 386 + 387 + ret = regmap_read(regmap, cinfo->regs[PMIC_FGADC_R_CON0], &val_i); 388 + if (ret) 389 + return ret; 390 + 391 + if (vbat) 392 + *vbat = val_v; 393 + if (ibat) 394 + *ibat = val_i; 395 + 396 + return 0; 397 + } 398 + 399 + static const struct mtk_pmic_auxadc_info mt6357_chip_info = { 400 + .model_name = "MT6357", 401 + .channels = mt6357_auxadc_channels, 402 + .num_channels = ARRAY_SIZE(mt6357_auxadc_channels), 403 + .desc = mt6357_auxadc_ch_desc, 404 + .regs = mt6357_auxadc_regs, 405 + .imp_adc_num = MT6357_IMP_ADC_NUM, 406 + .read_imp = mt6358_read_imp, 407 + }; 408 + 409 + static const struct mtk_pmic_auxadc_info mt6358_chip_info = { 410 + .model_name = "MT6358", 411 + .channels = mt6358_auxadc_channels, 412 + .num_channels = ARRAY_SIZE(mt6358_auxadc_channels), 413 + .desc = mt6358_auxadc_ch_desc, 414 + .regs = mt6358_auxadc_regs, 415 + .imp_adc_num = MT6358_IMP_ADC_NUM, 416 + .read_imp = mt6358_read_imp, 417 + }; 418 + 419 + static const struct mtk_pmic_auxadc_info mt6359_chip_info = { 420 + .model_name = "MT6359", 421 + .channels = mt6359_auxadc_channels, 422 + .num_channels = ARRAY_SIZE(mt6359_auxadc_channels), 423 + .desc = mt6359_auxadc_ch_desc, 424 + .regs = mt6359_auxadc_regs, 425 + .sec_unlock_key = 0x6359, 426 + .read_imp = mt6359_read_imp, 427 + }; 428 + 429 + static void mt6359_auxadc_reset(struct mt6359_auxadc *adc_dev) 430 + { 431 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 432 + struct regmap *regmap = adc_dev->regmap; 433 + 434 + /* Unlock HK_TOP writes */ 435 + if (cinfo->sec_unlock_key) 436 + regmap_write(regmap, cinfo->regs[PMIC_HK_TOP_WKEY], cinfo->sec_unlock_key); 437 + 438 + /* Assert ADC reset */ 439 + regmap_set_bits(regmap, cinfo->regs[PMIC_HK_TOP_RST_CON0], PMIC_RG_RESET_VAL); 440 + 441 + /* De-assert ADC reset. No wait required, as pwrap takes care of that for us. */ 442 + regmap_clear_bits(regmap, cinfo->regs[PMIC_HK_TOP_RST_CON0], PMIC_RG_RESET_VAL); 443 + 444 + /* Lock HK_TOP writes again */ 445 + if (cinfo->sec_unlock_key) 446 + regmap_write(regmap, cinfo->regs[PMIC_HK_TOP_WKEY], 0); 447 + } 448 + 449 + static int mt6359_auxadc_read_adc(struct mt6359_auxadc *adc_dev, 450 + const struct iio_chan_spec *chan, int *out) 451 + { 452 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 453 + const struct mtk_pmic_auxadc_chan *desc = &cinfo->desc[chan->scan_index]; 454 + struct regmap *regmap = adc_dev->regmap; 455 + u32 val; 456 + int ret; 457 + 458 + /* Request to start sampling for ADC channel */ 459 + ret = regmap_write(regmap, cinfo->regs[desc->req_idx], desc->req_mask); 460 + if (ret) 461 + return ret; 462 + 463 + /* Wait until all samples are averaged */ 464 + fsleep(desc->num_samples * AUXADC_AVG_TIME_US); 465 + 466 + ret = regmap_read_poll_timeout(regmap, 467 + cinfo->regs[PMIC_AUXADC_ADC0] + (chan->address << 1), 468 + val, val & PMIC_AUXADC_RDY_BIT, 469 + AUXADC_POLL_DELAY_US, AUXADC_TIMEOUT_US); 470 + if (ret) 471 + return ret; 472 + 473 + /* Stop sampling */ 474 + regmap_write(regmap, cinfo->regs[desc->req_idx], 0); 475 + 476 + *out = val & GENMASK(chan->scan_type.realbits - 1, 0); 477 + return 0; 478 + } 479 + 480 + static int mt6359_auxadc_read_label(struct iio_dev *indio_dev, 481 + const struct iio_chan_spec *chan, char *label) 482 + { 483 + return sysfs_emit(label, "%s\n", chan->datasheet_name); 484 + } 485 + 486 + static int mt6359_auxadc_read_raw(struct iio_dev *indio_dev, 487 + const struct iio_chan_spec *chan, 488 + int *val, int *val2, long mask) 489 + { 490 + struct mt6359_auxadc *adc_dev = iio_priv(indio_dev); 491 + const struct mtk_pmic_auxadc_info *cinfo = adc_dev->chip_info; 492 + const struct mtk_pmic_auxadc_chan *desc = &cinfo->desc[chan->scan_index]; 493 + int ret; 494 + 495 + if (mask == IIO_CHAN_INFO_SCALE) { 496 + *val = desc->r_ratio.numerator * AUXADC_VOLT_FULL; 497 + 498 + if (desc->r_ratio.denominator > 1) { 499 + *val2 = desc->r_ratio.denominator; 500 + return IIO_VAL_FRACTIONAL; 501 + } 502 + 503 + return IIO_VAL_INT; 504 + } 505 + 506 + scoped_guard(mutex, &adc_dev->lock) { 507 + switch (chan->scan_index) { 508 + case PMIC_AUXADC_CHAN_IBAT: 509 + ret = adc_dev->chip_info->read_imp(adc_dev, NULL, val); 510 + break; 511 + case PMIC_AUXADC_CHAN_VBAT: 512 + ret = adc_dev->chip_info->read_imp(adc_dev, val, NULL); 513 + break; 514 + default: 515 + ret = mt6359_auxadc_read_adc(adc_dev, chan, val); 516 + break; 517 + } 518 + } 519 + 520 + if (ret) { 521 + /* 522 + * If we get more than one timeout, it's possible that the 523 + * AUXADC is stuck: perform a full reset to recover it. 524 + */ 525 + if (ret == -ETIMEDOUT) { 526 + if (adc_dev->timed_out) { 527 + dev_warn(adc_dev->dev, "Resetting stuck ADC!\r\n"); 528 + mt6359_auxadc_reset(adc_dev); 529 + } 530 + adc_dev->timed_out = true; 531 + } 532 + return ret; 533 + } 534 + adc_dev->timed_out = false; 535 + 536 + return IIO_VAL_INT; 537 + } 538 + 539 + static const struct iio_info mt6359_auxadc_iio_info = { 540 + .read_label = mt6359_auxadc_read_label, 541 + .read_raw = mt6359_auxadc_read_raw, 542 + }; 543 + 544 + static int mt6359_auxadc_probe(struct platform_device *pdev) 545 + { 546 + struct device *dev = &pdev->dev; 547 + struct device *mt6397_mfd_dev = dev->parent; 548 + struct mt6359_auxadc *adc_dev; 549 + struct iio_dev *indio_dev; 550 + struct regmap *regmap; 551 + int ret; 552 + 553 + /* Regmap is from SoC PMIC Wrapper, parent of the mt6397 MFD */ 554 + regmap = dev_get_regmap(mt6397_mfd_dev->parent, NULL); 555 + if (!regmap) 556 + return dev_err_probe(dev, -ENODEV, "Failed to get regmap\n"); 557 + 558 + indio_dev = devm_iio_device_alloc(dev, sizeof(*adc_dev)); 559 + if (!indio_dev) 560 + return -ENOMEM; 561 + 562 + adc_dev = iio_priv(indio_dev); 563 + adc_dev->regmap = regmap; 564 + adc_dev->dev = dev; 565 + 566 + adc_dev->chip_info = device_get_match_data(dev); 567 + if (!adc_dev->chip_info) 568 + return -EINVAL; 569 + 570 + mutex_init(&adc_dev->lock); 571 + 572 + mt6359_auxadc_reset(adc_dev); 573 + 574 + indio_dev->name = adc_dev->chip_info->model_name; 575 + indio_dev->info = &mt6359_auxadc_iio_info; 576 + indio_dev->modes = INDIO_DIRECT_MODE; 577 + indio_dev->channels = adc_dev->chip_info->channels; 578 + indio_dev->num_channels = adc_dev->chip_info->num_channels; 579 + 580 + ret = devm_iio_device_register(dev, indio_dev); 581 + if (ret) 582 + return dev_err_probe(dev, ret, "failed to register iio device\n"); 583 + 584 + return 0; 585 + } 586 + 587 + static const struct of_device_id mt6359_auxadc_of_match[] = { 588 + { .compatible = "mediatek,mt6357-auxadc", .data = &mt6357_chip_info }, 589 + { .compatible = "mediatek,mt6358-auxadc", .data = &mt6358_chip_info }, 590 + { .compatible = "mediatek,mt6359-auxadc", .data = &mt6359_chip_info }, 591 + { /* sentinel */ } 592 + }; 593 + MODULE_DEVICE_TABLE(of, mt6359_auxadc_of_match); 594 + 595 + static struct platform_driver mt6359_auxadc_driver = { 596 + .driver = { 597 + .name = "mt6359-auxadc", 598 + .of_match_table = mt6359_auxadc_of_match, 599 + }, 600 + .probe = mt6359_auxadc_probe, 601 + }; 602 + module_platform_driver(mt6359_auxadc_driver); 603 + 604 + MODULE_LICENSE("GPL"); 605 + MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>"); 606 + MODULE_DESCRIPTION("MediaTek MT6359 PMIC AUXADC Driver");
+24 -26
drivers/iio/adc/qcom-spmi-rradc.c
··· 358 358 int ret; 359 359 360 360 /* Clear channel log */ 361 - ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_LOG, 362 - RR_ADC_LOG_CLR_CTRL, RR_ADC_LOG_CLR_CTRL); 361 + ret = regmap_set_bits(chip->regmap, chip->base + RR_ADC_LOG, 362 + RR_ADC_LOG_CLR_CTRL); 363 363 if (ret < 0) { 364 364 dev_err(chip->dev, "log ctrl update to clear failed:%d\n", ret); 365 365 return ret; 366 366 } 367 367 368 - ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_LOG, 369 - RR_ADC_LOG_CLR_CTRL, 0); 368 + ret = regmap_clear_bits(chip->regmap, chip->base + RR_ADC_LOG, 369 + RR_ADC_LOG_CLR_CTRL); 370 370 if (ret < 0) { 371 371 dev_err(chip->dev, "log ctrl update to not clear failed:%d\n", 372 372 ret); ··· 374 374 } 375 375 376 376 /* Switch to continuous mode */ 377 - ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_CTL, 378 - RR_ADC_CTL_CONTINUOUS_SEL, 379 - RR_ADC_CTL_CONTINUOUS_SEL); 377 + ret = regmap_set_bits(chip->regmap, chip->base + RR_ADC_CTL, 378 + RR_ADC_CTL_CONTINUOUS_SEL); 380 379 if (ret < 0) 381 380 dev_err(chip->dev, "Update to continuous mode failed:%d\n", 382 381 ret); ··· 388 389 int ret; 389 390 390 391 /* Switch to non continuous mode */ 391 - ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_CTL, 392 - RR_ADC_CTL_CONTINUOUS_SEL, 0); 392 + ret = regmap_clear_bits(chip->regmap, chip->base + RR_ADC_CTL, 393 + RR_ADC_CTL_CONTINUOUS_SEL); 393 394 if (ret < 0) 394 395 dev_err(chip->dev, "Update to non-continuous mode failed:%d\n", 395 396 ret); ··· 433 434 return -EINVAL; 434 435 } 435 436 436 - ret = regmap_update_bits(chip->regmap, chip->base + chan->trigger_addr, 437 - chan->trigger_mask, chan->trigger_mask); 437 + ret = regmap_set_bits(chip->regmap, chip->base + chan->trigger_addr, 438 + chan->trigger_mask); 438 439 if (ret < 0) { 439 440 dev_err(chip->dev, 440 441 "Failed to apply trigger for channel '%s' ret=%d\n", ··· 468 469 rradc_disable_continuous_mode(chip); 469 470 470 471 disable_trigger: 471 - regmap_update_bits(chip->regmap, chip->base + chan->trigger_addr, 472 - chan->trigger_mask, 0); 472 + regmap_clear_bits(chip->regmap, chip->base + chan->trigger_addr, 473 + chan->trigger_mask); 473 474 474 475 return ret; 475 476 } ··· 480 481 { 481 482 int ret; 482 483 483 - ret = regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, 484 - RR_ADC_BATT_ID_CTRL_CHANNEL_CONV, 485 - RR_ADC_BATT_ID_CTRL_CHANNEL_CONV); 484 + ret = regmap_set_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, 485 + RR_ADC_BATT_ID_CTRL_CHANNEL_CONV); 486 486 if (ret < 0) { 487 487 dev_err(chip->dev, "Enabling BATT ID channel failed:%d\n", ret); 488 488 return ret; 489 489 } 490 490 491 - ret = regmap_update_bits(chip->regmap, 492 - chip->base + RR_ADC_BATT_ID_TRIGGER, 493 - RR_ADC_TRIGGER_CTL, RR_ADC_TRIGGER_CTL); 491 + ret = regmap_set_bits(chip->regmap, 492 + chip->base + RR_ADC_BATT_ID_TRIGGER, 493 + RR_ADC_TRIGGER_CTL); 494 494 if (ret < 0) { 495 495 dev_err(chip->dev, "BATT_ID trigger set failed:%d\n", ret); 496 496 goto out_disable_batt_id; ··· 498 500 ret = rradc_read_status_in_cont_mode(chip, chan_address); 499 501 500 502 /* Reset registers back to default values */ 501 - regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_TRIGGER, 502 - RR_ADC_TRIGGER_CTL, 0); 503 + regmap_clear_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_TRIGGER, 504 + RR_ADC_TRIGGER_CTL); 503 505 504 506 out_disable_batt_id: 505 - regmap_update_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, 506 - RR_ADC_BATT_ID_CTRL_CHANNEL_CONV, 0); 507 + regmap_clear_bits(chip->regmap, chip->base + RR_ADC_BATT_ID_CTRL, 508 + RR_ADC_BATT_ID_CTRL_CHANNEL_CONV); 507 509 508 510 return ret; 509 511 } ··· 963 965 964 966 if (batt_id_delay >= 0) { 965 967 batt_id_delay = FIELD_PREP(BATT_ID_SETTLE_MASK, batt_id_delay); 966 - ret = regmap_update_bits(chip->regmap, 967 - chip->base + RR_ADC_BATT_ID_CFG, 968 - batt_id_delay, batt_id_delay); 968 + ret = regmap_set_bits(chip->regmap, 969 + chip->base + RR_ADC_BATT_ID_CFG, 970 + batt_id_delay); 969 971 if (ret < 0) { 970 972 dev_err(chip->dev, 971 973 "BATT_ID settling time config failed:%d\n",
+2 -3
drivers/iio/adc/rn5t618-adc.c
··· 137 137 138 138 init_completion(&adc->conv_completion); 139 139 /* single conversion */ 140 - ret = regmap_update_bits(adc->rn5t618->regmap, RN5T618_ADCCNT3, 141 - RN5T618_ADCCNT3_GODONE, 142 - RN5T618_ADCCNT3_GODONE); 140 + ret = regmap_set_bits(adc->rn5t618->regmap, RN5T618_ADCCNT3, 141 + RN5T618_ADCCNT3_GODONE); 143 142 if (ret < 0) 144 143 return ret; 145 144
+20 -21
drivers/iio/adc/sc27xx_adc.c
··· 508 508 } 509 509 } 510 510 511 - ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL, 512 - SC27XX_ADC_EN, SC27XX_ADC_EN); 511 + ret = regmap_set_bits(data->regmap, data->base + SC27XX_ADC_CTL, 512 + SC27XX_ADC_EN); 513 513 if (ret) 514 514 goto regulator_restore; 515 515 516 - ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR, 517 - SC27XX_ADC_IRQ_CLR, SC27XX_ADC_IRQ_CLR); 516 + ret = regmap_set_bits(data->regmap, data->base + SC27XX_ADC_INT_CLR, 517 + SC27XX_ADC_IRQ_CLR); 518 518 if (ret) 519 519 goto disable_adc; 520 520 ··· 537 537 if (ret) 538 538 goto disable_adc; 539 539 540 - ret = regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL, 541 - SC27XX_ADC_CHN_RUN, SC27XX_ADC_CHN_RUN); 540 + ret = regmap_set_bits(data->regmap, data->base + SC27XX_ADC_CTL, 541 + SC27XX_ADC_CHN_RUN); 542 542 if (ret) 543 543 goto disable_adc; 544 544 ··· 559 559 value &= SC27XX_ADC_DATA_MASK; 560 560 561 561 disable_adc: 562 - regmap_update_bits(data->regmap, data->base + SC27XX_ADC_CTL, 563 - SC27XX_ADC_EN, 0); 562 + regmap_clear_bits(data->regmap, data->base + SC27XX_ADC_CTL, 563 + SC27XX_ADC_EN); 564 564 regulator_restore: 565 565 if ((data->var_data->set_volref) && (channel == 30 || channel == 31)) { 566 566 ret_volref = regulator_set_voltage(data->volref, ··· 765 765 { 766 766 int ret; 767 767 768 - ret = regmap_update_bits(data->regmap, data->var_data->module_en, 769 - SC27XX_MODULE_ADC_EN, SC27XX_MODULE_ADC_EN); 768 + ret = regmap_set_bits(data->regmap, data->var_data->module_en, 769 + SC27XX_MODULE_ADC_EN); 770 770 if (ret) 771 771 return ret; 772 772 773 773 /* Enable ADC work clock and controller clock */ 774 - ret = regmap_update_bits(data->regmap, data->var_data->clk_en, 775 - SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 776 - SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN); 774 + ret = regmap_set_bits(data->regmap, data->var_data->clk_en, 775 + SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN); 777 776 if (ret) 778 777 goto disable_adc; 779 778 ··· 788 789 return 0; 789 790 790 791 disable_clk: 791 - regmap_update_bits(data->regmap, data->var_data->clk_en, 792 - SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0); 792 + regmap_clear_bits(data->regmap, data->var_data->clk_en, 793 + SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN); 793 794 disable_adc: 794 - regmap_update_bits(data->regmap, data->var_data->module_en, 795 - SC27XX_MODULE_ADC_EN, 0); 795 + regmap_clear_bits(data->regmap, data->var_data->module_en, 796 + SC27XX_MODULE_ADC_EN); 796 797 797 798 return ret; 798 799 } ··· 802 803 struct sc27xx_adc_data *data = _data; 803 804 804 805 /* Disable ADC work clock and controller clock */ 805 - regmap_update_bits(data->regmap, data->var_data->clk_en, 806 - SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN, 0); 806 + regmap_clear_bits(data->regmap, data->var_data->clk_en, 807 + SC27XX_CLK_ADC_EN | SC27XX_CLK_ADC_CLK_EN); 807 808 808 - regmap_update_bits(data->regmap, data->var_data->module_en, 809 - SC27XX_MODULE_ADC_EN, 0); 809 + regmap_clear_bits(data->regmap, data->var_data->module_en, 810 + SC27XX_MODULE_ADC_EN); 810 811 } 811 812 812 813 static const struct sc27xx_adc_variant_data sc2731_data = {
+12 -17
drivers/iio/adc/stm32-dfsdm-adc.c
··· 759 759 return 0; 760 760 761 761 filter_unconfigure: 762 - regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), 763 - DFSDM_CR1_CFG_MASK, 0); 762 + regmap_clear_bits(regmap, DFSDM_CR1(adc->fl_id), DFSDM_CR1_CFG_MASK); 764 763 stop_channels: 765 764 stm32_dfsdm_stop_channel(indio_dev); 766 765 ··· 773 774 774 775 stm32_dfsdm_stop_filter(adc->dfsdm, adc->fl_id); 775 776 776 - regmap_update_bits(regmap, DFSDM_CR1(adc->fl_id), 777 - DFSDM_CR1_CFG_MASK, 0); 777 + regmap_clear_bits(regmap, DFSDM_CR1(adc->fl_id), DFSDM_CR1_CFG_MASK); 778 778 779 779 stm32_dfsdm_stop_channel(indio_dev); 780 780 } ··· 949 951 950 952 if (adc->nconv == 1 && !indio_dev->trig) { 951 953 /* Enable regular DMA transfer*/ 952 - ret = regmap_update_bits(adc->dfsdm->regmap, 953 - DFSDM_CR1(adc->fl_id), 954 - DFSDM_CR1_RDMAEN_MASK, 955 - DFSDM_CR1_RDMAEN_MASK); 954 + ret = regmap_set_bits(adc->dfsdm->regmap, 955 + DFSDM_CR1(adc->fl_id), 956 + DFSDM_CR1_RDMAEN_MASK); 956 957 } else { 957 958 /* Enable injected DMA transfer*/ 958 - ret = regmap_update_bits(adc->dfsdm->regmap, 959 - DFSDM_CR1(adc->fl_id), 960 - DFSDM_CR1_JDMAEN_MASK, 961 - DFSDM_CR1_JDMAEN_MASK); 959 + ret = regmap_set_bits(adc->dfsdm->regmap, 960 + DFSDM_CR1(adc->fl_id), 961 + DFSDM_CR1_JDMAEN_MASK); 962 962 } 963 963 964 964 if (ret < 0) ··· 977 981 if (!adc->dma_chan) 978 982 return; 979 983 980 - regmap_update_bits(adc->dfsdm->regmap, DFSDM_CR1(adc->fl_id), 981 - DFSDM_CR1_RDMAEN_MASK | DFSDM_CR1_JDMAEN_MASK, 0); 984 + regmap_clear_bits(adc->dfsdm->regmap, DFSDM_CR1(adc->fl_id), 985 + DFSDM_CR1_RDMAEN_MASK | DFSDM_CR1_JDMAEN_MASK); 982 986 dmaengine_terminate_all(adc->dma_chan); 983 987 } 984 988 ··· 1301 1305 if (status & DFSDM_ISR_ROVRF_MASK) { 1302 1306 if (int_en & DFSDM_CR2_ROVRIE_MASK) 1303 1307 dev_warn(&indio_dev->dev, "Overrun detected\n"); 1304 - regmap_update_bits(regmap, DFSDM_ICR(adc->fl_id), 1305 - DFSDM_ICR_CLRROVRF_MASK, 1306 - DFSDM_ICR_CLRROVRF_MASK); 1308 + regmap_set_bits(regmap, DFSDM_ICR(adc->fl_id), 1309 + DFSDM_ICR_CLRROVRF_MASK); 1307 1310 } 1308 1311 1309 1312 return IRQ_HANDLED;
+3 -25
drivers/iio/adc/ti-adc108s102.c
··· 58 58 59 59 struct adc108s102_state { 60 60 struct spi_device *spi; 61 - struct regulator *reg; 62 61 u32 va_millivolt; 63 62 /* SPI transfer used by triggered buffer handler*/ 64 63 struct spi_transfer ring_xfer; ··· 215 216 .update_scan_mode = &adc108s102_update_scan_mode, 216 217 }; 217 218 218 - static void adc108s102_reg_disable(void *reg) 219 - { 220 - regulator_disable(reg); 221 - } 222 - 223 219 static int adc108s102_probe(struct spi_device *spi) 224 220 { 225 221 struct adc108s102_state *st; ··· 230 236 if (ACPI_COMPANION(&spi->dev)) { 231 237 st->va_millivolt = ADC108S102_VA_MV_ACPI_DEFAULT; 232 238 } else { 233 - st->reg = devm_regulator_get(&spi->dev, "vref"); 234 - if (IS_ERR(st->reg)) 235 - return PTR_ERR(st->reg); 236 - 237 - ret = regulator_enable(st->reg); 238 - if (ret < 0) { 239 - dev_err(&spi->dev, "Cannot enable vref regulator\n"); 240 - return ret; 241 - } 242 - ret = devm_add_action_or_reset(&spi->dev, adc108s102_reg_disable, 243 - st->reg); 244 - if (ret) 245 - return ret; 246 - 247 - ret = regulator_get_voltage(st->reg); 248 - if (ret < 0) { 249 - dev_err(&spi->dev, "vref get voltage failed\n"); 250 - return ret; 251 - } 239 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); 240 + if (ret < 0) 241 + return dev_err_probe(&spi->dev, ret, "failed get vref voltage\n"); 252 242 253 243 st->va_millivolt = ret / 1000; 254 244 }
+825
drivers/iio/adc/ti-ads1119.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Texas Instruments ADS1119 ADC driver. 4 + * 5 + * Copyright 2024 Toradex 6 + */ 7 + 8 + #include <linux/bits.h> 9 + #include <linux/bitfield.h> 10 + #include <linux/completion.h> 11 + #include <linux/delay.h> 12 + #include <linux/dev_printk.h> 13 + #include <linux/err.h> 14 + #include <linux/gpio/consumer.h> 15 + #include <linux/interrupt.h> 16 + #include <linux/iopoll.h> 17 + #include <linux/i2c.h> 18 + #include <linux/kernel.h> 19 + #include <linux/math.h> 20 + #include <linux/module.h> 21 + #include <linux/pm_runtime.h> 22 + #include <linux/regulator/consumer.h> 23 + #include <linux/units.h> 24 + 25 + #include <linux/iio/iio.h> 26 + #include <linux/iio/buffer.h> 27 + #include <linux/iio/trigger.h> 28 + #include <linux/iio/triggered_buffer.h> 29 + #include <linux/iio/trigger_consumer.h> 30 + 31 + #define ADS1119_CMD_RESET 0x06 32 + #define ADS1119_CMD_POWERDOWN 0x02 33 + #define ADS1119_CMD_START_SYNC 0x08 34 + #define ADS1119_CMD_RDATA 0x10 35 + #define ADS1119_CMD_RREG_CONFIG 0x20 36 + #define ADS1119_CMD_RREG_STATUS 0x24 37 + #define ADS1119_CMD_WREG 0x40 38 + 39 + #define ADS1119_CMD_RREG(reg) (0x20 | (reg) << 2) 40 + 41 + /* Config register */ 42 + #define ADS1119_REG_CONFIG 0x00 43 + #define ADS1119_CONFIG_VREF_FIELD BIT(0) 44 + #define ADS1119_CONFIG_CM_FIELD BIT(1) 45 + #define ADS1119_CONFIG_DR_FIELD GENMASK(3, 2) 46 + #define ADS1119_CONFIG_GAIN_FIELD BIT(4) 47 + #define ADS1119_CONFIG_MUX_FIELD GENMASK(7, 5) 48 + 49 + #define ADS1119_VREF_INTERNAL 0 50 + #define ADS1119_VREF_EXTERNAL 1 51 + #define ADS1119_VREF_INTERNAL_VAL 2048000 52 + 53 + #define ADS1119_CM_SINGLE 0 54 + #define ADS1119_CM_CONTINUOUS 1 55 + 56 + #define ADS1119_DR_20_SPS 0 57 + #define ADS1119_DR_90_SPS 1 58 + #define ADS1119_DR_330_SPS 2 59 + #define ADS1119_DR_1000_SPS 3 60 + 61 + #define ADS1119_GAIN_1 0 62 + #define ADS1119_GAIN_4 1 63 + 64 + #define ADS1119_MUX_AIN0_AIN1 0 65 + #define ADS1119_MUX_AIN2_AIN3 1 66 + #define ADS1119_MUX_AIN1_AIN2 2 67 + #define ADS1119_MUX_AIN0 3 68 + #define ADS1119_MUX_AIN1 4 69 + #define ADS1119_MUX_AIN2 5 70 + #define ADS1119_MUX_AIN3 6 71 + #define ADS1119_MUX_SHORTED 7 72 + 73 + /* Status register */ 74 + #define ADS1119_REG_STATUS 0x01 75 + #define ADS1119_STATUS_DRDY_FIELD BIT(7) 76 + 77 + #define ADS1119_DEFAULT_GAIN 1 78 + #define ADS1119_DEFAULT_DATARATE 20 79 + 80 + #define ADS1119_SUSPEND_DELAY 2000 81 + 82 + /* Timeout based on the minimum sample rate of 20 SPS (50000us) */ 83 + #define ADS1119_MAX_DRDY_TIMEOUT 85000 84 + 85 + #define ADS1119_MAX_CHANNELS 7 86 + #define ADS1119_MAX_SINGLE_CHANNELS 4 87 + 88 + struct ads1119_channel_config { 89 + int gain; 90 + int datarate; 91 + int mux; 92 + }; 93 + 94 + struct ads1119_state { 95 + struct completion completion; 96 + struct i2c_client *client; 97 + struct gpio_desc *reset_gpio; 98 + struct iio_trigger *trig; 99 + struct ads1119_channel_config *channels_cfg; 100 + unsigned int num_channels_cfg; 101 + unsigned int cached_config; 102 + int vref_uV; 103 + }; 104 + 105 + static const char * const ads1119_power_supplies[] = { 106 + "avdd", "dvdd" 107 + }; 108 + 109 + static const int ads1119_available_datarates[] = { 110 + 20, 90, 330, 1000, 111 + }; 112 + 113 + static const int ads1119_available_gains[] = { 114 + 1, 1, 115 + 1, 4, 116 + }; 117 + 118 + static int ads1119_upd_cfg_reg(struct ads1119_state *st, unsigned int fields, 119 + unsigned int val) 120 + { 121 + unsigned int config = st->cached_config; 122 + int ret; 123 + 124 + config &= ~fields; 125 + config |= val; 126 + 127 + ret = i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG, config); 128 + if (ret) 129 + return ret; 130 + 131 + st->cached_config = config; 132 + 133 + return 0; 134 + } 135 + 136 + static bool ads1119_data_ready(struct ads1119_state *st) 137 + { 138 + int status; 139 + 140 + status = i2c_smbus_read_byte_data(st->client, ADS1119_CMD_RREG_STATUS); 141 + if (status < 0) 142 + return false; 143 + 144 + return FIELD_GET(ADS1119_STATUS_DRDY_FIELD, status); 145 + } 146 + 147 + static int ads1119_reset(struct ads1119_state *st) 148 + { 149 + st->cached_config = 0; 150 + 151 + if (!st->reset_gpio) 152 + return i2c_smbus_write_byte(st->client, ADS1119_CMD_RESET); 153 + 154 + gpiod_set_value_cansleep(st->reset_gpio, 1); 155 + udelay(1); 156 + gpiod_set_value_cansleep(st->reset_gpio, 0); 157 + udelay(1); 158 + 159 + return 0; 160 + } 161 + 162 + static int ads1119_set_conv_mode(struct ads1119_state *st, bool continuous) 163 + { 164 + unsigned int mode; 165 + 166 + if (continuous) 167 + mode = ADS1119_CM_CONTINUOUS; 168 + else 169 + mode = ADS1119_CM_SINGLE; 170 + 171 + return ads1119_upd_cfg_reg(st, ADS1119_CONFIG_CM_FIELD, 172 + FIELD_PREP(ADS1119_CONFIG_CM_FIELD, mode)); 173 + } 174 + 175 + static int ads1119_get_hw_gain(int gain) 176 + { 177 + if (gain == 4) 178 + return ADS1119_GAIN_4; 179 + else 180 + return ADS1119_GAIN_1; 181 + } 182 + 183 + static int ads1119_get_hw_datarate(int datarate) 184 + { 185 + switch (datarate) { 186 + case 90: 187 + return ADS1119_DR_90_SPS; 188 + case 330: 189 + return ADS1119_DR_330_SPS; 190 + case 1000: 191 + return ADS1119_DR_1000_SPS; 192 + case 20: 193 + default: 194 + return ADS1119_DR_20_SPS; 195 + } 196 + } 197 + 198 + static int ads1119_configure_channel(struct ads1119_state *st, int mux, 199 + int gain, int datarate) 200 + { 201 + int ret; 202 + 203 + ret = ads1119_upd_cfg_reg(st, ADS1119_CONFIG_MUX_FIELD, 204 + FIELD_PREP(ADS1119_CONFIG_MUX_FIELD, mux)); 205 + if (ret) 206 + return ret; 207 + 208 + ret = ads1119_upd_cfg_reg(st, ADS1119_CONFIG_GAIN_FIELD, 209 + FIELD_PREP(ADS1119_CONFIG_GAIN_FIELD, 210 + ads1119_get_hw_gain(gain))); 211 + if (ret) 212 + return ret; 213 + 214 + return ads1119_upd_cfg_reg(st, ADS1119_CONFIG_DR_FIELD, 215 + FIELD_PREP(ADS1119_CONFIG_DR_FIELD, 216 + ads1119_get_hw_datarate(datarate))); 217 + } 218 + 219 + static int ads1119_poll_data_ready(struct ads1119_state *st, 220 + struct iio_chan_spec const *chan) 221 + { 222 + unsigned int datarate = st->channels_cfg[chan->address].datarate; 223 + unsigned long wait_time; 224 + bool data_ready; 225 + 226 + /* Poll 5 times more than the data rate */ 227 + wait_time = DIV_ROUND_CLOSEST(MICRO, 5 * datarate); 228 + 229 + return read_poll_timeout(ads1119_data_ready, data_ready, 230 + data_ready, wait_time, 231 + ADS1119_MAX_DRDY_TIMEOUT, false, st); 232 + } 233 + 234 + static int ads1119_read_data(struct ads1119_state *st, 235 + struct iio_chan_spec const *chan, 236 + unsigned int *val) 237 + { 238 + unsigned int timeout; 239 + int ret = 0; 240 + 241 + timeout = msecs_to_jiffies(ADS1119_MAX_DRDY_TIMEOUT); 242 + 243 + if (!st->client->irq) { 244 + ret = ads1119_poll_data_ready(st, chan); 245 + if (ret) 246 + return ret; 247 + } else if (!wait_for_completion_timeout(&st->completion, timeout)) { 248 + return -ETIMEDOUT; 249 + } 250 + 251 + ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA); 252 + if (ret < 0) 253 + return ret; 254 + 255 + *val = ret; 256 + 257 + return 0; 258 + } 259 + 260 + static int ads1119_single_conversion(struct ads1119_state *st, 261 + struct iio_chan_spec const *chan, 262 + int *val, 263 + bool calib_offset) 264 + { 265 + struct device *dev = &st->client->dev; 266 + int mux = st->channels_cfg[chan->address].mux; 267 + int gain = st->channels_cfg[chan->address].gain; 268 + int datarate = st->channels_cfg[chan->address].datarate; 269 + unsigned int sample; 270 + int ret; 271 + 272 + if (calib_offset) 273 + mux = ADS1119_MUX_SHORTED; 274 + 275 + ret = pm_runtime_resume_and_get(dev); 276 + if (ret) 277 + goto pdown; 278 + 279 + ret = ads1119_configure_channel(st, mux, gain, datarate); 280 + if (ret) 281 + goto pdown; 282 + 283 + ret = i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC); 284 + if (ret) 285 + goto pdown; 286 + 287 + ret = ads1119_read_data(st, chan, &sample); 288 + if (ret) 289 + goto pdown; 290 + 291 + *val = sign_extend32(sample, chan->scan_type.realbits - 1); 292 + ret = IIO_VAL_INT; 293 + pdown: 294 + pm_runtime_mark_last_busy(dev); 295 + pm_runtime_put_autosuspend(dev); 296 + return ret; 297 + } 298 + 299 + static int ads1119_validate_datarate(struct ads1119_state *st, int datarate) 300 + { 301 + switch (datarate) { 302 + case 20: 303 + case 90: 304 + case 330: 305 + case 1000: 306 + return datarate; 307 + default: 308 + return -EINVAL; 309 + } 310 + } 311 + 312 + static int ads1119_read_avail(struct iio_dev *indio_dev, 313 + struct iio_chan_spec const *chan, 314 + const int **vals, int *type, int *length, 315 + long mask) 316 + { 317 + switch (mask) { 318 + case IIO_CHAN_INFO_SCALE: 319 + *type = IIO_VAL_FRACTIONAL; 320 + *vals = ads1119_available_gains; 321 + *length = ARRAY_SIZE(ads1119_available_gains); 322 + return IIO_AVAIL_LIST; 323 + case IIO_CHAN_INFO_SAMP_FREQ: 324 + *type = IIO_VAL_INT; 325 + *vals = ads1119_available_datarates; 326 + *length = ARRAY_SIZE(ads1119_available_datarates); 327 + return IIO_AVAIL_LIST; 328 + default: 329 + return -EINVAL; 330 + } 331 + } 332 + 333 + static int ads1119_read_raw(struct iio_dev *indio_dev, 334 + struct iio_chan_spec const *chan, int *val, 335 + int *val2, long mask) 336 + { 337 + struct ads1119_state *st = iio_priv(indio_dev); 338 + unsigned int index = chan->address; 339 + 340 + if (index >= st->num_channels_cfg) 341 + return -EINVAL; 342 + 343 + switch (mask) { 344 + case IIO_CHAN_INFO_RAW: 345 + iio_device_claim_direct_scoped(return -EBUSY, indio_dev) 346 + return ads1119_single_conversion(st, chan, val, false); 347 + unreachable(); 348 + case IIO_CHAN_INFO_OFFSET: 349 + iio_device_claim_direct_scoped(return -EBUSY, indio_dev) 350 + return ads1119_single_conversion(st, chan, val, true); 351 + unreachable(); 352 + case IIO_CHAN_INFO_SCALE: 353 + *val = st->vref_uV / 1000; 354 + *val /= st->channels_cfg[index].gain; 355 + *val2 = chan->scan_type.realbits - 1; 356 + return IIO_VAL_FRACTIONAL_LOG2; 357 + case IIO_CHAN_INFO_SAMP_FREQ: 358 + *val = st->channels_cfg[index].datarate; 359 + return IIO_VAL_INT; 360 + default: 361 + return -EINVAL; 362 + } 363 + } 364 + 365 + static int ads1119_write_raw(struct iio_dev *indio_dev, 366 + struct iio_chan_spec const *chan, int val, 367 + int val2, long mask) 368 + { 369 + struct ads1119_state *st = iio_priv(indio_dev); 370 + unsigned int index = chan->address; 371 + int ret; 372 + 373 + if (index >= st->num_channels_cfg) 374 + return -EINVAL; 375 + 376 + switch (mask) { 377 + case IIO_CHAN_INFO_SCALE: 378 + ret = MICRO / ((val * MICRO) + val2); 379 + if (ret != 1 && ret != 4) 380 + return -EINVAL; 381 + 382 + st->channels_cfg[index].gain = ret; 383 + return 0; 384 + case IIO_CHAN_INFO_SAMP_FREQ: 385 + ret = ads1119_validate_datarate(st, val); 386 + if (ret < 0) 387 + return ret; 388 + 389 + st->channels_cfg[index].datarate = ret; 390 + return 0; 391 + default: 392 + return -EINVAL; 393 + } 394 + } 395 + 396 + static int ads1119_debugfs_reg_access(struct iio_dev *indio_dev, 397 + unsigned int reg, unsigned int writeval, 398 + unsigned int *readval) 399 + { 400 + struct ads1119_state *st = iio_priv(indio_dev); 401 + int ret; 402 + 403 + if (reg > ADS1119_REG_STATUS) 404 + return -EINVAL; 405 + 406 + if (readval) { 407 + ret = i2c_smbus_read_byte_data(st->client, 408 + ADS1119_CMD_RREG(reg)); 409 + if (ret < 0) 410 + return ret; 411 + 412 + *readval = ret; 413 + return 0; 414 + } 415 + 416 + if (reg > ADS1119_REG_CONFIG) 417 + return -EINVAL; 418 + 419 + return i2c_smbus_write_byte_data(st->client, ADS1119_CMD_WREG, 420 + writeval); 421 + } 422 + 423 + static const struct iio_info ads1119_info = { 424 + .read_avail = ads1119_read_avail, 425 + .read_raw = ads1119_read_raw, 426 + .write_raw = ads1119_write_raw, 427 + .debugfs_reg_access = ads1119_debugfs_reg_access, 428 + }; 429 + 430 + static int ads1119_triggered_buffer_preenable(struct iio_dev *indio_dev) 431 + { 432 + struct ads1119_state *st = iio_priv(indio_dev); 433 + struct device *dev = &st->client->dev; 434 + unsigned int index; 435 + int ret; 436 + 437 + index = find_first_bit(indio_dev->active_scan_mask, 438 + indio_dev->masklength); 439 + 440 + ret = ads1119_set_conv_mode(st, true); 441 + if (ret) 442 + return ret; 443 + 444 + ret = ads1119_configure_channel(st, 445 + st->channels_cfg[index].mux, 446 + st->channels_cfg[index].gain, 447 + st->channels_cfg[index].datarate); 448 + if (ret) 449 + return ret; 450 + 451 + ret = pm_runtime_resume_and_get(dev); 452 + if (ret) 453 + return ret; 454 + 455 + return i2c_smbus_write_byte(st->client, ADS1119_CMD_START_SYNC); 456 + } 457 + 458 + static int ads1119_triggered_buffer_postdisable(struct iio_dev *indio_dev) 459 + { 460 + struct ads1119_state *st = iio_priv(indio_dev); 461 + struct device *dev = &st->client->dev; 462 + int ret; 463 + 464 + ret = ads1119_set_conv_mode(st, false); 465 + if (ret) 466 + return ret; 467 + 468 + pm_runtime_mark_last_busy(dev); 469 + pm_runtime_put_autosuspend(dev); 470 + 471 + return 0; 472 + } 473 + 474 + static const struct iio_buffer_setup_ops ads1119_buffer_setup_ops = { 475 + .preenable = ads1119_triggered_buffer_preenable, 476 + .postdisable = ads1119_triggered_buffer_postdisable, 477 + .validate_scan_mask = &iio_validate_scan_mask_onehot, 478 + }; 479 + 480 + static const struct iio_trigger_ops ads1119_trigger_ops = { 481 + .validate_device = &iio_trigger_validate_own_device, 482 + }; 483 + 484 + static irqreturn_t ads1119_irq_handler(int irq, void *dev_id) 485 + { 486 + struct iio_dev *indio_dev = dev_id; 487 + struct ads1119_state *st = iio_priv(indio_dev); 488 + 489 + if (iio_buffer_enabled(indio_dev) && iio_trigger_using_own(indio_dev)) 490 + iio_trigger_poll(indio_dev->trig); 491 + else 492 + complete(&st->completion); 493 + 494 + return IRQ_HANDLED; 495 + } 496 + 497 + static irqreturn_t ads1119_trigger_handler(int irq, void *private) 498 + { 499 + struct iio_poll_func *pf = private; 500 + struct iio_dev *indio_dev = pf->indio_dev; 501 + struct ads1119_state *st = iio_priv(indio_dev); 502 + struct { 503 + unsigned int sample; 504 + s64 timestamp __aligned(8); 505 + } scan; 506 + unsigned int index; 507 + int ret; 508 + 509 + if (!iio_trigger_using_own(indio_dev)) { 510 + index = find_first_bit(indio_dev->active_scan_mask, 511 + indio_dev->masklength); 512 + 513 + ret = ads1119_poll_data_ready(st, &indio_dev->channels[index]); 514 + if (ret) { 515 + dev_err(&st->client->dev, 516 + "Failed to poll data on trigger (%d)\n", ret); 517 + goto done; 518 + } 519 + } 520 + 521 + ret = i2c_smbus_read_word_swapped(st->client, ADS1119_CMD_RDATA); 522 + if (ret < 0) { 523 + dev_err(&st->client->dev, 524 + "Failed to read data on trigger (%d)\n", ret); 525 + goto done; 526 + } 527 + 528 + scan.sample = ret; 529 + 530 + iio_push_to_buffers_with_timestamp(indio_dev, &scan, 531 + iio_get_time_ns(indio_dev)); 532 + done: 533 + iio_trigger_notify_done(indio_dev->trig); 534 + return IRQ_HANDLED; 535 + } 536 + 537 + static int ads1119_init(struct ads1119_state *st, bool vref_external) 538 + { 539 + int ret; 540 + 541 + ret = ads1119_reset(st); 542 + if (ret) 543 + return ret; 544 + 545 + if (vref_external) 546 + return ads1119_upd_cfg_reg(st, 547 + ADS1119_CONFIG_VREF_FIELD, 548 + FIELD_PREP(ADS1119_CONFIG_VREF_FIELD, 549 + ADS1119_VREF_EXTERNAL)); 550 + return 0; 551 + } 552 + 553 + static int ads1119_map_analog_inputs_mux(int ain_pos, int ain_neg, 554 + bool differential) 555 + { 556 + if (ain_pos >= ADS1119_MAX_SINGLE_CHANNELS) 557 + return -EINVAL; 558 + 559 + if (!differential) 560 + return ADS1119_MUX_AIN0 + ain_pos; 561 + 562 + if (ain_pos == 0 && ain_neg == 1) 563 + return ADS1119_MUX_AIN0_AIN1; 564 + else if (ain_pos == 1 && ain_neg == 2) 565 + return ADS1119_MUX_AIN1_AIN2; 566 + else if (ain_pos == 2 && ain_neg == 3) 567 + return ADS1119_MUX_AIN2_AIN3; 568 + 569 + return -EINVAL; 570 + } 571 + 572 + static int ads1119_alloc_and_config_channels(struct iio_dev *indio_dev) 573 + { 574 + const struct iio_chan_spec ads1119_channel = 575 + (const struct iio_chan_spec) { 576 + .type = IIO_VOLTAGE, 577 + .indexed = 1, 578 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 579 + BIT(IIO_CHAN_INFO_SCALE) | 580 + BIT(IIO_CHAN_INFO_OFFSET) | 581 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 582 + .info_mask_shared_by_all_available = 583 + BIT(IIO_CHAN_INFO_SCALE) | 584 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 585 + .scan_type = { 586 + .sign = 's', 587 + .realbits = 16, 588 + .storagebits = 16, 589 + .endianness = IIO_CPU, 590 + }, 591 + }; 592 + const struct iio_chan_spec ads1119_ts = IIO_CHAN_SOFT_TIMESTAMP(0); 593 + struct ads1119_state *st = iio_priv(indio_dev); 594 + struct iio_chan_spec *iio_channels, *chan; 595 + struct device *dev = &st->client->dev; 596 + unsigned int num_channels, i; 597 + bool differential; 598 + u32 ain[2]; 599 + int ret; 600 + 601 + st->num_channels_cfg = device_get_child_node_count(dev); 602 + if (st->num_channels_cfg > ADS1119_MAX_CHANNELS) 603 + return dev_err_probe(dev, -EINVAL, 604 + "Too many channels %d, max is %d\n", 605 + st->num_channels_cfg, 606 + ADS1119_MAX_CHANNELS); 607 + 608 + st->channels_cfg = devm_kcalloc(dev, st->num_channels_cfg, 609 + sizeof(*st->channels_cfg), GFP_KERNEL); 610 + if (!st->channels_cfg) 611 + return -ENOMEM; 612 + 613 + /* Allocate one more iio channel for the timestamp */ 614 + num_channels = st->num_channels_cfg + 1; 615 + iio_channels = devm_kcalloc(dev, num_channels, sizeof(*iio_channels), 616 + GFP_KERNEL); 617 + if (!iio_channels) 618 + return -ENOMEM; 619 + 620 + i = 0; 621 + 622 + device_for_each_child_node_scoped(dev, child) { 623 + chan = &iio_channels[i]; 624 + 625 + differential = fwnode_property_present(child, "diff-channels"); 626 + if (differential) 627 + ret = fwnode_property_read_u32_array(child, 628 + "diff-channels", 629 + ain, 2); 630 + else 631 + ret = fwnode_property_read_u32(child, "single-channel", 632 + &ain[0]); 633 + 634 + if (ret) 635 + return dev_err_probe(dev, ret, 636 + "Failed to get channel property\n"); 637 + 638 + ret = ads1119_map_analog_inputs_mux(ain[0], ain[1], 639 + differential); 640 + if (ret < 0) 641 + return dev_err_probe(dev, ret, 642 + "Invalid channel value\n"); 643 + 644 + st->channels_cfg[i].mux = ret; 645 + st->channels_cfg[i].gain = ADS1119_DEFAULT_GAIN; 646 + st->channels_cfg[i].datarate = ADS1119_DEFAULT_DATARATE; 647 + 648 + *chan = ads1119_channel; 649 + chan->channel = ain[0]; 650 + chan->address = i; 651 + chan->scan_index = i; 652 + 653 + if (differential) { 654 + chan->channel2 = ain[1]; 655 + chan->differential = 1; 656 + } 657 + 658 + dev_dbg(dev, "channel: index %d, mux %d\n", i, 659 + st->channels_cfg[i].mux); 660 + 661 + i++; 662 + } 663 + 664 + iio_channels[i] = ads1119_ts; 665 + iio_channels[i].address = i; 666 + iio_channels[i].scan_index = i; 667 + 668 + indio_dev->channels = iio_channels; 669 + indio_dev->num_channels = num_channels; 670 + 671 + return 0; 672 + } 673 + 674 + static void ads1119_powerdown(void *data) 675 + { 676 + struct ads1119_state *st = data; 677 + 678 + i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN); 679 + } 680 + 681 + static int ads1119_probe(struct i2c_client *client) 682 + { 683 + struct iio_dev *indio_dev; 684 + struct ads1119_state *st; 685 + struct device *dev = &client->dev; 686 + bool vref_external = true; 687 + int ret; 688 + 689 + indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); 690 + if (!indio_dev) 691 + return dev_err_probe(dev, -ENOMEM, 692 + "Failed to allocate IIO device\n"); 693 + 694 + st = iio_priv(indio_dev); 695 + st->client = client; 696 + 697 + indio_dev->name = "ads1119"; 698 + indio_dev->info = &ads1119_info; 699 + indio_dev->modes = INDIO_DIRECT_MODE; 700 + 701 + i2c_set_clientdata(client, indio_dev); 702 + 703 + ret = devm_regulator_bulk_get_enable(dev, 704 + ARRAY_SIZE(ads1119_power_supplies), 705 + ads1119_power_supplies); 706 + if (ret) 707 + return dev_err_probe(dev, ret, 708 + "Failed to get and enable supplies\n"); 709 + 710 + st->vref_uV = devm_regulator_get_enable_read_voltage(dev, "vref"); 711 + if (st->vref_uV == -ENODEV) { 712 + vref_external = false; 713 + st->vref_uV = ADS1119_VREF_INTERNAL_VAL; 714 + } else if (st->vref_uV < 0) { 715 + return dev_err_probe(dev, st->vref_uV, "Failed to get vref\n"); 716 + } 717 + 718 + st->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); 719 + if (IS_ERR(st->reset_gpio)) 720 + return dev_err_probe(dev, PTR_ERR(st->reset_gpio), 721 + "Failed to get reset gpio\n"); 722 + 723 + ret = ads1119_alloc_and_config_channels(indio_dev); 724 + if (ret) 725 + return ret; 726 + 727 + init_completion(&st->completion); 728 + 729 + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, 730 + ads1119_trigger_handler, 731 + &ads1119_buffer_setup_ops); 732 + if (ret) 733 + return dev_err_probe(dev, ret, "Failed to setup IIO buffer\n"); 734 + 735 + if (client->irq > 0) { 736 + ret = devm_request_threaded_irq(dev, client->irq, 737 + ads1119_irq_handler, 738 + NULL, IRQF_TRIGGER_FALLING, 739 + "ads1119", indio_dev); 740 + if (ret) 741 + return dev_err_probe(dev, ret, 742 + "Failed to allocate irq\n"); 743 + 744 + st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", 745 + indio_dev->name, 746 + iio_device_id(indio_dev)); 747 + if (!st->trig) 748 + return dev_err_probe(dev, -ENOMEM, 749 + "Failed to allocate IIO trigger\n"); 750 + 751 + st->trig->ops = &ads1119_trigger_ops; 752 + iio_trigger_set_drvdata(st->trig, indio_dev); 753 + 754 + ret = devm_iio_trigger_register(dev, st->trig); 755 + if (ret) 756 + return dev_err_probe(dev, ret, 757 + "Failed to register IIO trigger\n"); 758 + } 759 + 760 + ret = ads1119_init(st, vref_external); 761 + if (ret) 762 + return dev_err_probe(dev, ret, 763 + "Failed to initialize device\n"); 764 + 765 + pm_runtime_set_autosuspend_delay(dev, ADS1119_SUSPEND_DELAY); 766 + pm_runtime_use_autosuspend(dev); 767 + pm_runtime_mark_last_busy(dev); 768 + pm_runtime_set_active(dev); 769 + 770 + ret = devm_pm_runtime_enable(dev); 771 + if (ret) 772 + return dev_err_probe(dev, ret, "Failed to enable pm runtime\n"); 773 + 774 + ret = devm_add_action_or_reset(dev, ads1119_powerdown, st); 775 + if (ret) 776 + return dev_err_probe(dev, ret, 777 + "Failed to add powerdown action\n"); 778 + 779 + return devm_iio_device_register(dev, indio_dev); 780 + } 781 + 782 + static int ads1119_runtime_suspend(struct device *dev) 783 + { 784 + struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); 785 + struct ads1119_state *st = iio_priv(indio_dev); 786 + 787 + return i2c_smbus_write_byte(st->client, ADS1119_CMD_POWERDOWN); 788 + } 789 + 790 + /* 791 + * The ADS1119 does not require a resume function because it automatically 792 + * powers on after a reset. 793 + * After a power down command, the ADS1119 can still communicate but turns off 794 + * its analog parts. To resume from power down, the device will power up again 795 + * upon receiving a start/sync command. 796 + */ 797 + static DEFINE_RUNTIME_DEV_PM_OPS(ads1119_pm_ops, ads1119_runtime_suspend, 798 + NULL, NULL); 799 + 800 + static const struct of_device_id __maybe_unused ads1119_of_match[] = { 801 + { .compatible = "ti,ads1119" }, 802 + { } 803 + }; 804 + MODULE_DEVICE_TABLE(of, ads1119_of_match); 805 + 806 + static const struct i2c_device_id ads1119_id[] = { 807 + { "ads1119", 0 }, 808 + { } 809 + }; 810 + MODULE_DEVICE_TABLE(i2c, ads1119_id); 811 + 812 + static struct i2c_driver ads1119_driver = { 813 + .driver = { 814 + .name = "ads1119", 815 + .of_match_table = ads1119_of_match, 816 + .pm = pm_ptr(&ads1119_pm_ops), 817 + }, 818 + .probe = ads1119_probe, 819 + .id_table = ads1119_id, 820 + }; 821 + module_i2c_driver(ads1119_driver); 822 + 823 + MODULE_AUTHOR("João Paulo Gonçalves <joao.goncalves@toradex.com>"); 824 + MODULE_DESCRIPTION("Texas Instruments ADS1119 ADC Driver"); 825 + MODULE_LICENSE("GPL");
+10 -49
drivers/iio/adc/ti-ads8688.c
··· 65 65 struct mutex lock; 66 66 const struct ads8688_chip_info *chip_info; 67 67 struct spi_device *spi; 68 - struct regulator *reg; 69 68 unsigned int vref_mv; 70 69 enum ads8688_range range[8]; 71 70 union { ··· 422 423 423 424 st = iio_priv(indio_dev); 424 425 425 - st->reg = devm_regulator_get_optional(&spi->dev, "vref"); 426 - if (!IS_ERR(st->reg)) { 427 - ret = regulator_enable(st->reg); 428 - if (ret) 429 - return ret; 426 + ret = devm_regulator_get_enable_read_voltage(&spi->dev, "vref"); 427 + if (ret < 0 && ret != -ENODEV) 428 + return ret; 430 429 431 - ret = regulator_get_voltage(st->reg); 432 - if (ret < 0) 433 - goto err_regulator_disable; 434 - 435 - st->vref_mv = ret / 1000; 436 - } else { 437 - /* Use internal reference */ 438 - st->vref_mv = ADS8688_VREF_MV; 439 - } 430 + st->vref_mv = ret == -ENODEV ? ADS8688_VREF_MV : ret / 1000; 440 431 441 432 st->chip_info = &ads8688_chip_info_tbl[spi_get_device_id(spi)->driver_data]; 442 433 443 434 spi->mode = SPI_MODE_1; 444 - 445 - spi_set_drvdata(spi, indio_dev); 446 435 447 436 st->spi = spi; 448 437 ··· 444 457 445 458 mutex_init(&st->lock); 446 459 447 - ret = iio_triggered_buffer_setup(indio_dev, NULL, ads8688_trigger_handler, NULL); 448 - if (ret < 0) { 449 - dev_err(&spi->dev, "iio triggered buffer setup failed\n"); 450 - goto err_regulator_disable; 451 - } 460 + ret = devm_iio_triggered_buffer_setup(&spi->dev, indio_dev, NULL, 461 + ads8688_trigger_handler, NULL); 462 + if (ret < 0) 463 + return dev_err_probe(&spi->dev, ret, 464 + "iio triggered buffer setup failed\n"); 452 465 453 - ret = iio_device_register(indio_dev); 454 - if (ret) 455 - goto err_buffer_cleanup; 456 - 457 - return 0; 458 - 459 - err_buffer_cleanup: 460 - iio_triggered_buffer_cleanup(indio_dev); 461 - 462 - err_regulator_disable: 463 - if (!IS_ERR(st->reg)) 464 - regulator_disable(st->reg); 465 - 466 - return ret; 467 - } 468 - 469 - static void ads8688_remove(struct spi_device *spi) 470 - { 471 - struct iio_dev *indio_dev = spi_get_drvdata(spi); 472 - struct ads8688_state *st = iio_priv(indio_dev); 473 - 474 - iio_device_unregister(indio_dev); 475 - iio_triggered_buffer_cleanup(indio_dev); 476 - 477 - if (!IS_ERR(st->reg)) 478 - regulator_disable(st->reg); 466 + return devm_iio_device_register(&spi->dev, indio_dev); 479 467 } 480 468 481 469 static const struct spi_device_id ads8688_id[] = { ··· 473 511 .of_match_table = ads8688_of_match, 474 512 }, 475 513 .probe = ads8688_probe, 476 - .remove = ads8688_remove, 477 514 .id_table = ads8688_id, 478 515 }; 479 516 module_spi_driver(ads8688_driver);
+59 -48
drivers/iio/adc/xilinx-ams.c
··· 222 222 #define PL_SEQ(x) (AMS_PS_SEQ_MAX + (x)) 223 223 #define AMS_CTRL_SEQ_BASE (AMS_PS_SEQ_MAX * 3) 224 224 225 - #define AMS_CHAN_TEMP(_scan_index, _addr) { \ 225 + #define AMS_CHAN_TEMP(_scan_index, _addr, _name) { \ 226 226 .type = IIO_TEMP, \ 227 227 .indexed = 1, \ 228 228 .address = (_addr), \ ··· 232 232 .event_spec = ams_temp_events, \ 233 233 .scan_index = _scan_index, \ 234 234 .num_event_specs = ARRAY_SIZE(ams_temp_events), \ 235 + .datasheet_name = _name, \ 235 236 } 236 237 237 - #define AMS_CHAN_VOLTAGE(_scan_index, _addr, _alarm) { \ 238 + #define AMS_CHAN_VOLTAGE(_scan_index, _addr, _alarm, _name) { \ 238 239 .type = IIO_VOLTAGE, \ 239 240 .indexed = 1, \ 240 241 .address = (_addr), \ ··· 244 243 .event_spec = (_alarm) ? ams_voltage_events : NULL, \ 245 244 .scan_index = _scan_index, \ 246 245 .num_event_specs = (_alarm) ? ARRAY_SIZE(ams_voltage_events) : 0, \ 246 + .datasheet_name = _name, \ 247 247 } 248 248 249 - #define AMS_PS_CHAN_TEMP(_scan_index, _addr) \ 250 - AMS_CHAN_TEMP(PS_SEQ(_scan_index), _addr) 251 - #define AMS_PS_CHAN_VOLTAGE(_scan_index, _addr) \ 252 - AMS_CHAN_VOLTAGE(PS_SEQ(_scan_index), _addr, true) 249 + #define AMS_PS_CHAN_TEMP(_scan_index, _addr, _name) \ 250 + AMS_CHAN_TEMP(PS_SEQ(_scan_index), _addr, _name) 251 + #define AMS_PS_CHAN_VOLTAGE(_scan_index, _addr, _name) \ 252 + AMS_CHAN_VOLTAGE(PS_SEQ(_scan_index), _addr, true, _name) 253 253 254 - #define AMS_PL_CHAN_TEMP(_scan_index, _addr) \ 255 - AMS_CHAN_TEMP(PL_SEQ(_scan_index), _addr) 256 - #define AMS_PL_CHAN_VOLTAGE(_scan_index, _addr, _alarm) \ 257 - AMS_CHAN_VOLTAGE(PL_SEQ(_scan_index), _addr, _alarm) 254 + #define AMS_PL_CHAN_TEMP(_scan_index, _addr, _name) \ 255 + AMS_CHAN_TEMP(PL_SEQ(_scan_index), _addr, _name) 256 + #define AMS_PL_CHAN_VOLTAGE(_scan_index, _addr, _alarm, _name) \ 257 + AMS_CHAN_VOLTAGE(PL_SEQ(_scan_index), _addr, _alarm, _name) 258 258 #define AMS_PL_AUX_CHAN_VOLTAGE(_auxno) \ 259 - AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(_auxno)), AMS_REG_VAUX(_auxno), false) 260 - #define AMS_CTRL_CHAN_VOLTAGE(_scan_index, _addr) \ 261 - AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(AMS_SEQ(_scan_index))), _addr, false) 259 + AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(_auxno)), AMS_REG_VAUX(_auxno), false, \ 260 + "VAUX" #_auxno) 261 + #define AMS_CTRL_CHAN_VOLTAGE(_scan_index, _addr, _name) \ 262 + AMS_CHAN_VOLTAGE(PL_SEQ(AMS_SEQ(AMS_SEQ(_scan_index))), _addr, false, \ 263 + _name) 262 264 263 265 /** 264 266 * struct ams - This structure contains necessary state for xilinx-ams to operate ··· 507 503 writel(AMS_ISR1_ALARM_MASK, ams->base + AMS_ISR_1); 508 504 509 505 return 0; 506 + } 507 + 508 + static int ams_read_label(struct iio_dev *indio_dev, 509 + struct iio_chan_spec const *chan, char *label) 510 + { 511 + return sysfs_emit(label, "%s\n", chan->datasheet_name); 510 512 } 511 513 512 514 static int ams_enable_single_channel(struct ams *ams, unsigned int offset) ··· 1126 1116 }; 1127 1117 1128 1118 static const struct iio_chan_spec ams_ps_channels[] = { 1129 - AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP), 1130 - AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP_REMOTE, AMS_TEMP_REMOTE), 1131 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1), 1132 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2), 1133 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3), 1134 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4), 1135 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5), 1136 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6), 1137 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7), 1138 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8), 1139 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9), 1140 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10), 1141 - AMS_PS_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS), 1119 + AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_LPD"), 1120 + AMS_PS_CHAN_TEMP(AMS_SEQ_TEMP_REMOTE, AMS_TEMP_REMOTE, "Temp_FPD"), 1121 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, "VCC_PSINTLP"), 1122 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, "VCC_PSINTFP"), 1123 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, "VCC_PSAUX"), 1124 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, "VCC_PSDDR"), 1125 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, "VCC_PSIO3"), 1126 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, "VCC_PSIO0"), 1127 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, "VCC_PSIO1"), 1128 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, "VCC_PSIO2"), 1129 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, "PS_MGTRAVCC"), 1130 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, "PS_MGTRAVTT"), 1131 + AMS_PS_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, "VCC_PSADC"), 1142 1132 }; 1143 1133 1144 1134 static const struct iio_chan_spec ams_pl_channels[] = { 1145 - AMS_PL_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP), 1146 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, true), 1147 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, true), 1148 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFP, AMS_VREFP, false), 1149 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFN, AMS_VREFN, false), 1150 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, true), 1151 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, true), 1152 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, true), 1153 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, true), 1154 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, true), 1155 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VP_VN, AMS_VP_VN, false), 1156 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, true), 1157 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, true), 1158 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, true), 1159 - AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, true), 1135 + AMS_PL_CHAN_TEMP(AMS_SEQ_TEMP, AMS_TEMP, "Temp_PL"), 1136 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY1, AMS_SUPPLY1, true, "VCCINT"), 1137 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY2, AMS_SUPPLY2, true, "VCCAUX"), 1138 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFP, AMS_VREFP, false, "VREFP"), 1139 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VREFN, AMS_VREFN, false, "VREFN"), 1140 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY3, AMS_SUPPLY3, true, "VCCBRAM"), 1141 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY4, AMS_SUPPLY4, true, "VCC_PSINTLP"), 1142 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY5, AMS_SUPPLY5, true, "VCC_PSINTFP"), 1143 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY6, AMS_SUPPLY6, true, "VCC_PSAUX"), 1144 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VCCAMS, AMS_VCCAMS, true, "VCCAMS"), 1145 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_VP_VN, AMS_VP_VN, false, "VP_VN"), 1146 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY7, AMS_SUPPLY7, true, "VUser0"), 1147 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY8, AMS_SUPPLY8, true, "VUser1"), 1148 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY9, AMS_SUPPLY9, true, "VUser2"), 1149 + AMS_PL_CHAN_VOLTAGE(AMS_SEQ_SUPPLY10, AMS_SUPPLY10, true, "VUser3"), 1160 1150 AMS_PL_AUX_CHAN_VOLTAGE(0), 1161 1151 AMS_PL_AUX_CHAN_VOLTAGE(1), 1162 1152 AMS_PL_AUX_CHAN_VOLTAGE(2), ··· 1176 1166 }; 1177 1167 1178 1168 static const struct iio_chan_spec ams_ctrl_channels[] = { 1179 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSPLL, AMS_VCC_PSPLL0), 1180 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSBATT, AMS_VCC_PSPLL3), 1181 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCINT, AMS_VCCINT), 1182 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCBRAM, AMS_VCCBRAM), 1183 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCAUX, AMS_VCCAUX), 1184 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_PSDDRPLL, AMS_PSDDRPLL), 1185 - AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_INTDDR, AMS_PSINTFPDDR), 1169 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSPLL, AMS_VCC_PSPLL0, "VCC_PSPLL"), 1170 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCC_PSBATT, AMS_VCC_PSPLL3, "VCC_PSBATT"), 1171 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCINT, AMS_VCCINT, "VCCINT"), 1172 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCBRAM, AMS_VCCBRAM, "VCCBRAM"), 1173 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_VCCAUX, AMS_VCCAUX, "VCCAUX"), 1174 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_PSDDRPLL, AMS_PSDDRPLL, "VCC_PSDDR_PLL"), 1175 + AMS_CTRL_CHAN_VOLTAGE(AMS_SEQ_INTDDR, AMS_PSINTFPDDR, "VCC_PSINTFP_DDR"), 1186 1176 }; 1187 1177 1188 1178 static int ams_get_ext_chan(struct fwnode_handle *chan_node, ··· 1346 1336 } 1347 1337 1348 1338 static const struct iio_info iio_ams_info = { 1339 + .read_label = ams_read_label, 1349 1340 .read_raw = &ams_read_raw, 1350 1341 .read_event_config = &ams_read_event_config, 1351 1342 .write_event_config = &ams_write_event_config,
+167 -11
drivers/iio/buffer/industrialio-buffer-dma.c
··· 4 4 * Author: Lars-Peter Clausen <lars@metafoo.de> 5 5 */ 6 6 7 + #include <linux/atomic.h> 8 + #include <linux/cleanup.h> 7 9 #include <linux/slab.h> 8 10 #include <linux/kernel.h> 9 11 #include <linux/module.h> ··· 16 14 #include <linux/poll.h> 17 15 #include <linux/iio/buffer_impl.h> 18 16 #include <linux/iio/buffer-dma.h> 17 + #include <linux/dma-buf.h> 18 + #include <linux/dma-fence.h> 19 19 #include <linux/dma-mapping.h> 20 20 #include <linux/sizes.h> 21 21 ··· 98 94 { 99 95 struct iio_dma_buffer_block *block = container_of(kref, 100 96 struct iio_dma_buffer_block, kref); 97 + struct iio_dma_buffer_queue *queue = block->queue; 101 98 102 - WARN_ON(block->state != IIO_BLOCK_STATE_DEAD); 99 + WARN_ON(block->fileio && block->state != IIO_BLOCK_STATE_DEAD); 103 100 104 - dma_free_coherent(block->queue->dev, PAGE_ALIGN(block->size), 105 - block->vaddr, block->phys_addr); 101 + if (block->fileio) { 102 + dma_free_coherent(queue->dev, PAGE_ALIGN(block->size), 103 + block->vaddr, block->phys_addr); 104 + } else { 105 + atomic_dec(&queue->num_dmabufs); 106 + } 106 107 107 - iio_buffer_put(&block->queue->buffer); 108 + iio_buffer_put(&queue->buffer); 108 109 kfree(block); 109 110 } 110 111 ··· 172 163 } 173 164 174 165 static struct iio_dma_buffer_block *iio_dma_buffer_alloc_block( 175 - struct iio_dma_buffer_queue *queue, size_t size) 166 + struct iio_dma_buffer_queue *queue, size_t size, bool fileio) 176 167 { 177 168 struct iio_dma_buffer_block *block; 178 169 ··· 180 171 if (!block) 181 172 return NULL; 182 173 183 - block->vaddr = dma_alloc_coherent(queue->dev, PAGE_ALIGN(size), 184 - &block->phys_addr, GFP_KERNEL); 185 - if (!block->vaddr) { 186 - kfree(block); 187 - return NULL; 174 + if (fileio) { 175 + block->vaddr = dma_alloc_coherent(queue->dev, PAGE_ALIGN(size), 176 + &block->phys_addr, GFP_KERNEL); 177 + if (!block->vaddr) { 178 + kfree(block); 179 + return NULL; 180 + } 188 181 } 189 182 183 + block->fileio = fileio; 190 184 block->size = size; 191 185 block->state = IIO_BLOCK_STATE_DONE; 192 186 block->queue = queue; ··· 197 185 kref_init(&block->kref); 198 186 199 187 iio_buffer_get(&queue->buffer); 188 + 189 + if (!fileio) 190 + atomic_inc(&queue->num_dmabufs); 200 191 201 192 return block; 202 193 } ··· 233 218 { 234 219 struct iio_dma_buffer_queue *queue = block->queue; 235 220 unsigned long flags; 221 + bool cookie; 222 + 223 + cookie = dma_fence_begin_signalling(); 236 224 237 225 spin_lock_irqsave(&queue->list_lock, flags); 238 226 _iio_dma_buffer_block_done(block); 239 227 spin_unlock_irqrestore(&queue->list_lock, flags); 240 228 229 + if (!block->fileio) 230 + iio_buffer_signal_dmabuf_done(block->fence, 0); 231 + 241 232 iio_buffer_block_put_atomic(block); 242 233 iio_dma_buffer_queue_wake(queue); 234 + dma_fence_end_signalling(cookie); 243 235 } 244 236 EXPORT_SYMBOL_GPL(iio_dma_buffer_block_done); 245 237 ··· 265 243 { 266 244 struct iio_dma_buffer_block *block, *_block; 267 245 unsigned long flags; 246 + bool cookie; 247 + 248 + cookie = dma_fence_begin_signalling(); 268 249 269 250 spin_lock_irqsave(&queue->list_lock, flags); 270 251 list_for_each_entry_safe(block, _block, list, head) { 271 252 list_del(&block->head); 272 253 block->bytes_used = 0; 273 254 _iio_dma_buffer_block_done(block); 255 + 256 + if (!block->fileio) 257 + iio_buffer_signal_dmabuf_done(block->fence, -EINTR); 274 258 iio_buffer_block_put_atomic(block); 275 259 } 276 260 spin_unlock_irqrestore(&queue->list_lock, flags); 277 261 262 + if (queue->fileio.enabled) 263 + queue->fileio.enabled = false; 264 + 278 265 iio_dma_buffer_queue_wake(queue); 266 + dma_fence_end_signalling(cookie); 279 267 } 280 268 EXPORT_SYMBOL_GPL(iio_dma_buffer_block_list_abort); 281 269 ··· 303 271 default: 304 272 return false; 305 273 } 274 + } 275 + 276 + static bool iio_dma_buffer_can_use_fileio(struct iio_dma_buffer_queue *queue) 277 + { 278 + /* 279 + * Note that queue->num_dmabufs cannot increase while the queue is 280 + * locked, it can only decrease, so it does not race against 281 + * iio_dma_buffer_alloc_block(). 282 + */ 283 + return queue->fileio.enabled || !atomic_read(&queue->num_dmabufs); 306 284 } 307 285 308 286 /** ··· 340 298 queue->buffer.length, 2); 341 299 342 300 mutex_lock(&queue->lock); 301 + 302 + queue->fileio.enabled = iio_dma_buffer_can_use_fileio(queue); 303 + 304 + /* If DMABUFs were created, disable fileio interface */ 305 + if (!queue->fileio.enabled) 306 + goto out_unlock; 343 307 344 308 /* Allocations are page aligned */ 345 309 if (PAGE_ALIGN(queue->fileio.block_size) == PAGE_ALIGN(size)) ··· 387 339 } 388 340 389 341 if (!block) { 390 - block = iio_dma_buffer_alloc_block(queue, size); 342 + block = iio_dma_buffer_alloc_block(queue, size, true); 391 343 if (!block) { 392 344 ret = -ENOMEM; 393 345 goto out_unlock; ··· 460 412 461 413 block->state = IIO_BLOCK_STATE_ACTIVE; 462 414 iio_buffer_block_get(block); 415 + 463 416 ret = queue->ops->submit(queue, block); 464 417 if (ret) { 418 + if (!block->fileio) 419 + iio_buffer_signal_dmabuf_done(block->fence, ret); 420 + 465 421 /* 466 422 * This is a bit of a problem and there is not much we can do 467 423 * other then wait for the buffer to be disabled and re-enabled ··· 697 645 return data_available; 698 646 } 699 647 EXPORT_SYMBOL_GPL(iio_dma_buffer_usage); 648 + 649 + struct iio_dma_buffer_block * 650 + iio_dma_buffer_attach_dmabuf(struct iio_buffer *buffer, 651 + struct dma_buf_attachment *attach) 652 + { 653 + struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer); 654 + struct iio_dma_buffer_block *block; 655 + 656 + guard(mutex)(&queue->lock); 657 + 658 + /* 659 + * If the buffer is enabled and in fileio mode new blocks can't be 660 + * allocated. 661 + */ 662 + if (queue->fileio.enabled) 663 + return ERR_PTR(-EBUSY); 664 + 665 + block = iio_dma_buffer_alloc_block(queue, attach->dmabuf->size, false); 666 + if (!block) 667 + return ERR_PTR(-ENOMEM); 668 + 669 + /* Free memory that might be in use for fileio mode */ 670 + iio_dma_buffer_fileio_free(queue); 671 + 672 + return block; 673 + } 674 + EXPORT_SYMBOL_GPL(iio_dma_buffer_attach_dmabuf); 675 + 676 + void iio_dma_buffer_detach_dmabuf(struct iio_buffer *buffer, 677 + struct iio_dma_buffer_block *block) 678 + { 679 + block->state = IIO_BLOCK_STATE_DEAD; 680 + iio_buffer_block_put_atomic(block); 681 + } 682 + EXPORT_SYMBOL_GPL(iio_dma_buffer_detach_dmabuf); 683 + 684 + static int iio_dma_can_enqueue_block(struct iio_dma_buffer_block *block) 685 + { 686 + struct iio_dma_buffer_queue *queue = block->queue; 687 + 688 + /* If in fileio mode buffers can't be enqueued. */ 689 + if (queue->fileio.enabled) 690 + return -EBUSY; 691 + 692 + switch (block->state) { 693 + case IIO_BLOCK_STATE_QUEUED: 694 + return -EPERM; 695 + case IIO_BLOCK_STATE_ACTIVE: 696 + case IIO_BLOCK_STATE_DEAD: 697 + return -EBUSY; 698 + case IIO_BLOCK_STATE_DONE: 699 + break; 700 + } 701 + 702 + return 0; 703 + } 704 + 705 + int iio_dma_buffer_enqueue_dmabuf(struct iio_buffer *buffer, 706 + struct iio_dma_buffer_block *block, 707 + struct dma_fence *fence, 708 + struct sg_table *sgt, 709 + size_t size, bool cyclic) 710 + { 711 + struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer); 712 + bool cookie; 713 + int ret; 714 + 715 + WARN_ON(!mutex_is_locked(&queue->lock)); 716 + 717 + cookie = dma_fence_begin_signalling(); 718 + 719 + ret = iio_dma_can_enqueue_block(block); 720 + if (ret < 0) 721 + goto out_end_signalling; 722 + 723 + block->bytes_used = size; 724 + block->cyclic = cyclic; 725 + block->sg_table = sgt; 726 + block->fence = fence; 727 + 728 + iio_dma_buffer_enqueue(queue, block); 729 + 730 + out_end_signalling: 731 + dma_fence_end_signalling(cookie); 732 + 733 + return ret; 734 + } 735 + EXPORT_SYMBOL_GPL(iio_dma_buffer_enqueue_dmabuf); 736 + 737 + void iio_dma_buffer_lock_queue(struct iio_buffer *buffer) 738 + { 739 + struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer); 740 + 741 + mutex_lock(&queue->lock); 742 + } 743 + EXPORT_SYMBOL_GPL(iio_dma_buffer_lock_queue); 744 + 745 + void iio_dma_buffer_unlock_queue(struct iio_buffer *buffer) 746 + { 747 + struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer); 748 + 749 + mutex_unlock(&queue->lock); 750 + } 751 + EXPORT_SYMBOL_GPL(iio_dma_buffer_unlock_queue); 700 752 701 753 /** 702 754 * iio_dma_buffer_set_bytes_per_datum() - DMA buffer set_bytes_per_datum callback
+54 -10
drivers/iio/buffer/industrialio-buffer-dmaengine.c
··· 65 65 iio_buffer_to_dmaengine_buffer(&queue->buffer); 66 66 struct dma_async_tx_descriptor *desc; 67 67 enum dma_transfer_direction dma_dir; 68 + struct scatterlist *sgl; 69 + struct dma_vec *vecs; 68 70 size_t max_size; 69 71 dma_cookie_t cookie; 72 + size_t len_total; 73 + unsigned int i; 74 + int nents; 70 75 71 76 max_size = min(block->size, dmaengine_buffer->max_size); 72 77 max_size = round_down(max_size, dmaengine_buffer->align); 73 78 74 - if (queue->buffer.direction == IIO_BUFFER_DIRECTION_IN) { 75 - block->bytes_used = max_size; 79 + if (queue->buffer.direction == IIO_BUFFER_DIRECTION_IN) 76 80 dma_dir = DMA_DEV_TO_MEM; 77 - } else { 81 + else 78 82 dma_dir = DMA_MEM_TO_DEV; 83 + 84 + if (block->sg_table) { 85 + sgl = block->sg_table->sgl; 86 + nents = sg_nents_for_len(sgl, block->bytes_used); 87 + if (nents < 0) 88 + return nents; 89 + 90 + vecs = kmalloc_array(nents, sizeof(*vecs), GFP_ATOMIC); 91 + if (!vecs) 92 + return -ENOMEM; 93 + 94 + len_total = block->bytes_used; 95 + 96 + for (i = 0; i < nents; i++) { 97 + vecs[i].addr = sg_dma_address(sgl); 98 + vecs[i].len = min(sg_dma_len(sgl), len_total); 99 + len_total -= vecs[i].len; 100 + 101 + sgl = sg_next(sgl); 102 + } 103 + 104 + desc = dmaengine_prep_peripheral_dma_vec(dmaengine_buffer->chan, 105 + vecs, nents, dma_dir, 106 + DMA_PREP_INTERRUPT); 107 + kfree(vecs); 108 + } else { 109 + max_size = min(block->size, dmaengine_buffer->max_size); 110 + max_size = round_down(max_size, dmaengine_buffer->align); 111 + 112 + if (queue->buffer.direction == IIO_BUFFER_DIRECTION_IN) 113 + block->bytes_used = max_size; 114 + 115 + if (!block->bytes_used || block->bytes_used > max_size) 116 + return -EINVAL; 117 + 118 + desc = dmaengine_prep_slave_single(dmaengine_buffer->chan, 119 + block->phys_addr, 120 + block->bytes_used, 121 + dma_dir, 122 + DMA_PREP_INTERRUPT); 79 123 } 80 - 81 - if (!block->bytes_used || block->bytes_used > max_size) 82 - return -EINVAL; 83 - 84 - desc = dmaengine_prep_slave_single(dmaengine_buffer->chan, 85 - block->phys_addr, block->bytes_used, dma_dir, 86 - DMA_PREP_INTERRUPT); 87 124 if (!desc) 88 125 return -ENOMEM; 89 126 ··· 169 132 .data_available = iio_dma_buffer_usage, 170 133 .space_available = iio_dma_buffer_usage, 171 134 .release = iio_dmaengine_buffer_release, 135 + 136 + .enqueue_dmabuf = iio_dma_buffer_enqueue_dmabuf, 137 + .attach_dmabuf = iio_dma_buffer_attach_dmabuf, 138 + .detach_dmabuf = iio_dma_buffer_detach_dmabuf, 139 + 140 + .lock_queue = iio_dma_buffer_lock_queue, 141 + .unlock_queue = iio_dma_buffer_unlock_queue, 172 142 173 143 .modes = INDIO_BUFFER_HARDWARE, 174 144 .flags = INDIO_BUFFER_FLAG_FIXED_WATERMARK,
+19 -26
drivers/iio/common/scmi_sensors/scmi_iio.c
··· 626 626 SCMI_PROTOCOL_SENSOR, SCMI_EVENT_SENSOR_UPDATE, 627 627 &sensor->sensor_info->id, 628 628 &sensor->sensor_update_nb); 629 - if (ret) { 630 - dev_err(&iiodev->dev, 631 - "Error in registering sensor update notifier for sensor %s err %d", 632 - sensor->sensor_info->name, ret); 633 - return ERR_PTR(ret); 634 - } 629 + if (ret) 630 + return dev_err_ptr_probe(&iiodev->dev, ret, 631 + "Error in registering sensor update notifier for sensor %s\n", 632 + sensor->sensor_info->name); 635 633 636 634 scmi_iio_set_timestamp_channel(&iio_channels[i], i); 637 635 iiodev->channels = iio_channels; ··· 651 653 return -ENODEV; 652 654 653 655 sensor_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_SENSOR, &ph); 654 - if (IS_ERR(sensor_ops)) { 655 - dev_err(dev, "SCMI device has no sensor interface\n"); 656 - return PTR_ERR(sensor_ops); 657 - } 656 + if (IS_ERR(sensor_ops)) 657 + return dev_err_probe(dev, PTR_ERR(sensor_ops), 658 + "SCMI device has no sensor interface\n"); 658 659 659 660 nr_sensors = sensor_ops->count_get(ph); 660 661 if (!nr_sensors) { ··· 664 667 for (i = 0; i < nr_sensors; i++) { 665 668 sensor_info = sensor_ops->info_get(ph, i); 666 669 if (!sensor_info) { 667 - dev_err(dev, "SCMI sensor %d has missing info\n", i); 668 - return -EINVAL; 670 + return dev_err_probe(dev, -EINVAL, 671 + "SCMI sensor %d has missing info\n", i); 669 672 } 670 673 671 674 /* This driver only supports 3-axis accel and gyro, skipping other sensors */ ··· 680 683 scmi_iio_dev = scmi_alloc_iiodev(sdev, sensor_ops, ph, 681 684 sensor_info); 682 685 if (IS_ERR(scmi_iio_dev)) { 683 - dev_err(dev, 684 - "failed to allocate IIO device for sensor %s: %ld\n", 685 - sensor_info->name, PTR_ERR(scmi_iio_dev)); 686 - return PTR_ERR(scmi_iio_dev); 686 + return dev_err_probe(dev, PTR_ERR(scmi_iio_dev), 687 + "failed to allocate IIO device for sensor %s\n", 688 + sensor_info->name); 687 689 } 688 690 689 691 err = devm_iio_kfifo_buffer_setup(&scmi_iio_dev->dev, 690 692 scmi_iio_dev, 691 693 &scmi_iio_buffer_ops); 692 694 if (err < 0) { 693 - dev_err(dev, 694 - "IIO buffer setup error at sensor %s: %d\n", 695 - sensor_info->name, err); 696 - return err; 695 + return dev_err_probe(dev, err, 696 + "IIO buffer setup error at sensor %s\n", 697 + sensor_info->name); 697 698 } 698 699 699 700 err = devm_iio_device_register(dev, scmi_iio_dev); 700 - if (err) { 701 - dev_err(dev, 702 - "IIO device registration failed at sensor %s: %d\n", 703 - sensor_info->name, err); 704 - return err; 705 - } 701 + if (err) 702 + return dev_err_probe(dev, err, 703 + "IIO device registration failed at sensor %s\n", 704 + sensor_info->name); 706 705 } 707 706 return err; 708 707 }
+1 -2
drivers/iio/common/st_sensors/st_sensors_core.c
··· 606 606 } 607 607 608 608 if (sdata->sensor_settings->wai != wai) { 609 - dev_err(&indio_dev->dev, 609 + dev_warn(&indio_dev->dev, 610 610 "%s: WhoAmI mismatch (0x%x).\n", 611 611 indio_dev->name, wai); 612 - return -EINVAL; 613 612 } 614 613 } 615 614
+4 -24
drivers/iio/dac/ad3552r.c
··· 857 857 return 0; 858 858 } 859 859 860 - static void ad3552r_reg_disable(void *reg) 861 - { 862 - regulator_disable(reg); 863 - } 864 - 865 860 static int ad3552r_configure_device(struct ad3552r_desc *dac) 866 861 { 867 862 struct device *dev = &dac->spi->dev; 868 - struct regulator *vref; 869 863 int err, cnt = 0, voltage, delta = 100000; 870 864 u32 vals[2], val, ch; 871 865 ··· 868 874 return dev_err_probe(dev, PTR_ERR(dac->gpio_ldac), 869 875 "Error getting gpio ldac"); 870 876 871 - vref = devm_regulator_get_optional(dev, "vref"); 872 - if (IS_ERR(vref)) { 873 - if (PTR_ERR(vref) != -ENODEV) 874 - return dev_err_probe(dev, PTR_ERR(vref), 875 - "Error getting vref"); 877 + voltage = devm_regulator_get_enable_read_voltage(dev, "vref"); 878 + if (voltage < 0 && voltage != -ENODEV) 879 + return dev_err_probe(dev, voltage, "Error getting vref voltage\n"); 876 880 881 + if (voltage == -ENODEV) { 877 882 if (device_property_read_bool(dev, "adi,vref-out-en")) 878 883 val = AD3552R_INTERNAL_VREF_PIN_2P5V; 879 884 else 880 885 val = AD3552R_INTERNAL_VREF_PIN_FLOATING; 881 886 } else { 882 - err = regulator_enable(vref); 883 - if (err) { 884 - dev_err(dev, "Failed to enable external vref supply\n"); 885 - return err; 886 - } 887 - 888 - err = devm_add_action_or_reset(dev, ad3552r_reg_disable, vref); 889 - if (err) { 890 - regulator_disable(vref); 891 - return err; 892 - } 893 - 894 - voltage = regulator_get_voltage(vref); 895 887 if (voltage > 2500000 + delta || voltage < 2500000 - delta) { 896 888 dev_warn(dev, "vref-supply must be 2.5V"); 897 889 return -EINVAL;
+6 -3
drivers/iio/dac/adi-axi-dac.c
··· 545 545 546 546 clk = devm_clk_get_enabled(&pdev->dev, NULL); 547 547 if (IS_ERR(clk)) 548 - return PTR_ERR(clk); 548 + return dev_err_probe(&pdev->dev, PTR_ERR(clk), 549 + "failed to get clock\n"); 549 550 550 551 base = devm_platform_ioremap_resource(pdev, 0); 551 552 if (IS_ERR(base)) ··· 556 555 st->regmap = devm_regmap_init_mmio(&pdev->dev, base, 557 556 &axi_dac_regmap_config); 558 557 if (IS_ERR(st->regmap)) 559 - return PTR_ERR(st->regmap); 558 + return dev_err_probe(&pdev->dev, PTR_ERR(st->regmap), 559 + "failed to init register map\n"); 560 560 561 561 /* 562 562 * Force disable the core. Up to the frontend to enable us. And we can ··· 603 601 mutex_init(&st->lock); 604 602 ret = devm_iio_backend_register(&pdev->dev, &axi_dac_generic, st); 605 603 if (ret) 606 - return ret; 604 + return dev_err_probe(&pdev->dev, ret, 605 + "failed to register iio backend\n"); 607 606 608 607 dev_info(&pdev->dev, "AXI DAC IP core (%d.%.2d.%c) probed\n", 609 608 ADI_AXI_PCORE_VER_MAJOR(ver),
+2 -3
drivers/iio/dac/ltc2688.c
··· 860 860 /* bring device out of reset */ 861 861 gpiod_set_value_cansleep(gpio, 0); 862 862 } else { 863 - ret = regmap_update_bits(st->regmap, LTC2688_CMD_CONFIG, 864 - LTC2688_CONFIG_RST, 865 - LTC2688_CONFIG_RST); 863 + ret = regmap_set_bits(st->regmap, LTC2688_CMD_CONFIG, 864 + LTC2688_CONFIG_RST); 866 865 if (ret) 867 866 return ret; 868 867 }
+2 -3
drivers/iio/dac/stm32-dac-core.c
··· 200 200 201 201 if (priv->common.hfsel) { 202 202 /* restore hfsel (maybe lost under low power state) */ 203 - ret = regmap_update_bits(priv->common.regmap, STM32_DAC_CR, 204 - STM32H7_DAC_CR_HFSEL, 205 - STM32H7_DAC_CR_HFSEL); 203 + ret = regmap_set_bits(priv->common.regmap, STM32_DAC_CR, 204 + STM32H7_DAC_CR_HFSEL); 206 205 if (ret) 207 206 return ret; 208 207 }
+122 -2
drivers/iio/frequency/adf4350.c
··· 19 19 #include <linux/gpio/consumer.h> 20 20 #include <asm/div64.h> 21 21 #include <linux/clk.h> 22 + #include <linux/clk-provider.h> 22 23 23 24 #include <linux/iio/iio.h> 24 25 #include <linux/iio/sysfs.h> ··· 37 36 struct gpio_desc *lock_detect_gpiod; 38 37 struct adf4350_platform_data *pdata; 39 38 struct clk *clk; 39 + struct clk *clkout; 40 + const char *clk_out_name; 41 + struct clk_hw hw; 40 42 unsigned long clkin; 41 43 unsigned long chspc; /* Channel Spacing */ 42 44 unsigned long fpfd; /* Phase Frequency Detector */ ··· 64 60 */ 65 61 __be32 val __aligned(IIO_DMA_MINALIGN); 66 62 }; 63 + 64 + #define to_adf4350_state(_hw) container_of(_hw, struct adf4350_state, hw) 67 65 68 66 static struct adf4350_platform_data default_pdata = { 69 67 .channel_spacing = 10000, ··· 387 381 .debugfs_reg_access = &adf4350_reg_access, 388 382 }; 389 383 384 + static void adf4350_clk_del_provider(void *data) 385 + { 386 + struct adf4350_state *st = data; 387 + 388 + of_clk_del_provider(st->spi->dev.of_node); 389 + } 390 + 391 + static unsigned long adf4350_clk_recalc_rate(struct clk_hw *hw, 392 + unsigned long parent_rate) 393 + { 394 + struct adf4350_state *st = to_adf4350_state(hw); 395 + unsigned long long tmp; 396 + 397 + tmp = (u64)(st->r0_int * st->r1_mod + st->r0_fract) * st->fpfd; 398 + do_div(tmp, st->r1_mod * (1 << st->r4_rf_div_sel)); 399 + 400 + return tmp; 401 + } 402 + 403 + static int adf4350_clk_set_rate(struct clk_hw *hw, 404 + unsigned long rate, 405 + unsigned long parent_rate) 406 + { 407 + struct adf4350_state *st = to_adf4350_state(hw); 408 + 409 + if (parent_rate == 0 || parent_rate > ADF4350_MAX_FREQ_REFIN) 410 + return -EINVAL; 411 + 412 + st->clkin = parent_rate; 413 + 414 + return adf4350_set_freq(st, rate); 415 + } 416 + 417 + static int adf4350_clk_prepare(struct clk_hw *hw) 418 + { 419 + struct adf4350_state *st = to_adf4350_state(hw); 420 + 421 + st->regs[ADF4350_REG2] &= ~ADF4350_REG2_POWER_DOWN_EN; 422 + 423 + return adf4350_sync_config(st); 424 + } 425 + 426 + static void adf4350_clk_unprepare(struct clk_hw *hw) 427 + { 428 + struct adf4350_state *st = to_adf4350_state(hw); 429 + 430 + st->regs[ADF4350_REG2] |= ADF4350_REG2_POWER_DOWN_EN; 431 + 432 + adf4350_sync_config(st); 433 + } 434 + 435 + static int adf4350_clk_is_enabled(struct clk_hw *hw) 436 + { 437 + struct adf4350_state *st = to_adf4350_state(hw); 438 + 439 + return (st->regs[ADF4350_REG2] & ADF4350_REG2_POWER_DOWN_EN); 440 + } 441 + 442 + static const struct clk_ops adf4350_clk_ops = { 443 + .recalc_rate = adf4350_clk_recalc_rate, 444 + .set_rate = adf4350_clk_set_rate, 445 + .prepare = adf4350_clk_prepare, 446 + .unprepare = adf4350_clk_unprepare, 447 + .is_enabled = adf4350_clk_is_enabled, 448 + }; 449 + 450 + static int adf4350_clk_register(struct adf4350_state *st) 451 + { 452 + struct spi_device *spi = st->spi; 453 + struct clk_init_data init; 454 + struct clk *clk; 455 + const char *parent_name; 456 + int ret; 457 + 458 + if (!device_property_present(&spi->dev, "#clock-cells")) 459 + return 0; 460 + 461 + if (device_property_read_string(&spi->dev, "clock-output-names", &init.name)) { 462 + init.name = devm_kasprintf(&spi->dev, GFP_KERNEL, "%s-clk", 463 + fwnode_get_name(dev_fwnode(&spi->dev))); 464 + if (!init.name) 465 + return -ENOMEM; 466 + } 467 + 468 + parent_name = of_clk_get_parent_name(spi->dev.of_node, 0); 469 + if (!parent_name) 470 + return -EINVAL; 471 + 472 + init.ops = &adf4350_clk_ops; 473 + init.parent_names = &parent_name; 474 + init.num_parents = 1; 475 + init.flags = CLK_SET_RATE_PARENT; 476 + 477 + st->hw.init = &init; 478 + clk = devm_clk_register(&spi->dev, &st->hw); 479 + if (IS_ERR(clk)) 480 + return PTR_ERR(clk); 481 + 482 + ret = of_clk_add_provider(spi->dev.of_node, of_clk_src_simple_get, clk); 483 + if (ret) 484 + return ret; 485 + 486 + st->clkout = clk; 487 + 488 + return devm_add_action_or_reset(&spi->dev, adf4350_clk_del_provider, st); 489 + } 490 + 390 491 static struct adf4350_platform_data *adf4350_parse_dt(struct device *dev) 391 492 { 392 493 struct adf4350_platform_data *pdata; ··· 635 522 636 523 indio_dev->info = &adf4350_info; 637 524 indio_dev->modes = INDIO_DIRECT_MODE; 638 - indio_dev->channels = &adf4350_chan; 639 - indio_dev->num_channels = 1; 640 525 641 526 mutex_init(&st->lock); 642 527 ··· 660 549 ret = adf4350_set_freq(st, pdata->power_up_frequency); 661 550 if (ret) 662 551 return ret; 552 + } 553 + 554 + ret = adf4350_clk_register(st); 555 + if (ret) 556 + return ret; 557 + 558 + if (!st->clkout) { 559 + indio_dev->channels = &adf4350_chan; 560 + indio_dev->num_channels = 1; 663 561 } 664 562 665 563 ret = devm_add_action_or_reset(&spi->dev, adf4350_power_down, indio_dev);
+9 -17
drivers/iio/gyro/adis16136.c
··· 221 221 unsigned int freq; 222 222 int ret; 223 223 224 - adis_dev_lock(&adis16136->adis); 224 + adis_dev_auto_lock(&adis16136->adis); 225 225 ret = __adis16136_get_freq(adis16136, &freq); 226 - adis_dev_unlock(&adis16136->adis); 227 226 if (ret) 228 227 return ret; 229 228 230 - return sprintf(buf, "%d\n", freq); 229 + return sysfs_emit(buf, "%d\n", freq); 231 230 } 232 231 233 232 static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, ··· 250 251 unsigned int freq; 251 252 int i, ret; 252 253 253 - adis_dev_lock(&adis16136->adis); 254 + adis_dev_auto_lock(&adis16136->adis); 254 255 ret = __adis16136_get_freq(adis16136, &freq); 255 256 if (ret) 256 - goto out_unlock; 257 + return ret; 257 258 258 259 for (i = ARRAY_SIZE(adis16136_3db_divisors) - 1; i >= 1; i--) { 259 260 if (freq / adis16136_3db_divisors[i] >= val) 260 261 break; 261 262 } 262 263 263 - ret = __adis_write_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT, i); 264 - out_unlock: 265 - adis_dev_unlock(&adis16136->adis); 266 - 267 - return ret; 264 + return __adis_write_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT, i); 268 265 } 269 266 270 267 static int adis16136_get_filter(struct iio_dev *indio_dev, int *val) ··· 270 275 uint16_t val16; 271 276 int ret; 272 277 273 - adis_dev_lock(&adis16136->adis); 278 + adis_dev_auto_lock(&adis16136->adis); 274 279 275 280 ret = __adis_read_reg_16(&adis16136->adis, ADIS16136_REG_AVG_CNT, 276 281 &val16); 277 282 if (ret) 278 - goto err_unlock; 283 + return ret; 279 284 280 285 ret = __adis16136_get_freq(adis16136, &freq); 281 286 if (ret) 282 - goto err_unlock; 287 + return ret; 283 288 284 289 *val = freq / adis16136_3db_divisors[val16 & 0x07]; 285 290 286 - err_unlock: 287 - adis_dev_unlock(&adis16136->adis); 288 - 289 - return ret ? ret : IIO_VAL_INT; 291 + return IIO_VAL_INT; 290 292 } 291 293 292 294 static int adis16136_read_raw(struct iio_dev *indio_dev,
+8 -11
drivers/iio/gyro/adis16260.c
··· 270 270 { 271 271 struct adis16260 *adis16260 = iio_priv(indio_dev); 272 272 struct adis *adis = &adis16260->adis; 273 - int ret; 274 273 u8 addr; 275 274 u8 t; 276 275 ··· 287 288 addr = adis16260_addresses[chan->scan_index][1]; 288 289 return adis_write_reg_16(adis, addr, val); 289 290 case IIO_CHAN_INFO_SAMP_FREQ: 290 - adis_dev_lock(adis); 291 291 if (spi_get_device_id(adis->spi)->driver_data) 292 292 t = 256 / val; 293 293 else ··· 296 298 t = ADIS16260_SMPL_PRD_DIV_MASK; 297 299 else if (t > 0) 298 300 t--; 299 - 300 - if (t >= 0x0A) 301 - adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; 302 - else 303 - adis->spi->max_speed_hz = ADIS16260_SPI_FAST; 304 - ret = __adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); 305 - 306 - adis_dev_unlock(adis); 307 - return ret; 301 + adis_dev_auto_scoped_lock(adis) { 302 + if (t >= 0x0A) 303 + adis->spi->max_speed_hz = ADIS16260_SPI_SLOW; 304 + else 305 + adis->spi->max_speed_hz = ADIS16260_SPI_FAST; 306 + return __adis_write_reg_8(adis, ADIS16260_SMPL_PRD, t); 307 + } 308 + unreachable(); 308 309 } 309 310 return -EINVAL; 310 311 }
+2 -2
drivers/iio/gyro/bmg160_core.c
··· 285 285 data->slope_thres = val; 286 286 287 287 /* Set default interrupt mode */ 288 - ret = regmap_update_bits(data->regmap, BMG160_REG_INT_EN_1, 289 - BMG160_INT1_BIT_OD, 0); 288 + ret = regmap_clear_bits(data->regmap, BMG160_REG_INT_EN_1, 289 + BMG160_INT1_BIT_OD); 290 290 if (ret < 0) { 291 291 dev_err(dev, "Error updating bits in reg_int_en_1\n"); 292 292 return ret;
+14 -21
drivers/iio/gyro/mpu3050-core.c
··· 197 197 int i; 198 198 199 199 /* Reset */ 200 - ret = regmap_update_bits(mpu3050->map, MPU3050_PWR_MGM, 201 - MPU3050_PWR_MGM_RESET, MPU3050_PWR_MGM_RESET); 200 + ret = regmap_set_bits(mpu3050->map, MPU3050_PWR_MGM, 201 + MPU3050_PWR_MGM_RESET); 202 202 if (ret) 203 203 return ret; 204 204 ··· 513 513 "FIFO overflow! Emptying and resetting FIFO\n"); 514 514 fifo_overflow = true; 515 515 /* Reset and enable the FIFO */ 516 - ret = regmap_update_bits(mpu3050->map, 517 - MPU3050_USR_CTRL, 518 - MPU3050_USR_CTRL_FIFO_EN | 519 - MPU3050_USR_CTRL_FIFO_RST, 520 - MPU3050_USR_CTRL_FIFO_EN | 521 - MPU3050_USR_CTRL_FIFO_RST); 516 + ret = regmap_set_bits(mpu3050->map, MPU3050_USR_CTRL, 517 + MPU3050_USR_CTRL_FIFO_EN | 518 + MPU3050_USR_CTRL_FIFO_RST); 522 519 if (ret) { 523 520 dev_info(mpu3050->dev, "error resetting FIFO\n"); 524 521 goto out_trigger_unlock; ··· 796 799 u64 otp; 797 800 798 801 /* Reset */ 799 - ret = regmap_update_bits(mpu3050->map, 800 - MPU3050_PWR_MGM, 801 - MPU3050_PWR_MGM_RESET, 802 - MPU3050_PWR_MGM_RESET); 802 + ret = regmap_set_bits(mpu3050->map, MPU3050_PWR_MGM, 803 + MPU3050_PWR_MGM_RESET); 803 804 if (ret) 804 805 return ret; 805 806 ··· 867 872 msleep(200); 868 873 869 874 /* Take device out of sleep mode */ 870 - ret = regmap_update_bits(mpu3050->map, MPU3050_PWR_MGM, 871 - MPU3050_PWR_MGM_SLEEP, 0); 875 + ret = regmap_clear_bits(mpu3050->map, MPU3050_PWR_MGM, 876 + MPU3050_PWR_MGM_SLEEP); 872 877 if (ret) { 873 878 regulator_bulk_disable(ARRAY_SIZE(mpu3050->regs), mpu3050->regs); 874 879 dev_err(mpu3050->dev, "error setting power mode\n"); ··· 890 895 * then we would be wasting power unless we go to sleep mode 891 896 * first. 892 897 */ 893 - ret = regmap_update_bits(mpu3050->map, MPU3050_PWR_MGM, 894 - MPU3050_PWR_MGM_SLEEP, MPU3050_PWR_MGM_SLEEP); 898 + ret = regmap_set_bits(mpu3050->map, MPU3050_PWR_MGM, 899 + MPU3050_PWR_MGM_SLEEP); 895 900 if (ret) 896 901 dev_err(mpu3050->dev, "error putting to sleep\n"); 897 902 ··· 992 997 return ret; 993 998 994 999 /* Reset and enable the FIFO */ 995 - ret = regmap_update_bits(mpu3050->map, MPU3050_USR_CTRL, 996 - MPU3050_USR_CTRL_FIFO_EN | 997 - MPU3050_USR_CTRL_FIFO_RST, 998 - MPU3050_USR_CTRL_FIFO_EN | 999 - MPU3050_USR_CTRL_FIFO_RST); 1000 + ret = regmap_set_bits(mpu3050->map, MPU3050_USR_CTRL, 1001 + MPU3050_USR_CTRL_FIFO_EN | 1002 + MPU3050_USR_CTRL_FIFO_RST); 1000 1003 if (ret) 1001 1004 return ret; 1002 1005
+4 -5
drivers/iio/health/afe4403.c
··· 422 422 struct afe4403_data *afe = iio_priv(indio_dev); 423 423 int ret; 424 424 425 - ret = regmap_update_bits(afe->regmap, AFE440X_CONTROL2, 426 - AFE440X_CONTROL2_PDN_AFE, 427 - AFE440X_CONTROL2_PDN_AFE); 425 + ret = regmap_set_bits(afe->regmap, AFE440X_CONTROL2, 426 + AFE440X_CONTROL2_PDN_AFE); 428 427 if (ret) 429 428 return ret; 430 429 ··· 448 449 return ret; 449 450 } 450 451 451 - ret = regmap_update_bits(afe->regmap, AFE440X_CONTROL2, 452 - AFE440X_CONTROL2_PDN_AFE, 0); 452 + ret = regmap_clear_bits(afe->regmap, AFE440X_CONTROL2, 453 + AFE440X_CONTROL2_PDN_AFE); 453 454 if (ret) 454 455 return ret; 455 456
+4 -5
drivers/iio/health/afe4404.c
··· 430 430 struct afe4404_data *afe = iio_priv(indio_dev); 431 431 int ret; 432 432 433 - ret = regmap_update_bits(afe->regmap, AFE440X_CONTROL2, 434 - AFE440X_CONTROL2_PDN_AFE, 435 - AFE440X_CONTROL2_PDN_AFE); 433 + ret = regmap_set_bits(afe->regmap, AFE440X_CONTROL2, 434 + AFE440X_CONTROL2_PDN_AFE); 436 435 if (ret) 437 436 return ret; 438 437 ··· 456 457 return ret; 457 458 } 458 459 459 - ret = regmap_update_bits(afe->regmap, AFE440X_CONTROL2, 460 - AFE440X_CONTROL2_PDN_AFE, 0); 460 + ret = regmap_clear_bits(afe->regmap, AFE440X_CONTROL2, 461 + AFE440X_CONTROL2_PDN_AFE); 461 462 if (ret) 462 463 return ret; 463 464
+2 -3
drivers/iio/health/max30100.c
··· 363 363 int ret; 364 364 365 365 /* start acquisition */ 366 - ret = regmap_update_bits(data->regmap, MAX30100_REG_MODE_CONFIG, 367 - MAX30100_REG_MODE_CONFIG_TEMP_EN, 368 - MAX30100_REG_MODE_CONFIG_TEMP_EN); 366 + ret = regmap_set_bits(data->regmap, MAX30100_REG_MODE_CONFIG, 367 + MAX30100_REG_MODE_CONFIG_TEMP_EN); 369 368 if (ret) 370 369 return ret; 371 370
+2 -3
drivers/iio/health/max30102.c
··· 448 448 } 449 449 450 450 /* start acquisition */ 451 - ret = regmap_update_bits(data->regmap, MAX30102_REG_TEMP_CONFIG, 452 - MAX30102_REG_TEMP_CONFIG_TEMP_EN, 453 - MAX30102_REG_TEMP_CONFIG_TEMP_EN); 451 + ret = regmap_set_bits(data->regmap, MAX30102_REG_TEMP_CONFIG, 452 + MAX30102_REG_TEMP_CONFIG_TEMP_EN); 454 453 if (ret) 455 454 goto out; 456 455
+4
drivers/iio/iio_core.h
··· 34 34 struct iio_ioctl_handler *h); 35 35 void iio_device_ioctl_handler_unregister(struct iio_ioctl_handler *h); 36 36 37 + ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, 38 + const struct iio_chan_spec *c, 39 + char *buf); 40 + 37 41 int __iio_add_chan_devattr(const char *postfix, 38 42 struct iio_chan_spec const *chan, 39 43 ssize_t (*func)(struct device *dev,
+4 -7
drivers/iio/imu/adis.c
··· 466 466 unsigned int uval; 467 467 int ret; 468 468 469 - mutex_lock(&adis->state_lock); 469 + guard(mutex)(&adis->state_lock); 470 470 471 471 ret = __adis_read_reg(adis, chan->address, &uval, 472 472 chan->scan_type.storagebits / 8); 473 473 if (ret) 474 - goto err_unlock; 474 + return ret; 475 475 476 476 if (uval & error_mask) { 477 477 ret = __adis_check_status(adis); 478 478 if (ret) 479 - goto err_unlock; 479 + return ret; 480 480 } 481 481 482 482 if (chan->scan_type.sign == 's') ··· 484 484 else 485 485 *val = uval & ((1 << chan->scan_type.realbits) - 1); 486 486 487 - ret = IIO_VAL_INT; 488 - err_unlock: 489 - mutex_unlock(&adis->state_lock); 490 - return ret; 487 + return IIO_VAL_INT; 491 488 } 492 489 EXPORT_SYMBOL_NS_GPL(adis_single_conversion, IIO_ADISLIB); 493 490
+35 -37
drivers/iio/imu/adis16400.c
··· 497 497 struct iio_chan_spec const *chan, int val, int val2, long info) 498 498 { 499 499 struct adis16400_state *st = iio_priv(indio_dev); 500 - int ret, sps; 500 + int sps; 501 501 502 502 switch (info) { 503 503 case IIO_CHAN_INFO_CALIBBIAS: 504 - ret = adis_write_reg_16(&st->adis, 505 - adis16400_addresses[chan->scan_index], val); 506 - return ret; 504 + return adis_write_reg_16(&st->adis, 505 + adis16400_addresses[chan->scan_index], 506 + val); 507 507 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: 508 508 /* 509 509 * Need to cache values so we can update if the frequency 510 510 * changes. 511 511 */ 512 - adis_dev_lock(&st->adis); 513 - st->filt_int = val; 514 - /* Work out update to current value */ 515 - sps = st->variant->get_freq(st); 516 - if (sps < 0) { 517 - adis_dev_unlock(&st->adis); 518 - return sps; 519 - } 512 + adis_dev_auto_scoped_lock(&st->adis) { 513 + st->filt_int = val; 514 + /* Work out update to current value */ 515 + sps = st->variant->get_freq(st); 516 + if (sps < 0) 517 + return sps; 520 518 521 - ret = __adis16400_set_filter(indio_dev, sps, 522 - val * 1000 + val2 / 1000); 523 - adis_dev_unlock(&st->adis); 524 - return ret; 519 + return __adis16400_set_filter(indio_dev, sps, 520 + val * 1000 + val2 / 1000); 521 + } 522 + unreachable(); 525 523 case IIO_CHAN_INFO_SAMP_FREQ: 526 524 sps = val * 1000 + val2 / 1000; 527 525 528 526 if (sps <= 0) 529 527 return -EINVAL; 530 528 531 - adis_dev_lock(&st->adis); 532 - ret = st->variant->set_freq(st, sps); 533 - adis_dev_unlock(&st->adis); 534 - return ret; 529 + adis_dev_auto_scoped_lock(&st->adis) 530 + return st->variant->set_freq(st, sps); 531 + unreachable(); 535 532 default: 536 533 return -EINVAL; 537 534 } ··· 593 596 *val = st->variant->temp_offset; 594 597 return IIO_VAL_INT; 595 598 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY: 596 - adis_dev_lock(&st->adis); 597 - /* Need both the number of taps and the sampling frequency */ 598 - ret = __adis_read_reg_16(&st->adis, 599 - ADIS16400_SENS_AVG, 600 - &val16); 601 - if (ret) { 602 - adis_dev_unlock(&st->adis); 603 - return ret; 599 + adis_dev_auto_scoped_lock(&st->adis) { 600 + /* 601 + * Need both the number of taps and the sampling 602 + * frequency 603 + */ 604 + ret = __adis_read_reg_16(&st->adis, ADIS16400_SENS_AVG, 605 + &val16); 606 + if (ret) 607 + return ret; 608 + 609 + ret = st->variant->get_freq(st); 610 + if (ret) 611 + return ret; 604 612 } 605 - ret = st->variant->get_freq(st); 606 - adis_dev_unlock(&st->adis); 607 - if (ret) 608 - return ret; 609 613 ret /= adis16400_3db_divisors[val16 & 0x07]; 610 614 *val = ret / 1000; 611 615 *val2 = (ret % 1000) * 1000; 612 616 return IIO_VAL_INT_PLUS_MICRO; 613 617 case IIO_CHAN_INFO_SAMP_FREQ: 614 - adis_dev_lock(&st->adis); 615 - ret = st->variant->get_freq(st); 616 - adis_dev_unlock(&st->adis); 617 - if (ret) 618 - return ret; 618 + adis_dev_auto_scoped_lock(&st->adis) { 619 + ret = st->variant->get_freq(st); 620 + if (ret) 621 + return ret; 622 + } 619 623 *val = ret / 1000; 620 624 *val2 = (ret % 1000) * 1000; 621 625 return IIO_VAL_INT_PLUS_MICRO;
+14 -30
drivers/iio/imu/adis16475.c
··· 302 302 u16 dec; 303 303 u32 sample_rate = st->clk_freq; 304 304 305 - adis_dev_lock(&st->adis); 305 + adis_dev_auto_lock(&st->adis); 306 306 307 307 if (st->sync_mode == ADIS16475_SYNC_SCALED) { 308 308 u16 sync_scale; 309 309 310 310 ret = __adis_read_reg_16(&st->adis, ADIS16475_REG_UP_SCALE, &sync_scale); 311 311 if (ret) 312 - goto error; 312 + return ret; 313 313 314 314 sample_rate = st->clk_freq * sync_scale; 315 315 } 316 316 317 317 ret = __adis_read_reg_16(&st->adis, ADIS16475_REG_DEC_RATE, &dec); 318 318 if (ret) 319 - goto error; 320 - 321 - adis_dev_unlock(&st->adis); 319 + return ret; 322 320 323 321 *freq = DIV_ROUND_CLOSEST(sample_rate, dec + 1); 324 322 325 323 return 0; 326 - error: 327 - adis_dev_unlock(&st->adis); 328 - return ret; 329 324 } 330 325 331 326 static int adis16475_set_freq(struct adis16475 *st, const u32 freq) ··· 335 340 if (!freq) 336 341 return -EINVAL; 337 342 338 - adis_dev_lock(&st->adis); 343 + adis_dev_auto_lock(&st->adis); 339 344 /* 340 345 * When using sync scaled mode, the input clock needs to be scaled so that we have 341 346 * an IMU sample rate between (optimally) int_clk - 100 and int_clk + 100. ··· 380 385 sync_scale = scaled_rate / st->clk_freq; 381 386 ret = __adis_write_reg_16(&st->adis, ADIS16475_REG_UP_SCALE, sync_scale); 382 387 if (ret) 383 - goto error; 388 + return ret; 384 389 385 390 sample_rate = scaled_rate; 386 391 } ··· 395 400 396 401 ret = __adis_write_reg_16(&st->adis, ADIS16475_REG_DEC_RATE, dec); 397 402 if (ret) 398 - goto error; 403 + return ret; 399 404 400 - adis_dev_unlock(&st->adis); 401 405 /* 402 406 * If decimation is used, then gyro and accel data will have meaningful 403 407 * bits on the LSB registers. This info is used on the trigger handler. ··· 404 410 assign_bit(ADIS16475_LSB_DEC_MASK, &st->lsb_flag, dec); 405 411 406 412 return 0; 407 - error: 408 - adis_dev_unlock(&st->adis); 409 - return ret; 410 413 } 411 414 412 415 /* The values are approximated. */ ··· 532 541 struct adis *adis = &st->adis; 533 542 int ret; 534 543 535 - adis_dev_lock(&st->adis); 544 + adis_dev_auto_lock(&st->adis); 536 545 537 546 ret = __adis_update_bits(adis, ADIS16475_REG_FIFO_CTRL, 538 547 ADIS16575_FIFO_EN_MASK, (u16)ADIS16575_FIFO_EN(0)); 539 548 if (ret) 540 - goto unlock; 549 + return ret; 541 550 542 - ret = __adis_write_reg_16(adis, ADIS16475_REG_GLOB_CMD, 543 - ADIS16575_FIFO_FLUSH_CMD); 544 - 545 - unlock: 546 - adis_dev_unlock(&st->adis); 547 - return ret; 551 + return __adis_write_reg_16(adis, ADIS16475_REG_GLOB_CMD, 552 + ADIS16575_FIFO_FLUSH_CMD); 548 553 } 549 554 550 555 static const struct iio_buffer_setup_ops adis16475_buffer_ops = { ··· 554 567 int ret; 555 568 u16 wm_lvl; 556 569 557 - adis_dev_lock(&st->adis); 570 + adis_dev_auto_lock(&st->adis); 558 571 559 572 val = min_t(unsigned int, val, ADIS16575_MAX_FIFO_WM); 560 573 561 574 wm_lvl = ADIS16575_WM_LVL(val - 1); 562 575 ret = __adis_update_bits(&st->adis, ADIS16475_REG_FIFO_CTRL, ADIS16575_WM_LVL_MASK, wm_lvl); 563 576 if (ret) 564 - goto unlock; 577 + return ret; 565 578 566 579 st->fifo_watermark = val; 567 580 568 - unlock: 569 - adis_dev_unlock(&st->adis); 570 - return ret; 581 + return 0; 571 582 } 572 583 573 584 static const u32 adis16475_calib_regs[] = { ··· 1730 1745 int ret; 1731 1746 u16 fifo_cnt, i; 1732 1747 1733 - adis_dev_lock(&st->adis); 1748 + adis_dev_auto_lock(&st->adis); 1734 1749 1735 1750 ret = __adis_read_reg_16(adis, ADIS16575_REG_FIFO_CNT, &fifo_cnt); 1736 1751 if (ret) ··· 1766 1781 * reading data from registers will impact the FIFO reading. 1767 1782 */ 1768 1783 adis16475_burst32_check(st); 1769 - adis_dev_unlock(&st->adis); 1770 1784 iio_trigger_notify_done(indio_dev->trig); 1771 1785 1772 1786 return IRQ_HANDLED;
+25 -40
drivers/iio/imu/adis16480.c
··· 345 345 if (t == 0) 346 346 return -EINVAL; 347 347 348 - adis_dev_lock(&st->adis); 348 + adis_dev_auto_lock(&st->adis); 349 349 /* 350 350 * When using PPS mode, the input clock needs to be scaled so that we have an IMU 351 351 * sample rate between (optimally) 4000 and 4250. After this, we can use the ··· 388 388 sync_scale = scaled_rate / st->clk_freq; 389 389 ret = __adis_write_reg_16(&st->adis, ADIS16495_REG_SYNC_SCALE, sync_scale); 390 390 if (ret) 391 - goto error; 391 + return ret; 392 392 393 393 sample_rate = scaled_rate; 394 394 } ··· 400 400 if (t > st->chip_info->max_dec_rate) 401 401 t = st->chip_info->max_dec_rate; 402 402 403 - ret = __adis_write_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, t); 404 - error: 405 - adis_dev_unlock(&st->adis); 406 - return ret; 403 + return __adis_write_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, t); 407 404 } 408 405 409 406 static int adis16480_get_freq(struct iio_dev *indio_dev, int *val, int *val2) ··· 410 413 int ret; 411 414 unsigned int freq, sample_rate = st->clk_freq; 412 415 413 - adis_dev_lock(&st->adis); 416 + adis_dev_auto_lock(&st->adis); 414 417 415 418 if (st->clk_mode == ADIS16480_CLK_PPS) { 416 419 u16 sync_scale; 417 420 418 421 ret = __adis_read_reg_16(&st->adis, ADIS16495_REG_SYNC_SCALE, &sync_scale); 419 422 if (ret) 420 - goto error; 423 + return ret; 421 424 422 425 sample_rate = st->clk_freq * sync_scale; 423 426 } 424 427 425 428 ret = __adis_read_reg_16(&st->adis, ADIS16480_REG_DEC_RATE, &t); 426 429 if (ret) 427 - goto error; 428 - 429 - adis_dev_unlock(&st->adis); 430 + return ret; 430 431 431 432 freq = DIV_ROUND_CLOSEST(sample_rate, (t + 1)); 432 433 ··· 432 437 *val2 = (freq % 1000) * 1000; 433 438 434 439 return IIO_VAL_INT_PLUS_MICRO; 435 - error: 436 - adis_dev_unlock(&st->adis); 437 - return ret; 438 440 } 439 441 440 442 enum { ··· 622 630 offset = ad16480_filter_data[chan->scan_index][1]; 623 631 enable_mask = BIT(offset + 2); 624 632 625 - adis_dev_lock(&st->adis); 633 + adis_dev_auto_lock(&st->adis); 626 634 627 635 ret = __adis_read_reg_16(&st->adis, reg, &val); 628 636 if (ret) 629 - goto out_unlock; 637 + return ret; 630 638 631 639 if (freq == 0) { 632 640 val &= ~enable_mask; ··· 648 656 val |= enable_mask; 649 657 } 650 658 651 - ret = __adis_write_reg_16(&st->adis, reg, val); 652 - out_unlock: 653 - adis_dev_unlock(&st->adis); 654 - 655 - return ret; 659 + return __adis_write_reg_16(&st->adis, reg, val); 656 660 } 657 661 658 662 static int adis16480_read_raw(struct iio_dev *indio_dev, ··· 1343 1355 u32 crc; 1344 1356 bool valid; 1345 1357 1346 - adis_dev_lock(adis); 1347 - if (adis->current_page != 0) { 1348 - adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID); 1349 - adis->tx[1] = 0; 1350 - ret = spi_write(adis->spi, adis->tx, 2); 1351 - if (ret) { 1352 - dev_err(dev, "Failed to change device page: %d\n", ret); 1353 - adis_dev_unlock(adis); 1354 - goto irq_done; 1358 + adis_dev_auto_scoped_lock(adis) { 1359 + if (adis->current_page != 0) { 1360 + adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID); 1361 + adis->tx[1] = 0; 1362 + ret = spi_write(adis->spi, adis->tx, 2); 1363 + if (ret) { 1364 + dev_err(dev, "Failed to change device page: %d\n", ret); 1365 + goto irq_done; 1366 + } 1367 + 1368 + adis->current_page = 0; 1355 1369 } 1356 1370 1357 - adis->current_page = 0; 1371 + ret = spi_sync(adis->spi, &adis->msg); 1372 + if (ret) { 1373 + dev_err(dev, "Failed to read data: %d\n", ret); 1374 + goto irq_done; 1375 + } 1358 1376 } 1359 - 1360 - ret = spi_sync(adis->spi, &adis->msg); 1361 - if (ret) { 1362 - dev_err(dev, "Failed to read data: %d\n", ret); 1363 - adis_dev_unlock(adis); 1364 - goto irq_done; 1365 - } 1366 - 1367 - adis_dev_unlock(adis); 1368 1377 1369 1378 /* 1370 1379 * After making the burst request, the response can have one or two
+23 -18
drivers/iio/imu/adis_buffer.c
··· 126 126 } 127 127 EXPORT_SYMBOL_NS_GPL(adis_update_scan_mode, IIO_ADISLIB); 128 128 129 + static int adis_paging_trigger_handler(struct adis *adis) 130 + { 131 + int ret; 132 + 133 + guard(mutex)(&adis->state_lock); 134 + if (adis->current_page != 0) { 135 + adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID); 136 + adis->tx[1] = 0; 137 + ret = spi_write(adis->spi, adis->tx, 2); 138 + if (ret) { 139 + dev_err(&adis->spi->dev, "Failed to change device page: %d\n", ret); 140 + return ret; 141 + } 142 + 143 + adis->current_page = 0; 144 + } 145 + 146 + return spi_sync(adis->spi, &adis->msg); 147 + } 148 + 129 149 static irqreturn_t adis_trigger_handler(int irq, void *p) 130 150 { 131 151 struct iio_poll_func *pf = p; ··· 153 133 struct adis *adis = iio_device_get_drvdata(indio_dev); 154 134 int ret; 155 135 156 - if (adis->data->has_paging) { 157 - mutex_lock(&adis->state_lock); 158 - if (adis->current_page != 0) { 159 - adis->tx[0] = ADIS_WRITE_REG(ADIS_REG_PAGE_ID); 160 - adis->tx[1] = 0; 161 - ret = spi_write(adis->spi, adis->tx, 2); 162 - if (ret) { 163 - dev_err(&adis->spi->dev, "Failed to change device page: %d\n", ret); 164 - mutex_unlock(&adis->state_lock); 165 - goto irq_done; 166 - } 167 - 168 - adis->current_page = 0; 169 - } 170 - } 171 - 172 - ret = spi_sync(adis->spi, &adis->msg); 173 136 if (adis->data->has_paging) 174 - mutex_unlock(&adis->state_lock); 137 + ret = adis_paging_trigger_handler(adis); 138 + else 139 + ret = spi_sync(adis->spi, &adis->msg); 175 140 if (ret) { 176 141 dev_err(&adis->spi->dev, "Failed to read data: %d", ret); 177 142 goto irq_done;
+6 -8
drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c
··· 274 274 275 275 /* restore watermark interrupt */ 276 276 if (restore) { 277 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 278 - INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN, 279 - INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN); 277 + ret = regmap_set_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 278 + INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN); 280 279 if (ret) 281 280 return ret; 282 281 } ··· 317 318 } 318 319 319 320 /* set FIFO threshold interrupt */ 320 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 321 - INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN, 322 - INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN); 321 + ret = regmap_set_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 322 + INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN); 323 323 if (ret) 324 324 goto out_unlock; 325 325 ··· 373 375 goto out_unlock; 374 376 375 377 /* disable FIFO threshold interrupt */ 376 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 377 - INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN, 0); 378 + ret = regmap_clear_bits(st->map, INV_ICM42600_REG_INT_SOURCE0, 379 + INV_ICM42600_INT_SOURCE0_FIFO_THS_INT1_EN); 378 380 if (ret) 379 381 goto out_unlock; 380 382
+4 -5
drivers/iio/imu/inv_icm42600/inv_icm42600_core.c
··· 496 496 return ret; 497 497 498 498 /* sensor data in big-endian (default) */ 499 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0, 500 - INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN, 501 - INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN); 499 + ret = regmap_set_bits(st->map, INV_ICM42600_REG_INTF_CONFIG0, 500 + INV_ICM42600_INTF_CONFIG0_SENSOR_DATA_ENDIAN); 502 501 if (ret) 503 502 return ret; 504 503 ··· 602 603 return ret; 603 604 604 605 /* Deassert async reset for proper INT pin operation (cf datasheet) */ 605 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INT_CONFIG1, 606 - INV_ICM42600_INT_CONFIG1_ASYNC_RESET, 0); 606 + ret = regmap_clear_bits(st->map, INV_ICM42600_REG_INT_CONFIG1, 607 + INV_ICM42600_INT_CONFIG1_ASYNC_RESET); 607 608 if (ret) 608 609 return ret; 609 610
+2 -2
drivers/iio/imu/inv_icm42600/inv_icm42600_i2c.c
··· 28 28 INV_ICM42600_INTF_CONFIG6_MASK, 29 29 INV_ICM42600_INTF_CONFIG6_I3C_EN); 30 30 31 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4, 32 - INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY, 0); 31 + ret = regmap_clear_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4, 32 + INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY); 33 33 if (ret) 34 34 return ret; 35 35
+2 -2
drivers/iio/imu/inv_icm42600/inv_icm42600_spi.c
··· 27 27 if (ret) 28 28 return ret; 29 29 30 - ret = regmap_update_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4, 31 - INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY, 0); 30 + ret = regmap_clear_bits(st->map, INV_ICM42600_REG_INTF_CONFIG4, 31 + INV_ICM42600_INTF_CONFIG4_I3C_BUS_ONLY); 32 32 if (ret) 33 33 return ret; 34 34
+3 -5
drivers/iio/industrialio-backend.c
··· 561 561 } 562 562 563 563 fwnode = fwnode_find_reference(dev_fwnode(dev), "io-backends", index); 564 - if (IS_ERR(fwnode)) { 565 - dev_err_probe(dev, PTR_ERR(fwnode), 566 - "Cannot get Firmware reference\n"); 567 - return ERR_CAST(fwnode); 568 - } 564 + if (IS_ERR(fwnode)) 565 + return dev_err_cast_probe(dev, fwnode, 566 + "Cannot get Firmware reference\n"); 569 567 570 568 guard(mutex)(&iio_back_lock); 571 569 list_for_each_entry(back, &iio_back_list, entry) {
+459
drivers/iio/industrialio-buffer.c
··· 9 9 * - Better memory allocation techniques? 10 10 * - Alternative access techniques? 11 11 */ 12 + #include <linux/atomic.h> 12 13 #include <linux/anon_inodes.h> 13 14 #include <linux/cleanup.h> 14 15 #include <linux/kernel.h> 15 16 #include <linux/export.h> 16 17 #include <linux/device.h> 18 + #include <linux/dma-buf.h> 19 + #include <linux/dma-fence.h> 20 + #include <linux/dma-resv.h> 17 21 #include <linux/file.h> 18 22 #include <linux/fs.h> 19 23 #include <linux/cdev.h> 20 24 #include <linux/slab.h> 25 + #include <linux/mm.h> 21 26 #include <linux/poll.h> 22 27 #include <linux/sched/signal.h> 23 28 ··· 33 28 #include <linux/iio/sysfs.h> 34 29 #include <linux/iio/buffer.h> 35 30 #include <linux/iio/buffer_impl.h> 31 + 32 + #define DMABUF_ENQUEUE_TIMEOUT_MS 5000 33 + 34 + MODULE_IMPORT_NS(DMA_BUF); 35 + 36 + struct iio_dmabuf_priv { 37 + struct list_head entry; 38 + struct kref ref; 39 + 40 + struct iio_buffer *buffer; 41 + struct iio_dma_buffer_block *block; 42 + 43 + u64 context; 44 + 45 + /* Spinlock used for locking the dma_fence */ 46 + spinlock_t lock; 47 + 48 + struct dma_buf_attachment *attach; 49 + struct sg_table *sgt; 50 + enum dma_data_direction dir; 51 + atomic_t seqno; 52 + }; 53 + 54 + struct iio_dma_fence { 55 + struct dma_fence base; 56 + struct iio_dmabuf_priv *priv; 57 + struct work_struct work; 58 + }; 36 59 37 60 static const char * const iio_endian_prefix[] = { 38 61 [IIO_BE] = "be", ··· 366 333 { 367 334 INIT_LIST_HEAD(&buffer->demux_list); 368 335 INIT_LIST_HEAD(&buffer->buffer_list); 336 + INIT_LIST_HEAD(&buffer->dmabufs); 337 + mutex_init(&buffer->dmabufs_mutex); 369 338 init_waitqueue_head(&buffer->pollq); 370 339 kref_init(&buffer->ref); 371 340 if (!buffer->watermark) ··· 1561 1526 kfree(iio_dev_opaque->legacy_scan_el_group.attrs); 1562 1527 } 1563 1528 1529 + static void iio_buffer_dmabuf_release(struct kref *ref) 1530 + { 1531 + struct iio_dmabuf_priv *priv = container_of(ref, struct iio_dmabuf_priv, ref); 1532 + struct dma_buf_attachment *attach = priv->attach; 1533 + struct iio_buffer *buffer = priv->buffer; 1534 + struct dma_buf *dmabuf = attach->dmabuf; 1535 + 1536 + dma_resv_lock(dmabuf->resv, NULL); 1537 + dma_buf_unmap_attachment(attach, priv->sgt, priv->dir); 1538 + dma_resv_unlock(dmabuf->resv); 1539 + 1540 + buffer->access->detach_dmabuf(buffer, priv->block); 1541 + 1542 + dma_buf_detach(attach->dmabuf, attach); 1543 + dma_buf_put(dmabuf); 1544 + kfree(priv); 1545 + } 1546 + 1547 + static void iio_buffer_dmabuf_get(struct dma_buf_attachment *attach) 1548 + { 1549 + struct iio_dmabuf_priv *priv = attach->importer_priv; 1550 + 1551 + kref_get(&priv->ref); 1552 + } 1553 + 1554 + static void iio_buffer_dmabuf_put(struct dma_buf_attachment *attach) 1555 + { 1556 + struct iio_dmabuf_priv *priv = attach->importer_priv; 1557 + 1558 + kref_put(&priv->ref, iio_buffer_dmabuf_release); 1559 + } 1560 + 1564 1561 static int iio_buffer_chrdev_release(struct inode *inode, struct file *filep) 1565 1562 { 1566 1563 struct iio_dev_buffer_pair *ib = filep->private_data; 1567 1564 struct iio_dev *indio_dev = ib->indio_dev; 1568 1565 struct iio_buffer *buffer = ib->buffer; 1566 + struct iio_dmabuf_priv *priv, *tmp; 1569 1567 1570 1568 wake_up(&buffer->pollq); 1569 + 1570 + guard(mutex)(&buffer->dmabufs_mutex); 1571 + 1572 + /* Close all attached DMABUFs */ 1573 + list_for_each_entry_safe(priv, tmp, &buffer->dmabufs, entry) { 1574 + list_del_init(&priv->entry); 1575 + iio_buffer_dmabuf_put(priv->attach); 1576 + } 1571 1577 1572 1578 kfree(ib); 1573 1579 clear_bit(IIO_BUSY_BIT_POS, &buffer->flags); ··· 1617 1541 return 0; 1618 1542 } 1619 1543 1544 + static int iio_dma_resv_lock(struct dma_buf *dmabuf, bool nonblock) 1545 + { 1546 + if (!nonblock) 1547 + return dma_resv_lock_interruptible(dmabuf->resv, NULL); 1548 + 1549 + if (!dma_resv_trylock(dmabuf->resv)) 1550 + return -EBUSY; 1551 + 1552 + return 0; 1553 + } 1554 + 1555 + static struct dma_buf_attachment * 1556 + iio_buffer_find_attachment(struct iio_dev_buffer_pair *ib, 1557 + struct dma_buf *dmabuf, bool nonblock) 1558 + { 1559 + struct device *dev = ib->indio_dev->dev.parent; 1560 + struct iio_buffer *buffer = ib->buffer; 1561 + struct dma_buf_attachment *attach = NULL; 1562 + struct iio_dmabuf_priv *priv; 1563 + 1564 + guard(mutex)(&buffer->dmabufs_mutex); 1565 + 1566 + list_for_each_entry(priv, &buffer->dmabufs, entry) { 1567 + if (priv->attach->dev == dev 1568 + && priv->attach->dmabuf == dmabuf) { 1569 + attach = priv->attach; 1570 + break; 1571 + } 1572 + } 1573 + 1574 + if (attach) 1575 + iio_buffer_dmabuf_get(attach); 1576 + 1577 + return attach ?: ERR_PTR(-EPERM); 1578 + } 1579 + 1580 + static int iio_buffer_attach_dmabuf(struct iio_dev_buffer_pair *ib, 1581 + int __user *user_fd, bool nonblock) 1582 + { 1583 + struct iio_dev *indio_dev = ib->indio_dev; 1584 + struct iio_buffer *buffer = ib->buffer; 1585 + struct dma_buf_attachment *attach; 1586 + struct iio_dmabuf_priv *priv, *each; 1587 + struct dma_buf *dmabuf; 1588 + int err, fd; 1589 + 1590 + if (!buffer->access->attach_dmabuf 1591 + || !buffer->access->detach_dmabuf 1592 + || !buffer->access->enqueue_dmabuf) 1593 + return -EPERM; 1594 + 1595 + if (copy_from_user(&fd, user_fd, sizeof(fd))) 1596 + return -EFAULT; 1597 + 1598 + priv = kzalloc(sizeof(*priv), GFP_KERNEL); 1599 + if (!priv) 1600 + return -ENOMEM; 1601 + 1602 + spin_lock_init(&priv->lock); 1603 + priv->context = dma_fence_context_alloc(1); 1604 + 1605 + dmabuf = dma_buf_get(fd); 1606 + if (IS_ERR(dmabuf)) { 1607 + err = PTR_ERR(dmabuf); 1608 + goto err_free_priv; 1609 + } 1610 + 1611 + attach = dma_buf_attach(dmabuf, indio_dev->dev.parent); 1612 + if (IS_ERR(attach)) { 1613 + err = PTR_ERR(attach); 1614 + goto err_dmabuf_put; 1615 + } 1616 + 1617 + err = iio_dma_resv_lock(dmabuf, nonblock); 1618 + if (err) 1619 + goto err_dmabuf_detach; 1620 + 1621 + priv->dir = buffer->direction == IIO_BUFFER_DIRECTION_IN 1622 + ? DMA_FROM_DEVICE : DMA_TO_DEVICE; 1623 + 1624 + priv->sgt = dma_buf_map_attachment(attach, priv->dir); 1625 + if (IS_ERR(priv->sgt)) { 1626 + err = PTR_ERR(priv->sgt); 1627 + dev_err(&indio_dev->dev, "Unable to map attachment: %d\n", err); 1628 + goto err_resv_unlock; 1629 + } 1630 + 1631 + kref_init(&priv->ref); 1632 + priv->buffer = buffer; 1633 + priv->attach = attach; 1634 + attach->importer_priv = priv; 1635 + 1636 + priv->block = buffer->access->attach_dmabuf(buffer, attach); 1637 + if (IS_ERR(priv->block)) { 1638 + err = PTR_ERR(priv->block); 1639 + goto err_dmabuf_unmap_attachment; 1640 + } 1641 + 1642 + dma_resv_unlock(dmabuf->resv); 1643 + 1644 + mutex_lock(&buffer->dmabufs_mutex); 1645 + 1646 + /* 1647 + * Check whether we already have an attachment for this driver/DMABUF 1648 + * combo. If we do, refuse to attach. 1649 + */ 1650 + list_for_each_entry(each, &buffer->dmabufs, entry) { 1651 + if (each->attach->dev == indio_dev->dev.parent 1652 + && each->attach->dmabuf == dmabuf) { 1653 + /* 1654 + * We unlocked the reservation object, so going through 1655 + * the cleanup code would mean re-locking it first. 1656 + * At this stage it is simpler to free the attachment 1657 + * using iio_buffer_dma_put(). 1658 + */ 1659 + mutex_unlock(&buffer->dmabufs_mutex); 1660 + iio_buffer_dmabuf_put(attach); 1661 + return -EBUSY; 1662 + } 1663 + } 1664 + 1665 + /* Otherwise, add the new attachment to our dmabufs list. */ 1666 + list_add(&priv->entry, &buffer->dmabufs); 1667 + mutex_unlock(&buffer->dmabufs_mutex); 1668 + 1669 + return 0; 1670 + 1671 + err_dmabuf_unmap_attachment: 1672 + dma_buf_unmap_attachment(attach, priv->sgt, priv->dir); 1673 + err_resv_unlock: 1674 + dma_resv_unlock(dmabuf->resv); 1675 + err_dmabuf_detach: 1676 + dma_buf_detach(dmabuf, attach); 1677 + err_dmabuf_put: 1678 + dma_buf_put(dmabuf); 1679 + err_free_priv: 1680 + kfree(priv); 1681 + 1682 + return err; 1683 + } 1684 + 1685 + static int iio_buffer_detach_dmabuf(struct iio_dev_buffer_pair *ib, 1686 + int __user *user_req, bool nonblock) 1687 + { 1688 + struct iio_buffer *buffer = ib->buffer; 1689 + struct iio_dev *indio_dev = ib->indio_dev; 1690 + struct iio_dmabuf_priv *priv; 1691 + struct dma_buf *dmabuf; 1692 + int dmabuf_fd, ret = -EPERM; 1693 + 1694 + if (copy_from_user(&dmabuf_fd, user_req, sizeof(dmabuf_fd))) 1695 + return -EFAULT; 1696 + 1697 + dmabuf = dma_buf_get(dmabuf_fd); 1698 + if (IS_ERR(dmabuf)) 1699 + return PTR_ERR(dmabuf); 1700 + 1701 + guard(mutex)(&buffer->dmabufs_mutex); 1702 + 1703 + list_for_each_entry(priv, &buffer->dmabufs, entry) { 1704 + if (priv->attach->dev == indio_dev->dev.parent 1705 + && priv->attach->dmabuf == dmabuf) { 1706 + list_del(&priv->entry); 1707 + 1708 + /* Unref the reference from iio_buffer_attach_dmabuf() */ 1709 + iio_buffer_dmabuf_put(priv->attach); 1710 + ret = 0; 1711 + break; 1712 + } 1713 + } 1714 + 1715 + dma_buf_put(dmabuf); 1716 + 1717 + return ret; 1718 + } 1719 + 1720 + static const char * 1721 + iio_buffer_dma_fence_get_driver_name(struct dma_fence *fence) 1722 + { 1723 + return "iio"; 1724 + } 1725 + 1726 + static void iio_buffer_dma_fence_release(struct dma_fence *fence) 1727 + { 1728 + struct iio_dma_fence *iio_fence = 1729 + container_of(fence, struct iio_dma_fence, base); 1730 + 1731 + kfree(iio_fence); 1732 + } 1733 + 1734 + static const struct dma_fence_ops iio_buffer_dma_fence_ops = { 1735 + .get_driver_name = iio_buffer_dma_fence_get_driver_name, 1736 + .get_timeline_name = iio_buffer_dma_fence_get_driver_name, 1737 + .release = iio_buffer_dma_fence_release, 1738 + }; 1739 + 1740 + static int iio_buffer_enqueue_dmabuf(struct iio_dev_buffer_pair *ib, 1741 + struct iio_dmabuf __user *iio_dmabuf_req, 1742 + bool nonblock) 1743 + { 1744 + struct iio_buffer *buffer = ib->buffer; 1745 + struct iio_dmabuf iio_dmabuf; 1746 + struct dma_buf_attachment *attach; 1747 + struct iio_dmabuf_priv *priv; 1748 + struct iio_dma_fence *fence; 1749 + struct dma_buf *dmabuf; 1750 + unsigned long timeout; 1751 + bool cookie, cyclic, dma_to_ram; 1752 + long retl; 1753 + u32 seqno; 1754 + int ret; 1755 + 1756 + if (copy_from_user(&iio_dmabuf, iio_dmabuf_req, sizeof(iio_dmabuf))) 1757 + return -EFAULT; 1758 + 1759 + if (iio_dmabuf.flags & ~IIO_BUFFER_DMABUF_SUPPORTED_FLAGS) 1760 + return -EINVAL; 1761 + 1762 + cyclic = iio_dmabuf.flags & IIO_BUFFER_DMABUF_CYCLIC; 1763 + 1764 + /* Cyclic flag is only supported on output buffers */ 1765 + if (cyclic && buffer->direction != IIO_BUFFER_DIRECTION_OUT) 1766 + return -EINVAL; 1767 + 1768 + dmabuf = dma_buf_get(iio_dmabuf.fd); 1769 + if (IS_ERR(dmabuf)) 1770 + return PTR_ERR(dmabuf); 1771 + 1772 + if (!iio_dmabuf.bytes_used || iio_dmabuf.bytes_used > dmabuf->size) { 1773 + ret = -EINVAL; 1774 + goto err_dmabuf_put; 1775 + } 1776 + 1777 + attach = iio_buffer_find_attachment(ib, dmabuf, nonblock); 1778 + if (IS_ERR(attach)) { 1779 + ret = PTR_ERR(attach); 1780 + goto err_dmabuf_put; 1781 + } 1782 + 1783 + priv = attach->importer_priv; 1784 + 1785 + fence = kmalloc(sizeof(*fence), GFP_KERNEL); 1786 + if (!fence) { 1787 + ret = -ENOMEM; 1788 + goto err_attachment_put; 1789 + } 1790 + 1791 + fence->priv = priv; 1792 + 1793 + seqno = atomic_add_return(1, &priv->seqno); 1794 + 1795 + /* 1796 + * The transfers are guaranteed to be processed in the order they are 1797 + * enqueued, so we can use a simple incrementing sequence number for 1798 + * the dma_fence. 1799 + */ 1800 + dma_fence_init(&fence->base, &iio_buffer_dma_fence_ops, 1801 + &priv->lock, priv->context, seqno); 1802 + 1803 + ret = iio_dma_resv_lock(dmabuf, nonblock); 1804 + if (ret) 1805 + goto err_fence_put; 1806 + 1807 + timeout = nonblock ? 0 : msecs_to_jiffies(DMABUF_ENQUEUE_TIMEOUT_MS); 1808 + dma_to_ram = buffer->direction == IIO_BUFFER_DIRECTION_IN; 1809 + 1810 + /* Make sure we don't have writers */ 1811 + retl = dma_resv_wait_timeout(dmabuf->resv, 1812 + dma_resv_usage_rw(dma_to_ram), 1813 + true, timeout); 1814 + if (retl == 0) 1815 + retl = -EBUSY; 1816 + if (retl < 0) { 1817 + ret = (int)retl; 1818 + goto err_resv_unlock; 1819 + } 1820 + 1821 + if (buffer->access->lock_queue) 1822 + buffer->access->lock_queue(buffer); 1823 + 1824 + ret = dma_resv_reserve_fences(dmabuf->resv, 1); 1825 + if (ret) 1826 + goto err_queue_unlock; 1827 + 1828 + dma_resv_add_fence(dmabuf->resv, &fence->base, 1829 + dma_to_ram ? DMA_RESV_USAGE_WRITE : DMA_RESV_USAGE_READ); 1830 + dma_resv_unlock(dmabuf->resv); 1831 + 1832 + cookie = dma_fence_begin_signalling(); 1833 + 1834 + ret = buffer->access->enqueue_dmabuf(buffer, priv->block, &fence->base, 1835 + priv->sgt, iio_dmabuf.bytes_used, 1836 + cyclic); 1837 + if (ret) { 1838 + /* 1839 + * DMABUF enqueue failed, but we already added the fence. 1840 + * Signal the error through the fence completion mechanism. 1841 + */ 1842 + iio_buffer_signal_dmabuf_done(&fence->base, ret); 1843 + } 1844 + 1845 + if (buffer->access->unlock_queue) 1846 + buffer->access->unlock_queue(buffer); 1847 + 1848 + dma_fence_end_signalling(cookie); 1849 + dma_buf_put(dmabuf); 1850 + 1851 + return ret; 1852 + 1853 + err_queue_unlock: 1854 + if (buffer->access->unlock_queue) 1855 + buffer->access->unlock_queue(buffer); 1856 + err_resv_unlock: 1857 + dma_resv_unlock(dmabuf->resv); 1858 + err_fence_put: 1859 + dma_fence_put(&fence->base); 1860 + err_attachment_put: 1861 + iio_buffer_dmabuf_put(attach); 1862 + err_dmabuf_put: 1863 + dma_buf_put(dmabuf); 1864 + 1865 + return ret; 1866 + } 1867 + 1868 + static void iio_buffer_cleanup(struct work_struct *work) 1869 + { 1870 + struct iio_dma_fence *fence = 1871 + container_of(work, struct iio_dma_fence, work); 1872 + struct iio_dmabuf_priv *priv = fence->priv; 1873 + struct dma_buf_attachment *attach = priv->attach; 1874 + 1875 + dma_fence_put(&fence->base); 1876 + iio_buffer_dmabuf_put(attach); 1877 + } 1878 + 1879 + void iio_buffer_signal_dmabuf_done(struct dma_fence *fence, int ret) 1880 + { 1881 + struct iio_dma_fence *iio_fence = 1882 + container_of(fence, struct iio_dma_fence, base); 1883 + bool cookie = dma_fence_begin_signalling(); 1884 + 1885 + /* 1886 + * Get a reference to the fence, so that it's not freed as soon as 1887 + * it's signaled. 1888 + */ 1889 + dma_fence_get(fence); 1890 + 1891 + fence->error = ret; 1892 + dma_fence_signal(fence); 1893 + dma_fence_end_signalling(cookie); 1894 + 1895 + /* 1896 + * The fence will be unref'd in iio_buffer_cleanup. 1897 + * It can't be done here, as the unref functions might try to lock the 1898 + * resv object, which can deadlock. 1899 + */ 1900 + INIT_WORK(&iio_fence->work, iio_buffer_cleanup); 1901 + schedule_work(&iio_fence->work); 1902 + } 1903 + EXPORT_SYMBOL_GPL(iio_buffer_signal_dmabuf_done); 1904 + 1905 + static long iio_buffer_chrdev_ioctl(struct file *filp, 1906 + unsigned int cmd, unsigned long arg) 1907 + { 1908 + struct iio_dev_buffer_pair *ib = filp->private_data; 1909 + void __user *_arg = (void __user *)arg; 1910 + bool nonblock = filp->f_flags & O_NONBLOCK; 1911 + 1912 + switch (cmd) { 1913 + case IIO_BUFFER_DMABUF_ATTACH_IOCTL: 1914 + return iio_buffer_attach_dmabuf(ib, _arg, nonblock); 1915 + case IIO_BUFFER_DMABUF_DETACH_IOCTL: 1916 + return iio_buffer_detach_dmabuf(ib, _arg, nonblock); 1917 + case IIO_BUFFER_DMABUF_ENQUEUE_IOCTL: 1918 + return iio_buffer_enqueue_dmabuf(ib, _arg, nonblock); 1919 + default: 1920 + return -EINVAL; 1921 + } 1922 + } 1923 + 1620 1924 static const struct file_operations iio_buffer_chrdev_fileops = { 1621 1925 .owner = THIS_MODULE, 1622 1926 .llseek = noop_llseek, 1623 1927 .read = iio_buffer_read, 1624 1928 .write = iio_buffer_write, 1929 + .unlocked_ioctl = iio_buffer_chrdev_ioctl, 1930 + .compat_ioctl = compat_ptr_ioctl, 1625 1931 .poll = iio_buffer_poll, 1626 1932 .release = iio_buffer_chrdev_release, 1627 1933 }; ··· 2452 1994 { 2453 1995 struct iio_buffer *buffer = container_of(ref, struct iio_buffer, ref); 2454 1996 1997 + mutex_destroy(&buffer->dmabufs_mutex); 2455 1998 buffer->access->release(buffer); 2456 1999 } 2457 2000
+15 -10
drivers/iio/industrialio-core.c
··· 727 727 } 728 728 EXPORT_SYMBOL_GPL(iio_format_value); 729 729 730 + ssize_t do_iio_read_channel_label(struct iio_dev *indio_dev, 731 + const struct iio_chan_spec *c, 732 + char *buf) 733 + { 734 + if (indio_dev->info->read_label) 735 + return indio_dev->info->read_label(indio_dev, c, buf); 736 + 737 + if (c->extend_name) 738 + return sysfs_emit(buf, "%s\n", c->extend_name); 739 + 740 + return -EINVAL; 741 + } 742 + 730 743 static ssize_t iio_read_channel_label(struct device *dev, 731 744 struct device_attribute *attr, 732 745 char *buf) 733 746 { 734 - struct iio_dev *indio_dev = dev_to_iio_dev(dev); 735 - struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 736 - 737 - if (indio_dev->info->read_label) 738 - return indio_dev->info->read_label(indio_dev, this_attr->c, buf); 739 - 740 - if (this_attr->c->extend_name) 741 - return sysfs_emit(buf, "%s\n", this_attr->c->extend_name); 742 - 743 - return -EINVAL; 747 + return do_iio_read_channel_label(dev_to_iio_dev(dev), 748 + to_iio_dev_attr(attr)->c, buf); 744 749 } 745 750 746 751 static ssize_t iio_read_channel_info(struct device *dev,
+6
drivers/iio/inkern.c
··· 1010 1010 chan->channel, buf, len); 1011 1011 } 1012 1012 EXPORT_SYMBOL_GPL(iio_write_channel_ext_info); 1013 + 1014 + ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf) 1015 + { 1016 + return do_iio_read_channel_label(chan->indio_dev, chan->channel, buf); 1017 + } 1018 + EXPORT_SYMBOL_GPL(iio_read_channel_label);
+6 -7
drivers/iio/light/adux1020.c
··· 539 539 * Trigger proximity interrupt when the intensity is above 540 540 * or below threshold 541 541 */ 542 - ret = regmap_update_bits(data->regmap, ADUX1020_REG_PROX_TYPE, 543 - ADUX1020_PROX_TYPE, 544 - ADUX1020_PROX_TYPE); 542 + ret = regmap_set_bits(data->regmap, ADUX1020_REG_PROX_TYPE, 543 + ADUX1020_PROX_TYPE); 545 544 if (ret < 0) 546 545 goto fail; 547 546 ··· 747 748 748 749 dev_dbg(&client->dev, "Detected ADUX1020 with chip id: 0x%04x\n", val); 749 750 750 - ret = regmap_update_bits(data->regmap, ADUX1020_REG_SW_RESET, 751 - ADUX1020_SW_RESET, ADUX1020_SW_RESET); 751 + ret = regmap_set_bits(data->regmap, ADUX1020_REG_SW_RESET, 752 + ADUX1020_SW_RESET); 752 753 if (ret < 0) 753 754 return ret; 754 755 ··· 763 764 return ret; 764 765 765 766 /* Use LED_IREF for proximity mode */ 766 - ret = regmap_update_bits(data->regmap, ADUX1020_REG_LED_CURRENT, 767 - ADUX1020_LED_PIREF_EN, 0); 767 + ret = regmap_clear_bits(data->regmap, ADUX1020_REG_LED_CURRENT, 768 + ADUX1020_LED_PIREF_EN); 768 769 if (ret < 0) 769 770 return ret; 770 771
+2 -2
drivers/iio/light/iqs621-als.c
··· 86 86 if (iqs621_als->prox_en) 87 87 event_mask |= iqs62x->dev_desc->ir_mask; 88 88 89 - return regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, 90 - event_mask, 0); 89 + return regmap_clear_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK, 90 + event_mask); 91 91 } 92 92 93 93 static int iqs621_als_notifier(struct notifier_block *notifier,
+3 -3
drivers/iio/light/isl29018.c
··· 550 550 return -ENODEV; 551 551 552 552 /* Clear brownout bit */ 553 - status = regmap_update_bits(chip->regmap, 554 - ISL29035_REG_DEVICE_ID, 555 - ISL29035_BOUT_MASK, 0); 553 + status = regmap_clear_bits(chip->regmap, 554 + ISL29035_REG_DEVICE_ID, 555 + ISL29035_BOUT_MASK); 556 556 if (status < 0) 557 557 return status; 558 558 }
+2 -2
drivers/iio/light/st_uvis25_core.c
··· 330 330 struct iio_dev *iio_dev = dev_get_drvdata(dev); 331 331 struct st_uvis25_hw *hw = iio_priv(iio_dev); 332 332 333 - return regmap_update_bits(hw->regmap, ST_UVIS25_REG_CTRL1_ADDR, 334 - ST_UVIS25_REG_ODR_MASK, 0); 333 + return regmap_clear_bits(hw->regmap, ST_UVIS25_REG_CTRL1_ADDR, 334 + ST_UVIS25_REG_ODR_MASK); 335 335 } 336 336 337 337 static int st_uvis25_resume(struct device *dev)
+2 -2
drivers/iio/light/veml6030.c
··· 144 144 145 145 static int veml6030_als_pwr_on(struct veml6030_data *data) 146 146 { 147 - return regmap_update_bits(data->regmap, VEML6030_REG_ALS_CONF, 148 - VEML6030_ALS_SD, 0); 147 + return regmap_clear_bits(data->regmap, VEML6030_REG_ALS_CONF, 148 + VEML6030_ALS_SD); 149 149 } 150 150 151 151 static int veml6030_als_shut_down(struct veml6030_data *data)
+2 -8
drivers/iio/magnetometer/ak8974.c
··· 327 327 } 328 328 329 329 /* Force a measurement */ 330 - return regmap_update_bits(ak8974->map, 331 - AK8974_CTRL3, 332 - AK8974_CTRL3_FORCE, 333 - AK8974_CTRL3_FORCE); 330 + return regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_FORCE); 334 331 } 335 332 336 333 static int ak8974_await_drdy(struct ak8974 *ak8974) ··· 435 438 } 436 439 437 440 /* Trigger self-test */ 438 - ret = regmap_update_bits(ak8974->map, 439 - AK8974_CTRL3, 440 - AK8974_CTRL3_SELFTEST, 441 - AK8974_CTRL3_SELFTEST); 441 + ret = regmap_set_bits(ak8974->map, AK8974_CTRL3, AK8974_CTRL3_SELFTEST); 442 442 if (ret) { 443 443 dev_err(dev, "could not write CTRL3\n"); 444 444 return ret;
+3 -5
drivers/iio/magnetometer/mmc35240.c
··· 186 186 * Recharge the capacitor at VCAP pin, requested to be issued 187 187 * before a SET/RESET command. 188 188 */ 189 - ret = regmap_update_bits(data->regmap, MMC35240_REG_CTRL0, 190 - MMC35240_CTRL0_REFILL_BIT, 191 - MMC35240_CTRL0_REFILL_BIT); 189 + ret = regmap_set_bits(data->regmap, MMC35240_REG_CTRL0, 190 + MMC35240_CTRL0_REFILL_BIT); 192 191 if (ret < 0) 193 192 return ret; 194 193 usleep_range(MMC35240_WAIT_CHARGE_PUMP, MMC35240_WAIT_CHARGE_PUMP + 1); ··· 197 198 else 198 199 coil_bit = MMC35240_CTRL0_RESET_BIT; 199 200 200 - return regmap_update_bits(data->regmap, MMC35240_REG_CTRL0, 201 - coil_bit, coil_bit); 201 + return regmap_set_bits(data->regmap, MMC35240_REG_CTRL0, coil_bit); 202 202 203 203 } 204 204
+2 -2
drivers/iio/pressure/bmp280-core.c
··· 1645 1645 goto exit; 1646 1646 1647 1647 /* Disable programming mode bit */ 1648 - ret = regmap_update_bits(data->regmap, BMP580_REG_NVM_ADDR, 1649 - BMP580_NVM_PROG_EN, 0); 1648 + ret = regmap_clear_bits(data->regmap, BMP580_REG_NVM_ADDR, 1649 + BMP580_NVM_PROG_EN); 1650 1650 if (ret) { 1651 1651 dev_err(data->dev, "error resetting nvm write\n"); 1652 1652 goto exit;
+2 -3
drivers/iio/proximity/sx9324.c
··· 835 835 int ret; 836 836 837 837 /* run the compensation phase on all channels */ 838 - ret = regmap_update_bits(data->regmap, SX9324_REG_STAT2, 839 - SX9324_REG_STAT2_COMPSTAT_MASK, 840 - SX9324_REG_STAT2_COMPSTAT_MASK); 838 + ret = regmap_set_bits(data->regmap, SX9324_REG_STAT2, 839 + SX9324_REG_STAT2_COMPSTAT_MASK); 841 840 if (ret) 842 841 return ret; 843 842
+2 -3
drivers/iio/proximity/sx9360.c
··· 672 672 int ret; 673 673 674 674 /* run the compensation phase on all channels */ 675 - ret = regmap_update_bits(data->regmap, SX9360_REG_STAT, 676 - SX9360_REG_STAT_COMPSTAT_MASK, 677 - SX9360_REG_STAT_COMPSTAT_MASK); 675 + ret = regmap_set_bits(data->regmap, SX9360_REG_STAT, 676 + SX9360_REG_STAT_COMPSTAT_MASK); 678 677 if (ret) 679 678 return ret; 680 679
+6 -6
drivers/iio/proximity/sx9500.c
··· 209 209 /* Bit is already active, nothing to do. */ 210 210 return 0; 211 211 212 - return regmap_update_bits(data->regmap, reg, bitmask, bitmask); 212 + return regmap_set_bits(data->regmap, reg, bitmask); 213 213 } 214 214 215 215 static int sx9500_dec_users(struct sx9500_data *data, int *counter, ··· 220 220 /* There are more users, do not deactivate. */ 221 221 return 0; 222 222 223 - return regmap_update_bits(data->regmap, reg, bitmask, 0); 223 + return regmap_clear_bits(data->regmap, reg, bitmask); 224 224 } 225 225 226 226 static int sx9500_inc_chan_users(struct sx9500_data *data, int chan) ··· 795 795 int i, ret; 796 796 unsigned int val; 797 797 798 - ret = regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, 799 - SX9500_CHAN_MASK, SX9500_CHAN_MASK); 798 + ret = regmap_set_bits(data->regmap, SX9500_REG_PROX_CTRL0, 799 + SX9500_CHAN_MASK); 800 800 if (ret < 0) 801 801 return ret; 802 802 ··· 815 815 } 816 816 817 817 out: 818 - regmap_update_bits(data->regmap, SX9500_REG_PROX_CTRL0, 819 - SX9500_CHAN_MASK, 0); 818 + regmap_clear_bits(data->regmap, SX9500_REG_PROX_CTRL0, 819 + SX9500_CHAN_MASK); 820 820 return ret; 821 821 } 822 822
+4 -5
drivers/iio/proximity/sx_common.c
··· 111 111 { 112 112 if (!data->client->irq) 113 113 return 0; 114 - return regmap_update_bits(data->regmap, data->chip_info->reg_irq_msk, 115 - irq << data->chip_info->irq_msk_offset, 116 - irq << data->chip_info->irq_msk_offset); 114 + return regmap_set_bits(data->regmap, data->chip_info->reg_irq_msk, 115 + irq << data->chip_info->irq_msk_offset); 117 116 } 118 117 119 118 static int sx_common_disable_irq(struct sx_common_data *data, unsigned int irq) 120 119 { 121 120 if (!data->client->irq) 122 121 return 0; 123 - return regmap_update_bits(data->regmap, data->chip_info->reg_irq_msk, 124 - irq << data->chip_info->irq_msk_offset, 0); 122 + return regmap_clear_bits(data->regmap, data->chip_info->reg_irq_msk, 123 + irq << data->chip_info->irq_msk_offset); 125 124 } 126 125 127 126 static int sx_common_update_chan_en(struct sx_common_data *data,
+113 -147
drivers/iio/temperature/ltc2983.c
··· 8 8 #include <linux/bitfield.h> 9 9 #include <linux/completion.h> 10 10 #include <linux/device.h> 11 + #include <linux/err.h> 12 + #include <linux/errno.h> 11 13 #include <linux/kernel.h> 12 14 #include <linux/iio/iio.h> 13 15 #include <linux/interrupt.h> ··· 434 432 else 435 433 n_entries = fwnode_property_count_u64(fn, propname); 436 434 /* n_entries must be an even number */ 437 - if (!n_entries || (n_entries % 2) != 0) { 438 - dev_err(dev, "Number of entries either 0 or not even\n"); 439 - return ERR_PTR(-EINVAL); 440 - } 435 + if (!n_entries || (n_entries % 2) != 0) 436 + return dev_err_ptr_probe(dev, -EINVAL, 437 + "Number of entries either 0 or not even\n"); 441 438 442 439 new_custom = devm_kzalloc(dev, sizeof(*new_custom), GFP_KERNEL); 443 440 if (!new_custom) ··· 444 443 445 444 new_custom->size = n_entries * n_size; 446 445 /* check Steinhart size */ 447 - if (is_steinhart && new_custom->size != LTC2983_CUSTOM_STEINHART_SIZE) { 448 - dev_err(dev, "Steinhart sensors size(%zu) must be %u\n", new_custom->size, 449 - LTC2983_CUSTOM_STEINHART_SIZE); 450 - return ERR_PTR(-EINVAL); 451 - } 446 + if (is_steinhart && new_custom->size != LTC2983_CUSTOM_STEINHART_SIZE) 447 + return dev_err_ptr_probe(dev, -EINVAL, 448 + "Steinhart sensors size(%zu) must be %u\n", 449 + new_custom->size, LTC2983_CUSTOM_STEINHART_SIZE); 450 + 452 451 /* Check space on the table. */ 453 452 if (st->custom_table_size + new_custom->size > 454 - (LTC2983_CUST_SENS_TBL_END_REG - 455 - LTC2983_CUST_SENS_TBL_START_REG) + 1) { 456 - dev_err(dev, "No space left(%d) for new custom sensor(%zu)", 457 - st->custom_table_size, new_custom->size); 458 - return ERR_PTR(-EINVAL); 459 - } 453 + (LTC2983_CUST_SENS_TBL_END_REG - LTC2983_CUST_SENS_TBL_START_REG) + 1) 454 + return dev_err_ptr_probe(dev, -EINVAL, 455 + "No space left(%d) for new custom sensor(%zu)\n", 456 + st->custom_table_size, new_custom->size); 460 457 461 458 /* allocate the table */ 462 459 if (is_steinhart) ··· 687 688 LTC2983_THERMOCOUPLE_OC_CURR(3); 688 689 break; 689 690 default: 690 - dev_err(&st->spi->dev, 691 - "Invalid open circuit current:%u", oc_current); 692 - return ERR_PTR(-EINVAL); 691 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 692 + "Invalid open circuit current:%u\n", 693 + oc_current); 693 694 } 694 695 695 696 thermo->sensor_config |= LTC2983_THERMOCOUPLE_OC_CHECK(1); 696 697 } 697 698 /* validate channel index */ 698 699 if (!(thermo->sensor_config & LTC2983_THERMOCOUPLE_DIFF_MASK) && 699 - sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 700 - dev_err(&st->spi->dev, 701 - "Invalid chann:%d for differential thermocouple", 702 - sensor->chan); 703 - return ERR_PTR(-EINVAL); 704 - } 700 + sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 701 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 702 + "Invalid chann:%d for differential thermocouple\n", 703 + sensor->chan); 705 704 706 705 struct fwnode_handle *ref __free(fwnode_handle) = 707 706 fwnode_find_reference(child, "adi,cold-junction-handle", 0); ··· 707 710 ref = NULL; 708 711 } else { 709 712 ret = fwnode_property_read_u32(ref, "reg", &thermo->cold_junction_chan); 710 - if (ret) { 713 + if (ret) 711 714 /* 712 715 * This would be catched later but we can just return 713 716 * the error right away. 714 717 */ 715 - dev_err(&st->spi->dev, "Property reg must be given\n"); 716 - return ERR_PTR(ret); 717 - } 718 + return dev_err_ptr_probe(&st->spi->dev, ret, 719 + "Property reg must be given\n"); 718 720 } 719 721 720 722 /* check custom sensor */ ··· 749 753 750 754 struct fwnode_handle *ref __free(fwnode_handle) = 751 755 fwnode_find_reference(child, "adi,rsense-handle", 0); 752 - if (IS_ERR(ref)) { 753 - dev_err(dev, "Property adi,rsense-handle missing or invalid"); 754 - return ERR_CAST(ref); 755 - } 756 + if (IS_ERR(ref)) 757 + return dev_err_cast_probe(dev, ref, 758 + "Property adi,rsense-handle missing or invalid\n"); 756 759 757 760 ret = fwnode_property_read_u32(ref, "reg", &rtd->r_sense_chan); 758 - if (ret) { 759 - dev_err(dev, "Property reg must be given\n"); 760 - return ERR_PTR(ret); 761 - } 761 + if (ret) 762 + return dev_err_ptr_probe(dev, ret, 763 + "Property reg must be given\n"); 762 764 763 765 ret = fwnode_property_read_u32(child, "adi,number-of-wires", &n_wires); 764 766 if (!ret) { ··· 775 781 rtd->sensor_config = LTC2983_RTD_N_WIRES(3); 776 782 break; 777 783 default: 778 - dev_err(dev, "Invalid number of wires:%u\n", n_wires); 779 - return ERR_PTR(-EINVAL); 784 + return dev_err_ptr_probe(dev, -EINVAL, 785 + "Invalid number of wires:%u\n", 786 + n_wires); 780 787 } 781 788 } 782 789 783 790 if (fwnode_property_read_bool(child, "adi,rsense-share")) { 784 791 /* Current rotation is only available with rsense sharing */ 785 792 if (fwnode_property_read_bool(child, "adi,current-rotate")) { 786 - if (n_wires == 2 || n_wires == 3) { 787 - dev_err(dev, 788 - "Rotation not allowed for 2/3 Wire RTDs"); 789 - return ERR_PTR(-EINVAL); 790 - } 793 + if (n_wires == 2 || n_wires == 3) 794 + return dev_err_ptr_probe(dev, -EINVAL, 795 + "Rotation not allowed for 2/3 Wire RTDs\n"); 796 + 791 797 rtd->sensor_config |= LTC2983_RTD_C_ROTATE(1); 792 798 } else { 793 799 rtd->sensor_config |= LTC2983_RTD_R_SHARE(1); ··· 810 816 811 817 if (((rtd->sensor_config & LTC2983_RTD_KELVIN_R_SENSE_MASK) 812 818 == LTC2983_RTD_KELVIN_R_SENSE_MASK) && 813 - (rtd->r_sense_chan <= min)) { 819 + (rtd->r_sense_chan <= min)) 814 820 /* kelvin rsense*/ 815 - dev_err(dev, 816 - "Invalid rsense chann:%d to use in kelvin rsense", 817 - rtd->r_sense_chan); 821 + return dev_err_ptr_probe(dev, -EINVAL, 822 + "Invalid rsense chann:%d to use in kelvin rsense\n", 823 + rtd->r_sense_chan); 818 824 819 - return ERR_PTR(-EINVAL); 820 - } 821 - 822 - if (sensor->chan < min || sensor->chan > max) { 823 - dev_err(dev, "Invalid chann:%d for the rtd config", 824 - sensor->chan); 825 - 826 - return ERR_PTR(-EINVAL); 827 - } 825 + if (sensor->chan < min || sensor->chan > max) 826 + return dev_err_ptr_probe(dev, -EINVAL, 827 + "Invalid chann:%d for the rtd config\n", 828 + sensor->chan); 828 829 } else { 829 830 /* same as differential case */ 830 - if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 831 - dev_err(&st->spi->dev, 832 - "Invalid chann:%d for RTD", sensor->chan); 833 - 834 - return ERR_PTR(-EINVAL); 835 - } 831 + if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 832 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 833 + "Invalid chann:%d for RTD\n", 834 + sensor->chan); 836 835 } 837 836 838 837 /* check custom sensor */ ··· 873 886 rtd->excitation_current = 0x08; 874 887 break; 875 888 default: 876 - dev_err(&st->spi->dev, 877 - "Invalid value for excitation current(%u)", 878 - excitation_current); 879 - return ERR_PTR(-EINVAL); 889 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 890 + "Invalid value for excitation current(%u)\n", 891 + excitation_current); 880 892 } 881 893 } 882 894 ··· 899 913 900 914 struct fwnode_handle *ref __free(fwnode_handle) = 901 915 fwnode_find_reference(child, "adi,rsense-handle", 0); 902 - if (IS_ERR(ref)) { 903 - dev_err(dev, "Property adi,rsense-handle missing or invalid"); 904 - return ERR_CAST(ref); 905 - } 916 + if (IS_ERR(ref)) 917 + return dev_err_cast_probe(dev, ref, 918 + "Property adi,rsense-handle missing or invalid\n"); 906 919 907 920 ret = fwnode_property_read_u32(ref, "reg", &thermistor->r_sense_chan); 908 - if (ret) { 909 - dev_err(dev, "rsense channel must be configured...\n"); 910 - return ERR_PTR(ret); 911 - } 921 + if (ret) 922 + return dev_err_ptr_probe(dev, ret, 923 + "rsense channel must be configured...\n"); 912 924 913 925 if (fwnode_property_read_bool(child, "adi,single-ended")) { 914 926 thermistor->sensor_config = LTC2983_THERMISTOR_SGL(1); ··· 921 937 } 922 938 /* validate channel index */ 923 939 if (!(thermistor->sensor_config & LTC2983_THERMISTOR_DIFF_MASK) && 924 - sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 925 - dev_err(&st->spi->dev, 926 - "Invalid chann:%d for differential thermistor", 927 - sensor->chan); 928 - return ERR_PTR(-EINVAL); 929 - } 940 + sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 941 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 942 + "Invalid chann:%d for differential thermistor\n", 943 + sensor->chan); 930 944 931 945 /* check custom sensor */ 932 946 if (sensor->type >= LTC2983_SENSOR_THERMISTOR_STEINHART) { ··· 963 981 switch (excitation_current) { 964 982 case 0: 965 983 /* auto range */ 966 - if (sensor->type >= 967 - LTC2983_SENSOR_THERMISTOR_STEINHART) { 968 - dev_err(&st->spi->dev, 969 - "Auto Range not allowed for custom sensors\n"); 970 - return ERR_PTR(-EINVAL); 971 - } 984 + if (sensor->type >= LTC2983_SENSOR_THERMISTOR_STEINHART) 985 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 986 + "Auto Range not allowed for custom sensors\n"); 987 + 972 988 thermistor->excitation_current = 0x0c; 973 989 break; 974 990 case 250: ··· 1003 1023 thermistor->excitation_current = 0x0b; 1004 1024 break; 1005 1025 default: 1006 - dev_err(&st->spi->dev, 1007 - "Invalid value for excitation current(%u)", 1008 - excitation_current); 1009 - return ERR_PTR(-EINVAL); 1026 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1027 + "Invalid value for excitation current(%u)\n", 1028 + excitation_current); 1010 1029 } 1011 1030 } 1012 1031 ··· 1035 1056 1036 1057 /* validate channel index */ 1037 1058 if (!(diode->sensor_config & LTC2983_DIODE_DIFF_MASK) && 1038 - sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 1039 - dev_err(&st->spi->dev, 1040 - "Invalid chann:%d for differential thermistor", 1041 - sensor->chan); 1042 - return ERR_PTR(-EINVAL); 1043 - } 1059 + sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 1060 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1061 + "Invalid chann:%d for differential thermistor\n", 1062 + sensor->chan); 1063 + 1044 1064 /* set common parameters */ 1045 1065 diode->sensor.fault_handler = ltc2983_common_fault_handler; 1046 1066 diode->sensor.assign_chan = ltc2983_diode_assign_chan; ··· 1061 1083 diode->excitation_current = 0x03; 1062 1084 break; 1063 1085 default: 1064 - dev_err(&st->spi->dev, 1065 - "Invalid value for excitation current(%u)", 1066 - excitation_current); 1067 - return ERR_PTR(-EINVAL); 1086 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1087 + "Invalid value for excitation current(%u)\n", 1088 + excitation_current); 1068 1089 } 1069 1090 } 1070 1091 ··· 1088 1111 return ERR_PTR(-ENOMEM); 1089 1112 1090 1113 /* validate channel index */ 1091 - if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 1092 - dev_err(&st->spi->dev, "Invalid chann:%d for r_sense", 1093 - sensor->chan); 1094 - return ERR_PTR(-EINVAL); 1095 - } 1114 + if (sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 1115 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1116 + "Invalid chann:%d for r_sense\n", 1117 + sensor->chan); 1096 1118 1097 1119 ret = fwnode_property_read_u32(child, "adi,rsense-val-milli-ohms", &temp); 1098 - if (ret) { 1099 - dev_err(&st->spi->dev, "Property adi,rsense-val-milli-ohms missing\n"); 1100 - return ERR_PTR(-EINVAL); 1101 - } 1120 + if (ret) 1121 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1122 + "Property adi,rsense-val-milli-ohms missing\n"); 1102 1123 /* 1103 1124 * Times 1000 because we have milli-ohms and __convert_to_raw 1104 1125 * expects scales of 1000000 which are used for all other ··· 1124 1149 if (fwnode_property_read_bool(child, "adi,single-ended")) 1125 1150 adc->single_ended = true; 1126 1151 1127 - if (!adc->single_ended && 1128 - sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 1129 - dev_err(&st->spi->dev, "Invalid chan:%d for differential adc\n", 1130 - sensor->chan); 1131 - return ERR_PTR(-EINVAL); 1132 - } 1152 + if (!adc->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 1153 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1154 + "Invalid chan:%d for differential adc\n", 1155 + sensor->chan); 1156 + 1133 1157 /* set common parameters */ 1134 1158 adc->sensor.assign_chan = ltc2983_adc_assign_chan; 1135 1159 adc->sensor.fault_handler = ltc2983_common_fault_handler; ··· 1149 1175 if (fwnode_property_read_bool(child, "adi,single-ended")) 1150 1176 temp->single_ended = true; 1151 1177 1152 - if (!temp->single_ended && 1153 - sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) { 1154 - dev_err(&st->spi->dev, "Invalid chan:%d for differential temp\n", 1155 - sensor->chan); 1156 - return ERR_PTR(-EINVAL); 1157 - } 1178 + if (!temp->single_ended && sensor->chan < LTC2983_DIFFERENTIAL_CHAN_MIN) 1179 + return dev_err_ptr_probe(&st->spi->dev, -EINVAL, 1180 + "Invalid chan:%d for differential temp\n", 1181 + sensor->chan); 1158 1182 1159 1183 temp->custom = __ltc2983_custom_sensor_new(st, child, "adi,custom-temp", 1160 1184 false, 4096, true); ··· 1268 1296 1269 1297 if (readval) 1270 1298 return regmap_read(st->regmap, reg, readval); 1271 - else 1272 - return regmap_write(st->regmap, reg, writeval); 1299 + 1300 + return regmap_write(st->regmap, reg, writeval); 1273 1301 } 1274 1302 1275 1303 static irqreturn_t ltc2983_irq_handler(int irq, void *data) ··· 1302 1330 device_property_read_u32(dev, "adi,filter-notch-freq", &st->filter_notch_freq); 1303 1331 1304 1332 st->num_channels = device_get_child_node_count(dev); 1305 - if (!st->num_channels) { 1306 - dev_err(&st->spi->dev, "At least one channel must be given!"); 1307 - return -EINVAL; 1308 - } 1333 + if (!st->num_channels) 1334 + return dev_err_probe(&st->spi->dev, -EINVAL, 1335 + "At least one channel must be given!\n"); 1309 1336 1310 1337 st->sensors = devm_kcalloc(dev, st->num_channels, sizeof(*st->sensors), 1311 1338 GFP_KERNEL); ··· 1409 1438 1410 1439 time = wait_for_completion_timeout(&st->completion, 1411 1440 msecs_to_jiffies(wait_time)); 1412 - if (!time) { 1413 - dev_err(&st->spi->dev, "EEPROM command timed out\n"); 1414 - return -ETIMEDOUT; 1415 - } 1441 + if (!time) 1442 + return dev_err_probe(&st->spi->dev, -ETIMEDOUT, 1443 + "EEPROM command timed out\n"); 1416 1444 1417 1445 ret = regmap_read(st->regmap, status_reg, &val); 1418 1446 if (ret) 1419 1447 return ret; 1420 1448 1421 - if (val & status_fail_mask) { 1422 - dev_err(&st->spi->dev, "EEPROM command failed: 0x%02X\n", val); 1423 - return -EINVAL; 1424 - } 1449 + if (val & status_fail_mask) 1450 + return dev_err_probe(&st->spi->dev, -EINVAL, 1451 + "EEPROM command failed: 0x%02X\n", val); 1425 1452 1426 1453 return 0; 1427 1454 } ··· 1433 1464 ret = regmap_read_poll_timeout(st->regmap, LTC2983_STATUS_REG, status, 1434 1465 LTC2983_STATUS_UP(status) == 1, 25000, 1435 1466 25000 * 10); 1436 - if (ret) { 1437 - dev_err(&st->spi->dev, "Device startup timed out\n"); 1438 - return ret; 1439 - } 1467 + if (ret) 1468 + return dev_err_probe(&st->spi->dev, ret, 1469 + "Device startup timed out\n"); 1440 1470 1441 1471 ret = regmap_update_bits(st->regmap, LTC2983_GLOBAL_CONFIG_REG, 1442 1472 LTC2983_NOTCH_FREQ_MASK, ··· 1551 1583 return -ENODEV; 1552 1584 1553 1585 st->regmap = devm_regmap_init_spi(spi, &ltc2983_regmap_config); 1554 - if (IS_ERR(st->regmap)) { 1555 - dev_err(&spi->dev, "Failed to initialize regmap\n"); 1556 - return PTR_ERR(st->regmap); 1557 - } 1586 + if (IS_ERR(st->regmap)) 1587 + return dev_err_probe(&spi->dev, PTR_ERR(st->regmap), 1588 + "Failed to initialize regmap\n"); 1558 1589 1559 1590 mutex_init(&st->lock); 1560 1591 init_completion(&st->completion); ··· 1591 1624 1592 1625 ret = devm_request_irq(&spi->dev, spi->irq, ltc2983_irq_handler, 1593 1626 IRQF_TRIGGER_RISING, st->info->name, st); 1594 - if (ret) { 1595 - dev_err(&spi->dev, "failed to request an irq, %d", ret); 1596 - return ret; 1597 - } 1627 + if (ret) 1628 + return dev_err_probe(&spi->dev, ret, 1629 + "failed to request an irq\n"); 1598 1630 1599 1631 if (st->info->has_eeprom) { 1600 1632 ret = ltc2983_eeprom_cmd(st, LTC2983_EEPROM_WRITE_CMD,
+2 -2
drivers/iio/temperature/mlx90632.c
··· 334 334 unsigned int reg_status; 335 335 int ret; 336 336 337 - ret = regmap_update_bits(data->regmap, MLX90632_REG_STATUS, 338 - MLX90632_STAT_DATA_RDY, 0); 337 + ret = regmap_clear_bits(data->regmap, MLX90632_REG_STATUS, 338 + MLX90632_STAT_DATA_RDY); 339 339 if (ret < 0) 340 340 return ret; 341 341
+16 -18
drivers/iio/trigger/stm32-timer-trigger.c
··· 158 158 159 159 regmap_write(priv->regmap, TIM_PSC, prescaler); 160 160 regmap_write(priv->regmap, TIM_ARR, prd - 1); 161 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, TIM_CR1_ARPE); 161 + regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE); 162 162 163 163 /* Force master mode to update mode */ 164 164 if (stm32_timer_is_trgo2_name(trig->name)) ··· 169 169 0x2 << TIM_CR2_MMS_SHIFT); 170 170 171 171 /* Make sure that registers are updated */ 172 - regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); 172 + regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG); 173 173 174 174 /* Enable controller */ 175 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, TIM_CR1_CEN); 175 + regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 176 176 mutex_unlock(&priv->lock); 177 177 178 178 return 0; ··· 189 189 190 190 mutex_lock(&priv->lock); 191 191 /* Stop timer */ 192 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0); 193 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); 192 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE); 193 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 194 194 regmap_write(priv->regmap, TIM_PSC, 0); 195 195 regmap_write(priv->regmap, TIM_ARR, 0); 196 196 197 197 /* Force disable master mode */ 198 198 if (stm32_timer_is_trgo2_name(trig->name)) 199 - regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0); 199 + regmap_clear_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2); 200 200 else 201 - regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS, 0); 201 + regmap_clear_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS); 202 202 203 203 /* Make sure that registers are updated */ 204 - regmap_update_bits(priv->regmap, TIM_EGR, TIM_EGR_UG, TIM_EGR_UG); 204 + regmap_set_bits(priv->regmap, TIM_EGR, TIM_EGR_UG); 205 205 206 206 if (priv->enabled) { 207 207 priv->enabled = false; ··· 498 498 priv->enabled = true; 499 499 clk_enable(priv->clk); 500 500 } 501 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 502 - TIM_CR1_CEN); 501 + regmap_set_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 503 502 } else { 504 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 505 - 0); 503 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 506 504 if (priv->enabled) { 507 505 priv->enabled = false; 508 506 clk_disable(priv->clk); ··· 553 555 { 554 556 struct stm32_timer_trigger *priv = iio_priv(indio_dev); 555 557 556 - regmap_update_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS, TIM_SMCR_SMS); 558 + regmap_set_bits(priv->regmap, TIM_SMCR, TIM_SMCR_SMS); 557 559 558 560 return 0; 559 561 } ··· 681 683 return ret; 682 684 683 685 /* TIMx_ARR register shouldn't be buffered (ARPE=0) */ 684 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE, 0); 686 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_ARPE); 685 687 regmap_write(priv->regmap, TIM_ARR, preset); 686 688 687 689 return len; ··· 755 757 * Master mode selection 2 bits can only be written and read back when 756 758 * timer supports it. 757 759 */ 758 - regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, TIM_CR2_MMS2); 760 + regmap_set_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2); 759 761 regmap_read(priv->regmap, TIM_CR2, &val); 760 - regmap_update_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2, 0); 762 + regmap_clear_bits(priv->regmap, TIM_CR2, TIM_CR2_MMS2); 761 763 priv->has_trgo2 = !!val; 762 764 } 763 765 ··· 818 820 /* Check if nobody else use the timer, then disable it */ 819 821 regmap_read(priv->regmap, TIM_CCER, &val); 820 822 if (!(val & TIM_CCER_CCXE)) 821 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); 823 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 822 824 823 825 if (priv->enabled) 824 826 clk_disable(priv->clk); ··· 839 841 regmap_read(priv->regmap, TIM_SMCR, &priv->bak.smcr); 840 842 841 843 /* Disable the timer */ 842 - regmap_update_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN, 0); 844 + regmap_clear_bits(priv->regmap, TIM_CR1, TIM_CR1_CEN); 843 845 clk_disable(priv->clk); 844 846 } 845 847
+28
drivers/spi/spi.c
··· 4382 4382 return ctlr->transfer(spi, message); 4383 4383 } 4384 4384 4385 + static void devm_spi_unoptimize_message(void *msg) 4386 + { 4387 + spi_unoptimize_message(msg); 4388 + } 4389 + 4390 + /** 4391 + * devm_spi_optimize_message - managed version of spi_optimize_message() 4392 + * @dev: the device that manages @msg (usually @spi->dev) 4393 + * @spi: the device that will be used for the message 4394 + * @msg: the message to optimize 4395 + * Return: zero on success, else a negative error code 4396 + * 4397 + * spi_unoptimize_message() will automatically be called when the device is 4398 + * removed. 4399 + */ 4400 + int devm_spi_optimize_message(struct device *dev, struct spi_device *spi, 4401 + struct spi_message *msg) 4402 + { 4403 + int ret; 4404 + 4405 + ret = spi_optimize_message(spi, msg); 4406 + if (ret) 4407 + return ret; 4408 + 4409 + return devm_add_action_or_reset(dev, devm_spi_unoptimize_message, msg); 4410 + } 4411 + EXPORT_SYMBOL_GPL(devm_spi_optimize_message); 4412 + 4385 4413 /** 4386 4414 * spi_async - asynchronous SPI transfer 4387 4415 * @spi: device with which data will be exchanged
+21
include/dt-bindings/iio/adc/mediatek,mt6357-auxadc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ 2 + 3 + #ifndef _DT_BINDINGS_MEDIATEK_MT6357_AUXADC_H 4 + #define _DT_BINDINGS_MEDIATEK_MT6357_AUXADC_H 5 + 6 + /* ADC Channel Index */ 7 + #define MT6357_AUXADC_BATADC 0 8 + #define MT6357_AUXADC_ISENSE 1 9 + #define MT6357_AUXADC_VCDT 2 10 + #define MT6357_AUXADC_BAT_TEMP 3 11 + #define MT6357_AUXADC_CHIP_TEMP 4 12 + #define MT6357_AUXADC_ACCDET 5 13 + #define MT6357_AUXADC_VDCXO 6 14 + #define MT6357_AUXADC_TSX_TEMP 7 15 + #define MT6357_AUXADC_HPOFS_CAL 8 16 + #define MT6357_AUXADC_DCXO_TEMP 9 17 + #define MT6357_AUXADC_VCORE_TEMP 10 18 + #define MT6357_AUXADC_VPROC_TEMP 11 19 + #define MT6357_AUXADC_VBAT 12 20 + 21 + #endif
+22
include/dt-bindings/iio/adc/mediatek,mt6358-auxadc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ 2 + 3 + #ifndef _DT_BINDINGS_MEDIATEK_MT6358_AUXADC_H 4 + #define _DT_BINDINGS_MEDIATEK_MT6358_AUXADC_H 5 + 6 + /* ADC Channel Index */ 7 + #define MT6358_AUXADC_BATADC 0 8 + #define MT6358_AUXADC_VCDT 1 9 + #define MT6358_AUXADC_BAT_TEMP 2 10 + #define MT6358_AUXADC_CHIP_TEMP 3 11 + #define MT6358_AUXADC_ACCDET 4 12 + #define MT6358_AUXADC_VDCXO 5 13 + #define MT6358_AUXADC_TSX_TEMP 6 14 + #define MT6358_AUXADC_HPOFS_CAL 7 15 + #define MT6358_AUXADC_DCXO_TEMP 8 16 + #define MT6358_AUXADC_VBIF 9 17 + #define MT6358_AUXADC_VCORE_TEMP 10 18 + #define MT6358_AUXADC_VPROC_TEMP 11 19 + #define MT6358_AUXADC_VGPU_TEMP 12 20 + #define MT6358_AUXADC_VBAT 13 21 + 22 + #endif
+22
include/dt-bindings/iio/adc/mediatek,mt6359-auxadc.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ 2 + 3 + #ifndef _DT_BINDINGS_MEDIATEK_MT6359_AUXADC_H 4 + #define _DT_BINDINGS_MEDIATEK_MT6359_AUXADC_H 5 + 6 + /* ADC Channel Index */ 7 + #define MT6359_AUXADC_BATADC 0 8 + #define MT6359_AUXADC_BAT_TEMP 1 9 + #define MT6359_AUXADC_CHIP_TEMP 2 10 + #define MT6359_AUXADC_ACCDET 3 11 + #define MT6359_AUXADC_VDCXO 4 12 + #define MT6359_AUXADC_TSX_TEMP 5 13 + #define MT6359_AUXADC_HPOFS_CAL 6 14 + #define MT6359_AUXADC_DCXO_TEMP 7 15 + #define MT6359_AUXADC_VBIF 8 16 + #define MT6359_AUXADC_VCORE_TEMP 9 17 + #define MT6359_AUXADC_VPROC_TEMP 10 18 + #define MT6359_AUXADC_VGPU_TEMP 11 19 + #define MT6359_AUXADC_VBAT 12 20 + #define MT6359_AUXADC_IBAT 13 21 + 22 + #endif
+8
include/linux/dev_printk.h
··· 277 277 278 278 __printf(3, 4) int dev_err_probe(const struct device *dev, int err, const char *fmt, ...); 279 279 280 + /* Simple helper for dev_err_probe() when ERR_PTR() is to be returned. */ 281 + #define dev_err_ptr_probe(dev, ___err, fmt, ...) \ 282 + ERR_PTR(dev_err_probe(dev, ___err, fmt, ##__VA_ARGS__)) 283 + 284 + /* Simple helper for dev_err_probe() when ERR_CAST() is to be returned. */ 285 + #define dev_err_cast_probe(dev, ___err_ptr, fmt, ...) \ 286 + ERR_PTR(dev_err_probe(dev, PTR_ERR(___err_ptr), fmt, ##__VA_ARGS__)) 287 + 280 288 #endif /* _DEVICE_PRINTK_H_ */
+33
include/linux/dmaengine.h
··· 161 161 }; 162 162 163 163 /** 164 + * struct dma_vec - DMA vector 165 + * @addr: Bus address of the start of the vector 166 + * @len: Length in bytes of the DMA vector 167 + */ 168 + struct dma_vec { 169 + dma_addr_t addr; 170 + size_t len; 171 + }; 172 + 173 + /** 164 174 * enum dma_ctrl_flags - DMA flags to augment operation preparation, 165 175 * control completion, and communicate status. 166 176 * @DMA_PREP_INTERRUPT - trigger an interrupt (callback) upon completion of ··· 920 910 struct dma_async_tx_descriptor *(*device_prep_dma_interrupt)( 921 911 struct dma_chan *chan, unsigned long flags); 922 912 913 + struct dma_async_tx_descriptor *(*device_prep_peripheral_dma_vec)( 914 + struct dma_chan *chan, const struct dma_vec *vecs, 915 + size_t nents, enum dma_transfer_direction direction, 916 + unsigned long flags); 923 917 struct dma_async_tx_descriptor *(*device_prep_slave_sg)( 924 918 struct dma_chan *chan, struct scatterlist *sgl, 925 919 unsigned int sg_len, enum dma_transfer_direction direction, ··· 985 971 986 972 return chan->device->device_prep_slave_sg(chan, &sg, 1, 987 973 dir, flags, NULL); 974 + } 975 + 976 + /** 977 + * dmaengine_prep_peripheral_dma_vec() - Prepare a DMA scatter-gather descriptor 978 + * @chan: The channel to be used for this descriptor 979 + * @vecs: The array of DMA vectors that should be transferred 980 + * @nents: The number of DMA vectors in the array 981 + * @dir: Specifies the direction of the data transfer 982 + * @flags: DMA engine flags 983 + */ 984 + static inline struct dma_async_tx_descriptor *dmaengine_prep_peripheral_dma_vec( 985 + struct dma_chan *chan, const struct dma_vec *vecs, size_t nents, 986 + enum dma_transfer_direction dir, unsigned long flags) 987 + { 988 + if (!chan || !chan->device || !chan->device->device_prep_peripheral_dma_vec) 989 + return NULL; 990 + 991 + return chan->device->device_prep_peripheral_dma_vec(chan, vecs, nents, 992 + dir, flags); 988 993 } 989 994 990 995 static inline struct dma_async_tx_descriptor *dmaengine_prep_slave_sg(
+14
include/linux/iio/adc/ad_sigma_delta.h
··· 37 37 * @append_status: Will be called to enable status append at the end of the sample, may be NULL. 38 38 * @set_mode: Will be called to select the current mode, may be NULL. 39 39 * @disable_all: Will be called to disable all channels, may be NULL. 40 + * @disable_one: Will be called to disable a single channel after 41 + * ad_sigma_delta_single_conversion(), may be NULL. 42 + * Usage of this callback expects iio_chan_spec.address to contain 43 + * the value required for the driver to identify the channel. 40 44 * @postprocess_sample: Is called for each sampled data word, can be used to 41 45 * modify or drop the sample data, it, may be NULL. 42 46 * @has_registers: true if the device has writable and readable registers, false ··· 59 55 int (*append_status)(struct ad_sigma_delta *, bool append); 60 56 int (*set_mode)(struct ad_sigma_delta *, enum ad_sigma_delta_mode mode); 61 57 int (*disable_all)(struct ad_sigma_delta *); 58 + int (*disable_one)(struct ad_sigma_delta *, unsigned int chan); 62 59 int (*postprocess_sample)(struct ad_sigma_delta *, unsigned int raw_sample); 63 60 bool has_registers; 64 61 unsigned int addr_shift; ··· 141 136 { 142 137 if (sd->info->disable_all) 143 138 return sd->info->disable_all(sd); 139 + 140 + return 0; 141 + } 142 + 143 + static inline int ad_sigma_delta_disable_one(struct ad_sigma_delta *sd, 144 + unsigned int chan) 145 + { 146 + if (sd->info->disable_one) 147 + return sd->info->disable_one(sd, chan); 144 148 145 149 return 0; 146 150 }
+31
include/linux/iio/buffer-dma.h
··· 7 7 #ifndef __INDUSTRIALIO_DMA_BUFFER_H__ 8 8 #define __INDUSTRIALIO_DMA_BUFFER_H__ 9 9 10 + #include <linux/atomic.h> 10 11 #include <linux/list.h> 11 12 #include <linux/kref.h> 12 13 #include <linux/spinlock.h> ··· 17 16 struct iio_dma_buffer_queue; 18 17 struct iio_dma_buffer_ops; 19 18 struct device; 19 + struct dma_buf_attachment; 20 + struct dma_fence; 21 + struct sg_table; 20 22 21 23 /** 22 24 * enum iio_block_state - State of a struct iio_dma_buffer_block ··· 45 41 * @queue: Parent DMA buffer queue 46 42 * @kref: kref used to manage the lifetime of block 47 43 * @state: Current state of the block 44 + * @cyclic: True if this is a cyclic buffer 45 + * @fileio: True if this buffer is used for fileio mode 46 + * @sg_table: DMA table for the transfer when transferring a DMABUF 47 + * @fence: DMA fence to be signaled when a DMABUF transfer is complete 48 48 */ 49 49 struct iio_dma_buffer_block { 50 50 /* May only be accessed by the owner of the block */ ··· 71 63 * queue->list_lock if the block is not owned by the core. 72 64 */ 73 65 enum iio_block_state state; 66 + 67 + bool cyclic; 68 + bool fileio; 69 + 70 + struct sg_table *sg_table; 71 + struct dma_fence *fence; 74 72 }; 75 73 76 74 /** ··· 86 72 * @pos: Read offset in the active block 87 73 * @block_size: Size of each block 88 74 * @next_dequeue: index of next block that will be dequeued 75 + * @enabled: Whether the buffer is operating in fileio mode 89 76 */ 90 77 struct iio_dma_buffer_queue_fileio { 91 78 struct iio_dma_buffer_block *blocks[2]; ··· 95 80 size_t block_size; 96 81 97 82 unsigned int next_dequeue; 83 + bool enabled; 98 84 }; 99 85 100 86 /** ··· 111 95 * the DMA controller 112 96 * @incoming: List of buffers on the incoming queue 113 97 * @active: Whether the buffer is currently active 98 + * @num_dmabufs: Total number of DMABUFs attached to this queue 114 99 * @fileio: FileIO state 115 100 */ 116 101 struct iio_dma_buffer_queue { ··· 124 107 struct list_head incoming; 125 108 126 109 bool active; 110 + atomic_t num_dmabufs; 127 111 128 112 struct iio_dma_buffer_queue_fileio fileio; 129 113 }; ··· 161 143 struct device *dma_dev, const struct iio_dma_buffer_ops *ops); 162 144 void iio_dma_buffer_exit(struct iio_dma_buffer_queue *queue); 163 145 void iio_dma_buffer_release(struct iio_dma_buffer_queue *queue); 146 + 147 + struct iio_dma_buffer_block * 148 + iio_dma_buffer_attach_dmabuf(struct iio_buffer *buffer, 149 + struct dma_buf_attachment *attach); 150 + void iio_dma_buffer_detach_dmabuf(struct iio_buffer *buffer, 151 + struct iio_dma_buffer_block *block); 152 + int iio_dma_buffer_enqueue_dmabuf(struct iio_buffer *buffer, 153 + struct iio_dma_buffer_block *block, 154 + struct dma_fence *fence, 155 + struct sg_table *sgt, 156 + size_t size, bool cyclic); 157 + void iio_dma_buffer_lock_queue(struct iio_buffer *buffer); 158 + void iio_dma_buffer_unlock_queue(struct iio_buffer *buffer); 164 159 165 160 #endif
+33
include/linux/iio/buffer_impl.h
··· 9 9 #include <uapi/linux/iio/buffer.h> 10 10 #include <linux/iio/buffer.h> 11 11 12 + struct dma_buf_attachment; 13 + struct dma_fence; 12 14 struct iio_dev; 15 + struct iio_dma_buffer_block; 13 16 struct iio_buffer; 17 + struct sg_table; 14 18 15 19 /** 16 20 * INDIO_BUFFER_FLAG_FIXED_WATERMARK - Watermark level of the buffer can not be ··· 43 39 * device stops sampling. Calles are balanced with @enable. 44 40 * @release: called when the last reference to the buffer is dropped, 45 41 * should free all resources allocated by the buffer. 42 + * @attach_dmabuf: called from userspace via ioctl to attach one external 43 + * DMABUF. 44 + * @detach_dmabuf: called from userspace via ioctl to detach one previously 45 + * attached DMABUF. 46 + * @enqueue_dmabuf: called from userspace via ioctl to queue this DMABUF 47 + * object to this buffer. Requires a valid DMABUF fd, that 48 + * was previouly attached to this buffer. 49 + * @lock_queue: called when the core needs to lock the buffer queue; 50 + * it is used when enqueueing DMABUF objects. 51 + * @unlock_queue: used to unlock a previously locked buffer queue 46 52 * @modes: Supported operating modes by this buffer type 47 53 * @flags: A bitmask combination of INDIO_BUFFER_FLAG_* 48 54 * ··· 81 67 int (*disable)(struct iio_buffer *buffer, struct iio_dev *indio_dev); 82 68 83 69 void (*release)(struct iio_buffer *buffer); 70 + 71 + struct iio_dma_buffer_block * (*attach_dmabuf)(struct iio_buffer *buffer, 72 + struct dma_buf_attachment *attach); 73 + void (*detach_dmabuf)(struct iio_buffer *buffer, 74 + struct iio_dma_buffer_block *block); 75 + int (*enqueue_dmabuf)(struct iio_buffer *buffer, 76 + struct iio_dma_buffer_block *block, 77 + struct dma_fence *fence, struct sg_table *sgt, 78 + size_t size, bool cyclic); 79 + void (*lock_queue)(struct iio_buffer *buffer); 80 + void (*unlock_queue)(struct iio_buffer *buffer); 84 81 85 82 unsigned int modes; 86 83 unsigned int flags; ··· 161 136 162 137 /* @ref: Reference count of the buffer. */ 163 138 struct kref ref; 139 + 140 + /* @dmabufs: List of DMABUF attachments */ 141 + struct list_head dmabufs; /* P: dmabufs_mutex */ 142 + 143 + /* @dmabufs_mutex: Protects dmabufs */ 144 + struct mutex dmabufs_mutex; 164 145 }; 165 146 166 147 /** ··· 189 158 190 159 struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer); 191 160 void iio_buffer_put(struct iio_buffer *buffer); 161 + 162 + void iio_buffer_signal_dmabuf_done(struct dma_fence *fence, int ret); 192 163 193 164 #else /* CONFIG_IIO_BUFFER */ 194 165
+10
include/linux/iio/consumer.h
··· 441 441 ssize_t iio_write_channel_ext_info(struct iio_channel *chan, const char *attr, 442 442 const char *buf, size_t len); 443 443 444 + /** 445 + * iio_read_channel_label() - read label for a given channel 446 + * @chan: The channel being queried. 447 + * @buf: Where to store the attribute value. Assumed to hold 448 + * at least PAGE_SIZE bytes. 449 + * 450 + * Returns the number of bytes written to buf, or an error code. 451 + */ 452 + ssize_t iio_read_channel_label(struct iio_channel *chan, char *buf); 453 + 444 454 #endif
+16 -50
include/linux/iio/imu/adis.h
··· 9 9 #ifndef __IIO_ADIS_H__ 10 10 #define __IIO_ADIS_H__ 11 11 12 + #include <linux/cleanup.h> 12 13 #include <linux/spi/spi.h> 13 14 #include <linux/interrupt.h> 14 15 #include <linux/iio/iio.h> ··· 151 150 */ 152 151 static inline int adis_reset(struct adis *adis) 153 152 { 154 - int ret; 155 - 156 - mutex_lock(&adis->state_lock); 157 - ret = __adis_reset(adis); 158 - mutex_unlock(&adis->state_lock); 159 - 160 - return ret; 153 + guard(mutex)(&adis->state_lock); 154 + return __adis_reset(adis); 161 155 } 162 156 163 157 int __adis_write_reg(struct adis *adis, unsigned int reg, ··· 244 248 static inline int adis_write_reg(struct adis *adis, unsigned int reg, 245 249 unsigned int val, unsigned int size) 246 250 { 247 - int ret; 248 - 249 - mutex_lock(&adis->state_lock); 250 - ret = __adis_write_reg(adis, reg, val, size); 251 - mutex_unlock(&adis->state_lock); 252 - 253 - return ret; 251 + guard(mutex)(&adis->state_lock); 252 + return __adis_write_reg(adis, reg, val, size); 254 253 } 255 254 256 255 /** ··· 258 267 static int adis_read_reg(struct adis *adis, unsigned int reg, 259 268 unsigned int *val, unsigned int size) 260 269 { 261 - int ret; 262 - 263 - mutex_lock(&adis->state_lock); 264 - ret = __adis_read_reg(adis, reg, val, size); 265 - mutex_unlock(&adis->state_lock); 266 - 267 - return ret; 270 + guard(mutex)(&adis->state_lock); 271 + return __adis_read_reg(adis, reg, val, size); 268 272 } 269 273 270 274 /** ··· 351 365 static inline int adis_update_bits_base(struct adis *adis, unsigned int reg, 352 366 const u32 mask, const u32 val, u8 size) 353 367 { 354 - int ret; 355 - 356 - mutex_lock(&adis->state_lock); 357 - ret = __adis_update_bits_base(adis, reg, mask, val, size); 358 - mutex_unlock(&adis->state_lock); 359 - return ret; 368 + guard(mutex)(&adis->state_lock); 369 + return __adis_update_bits_base(adis, reg, mask, val, size); 360 370 } 361 371 362 372 /** ··· 393 411 394 412 static inline int adis_enable_irq(struct adis *adis, bool enable) 395 413 { 396 - int ret; 397 - 398 - mutex_lock(&adis->state_lock); 399 - ret = __adis_enable_irq(adis, enable); 400 - mutex_unlock(&adis->state_lock); 401 - 402 - return ret; 414 + guard(mutex)(&adis->state_lock); 415 + return __adis_enable_irq(adis, enable); 403 416 } 404 417 405 418 static inline int adis_check_status(struct adis *adis) 406 419 { 407 - int ret; 408 - 409 - mutex_lock(&adis->state_lock); 410 - ret = __adis_check_status(adis); 411 - mutex_unlock(&adis->state_lock); 412 - 413 - return ret; 420 + guard(mutex)(&adis->state_lock); 421 + return __adis_check_status(adis); 414 422 } 415 423 416 - static inline void adis_dev_lock(struct adis *adis) 417 - { 418 - mutex_lock(&adis->state_lock); 419 - } 420 - 421 - static inline void adis_dev_unlock(struct adis *adis) 422 - { 423 - mutex_unlock(&adis->state_lock); 424 - } 424 + #define adis_dev_auto_lock(adis) guard(mutex)(&(adis)->state_lock) 425 + #define adis_dev_auto_scoped_lock(adis) \ 426 + scoped_guard(mutex, &(adis)->state_lock) 425 427 426 428 int adis_single_conversion(struct iio_dev *indio_dev, 427 429 const struct iio_chan_spec *chan,
+2
include/linux/math.h
··· 112 112 __##type numerator; \ 113 113 __##type denominator; \ 114 114 }; 115 + __STRUCT_FRACT(s8) 116 + __STRUCT_FRACT(u8) 115 117 __STRUCT_FRACT(s16) 116 118 __STRUCT_FRACT(u16) 117 119 __STRUCT_FRACT(s32)
+2
include/linux/spi/spi.h
··· 1269 1269 1270 1270 extern int spi_optimize_message(struct spi_device *spi, struct spi_message *msg); 1271 1271 extern void spi_unoptimize_message(struct spi_message *msg); 1272 + extern int devm_spi_optimize_message(struct device *dev, struct spi_device *spi, 1273 + struct spi_message *msg); 1272 1274 1273 1275 extern int spi_setup(struct spi_device *spi); 1274 1276 extern int spi_async(struct spi_device *spi, struct spi_message *message);
+22
include/uapi/linux/iio/buffer.h
··· 5 5 #ifndef _UAPI_IIO_BUFFER_H_ 6 6 #define _UAPI_IIO_BUFFER_H_ 7 7 8 + #include <linux/types.h> 9 + 10 + /* Flags for iio_dmabuf.flags */ 11 + #define IIO_BUFFER_DMABUF_CYCLIC (1 << 0) 12 + #define IIO_BUFFER_DMABUF_SUPPORTED_FLAGS 0x00000001 13 + 14 + /** 15 + * struct iio_dmabuf - Descriptor for a single IIO DMABUF object 16 + * @fd: file descriptor of the DMABUF object 17 + * @flags: one or more IIO_BUFFER_DMABUF_* flags 18 + * @bytes_used: number of bytes used in this DMABUF for the data transfer. 19 + * Should generally be set to the DMABUF's size. 20 + */ 21 + struct iio_dmabuf { 22 + __u32 fd; 23 + __u32 flags; 24 + __u64 bytes_used; 25 + }; 26 + 8 27 #define IIO_BUFFER_GET_FD_IOCTL _IOWR('i', 0x91, int) 28 + #define IIO_BUFFER_DMABUF_ATTACH_IOCTL _IOW('i', 0x92, int) 29 + #define IIO_BUFFER_DMABUF_DETACH_IOCTL _IOW('i', 0x93, int) 30 + #define IIO_BUFFER_DMABUF_ENQUEUE_IOCTL _IOW('i', 0x94, struct iio_dmabuf) 9 31 10 32 #endif /* _UAPI_IIO_BUFFER_H_ */