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

Merge tag 'hwmon-for-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging

Pull hwmon updates from Guenter Roeck:
"New driver:

- Maxim MAX6620

Notable functional enhancements:

- Add Asus WMI support to nct6775 driver, and list boards supporting
it

- Move TMP461 support from tm401 driver to lm90 driver

- Add support for fanX_min, fanX_max and fanX_target to dell-smm
driver, and clean it up while doing so

- Extend mlxreg-fan driver to support multiple cooling devices and
multiple PWM channels. Also increase number of supported fan
tachometers.

- Add a new customer ID (for ASRock) to nct6683 driver

- Make temperature/voltage sensors on nct7802 configurable

- Add mfg_id debugfs entry to pmbus/ibm-cffps driver

- Support configurable sense resistor values in pmbus/lm25066, and
fix various coefficients

- Use generic notification mechanism in raspberrypi driver

Notable cleanups:

- Convert various devicetree bindings to dtschema, and add missing
bindings

- Convert i5500_temp and tmp103 drivers to
devm_hwmon_device_register_with_info

- Clean up non-bool "valid" data fields

- Improve devicetree configurability for tmp421 driver"

* tag 'hwmon-for-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: (73 commits)
hwmon: (nct7802) Add of_node_put() before return
hwmon: (tmp401) Drop support for TMP461
hwmon: (lm90) Add basic support for TI TMP461
hwmon: (lm90) Introduce flag indicating extended temperature support
hwmon: (nct6775) add ProArt X570-CREATOR WIFI.
hwmon: (nct7802) Make temperature/voltage sensors configurable
dt-bindings: hwmon: Add nct7802 bindings
hwmon: (dell-smm) Speed up setting of fan speed
hwmon: (dell-smm) Add comment explaining usage of i8k_config_data[]
hwmon: (dell-smm) Return -ENOIOCTLCMD instead of -EINVAL
hwmon: (dell-smm) Use strscpy_pad()
hwmon: (dell-smm) Sort includes in alphabetical order
hwmon: (tmp421) Add of_node_put() before return
hwmon: (max31722) Warn about failure to put device in stand-by in .remove()
hwmon: (acpi_power_meter) Use acpi_bus_get_acpi_device()
hwmon: (dell-smm) Add support for fanX_min, fanX_max and fanX_target
dt-bindings: hwmon: allow specifying channels for tmp421
hwmon: (tmp421) ignore non-channel related DT nodes
hwmon: (tmp421) update documentation
hwmon: (tmp421) support HWMON_T_ENABLE
...

+2894 -953
-11
Documentation/devicetree/bindings/hwmon/dps650ab.txt
··· 1 - Bindings for Delta Electronics DPS-650-AB power supply 2 - 3 - Required properties: 4 - - compatible : "delta,dps650ab" 5 - - reg : I2C address, one of 0x58, 0x59. 6 - 7 - Example: 8 - dps650ab@58 { 9 - compatible = "delta,dps650ab"; 10 - reg = <0x58>; 11 - };
-12
Documentation/devicetree/bindings/hwmon/hih6130.txt
··· 1 - Honeywell Humidicon HIH-6130 humidity/temperature sensor 2 - -------------------------------------------------------- 3 - 4 - Requires node properties: 5 - - compatible : "honeywell,hi6130" 6 - - reg : the I2C address of the device. This is 0x27. 7 - 8 - Example: 9 - hih6130@27 { 10 - compatible = "honeywell,hih6130"; 11 - reg = <0x27>; 12 - };
-26
Documentation/devicetree/bindings/hwmon/ibm,cffps1.txt
··· 1 - Device-tree bindings for IBM Common Form Factor Power Supply Versions 1 and 2 2 - ----------------------------------------------------------------------------- 3 - 4 - Required properties: 5 - - compatible : Must be one of the following: 6 - "ibm,cffps1" 7 - "ibm,cffps2" 8 - or "ibm,cffps" if the system 9 - must support any version of the 10 - power supply 11 - - reg = < I2C bus address >; : Address of the power supply on the 12 - I2C bus. 13 - 14 - Example: 15 - 16 - i2c-bus@100 { 17 - #address-cells = <1>; 18 - #size-cells = <0>; 19 - #interrupt-cells = <1>; 20 - < more properties > 21 - 22 - power-supply@68 { 23 - compatible = "ibm,cffps1"; 24 - reg = <0x68>; 25 - }; 26 - };
+37
Documentation/devicetree/bindings/hwmon/iio-hwmon.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: "http://devicetree.org/schemas/hwmon/iio-hwmon.yaml#" 5 + $schema: "http://devicetree.org/meta-schemas/core.yaml#" 6 + 7 + title: ADC-attached Hardware Sensor Device Tree Bindings 8 + 9 + maintainers: 10 + - Jonathan Cameron <jic23@kernel.org> 11 + 12 + description: > 13 + Bindings for hardware monitoring devices connected to ADC controllers 14 + supporting the Industrial I/O bindings. 15 + 16 + properties: 17 + compatible: 18 + const: iio-hwmon 19 + 20 + io-channels: 21 + minItems: 1 22 + maxItems: 8 # Should be enough 23 + description: > 24 + List of phandles to ADC channels to read the monitoring values 25 + 26 + required: 27 + - compatible 28 + - io-channels 29 + 30 + additionalProperties: false 31 + 32 + examples: 33 + - | 34 + iio-hwmon { 35 + compatible = "iio-hwmon"; 36 + io-channels = <&adc 1>, <&adc 2>; 37 + };
-46
Documentation/devicetree/bindings/hwmon/jc42.txt
··· 1 - Properties for Jedec JC-42.4 compatible temperature sensors 2 - 3 - Required properties: 4 - - compatible: May include a device-specific string consisting of the 5 - manufacturer and the name of the chip. A list of supported 6 - chip names follows. 7 - Must include "jedec,jc-42.4-temp" for any Jedec JC-42.4 8 - compatible temperature sensor. 9 - 10 - Supported chip names: 11 - adi,adt7408 12 - atmel,at30ts00 13 - atmel,at30tse004 14 - onnn,cat6095 15 - onnn,cat34ts02 16 - maxim,max6604 17 - microchip,mcp9804 18 - microchip,mcp9805 19 - microchip,mcp9808 20 - microchip,mcp98243 21 - microchip,mcp98244 22 - microchip,mcp9843 23 - nxp,se97 24 - nxp,se98 25 - st,stts2002 26 - st,stts2004 27 - st,stts3000 28 - st,stts424 29 - st,stts424e 30 - idt,tse2002 31 - idt,tse2004 32 - idt,ts3000 33 - idt,ts3001 34 - 35 - - reg: I2C address 36 - 37 - Optional properties: 38 - - smbus-timeout-disable: When set, the smbus timeout function will be disabled. 39 - This is not supported on all chips. 40 - 41 - Example: 42 - 43 - temp-sensor@1a { 44 - compatible = "jedec,jc-42.4-temp"; 45 - reg = <0x1a>; 46 - };
+78
Documentation/devicetree/bindings/hwmon/jedec,jc42.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/jedec,jc42.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Jedec JC-42.4 compatible temperature sensors 8 + 9 + maintainers: 10 + - Jean Delvare <jdelvare@suse.com> 11 + - Guenter Roeck <linux@roeck-us.net> 12 + 13 + select: 14 + properties: 15 + compatible: 16 + const: jedec,jc-42.4-temp 17 + 18 + required: 19 + - compatible 20 + 21 + properties: 22 + compatible: 23 + oneOf: 24 + - const: jedec,jc-42.4-temp 25 + - items: 26 + - enum: 27 + - adi,adt7408 28 + - atmel,at30ts00 29 + - atmel,at30tse004 30 + - idt,tse2002 31 + - idt,tse2004 32 + - idt,ts3000 33 + - idt,ts3001 34 + - maxim,max6604 35 + - microchip,mcp9804 36 + - microchip,mcp9805 37 + - microchip,mcp9808 38 + - microchip,mcp98243 39 + - microchip,mcp98244 40 + - microchip,mcp9843 41 + - nxp,se97 42 + - nxp,se97b 43 + - nxp,se98 44 + - onnn,cat6095 45 + - onnn,cat34ts02 46 + - st,stts2002 47 + - st,stts2004 48 + - st,stts3000 49 + - st,stts424 50 + - st,stts424e 51 + - const: jedec,jc-42.4-temp 52 + 53 + reg: 54 + maxItems: 1 55 + 56 + smbus-timeout-disable: 57 + description: | 58 + When set, the smbus timeout function will be disabled. This is not 59 + supported on all chips. 60 + type: boolean 61 + 62 + required: 63 + - compatible 64 + - reg 65 + 66 + additionalProperties: false 67 + 68 + examples: 69 + - | 70 + i2c { 71 + #address-cells = <1>; 72 + #size-cells = <0>; 73 + 74 + temp-sensor@1a { 75 + compatible = "jedec,jc-42.4-temp"; 76 + reg = <0x1a>; 77 + }; 78 + };
+41
Documentation/devicetree/bindings/hwmon/lltc,ltc4151.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/lltc,ltc4151.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: LTC4151 High Voltage I2C Current and Voltage Monitor 8 + 9 + maintainers: 10 + - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> 11 + 12 + properties: 13 + compatible: 14 + const: lltc,ltc4151 15 + 16 + reg: 17 + maxItems: 1 18 + 19 + shunt-resistor-micro-ohms: 20 + description: 21 + Shunt resistor value in micro-Ohms 22 + default: 1000 23 + 24 + required: 25 + - compatible 26 + - reg 27 + 28 + additionalProperties: false 29 + 30 + examples: 31 + - | 32 + i2c { 33 + #address-cells = <1>; 34 + #size-cells = <0>; 35 + 36 + sensor@6e { 37 + compatible = "lltc,ltc4151"; 38 + reg = <0x6e>; 39 + shunt-resistor-micro-ohms = <1500>; 40 + }; 41 + };
-22
Documentation/devicetree/bindings/hwmon/lm70.txt
··· 1 - * LM70/TMP121/LM71/LM74 thermometer. 2 - 3 - Required properties: 4 - - compatible: one of 5 - "ti,lm70" 6 - "ti,tmp121" 7 - "ti,tmp122" 8 - "ti,lm71" 9 - "ti,lm74" 10 - 11 - See Documentation/devicetree/bindings/spi/spi-bus.txt for more required and 12 - optional properties. 13 - 14 - Example: 15 - 16 - spi_master { 17 - temperature-sensor@0 { 18 - compatible = "ti,lm70"; 19 - reg = <0>; 20 - spi-max-frequency = <1000000>; 21 - }; 22 - };
-51
Documentation/devicetree/bindings/hwmon/lm90.txt
··· 1 - * LM90 series thermometer. 2 - 3 - Required node properties: 4 - - compatible: manufacturer and chip name, one of 5 - "adi,adm1032" 6 - "adi,adt7461" 7 - "adi,adt7461a" 8 - "gmt,g781" 9 - "national,lm90" 10 - "national,lm86" 11 - "national,lm89" 12 - "national,lm99" 13 - "dallas,max6646" 14 - "dallas,max6647" 15 - "dallas,max6649" 16 - "dallas,max6657" 17 - "dallas,max6658" 18 - "dallas,max6659" 19 - "dallas,max6680" 20 - "dallas,max6681" 21 - "dallas,max6695" 22 - "dallas,max6696" 23 - "onnn,nct1008" 24 - "winbond,w83l771" 25 - "nxp,sa56004" 26 - "ti,tmp451" 27 - 28 - - reg: I2C bus address of the device 29 - 30 - - vcc-supply: vcc regulator for the supply voltage. 31 - 32 - Optional properties: 33 - - interrupts: Contains a single interrupt specifier which describes the 34 - LM90 "-ALERT" pin output. 35 - See interrupt-controller/interrupts.txt for the format. 36 - 37 - - #thermal-sensor-cells: should be set to 1. See thermal/thermal-sensor.yaml 38 - for details. See <include/dt-bindings/thermal/lm90.h> for the 39 - definition of the local, remote and 2nd remote sensor index 40 - constants. 41 - 42 - Example LM90 node: 43 - 44 - temp-sensor { 45 - compatible = "onnn,nct1008"; 46 - reg = <0x4c>; 47 - vcc-supply = <&palmas_ldo6_reg>; 48 - interrupt-parent = <&gpio>; 49 - interrupts = <TEGRA_GPIO(O, 4) IRQ_TYPE_LEVEL_LOW>; 50 - #thermal-sensor-cells = <1>; 51 - }
-18
Documentation/devicetree/bindings/hwmon/ltc4151.txt
··· 1 - LTC4151 High Voltage I2C Current and Voltage Monitor 2 - 3 - Required properties: 4 - - compatible: Must be "lltc,ltc4151" 5 - - reg: I2C address 6 - 7 - Optional properties: 8 - - shunt-resistor-micro-ohms 9 - Shunt resistor value in micro-Ohms 10 - Defaults to <1000> if unset. 11 - 12 - Example: 13 - 14 - ltc4151@6e { 15 - compatible = "lltc,ltc4151"; 16 - reg = <0x6e>; 17 - shunt-resistor-micro-ohms = <1500>; 18 - };
-21
Documentation/devicetree/bindings/hwmon/mcp3021.txt
··· 1 - mcp3021 properties 2 - 3 - Required properties: 4 - - compatible: Must be one of the following: 5 - - "microchip,mcp3021" for mcp3021 6 - - "microchip,mcp3221" for mcp3221 7 - - reg: I2C address 8 - 9 - Optional properties: 10 - 11 - - reference-voltage-microvolt 12 - Reference voltage in microvolt (uV) 13 - 14 - Example: 15 - 16 - mcp3021@4d { 17 - compatible = "microchip,mcp3021"; 18 - reg = <0x4d>; 19 - 20 - reference-voltage-microvolt = <4500000>; /* 4.5 V */ 21 - };
+43
Documentation/devicetree/bindings/hwmon/microchip,mcp3021.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/microchip,mcp3021.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Microchip MCP3021 A/D converter 8 + 9 + maintainers: 10 + - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> 11 + 12 + properties: 13 + compatible: 14 + enum: 15 + - microchip,mcp3021 16 + - microchip,mcp3221 17 + 18 + reg: 19 + maxItems: 1 20 + 21 + reference-voltage-microvolt: 22 + description: 23 + VDD supply power and reference voltage 24 + 25 + required: 26 + - compatible 27 + - reg 28 + 29 + additionalProperties: false 30 + 31 + examples: 32 + - | 33 + i2c { 34 + #address-cells = <1>; 35 + #size-cells = <0>; 36 + 37 + adc@4d { 38 + compatible = "microchip,mcp3021"; 39 + reg = <0x4d>; 40 + 41 + reference-voltage-microvolt = <4500000>; /* 4.5 V */ 42 + }; 43 + };
+78
Documentation/devicetree/bindings/hwmon/national,lm90.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/national,lm90.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: LM90 series thermometer 8 + 9 + maintainers: 10 + - Jean Delvare <jdelvare@suse.com> 11 + - Guenter Roeck <linux@roeck-us.net> 12 + 13 + properties: 14 + compatible: 15 + enum: 16 + - adi,adm1032 17 + - adi,adt7461 18 + - adi,adt7461a 19 + - dallas,max6646 20 + - dallas,max6647 21 + - dallas,max6649 22 + - dallas,max6657 23 + - dallas,max6658 24 + - dallas,max6659 25 + - dallas,max6680 26 + - dallas,max6681 27 + - dallas,max6695 28 + - dallas,max6696 29 + - gmt,g781 30 + - national,lm86 31 + - national,lm89 32 + - national,lm90 33 + - national,lm99 34 + - nxp,sa56004 35 + - onnn,nct1008 36 + - ti,tmp451 37 + - winbond,w83l771 38 + 39 + 40 + interrupts: 41 + items: 42 + - description: | 43 + Single interrupt specifier which describes the LM90 "-ALERT" pin 44 + output. 45 + 46 + reg: 47 + maxItems: 1 48 + 49 + "#thermal-sensor-cells": 50 + const: 1 51 + 52 + vcc-supply: 53 + description: phandle to the regulator that provides the +VCC supply 54 + 55 + required: 56 + - compatible 57 + - reg 58 + 59 + additionalProperties: false 60 + 61 + examples: 62 + - | 63 + #include <dt-bindings/gpio/tegra-gpio.h> 64 + #include <dt-bindings/interrupt-controller/irq.h> 65 + 66 + i2c { 67 + #address-cells = <1>; 68 + #size-cells = <0>; 69 + 70 + sensor@4c { 71 + compatible = "onnn,nct1008"; 72 + reg = <0x4c>; 73 + vcc-supply = <&palmas_ldo6_reg>; 74 + interrupt-parent = <&gpio>; 75 + interrupts = <TEGRA_GPIO(O, 4) IRQ_TYPE_LEVEL_LOW>; 76 + #thermal-sensor-cells = <1>; 77 + }; 78 + };
+141
Documentation/devicetree/bindings/hwmon/ntc-thermistor.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + --- 3 + $id: http://devicetree.org/schemas/hwmon/ntc-thermistor.yaml# 4 + $schema: http://devicetree.org/meta-schemas/core.yaml# 5 + 6 + title: NTC thermistor temperature sensors 7 + 8 + maintainers: 9 + - Naveen Krishna Chatradhi <ch.naveen@samsung.com> 10 + - Linus Walleij <linus.walleij@linaro.org> 11 + 12 + description: | 13 + Thermistors with negative temperature coefficient (NTC) are resistors that 14 + vary in resistance in an often non-linear way in relation to temperature. 15 + The negative temperature coefficient means that the resistance decreases 16 + as the temperature rises. Since the relationship between resistance and 17 + temperature is non-linear, software drivers most often need to use a look 18 + up table and interpolation to get from resistance to temperature. 19 + 20 + When used in practice, a thermistor is often connected between ground, a 21 + pull-up resistor or/and a pull-down resistor and a fixed voltage like this: 22 + 23 + + e.g. 5V = pull-up voltage (puv) 24 + | 25 + +-+ 26 + | | 27 + | | Pull-up resistor 28 + | | (puo) 29 + +-+ 30 + |-------------------------o 31 + +-+ | ^ 32 + | |/ | 33 + | / | 34 + |/| Thermistor | Measured voltage (mv) 35 + / | | "connected ground" 36 + /| | | 37 + +-+ | 38 + |-------------------------o 39 + +-+ ^ 40 + | | | 41 + | | Pull-down resistor | Measured voltage (mv) 42 + | | (pdo) | "connected positive" 43 + +-+ | 44 + | | 45 + | v 46 + + GND GND 47 + 48 + The arrangements of where we measure the voltage over the thermistor are 49 + called "connected ground" and "connected positive" and shall be understood as 50 + the cases when either pull-up or pull-down resistance is zero. 51 + 52 + If the pull-up resistance is 0 one end of the thermistor is connected to the 53 + positive voltage and we get the thermistor on top of a pull-down resistor 54 + and we take the measure between the thermistor and the pull-down resistor. 55 + 56 + Conversely if the pull-down resistance is zero, one end of the thermistor is 57 + connected to ground and we get the thermistor under the pull-up resistor 58 + and we take the measure between the pull-up resistor and the thermistor. 59 + 60 + We can use both pull-up and pull-down resistors at the same time, and then 61 + the figure illustrates where the voltage will be measured for the "connected 62 + ground" and "connected positive" cases. 63 + 64 + properties: 65 + $nodename: 66 + pattern: "^thermistor(.*)?$" 67 + 68 + compatible: 69 + oneOf: 70 + - const: epcos,b57330v2103 71 + - const: epcos,b57891s0103 72 + - const: murata,ncp15wb473 73 + - const: murata,ncp18wb473 74 + - const: murata,ncp21wb473 75 + - const: murata,ncp03wb473 76 + - const: murata,ncp15wl333 77 + - const: murata,ncp03wf104 78 + - const: murata,ncp15xh103 79 + # Deprecated "ntp," compatible strings 80 + - const: ntc,ncp15wb473 81 + deprecated: true 82 + - const: ntc,ncp18wb473 83 + deprecated: true 84 + - const: ntc,ncp21wb473 85 + deprecated: true 86 + - const: ntc,ncp03wb473 87 + deprecated: true 88 + - const: ntc,ncp15wl333 89 + deprecated: true 90 + 91 + "#thermal-sensor-cells": 92 + description: Thermal sensor cells if used for thermal sensoring. 93 + const: 0 94 + 95 + pullup-uv: 96 + $ref: /schemas/types.yaml#/definitions/uint32 97 + description: Pull-up voltage in micro volts. Must always be specified. 98 + 99 + pullup-ohm: 100 + $ref: /schemas/types.yaml#/definitions/uint32 101 + description: Pull-up resistance in ohms. Must always be specified, even 102 + if zero. 103 + 104 + pulldown-ohm: 105 + $ref: /schemas/types.yaml#/definitions/uint32 106 + description: Pull-down resistance in ohms. Must always be specified, even 107 + if zero. 108 + 109 + connected-positive: 110 + $ref: /schemas/types.yaml#/definitions/flag 111 + description: Indicates how the thermistor is connected in series with 112 + a pull-up and/or a pull-down resistor. See the description above for 113 + an illustration. If this flag is NOT specified, the thermistor is assumed 114 + to be connected-ground, which usually means a pull-down resistance of 115 + zero but complex arrangements are possible. 116 + 117 + # See /schemas/iio/adc/adc.yaml 118 + io-channels: 119 + maxItems: 1 120 + description: IIO ADC channel to read the voltage over the resistor. Must 121 + always be specified. 122 + 123 + required: 124 + - compatible 125 + - pullup-uv 126 + - pullup-ohm 127 + - pulldown-ohm 128 + - io-channels 129 + 130 + additionalProperties: false 131 + 132 + examples: 133 + - | 134 + thermistor0 { 135 + compatible = "murata,ncp18wb473"; 136 + io-channels = <&gpadc 0x06>; 137 + pullup-uv = <1800000>; 138 + pullup-ohm = <220000>; 139 + pulldown-ohm = <0>; 140 + #thermal-sensor-cells = <0>; 141 + };
-44
Documentation/devicetree/bindings/hwmon/ntc_thermistor.txt
··· 1 - NTC Thermistor hwmon sensors 2 - ------------------------------- 3 - 4 - Requires node properties: 5 - - "compatible" value : one of 6 - "epcos,b57330v2103" 7 - "epcos,b57891s0103" 8 - "murata,ncp15wb473" 9 - "murata,ncp18wb473" 10 - "murata,ncp21wb473" 11 - "murata,ncp03wb473" 12 - "murata,ncp15wl333" 13 - "murata,ncp03wf104" 14 - "murata,ncp15xh103" 15 - 16 - /* Usage of vendor name "ntc" is deprecated */ 17 - <DEPRECATED> "ntc,ncp15wb473" 18 - <DEPRECATED> "ntc,ncp18wb473" 19 - <DEPRECATED> "ntc,ncp21wb473" 20 - <DEPRECATED> "ntc,ncp03wb473" 21 - <DEPRECATED> "ntc,ncp15wl333" 22 - 23 - - "pullup-uv" Pull up voltage in micro volts 24 - - "pullup-ohm" Pull up resistor value in ohms 25 - - "pulldown-ohm" Pull down resistor value in ohms 26 - - "connected-positive" Always ON, If not specified. 27 - Status change is possible. 28 - - "io-channels" Channel node of ADC to be used for 29 - conversion. 30 - 31 - Optional node properties: 32 - - "#thermal-sensor-cells" Used to expose itself to thermal fw. 33 - 34 - Read more about iio bindings at 35 - https://github.com/devicetree-org/dt-schema/blob/master/schemas/iio/ 36 - 37 - Example: 38 - ncp15wb473@0 { 39 - compatible = "murata,ncp15wb473"; 40 - pullup-uv = <1800000>; 41 - pullup-ohm = <47000>; 42 - pulldown-ohm = <0>; 43 - io-channels = <&adc 3>; 44 - };
+145
Documentation/devicetree/bindings/hwmon/nuvoton,nct7802.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + 5 + $id: http://devicetree.org/schemas/hwmon/nuvoton,nct7802.yaml# 6 + $schema: http://devicetree.org/meta-schemas/core.yaml# 7 + 8 + title: Nuvoton NCT7802Y Hardware Monitoring IC 9 + 10 + maintainers: 11 + - Guenter Roeck <linux@roeck-us.net> 12 + 13 + description: | 14 + The NCT7802Y is a hardware monitor IC which supports one on-die and up to 15 + 5 remote temperature sensors with SMBus interface. 16 + 17 + Datasheets: 18 + https://www.nuvoton.com/export/resource-files/Nuvoton_NCT7802Y_Datasheet_V12.pdf 19 + 20 + additionalProperties: false 21 + 22 + properties: 23 + compatible: 24 + enum: 25 + - nuvoton,nct7802 26 + 27 + reg: 28 + maxItems: 1 29 + 30 + "#address-cells": 31 + const: 1 32 + 33 + "#size-cells": 34 + const: 0 35 + 36 + patternProperties: 37 + "^channel@[0-3]$": 38 + type: object 39 + 40 + additionalProperties: false 41 + 42 + properties: 43 + reg: 44 + items: 45 + - enum: 46 + - 0 # Local Temperature Sensor ("LTD") 47 + - 1 # Remote Temperature Sensor or Voltage Sensor 1 ("RTD1") 48 + - 2 # Remote Temperature Sensor or Voltage Sensor 2 ("RTD2") 49 + - 3 # Remote Temperature Sensor or Voltage Sensor 3 ("RTD3") 50 + 51 + sensor-type: 52 + items: 53 + - enum: 54 + - temperature 55 + - voltage 56 + 57 + temperature-mode: 58 + items: 59 + - enum: 60 + - thermistor 61 + - thermal-diode 62 + 63 + required: 64 + - reg 65 + 66 + allOf: 67 + # For channels RTD1, RTD2 and RTD3, require sensor-type to be set. 68 + # Otherwise (for all other channels), do not allow temperature-mode to be 69 + # set. 70 + - if: 71 + properties: 72 + reg: 73 + items: 74 + - enum: 75 + - 1 76 + - 2 77 + - 3 78 + then: 79 + required: 80 + - sensor-type 81 + else: 82 + not: 83 + required: 84 + - sensor-type 85 + 86 + # For channels RTD1 and RTD2 and if sensor-type is "temperature", require 87 + # temperature-mode to be set. Otherwise (for all other channels or 88 + # sensor-type settings), do not allow temperature-mode to be set 89 + - if: 90 + properties: 91 + reg: 92 + items: 93 + - enum: 94 + - 1 95 + - 2 96 + sensor-type: 97 + items: 98 + - enum: 99 + - temperature 100 + then: 101 + required: 102 + - temperature-mode 103 + else: 104 + not: 105 + required: 106 + - temperature-mode 107 + 108 + required: 109 + - compatible 110 + - reg 111 + 112 + examples: 113 + - | 114 + i2c { 115 + #address-cells = <1>; 116 + #size-cells = <0>; 117 + 118 + nct7802@28 { 119 + compatible = "nuvoton,nct7802"; 120 + reg = <0x28>; 121 + 122 + #address-cells = <1>; 123 + #size-cells = <0>; 124 + 125 + channel@0 { /* LTD */ 126 + reg = <0>; 127 + }; 128 + 129 + channel@1 { /* RTD1 */ 130 + reg = <1>; 131 + sensor-type = "voltage"; 132 + }; 133 + 134 + channel@2 { /* RTD2 */ 135 + reg = <2>; 136 + sensor-type = "temperature"; 137 + temperature-mode = "thermal-diode"; 138 + }; 139 + 140 + channel@3 { /* RTD3 */ 141 + reg = <3>; 142 + sensor-type = "temperature"; 143 + }; 144 + }; 145 + };
+54
Documentation/devicetree/bindings/hwmon/pmbus/ti,lm25066.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + 5 + $id: http://devicetree.org/schemas/hwmon/pmbus/ti,lm25066.yaml# 6 + $schema: http://devicetree.org/meta-schemas/core.yaml# 7 + 8 + title: National Semiconductor/Texas Instruments LM250x6/LM506x power-management ICs 9 + 10 + maintainers: 11 + - Zev Weiss <zev@bewilderbeest.net> 12 + 13 + description: | 14 + The LM25066 family of power-management ICs (a.k.a. hot-swap 15 + controllers or eFuses in various contexts) are PMBus devices that 16 + offer temperature, current, voltage, and power monitoring. 17 + 18 + Datasheet: https://www.ti.com/lit/ds/symlink/lm25066.pdf 19 + 20 + properties: 21 + compatible: 22 + enum: 23 + - ti,lm25056 24 + - ti,lm25066 25 + - ti,lm5064 26 + - ti,lm5066 27 + - ti,lm5066i 28 + 29 + reg: 30 + maxItems: 1 31 + 32 + shunt-resistor-micro-ohms: 33 + description: 34 + Shunt (sense) resistor value in micro-Ohms 35 + default: 1000 36 + 37 + required: 38 + - compatible 39 + - reg 40 + 41 + additionalProperties: false 42 + 43 + examples: 44 + - | 45 + i2c { 46 + #address-cells = <1>; 47 + #size-cells = <0>; 48 + 49 + pmic@40 { 50 + compatible = "ti,lm25066"; 51 + reg = <0x40>; 52 + shunt-resistor-micro-ohms = <675>; 53 + }; 54 + };
+43
Documentation/devicetree/bindings/hwmon/sensirion,sht15.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/sensirion,sht15.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Sensirion SHT15 humidity and temperature sensor 8 + 9 + maintainers: 10 + - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> 11 + 12 + properties: 13 + compatible: 14 + const: sensirion,sht15 15 + 16 + clk-gpios: 17 + maxItems: 1 18 + 19 + data-gpios: 20 + maxItems: 1 21 + 22 + vcc-supply: 23 + description: regulator that drives the VCC pin 24 + 25 + required: 26 + - compatible 27 + - clk-gpios 28 + - data-gpios 29 + - vcc-supply 30 + 31 + additionalProperties: false 32 + 33 + examples: 34 + - | 35 + sensor { 36 + compatible = "sensirion,sht15"; 37 + clk-gpios = <&gpio4 12 0>; 38 + data-gpios = <&gpio4 13 0>; 39 + vcc-supply = <&reg_sht15>; 40 + 41 + pinctrl-names = "default"; 42 + pinctrl-0 = <&pinctrl_sensor>; 43 + };
-19
Documentation/devicetree/bindings/hwmon/sht15.txt
··· 1 - Sensirion SHT15 Humidity and Temperature Sensor 2 - 3 - Required properties: 4 - 5 - - "compatible": must be "sensirion,sht15". 6 - - "data-gpios": GPIO connected to the data line. 7 - - "clk-gpios": GPIO connected to the clock line. 8 - - "vcc-supply": regulator that drives the VCC pin. 9 - 10 - Example: 11 - 12 - sensor { 13 - pinctrl-names = "default"; 14 - pinctrl-0 = <&pinctrl_sensor>; 15 - compatible = "sensirion,sht15"; 16 - clk-gpios = <&gpio4 12 0>; 17 - data-gpios = <&gpio4 13 0>; 18 - vcc-supply = <&reg_sht15>; 19 - };
+47
Documentation/devicetree/bindings/hwmon/ti,tmp102.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/ti,tmp102.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: TMP102 temperature sensor 8 + 9 + maintainers: 10 + - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> 11 + 12 + properties: 13 + compatible: 14 + enum: 15 + - ti,tmp102 16 + 17 + interrupts: 18 + maxItems: 1 19 + 20 + reg: 21 + maxItems: 1 22 + 23 + "#thermal-sensor-cells": 24 + const: 1 25 + 26 + required: 27 + - compatible 28 + - reg 29 + 30 + additionalProperties: false 31 + 32 + examples: 33 + - | 34 + #include <dt-bindings/interrupt-controller/irq.h> 35 + 36 + i2c { 37 + #address-cells = <1>; 38 + #size-cells = <0>; 39 + 40 + sensor@48 { 41 + compatible = "ti,tmp102"; 42 + reg = <0x48>; 43 + interrupt-parent = <&gpio7>; 44 + interrupts = <16 IRQ_TYPE_LEVEL_LOW>; 45 + #thermal-sensor-cells = <1>; 46 + }; 47 + };
+50
Documentation/devicetree/bindings/hwmon/ti,tmp108.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only or BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/ti,tmp108.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: TMP108 temperature sensor 8 + 9 + maintainers: 10 + - Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com> 11 + 12 + properties: 13 + compatible: 14 + enum: 15 + - ti,tmp108 16 + 17 + interrupts: 18 + items: 19 + - description: alert interrupt 20 + 21 + reg: 22 + maxItems: 1 23 + 24 + "#thermal-sensor-cells": 25 + const: 0 26 + 27 + required: 28 + - compatible 29 + - reg 30 + 31 + additionalProperties: false 32 + 33 + examples: 34 + - | 35 + #include <dt-bindings/interrupt-controller/irq.h> 36 + 37 + i2c { 38 + #address-cells = <1>; 39 + #size-cells = <0>; 40 + 41 + sensor@48 { 42 + compatible = "ti,tmp108"; 43 + reg = <0x48>; 44 + interrupt-parent = <&gpio1>; 45 + interrupts = <7 IRQ_TYPE_LEVEL_LOW>; 46 + pinctrl-names = "default"; 47 + pinctrl-0 = <&tmp_alrt>; 48 + #thermal-sensor-cells = <0>; 49 + }; 50 + };
+110
Documentation/devicetree/bindings/hwmon/ti,tmp421.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/hwmon/ti,tmp421.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: TMP42x/TMP44x temperature sensor 8 + 9 + maintainers: 10 + - Guenter Roeck <linux@roeck-us.net> 11 + 12 + description: | 13 + ±1°C Remote and Local temperature sensor 14 + https://www.ti.com/lit/ds/symlink/tmp422.pdf 15 + 16 + properties: 17 + compatible: 18 + enum: 19 + - ti,tmp421 20 + - ti,tmp422 21 + - ti,tmp423 22 + - ti,tmp441 23 + - ti,tmp442 24 + reg: 25 + maxItems: 1 26 + 27 + '#address-cells': 28 + const: 1 29 + 30 + '#size-cells': 31 + const: 0 32 + 33 + required: 34 + - compatible 35 + - reg 36 + 37 + additionalProperties: false 38 + 39 + patternProperties: 40 + "^channel@([0-3])$": 41 + type: object 42 + description: | 43 + Represents channels of the device and their specific configuration. 44 + 45 + properties: 46 + reg: 47 + description: | 48 + The channel number. 0 is local channel, 1-3 are remote channels 49 + items: 50 + minimum: 0 51 + maximum: 3 52 + 53 + label: 54 + description: | 55 + A descriptive name for this channel, like "ambient" or "psu". 56 + 57 + ti,n-factor: 58 + description: | 59 + The value (two's complement) to be programmed in the channel specific N correction register. 60 + For remote channels only. 61 + $ref: /schemas/types.yaml#/definitions/uint32 62 + items: 63 + minimum: 0 64 + maximum: 255 65 + 66 + required: 67 + - reg 68 + 69 + additionalProperties: false 70 + 71 + examples: 72 + - | 73 + i2c { 74 + #address-cells = <1>; 75 + #size-cells = <0>; 76 + 77 + sensor@4c { 78 + compatible = "ti,tmp422"; 79 + reg = <0x4c>; 80 + }; 81 + }; 82 + - | 83 + i2c { 84 + #address-cells = <1>; 85 + #size-cells = <0>; 86 + 87 + sensor@4c { 88 + compatible = "ti,tmp422"; 89 + reg = <0x4c>; 90 + #address-cells = <1>; 91 + #size-cells = <0>; 92 + 93 + channel@0 { 94 + reg = <0x0>; 95 + ti,n-factor = <0x1>; 96 + label = "local"; 97 + }; 98 + 99 + channel@1 { 100 + reg = <0x1>; 101 + ti,n-factor = <0x0>; 102 + label = "somelabel"; 103 + }; 104 + 105 + channel@2 { 106 + reg = <0x2>; 107 + status = "disabled"; 108 + }; 109 + }; 110 + };
-18
Documentation/devicetree/bindings/hwmon/tmp108.txt
··· 1 - TMP108 temperature sensor 2 - ------------------------- 3 - 4 - This device supports I2C only. 5 - 6 - Requires node properties: 7 - - compatible : "ti,tmp108" 8 - - reg : the I2C address of the device. This is 0x48, 0x49, 0x4a, or 0x4b. 9 - 10 - Optional properties: 11 - - interrupts: Reference to the TMP108 alert interrupt. 12 - - #thermal-sensor-cells: should be set to 0. 13 - 14 - Example: 15 - tmp108@48 { 16 - compatible = "ti,tmp108"; 17 - reg = <0x48>; 18 - };
+18 -8
Documentation/devicetree/bindings/trivial-devices.yaml
··· 41 41 - adi,adp5585-02 42 42 # Analog Devices ADP5589 Keypad Decoder and I/O Expansion 43 43 - adi,adp5589 44 - # +/-1C TDM Extended Temp Range I.C 45 - - adi,adt7461 46 - # +/-1C TDM Extended Temp Range I.C 47 - - adt7461 48 44 # AMS iAQ-Core VOC Sensor 49 45 - ams,iaq-core 50 46 # i2c serial eeprom (24cxx) ··· 73 77 - dallas,ds4510 74 78 # Digital Thermometer and Thermostat 75 79 - dallas,ds75 80 + # Delta Electronics DPS-650-AB power supply 81 + - delta,dps650ab 76 82 # Delta Electronics DPS920AB 920W 54V Power Supply 77 83 - delta,dps920ab 78 84 # 1/4 Brick DC/DC Regulated Power Module ··· 111 113 - mps,mp2888 112 114 # Monolithic Power Systems Inc. multi-phase controller mp2975 113 115 - mps,mp2975 114 - # G751: Digital Temperature Sensor and Thermal Watchdog with Two-Wire Interface 115 - - gmt,g751 116 + # Honeywell Humidicon HIH-6130 humidity/temperature sensor 117 + - honeywell,hi6130 118 + # IBM Common Form Factor Power Supply Versions (all versions) 119 + - ibm,cffps 120 + # IBM Common Form Factor Power Supply Versions 1 121 + - ibm,cffps1 122 + # IBM Common Form Factor Power Supply Versions 2 123 + - ibm,cffps2 116 124 # Infineon IR36021 digital POL buck controller 117 125 - infineon,ir36021 118 126 # Infineon IR38064 Voltage Regulator ··· 311 307 - ti,hdc1050 312 308 # Temperature and humidity sensor with i2c interface 313 309 - ti,hdc1080 310 + # Thermometer with SPI interface 311 + - ti,lm70 312 + - ti,lm71 314 313 # Temperature sensor with 2-wire interface 315 314 - ti,lm73 315 + # Thermometer with SPI interface 316 + - ti,lm74 316 317 # Temperature sensor with integrated fan control 317 318 - ti,lm96000 318 319 # I2C Touch-Screen Controller 319 320 - ti,tsc2003 320 321 # Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface 321 - - ti,tmp102 322 - # Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface 323 322 - ti,tmp103 323 + # Thermometer with SPI interface 324 + - ti,tmp121 325 + - ti,tmp122 324 326 # Digital Temperature Sensor 325 327 - ti,tmp275 326 328 # TI Dual channel DCAP+ multiphase controller TPS53676 with AVSBus
+3
Documentation/hwmon/dell-smm-hwmon.rst
··· 34 34 =============================== ======= ======================================= 35 35 fan[1-3]_input RO Fan speed in RPM. 36 36 fan[1-3]_label RO Fan label. 37 + fan[1-3]_min RO Minimal Fan speed in RPM 38 + fan[1-3]_max RO Maximal Fan speed in RPM 39 + fan[1-3]_target RO Expected Fan speed in RPM 37 40 pwm[1-3] RW Control the fan PWM duty-cycle. 38 41 pwm1_enable WO Enable or disable automatic BIOS fan 39 42 control (not supported on all laptops,
+1
Documentation/hwmon/index.rst
··· 130 130 max31785 131 131 max31790 132 132 max34440 133 + max6620 133 134 max6639 134 135 max6642 135 136 max6650
+2
Documentation/hwmon/lm25066.rst
··· 79 79 devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for 80 80 details. 81 81 82 + The shunt (sense) resistor value can be configured by a device tree property; 83 + see Documentation/devicetree/bindings/hwmon/pmbus/ti,lm25066.yaml for details. 82 84 83 85 Platform data support 84 86 ---------------------
+10
Documentation/hwmon/lm90.rst
··· 265 265 266 266 https://www.ti.com/litv/pdf/sbos686 267 267 268 + * Texas Instruments TMP461 269 + 270 + Prefix: 'tmp461' 271 + 272 + Addresses scanned: I2C 0x48 through 0x4F 273 + 274 + Datasheet: Publicly available at TI website 275 + 276 + https://www.ti.com/lit/gpn/tmp461 277 + 268 278 Author: Jean Delvare <jdelvare@suse.de> 269 279 270 280
+46
Documentation/hwmon/max6620.rst
··· 1 + .. SPDX-License-Identifier: GPL-2.0-or-later 2 + 3 + Kernel driver max6620 4 + ===================== 5 + 6 + Supported chips: 7 + 8 + Maxim MAX6620 9 + 10 + Prefix: 'max6620' 11 + 12 + Addresses scanned: none 13 + 14 + Datasheet: http://pdfserv.maxim-ic.com/en/ds/MAX6620.pdf 15 + 16 + Authors: 17 + - L\. Grunenberg <contact@lgrunenberg.de> 18 + - Cumulus Networks <support@cumulusnetworks.com> 19 + - Shuotian Cheng <shuche@microsoft.com> 20 + - Arun Saravanan Balachandran <Arun_Saravanan_Balac@dell.com> 21 + 22 + Description 23 + ----------- 24 + 25 + This driver implements support for Maxim MAX6620 fan controller. 26 + 27 + The driver configures the fan controller in RPM mode. To give the readings more 28 + range or accuracy, the desired value can be set by a programmable register 29 + (1, 2, 4, 8, 16 or 32). Set higher values for larger speeds. 30 + 31 + The driver provides the following sensor access in sysfs: 32 + 33 + ================ ======= ===================================================== 34 + fan[1-4]_alarm ro Fan alarm. 35 + fan[1-4]_div rw Sets the nominal RPM range of the fan. Valid values 36 + are 1, 2, 4, 8, 16 and 32. 37 + fan[1-4]_input ro Fan speed in RPM. 38 + fan[1-4]_target rw Desired fan speed in RPM. 39 + ================ ======= ===================================================== 40 + 41 + Usage notes 42 + ----------- 43 + 44 + This driver does not auto-detect devices. You will have to instantiate the 45 + devices explicitly. Please see Documentation/i2c/instantiating-devices.rst for 46 + details.
+1 -14
Documentation/hwmon/tmp401.rst
··· 43 43 44 44 Datasheet: http://focus.ti.com/docs/prod/folders/print/tmp435.html 45 45 46 - * Texas Instruments TMP461 47 - 48 - Prefix: 'tmp461' 49 - 50 - Datasheet: https://www.ti.com/product/tmp461 51 - 52 46 53 47 54 48 Authors: ··· 54 60 ----------- 55 61 56 62 This driver implements support for Texas Instruments TMP401, TMP411, 57 - TMP431, TMP432, TMP435, and TMP461 chips. These chips implement one or two 63 + TMP431, TMP432, and TMP435 chips. These chips implement one or two 58 64 remote and one local temperature sensors. Temperature is measured in degrees 59 65 Celsius. Resolution of the remote sensor is 0.0625 degree. Local 60 66 sensor resolution can be set to 0.5, 0.25, 0.125 or 0.0625 degree (not ··· 78 84 79 85 TMP432 is compatible with TMP401 and TMP431. It supports two external 80 86 temperature sensors. 81 - 82 - TMP461 is compatible with TMP401. It supports offset correction 83 - that is applied to the remote sensor. 84 - 85 - * Sensor offset values are temperature values 86 - 87 - Exported via sysfs attribute tempX_offset
+10
Documentation/hwmon/tmp421.rst
··· 64 64 **temp[1-4]_input** 65 65 66 66 **temp[2-4]_fault** 67 + 68 + Each sensor can be individually disabled via Devicetree or from sysfs 69 + via: 70 + 71 + **temp[1-4]_enable** 72 + 73 + If labels were specified in Devicetree, additional sysfs files will 74 + be present: 75 + 76 + **temp[1-4]_label**
+2 -2
MAINTAINERS
··· 10038 10038 M: Guenter Roeck <linux@roeck-us.net> 10039 10039 L: linux-hwmon@vger.kernel.org 10040 10040 S: Maintained 10041 + F: Documentation/devicetree/bindings/hwmon/jedec,jc42.yaml 10041 10042 F: Documentation/hwmon/jc42.rst 10042 10043 F: drivers/hwmon/jc42.c 10043 10044 ··· 10933 10932 M: Jean Delvare <jdelvare@suse.com> 10934 10933 L: linux-hwmon@vger.kernel.org 10935 10934 S: Maintained 10936 - F: Documentation/devicetree/bindings/hwmon/lm90.txt 10935 + F: Documentation/devicetree/bindings/hwmon/national,lm90.yaml 10937 10936 F: Documentation/hwmon/lm90.rst 10938 10937 F: drivers/hwmon/lm90.c 10939 10938 F: include/dt-bindings/thermal/lm90.h ··· 14967 14966 W: http://hwmon.wiki.kernel.org/ 14968 14967 W: http://www.roeck-us.net/linux/drivers/ 14969 14968 T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git 14970 - F: Documentation/devicetree/bindings/hwmon/ibm,cffps1.txt 14971 14969 F: Documentation/devicetree/bindings/hwmon/ltc2978.txt 14972 14970 F: Documentation/devicetree/bindings/hwmon/max31785.txt 14973 14971 F: Documentation/hwmon/adm1275.rst
+1
drivers/acpi/scan.c
··· 608 608 { 609 609 return handle_to_device(handle, get_acpi_device); 610 610 } 611 + EXPORT_SYMBOL_GPL(acpi_bus_get_acpi_device); 611 612 612 613 static struct acpi_device_bus_id *acpi_device_bus_id_match(const char *dev_id) 613 614 {
+13 -2
drivers/hwmon/Kconfig
··· 1032 1032 This driver can also be built as a module. If so, the module 1033 1033 will be called max31730. 1034 1034 1035 + config SENSORS_MAX6620 1036 + tristate "Maxim MAX6620 fan controller" 1037 + depends on I2C 1038 + help 1039 + If you say yes here you get support for the MAX6620 1040 + fan controller. 1041 + 1042 + This driver can also be built as a module. If so, the module 1043 + will be called max6620. 1044 + 1035 1045 config SENSORS_MAX6621 1036 1046 tristate "Maxim MAX6621 sensor chip" 1037 1047 depends on I2C ··· 1327 1317 Maxim MAX6646, MAX6647, MAX6648, MAX6649, MAX6654, MAX6657, MAX6658, 1328 1318 MAX6659, MAX6680, MAX6681, MAX6692, MAX6695, MAX6696, 1329 1319 ON Semiconductor NCT1008, Winbond/Nuvoton W83L771W/G/AWG/ASG, 1330 - Philips SA56004, GMT G781, and Texas Instruments TMP451 1320 + Philips SA56004, GMT G781, Texas Instruments TMP451 and TMP461 1331 1321 sensor chips. 1332 1322 1333 1323 This driver can also be built as a module. If so, the module ··· 1443 1433 config SENSORS_NCT6775 1444 1434 tristate "Nuvoton NCT6775F and compatibles" 1445 1435 depends on !PPC 1436 + depends on ACPI_WMI || ACPI_WMI=n 1446 1437 select HWMON_VID 1447 1438 help 1448 1439 If you say yes here you get support for the hardware monitoring ··· 1941 1930 depends on I2C 1942 1931 help 1943 1932 If you say yes here you get support for Texas Instruments TMP401, 1944 - TMP411, TMP431, TMP432, TMP435, and TMP461 temperature sensor chips. 1933 + TMP411, TMP431, TMP432, and TMP435 temperature sensor chips. 1945 1934 1946 1935 This driver can also be built as a module. If so, the module 1947 1936 will be called tmp401.
+1
drivers/hwmon/Makefile
··· 135 135 obj-$(CONFIG_SENSORS_MAX197) += max197.o 136 136 obj-$(CONFIG_SENSORS_MAX31722) += max31722.o 137 137 obj-$(CONFIG_SENSORS_MAX31730) += max31730.o 138 + obj-$(CONFIG_SENSORS_MAX6620) += max6620.o 138 139 obj-$(CONFIG_SENSORS_MAX6621) += max6621.o 139 140 obj-$(CONFIG_SENSORS_MAX6639) += max6639.o 140 141 obj-$(CONFIG_SENSORS_MAX6642) += max6642.o
+3 -3
drivers/hwmon/abituguru3.c
··· 145 145 struct device *hwmon_dev; /* hwmon registered device */ 146 146 struct mutex update_lock; /* protect access to data and uGuru */ 147 147 unsigned short addr; /* uguru base address */ 148 - char valid; /* !=0 if following fields are valid */ 148 + bool valid; /* true if following fields are valid */ 149 149 unsigned long last_updated; /* In jiffies */ 150 150 151 151 /* ··· 1083 1083 mutex_lock(&data->update_lock); 1084 1084 if (!data->valid || time_after(jiffies, data->last_updated + HZ)) { 1085 1085 /* Clear data->valid while updating */ 1086 - data->valid = 0; 1086 + data->valid = false; 1087 1087 /* Read alarms */ 1088 1088 if (abituguru3_read_increment_offset(data, 1089 1089 ABIT_UGURU3_SETTINGS_BANK, ··· 1117 1117 goto LEAVE_UPDATE; 1118 1118 } 1119 1119 data->last_updated = jiffies; 1120 - data->valid = 1; 1120 + data->valid = true; 1121 1121 } 1122 1122 LEAVE_UPDATE: 1123 1123 mutex_unlock(&data->update_lock);
+5 -8
drivers/hwmon/acpi_power_meter.c
··· 535 535 536 536 sysfs_remove_link(resource->holders_dir, 537 537 kobject_name(&obj->dev.kobj)); 538 - put_device(&obj->dev); 538 + acpi_dev_put(obj); 539 539 } 540 540 541 541 kfree(resource->domain_devices); ··· 597 597 continue; 598 598 599 599 /* Create a symlink to domain objects */ 600 - resource->domain_devices[i] = NULL; 601 - if (acpi_bus_get_device(element->reference.handle, 602 - &resource->domain_devices[i])) 600 + obj = acpi_bus_get_acpi_device(element->reference.handle); 601 + resource->domain_devices[i] = obj; 602 + if (!obj) 603 603 continue; 604 - 605 - obj = resource->domain_devices[i]; 606 - get_device(&obj->dev); 607 604 608 605 res = sysfs_create_link(resource->holders_dir, &obj->dev.kobj, 609 606 kobject_name(&obj->dev.kobj)); 610 607 if (res) { 611 - put_device(&obj->dev); 608 + acpi_dev_put(obj); 612 609 resource->domain_devices[i] = NULL; 613 610 } 614 611 }
+2 -2
drivers/hwmon/ad7414.c
··· 37 37 struct ad7414_data { 38 38 struct i2c_client *client; 39 39 struct mutex lock; /* atomic read data updates */ 40 - char valid; /* !=0 if following fields are valid */ 40 + bool valid; /* true if following fields are valid */ 41 41 unsigned long next_update; /* In jiffies */ 42 42 s16 temp_input; /* Register values */ 43 43 s8 temps[ARRAY_SIZE(AD7414_REG_LIMIT)]; ··· 95 95 } 96 96 97 97 data->next_update = jiffies + HZ + HZ / 2; 98 - data->valid = 1; 98 + data->valid = true; 99 99 } 100 100 101 101 mutex_unlock(&data->lock);
+3 -3
drivers/hwmon/ad7418.c
··· 46 46 enum chips type; 47 47 struct mutex lock; 48 48 int adc_max; /* number of ADC channels */ 49 - char valid; 49 + bool valid; 50 50 unsigned long last_updated; /* In jiffies */ 51 51 s16 temp[3]; /* Register values */ 52 52 u16 in[4]; ··· 111 111 goto abort; 112 112 113 113 data->last_updated = jiffies; 114 - data->valid = 1; 114 + data->valid = true; 115 115 } 116 116 117 117 mutex_unlock(&data->lock); 118 118 return 0; 119 119 120 120 abort: 121 - data->valid = 0; 121 + data->valid = false; 122 122 mutex_unlock(&data->lock); 123 123 return val; 124 124 }
+2 -2
drivers/hwmon/adm1021.c
··· 72 72 const struct attribute_group *groups[3]; 73 73 74 74 struct mutex update_lock; 75 - char valid; /* !=0 if following fields are valid */ 75 + bool valid; /* true if following fields are valid */ 76 76 char low_power; /* !=0 if device in low power mode */ 77 77 unsigned long last_updated; /* In jiffies */ 78 78 ··· 135 135 ADM1023_REG_REM_OFFSET_PREC); 136 136 } 137 137 data->last_updated = jiffies; 138 - data->valid = 1; 138 + data->valid = true; 139 139 } 140 140 141 141 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/adm1025.c
··· 97 97 struct i2c_client *client; 98 98 const struct attribute_group *groups[3]; 99 99 struct mutex update_lock; 100 - char valid; /* zero until following fields are valid */ 100 + bool valid; /* false until following fields are valid */ 101 101 unsigned long last_updated; /* in jiffies */ 102 102 103 103 u8 in[6]; /* register value */ ··· 148 148 ADM1025_REG_VID4) & 0x01) << 4); 149 149 150 150 data->last_updated = jiffies; 151 - data->valid = 1; 151 + data->valid = true; 152 152 } 153 153 154 154 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/adm1026.c
··· 259 259 const struct attribute_group *groups[3]; 260 260 261 261 struct mutex update_lock; 262 - int valid; /* !=0 if following fields are valid */ 262 + bool valid; /* true if following fields are valid */ 263 263 unsigned long last_reading; /* In jiffies */ 264 264 unsigned long last_config; /* In jiffies */ 265 265 ··· 459 459 data->last_config = jiffies; 460 460 } /* last_config */ 461 461 462 - data->valid = 1; 462 + data->valid = true; 463 463 mutex_unlock(&data->update_lock); 464 464 return data; 465 465 }
+2 -2
drivers/hwmon/adm1029.c
··· 99 99 struct adm1029_data { 100 100 struct i2c_client *client; 101 101 struct mutex update_lock; /* protect register access */ 102 - char valid; /* zero until following fields are valid */ 102 + bool valid; /* false until following fields are valid */ 103 103 unsigned long last_updated; /* in jiffies */ 104 104 105 105 /* registers values, signed for temperature, unsigned for other stuff */ ··· 143 143 } 144 144 145 145 data->last_updated = jiffies; 146 - data->valid = 1; 146 + data->valid = true; 147 147 } 148 148 149 149 mutex_unlock(&data->update_lock);
+3 -3
drivers/hwmon/adm1031.c
··· 65 65 const struct attribute_group *groups[3]; 66 66 struct mutex update_lock; 67 67 int chip_type; 68 - char valid; /* !=0 if following fields are valid */ 68 + bool valid; /* true if following fields are valid */ 69 69 unsigned long last_updated; /* In jiffies */ 70 70 unsigned int update_interval; /* In milliseconds */ 71 71 /* ··· 187 187 ADM1031_REG_PWM) >> (4 * chan)) & 0x0f; 188 188 } 189 189 data->last_updated = jiffies; 190 - data->valid = 1; 190 + data->valid = true; 191 191 } 192 192 193 193 mutex_unlock(&data->update_lock); ··· 650 650 data->fan_min[nr]); 651 651 652 652 /* Invalidate the cache: fan speed is no longer valid */ 653 - data->valid = 0; 653 + data->valid = false; 654 654 mutex_unlock(&data->update_lock); 655 655 return count; 656 656 }
+2 -1
drivers/hwmon/adt7310.c
··· 90 90 91 91 static int adt7310_spi_remove(struct spi_device *spi) 92 92 { 93 - return adt7x10_remove(&spi->dev, spi->irq); 93 + adt7x10_remove(&spi->dev, spi->irq); 94 + return 0; 94 95 } 95 96 96 97 static const struct spi_device_id adt7310_id[] = {
+2 -1
drivers/hwmon/adt7410.c
··· 50 50 51 51 static int adt7410_i2c_remove(struct i2c_client *client) 52 52 { 53 - return adt7x10_remove(&client->dev, client->irq); 53 + adt7x10_remove(&client->dev, client->irq); 54 + return 0; 54 55 } 55 56 56 57 static const struct i2c_device_id adt7410_ids[] = {
+1 -2
drivers/hwmon/adt7x10.c
··· 444 444 } 445 445 EXPORT_SYMBOL_GPL(adt7x10_probe); 446 446 447 - int adt7x10_remove(struct device *dev, int irq) 447 + void adt7x10_remove(struct device *dev, int irq) 448 448 { 449 449 struct adt7x10_data *data = dev_get_drvdata(dev); 450 450 ··· 457 457 sysfs_remove_group(&dev->kobj, &adt7x10_group); 458 458 if (data->oldconfig != data->config) 459 459 adt7x10_write_byte(dev, ADT7X10_CONFIG, data->oldconfig); 460 - return 0; 461 460 } 462 461 EXPORT_SYMBOL_GPL(adt7x10_remove); 463 462
+1 -1
drivers/hwmon/adt7x10.h
··· 26 26 27 27 int adt7x10_probe(struct device *dev, const char *name, int irq, 28 28 const struct adt7x10_ops *ops); 29 - int adt7x10_remove(struct device *dev, int irq); 29 + void adt7x10_remove(struct device *dev, int irq); 30 30 31 31 #ifdef CONFIG_PM_SLEEP 32 32 extern const struct dev_pm_ops adt7x10_dev_pm_ops;
+4 -4
drivers/hwmon/amc6821.c
··· 141 141 struct amc6821_data { 142 142 struct i2c_client *client; 143 143 struct mutex update_lock; 144 - char valid; /* zero until following fields are valid */ 144 + bool valid; /* false until following fields are valid */ 145 145 unsigned long last_updated; /* in jiffies */ 146 146 147 147 /* register values */ ··· 258 258 } 259 259 260 260 data->last_updated = jiffies; 261 - data->valid = 1; 261 + data->valid = true; 262 262 } 263 263 mutex_unlock(&data->update_lock); 264 264 return data; ··· 511 511 } 512 512 513 513 mutex_lock(&data->update_lock); 514 - data->valid = 0; 514 + data->valid = false; 515 515 516 516 switch (ix) { 517 517 case 0: ··· 584 584 } 585 585 586 586 EXIT: 587 - data->valid = 0; 587 + data->valid = false; 588 588 mutex_unlock(&data->update_lock); 589 589 return count; 590 590 }
+1 -1
drivers/hwmon/applesmc.c
··· 391 391 cache->len = info[0]; 392 392 memcpy(cache->type, &info[1], 4); 393 393 cache->flags = info[5]; 394 - cache->valid = 1; 394 + cache->valid = true; 395 395 396 396 out: 397 397 mutex_unlock(&smcreg.mutex);
+2 -2
drivers/hwmon/asb100.c
··· 186 186 /* array of 2 pointers to subclients */ 187 187 struct i2c_client *lm75[2]; 188 188 189 - char valid; /* !=0 if following fields are valid */ 189 + bool valid; /* true if following fields are valid */ 190 190 u8 in[7]; /* Register value */ 191 191 u8 in_max[7]; /* Register value */ 192 192 u8 in_min[7]; /* Register value */ ··· 993 993 (asb100_read_value(client, ASB100_REG_ALARM2) << 8); 994 994 995 995 data->last_updated = jiffies; 996 - data->valid = 1; 996 + data->valid = true; 997 997 998 998 dev_dbg(&client->dev, "... device update complete\n"); 999 999 }
+2 -2
drivers/hwmon/asc7621.c
··· 77 77 struct i2c_client client; 78 78 struct device *class_dev; 79 79 struct mutex update_lock; 80 - int valid; /* !=0 if following fields are valid */ 80 + bool valid; /* true if following fields are valid */ 81 81 unsigned long last_high_reading; /* In jiffies */ 82 82 unsigned long last_low_reading; /* In jiffies */ 83 83 /* ··· 1032 1032 data->last_low_reading = jiffies; 1033 1033 } /* last_reading */ 1034 1034 1035 - data->valid = 1; 1035 + data->valid = true; 1036 1036 1037 1037 mutex_unlock(&data->update_lock); 1038 1038
+5 -5
drivers/hwmon/atxp1.c
··· 37 37 struct i2c_client *client; 38 38 struct mutex update_lock; 39 39 unsigned long last_updated; 40 - u8 valid; 40 + bool valid; 41 41 struct { 42 42 u8 vid; /* VID output register */ 43 43 u8 cpu_vid; /* VID input from CPU */ ··· 63 63 data->reg.gpio1 = i2c_smbus_read_byte_data(client, ATXP1_GPIO1); 64 64 data->reg.gpio2 = i2c_smbus_read_byte_data(client, ATXP1_GPIO2); 65 65 66 - data->valid = 1; 66 + data->valid = true; 67 67 } 68 68 69 69 mutex_unlock(&data->update_lock); ··· 136 136 ATXP1_VID, cvid | ATXP1_VIDENA); 137 137 } 138 138 139 - data->valid = 0; 139 + data->valid = false; 140 140 141 141 return count; 142 142 } ··· 180 180 181 181 i2c_smbus_write_byte_data(client, ATXP1_GPIO1, value); 182 182 183 - data->valid = 0; 183 + data->valid = false; 184 184 } 185 185 186 186 return count; ··· 224 224 225 225 i2c_smbus_write_byte_data(client, ATXP1_GPIO2, value); 226 226 227 - data->valid = 0; 227 + data->valid = false; 228 228 } 229 229 230 230 return count;
+1 -1
drivers/hwmon/coretemp.c
··· 167 167 * really help at all. 168 168 */ 169 169 tdata->temp = tdata->tjmax - ((eax >> 16) & 0x7f) * 1000; 170 - tdata->valid = 1; 170 + tdata->valid = true; 171 171 tdata->last_updated = jiffies; 172 172 } 173 173
+81 -24
drivers/hwmon/dell-smm-hwmon.c
··· 12 12 13 13 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 14 14 15 + #include <linux/capability.h> 15 16 #include <linux/cpu.h> 17 + #include <linux/ctype.h> 16 18 #include <linux/delay.h> 19 + #include <linux/dmi.h> 17 20 #include <linux/err.h> 18 - #include <linux/module.h> 19 - #include <linux/platform_device.h> 20 - #include <linux/types.h> 21 + #include <linux/errno.h> 22 + #include <linux/hwmon.h> 21 23 #include <linux/init.h> 24 + #include <linux/module.h> 25 + #include <linux/mutex.h> 26 + #include <linux/platform_device.h> 22 27 #include <linux/proc_fs.h> 23 28 #include <linux/seq_file.h> 24 - #include <linux/dmi.h> 25 - #include <linux/capability.h> 26 - #include <linux/mutex.h> 27 - #include <linux/hwmon.h> 28 - #include <linux/uaccess.h> 29 - #include <linux/io.h> 30 - #include <linux/sched.h> 31 - #include <linux/ctype.h> 29 + #include <linux/string.h> 32 30 #include <linux/smp.h> 31 + #include <linux/types.h> 32 + #include <linux/uaccess.h> 33 33 34 34 #include <linux/i8k.h> 35 35 ··· 76 76 int temp_type[DELL_SMM_NO_TEMP]; 77 77 bool fan[DELL_SMM_NO_FANS]; 78 78 int fan_type[DELL_SMM_NO_FANS]; 79 + int *fan_nominal_speed[DELL_SMM_NO_FANS]; 79 80 }; 80 81 81 82 MODULE_AUTHOR("Massimo Dal Zotto (dz@debian.org)"); ··· 327 326 } 328 327 329 328 /* 330 - * Set the fan speed (off, low, high). Returns the new fan status. 329 + * Set the fan speed (off, low, high, ...). 331 330 */ 332 331 static int i8k_set_fan(const struct dell_smm_data *data, int fan, int speed) 333 332 { ··· 339 338 speed = (speed < 0) ? 0 : ((speed > data->i8k_fan_max) ? data->i8k_fan_max : speed); 340 339 regs.ebx = (fan & 0xff) | (speed << 8); 341 340 342 - return i8k_smm(&regs) ? : i8k_get_fan_status(data, fan); 341 + return i8k_smm(&regs); 343 342 } 344 343 345 344 static int __init i8k_get_temp_type(int sensor) ··· 453 452 i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd, unsigned long arg) 454 453 { 455 454 int val = 0; 456 - int speed; 455 + int speed, err; 457 456 unsigned char buff[16]; 458 457 int __user *argp = (int __user *)arg; 459 458 ··· 474 473 if (restricted && !capable(CAP_SYS_ADMIN)) 475 474 return -EPERM; 476 475 477 - memset(buff, 0, sizeof(buff)); 478 - strscpy(buff, data->bios_machineid, sizeof(buff)); 476 + strscpy_pad(buff, data->bios_machineid, sizeof(buff)); 479 477 break; 480 478 481 479 case I8K_FN_STATUS: ··· 513 513 if (copy_from_user(&speed, argp + 1, sizeof(int))) 514 514 return -EFAULT; 515 515 516 - val = i8k_set_fan(data, val, speed); 516 + err = i8k_set_fan(data, val, speed); 517 + if (err < 0) 518 + return err; 519 + 520 + val = i8k_get_fan_status(data, val); 517 521 break; 518 522 519 523 default: 520 - return -EINVAL; 524 + return -ENOIOCTLCMD; 521 525 } 522 526 523 527 if (val < 0) ··· 678 674 return 0444; 679 675 680 676 break; 677 + case hwmon_fan_min: 678 + case hwmon_fan_max: 679 + case hwmon_fan_target: 680 + if (data->fan_nominal_speed[channel]) 681 + return 0444; 682 + 683 + break; 681 684 default: 682 685 break; 683 686 } ··· 750 739 return ret; 751 740 752 741 *val = ret; 742 + 743 + return 0; 744 + case hwmon_fan_min: 745 + *val = data->fan_nominal_speed[channel][0]; 746 + 747 + return 0; 748 + case hwmon_fan_max: 749 + *val = data->fan_nominal_speed[channel][data->i8k_fan_max]; 750 + 751 + return 0; 752 + case hwmon_fan_target: 753 + ret = i8k_get_fan_status(data, channel); 754 + if (ret < 0) 755 + return ret; 756 + 757 + if (ret > data->i8k_fan_max) 758 + ret = data->i8k_fan_max; 759 + 760 + *val = data->fan_nominal_speed[channel][ret]; 753 761 754 762 return 0; 755 763 default: ··· 919 889 HWMON_T_INPUT | HWMON_T_LABEL 920 890 ), 921 891 HWMON_CHANNEL_INFO(fan, 922 - HWMON_F_INPUT | HWMON_F_LABEL, 923 - HWMON_F_INPUT | HWMON_F_LABEL, 924 - HWMON_F_INPUT | HWMON_F_LABEL 892 + HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | 893 + HWMON_F_TARGET, 894 + HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | 895 + HWMON_F_TARGET, 896 + HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_MIN | HWMON_F_MAX | 897 + HWMON_F_TARGET 925 898 ), 926 899 HWMON_CHANNEL_INFO(pwm, 927 900 HWMON_PWM_INPUT | HWMON_PWM_ENABLE, ··· 943 910 { 944 911 struct dell_smm_data *data = dev_get_drvdata(dev); 945 912 struct device *dell_smm_hwmon_dev; 946 - int i, err; 913 + int i, state, err; 947 914 948 915 for (i = 0; i < DELL_SMM_NO_TEMP; i++) { 949 916 data->temp_type[i] = i8k_get_temp_type(i); ··· 959 926 err = i8k_get_fan_status(data, i); 960 927 if (err < 0) 961 928 err = i8k_get_fan_type(data, i); 962 - if (err >= 0) 963 - data->fan[i] = true; 929 + 930 + if (err < 0) 931 + continue; 932 + 933 + data->fan[i] = true; 934 + data->fan_nominal_speed[i] = devm_kmalloc_array(dev, data->i8k_fan_max + 1, 935 + sizeof(*data->fan_nominal_speed[i]), 936 + GFP_KERNEL); 937 + if (!data->fan_nominal_speed[i]) 938 + continue; 939 + 940 + for (state = 0; state <= data->i8k_fan_max; state++) { 941 + err = i8k_get_fan_nominal_speed(data, i, state); 942 + if (err < 0) { 943 + /* Mark nominal speed table as invalid in case of error */ 944 + devm_kfree(dev, data->fan_nominal_speed[i]); 945 + data->fan_nominal_speed[i] = NULL; 946 + break; 947 + } 948 + data->fan_nominal_speed[i][state] = err; 949 + } 964 950 } 965 951 966 952 dell_smm_hwmon_dev = devm_hwmon_device_register_with_info(dev, "dell_smm", data, ··· 999 947 DELL_STUDIO, 1000 948 DELL_XPS, 1001 949 }; 950 + 951 + /* 952 + * Only use for machines which need some special configuration 953 + * in order to work correctly (e.g. if autoconfig fails on this machines). 954 + */ 1002 955 1003 956 static const struct i8k_config_data i8k_config_data[] __initconst = { 1004 957 [DELL_LATITUDE_D520] = {
+2 -2
drivers/hwmon/dme1737.c
··· 203 203 unsigned int addr; /* for ISA devices only */ 204 204 205 205 struct mutex update_lock; 206 - int valid; /* !=0 if following fields are valid */ 206 + bool valid; /* true if following fields are valid */ 207 207 unsigned long last_update; /* in jiffies */ 208 208 unsigned long last_vbat; /* in jiffies */ 209 209 enum chips type; ··· 778 778 } 779 779 780 780 data->last_update = jiffies; 781 - data->valid = 1; 781 + data->valid = true; 782 782 } 783 783 784 784 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/ds1621.c
··· 109 109 struct ds1621_data { 110 110 struct i2c_client *client; 111 111 struct mutex update_lock; 112 - char valid; /* !=0 if following fields are valid */ 112 + bool valid; /* true if following fields are valid */ 113 113 unsigned long last_updated; /* In jiffies */ 114 114 enum chips kind; /* device type */ 115 115 ··· 213 213 new_conf); 214 214 215 215 data->last_updated = jiffies; 216 - data->valid = 1; 216 + data->valid = true; 217 217 } 218 218 219 219 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/ds620.c
··· 56 56 struct ds620_data { 57 57 struct i2c_client *client; 58 58 struct mutex update_lock; 59 - char valid; /* !=0 if following fields are valid */ 59 + bool valid; /* true if following fields are valid */ 60 60 unsigned long last_updated; /* In jiffies */ 61 61 62 62 s16 temp[3]; /* Register values, word */ ··· 118 118 } 119 119 120 120 data->last_updated = jiffies; 121 - data->valid = 1; 121 + data->valid = true; 122 122 } 123 123 abort: 124 124 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/emc6w201.c
··· 45 45 struct emc6w201_data { 46 46 struct i2c_client *client; 47 47 struct mutex update_lock; 48 - char valid; /* zero until following fields are valid */ 48 + bool valid; /* false until following fields are valid */ 49 49 unsigned long last_updated; /* in jiffies */ 50 50 51 51 /* registers values */ ··· 162 162 } 163 163 164 164 data->last_updated = jiffies; 165 - data->valid = 1; 165 + data->valid = true; 166 166 } 167 167 168 168 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/f71805f.c
··· 165 165 struct device *hwmon_dev; 166 166 167 167 struct mutex update_lock; 168 - char valid; /* !=0 if following fields are valid */ 168 + bool valid; /* true if following fields are valid */ 169 169 unsigned long last_updated; /* In jiffies */ 170 170 unsigned long last_limits; /* In jiffies */ 171 171 ··· 404 404 + (f71805f_read8(data, F71805F_REG_STATUS(2)) << 16); 405 405 406 406 data->last_updated = jiffies; 407 - data->valid = 1; 407 + data->valid = true; 408 408 } 409 409 410 410 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/f71882fg.c
··· 253 253 254 254 struct mutex update_lock; 255 255 int temp_start; /* temp numbering start (0 or 1) */ 256 - char valid; /* !=0 if following fields are valid */ 256 + bool valid; /* true if following fields are valid */ 257 257 char auto_point_temp_signed; 258 258 unsigned long last_updated; /* In jiffies */ 259 259 unsigned long last_limits; /* In jiffies */ ··· 1359 1359 F71882FG_REG_IN(nr)); 1360 1360 1361 1361 data->last_updated = jiffies; 1362 - data->valid = 1; 1362 + data->valid = true; 1363 1363 } 1364 1364 1365 1365 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/f75375s.c
··· 85 85 const char *name; 86 86 int kind; 87 87 struct mutex update_lock; /* protect register access */ 88 - char valid; 88 + bool valid; 89 89 unsigned long last_updated; /* In jiffies */ 90 90 unsigned long last_limits; /* In jiffies */ 91 91 ··· 228 228 f75375_read8(client, F75375_REG_VOLT(nr)); 229 229 230 230 data->last_updated = jiffies; 231 - data->valid = 1; 231 + data->valid = true; 232 232 } 233 233 234 234 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/fschmd.c
··· 264 264 unsigned long watchdog_is_open; 265 265 char watchdog_expect_close; 266 266 char watchdog_name[10]; /* must be unique to avoid sysfs conflict */ 267 - char valid; /* zero until following fields are valid */ 267 + bool valid; /* false until following fields are valid */ 268 268 unsigned long last_updated; /* in jiffies */ 269 269 270 270 /* register values */ ··· 1356 1356 FSCHMD_REG_VOLT[data->kind][i]); 1357 1357 1358 1358 data->last_updated = jiffies; 1359 - data->valid = 1; 1359 + data->valid = true; 1360 1360 } 1361 1361 1362 1362 mutex_unlock(&data->update_lock);
+1 -1
drivers/hwmon/g760a.c
··· 95 95 data->fan_sta = g760a_read_value(client, G760A_REG_FAN_STA); 96 96 97 97 data->last_updated = jiffies; 98 - data->valid = 1; 98 + data->valid = true; 99 99 } 100 100 101 101 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/gl518sm.c
··· 107 107 enum chips type; 108 108 109 109 struct mutex update_lock; 110 - char valid; /* !=0 if following fields are valid */ 110 + bool valid; /* true if following fields are valid */ 111 111 unsigned long last_updated; /* In jiffies */ 112 112 113 113 u8 voltage_in[4]; /* Register values; [0] = VDD */ ··· 211 211 gl518_read_value(client, GL518_REG_VIN3); 212 212 213 213 data->last_updated = jiffies; 214 - data->valid = 1; 214 + data->valid = true; 215 215 } 216 216 217 217 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/gl520sm.c
··· 64 64 struct i2c_client *client; 65 65 const struct attribute_group *groups[3]; 66 66 struct mutex update_lock; 67 - char valid; /* zero until the following fields are valid */ 67 + bool valid; /* false until the following fields are valid */ 68 68 unsigned long last_updated; /* in jiffies */ 69 69 70 70 u8 vid; ··· 174 174 } 175 175 176 176 data->last_updated = jiffies; 177 - data->valid = 1; 177 + data->valid = true; 178 178 } 179 179 180 180 mutex_unlock(&data->update_lock);
+4 -2
drivers/hwmon/hwmon.c
··· 796 796 dev_set_drvdata(hdev, drvdata); 797 797 dev_set_name(hdev, HWMON_ID_FORMAT, id); 798 798 err = device_register(hdev); 799 - if (err) 800 - goto free_hwmon; 799 + if (err) { 800 + put_device(hdev); 801 + goto ida_remove; 802 + } 801 803 802 804 INIT_LIST_HEAD(&hwdev->tzdata); 803 805
+61 -53
drivers/hwmon/i5500_temp.c
··· 5 5 * Copyright (C) 2012, 2014 Jean Delvare <jdelvare@suse.de> 6 6 */ 7 7 8 + #include <linux/bitops.h> 8 9 #include <linux/module.h> 9 10 #include <linux/init.h> 10 11 #include <linux/slab.h> ··· 13 12 #include <linux/device.h> 14 13 #include <linux/pci.h> 15 14 #include <linux/hwmon.h> 16 - #include <linux/hwmon-sysfs.h> 17 15 #include <linux/err.h> 18 16 #include <linux/mutex.h> 19 17 ··· 29 29 #define REG_CTCTRL 0xF7 30 30 #define REG_TSTIMER 0xF8 31 31 32 - /* 33 - * Sysfs stuff 34 - */ 35 - 36 - /* Sensor resolution : 0.5 degree C */ 37 - static ssize_t temp1_input_show(struct device *dev, 38 - struct device_attribute *devattr, char *buf) 32 + static umode_t i5500_is_visible(const void *drvdata, enum hwmon_sensor_types type, u32 attr, 33 + int channel) 39 34 { 40 - struct pci_dev *pdev = to_pci_dev(dev->parent); 41 - long temp; 42 - u16 tsthrhi; 43 - s8 tsfsc; 44 - 45 - pci_read_config_word(pdev, REG_TSTHRHI, &tsthrhi); 46 - pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); 47 - temp = ((long)tsthrhi - tsfsc) * 500; 48 - 49 - return sprintf(buf, "%ld\n", temp); 35 + return 0444; 50 36 } 51 37 52 - static ssize_t thresh_show(struct device *dev, 53 - struct device_attribute *devattr, char *buf) 38 + static int i5500_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, int channel, 39 + long *val) 54 40 { 55 41 struct pci_dev *pdev = to_pci_dev(dev->parent); 56 - int reg = to_sensor_dev_attr(devattr)->index; 57 - long temp; 58 42 u16 tsthr; 59 - 60 - pci_read_config_word(pdev, reg, &tsthr); 61 - temp = tsthr * 500; 62 - 63 - return sprintf(buf, "%ld\n", temp); 64 - } 65 - 66 - static ssize_t alarm_show(struct device *dev, 67 - struct device_attribute *devattr, char *buf) 68 - { 69 - struct pci_dev *pdev = to_pci_dev(dev->parent); 70 - int nr = to_sensor_dev_attr(devattr)->index; 43 + s8 tsfsc; 71 44 u8 ctsts; 72 45 73 - pci_read_config_byte(pdev, REG_CTSTS, &ctsts); 74 - return sprintf(buf, "%u\n", (unsigned int)ctsts & (1 << nr)); 46 + switch (type) { 47 + case hwmon_temp: 48 + switch (attr) { 49 + /* Sensor resolution : 0.5 degree C */ 50 + case hwmon_temp_input: 51 + pci_read_config_word(pdev, REG_TSTHRHI, &tsthr); 52 + pci_read_config_byte(pdev, REG_TSFSC, &tsfsc); 53 + *val = (tsthr - tsfsc) * 500; 54 + return 0; 55 + case hwmon_temp_max: 56 + pci_read_config_word(pdev, REG_TSTHRHI, &tsthr); 57 + *val = tsthr * 500; 58 + return 0; 59 + case hwmon_temp_max_hyst: 60 + pci_read_config_word(pdev, REG_TSTHRLO, &tsthr); 61 + *val = tsthr * 500; 62 + return 0; 63 + case hwmon_temp_crit: 64 + pci_read_config_word(pdev, REG_TSTHRCATA, &tsthr); 65 + *val = tsthr * 500; 66 + return 0; 67 + case hwmon_temp_max_alarm: 68 + pci_read_config_byte(pdev, REG_CTSTS, &ctsts); 69 + *val = !!(ctsts & BIT(1)); 70 + return 0; 71 + case hwmon_temp_crit_alarm: 72 + pci_read_config_byte(pdev, REG_CTSTS, &ctsts); 73 + *val = !!(ctsts & BIT(0)); 74 + return 0; 75 + default: 76 + break; 77 + } 78 + break; 79 + default: 80 + break; 81 + } 82 + 83 + return -EOPNOTSUPP; 75 84 } 76 85 77 - static DEVICE_ATTR_RO(temp1_input); 78 - static SENSOR_DEVICE_ATTR_RO(temp1_crit, thresh, 0xE2); 79 - static SENSOR_DEVICE_ATTR_RO(temp1_max_hyst, thresh, 0xEC); 80 - static SENSOR_DEVICE_ATTR_RO(temp1_max, thresh, 0xEE); 81 - static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 0); 82 - static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, alarm, 1); 86 + static const struct hwmon_ops i5500_ops = { 87 + .is_visible = i5500_is_visible, 88 + .read = i5500_read, 89 + }; 83 90 84 - static struct attribute *i5500_temp_attrs[] = { 85 - &dev_attr_temp1_input.attr, 86 - &sensor_dev_attr_temp1_crit.dev_attr.attr, 87 - &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, 88 - &sensor_dev_attr_temp1_max.dev_attr.attr, 89 - &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr, 90 - &sensor_dev_attr_temp1_max_alarm.dev_attr.attr, 91 + static const struct hwmon_channel_info *i5500_info[] = { 92 + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), 93 + HWMON_CHANNEL_INFO(temp, 94 + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MAX_HYST | HWMON_T_CRIT | 95 + HWMON_T_MAX_ALARM | HWMON_T_CRIT_ALARM 96 + ), 91 97 NULL 92 98 }; 93 99 94 - ATTRIBUTE_GROUPS(i5500_temp); 100 + static const struct hwmon_chip_info i5500_chip_info = { 101 + .ops = &i5500_ops, 102 + .info = i5500_info, 103 + }; 95 104 96 105 static const struct pci_device_id i5500_temp_ids[] = { 97 106 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x3438) }, ··· 130 121 return -ENODEV; 131 122 } 132 123 133 - hwmon_dev = devm_hwmon_device_register_with_groups(&pdev->dev, 134 - "intel5500", NULL, 135 - i5500_temp_groups); 124 + hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev, "intel5500", NULL, 125 + &i5500_chip_info, NULL); 136 126 return PTR_ERR_OR_ZERO(hwmon_dev); 137 127 } 138 128
+1 -1
drivers/hwmon/ibmaem.c
··· 127 127 struct device *hwmon_dev; 128 128 struct platform_device *pdev; 129 129 struct mutex lock; 130 - char valid; 130 + bool valid; 131 131 unsigned long last_updated; /* In jiffies */ 132 132 u8 ver_major; 133 133 u8 ver_minor;
+2 -2
drivers/hwmon/ibmpex.c
··· 66 66 struct device *hwmon_dev; 67 67 struct device *bmc_device; 68 68 struct mutex lock; 69 - char valid; 69 + bool valid; 70 70 unsigned long last_updated; /* In jiffies */ 71 71 72 72 struct ipmi_addr address; ··· 239 239 } 240 240 241 241 data->last_updated = jiffies; 242 - data->valid = 1; 242 + data->valid = true; 243 243 244 244 out: 245 245 mutex_unlock(&data->lock);
+6 -6
drivers/hwmon/it87.c
··· 519 519 unsigned short addr; 520 520 const char *name; 521 521 struct mutex update_lock; 522 - char valid; /* !=0 if following fields are valid */ 522 + bool valid; /* true if following fields are valid */ 523 523 unsigned long last_updated; /* In jiffies */ 524 524 525 525 u16 in_scaled; /* Internal voltage sensors are scaled */ ··· 844 844 data->vid &= 0x3f; 845 845 } 846 846 data->last_updated = jiffies; 847 - data->valid = 1; 847 + data->valid = true; 848 848 } 849 849 850 850 mutex_unlock(&data->update_lock); ··· 980 980 regval |= 0x80; 981 981 it87_write_value(data, IT87_REG_BEEP_ENABLE, regval); 982 982 } 983 - data->valid = 0; 983 + data->valid = false; 984 984 reg = IT87_REG_TEMP_OFFSET[nr]; 985 985 break; 986 986 } ··· 1079 1079 it87_write_value(data, IT87_REG_TEMP_ENABLE, data->sensor); 1080 1080 if (has_temp_old_peci(data, nr)) 1081 1081 it87_write_value(data, IT87_REG_TEMP_EXTRA, data->extra); 1082 - data->valid = 0; /* Force cache refresh */ 1082 + data->valid = false; /* Force cache refresh */ 1083 1083 mutex_unlock(&data->update_lock); 1084 1084 return count; 1085 1085 } ··· 1834 1834 config |= BIT(5); 1835 1835 it87_write_value(data, IT87_REG_CONFIG, config); 1836 1836 /* Invalidate cache to force re-read */ 1837 - data->valid = 0; 1837 + data->valid = false; 1838 1838 } 1839 1839 mutex_unlock(&data->update_lock); 1840 1840 ··· 3229 3229 it87_start_monitoring(data); 3230 3230 3231 3231 /* force update */ 3232 - data->valid = 0; 3232 + data->valid = false; 3233 3233 3234 3234 mutex_unlock(&data->update_lock); 3235 3235
+1 -1
drivers/hwmon/lineage-pem.c
··· 191 191 i2c_smbus_write_byte(client, PEM_CLEAR_INFO_FLAGS); 192 192 193 193 data->last_updated = jiffies; 194 - data->valid = 1; 194 + data->valid = true; 195 195 } 196 196 abort: 197 197 mutex_unlock(&data->update_lock);
+3 -3
drivers/hwmon/lm63.c
··· 139 139 struct i2c_client *client; 140 140 struct mutex update_lock; 141 141 const struct attribute_group *groups[5]; 142 - char valid; /* zero until following fields are valid */ 142 + bool valid; /* false until following fields are valid */ 143 143 char lut_valid; /* zero until lut fields are valid */ 144 144 unsigned long last_updated; /* in jiffies */ 145 145 unsigned long lut_last_updated; /* in jiffies */ ··· 289 289 LM63_REG_ALERT_STATUS) & 0x7F; 290 290 291 291 data->last_updated = jiffies; 292 - data->valid = 1; 292 + data->valid = true; 293 293 } 294 294 295 295 lm63_update_lut(data); ··· 714 714 reg = i2c_smbus_read_byte_data(client, LM96163_REG_TRUTHERM) & ~0x02; 715 715 i2c_smbus_write_byte_data(client, LM96163_REG_TRUTHERM, 716 716 reg | (data->trutherm ? 0x02 : 0x00)); 717 - data->valid = 0; 717 + data->valid = false; 718 718 mutex_unlock(&data->update_lock); 719 719 720 720 return count;
+2 -2
drivers/hwmon/lm77.c
··· 55 55 struct lm77_data { 56 56 struct i2c_client *client; 57 57 struct mutex update_lock; 58 - char valid; 58 + bool valid; 59 59 unsigned long last_updated; /* In jiffies */ 60 60 int temp[t_num_temp]; /* index using temp_index */ 61 61 u8 alarms; ··· 118 118 data->alarms = 119 119 lm77_read_value(client, LM77_REG_TEMP) & 0x0007; 120 120 data->last_updated = jiffies; 121 - data->valid = 1; 121 + data->valid = true; 122 122 } 123 123 124 124 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/lm78.c
··· 117 117 int isa_addr; 118 118 119 119 struct mutex update_lock; 120 - char valid; /* !=0 if following fields are valid */ 120 + bool valid; /* true if following fields are valid */ 121 121 unsigned long last_updated; /* In jiffies */ 122 122 123 123 u8 in[7]; /* Register value */ ··· 772 772 data->alarms = lm78_read_value(data, LM78_REG_ALARM1) + 773 773 (lm78_read_value(data, LM78_REG_ALARM2) << 8); 774 774 data->last_updated = jiffies; 775 - data->valid = 1; 775 + data->valid = true; 776 776 777 777 data->fan_div[2] = 1; 778 778 }
+3 -3
drivers/hwmon/lm80.c
··· 117 117 struct i2c_client *client; 118 118 struct mutex update_lock; 119 119 char error; /* !=0 if error occurred during last update */ 120 - char valid; /* !=0 if following fields are valid */ 120 + bool valid; /* true if following fields are valid */ 121 121 unsigned long last_updated; /* In jiffies */ 122 122 123 123 u8 in[i_num_in][7]; /* Register value, 1st index is enum in_index */ ··· 236 236 data->alarms = prev_rv + (rv << 8); 237 237 238 238 data->last_updated = jiffies; 239 - data->valid = 1; 239 + data->valid = true; 240 240 data->error = 0; 241 241 } 242 242 goto done; 243 243 244 244 abort: 245 245 ret = ERR_PTR(rv); 246 - data->valid = 0; 246 + data->valid = false; 247 247 data->error = 1; 248 248 249 249 done:
+2 -2
drivers/hwmon/lm83.c
··· 105 105 struct i2c_client *client; 106 106 const struct attribute_group *groups[3]; 107 107 struct mutex update_lock; 108 - char valid; /* zero until following fields are valid */ 108 + bool valid; /* false until following fields are valid */ 109 109 unsigned long last_updated; /* in jiffies */ 110 110 111 111 /* registers values */ ··· 137 137 << 8); 138 138 139 139 data->last_updated = jiffies; 140 - data->valid = 1; 140 + data->valid = true; 141 141 } 142 142 143 143 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/lm85.c
··· 294 294 bool has_vid5; /* true if VID5 is configured for ADT7463 or ADT7468 */ 295 295 296 296 struct mutex update_lock; 297 - int valid; /* !=0 if following fields are valid */ 297 + bool valid; /* true if following fields are valid */ 298 298 unsigned long last_reading; /* In jiffies */ 299 299 unsigned long last_config; /* In jiffies */ 300 300 ··· 541 541 data->last_config = jiffies; 542 542 } /* last_config */ 543 543 544 - data->valid = 1; 544 + data->valid = true; 545 545 546 546 mutex_unlock(&data->update_lock); 547 547
+2 -2
drivers/hwmon/lm87.c
··· 141 141 142 142 struct lm87_data { 143 143 struct mutex update_lock; 144 - char valid; /* zero until following fields are valid */ 144 + bool valid; /* false until following fields are valid */ 145 145 unsigned long last_updated; /* In jiffies */ 146 146 147 147 u8 channel; /* register value */ ··· 251 251 data->aout = lm87_read_value(client, LM87_REG_AOUT); 252 252 253 253 data->last_updated = jiffies; 254 - data->valid = 1; 254 + data->valid = true; 255 255 } 256 256 257 257 mutex_unlock(&data->update_lock);
+49 -24
drivers/hwmon/lm90.c
··· 69 69 * This driver also supports the G781 from GMT. This device is compatible 70 70 * with the ADM1032. 71 71 * 72 - * This driver also supports TMP451 from Texas Instruments. This device is 73 - * supported in both compatibility and extended mode. It's mostly compatible 74 - * with ADT7461 except for local temperature low byte register and max 75 - * conversion rate. 72 + * This driver also supports TMP451 and TMP461 from Texas Instruments. 73 + * Those devices are supported in both compatibility and extended mode. 74 + * They are mostly compatible with ADT7461 except for local temperature 75 + * low byte register and max conversion rate. 76 76 * 77 77 * Since the LM90 was the first chipset supported by this driver, most 78 78 * comments will refer to this chipset, but are actually general and ··· 112 112 0x4d, 0x4e, 0x4f, I2C_CLIENT_END }; 113 113 114 114 enum chips { lm90, adm1032, lm99, lm86, max6657, max6659, adt7461, max6680, 115 - max6646, w83l771, max6696, sa56004, g781, tmp451, max6654 }; 115 + max6646, w83l771, max6696, sa56004, g781, tmp451, tmp461, max6654 }; 116 116 117 117 /* 118 118 * The LM90 registers ··· 168 168 169 169 #define LM90_MAX_CONVRATE_MS 16000 /* Maximum conversion rate in ms */ 170 170 171 - /* TMP451 registers */ 171 + /* TMP451/TMP461 registers */ 172 172 #define TMP451_REG_R_LOCAL_TEMPL 0x15 173 + #define TMP451_REG_CONALERT 0x22 174 + 175 + #define TMP461_REG_CHEN 0x16 176 + #define TMP461_REG_DFC 0x24 173 177 174 178 /* 175 179 * Device flags ··· 186 182 #define LM90_HAVE_EMERGENCY_ALARM (1 << 5)/* emergency alarm */ 187 183 #define LM90_HAVE_TEMP3 (1 << 6) /* 3rd temperature sensor */ 188 184 #define LM90_HAVE_BROKEN_ALERT (1 << 7) /* Broken alert */ 189 - #define LM90_PAUSE_FOR_CONFIG (1 << 8) /* Pause conversion for config */ 185 + #define LM90_HAVE_EXTENDED_TEMP (1 << 8) /* extended temperature support*/ 186 + #define LM90_PAUSE_FOR_CONFIG (1 << 9) /* Pause conversion for config */ 190 187 191 188 /* LM90 status */ 192 189 #define LM90_STATUS_LTHRM (1 << 0) /* local THERM limit tripped */ ··· 234 229 { "w83l771", w83l771 }, 235 230 { "sa56004", sa56004 }, 236 231 { "tmp451", tmp451 }, 232 + { "tmp461", tmp461 }, 237 233 { } 238 234 }; 239 235 MODULE_DEVICE_TABLE(i2c, lm90_id); ··· 332 326 .compatible = "ti,tmp451", 333 327 .data = (void *)tmp451 334 328 }, 329 + { 330 + .compatible = "ti,tmp461", 331 + .data = (void *)tmp461 332 + }, 335 333 { }, 336 334 }; 337 335 MODULE_DEVICE_TABLE(of, lm90_of_match); ··· 360 350 }, 361 351 [adt7461] = { 362 352 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 363 - | LM90_HAVE_BROKEN_ALERT, 353 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 364 354 .alert_alarms = 0x7c, 365 355 .max_convrate = 10, 366 356 }, ··· 432 422 }, 433 423 [tmp451] = { 434 424 .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 435 - | LM90_HAVE_BROKEN_ALERT, 425 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 426 + .alert_alarms = 0x7c, 427 + .max_convrate = 9, 428 + .reg_local_ext = TMP451_REG_R_LOCAL_TEMPL, 429 + }, 430 + [tmp461] = { 431 + .flags = LM90_HAVE_OFFSET | LM90_HAVE_REM_LIMIT_EXT 432 + | LM90_HAVE_BROKEN_ALERT | LM90_HAVE_EXTENDED_TEMP, 436 433 .alert_alarms = 0x7c, 437 434 .max_convrate = 9, 438 435 .reg_local_ext = TMP451_REG_R_LOCAL_TEMPL, ··· 1015 998 s16 temp11 = data->temp11[index]; 1016 999 int temp; 1017 1000 1018 - if (data->kind == adt7461 || data->kind == tmp451) 1001 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1019 1002 temp = temp_from_u16_adt7461(data, temp11); 1020 1003 else if (data->kind == max6646) 1021 1004 temp = temp_from_u16(temp11); ··· 1052 1035 val -= 16000; 1053 1036 } 1054 1037 1055 - if (data->kind == adt7461 || data->kind == tmp451) 1038 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1056 1039 data->temp11[index] = temp_to_u16_adt7461(data, val); 1057 1040 else if (data->kind == max6646) 1058 1041 data->temp11[index] = temp_to_u8(val) << 8; ··· 1079 1062 s8 temp8 = data->temp8[index]; 1080 1063 int temp; 1081 1064 1082 - if (data->kind == adt7461 || data->kind == tmp451) 1065 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1083 1066 temp = temp_from_u8_adt7461(data, temp8); 1084 1067 else if (data->kind == max6646) 1085 1068 temp = temp_from_u8(temp8); ··· 1115 1098 val -= 16000; 1116 1099 } 1117 1100 1118 - if (data->kind == adt7461 || data->kind == tmp451) 1101 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1119 1102 data->temp8[index] = temp_to_u8_adt7461(data, val); 1120 1103 else if (data->kind == max6646) 1121 1104 data->temp8[index] = temp_to_u8(val); ··· 1133 1116 { 1134 1117 int temp; 1135 1118 1136 - if (data->kind == adt7461 || data->kind == tmp451) 1119 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1137 1120 temp = temp_from_u8_adt7461(data, data->temp8[index]); 1138 1121 else if (data->kind == max6646) 1139 1122 temp = temp_from_u8(data->temp8[index]); ··· 1153 1136 int temp; 1154 1137 int err; 1155 1138 1156 - if (data->kind == adt7461 || data->kind == tmp451) 1139 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) 1157 1140 temp = temp_from_u8_adt7461(data, data->temp8[LOCAL_CRIT]); 1158 1141 else if (data->kind == max6646) 1159 1142 temp = temp_from_u8(data->temp8[LOCAL_CRIT]); ··· 1644 1627 && convrate <= 0x08) 1645 1628 name = "g781"; 1646 1629 } else 1647 - if (address == 0x4C 1648 - && man_id == 0x55) { /* Texas Instruments */ 1649 - int local_ext; 1630 + if (man_id == 0x55 && chip_id == 0x00 && 1631 + (config1 & 0x1B) == 0x00 && convrate <= 0x09) { 1632 + int local_ext, conalert, chen, dfc; 1650 1633 1651 1634 local_ext = i2c_smbus_read_byte_data(client, 1652 1635 TMP451_REG_R_LOCAL_TEMPL); 1636 + conalert = i2c_smbus_read_byte_data(client, 1637 + TMP451_REG_CONALERT); 1638 + chen = i2c_smbus_read_byte_data(client, TMP461_REG_CHEN); 1639 + dfc = i2c_smbus_read_byte_data(client, TMP461_REG_DFC); 1653 1640 1654 - if (chip_id == 0x00 /* TMP451 */ 1655 - && (config1 & 0x1B) == 0x00 1656 - && convrate <= 0x09 1657 - && (local_ext & 0x0F) == 0x00) 1658 - name = "tmp451"; 1641 + if ((local_ext & 0x0F) == 0x00 && 1642 + (conalert & 0xf1) == 0x01 && 1643 + (chen & 0xfc) == 0x00 && 1644 + (dfc & 0xfc) == 0x00) { 1645 + if (address == 0x4c && !(chen & 0x03)) 1646 + name = "tmp451"; 1647 + else if (address >= 0x48 && address <= 0x4f) 1648 + name = "tmp461"; 1649 + } 1659 1650 } 1660 1651 1661 1652 if (!name) { /* identification failed */ ··· 1710 1685 lm90_set_convrate(client, data, 500); /* 500ms; 2Hz conversion rate */ 1711 1686 1712 1687 /* Check Temperature Range Select */ 1713 - if (data->kind == adt7461 || data->kind == tmp451) { 1688 + if (data->flags & LM90_HAVE_EXTENDED_TEMP) { 1714 1689 if (config & 0x04) 1715 1690 data->flags |= LM90_FLAG_ADT7461_EXT; 1716 1691 }
+2 -2
drivers/hwmon/lm92.c
··· 99 99 struct lm92_data { 100 100 struct i2c_client *client; 101 101 struct mutex update_lock; 102 - char valid; /* zero until following fields are valid */ 102 + bool valid; /* false until following fields are valid */ 103 103 unsigned long last_updated; /* in jiffies */ 104 104 105 105 /* registers values */ ··· 126 126 i2c_smbus_read_word_swapped(client, regs[i]); 127 127 } 128 128 data->last_updated = jiffies; 129 - data->valid = 1; 129 + data->valid = true; 130 130 } 131 131 132 132 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/lm93.c
··· 202 202 /* client update function */ 203 203 void (*update)(struct lm93_data *, struct i2c_client *); 204 204 205 - char valid; /* !=0 if following fields are valid */ 205 + bool valid; /* true if following fields are valid */ 206 206 207 207 /* register values, arranged by block read groups */ 208 208 struct block1_t block1; ··· 917 917 918 918 data->update(data, client); 919 919 data->last_updated = jiffies; 920 - data->valid = 1; 920 + data->valid = true; 921 921 } 922 922 923 923 mutex_unlock(&data->update_lock);
+4 -4
drivers/hwmon/lm95241.c
··· 78 78 struct mutex update_lock; 79 79 unsigned long last_updated; /* in jiffies */ 80 80 unsigned long interval; /* in milli-seconds */ 81 - char valid; /* zero until following fields are valid */ 81 + bool valid; /* false until following fields are valid */ 82 82 /* registers values */ 83 83 u8 temp[ARRAY_SIZE(lm95241_reg_address)]; 84 84 u8 status, config, model, trutherm; ··· 118 118 data->status = i2c_smbus_read_byte_data(client, 119 119 LM95241_REG_R_STATUS); 120 120 data->last_updated = jiffies; 121 - data->valid = 1; 121 + data->valid = true; 122 122 } 123 123 124 124 mutex_unlock(&data->update_lock); ··· 257 257 else 258 258 data->config &= ~R2DF_MASK; 259 259 } 260 - data->valid = 0; 260 + data->valid = false; 261 261 ret = i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, 262 262 data->config); 263 263 break; ··· 273 273 else 274 274 data->config &= ~R2DF_MASK; 275 275 } 276 - data->valid = 0; 276 + data->valid = false; 277 277 ret = i2c_smbus_write_byte_data(client, LM95241_REG_RW_CONFIG, 278 278 data->config); 279 279 break;
+1 -1
drivers/hwmon/ltc4151.c
··· 77 77 data->regs[i] = val; 78 78 } 79 79 data->last_updated = jiffies; 80 - data->valid = 1; 80 + data->valid = true; 81 81 } 82 82 abort: 83 83 mutex_unlock(&data->update_lock);
+1 -1
drivers/hwmon/ltc4215.c
··· 64 64 } 65 65 66 66 data->last_updated = jiffies; 67 - data->valid = 1; 67 + data->valid = true; 68 68 } 69 69 70 70 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/ltc4261.c
··· 73 73 "Failed to read ADC value: error %d\n", 74 74 val); 75 75 ret = ERR_PTR(val); 76 - data->valid = 0; 76 + data->valid = false; 77 77 goto abort; 78 78 } 79 79 data->regs[i] = val; 80 80 } 81 81 data->last_updated = jiffies; 82 - data->valid = 1; 82 + data->valid = true; 83 83 } 84 84 abort: 85 85 mutex_unlock(&data->update_lock);
+1 -1
drivers/hwmon/max16065.c
··· 166 166 = i2c_smbus_read_byte_data(client, MAX16065_FAULT(i)); 167 167 168 168 data->last_updated = jiffies; 169 - data->valid = 1; 169 + data->valid = true; 170 170 } 171 171 mutex_unlock(&data->update_lock); 172 172 return data;
+2 -2
drivers/hwmon/max1619.c
··· 79 79 struct max1619_data { 80 80 struct i2c_client *client; 81 81 struct mutex update_lock; 82 - char valid; /* zero until following fields are valid */ 82 + bool valid; /* false until following fields are valid */ 83 83 unsigned long last_updated; /* in jiffies */ 84 84 85 85 /* registers values */ ··· 124 124 data->alarms ^= 0x02; 125 125 126 126 data->last_updated = jiffies; 127 - data->valid = 1; 127 + data->valid = true; 128 128 } 129 129 130 130 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/max1668.c
··· 58 58 enum chips type; 59 59 60 60 struct mutex update_lock; 61 - char valid; /* !=0 if following fields are valid */ 61 + bool valid; /* true if following fields are valid */ 62 62 unsigned long last_updated; /* In jiffies */ 63 63 64 64 /* 1x local and 4x remote */ ··· 120 120 data->alarms |= val; 121 121 122 122 data->last_updated = jiffies; 123 - data->valid = 1; 123 + data->valid = true; 124 124 abort: 125 125 mutex_unlock(&data->update_lock); 126 126
+7 -1
drivers/hwmon/max31722.c
··· 103 103 static int max31722_remove(struct spi_device *spi) 104 104 { 105 105 struct max31722_data *data = spi_get_drvdata(spi); 106 + int ret; 106 107 107 108 hwmon_device_unregister(data->hwmon_dev); 108 109 109 - return max31722_set_mode(data, MAX31722_MODE_STANDBY); 110 + ret = max31722_set_mode(data, MAX31722_MODE_STANDBY); 111 + if (ret) 112 + /* There is nothing we can do about this ... */ 113 + dev_warn(&spi->dev, "Failed to put device in stand-by mode\n"); 114 + 115 + return 0; 110 116 } 111 117 112 118 static int __maybe_unused max31722_suspend(struct device *dev)
+514
drivers/hwmon/max6620.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-or-later 2 + /* 3 + * Hardware monitoring driver for Maxim MAX6620 4 + * 5 + * Originally from L. Grunenberg. 6 + * (C) 2012 by L. Grunenberg <contact@lgrunenberg.de> 7 + * 8 + * Copyright (c) 2021 Dell Inc. or its subsidiaries. All Rights Reserved. 9 + * 10 + * based on code written by : 11 + * 2007 by Hans J. Koch <hjk@hansjkoch.de> 12 + * John Morris <john.morris@spirentcom.com> 13 + * Copyright (c) 2003 Spirent Communications 14 + * and Claus Gindhart <claus.gindhart@kontron.com> 15 + * 16 + * This module has only been tested with the MAX6620 chip. 17 + * 18 + * The datasheet was last seen at: 19 + * 20 + * http://pdfserv.maxim-ic.com/en/ds/MAX6620.pdf 21 + * 22 + */ 23 + 24 + #include <linux/bits.h> 25 + #include <linux/err.h> 26 + #include <linux/hwmon.h> 27 + #include <linux/i2c.h> 28 + #include <linux/init.h> 29 + #include <linux/jiffies.h> 30 + #include <linux/module.h> 31 + #include <linux/slab.h> 32 + 33 + /* 34 + * MAX 6620 registers 35 + */ 36 + 37 + #define MAX6620_REG_CONFIG 0x00 38 + #define MAX6620_REG_FAULT 0x01 39 + #define MAX6620_REG_CONF_FAN0 0x02 40 + #define MAX6620_REG_CONF_FAN1 0x03 41 + #define MAX6620_REG_CONF_FAN2 0x04 42 + #define MAX6620_REG_CONF_FAN3 0x05 43 + #define MAX6620_REG_DYN_FAN0 0x06 44 + #define MAX6620_REG_DYN_FAN1 0x07 45 + #define MAX6620_REG_DYN_FAN2 0x08 46 + #define MAX6620_REG_DYN_FAN3 0x09 47 + #define MAX6620_REG_TACH0 0x10 48 + #define MAX6620_REG_TACH1 0x12 49 + #define MAX6620_REG_TACH2 0x14 50 + #define MAX6620_REG_TACH3 0x16 51 + #define MAX6620_REG_VOLT0 0x18 52 + #define MAX6620_REG_VOLT1 0x1A 53 + #define MAX6620_REG_VOLT2 0x1C 54 + #define MAX6620_REG_VOLT3 0x1E 55 + #define MAX6620_REG_TAR0 0x20 56 + #define MAX6620_REG_TAR1 0x22 57 + #define MAX6620_REG_TAR2 0x24 58 + #define MAX6620_REG_TAR3 0x26 59 + #define MAX6620_REG_DAC0 0x28 60 + #define MAX6620_REG_DAC1 0x2A 61 + #define MAX6620_REG_DAC2 0x2C 62 + #define MAX6620_REG_DAC3 0x2E 63 + 64 + /* 65 + * Config register bits 66 + */ 67 + 68 + #define MAX6620_CFG_RUN BIT(7) 69 + #define MAX6620_CFG_POR BIT(6) 70 + #define MAX6620_CFG_TIMEOUT BIT(5) 71 + #define MAX6620_CFG_FULLFAN BIT(4) 72 + #define MAX6620_CFG_OSC BIT(3) 73 + #define MAX6620_CFG_WD_MASK (BIT(2) | BIT(1)) 74 + #define MAX6620_CFG_WD_2 BIT(1) 75 + #define MAX6620_CFG_WD_6 BIT(2) 76 + #define MAX6620_CFG_WD10 (BIT(2) | BIT(1)) 77 + #define MAX6620_CFG_WD BIT(0) 78 + 79 + /* 80 + * Failure status register bits 81 + */ 82 + 83 + #define MAX6620_FAIL_TACH0 BIT(4) 84 + #define MAX6620_FAIL_TACH1 BIT(5) 85 + #define MAX6620_FAIL_TACH2 BIT(6) 86 + #define MAX6620_FAIL_TACH3 BIT(7) 87 + #define MAX6620_FAIL_MASK0 BIT(0) 88 + #define MAX6620_FAIL_MASK1 BIT(1) 89 + #define MAX6620_FAIL_MASK2 BIT(2) 90 + #define MAX6620_FAIL_MASK3 BIT(3) 91 + 92 + #define MAX6620_CLOCK_FREQ 8192 /* Clock frequency in Hz */ 93 + #define MAX6620_PULSE_PER_REV 2 /* Tachometer pulses per revolution */ 94 + 95 + /* Minimum and maximum values of the FAN-RPM */ 96 + #define FAN_RPM_MIN 240 97 + #define FAN_RPM_MAX 30000 98 + 99 + static const u8 config_reg[] = { 100 + MAX6620_REG_CONF_FAN0, 101 + MAX6620_REG_CONF_FAN1, 102 + MAX6620_REG_CONF_FAN2, 103 + MAX6620_REG_CONF_FAN3, 104 + }; 105 + 106 + static const u8 dyn_reg[] = { 107 + MAX6620_REG_DYN_FAN0, 108 + MAX6620_REG_DYN_FAN1, 109 + MAX6620_REG_DYN_FAN2, 110 + MAX6620_REG_DYN_FAN3, 111 + }; 112 + 113 + static const u8 tach_reg[] = { 114 + MAX6620_REG_TACH0, 115 + MAX6620_REG_TACH1, 116 + MAX6620_REG_TACH2, 117 + MAX6620_REG_TACH3, 118 + }; 119 + 120 + static const u8 target_reg[] = { 121 + MAX6620_REG_TAR0, 122 + MAX6620_REG_TAR1, 123 + MAX6620_REG_TAR2, 124 + MAX6620_REG_TAR3, 125 + }; 126 + 127 + /* 128 + * Client data (each client gets its own) 129 + */ 130 + 131 + struct max6620_data { 132 + struct i2c_client *client; 133 + struct mutex update_lock; 134 + bool valid; /* false until following fields are valid */ 135 + unsigned long last_updated; /* in jiffies */ 136 + 137 + /* register values */ 138 + u8 fancfg[4]; 139 + u8 fandyn[4]; 140 + u8 fault; 141 + u16 tach[4]; 142 + u16 target[4]; 143 + }; 144 + 145 + static u8 max6620_fan_div_from_reg(u8 val) 146 + { 147 + return BIT((val & 0xE0) >> 5); 148 + } 149 + 150 + static u16 max6620_fan_rpm_to_tach(u8 div, int rpm) 151 + { 152 + return (60 * div * MAX6620_CLOCK_FREQ) / (rpm * MAX6620_PULSE_PER_REV); 153 + } 154 + 155 + static int max6620_fan_tach_to_rpm(u8 div, u16 tach) 156 + { 157 + return (60 * div * MAX6620_CLOCK_FREQ) / (tach * MAX6620_PULSE_PER_REV); 158 + } 159 + 160 + static int max6620_update_device(struct device *dev) 161 + { 162 + struct max6620_data *data = dev_get_drvdata(dev); 163 + struct i2c_client *client = data->client; 164 + int i; 165 + int ret = 0; 166 + 167 + mutex_lock(&data->update_lock); 168 + 169 + if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { 170 + for (i = 0; i < 4; i++) { 171 + ret = i2c_smbus_read_byte_data(client, config_reg[i]); 172 + if (ret < 0) 173 + goto error; 174 + data->fancfg[i] = ret; 175 + 176 + ret = i2c_smbus_read_byte_data(client, dyn_reg[i]); 177 + if (ret < 0) 178 + goto error; 179 + data->fandyn[i] = ret; 180 + 181 + ret = i2c_smbus_read_byte_data(client, tach_reg[i]); 182 + if (ret < 0) 183 + goto error; 184 + data->tach[i] = (ret << 3) & 0x7f8; 185 + ret = i2c_smbus_read_byte_data(client, tach_reg[i] + 1); 186 + if (ret < 0) 187 + goto error; 188 + data->tach[i] |= (ret >> 5) & 0x7; 189 + 190 + ret = i2c_smbus_read_byte_data(client, target_reg[i]); 191 + if (ret < 0) 192 + goto error; 193 + data->target[i] = (ret << 3) & 0x7f8; 194 + ret = i2c_smbus_read_byte_data(client, target_reg[i] + 1); 195 + if (ret < 0) 196 + goto error; 197 + data->target[i] |= (ret >> 5) & 0x7; 198 + } 199 + 200 + /* 201 + * Alarms are cleared on read in case the condition that 202 + * caused the alarm is removed. Keep the value latched here 203 + * for providing the register through different alarm files. 204 + */ 205 + ret = i2c_smbus_read_byte_data(client, MAX6620_REG_FAULT); 206 + if (ret < 0) 207 + goto error; 208 + data->fault |= (ret >> 4) & (ret & 0x0F); 209 + 210 + data->last_updated = jiffies; 211 + data->valid = true; 212 + } 213 + 214 + error: 215 + mutex_unlock(&data->update_lock); 216 + return ret; 217 + } 218 + 219 + static umode_t 220 + max6620_is_visible(const void *data, enum hwmon_sensor_types type, u32 attr, 221 + int channel) 222 + { 223 + switch (type) { 224 + case hwmon_fan: 225 + switch (attr) { 226 + case hwmon_fan_alarm: 227 + case hwmon_fan_input: 228 + return 0444; 229 + case hwmon_fan_div: 230 + case hwmon_fan_target: 231 + return 0644; 232 + default: 233 + break; 234 + } 235 + break; 236 + default: 237 + break; 238 + } 239 + 240 + return 0; 241 + } 242 + 243 + static int 244 + max6620_read(struct device *dev, enum hwmon_sensor_types type, u32 attr, 245 + int channel, long *val) 246 + { 247 + struct max6620_data *data; 248 + struct i2c_client *client; 249 + int ret; 250 + u8 div; 251 + u8 val1; 252 + u8 val2; 253 + 254 + ret = max6620_update_device(dev); 255 + if (ret < 0) 256 + return ret; 257 + data = dev_get_drvdata(dev); 258 + client = data->client; 259 + 260 + switch (type) { 261 + case hwmon_fan: 262 + switch (attr) { 263 + case hwmon_fan_alarm: 264 + mutex_lock(&data->update_lock); 265 + *val = !!(data->fault & BIT(channel)); 266 + 267 + /* Setting TACH count to re-enable fan fault detection */ 268 + if (*val == 1) { 269 + val1 = (data->target[channel] >> 3) & 0xff; 270 + val2 = (data->target[channel] << 5) & 0xe0; 271 + ret = i2c_smbus_write_byte_data(client, 272 + target_reg[channel], val1); 273 + if (ret < 0) { 274 + mutex_unlock(&data->update_lock); 275 + return ret; 276 + } 277 + ret = i2c_smbus_write_byte_data(client, 278 + target_reg[channel] + 1, val2); 279 + if (ret < 0) { 280 + mutex_unlock(&data->update_lock); 281 + return ret; 282 + } 283 + 284 + data->fault &= ~BIT(channel); 285 + } 286 + mutex_unlock(&data->update_lock); 287 + 288 + break; 289 + case hwmon_fan_div: 290 + *val = max6620_fan_div_from_reg(data->fandyn[channel]); 291 + break; 292 + case hwmon_fan_input: 293 + if (data->tach[channel] == 0) { 294 + *val = 0; 295 + } else { 296 + div = max6620_fan_div_from_reg(data->fandyn[channel]); 297 + *val = max6620_fan_tach_to_rpm(div, data->tach[channel]); 298 + } 299 + break; 300 + case hwmon_fan_target: 301 + if (data->target[channel] == 0) { 302 + *val = 0; 303 + } else { 304 + div = max6620_fan_div_from_reg(data->fandyn[channel]); 305 + *val = max6620_fan_tach_to_rpm(div, data->target[channel]); 306 + } 307 + break; 308 + default: 309 + return -EOPNOTSUPP; 310 + } 311 + break; 312 + 313 + default: 314 + return -EOPNOTSUPP; 315 + } 316 + 317 + return 0; 318 + } 319 + 320 + static int 321 + max6620_write(struct device *dev, enum hwmon_sensor_types type, u32 attr, 322 + int channel, long val) 323 + { 324 + struct max6620_data *data; 325 + struct i2c_client *client; 326 + int ret; 327 + u8 div; 328 + u16 tach; 329 + u8 val1; 330 + u8 val2; 331 + 332 + ret = max6620_update_device(dev); 333 + if (ret < 0) 334 + return ret; 335 + data = dev_get_drvdata(dev); 336 + client = data->client; 337 + mutex_lock(&data->update_lock); 338 + 339 + switch (type) { 340 + case hwmon_fan: 341 + switch (attr) { 342 + case hwmon_fan_div: 343 + switch (val) { 344 + case 1: 345 + div = 0; 346 + break; 347 + case 2: 348 + div = 1; 349 + break; 350 + case 4: 351 + div = 2; 352 + break; 353 + case 8: 354 + div = 3; 355 + break; 356 + case 16: 357 + div = 4; 358 + break; 359 + case 32: 360 + div = 5; 361 + break; 362 + default: 363 + ret = -EINVAL; 364 + goto error; 365 + } 366 + data->fandyn[channel] &= 0x1F; 367 + data->fandyn[channel] |= div << 5; 368 + ret = i2c_smbus_write_byte_data(client, dyn_reg[channel], 369 + data->fandyn[channel]); 370 + break; 371 + case hwmon_fan_target: 372 + val = clamp_val(val, FAN_RPM_MIN, FAN_RPM_MAX); 373 + div = max6620_fan_div_from_reg(data->fandyn[channel]); 374 + tach = max6620_fan_rpm_to_tach(div, val); 375 + val1 = (tach >> 3) & 0xff; 376 + val2 = (tach << 5) & 0xe0; 377 + ret = i2c_smbus_write_byte_data(client, target_reg[channel], val1); 378 + if (ret < 0) 379 + break; 380 + ret = i2c_smbus_write_byte_data(client, target_reg[channel] + 1, val2); 381 + if (ret < 0) 382 + break; 383 + 384 + /* Setting TACH count re-enables fan fault detection */ 385 + data->fault &= ~BIT(channel); 386 + 387 + break; 388 + default: 389 + ret = -EOPNOTSUPP; 390 + break; 391 + } 392 + break; 393 + 394 + default: 395 + ret = -EOPNOTSUPP; 396 + break; 397 + } 398 + 399 + error: 400 + mutex_unlock(&data->update_lock); 401 + return ret; 402 + } 403 + 404 + static const struct hwmon_channel_info *max6620_info[] = { 405 + HWMON_CHANNEL_INFO(fan, 406 + HWMON_F_INPUT | HWMON_F_DIV | HWMON_F_TARGET | HWMON_F_ALARM, 407 + HWMON_F_INPUT | HWMON_F_DIV | HWMON_F_TARGET | HWMON_F_ALARM, 408 + HWMON_F_INPUT | HWMON_F_DIV | HWMON_F_TARGET | HWMON_F_ALARM, 409 + HWMON_F_INPUT | HWMON_F_DIV | HWMON_F_TARGET | HWMON_F_ALARM), 410 + NULL 411 + }; 412 + 413 + static const struct hwmon_ops max6620_hwmon_ops = { 414 + .read = max6620_read, 415 + .write = max6620_write, 416 + .is_visible = max6620_is_visible, 417 + }; 418 + 419 + static const struct hwmon_chip_info max6620_chip_info = { 420 + .ops = &max6620_hwmon_ops, 421 + .info = max6620_info, 422 + }; 423 + 424 + static int max6620_init_client(struct max6620_data *data) 425 + { 426 + struct i2c_client *client = data->client; 427 + int config; 428 + int err; 429 + int i; 430 + int reg; 431 + 432 + config = i2c_smbus_read_byte_data(client, MAX6620_REG_CONFIG); 433 + if (config < 0) { 434 + dev_err(&client->dev, "Error reading config, aborting.\n"); 435 + return config; 436 + } 437 + 438 + /* 439 + * Set bit 4, disable other fans from going full speed on a fail 440 + * failure. 441 + */ 442 + err = i2c_smbus_write_byte_data(client, MAX6620_REG_CONFIG, config | 0x10); 443 + if (err < 0) { 444 + dev_err(&client->dev, "Config write error, aborting.\n"); 445 + return err; 446 + } 447 + 448 + for (i = 0; i < 4; i++) { 449 + reg = i2c_smbus_read_byte_data(client, config_reg[i]); 450 + if (reg < 0) 451 + return reg; 452 + data->fancfg[i] = reg; 453 + 454 + /* Enable RPM mode */ 455 + data->fancfg[i] |= 0xa8; 456 + err = i2c_smbus_write_byte_data(client, config_reg[i], data->fancfg[i]); 457 + if (err < 0) 458 + return err; 459 + 460 + /* 2 counts (001) and Rate change 100 (0.125 secs) */ 461 + data->fandyn[i] = 0x30; 462 + err = i2c_smbus_write_byte_data(client, dyn_reg[i], data->fandyn[i]); 463 + if (err < 0) 464 + return err; 465 + } 466 + return 0; 467 + } 468 + 469 + static int max6620_probe(struct i2c_client *client) 470 + { 471 + struct device *dev = &client->dev; 472 + struct max6620_data *data; 473 + struct device *hwmon_dev; 474 + int err; 475 + 476 + data = devm_kzalloc(dev, sizeof(struct max6620_data), GFP_KERNEL); 477 + if (!data) 478 + return -ENOMEM; 479 + 480 + data->client = client; 481 + mutex_init(&data->update_lock); 482 + 483 + err = max6620_init_client(data); 484 + if (err) 485 + return err; 486 + 487 + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, 488 + data, 489 + &max6620_chip_info, 490 + NULL); 491 + 492 + return PTR_ERR_OR_ZERO(hwmon_dev); 493 + } 494 + 495 + static const struct i2c_device_id max6620_id[] = { 496 + { "max6620", 0 }, 497 + { } 498 + }; 499 + MODULE_DEVICE_TABLE(i2c, max6620_id); 500 + 501 + static struct i2c_driver max6620_driver = { 502 + .class = I2C_CLASS_HWMON, 503 + .driver = { 504 + .name = "max6620", 505 + }, 506 + .probe_new = max6620_probe, 507 + .id_table = max6620_id, 508 + }; 509 + 510 + module_i2c_driver(max6620_driver); 511 + 512 + MODULE_AUTHOR("Lucas Grunenberg"); 513 + MODULE_DESCRIPTION("MAX6620 sensor driver"); 514 + MODULE_LICENSE("GPL");
+2 -2
drivers/hwmon/max6639.c
··· 69 69 struct max6639_data { 70 70 struct i2c_client *client; 71 71 struct mutex update_lock; 72 - char valid; /* !=0 if following fields are valid */ 72 + bool valid; /* true if following fields are valid */ 73 73 unsigned long last_updated; /* In jiffies */ 74 74 75 75 /* Register values sampled regularly */ ··· 141 141 } 142 142 143 143 data->last_updated = jiffies; 144 - data->valid = 1; 144 + data->valid = true; 145 145 } 146 146 abort: 147 147 mutex_unlock(&data->update_lock);
+1 -1
drivers/hwmon/max6642.c
··· 181 181 MAX6642_REG_R_STATUS); 182 182 183 183 data->last_updated = jiffies; 184 - data->valid = 1; 184 + data->valid = true; 185 185 } 186 186 187 187 mutex_unlock(&data->update_lock);
+102 -36
drivers/hwmon/mlxreg-fan.c
··· 12 12 #include <linux/regmap.h> 13 13 #include <linux/thermal.h> 14 14 15 - #define MLXREG_FAN_MAX_TACHO 12 15 + #define MLXREG_FAN_MAX_TACHO 14 16 + #define MLXREG_FAN_MAX_PWM 4 17 + #define MLXREG_FAN_PWM_NOT_CONNECTED 0xff 16 18 #define MLXREG_FAN_MAX_STATE 10 17 19 #define MLXREG_FAN_MIN_DUTY 51 /* 20% */ 18 20 #define MLXREG_FAN_MAX_DUTY 255 /* 100% */ ··· 63 61 MLXREG_FAN_MAX_DUTY, \ 64 62 MLXREG_FAN_MAX_STATE)) 65 63 64 + struct mlxreg_fan; 65 + 66 66 /* 67 67 * struct mlxreg_fan_tacho - tachometer data (internal use): 68 68 * ··· 83 79 /* 84 80 * struct mlxreg_fan_pwm - PWM data (internal use): 85 81 * 82 + * @fan: private data; 86 83 * @connected: indicates if PWM is connected; 87 84 * @reg: register offset; 85 + * @cooling: cooling device levels; 86 + * @cdev: cooling device; 88 87 */ 89 88 struct mlxreg_fan_pwm { 89 + struct mlxreg_fan *fan; 90 90 bool connected; 91 91 u32 reg; 92 + u8 cooling_levels[MLXREG_FAN_MAX_STATE + 1]; 93 + struct thermal_cooling_device *cdev; 92 94 }; 93 95 94 96 /* ··· 107 97 * @tachos_per_drwr - number of tachometers per drawer; 108 98 * @samples: minimum allowed samples per pulse; 109 99 * @divider: divider value for tachometer RPM calculation; 110 - * @cooling: cooling device levels; 111 - * @cdev: cooling device; 112 100 */ 113 101 struct mlxreg_fan { 114 102 struct device *dev; 115 103 void *regmap; 116 104 struct mlxreg_core_platform_data *pdata; 117 105 struct mlxreg_fan_tacho tacho[MLXREG_FAN_MAX_TACHO]; 118 - struct mlxreg_fan_pwm pwm; 106 + struct mlxreg_fan_pwm pwm[MLXREG_FAN_MAX_PWM]; 119 107 int tachos_per_drwr; 120 108 int samples; 121 109 int divider; 122 - u8 cooling_levels[MLXREG_FAN_MAX_STATE + 1]; 123 - struct thermal_cooling_device *cdev; 124 110 }; 125 111 126 112 static int ··· 125 119 { 126 120 struct mlxreg_fan *fan = dev_get_drvdata(dev); 127 121 struct mlxreg_fan_tacho *tacho; 122 + struct mlxreg_fan_pwm *pwm; 128 123 u32 regval; 129 124 int err; 130 125 ··· 176 169 break; 177 170 178 171 case hwmon_pwm: 172 + pwm = &fan->pwm[channel]; 179 173 switch (attr) { 180 174 case hwmon_pwm_input: 181 - err = regmap_read(fan->regmap, fan->pwm.reg, &regval); 175 + err = regmap_read(fan->regmap, pwm->reg, &regval); 182 176 if (err) 183 177 return err; 184 178 ··· 203 195 int channel, long val) 204 196 { 205 197 struct mlxreg_fan *fan = dev_get_drvdata(dev); 198 + struct mlxreg_fan_pwm *pwm; 206 199 207 200 switch (type) { 208 201 case hwmon_pwm: ··· 212 203 if (val < MLXREG_FAN_MIN_DUTY || 213 204 val > MLXREG_FAN_MAX_DUTY) 214 205 return -EINVAL; 215 - return regmap_write(fan->regmap, fan->pwm.reg, val); 206 + pwm = &fan->pwm[channel]; 207 + return regmap_write(fan->regmap, pwm->reg, val); 216 208 default: 217 209 return -EOPNOTSUPP; 218 210 } ··· 245 235 break; 246 236 247 237 case hwmon_pwm: 248 - if (!(((struct mlxreg_fan *)data)->pwm.connected)) 238 + if (!(((struct mlxreg_fan *)data)->pwm[channel].connected)) 249 239 return 0; 250 240 251 241 switch (attr) { ··· 263 253 return 0; 264 254 } 265 255 256 + static char *mlxreg_fan_name[] = { 257 + "mlxreg_fan", 258 + "mlxreg_fan1", 259 + "mlxreg_fan2", 260 + "mlxreg_fan3", 261 + }; 262 + 266 263 static const struct hwmon_channel_info *mlxreg_fan_hwmon_info[] = { 267 264 HWMON_CHANNEL_INFO(fan, 268 265 HWMON_F_INPUT | HWMON_F_FAULT, ··· 283 266 HWMON_F_INPUT | HWMON_F_FAULT, 284 267 HWMON_F_INPUT | HWMON_F_FAULT, 285 268 HWMON_F_INPUT | HWMON_F_FAULT, 269 + HWMON_F_INPUT | HWMON_F_FAULT, 270 + HWMON_F_INPUT | HWMON_F_FAULT, 286 271 HWMON_F_INPUT | HWMON_F_FAULT), 287 272 HWMON_CHANNEL_INFO(pwm, 273 + HWMON_PWM_INPUT, 274 + HWMON_PWM_INPUT, 275 + HWMON_PWM_INPUT, 288 276 HWMON_PWM_INPUT), 289 277 NULL 290 278 }; ··· 316 294 unsigned long *state) 317 295 318 296 { 319 - struct mlxreg_fan *fan = cdev->devdata; 297 + struct mlxreg_fan_pwm *pwm = cdev->devdata; 298 + struct mlxreg_fan *fan = pwm->fan; 320 299 u32 regval; 321 300 int err; 322 301 323 - err = regmap_read(fan->regmap, fan->pwm.reg, &regval); 302 + err = regmap_read(fan->regmap, pwm->reg, &regval); 324 303 if (err) { 325 304 dev_err(fan->dev, "Failed to query PWM duty\n"); 326 305 return err; ··· 336 313 unsigned long state) 337 314 338 315 { 339 - struct mlxreg_fan *fan = cdev->devdata; 316 + struct mlxreg_fan_pwm *pwm = cdev->devdata; 317 + struct mlxreg_fan *fan = pwm->fan; 340 318 unsigned long cur_state; 341 319 int i, config = 0; 342 320 u32 regval; ··· 361 337 config = 1; 362 338 state -= MLXREG_FAN_MAX_STATE; 363 339 for (i = 0; i < state; i++) 364 - fan->cooling_levels[i] = state; 340 + pwm->cooling_levels[i] = state; 365 341 for (i = state; i <= MLXREG_FAN_MAX_STATE; i++) 366 - fan->cooling_levels[i] = i; 342 + pwm->cooling_levels[i] = i; 367 343 368 - err = regmap_read(fan->regmap, fan->pwm.reg, &regval); 344 + err = regmap_read(fan->regmap, pwm->reg, &regval); 369 345 if (err) { 370 346 dev_err(fan->dev, "Failed to query PWM duty\n"); 371 347 return err; ··· 382 358 return -EINVAL; 383 359 384 360 /* Normalize the state to the valid speed range. */ 385 - state = fan->cooling_levels[state]; 386 - err = regmap_write(fan->regmap, fan->pwm.reg, 361 + state = pwm->cooling_levels[state]; 362 + err = regmap_write(fan->regmap, pwm->reg, 387 363 MLXREG_FAN_PWM_STATE2DUTY(state)); 388 364 if (err) { 389 365 dev_err(fan->dev, "Failed to write PWM duty\n"); ··· 414 390 return !!(regval & data->bit); 415 391 } 416 392 393 + static int mlxreg_pwm_connect_verify(struct mlxreg_fan *fan, 394 + struct mlxreg_core_data *data) 395 + { 396 + u32 regval; 397 + int err; 398 + 399 + err = regmap_read(fan->regmap, data->reg, &regval); 400 + if (err) { 401 + dev_err(fan->dev, "Failed to query pwm register 0x%08x\n", 402 + data->reg); 403 + return err; 404 + } 405 + 406 + return regval != MLXREG_FAN_PWM_NOT_CONNECTED; 407 + } 408 + 417 409 static int mlxreg_fan_speed_divider_get(struct mlxreg_fan *fan, 418 410 struct mlxreg_core_data *data) 419 411 { ··· 458 418 static int mlxreg_fan_config(struct mlxreg_fan *fan, 459 419 struct mlxreg_core_platform_data *pdata) 460 420 { 421 + int tacho_num = 0, tacho_avail = 0, pwm_num = 0, i; 461 422 struct mlxreg_core_data *data = pdata->data; 462 - int tacho_num = 0, tacho_avail = 0, i; 463 423 bool configured = false; 464 424 int err; 465 425 ··· 489 449 fan->tacho[tacho_num++].connected = true; 490 450 tacho_avail++; 491 451 } else if (strnstr(data->label, "pwm", sizeof(data->label))) { 492 - if (fan->pwm.connected) { 493 - dev_err(fan->dev, "duplicate pwm entry: %s\n", 452 + if (pwm_num == MLXREG_FAN_MAX_TACHO) { 453 + dev_err(fan->dev, "too many pwm entries: %s\n", 494 454 data->label); 495 455 return -EINVAL; 496 456 } 497 - fan->pwm.reg = data->reg; 498 - fan->pwm.connected = true; 457 + 458 + /* Validate if more then one PWM is connected. */ 459 + if (pwm_num) { 460 + err = mlxreg_pwm_connect_verify(fan, data); 461 + if (err < 0) 462 + return err; 463 + else if (!err) 464 + continue; 465 + } 466 + 467 + fan->pwm[pwm_num].reg = data->reg; 468 + fan->pwm[pwm_num].connected = true; 469 + pwm_num++; 499 470 } else if (strnstr(data->label, "conf", sizeof(data->label))) { 500 471 if (configured) { 501 472 dev_err(fan->dev, "duplicate conf entry: %s\n", ··· 559 508 fan->tachos_per_drwr = tacho_avail / drwr_avail; 560 509 } 561 510 562 - /* Init cooling levels per PWM state. */ 563 - for (i = 0; i < MLXREG_FAN_SPEED_MIN_LEVEL; i++) 564 - fan->cooling_levels[i] = MLXREG_FAN_SPEED_MIN_LEVEL; 565 - for (i = MLXREG_FAN_SPEED_MIN_LEVEL; i <= MLXREG_FAN_MAX_STATE; i++) 566 - fan->cooling_levels[i] = i; 511 + return 0; 512 + } 513 + 514 + static int mlxreg_fan_cooling_config(struct device *dev, struct mlxreg_fan *fan) 515 + { 516 + int i, j; 517 + 518 + for (i = 0; i < MLXREG_FAN_MAX_PWM; i++) { 519 + struct mlxreg_fan_pwm *pwm = &fan->pwm[i]; 520 + 521 + if (!pwm->connected) 522 + continue; 523 + pwm->fan = fan; 524 + pwm->cdev = devm_thermal_of_cooling_device_register(dev, NULL, mlxreg_fan_name[i], 525 + pwm, &mlxreg_fan_cooling_ops); 526 + if (IS_ERR(pwm->cdev)) { 527 + dev_err(dev, "Failed to register cooling device\n"); 528 + return PTR_ERR(pwm->cdev); 529 + } 530 + 531 + /* Init cooling levels per PWM state. */ 532 + for (j = 0; j < MLXREG_FAN_SPEED_MIN_LEVEL; j++) 533 + pwm->cooling_levels[j] = MLXREG_FAN_SPEED_MIN_LEVEL; 534 + for (j = MLXREG_FAN_SPEED_MIN_LEVEL; j <= MLXREG_FAN_MAX_STATE; j++) 535 + pwm->cooling_levels[j] = j; 536 + } 567 537 568 538 return 0; 569 539 } ··· 623 551 return PTR_ERR(hwm); 624 552 } 625 553 626 - if (IS_REACHABLE(CONFIG_THERMAL)) { 627 - fan->cdev = devm_thermal_of_cooling_device_register(dev, 628 - NULL, "mlxreg_fan", fan, &mlxreg_fan_cooling_ops); 629 - if (IS_ERR(fan->cdev)) { 630 - dev_err(dev, "Failed to register cooling device\n"); 631 - return PTR_ERR(fan->cdev); 632 - } 633 - } 554 + if (IS_REACHABLE(CONFIG_THERMAL)) 555 + err = mlxreg_fan_cooling_config(dev, fan); 634 556 635 - return 0; 557 + return err; 636 558 } 637 559 638 560 static struct platform_driver mlxreg_fan_driver = {
+3
drivers/hwmon/nct6683.c
··· 174 174 #define NCT6683_CUSTOMER_ID_MITAC 0xa0e 175 175 #define NCT6683_CUSTOMER_ID_MSI 0x201 176 176 #define NCT6683_CUSTOMER_ID_ASROCK 0xe2c 177 + #define NCT6683_CUSTOMER_ID_ASROCK2 0xe1b 177 178 178 179 #define NCT6683_REG_BUILD_YEAR 0x604 179 180 #define NCT6683_REG_BUILD_MONTH 0x605 ··· 1221 1220 case NCT6683_CUSTOMER_ID_MSI: 1222 1221 break; 1223 1222 case NCT6683_CUSTOMER_ID_ASROCK: 1223 + break; 1224 + case NCT6683_CUSTOMER_ID_ASROCK2: 1224 1225 break; 1225 1226 default: 1226 1227 if (!force)
+474 -243
drivers/hwmon/nct6775.c
··· 55 55 #include <linux/dmi.h> 56 56 #include <linux/io.h> 57 57 #include <linux/nospec.h> 58 + #include <linux/wmi.h> 58 59 #include "lm75.h" 59 60 60 61 #define USE_ALTERNATE ··· 133 132 #define SIO_ID_MASK 0xFFF8 134 133 135 134 enum pwm_enable { off, manual, thermal_cruise, speed_cruise, sf3, sf4 }; 135 + enum sensor_access { access_direct, access_asuswmi }; 136 136 137 - static inline void 138 - superio_outb(int ioreg, int reg, int val) 137 + struct nct6775_sio_data { 138 + int sioreg; 139 + int ld; 140 + enum kinds kind; 141 + enum sensor_access access; 142 + 143 + /* superio_() callbacks */ 144 + void (*sio_outb)(struct nct6775_sio_data *sio_data, int reg, int val); 145 + int (*sio_inb)(struct nct6775_sio_data *sio_data, int reg); 146 + void (*sio_select)(struct nct6775_sio_data *sio_data, int ld); 147 + int (*sio_enter)(struct nct6775_sio_data *sio_data); 148 + void (*sio_exit)(struct nct6775_sio_data *sio_data); 149 + }; 150 + 151 + #define ASUSWMI_MONITORING_GUID "466747A0-70EC-11DE-8A39-0800200C9A66" 152 + #define ASUSWMI_METHODID_RSIO 0x5253494F 153 + #define ASUSWMI_METHODID_WSIO 0x5753494F 154 + #define ASUSWMI_METHODID_RHWM 0x5248574D 155 + #define ASUSWMI_METHODID_WHWM 0x5748574D 156 + #define ASUSWMI_UNSUPPORTED_METHOD 0xFFFFFFFE 157 + 158 + static int nct6775_asuswmi_evaluate_method(u32 method_id, u8 bank, u8 reg, u8 val, u32 *retval) 139 159 { 160 + #if IS_ENABLED(CONFIG_ACPI_WMI) 161 + u32 args = bank | (reg << 8) | (val << 16); 162 + struct acpi_buffer input = { (acpi_size) sizeof(args), &args }; 163 + struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; 164 + acpi_status status; 165 + union acpi_object *obj; 166 + u32 tmp = ASUSWMI_UNSUPPORTED_METHOD; 167 + 168 + status = wmi_evaluate_method(ASUSWMI_MONITORING_GUID, 0, 169 + method_id, &input, &output); 170 + 171 + if (ACPI_FAILURE(status)) 172 + return -EIO; 173 + 174 + obj = output.pointer; 175 + if (obj && obj->type == ACPI_TYPE_INTEGER) 176 + tmp = obj->integer.value; 177 + 178 + if (retval) 179 + *retval = tmp; 180 + 181 + kfree(obj); 182 + 183 + if (tmp == ASUSWMI_UNSUPPORTED_METHOD) 184 + return -ENODEV; 185 + return 0; 186 + #else 187 + return -EOPNOTSUPP; 188 + #endif 189 + } 190 + 191 + static inline int nct6775_asuswmi_write(u8 bank, u8 reg, u8 val) 192 + { 193 + return nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_WHWM, bank, 194 + reg, val, NULL); 195 + } 196 + 197 + static inline int nct6775_asuswmi_read(u8 bank, u8 reg, u8 *val) 198 + { 199 + u32 ret, tmp = 0; 200 + 201 + ret = nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_RHWM, bank, 202 + reg, 0, &tmp); 203 + *val = tmp; 204 + return ret; 205 + } 206 + 207 + static int superio_wmi_inb(struct nct6775_sio_data *sio_data, int reg) 208 + { 209 + int tmp = 0; 210 + 211 + nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_RSIO, sio_data->ld, 212 + reg, 0, &tmp); 213 + return tmp; 214 + } 215 + 216 + static void superio_wmi_outb(struct nct6775_sio_data *sio_data, int reg, int val) 217 + { 218 + nct6775_asuswmi_evaluate_method(ASUSWMI_METHODID_WSIO, sio_data->ld, 219 + reg, val, NULL); 220 + } 221 + 222 + static void superio_wmi_select(struct nct6775_sio_data *sio_data, int ld) 223 + { 224 + sio_data->ld = ld; 225 + } 226 + 227 + static int superio_wmi_enter(struct nct6775_sio_data *sio_data) 228 + { 229 + return 0; 230 + } 231 + 232 + static void superio_wmi_exit(struct nct6775_sio_data *sio_data) 233 + { 234 + } 235 + 236 + static void superio_outb(struct nct6775_sio_data *sio_data, int reg, int val) 237 + { 238 + int ioreg = sio_data->sioreg; 239 + 140 240 outb(reg, ioreg); 141 241 outb(val, ioreg + 1); 142 242 } 143 243 144 - static inline int 145 - superio_inb(int ioreg, int reg) 244 + static int superio_inb(struct nct6775_sio_data *sio_data, int reg) 146 245 { 246 + int ioreg = sio_data->sioreg; 247 + 147 248 outb(reg, ioreg); 148 249 return inb(ioreg + 1); 149 250 } 150 251 151 - static inline void 152 - superio_select(int ioreg, int ld) 252 + static void superio_select(struct nct6775_sio_data *sio_data, int ld) 153 253 { 254 + int ioreg = sio_data->sioreg; 255 + 154 256 outb(SIO_REG_LDSEL, ioreg); 155 257 outb(ld, ioreg + 1); 156 258 } 157 259 158 - static inline int 159 - superio_enter(int ioreg) 260 + static int superio_enter(struct nct6775_sio_data *sio_data) 160 261 { 262 + int ioreg = sio_data->sioreg; 263 + 161 264 /* 162 265 * Try to reserve <ioreg> and <ioreg + 1> for exclusive access. 163 266 */ ··· 274 169 return 0; 275 170 } 276 171 277 - static inline void 278 - superio_exit(int ioreg) 172 + static void superio_exit(struct nct6775_sio_data *sio_data) 279 173 { 174 + int ioreg = sio_data->sioreg; 175 + 280 176 outb(0xaa, ioreg); 281 177 outb(0x02, ioreg); 282 178 outb(0x02, ioreg + 1); ··· 296 190 297 191 #define NCT6775_REG_BANK 0x4E 298 192 #define NCT6775_REG_CONFIG 0x40 193 + #define NCT6775_PORT_CHIPID 0x58 299 194 300 195 /* 301 196 * Not currently used: ··· 1322 1215 u8 fandiv1; 1323 1216 u8 fandiv2; 1324 1217 u8 sio_reg_enable; 1325 - }; 1326 1218 1327 - struct nct6775_sio_data { 1328 - int sioreg; 1329 - enum kinds kind; 1219 + /* nct6775_*() callbacks */ 1220 + u16 (*read_value)(struct nct6775_data *data, u16 reg); 1221 + int (*write_value)(struct nct6775_data *data, u16 reg, u16 value); 1330 1222 }; 1331 1223 1332 1224 struct sensor_device_template { ··· 1513 1407 return false; 1514 1408 } 1515 1409 1410 + static inline void nct6775_wmi_set_bank(struct nct6775_data *data, u16 reg) 1411 + { 1412 + u8 bank = reg >> 8; 1413 + 1414 + data->bank = bank; 1415 + } 1416 + 1417 + static u16 nct6775_wmi_read_value(struct nct6775_data *data, u16 reg) 1418 + { 1419 + int res, err, word_sized = is_word_sized(data, reg); 1420 + u8 tmp = 0; 1421 + 1422 + nct6775_wmi_set_bank(data, reg); 1423 + 1424 + err = nct6775_asuswmi_read(data->bank, reg, &tmp); 1425 + if (err) 1426 + return 0; 1427 + 1428 + res = tmp; 1429 + if (word_sized) { 1430 + err = nct6775_asuswmi_read(data->bank, (reg & 0xff) + 1, &tmp); 1431 + if (err) 1432 + return 0; 1433 + 1434 + res = (res << 8) + tmp; 1435 + } 1436 + return res; 1437 + } 1438 + 1439 + static int nct6775_wmi_write_value(struct nct6775_data *data, u16 reg, u16 value) 1440 + { 1441 + int res, word_sized = is_word_sized(data, reg); 1442 + 1443 + nct6775_wmi_set_bank(data, reg); 1444 + 1445 + if (word_sized) { 1446 + res = nct6775_asuswmi_write(data->bank, reg & 0xff, value >> 8); 1447 + if (res) 1448 + return res; 1449 + 1450 + res = nct6775_asuswmi_write(data->bank, (reg & 0xff) + 1, value); 1451 + } else { 1452 + res = nct6775_asuswmi_write(data->bank, reg & 0xff, value); 1453 + } 1454 + 1455 + return res; 1456 + } 1457 + 1516 1458 /* 1517 1459 * On older chips, only registers 0x50-0x5f are banked. 1518 1460 * On more recent chips, all registers are banked. ··· 1613 1459 { 1614 1460 u16 res; 1615 1461 1616 - res = nct6775_read_value(data, reg); 1462 + res = data->read_value(data, reg); 1617 1463 if (!is_word_sized(data, reg)) 1618 1464 res <<= 8; 1619 1465 ··· 1624 1470 { 1625 1471 if (!is_word_sized(data, reg)) 1626 1472 value >>= 8; 1627 - return nct6775_write_value(data, reg, value); 1473 + return data->write_value(data, reg, value); 1628 1474 } 1629 1475 1630 1476 /* This function assumes that the caller holds data->update_lock */ ··· 1634 1480 1635 1481 switch (nr) { 1636 1482 case 0: 1637 - reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70) 1483 + reg = (data->read_value(data, NCT6775_REG_FANDIV1) & 0x70) 1638 1484 | (data->fan_div[0] & 0x7); 1639 - nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); 1485 + data->write_value(data, NCT6775_REG_FANDIV1, reg); 1640 1486 break; 1641 1487 case 1: 1642 - reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7) 1488 + reg = (data->read_value(data, NCT6775_REG_FANDIV1) & 0x7) 1643 1489 | ((data->fan_div[1] << 4) & 0x70); 1644 - nct6775_write_value(data, NCT6775_REG_FANDIV1, reg); 1490 + data->write_value(data, NCT6775_REG_FANDIV1, reg); 1645 1491 break; 1646 1492 case 2: 1647 - reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70) 1493 + reg = (data->read_value(data, NCT6775_REG_FANDIV2) & 0x70) 1648 1494 | (data->fan_div[2] & 0x7); 1649 - nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); 1495 + data->write_value(data, NCT6775_REG_FANDIV2, reg); 1650 1496 break; 1651 1497 case 3: 1652 - reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7) 1498 + reg = (data->read_value(data, NCT6775_REG_FANDIV2) & 0x7) 1653 1499 | ((data->fan_div[3] << 4) & 0x70); 1654 - nct6775_write_value(data, NCT6775_REG_FANDIV2, reg); 1500 + data->write_value(data, NCT6775_REG_FANDIV2, reg); 1655 1501 break; 1656 1502 } 1657 1503 } ··· 1666 1512 { 1667 1513 u8 i; 1668 1514 1669 - i = nct6775_read_value(data, NCT6775_REG_FANDIV1); 1515 + i = data->read_value(data, NCT6775_REG_FANDIV1); 1670 1516 data->fan_div[0] = i & 0x7; 1671 1517 data->fan_div[1] = (i & 0x70) >> 4; 1672 - i = nct6775_read_value(data, NCT6775_REG_FANDIV2); 1518 + i = data->read_value(data, NCT6775_REG_FANDIV2); 1673 1519 data->fan_div[2] = i & 0x7; 1674 1520 if (data->has_fan & BIT(3)) 1675 1521 data->fan_div[3] = (i & 0x70) >> 4; ··· 1717 1563 */ 1718 1564 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { 1719 1565 if (data->has_fan_min & BIT(i)) { 1720 - reg = nct6775_read_value(data, data->REG_FAN_MIN[i]); 1566 + reg = data->read_value(data, data->REG_FAN_MIN[i]); 1721 1567 if (!reg) 1722 - nct6775_write_value(data, data->REG_FAN_MIN[i], 1723 - data->has_fan_div ? 0xff 1724 - : 0xff1f); 1568 + data->write_value(data, data->REG_FAN_MIN[i], 1569 + data->has_fan_div ? 0xff 1570 + : 0xff1f); 1725 1571 } 1726 1572 } 1727 1573 } ··· 1765 1611 } 1766 1612 if (fan_min != data->fan_min[nr]) { 1767 1613 data->fan_min[nr] = fan_min; 1768 - nct6775_write_value(data, data->REG_FAN_MIN[nr], 1769 - fan_min); 1614 + data->write_value(data, data->REG_FAN_MIN[nr], 1615 + fan_min); 1770 1616 } 1771 1617 } 1772 1618 data->fan_div[nr] = fan_div; ··· 1786 1632 continue; 1787 1633 1788 1634 duty_is_dc = data->REG_PWM_MODE[i] && 1789 - (nct6775_read_value(data, data->REG_PWM_MODE[i]) 1635 + (data->read_value(data, data->REG_PWM_MODE[i]) 1790 1636 & data->PWM_MODE_MASK[i]); 1791 1637 data->pwm_mode[i] = !duty_is_dc; 1792 1638 1793 - fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]); 1639 + fanmodecfg = data->read_value(data, data->REG_FAN_MODE[i]); 1794 1640 for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) { 1795 1641 if (data->REG_PWM[j] && data->REG_PWM[j][i]) { 1796 - data->pwm[j][i] 1797 - = nct6775_read_value(data, 1798 - data->REG_PWM[j][i]); 1642 + data->pwm[j][i] = data->read_value(data, 1643 + data->REG_PWM[j][i]); 1799 1644 } 1800 1645 } 1801 1646 ··· 1809 1656 u8 t = fanmodecfg & 0x0f; 1810 1657 1811 1658 if (data->REG_TOLERANCE_H) { 1812 - t |= (nct6775_read_value(data, 1659 + t |= (data->read_value(data, 1813 1660 data->REG_TOLERANCE_H[i]) & 0x70) >> 1; 1814 1661 } 1815 1662 data->target_speed_tolerance[i] = t; 1816 1663 } 1817 1664 1818 1665 data->temp_tolerance[1][i] = 1819 - nct6775_read_value(data, 1820 - data->REG_CRITICAL_TEMP_TOLERANCE[i]); 1666 + data->read_value(data, 1667 + data->REG_CRITICAL_TEMP_TOLERANCE[i]); 1821 1668 1822 - reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]); 1669 + reg = data->read_value(data, data->REG_TEMP_SEL[i]); 1823 1670 data->pwm_temp_sel[i] = reg & 0x1f; 1824 1671 /* If fan can stop, report floor as 0 */ 1825 1672 if (reg & 0x80) ··· 1828 1675 if (!data->REG_WEIGHT_TEMP_SEL[i]) 1829 1676 continue; 1830 1677 1831 - reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); 1678 + reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[i]); 1832 1679 data->pwm_weight_temp_sel[i] = reg & 0x1f; 1833 1680 /* If weight is disabled, report weight source as 0 */ 1834 1681 if (!(reg & 0x80)) ··· 1836 1683 1837 1684 /* Weight temp data */ 1838 1685 for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) { 1839 - data->weight_temp[j][i] 1840 - = nct6775_read_value(data, 1841 - data->REG_WEIGHT_TEMP[j][i]); 1686 + data->weight_temp[j][i] = data->read_value(data, 1687 + data->REG_WEIGHT_TEMP[j][i]); 1842 1688 } 1843 1689 } 1844 1690 } ··· 1855 1703 1856 1704 for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) { 1857 1705 data->fan_time[j][i] = 1858 - nct6775_read_value(data, data->REG_FAN_TIME[j][i]); 1706 + data->read_value(data, data->REG_FAN_TIME[j][i]); 1859 1707 } 1860 1708 1861 - reg_t = nct6775_read_value(data, data->REG_TARGET[i]); 1709 + reg_t = data->read_value(data, data->REG_TARGET[i]); 1862 1710 /* Update only in matching mode or if never updated */ 1863 1711 if (!data->target_temp[i] || 1864 1712 data->pwm_enable[i] == thermal_cruise) ··· 1866 1714 if (!data->target_speed[i] || 1867 1715 data->pwm_enable[i] == speed_cruise) { 1868 1716 if (data->REG_TOLERANCE_H) { 1869 - reg_t |= (nct6775_read_value(data, 1717 + reg_t |= (data->read_value(data, 1870 1718 data->REG_TOLERANCE_H[i]) & 0x0f) << 8; 1871 1719 } 1872 1720 data->target_speed[i] = reg_t; ··· 1874 1722 1875 1723 for (j = 0; j < data->auto_pwm_num; j++) { 1876 1724 data->auto_pwm[i][j] = 1877 - nct6775_read_value(data, 1878 - NCT6775_AUTO_PWM(data, i, j)); 1725 + data->read_value(data, 1726 + NCT6775_AUTO_PWM(data, i, j)); 1879 1727 data->auto_temp[i][j] = 1880 - nct6775_read_value(data, 1881 - NCT6775_AUTO_TEMP(data, i, j)); 1728 + data->read_value(data, 1729 + NCT6775_AUTO_TEMP(data, i, j)); 1882 1730 } 1883 1731 1884 1732 /* critical auto_pwm temperature data */ 1885 1733 data->auto_temp[i][data->auto_pwm_num] = 1886 - nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]); 1734 + data->read_value(data, data->REG_CRITICAL_TEMP[i]); 1887 1735 1888 1736 switch (data->kind) { 1889 1737 case nct6775: 1890 - reg = nct6775_read_value(data, 1891 - NCT6775_REG_CRITICAL_ENAB[i]); 1738 + reg = data->read_value(data, 1739 + NCT6775_REG_CRITICAL_ENAB[i]); 1892 1740 data->auto_pwm[i][data->auto_pwm_num] = 1893 1741 (reg & 0x02) ? 0xff : 0x00; 1894 1742 break; ··· 1905 1753 case nct6796: 1906 1754 case nct6797: 1907 1755 case nct6798: 1908 - reg = nct6775_read_value(data, 1756 + reg = data->read_value(data, 1909 1757 data->REG_CRITICAL_PWM_ENABLE[i]); 1910 1758 if (reg & data->CRITICAL_PWM_ENABLE_MASK) 1911 - reg = nct6775_read_value(data, 1759 + reg = data->read_value(data, 1912 1760 data->REG_CRITICAL_PWM[i]); 1913 1761 else 1914 1762 reg = 0xff; ··· 1935 1783 if (!(data->have_in & BIT(i))) 1936 1784 continue; 1937 1785 1938 - data->in[i][0] = nct6775_read_value(data, 1939 - data->REG_VIN[i]); 1940 - data->in[i][1] = nct6775_read_value(data, 1786 + data->in[i][0] = data->read_value(data, 1787 + data->REG_VIN[i]); 1788 + data->in[i][1] = data->read_value(data, 1941 1789 data->REG_IN_MINMAX[0][i]); 1942 - data->in[i][2] = nct6775_read_value(data, 1790 + data->in[i][2] = data->read_value(data, 1943 1791 data->REG_IN_MINMAX[1][i]); 1944 1792 } 1945 1793 ··· 1950 1798 if (!(data->has_fan & BIT(i))) 1951 1799 continue; 1952 1800 1953 - reg = nct6775_read_value(data, data->REG_FAN[i]); 1801 + reg = data->read_value(data, data->REG_FAN[i]); 1954 1802 data->rpm[i] = data->fan_from_reg(reg, 1955 1803 data->fan_div[i]); 1956 1804 1957 1805 if (data->has_fan_min & BIT(i)) 1958 - data->fan_min[i] = nct6775_read_value(data, 1806 + data->fan_min[i] = data->read_value(data, 1959 1807 data->REG_FAN_MIN[i]); 1960 1808 1961 1809 if (data->REG_FAN_PULSES[i]) { 1962 1810 data->fan_pulses[i] = 1963 - (nct6775_read_value(data, 1964 - data->REG_FAN_PULSES[i]) 1811 + (data->read_value(data, 1812 + data->REG_FAN_PULSES[i]) 1965 1813 >> data->FAN_PULSE_SHIFT[i]) & 0x03; 1966 1814 } 1967 1815 ··· 1977 1825 continue; 1978 1826 for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) { 1979 1827 if (data->reg_temp[j][i]) 1980 - data->temp[j][i] 1981 - = nct6775_read_temp(data, 1982 - data->reg_temp[j][i]); 1828 + data->temp[j][i] = nct6775_read_temp(data, 1829 + data->reg_temp[j][i]); 1983 1830 } 1984 1831 if (i >= NUM_TEMP_FIXED || 1985 1832 !(data->have_temp_fixed & BIT(i))) 1986 1833 continue; 1987 - data->temp_offset[i] 1988 - = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]); 1834 + data->temp_offset[i] = data->read_value(data, 1835 + data->REG_TEMP_OFFSET[i]); 1989 1836 } 1990 1837 1991 1838 data->alarms = 0; ··· 1993 1842 1994 1843 if (!data->REG_ALARM[i]) 1995 1844 continue; 1996 - alarm = nct6775_read_value(data, data->REG_ALARM[i]); 1845 + alarm = data->read_value(data, data->REG_ALARM[i]); 1997 1846 data->alarms |= ((u64)alarm) << (i << 3); 1998 1847 } 1999 1848 ··· 2003 1852 2004 1853 if (!data->REG_BEEP[i]) 2005 1854 continue; 2006 - beep = nct6775_read_value(data, data->REG_BEEP[i]); 1855 + beep = data->read_value(data, data->REG_BEEP[i]); 2007 1856 data->beeps |= ((u64)beep) << (i << 3); 2008 1857 } 2009 1858 ··· 2045 1894 return err; 2046 1895 mutex_lock(&data->update_lock); 2047 1896 data->in[nr][index] = in_to_reg(val, nr); 2048 - nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr], 2049 - data->in[nr][index]); 1897 + data->write_value(data, data->REG_IN_MINMAX[index - 1][nr], 1898 + data->in[nr][index]); 2050 1899 mutex_unlock(&data->update_lock); 2051 1900 return count; 2052 1901 } ··· 2070 1919 for (nr = 0; nr < count; nr++) { 2071 1920 int src; 2072 1921 2073 - src = nct6775_read_value(data, 2074 - data->REG_TEMP_SOURCE[nr]) & 0x1f; 1922 + src = data->read_value(data, 1923 + data->REG_TEMP_SOURCE[nr]) & 0x1f; 2075 1924 if (src == source) 2076 1925 return nr; 2077 1926 } ··· 2132 1981 data->beeps |= (1ULL << nr); 2133 1982 else 2134 1983 data->beeps &= ~(1ULL << nr); 2135 - nct6775_write_value(data, data->REG_BEEP[regindex], 2136 - (data->beeps >> (regindex << 3)) & 0xff); 1984 + data->write_value(data, data->REG_BEEP[regindex], 1985 + (data->beeps >> (regindex << 3)) & 0xff); 2137 1986 mutex_unlock(&data->update_lock); 2138 1987 return count; 2139 1988 } ··· 2188 2037 data->beeps |= (1ULL << bit); 2189 2038 else 2190 2039 data->beeps &= ~(1ULL << bit); 2191 - nct6775_write_value(data, data->REG_BEEP[regindex], 2192 - (data->beeps >> (regindex << 3)) & 0xff); 2040 + data->write_value(data, data->REG_BEEP[regindex], 2041 + (data->beeps >> (regindex << 3)) & 0xff); 2193 2042 mutex_unlock(&data->update_lock); 2194 2043 2195 2044 return count; ··· 2356 2205 } 2357 2206 2358 2207 write_min: 2359 - nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); 2208 + data->write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]); 2360 2209 mutex_unlock(&data->update_lock); 2361 2210 2362 2211 return count; ··· 2392 2241 2393 2242 mutex_lock(&data->update_lock); 2394 2243 data->fan_pulses[nr] = val & 3; 2395 - reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]); 2244 + reg = data->read_value(data, data->REG_FAN_PULSES[nr]); 2396 2245 reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]); 2397 2246 reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr]; 2398 - nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg); 2247 + data->write_value(data, data->REG_FAN_PULSES[nr], reg); 2399 2248 mutex_unlock(&data->update_lock); 2400 2249 2401 2250 return count; ··· 2529 2378 2530 2379 mutex_lock(&data->update_lock); 2531 2380 data->temp_offset[nr] = val; 2532 - nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val); 2381 + data->write_value(data, data->REG_TEMP_OFFSET[nr], val); 2533 2382 mutex_unlock(&data->update_lock); 2534 2383 2535 2384 return count; ··· 2568 2417 data->temp_type[nr] = val; 2569 2418 vbit = 0x02 << nr; 2570 2419 dbit = data->DIODE_MASK << nr; 2571 - vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit; 2572 - diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit; 2420 + vbat = data->read_value(data, data->REG_VBAT) & ~vbit; 2421 + diode = data->read_value(data, data->REG_DIODE) & ~dbit; 2573 2422 switch (val) { 2574 2423 case 1: /* CPU diode (diode, current mode) */ 2575 2424 vbat |= vbit; ··· 2581 2430 case 4: /* thermistor */ 2582 2431 break; 2583 2432 } 2584 - nct6775_write_value(data, data->REG_VBAT, vbat); 2585 - nct6775_write_value(data, data->REG_DIODE, diode); 2433 + data->write_value(data, data->REG_VBAT, vbat); 2434 + data->write_value(data, data->REG_DIODE, diode); 2586 2435 2587 2436 mutex_unlock(&data->update_lock); 2588 2437 return count; ··· 2706 2555 2707 2556 mutex_lock(&data->update_lock); 2708 2557 data->pwm_mode[nr] = val; 2709 - reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]); 2558 + reg = data->read_value(data, data->REG_PWM_MODE[nr]); 2710 2559 reg &= ~data->PWM_MODE_MASK[nr]; 2711 2560 if (!val) 2712 2561 reg |= data->PWM_MODE_MASK[nr]; 2713 - nct6775_write_value(data, data->REG_PWM_MODE[nr], reg); 2562 + data->write_value(data, data->REG_PWM_MODE[nr], reg); 2714 2563 mutex_unlock(&data->update_lock); 2715 2564 return count; 2716 2565 } ··· 2729 2578 * Otherwise, show the configured value. 2730 2579 */ 2731 2580 if (index == 0 && data->pwm_enable[nr] > manual) 2732 - pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]); 2581 + pwm = data->read_value(data, data->REG_PWM_READ[nr]); 2733 2582 else 2734 2583 pwm = data->pwm[index][nr]; 2735 2584 ··· 2758 2607 2759 2608 mutex_lock(&data->update_lock); 2760 2609 data->pwm[index][nr] = val; 2761 - nct6775_write_value(data, data->REG_PWM[index][nr], val); 2610 + data->write_value(data, data->REG_PWM[index][nr], val); 2762 2611 if (index == 2) { /* floor: disable if val == 0 */ 2763 - reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); 2612 + reg = data->read_value(data, data->REG_TEMP_SEL[nr]); 2764 2613 reg &= 0x7f; 2765 2614 if (val) 2766 2615 reg |= 0x80; 2767 - nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); 2616 + data->write_value(data, data->REG_TEMP_SEL[nr], reg); 2768 2617 } 2769 2618 mutex_unlock(&data->update_lock); 2770 2619 return count; ··· 2803 2652 case manual: 2804 2653 break; 2805 2654 case speed_cruise: 2806 - reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); 2655 + reg = data->read_value(data, data->REG_FAN_MODE[nr]); 2807 2656 reg = (reg & ~data->tolerance_mask) | 2808 2657 (data->target_speed_tolerance[nr] & data->tolerance_mask); 2809 - nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); 2810 - nct6775_write_value(data, data->REG_TARGET[nr], 2658 + data->write_value(data, data->REG_FAN_MODE[nr], reg); 2659 + data->write_value(data, data->REG_TARGET[nr], 2811 2660 data->target_speed[nr] & 0xff); 2812 2661 if (data->REG_TOLERANCE_H) { 2813 2662 reg = (data->target_speed[nr] >> 8) & 0x0f; 2814 2663 reg |= (data->target_speed_tolerance[nr] & 0x38) << 1; 2815 - nct6775_write_value(data, 2816 - data->REG_TOLERANCE_H[nr], 2817 - reg); 2664 + data->write_value(data, 2665 + data->REG_TOLERANCE_H[nr], 2666 + reg); 2818 2667 } 2819 2668 break; 2820 2669 case thermal_cruise: 2821 - nct6775_write_value(data, data->REG_TARGET[nr], 2822 - data->target_temp[nr]); 2670 + data->write_value(data, data->REG_TARGET[nr], 2671 + data->target_temp[nr]); 2823 2672 fallthrough; 2824 2673 default: 2825 - reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); 2674 + reg = data->read_value(data, data->REG_FAN_MODE[nr]); 2826 2675 reg = (reg & ~data->tolerance_mask) | 2827 2676 data->temp_tolerance[0][nr]; 2828 - nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); 2677 + data->write_value(data, data->REG_FAN_MODE[nr], reg); 2829 2678 break; 2830 2679 } 2831 2680 } ··· 2873 2722 * turn off pwm control: select manual mode, set pwm to maximum 2874 2723 */ 2875 2724 data->pwm[0][nr] = 255; 2876 - nct6775_write_value(data, data->REG_PWM[0][nr], 255); 2725 + data->write_value(data, data->REG_PWM[0][nr], 255); 2877 2726 } 2878 2727 pwm_update_registers(data, nr); 2879 - reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]); 2728 + reg = data->read_value(data, data->REG_FAN_MODE[nr]); 2880 2729 reg &= 0x0f; 2881 2730 reg |= pwm_enable_to_reg(val) << 4; 2882 - nct6775_write_value(data, data->REG_FAN_MODE[nr], reg); 2731 + data->write_value(data, data->REG_FAN_MODE[nr], reg); 2883 2732 mutex_unlock(&data->update_lock); 2884 2733 return count; 2885 2734 } ··· 2932 2781 mutex_lock(&data->update_lock); 2933 2782 src = data->temp_src[val - 1]; 2934 2783 data->pwm_temp_sel[nr] = src; 2935 - reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]); 2784 + reg = data->read_value(data, data->REG_TEMP_SEL[nr]); 2936 2785 reg &= 0xe0; 2937 2786 reg |= src; 2938 - nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg); 2787 + data->write_value(data, data->REG_TEMP_SEL[nr], reg); 2939 2788 mutex_unlock(&data->update_lock); 2940 2789 2941 2790 return count; ··· 2977 2826 if (val) { 2978 2827 src = data->temp_src[val - 1]; 2979 2828 data->pwm_weight_temp_sel[nr] = src; 2980 - reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); 2829 + reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); 2981 2830 reg &= 0xe0; 2982 2831 reg |= (src | 0x80); 2983 - nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); 2832 + data->write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); 2984 2833 } else { 2985 2834 data->pwm_weight_temp_sel[nr] = 0; 2986 - reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); 2835 + reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]); 2987 2836 reg &= 0x7f; 2988 - nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); 2837 + data->write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg); 2989 2838 } 2990 2839 mutex_unlock(&data->update_lock); 2991 2840 ··· 3097 2946 if (index) 3098 2947 pwm_update_registers(data, nr); 3099 2948 else 3100 - nct6775_write_value(data, 3101 - data->REG_CRITICAL_TEMP_TOLERANCE[nr], 3102 - val); 2949 + data->write_value(data, 2950 + data->REG_CRITICAL_TEMP_TOLERANCE[nr], 2951 + val); 3103 2952 mutex_unlock(&data->update_lock); 3104 2953 return count; 3105 2954 } ··· 3222 3071 3223 3072 mutex_lock(&data->update_lock); 3224 3073 data->weight_temp[index][nr] = val; 3225 - nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); 3074 + data->write_value(data, data->REG_WEIGHT_TEMP[index][nr], val); 3226 3075 mutex_unlock(&data->update_lock); 3227 3076 return count; 3228 3077 } ··· 3271 3120 val = step_time_to_reg(val, data->pwm_mode[nr]); 3272 3121 mutex_lock(&data->update_lock); 3273 3122 data->fan_time[index][nr] = val; 3274 - nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val); 3123 + data->write_value(data, data->REG_FAN_TIME[index][nr], val); 3275 3124 mutex_unlock(&data->update_lock); 3276 3125 return count; 3277 3126 } ··· 3313 3162 mutex_lock(&data->update_lock); 3314 3163 data->auto_pwm[nr][point] = val; 3315 3164 if (point < data->auto_pwm_num) { 3316 - nct6775_write_value(data, 3165 + data->write_value(data, 3317 3166 NCT6775_AUTO_PWM(data, nr, point), 3318 3167 data->auto_pwm[nr][point]); 3319 3168 } else { 3320 3169 switch (data->kind) { 3321 3170 case nct6775: 3322 3171 /* disable if needed (pwm == 0) */ 3323 - reg = nct6775_read_value(data, 3324 - NCT6775_REG_CRITICAL_ENAB[nr]); 3172 + reg = data->read_value(data, 3173 + NCT6775_REG_CRITICAL_ENAB[nr]); 3325 3174 if (val) 3326 3175 reg |= 0x02; 3327 3176 else 3328 3177 reg &= ~0x02; 3329 - nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], 3330 - reg); 3178 + data->write_value(data, NCT6775_REG_CRITICAL_ENAB[nr], 3179 + reg); 3331 3180 break; 3332 3181 case nct6776: 3333 3182 break; /* always enabled, nothing to do */ ··· 3341 3190 case nct6796: 3342 3191 case nct6797: 3343 3192 case nct6798: 3344 - nct6775_write_value(data, data->REG_CRITICAL_PWM[nr], 3193 + data->write_value(data, data->REG_CRITICAL_PWM[nr], 3345 3194 val); 3346 - reg = nct6775_read_value(data, 3195 + reg = data->read_value(data, 3347 3196 data->REG_CRITICAL_PWM_ENABLE[nr]); 3348 3197 if (val == 255) 3349 3198 reg &= ~data->CRITICAL_PWM_ENABLE_MASK; 3350 3199 else 3351 3200 reg |= data->CRITICAL_PWM_ENABLE_MASK; 3352 - nct6775_write_value(data, 3353 - data->REG_CRITICAL_PWM_ENABLE[nr], 3354 - reg); 3201 + data->write_value(data, 3202 + data->REG_CRITICAL_PWM_ENABLE[nr], 3203 + reg); 3355 3204 break; 3356 3205 } 3357 3206 } ··· 3394 3243 mutex_lock(&data->update_lock); 3395 3244 data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000); 3396 3245 if (point < data->auto_pwm_num) { 3397 - nct6775_write_value(data, 3246 + data->write_value(data, 3398 3247 NCT6775_AUTO_TEMP(data, nr, point), 3399 3248 data->auto_temp[nr][point]); 3400 3249 } else { 3401 - nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr], 3250 + data->write_value(data, data->REG_CRITICAL_TEMP[nr], 3402 3251 data->auto_temp[nr][point]); 3403 3252 } 3404 3253 mutex_unlock(&data->update_lock); ··· 3561 3410 const char *buf, size_t count) 3562 3411 { 3563 3412 struct nct6775_data *data = dev_get_drvdata(dev); 3413 + struct nct6775_sio_data *sio_data = dev_get_platdata(dev); 3564 3414 int nr = to_sensor_dev_attr(attr)->index - INTRUSION_ALARM_BASE; 3565 3415 unsigned long val; 3566 3416 u8 reg; ··· 3577 3425 * The CR registers are the same for all chips, and not all chips 3578 3426 * support clearing the caseopen status through "regular" registers. 3579 3427 */ 3580 - ret = superio_enter(data->sioreg); 3428 + ret = sio_data->sio_enter(sio_data); 3581 3429 if (ret) { 3582 3430 count = ret; 3583 3431 goto error; 3584 3432 } 3585 3433 3586 - superio_select(data->sioreg, NCT6775_LD_ACPI); 3587 - reg = superio_inb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr]); 3434 + sio_data->sio_select(sio_data, NCT6775_LD_ACPI); 3435 + reg = sio_data->sio_inb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr]); 3588 3436 reg |= NCT6775_CR_CASEOPEN_CLR_MASK[nr]; 3589 - superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3437 + sio_data->sio_outb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3590 3438 reg &= ~NCT6775_CR_CASEOPEN_CLR_MASK[nr]; 3591 - superio_outb(data->sioreg, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3592 - superio_exit(data->sioreg); 3439 + sio_data->sio_outb(sio_data, NCT6775_REG_CR_CASEOPEN_CLR[nr], reg); 3440 + sio_data->sio_exit(sio_data); 3593 3441 3594 3442 data->valid = false; /* Force cache refresh */ 3595 3443 error: ··· 3658 3506 3659 3507 /* Start monitoring if needed */ 3660 3508 if (data->REG_CONFIG) { 3661 - tmp = nct6775_read_value(data, data->REG_CONFIG); 3509 + tmp = data->read_value(data, data->REG_CONFIG); 3662 3510 if (!(tmp & 0x01)) 3663 - nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01); 3511 + data->write_value(data, data->REG_CONFIG, tmp | 0x01); 3664 3512 } 3665 3513 3666 3514 /* Enable temperature sensors if needed */ ··· 3669 3517 continue; 3670 3518 if (!data->reg_temp_config[i]) 3671 3519 continue; 3672 - tmp = nct6775_read_value(data, data->reg_temp_config[i]); 3520 + tmp = data->read_value(data, data->reg_temp_config[i]); 3673 3521 if (tmp & 0x01) 3674 - nct6775_write_value(data, data->reg_temp_config[i], 3522 + data->write_value(data, data->reg_temp_config[i], 3675 3523 tmp & 0xfe); 3676 3524 } 3677 3525 3678 3526 /* Enable VBAT monitoring if needed */ 3679 - tmp = nct6775_read_value(data, data->REG_VBAT); 3527 + tmp = data->read_value(data, data->REG_VBAT); 3680 3528 if (!(tmp & 0x01)) 3681 - nct6775_write_value(data, data->REG_VBAT, tmp | 0x01); 3529 + data->write_value(data, data->REG_VBAT, tmp | 0x01); 3682 3530 3683 - diode = nct6775_read_value(data, data->REG_DIODE); 3531 + diode = data->read_value(data, data->REG_DIODE); 3684 3532 3685 3533 for (i = 0; i < data->temp_fixed_num; i++) { 3686 3534 if (!(data->have_temp_fixed & BIT(i))) ··· 3694 3542 } 3695 3543 3696 3544 static void 3697 - nct6775_check_fan_inputs(struct nct6775_data *data) 3545 + nct6775_check_fan_inputs(struct nct6775_data *data, struct nct6775_sio_data *sio_data) 3698 3546 { 3699 3547 bool fan3pin = false, fan4pin = false, fan4min = false; 3700 3548 bool fan5pin = false, fan6pin = false, fan7pin = false; 3701 3549 bool pwm3pin = false, pwm4pin = false, pwm5pin = false; 3702 3550 bool pwm6pin = false, pwm7pin = false; 3703 - int sioreg = data->sioreg; 3704 3551 3705 3552 /* Store SIO_REG_ENABLE for use during resume */ 3706 - superio_select(sioreg, NCT6775_LD_HWM); 3707 - data->sio_reg_enable = superio_inb(sioreg, SIO_REG_ENABLE); 3553 + sio_data->sio_select(sio_data, NCT6775_LD_HWM); 3554 + data->sio_reg_enable = sio_data->sio_inb(sio_data, SIO_REG_ENABLE); 3708 3555 3709 3556 /* fan4 and fan5 share some pins with the GPIO and serial flash */ 3710 3557 if (data->kind == nct6775) { 3711 - int cr2c = superio_inb(sioreg, 0x2c); 3558 + int cr2c = sio_data->sio_inb(sio_data, 0x2c); 3712 3559 3713 3560 fan3pin = cr2c & BIT(6); 3714 3561 pwm3pin = cr2c & BIT(7); 3715 3562 3716 3563 /* On NCT6775, fan4 shares pins with the fdc interface */ 3717 - fan4pin = !(superio_inb(sioreg, 0x2A) & 0x80); 3564 + fan4pin = !(sio_data->sio_inb(sio_data, 0x2A) & 0x80); 3718 3565 } else if (data->kind == nct6776) { 3719 - bool gpok = superio_inb(sioreg, 0x27) & 0x80; 3566 + bool gpok = sio_data->sio_inb(sio_data, 0x27) & 0x80; 3720 3567 const char *board_vendor, *board_name; 3721 3568 3722 3569 board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); ··· 3731 3580 if (!strcmp(board_name, "Z77 Pro4-M")) { 3732 3581 if ((data->sio_reg_enable & 0xe0) != 0xe0) { 3733 3582 data->sio_reg_enable |= 0xe0; 3734 - superio_outb(sioreg, SIO_REG_ENABLE, 3583 + sio_data->sio_outb(sio_data, SIO_REG_ENABLE, 3735 3584 data->sio_reg_enable); 3736 3585 } 3737 3586 } ··· 3740 3589 if (data->sio_reg_enable & 0x80) 3741 3590 fan3pin = gpok; 3742 3591 else 3743 - fan3pin = !(superio_inb(sioreg, 0x24) & 0x40); 3592 + fan3pin = !(sio_data->sio_inb(sio_data, 0x24) & 0x40); 3744 3593 3745 3594 if (data->sio_reg_enable & 0x40) 3746 3595 fan4pin = gpok; 3747 3596 else 3748 - fan4pin = superio_inb(sioreg, 0x1C) & 0x01; 3597 + fan4pin = sio_data->sio_inb(sio_data, 0x1C) & 0x01; 3749 3598 3750 3599 if (data->sio_reg_enable & 0x20) 3751 3600 fan5pin = gpok; 3752 3601 else 3753 - fan5pin = superio_inb(sioreg, 0x1C) & 0x02; 3602 + fan5pin = sio_data->sio_inb(sio_data, 0x1C) & 0x02; 3754 3603 3755 3604 fan4min = fan4pin; 3756 3605 pwm3pin = fan3pin; 3757 3606 } else if (data->kind == nct6106) { 3758 - int cr24 = superio_inb(sioreg, 0x24); 3607 + int cr24 = sio_data->sio_inb(sio_data, 0x24); 3759 3608 3760 3609 fan3pin = !(cr24 & 0x80); 3761 3610 pwm3pin = cr24 & 0x08; 3762 3611 } else if (data->kind == nct6116) { 3763 - int cr1a = superio_inb(sioreg, 0x1a); 3764 - int cr1b = superio_inb(sioreg, 0x1b); 3765 - int cr24 = superio_inb(sioreg, 0x24); 3766 - int cr2a = superio_inb(sioreg, 0x2a); 3767 - int cr2b = superio_inb(sioreg, 0x2b); 3768 - int cr2f = superio_inb(sioreg, 0x2f); 3612 + int cr1a = sio_data->sio_inb(sio_data, 0x1a); 3613 + int cr1b = sio_data->sio_inb(sio_data, 0x1b); 3614 + int cr24 = sio_data->sio_inb(sio_data, 0x24); 3615 + int cr2a = sio_data->sio_inb(sio_data, 0x2a); 3616 + int cr2b = sio_data->sio_inb(sio_data, 0x2b); 3617 + int cr2f = sio_data->sio_inb(sio_data, 0x2f); 3769 3618 3770 3619 fan3pin = !(cr2b & 0x10); 3771 3620 fan4pin = (cr2b & 0x80) || // pin 1(2) ··· 3781 3630 * NCT6779D, NCT6791D, NCT6792D, NCT6793D, NCT6795D, NCT6796D, 3782 3631 * NCT6797D, NCT6798D 3783 3632 */ 3784 - int cr1a = superio_inb(sioreg, 0x1a); 3785 - int cr1b = superio_inb(sioreg, 0x1b); 3786 - int cr1c = superio_inb(sioreg, 0x1c); 3787 - int cr1d = superio_inb(sioreg, 0x1d); 3788 - int cr2a = superio_inb(sioreg, 0x2a); 3789 - int cr2b = superio_inb(sioreg, 0x2b); 3790 - int cr2d = superio_inb(sioreg, 0x2d); 3791 - int cr2f = superio_inb(sioreg, 0x2f); 3633 + int cr1a = sio_data->sio_inb(sio_data, 0x1a); 3634 + int cr1b = sio_data->sio_inb(sio_data, 0x1b); 3635 + int cr1c = sio_data->sio_inb(sio_data, 0x1c); 3636 + int cr1d = sio_data->sio_inb(sio_data, 0x1d); 3637 + int cr2a = sio_data->sio_inb(sio_data, 0x2a); 3638 + int cr2b = sio_data->sio_inb(sio_data, 0x2b); 3639 + int cr2d = sio_data->sio_inb(sio_data, 0x2d); 3640 + int cr2f = sio_data->sio_inb(sio_data, 0x2f); 3792 3641 bool dsw_en = cr2f & BIT(3); 3793 3642 bool ddr4_en = cr2f & BIT(4); 3794 3643 int cre0; 3795 3644 int creb; 3796 3645 int cred; 3797 3646 3798 - superio_select(sioreg, NCT6775_LD_12); 3799 - cre0 = superio_inb(sioreg, 0xe0); 3800 - creb = superio_inb(sioreg, 0xeb); 3801 - cred = superio_inb(sioreg, 0xed); 3647 + sio_data->sio_select(sio_data, NCT6775_LD_12); 3648 + cre0 = sio_data->sio_inb(sio_data, 0xe0); 3649 + creb = sio_data->sio_inb(sio_data, 0xeb); 3650 + cred = sio_data->sio_inb(sio_data, 0xed); 3802 3651 3803 3652 fan3pin = !(cr1c & BIT(5)); 3804 3653 fan4pin = !(cr1c & BIT(6)); ··· 3925 3774 3926 3775 if (!regp[i]) 3927 3776 continue; 3928 - src = nct6775_read_value(data, regp[i]); 3777 + src = data->read_value(data, regp[i]); 3929 3778 src &= 0x1f; 3930 3779 if (!src || (*mask & BIT(src))) 3931 3780 continue; ··· 3933 3782 continue; 3934 3783 3935 3784 index = __ffs(*available); 3936 - nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src); 3785 + data->write_value(data, data->REG_TEMP_SOURCE[index], src); 3937 3786 *available &= ~BIT(index); 3938 3787 *mask |= BIT(src); 3939 3788 } ··· 3956 3805 struct device *hwmon_dev; 3957 3806 int num_attr_groups = 0; 3958 3807 3959 - res = platform_get_resource(pdev, IORESOURCE_IO, 0); 3960 - if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH, 3961 - DRVNAME)) 3962 - return -EBUSY; 3808 + if (sio_data->access == access_direct) { 3809 + res = platform_get_resource(pdev, IORESOURCE_IO, 0); 3810 + if (!devm_request_region(&pdev->dev, res->start, IOREGION_LENGTH, 3811 + DRVNAME)) 3812 + return -EBUSY; 3813 + } 3963 3814 3964 3815 data = devm_kzalloc(&pdev->dev, sizeof(struct nct6775_data), 3965 3816 GFP_KERNEL); ··· 3970 3817 3971 3818 data->kind = sio_data->kind; 3972 3819 data->sioreg = sio_data->sioreg; 3973 - data->addr = res->start; 3820 + 3821 + if (sio_data->access == access_direct) { 3822 + data->addr = res->start; 3823 + data->read_value = nct6775_read_value; 3824 + data->write_value = nct6775_write_value; 3825 + } else { 3826 + data->read_value = nct6775_wmi_read_value; 3827 + data->write_value = nct6775_wmi_write_value; 3828 + } 3829 + 3974 3830 mutex_init(&data->update_lock); 3975 3831 data->name = nct6775_device_names[data->kind]; 3976 3832 data->bank = 0xff; /* Force initial bank selection */ ··· 4499 4337 if (reg_temp[i] == 0) 4500 4338 continue; 4501 4339 4502 - src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; 4340 + src = data->read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; 4503 4341 if (!src || (mask & BIT(src))) 4504 4342 available |= BIT(i); 4505 4343 ··· 4519 4357 if (reg_temp[i] == 0) 4520 4358 continue; 4521 4359 4522 - src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; 4360 + src = data->read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f; 4523 4361 if (!src || (mask & BIT(src))) 4524 4362 continue; 4525 4363 ··· 4579 4417 if (reg_temp_mon[i] == 0) 4580 4418 continue; 4581 4419 4582 - src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; 4420 + src = data->read_value(data, data->REG_TEMP_SEL[i]) & 0x1f; 4583 4421 if (!src) 4584 4422 continue; 4585 4423 ··· 4664 4502 /* Initialize the chip */ 4665 4503 nct6775_init_device(data); 4666 4504 4667 - err = superio_enter(sio_data->sioreg); 4505 + err = sio_data->sio_enter(sio_data); 4668 4506 if (err) 4669 4507 return err; 4670 4508 4671 - cr2a = superio_inb(sio_data->sioreg, 0x2a); 4509 + cr2a = sio_data->sio_inb(sio_data, 0x2a); 4672 4510 switch (data->kind) { 4673 4511 case nct6775: 4674 4512 data->have_vid = (cr2a & 0x40); ··· 4694 4532 * We can get the VID input values directly at logical device D 0xe3. 4695 4533 */ 4696 4534 if (data->have_vid) { 4697 - superio_select(sio_data->sioreg, NCT6775_LD_VID); 4698 - data->vid = superio_inb(sio_data->sioreg, 0xe3); 4535 + sio_data->sio_select(sio_data, NCT6775_LD_VID); 4536 + data->vid = sio_data->sio_inb(sio_data, 0xe3); 4699 4537 data->vrm = vid_which_vrm(); 4700 4538 } 4701 4539 4702 4540 if (fan_debounce) { 4703 4541 u8 tmp; 4704 4542 4705 - superio_select(sio_data->sioreg, NCT6775_LD_HWM); 4706 - tmp = superio_inb(sio_data->sioreg, 4707 - NCT6775_REG_CR_FAN_DEBOUNCE); 4543 + sio_data->sio_select(sio_data, NCT6775_LD_HWM); 4544 + tmp = sio_data->sio_inb(sio_data, 4545 + NCT6775_REG_CR_FAN_DEBOUNCE); 4708 4546 switch (data->kind) { 4709 4547 case nct6106: 4710 4548 case nct6116: ··· 4727 4565 tmp |= 0x7e; 4728 4566 break; 4729 4567 } 4730 - superio_outb(sio_data->sioreg, NCT6775_REG_CR_FAN_DEBOUNCE, 4568 + sio_data->sio_outb(sio_data, NCT6775_REG_CR_FAN_DEBOUNCE, 4731 4569 tmp); 4732 4570 dev_info(&pdev->dev, "Enabled fan debounce for chip %s\n", 4733 4571 data->name); 4734 4572 } 4735 4573 4736 - nct6775_check_fan_inputs(data); 4574 + nct6775_check_fan_inputs(data, sio_data); 4737 4575 4738 - superio_exit(sio_data->sioreg); 4576 + sio_data->sio_exit(sio_data); 4739 4577 4740 4578 /* Read fan clock dividers immediately */ 4741 4579 nct6775_init_fan_common(dev, data); ··· 4775 4613 return PTR_ERR_OR_ZERO(hwmon_dev); 4776 4614 } 4777 4615 4778 - static void nct6791_enable_io_mapping(int sioaddr) 4616 + static void nct6791_enable_io_mapping(struct nct6775_sio_data *sio_data) 4779 4617 { 4780 4618 int val; 4781 4619 4782 - val = superio_inb(sioaddr, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE); 4620 + val = sio_data->sio_inb(sio_data, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE); 4783 4621 if (val & 0x10) { 4784 4622 pr_info("Enabling hardware monitor logical device mappings.\n"); 4785 - superio_outb(sioaddr, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE, 4786 - val & ~0x10); 4623 + sio_data->sio_outb(sio_data, NCT6791_REG_HM_IO_SPACE_LOCK_ENABLE, 4624 + val & ~0x10); 4787 4625 } 4788 4626 } 4789 4627 ··· 4792 4630 struct nct6775_data *data = nct6775_update_device(dev); 4793 4631 4794 4632 mutex_lock(&data->update_lock); 4795 - data->vbat = nct6775_read_value(data, data->REG_VBAT); 4633 + data->vbat = data->read_value(data, data->REG_VBAT); 4796 4634 if (data->kind == nct6775) { 4797 - data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1); 4798 - data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2); 4635 + data->fandiv1 = data->read_value(data, NCT6775_REG_FANDIV1); 4636 + data->fandiv2 = data->read_value(data, NCT6775_REG_FANDIV2); 4799 4637 } 4800 4638 mutex_unlock(&data->update_lock); 4801 4639 ··· 4805 4643 static int __maybe_unused nct6775_resume(struct device *dev) 4806 4644 { 4807 4645 struct nct6775_data *data = dev_get_drvdata(dev); 4808 - int sioreg = data->sioreg; 4646 + struct nct6775_sio_data *sio_data = dev_get_platdata(dev); 4809 4647 int i, j, err = 0; 4810 4648 u8 reg; 4811 4649 4812 4650 mutex_lock(&data->update_lock); 4813 4651 data->bank = 0xff; /* Force initial bank selection */ 4814 4652 4815 - err = superio_enter(sioreg); 4653 + err = sio_data->sio_enter(sio_data); 4816 4654 if (err) 4817 4655 goto abort; 4818 4656 4819 - superio_select(sioreg, NCT6775_LD_HWM); 4820 - reg = superio_inb(sioreg, SIO_REG_ENABLE); 4657 + sio_data->sio_select(sio_data, NCT6775_LD_HWM); 4658 + reg = sio_data->sio_inb(sio_data, SIO_REG_ENABLE); 4821 4659 if (reg != data->sio_reg_enable) 4822 - superio_outb(sioreg, SIO_REG_ENABLE, data->sio_reg_enable); 4660 + sio_data->sio_outb(sio_data, SIO_REG_ENABLE, data->sio_reg_enable); 4823 4661 4824 4662 if (data->kind == nct6791 || data->kind == nct6792 || 4825 4663 data->kind == nct6793 || data->kind == nct6795 || 4826 4664 data->kind == nct6796 || data->kind == nct6797 || 4827 4665 data->kind == nct6798) 4828 - nct6791_enable_io_mapping(sioreg); 4666 + nct6791_enable_io_mapping(sio_data); 4829 4667 4830 - superio_exit(sioreg); 4668 + sio_data->sio_exit(sio_data); 4831 4669 4832 4670 /* Restore limits */ 4833 4671 for (i = 0; i < data->in_num; i++) { 4834 4672 if (!(data->have_in & BIT(i))) 4835 4673 continue; 4836 4674 4837 - nct6775_write_value(data, data->REG_IN_MINMAX[0][i], 4838 - data->in[i][1]); 4839 - nct6775_write_value(data, data->REG_IN_MINMAX[1][i], 4840 - data->in[i][2]); 4675 + data->write_value(data, data->REG_IN_MINMAX[0][i], 4676 + data->in[i][1]); 4677 + data->write_value(data, data->REG_IN_MINMAX[1][i], 4678 + data->in[i][2]); 4841 4679 } 4842 4680 4843 4681 for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) { 4844 4682 if (!(data->has_fan_min & BIT(i))) 4845 4683 continue; 4846 4684 4847 - nct6775_write_value(data, data->REG_FAN_MIN[i], 4848 - data->fan_min[i]); 4685 + data->write_value(data, data->REG_FAN_MIN[i], 4686 + data->fan_min[i]); 4849 4687 } 4850 4688 4851 4689 for (i = 0; i < NUM_TEMP; i++) { ··· 4859 4697 } 4860 4698 4861 4699 /* Restore other settings */ 4862 - nct6775_write_value(data, data->REG_VBAT, data->vbat); 4700 + data->write_value(data, data->REG_VBAT, data->vbat); 4863 4701 if (data->kind == nct6775) { 4864 - nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); 4865 - nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); 4702 + data->write_value(data, NCT6775_REG_FANDIV1, data->fandiv1); 4703 + data->write_value(data, NCT6775_REG_FANDIV2, data->fandiv2); 4866 4704 } 4867 4705 4868 4706 abort: ··· 4890 4728 int err; 4891 4729 int addr; 4892 4730 4893 - err = superio_enter(sioaddr); 4731 + sio_data->access = access_direct; 4732 + sio_data->sioreg = sioaddr; 4733 + 4734 + err = sio_data->sio_enter(sio_data); 4894 4735 if (err) 4895 4736 return err; 4896 4737 4897 - val = (superio_inb(sioaddr, SIO_REG_DEVID) << 8) | 4898 - superio_inb(sioaddr, SIO_REG_DEVID + 1); 4738 + val = (sio_data->sio_inb(sio_data, SIO_REG_DEVID) << 8) | 4739 + sio_data->sio_inb(sio_data, SIO_REG_DEVID + 1); 4899 4740 if (force_id && val != 0xffff) 4900 4741 val = force_id; 4901 4742 ··· 4942 4777 default: 4943 4778 if (val != 0xffff) 4944 4779 pr_debug("unsupported chip ID: 0x%04x\n", val); 4945 - superio_exit(sioaddr); 4780 + sio_data->sio_exit(sio_data); 4946 4781 return -ENODEV; 4947 4782 } 4948 4783 4949 4784 /* We have a known chip, find the HWM I/O address */ 4950 - superio_select(sioaddr, NCT6775_LD_HWM); 4951 - val = (superio_inb(sioaddr, SIO_REG_ADDR) << 8) 4952 - | superio_inb(sioaddr, SIO_REG_ADDR + 1); 4785 + sio_data->sio_select(sio_data, NCT6775_LD_HWM); 4786 + val = (sio_data->sio_inb(sio_data, SIO_REG_ADDR) << 8) 4787 + | sio_data->sio_inb(sio_data, SIO_REG_ADDR + 1); 4953 4788 addr = val & IOREGION_ALIGNMENT; 4954 4789 if (addr == 0) { 4955 4790 pr_err("Refusing to enable a Super-I/O device with a base I/O port 0\n"); 4956 - superio_exit(sioaddr); 4791 + sio_data->sio_exit(sio_data); 4957 4792 return -ENODEV; 4958 4793 } 4959 4794 4960 4795 /* Activate logical device if needed */ 4961 - val = superio_inb(sioaddr, SIO_REG_ENABLE); 4796 + val = sio_data->sio_inb(sio_data, SIO_REG_ENABLE); 4962 4797 if (!(val & 0x01)) { 4963 4798 pr_warn("Forcibly enabling Super-I/O. Sensor is probably unusable.\n"); 4964 - superio_outb(sioaddr, SIO_REG_ENABLE, val | 0x01); 4799 + sio_data->sio_outb(sio_data, SIO_REG_ENABLE, val | 0x01); 4965 4800 } 4966 4801 4967 4802 if (sio_data->kind == nct6791 || sio_data->kind == nct6792 || 4968 4803 sio_data->kind == nct6793 || sio_data->kind == nct6795 || 4969 4804 sio_data->kind == nct6796 || sio_data->kind == nct6797 || 4970 4805 sio_data->kind == nct6798) 4971 - nct6791_enable_io_mapping(sioaddr); 4806 + nct6791_enable_io_mapping(sio_data); 4972 4807 4973 - superio_exit(sioaddr); 4808 + sio_data->sio_exit(sio_data); 4974 4809 pr_info("Found %s or compatible chip at %#x:%#x\n", 4975 4810 nct6775_sio_names[sio_data->kind], sioaddr, addr); 4976 - sio_data->sioreg = sioaddr; 4977 4811 4978 4812 return addr; 4979 4813 } ··· 4985 4821 */ 4986 4822 static struct platform_device *pdev[2]; 4987 4823 4824 + static const char * const asus_wmi_boards[] = { 4825 + "ProArt X570-CREATOR WIFI", 4826 + "Pro WS X570-ACE", 4827 + "PRIME B360-PLUS", 4828 + "PRIME B460-PLUS", 4829 + "PRIME X570-PRO", 4830 + "ROG CROSSHAIR VIII DARK HERO", 4831 + "ROG CROSSHAIR VIII FORMULA", 4832 + "ROG CROSSHAIR VIII HERO", 4833 + "ROG CROSSHAIR VIII IMPACT", 4834 + "ROG STRIX B550-E GAMING", 4835 + "ROG STRIX B550-F GAMING", 4836 + "ROG STRIX B550-F GAMING (WI-FI)", 4837 + "ROG STRIX B550-I GAMING", 4838 + "ROG STRIX X570-F GAMING", 4839 + "ROG STRIX Z390-E GAMING", 4840 + "ROG STRIX Z490-I GAMING", 4841 + "TUF GAMING B550M-PLUS", 4842 + "TUF GAMING B550M-PLUS (WI-FI)", 4843 + "TUF GAMING B550-PLUS", 4844 + "TUF GAMING B550-PRO", 4845 + "TUF GAMING X570-PLUS", 4846 + "TUF GAMING X570-PLUS (WI-FI)", 4847 + "TUF GAMING X570-PRO (WI-FI)", 4848 + "TUF GAMING Z490-PLUS", 4849 + "TUF GAMING Z490-PLUS (WI-FI)", 4850 + }; 4851 + 4988 4852 static int __init sensors_nct6775_init(void) 4989 4853 { 4990 4854 int i, err; ··· 5021 4829 struct resource res; 5022 4830 struct nct6775_sio_data sio_data; 5023 4831 int sioaddr[2] = { 0x2e, 0x4e }; 4832 + enum sensor_access access = access_direct; 4833 + const char *board_vendor, *board_name; 4834 + u8 tmp; 5024 4835 5025 4836 err = platform_driver_register(&nct6775_driver); 5026 4837 if (err) 5027 4838 return err; 4839 + 4840 + board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); 4841 + board_name = dmi_get_system_info(DMI_BOARD_NAME); 4842 + 4843 + if (board_name && board_vendor && 4844 + !strcmp(board_vendor, "ASUSTeK COMPUTER INC.")) { 4845 + err = match_string(asus_wmi_boards, ARRAY_SIZE(asus_wmi_boards), 4846 + board_name); 4847 + if (err >= 0) { 4848 + /* if reading chip id via WMI succeeds, use WMI */ 4849 + if (!nct6775_asuswmi_read(0, NCT6775_PORT_CHIPID, &tmp)) { 4850 + pr_info("Using Asus WMI to access %#x chip.\n", tmp); 4851 + access = access_asuswmi; 4852 + } else { 4853 + pr_err("Can't read ChipID by Asus WMI.\n"); 4854 + } 4855 + } 4856 + } 5028 4857 5029 4858 /* 5030 4859 * initialize sio_data->kind and sio_data->sioreg. ··· 5055 4842 * nct6775 hardware monitor, and call probe() 5056 4843 */ 5057 4844 for (i = 0; i < ARRAY_SIZE(pdev); i++) { 4845 + sio_data.sio_outb = superio_outb; 4846 + sio_data.sio_inb = superio_inb; 4847 + sio_data.sio_select = superio_select; 4848 + sio_data.sio_enter = superio_enter; 4849 + sio_data.sio_exit = superio_exit; 4850 + 5058 4851 address = nct6775_find(sioaddr[i], &sio_data); 5059 4852 if (address <= 0) 5060 4853 continue; 5061 4854 5062 4855 found = true; 4856 + 4857 + sio_data.access = access; 4858 + 4859 + if (access == access_asuswmi) { 4860 + sio_data.sio_outb = superio_wmi_outb; 4861 + sio_data.sio_inb = superio_wmi_inb; 4862 + sio_data.sio_select = superio_wmi_select; 4863 + sio_data.sio_enter = superio_wmi_enter; 4864 + sio_data.sio_exit = superio_wmi_exit; 4865 + } 5063 4866 5064 4867 pdev[i] = platform_device_alloc(DRVNAME, address); 5065 4868 if (!pdev[i]) { ··· 5088 4859 if (err) 5089 4860 goto exit_device_put; 5090 4861 5091 - memset(&res, 0, sizeof(res)); 5092 - res.name = DRVNAME; 5093 - res.start = address + IOREGION_OFFSET; 5094 - res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; 5095 - res.flags = IORESOURCE_IO; 4862 + if (sio_data.access == access_direct) { 4863 + memset(&res, 0, sizeof(res)); 4864 + res.name = DRVNAME; 4865 + res.start = address + IOREGION_OFFSET; 4866 + res.end = address + IOREGION_OFFSET + IOREGION_LENGTH - 1; 4867 + res.flags = IORESOURCE_IO; 5096 4868 5097 - err = acpi_check_resource_conflict(&res); 5098 - if (err) { 5099 - platform_device_put(pdev[i]); 5100 - pdev[i] = NULL; 5101 - continue; 4869 + err = acpi_check_resource_conflict(&res); 4870 + if (err) { 4871 + platform_device_put(pdev[i]); 4872 + pdev[i] = NULL; 4873 + continue; 4874 + } 4875 + 4876 + err = platform_device_add_resources(pdev[i], &res, 1); 4877 + if (err) 4878 + goto exit_device_put; 5102 4879 } 5103 - 5104 - err = platform_device_add_resources(pdev[i], &res, 1); 5105 - if (err) 5106 - goto exit_device_put; 5107 4880 5108 4881 /* platform_device_add calls probe() */ 5109 4882 err = platform_device_add(pdev[i]);
+127 -4
drivers/hwmon/nct7802.c
··· 52 52 #define REG_VERSION_ID 0xff 53 53 54 54 /* 55 + * Resistance temperature detector (RTD) modes according to 7.2.32 Mode 56 + * Selection Register 57 + */ 58 + #define RTD_MODE_CURRENT 0x1 59 + #define RTD_MODE_THERMISTOR 0x2 60 + #define RTD_MODE_VOLTAGE 0x3 61 + 62 + #define MODE_RTD_MASK 0x3 63 + #define MODE_LTD_EN 0x40 64 + 65 + /* 66 + * Bit offset for sensors modes in REG_MODE. 67 + * Valid for index 0..2, indicating RTD1..3. 68 + */ 69 + #define MODE_BIT_OFFSET_RTD(index) ((index) * 2) 70 + 71 + /* 55 72 * Data structures and manipulation thereof 56 73 */ 57 74 ··· 1055 1038 .volatile_reg = nct7802_regmap_is_volatile, 1056 1039 }; 1057 1040 1058 - static int nct7802_init_chip(struct nct7802_data *data) 1041 + static int nct7802_get_channel_config(struct device *dev, 1042 + struct device_node *node, u8 *mode_mask, 1043 + u8 *mode_val) 1044 + { 1045 + u32 reg; 1046 + const char *type_str, *md_str; 1047 + u8 md; 1048 + 1049 + if (!node->name || of_node_cmp(node->name, "channel")) 1050 + return 0; 1051 + 1052 + if (of_property_read_u32(node, "reg", &reg)) { 1053 + dev_err(dev, "Could not read reg value for '%s'\n", 1054 + node->full_name); 1055 + return -EINVAL; 1056 + } 1057 + 1058 + if (reg > 3) { 1059 + dev_err(dev, "Invalid reg (%u) in '%s'\n", reg, 1060 + node->full_name); 1061 + return -EINVAL; 1062 + } 1063 + 1064 + if (reg == 0) { 1065 + if (!of_device_is_available(node)) 1066 + *mode_val &= ~MODE_LTD_EN; 1067 + else 1068 + *mode_val |= MODE_LTD_EN; 1069 + *mode_mask |= MODE_LTD_EN; 1070 + return 0; 1071 + } 1072 + 1073 + /* At this point we have reg >= 1 && reg <= 3 */ 1074 + 1075 + if (!of_device_is_available(node)) { 1076 + *mode_val &= ~(MODE_RTD_MASK << MODE_BIT_OFFSET_RTD(reg - 1)); 1077 + *mode_mask |= MODE_RTD_MASK << MODE_BIT_OFFSET_RTD(reg - 1); 1078 + return 0; 1079 + } 1080 + 1081 + if (of_property_read_string(node, "sensor-type", &type_str)) { 1082 + dev_err(dev, "No type for '%s'\n", node->full_name); 1083 + return -EINVAL; 1084 + } 1085 + 1086 + if (!strcmp(type_str, "voltage")) { 1087 + *mode_val |= (RTD_MODE_VOLTAGE & MODE_RTD_MASK) 1088 + << MODE_BIT_OFFSET_RTD(reg - 1); 1089 + *mode_mask |= MODE_RTD_MASK << MODE_BIT_OFFSET_RTD(reg - 1); 1090 + return 0; 1091 + } 1092 + 1093 + if (strcmp(type_str, "temperature")) { 1094 + dev_err(dev, "Invalid type '%s' for '%s'\n", type_str, 1095 + node->full_name); 1096 + return -EINVAL; 1097 + } 1098 + 1099 + if (reg == 3) { 1100 + /* RTD3 only supports thermistor mode */ 1101 + md = RTD_MODE_THERMISTOR; 1102 + } else { 1103 + if (of_property_read_string(node, "temperature-mode", 1104 + &md_str)) { 1105 + dev_err(dev, "No mode for '%s'\n", node->full_name); 1106 + return -EINVAL; 1107 + } 1108 + 1109 + if (!strcmp(md_str, "thermal-diode")) 1110 + md = RTD_MODE_CURRENT; 1111 + else if (!strcmp(md_str, "thermistor")) 1112 + md = RTD_MODE_THERMISTOR; 1113 + else { 1114 + dev_err(dev, "Invalid mode '%s' for '%s'\n", md_str, 1115 + node->full_name); 1116 + return -EINVAL; 1117 + } 1118 + } 1119 + 1120 + *mode_val |= (md & MODE_RTD_MASK) << MODE_BIT_OFFSET_RTD(reg - 1); 1121 + *mode_mask |= MODE_RTD_MASK << MODE_BIT_OFFSET_RTD(reg - 1); 1122 + 1123 + return 0; 1124 + } 1125 + 1126 + static int nct7802_configure_channels(struct device *dev, 1127 + struct nct7802_data *data) 1128 + { 1129 + /* Enable local temperature sensor by default */ 1130 + u8 mode_mask = MODE_LTD_EN, mode_val = MODE_LTD_EN; 1131 + struct device_node *node; 1132 + int err; 1133 + 1134 + if (dev->of_node) { 1135 + for_each_child_of_node(dev->of_node, node) { 1136 + err = nct7802_get_channel_config(dev, node, &mode_mask, 1137 + &mode_val); 1138 + if (err) { 1139 + of_node_put(node); 1140 + return err; 1141 + } 1142 + } 1143 + } 1144 + 1145 + return regmap_update_bits(data->regmap, REG_MODE, mode_mask, mode_val); 1146 + } 1147 + 1148 + static int nct7802_init_chip(struct device *dev, struct nct7802_data *data) 1059 1149 { 1060 1150 int err; 1061 1151 ··· 1171 1047 if (err) 1172 1048 return err; 1173 1049 1174 - /* Enable local temperature sensor */ 1175 - err = regmap_update_bits(data->regmap, REG_MODE, 0x40, 0x40); 1050 + err = nct7802_configure_channels(dev, data); 1176 1051 if (err) 1177 1052 return err; 1178 1053 ··· 1197 1074 mutex_init(&data->access_lock); 1198 1075 mutex_init(&data->in_alarm_lock); 1199 1076 1200 - ret = nct7802_init_chip(data); 1077 + ret = nct7802_init_chip(dev, data); 1201 1078 if (ret < 0) 1202 1079 return ret; 1203 1080
+2 -2
drivers/hwmon/pc87360.c
··· 178 178 struct device *hwmon_dev; 179 179 struct mutex lock; 180 180 struct mutex update_lock; 181 - char valid; /* !=0 if following fields are valid */ 181 + bool valid; /* true if following fields are valid */ 182 182 unsigned long last_updated; /* In jiffies */ 183 183 184 184 int address[3]; ··· 1673 1673 } 1674 1674 1675 1675 data->last_updated = jiffies; 1676 - data->valid = 1; 1676 + data->valid = true; 1677 1677 } 1678 1678 1679 1679 mutex_unlock(&data->update_lock);
+21 -2
drivers/hwmon/pmbus/ibm-cffps.c
··· 18 18 19 19 #include "pmbus.h" 20 20 21 + #define CFFPS_MFG_ID_CMD 0x99 21 22 #define CFFPS_FRU_CMD 0x9A 22 23 #define CFFPS_PN_CMD 0x9B 23 24 #define CFFPS_HEADER_CMD 0x9C ··· 35 34 #define CFFPS_INPUT_HISTORY_SIZE 100 36 35 37 36 #define CFFPS_CCIN_REVISION GENMASK(7, 0) 38 - #define CFFPS_CCIN_REVISION_LEGACY 0xde 37 + #define CFFPS_CCIN_REVISION_LEGACY 0xde 39 38 #define CFFPS_CCIN_VERSION GENMASK(15, 8) 40 39 #define CFFPS_CCIN_VERSION_1 0x2b 41 40 #define CFFPS_CCIN_VERSION_2 0x2e ··· 58 57 59 58 enum { 60 59 CFFPS_DEBUGFS_INPUT_HISTORY = 0, 60 + CFFPS_DEBUGFS_MFG_ID, 61 61 CFFPS_DEBUGFS_FRU, 62 62 CFFPS_DEBUGFS_PN, 63 63 CFFPS_DEBUGFS_HEADER, ··· 160 158 switch (idx) { 161 159 case CFFPS_DEBUGFS_INPUT_HISTORY: 162 160 return ibm_cffps_read_input_history(psu, buf, count, ppos); 161 + case CFFPS_DEBUGFS_MFG_ID: 162 + cmd = CFFPS_MFG_ID_CMD; 163 + break; 163 164 case CFFPS_DEBUGFS_FRU: 164 165 cmd = CFFPS_FRU_CMD; 165 166 break; ··· 508 503 u16 ccin_revision = 0; 509 504 u16 ccin_version = CFFPS_CCIN_VERSION_1; 510 505 int ccin = i2c_smbus_read_word_swapped(client, CFFPS_CCIN_CMD); 506 + char mfg_id[I2C_SMBUS_BLOCK_MAX + 2] = { 0 }; 511 507 512 508 if (ccin > 0) { 513 509 ccin_revision = FIELD_GET(CFFPS_CCIN_REVISION, ccin); 514 510 ccin_version = FIELD_GET(CFFPS_CCIN_VERSION, ccin); 515 511 } 516 512 513 + rc = i2c_smbus_read_block_data(client, PMBUS_MFR_ID, mfg_id); 514 + if (rc < 0) { 515 + dev_err(&client->dev, "Failed to read Manufacturer ID\n"); 516 + return rc; 517 + } 518 + 517 519 switch (ccin_version) { 518 520 default: 519 521 case CFFPS_CCIN_VERSION_1: 520 - vs = cffps1; 522 + if ((strncmp(mfg_id, "ACBE", 4) == 0) || 523 + (strncmp(mfg_id, "ARTE", 4) == 0)) 524 + vs = cffps1; 525 + else 526 + vs = cffps2; 521 527 break; 522 528 case CFFPS_CCIN_VERSION_2: 523 529 vs = cffps2; ··· 579 563 580 564 debugfs_create_file("input_history", 0444, ibm_cffps_dir, 581 565 &psu->debugfs_entries[CFFPS_DEBUGFS_INPUT_HISTORY], 566 + &ibm_cffps_fops); 567 + debugfs_create_file("mfg_id", 0444, ibm_cffps_dir, 568 + &psu->debugfs_entries[CFFPS_DEBUGFS_MFG_ID], 582 569 &ibm_cffps_fops); 583 570 debugfs_create_file("fru", 0444, ibm_cffps_dir, 584 571 &psu->debugfs_entries[CFFPS_DEBUGFS_FRU],
+70 -18
drivers/hwmon/pmbus/lm25066.c
··· 14 14 #include <linux/slab.h> 15 15 #include <linux/i2c.h> 16 16 #include <linux/log2.h> 17 + #include <linux/of_device.h> 17 18 #include "pmbus.h" 18 19 19 20 enum chips { lm25056, lm25066, lm5064, lm5066, lm5066i }; ··· 52 51 #define PSC_CURRENT_IN_L (PSC_NUM_CLASSES) 53 52 #define PSC_POWER_L (PSC_NUM_CLASSES + 1) 54 53 55 - static struct __coeff lm25066_coeff[6][PSC_NUM_CLASSES + 2] = { 54 + static const struct __coeff lm25066_coeff[][PSC_NUM_CLASSES + 2] = { 56 55 [lm25056] = { 57 56 [PSC_VOLTAGE_IN] = { 58 57 .m = 16296, 58 + .b = 1343, 59 59 .R = -2, 60 60 }, 61 61 [PSC_CURRENT_IN] = { 62 62 .m = 13797, 63 + .b = -1833, 63 64 .R = -2, 64 65 }, 65 66 [PSC_CURRENT_IN_L] = { 66 67 .m = 6726, 68 + .b = -537, 67 69 .R = -2, 68 70 }, 69 71 [PSC_POWER] = { 70 72 .m = 5501, 73 + .b = -2908, 71 74 .R = -3, 72 75 }, 73 76 [PSC_POWER_L] = { 74 77 .m = 26882, 78 + .b = -5646, 75 79 .R = -4, 76 80 }, 77 81 [PSC_TEMPERATURE] = { ··· 88 82 [lm25066] = { 89 83 [PSC_VOLTAGE_IN] = { 90 84 .m = 22070, 85 + .b = -1800, 91 86 .R = -2, 92 87 }, 93 88 [PSC_VOLTAGE_OUT] = { 94 89 .m = 22070, 90 + .b = -1800, 95 91 .R = -2, 96 92 }, 97 93 [PSC_CURRENT_IN] = { 98 94 .m = 13661, 95 + .b = -5200, 99 96 .R = -2, 100 97 }, 101 98 [PSC_CURRENT_IN_L] = { 102 - .m = 6852, 99 + .m = 6854, 100 + .b = -3100, 103 101 .R = -2, 104 102 }, 105 103 [PSC_POWER] = { 106 104 .m = 736, 105 + .b = -3300, 107 106 .R = -2, 108 107 }, 109 108 [PSC_POWER_L] = { 110 109 .m = 369, 110 + .b = -1900, 111 111 .R = -2, 112 112 }, 113 113 [PSC_TEMPERATURE] = { ··· 123 111 [lm5064] = { 124 112 [PSC_VOLTAGE_IN] = { 125 113 .m = 4611, 114 + .b = -642, 126 115 .R = -2, 127 116 }, 128 117 [PSC_VOLTAGE_OUT] = { 129 118 .m = 4621, 119 + .b = 423, 130 120 .R = -2, 131 121 }, 132 122 [PSC_CURRENT_IN] = { 133 123 .m = 10742, 124 + .b = 1552, 134 125 .R = -2, 135 126 }, 136 127 [PSC_CURRENT_IN_L] = { 137 128 .m = 5456, 129 + .b = 2118, 138 130 .R = -2, 139 131 }, 140 132 [PSC_POWER] = { 141 133 .m = 1204, 134 + .b = 8524, 142 135 .R = -3, 143 136 }, 144 137 [PSC_POWER_L] = { 145 138 .m = 612, 139 + .b = 11202, 146 140 .R = -3, 147 141 }, 148 142 [PSC_TEMPERATURE] = { ··· 158 140 [lm5066] = { 159 141 [PSC_VOLTAGE_IN] = { 160 142 .m = 4587, 143 + .b = -1200, 161 144 .R = -2, 162 145 }, 163 146 [PSC_VOLTAGE_OUT] = { 164 147 .m = 4587, 148 + .b = -2400, 165 149 .R = -2, 166 150 }, 167 151 [PSC_CURRENT_IN] = { 168 152 .m = 10753, 153 + .b = -1200, 169 154 .R = -2, 170 155 }, 171 156 [PSC_CURRENT_IN_L] = { 172 157 .m = 5405, 158 + .b = -600, 173 159 .R = -2, 174 160 }, 175 161 [PSC_POWER] = { 176 162 .m = 1204, 163 + .b = -6000, 177 164 .R = -3, 178 165 }, 179 166 [PSC_POWER_L] = { 180 167 .m = 605, 168 + .b = -8000, 181 169 .R = -3, 182 170 }, 183 171 [PSC_TEMPERATURE] = { ··· 234 210 }; 235 211 236 212 #define to_lm25066_data(x) container_of(x, struct lm25066_data, info) 237 - 238 - static const struct i2c_device_id lm25066_id[]; 239 213 240 214 static int lm25066_read_word_data(struct i2c_client *client, int page, 241 215 int phase, int reg) ··· 435 413 return ret; 436 414 } 437 415 416 + static const struct i2c_device_id lm25066_id[] = { 417 + {"lm25056", lm25056}, 418 + {"lm25066", lm25066}, 419 + {"lm5064", lm5064}, 420 + {"lm5066", lm5066}, 421 + {"lm5066i", lm5066i}, 422 + { } 423 + }; 424 + MODULE_DEVICE_TABLE(i2c, lm25066_id); 425 + 426 + static const struct of_device_id __maybe_unused lm25066_of_match[] = { 427 + { .compatible = "ti,lm25056", .data = (void *)lm25056, }, 428 + { .compatible = "ti,lm25066", .data = (void *)lm25066, }, 429 + { .compatible = "ti,lm5064", .data = (void *)lm5064, }, 430 + { .compatible = "ti,lm5066", .data = (void *)lm5066, }, 431 + { .compatible = "ti,lm5066i", .data = (void *)lm5066i, }, 432 + { }, 433 + }; 434 + MODULE_DEVICE_TABLE(of, lm25066_of_match); 435 + 438 436 static int lm25066_probe(struct i2c_client *client) 439 437 { 440 438 int config; 439 + u32 shunt; 441 440 struct lm25066_data *data; 442 441 struct pmbus_driver_info *info; 443 - struct __coeff *coeff; 442 + const struct __coeff *coeff; 443 + const struct of_device_id *of_id; 444 + const struct i2c_device_id *i2c_id; 444 445 445 446 if (!i2c_check_functionality(client->adapter, 446 447 I2C_FUNC_SMBUS_READ_BYTE_DATA)) ··· 478 433 if (config < 0) 479 434 return config; 480 435 481 - data->id = i2c_match_id(lm25066_id, client)->driver_data; 436 + i2c_id = i2c_match_id(lm25066_id, client); 437 + 438 + of_id = of_match_device(lm25066_of_match, &client->dev); 439 + if (of_id && (unsigned long)of_id->data != i2c_id->driver_data) 440 + dev_notice(&client->dev, "Device mismatch: %s in device tree, %s detected\n", 441 + of_id->name, i2c_id->name); 442 + 443 + data->id = i2c_id->driver_data; 482 444 info = &data->info; 483 445 484 446 info->pages = 1; ··· 535 483 info->b[PSC_POWER] = coeff[PSC_POWER].b; 536 484 } 537 485 486 + /* 487 + * Values in the TI datasheets are normalized for a 1mOhm sense 488 + * resistor; assume that unless DT specifies a value explicitly. 489 + */ 490 + if (of_property_read_u32(client->dev.of_node, "shunt-resistor-micro-ohms", &shunt)) 491 + shunt = 1000; 492 + 493 + info->m[PSC_CURRENT_IN] = info->m[PSC_CURRENT_IN] * shunt / 1000; 494 + info->m[PSC_POWER] = info->m[PSC_POWER] * shunt / 1000; 495 + 538 496 return pmbus_do_probe(client, info); 539 497 } 540 - 541 - static const struct i2c_device_id lm25066_id[] = { 542 - {"lm25056", lm25056}, 543 - {"lm25066", lm25066}, 544 - {"lm5064", lm5064}, 545 - {"lm5066", lm5066}, 546 - {"lm5066i", lm5066i}, 547 - { } 548 - }; 549 - 550 - MODULE_DEVICE_TABLE(i2c, lm25066_id); 551 498 552 499 /* This is the driver that will be inserted */ 553 500 static struct i2c_driver lm25066_driver = { 554 501 .driver = { 555 502 .name = "lm25066", 556 - }, 503 + .of_match_table = of_match_ptr(lm25066_of_match), 504 + }, 557 505 .probe_new = lm25066_probe, 558 506 .id_table = lm25066_id, 559 507 };
+1 -1
drivers/hwmon/raspberrypi-hwmon.c
··· 53 53 else 54 54 dev_info(data->hwmon_dev, "Voltage normalised\n"); 55 55 56 - sysfs_notify(&data->hwmon_dev->kobj, NULL, "in0_lcrit_alarm"); 56 + hwmon_notify_event(data->hwmon_dev, hwmon_in, hwmon_in_lcrit_alarm, 0); 57 57 } 58 58 59 59 static void get_values_poll(struct work_struct *work)
+2 -2
drivers/hwmon/sch5636.c
··· 56 56 struct device *hwmon_dev; 57 57 58 58 struct mutex update_lock; 59 - char valid; /* !=0 if following fields are valid */ 59 + bool valid; /* true if following fields are valid */ 60 60 unsigned long last_updated; /* In jiffies */ 61 61 u8 in[SCH5636_NO_INS]; 62 62 u8 temp_val[SCH5636_NO_TEMPS]; ··· 140 140 } 141 141 142 142 data->last_updated = jiffies; 143 - data->valid = 1; 143 + data->valid = true; 144 144 abort: 145 145 mutex_unlock(&data->update_lock); 146 146 return ret;
+2 -2
drivers/hwmon/sht21.c
··· 41 41 unsigned long last_update; 42 42 int temperature; 43 43 int humidity; 44 - char valid; 44 + bool valid; 45 45 char eic[18]; 46 46 }; 47 47 ··· 105 105 goto out; 106 106 sht21->humidity = sht21_rh_ticks_to_per_cent_mille(ret); 107 107 sht21->last_update = jiffies; 108 - sht21->valid = 1; 108 + sht21->valid = true; 109 109 } 110 110 out: 111 111 mutex_unlock(&sht21->lock);
+2 -2
drivers/hwmon/sis5595.c
··· 172 172 struct mutex lock; 173 173 174 174 struct mutex update_lock; 175 - char valid; /* !=0 if following fields are valid */ 175 + bool valid; /* true if following fields are valid */ 176 176 unsigned long last_updated; /* In jiffies */ 177 177 char maxins; /* == 3 if temp enabled, otherwise == 4 */ 178 178 u8 revision; /* Reg. value */ ··· 728 728 sis5595_read_value(data, SIS5595_REG_ALARM1) | 729 729 (sis5595_read_value(data, SIS5595_REG_ALARM2) << 8); 730 730 data->last_updated = jiffies; 731 - data->valid = 1; 731 + data->valid = true; 732 732 } 733 733 734 734 mutex_unlock(&data->update_lock);
+1 -1
drivers/hwmon/smm665.c
··· 265 265 data->adc[i] = val; 266 266 } 267 267 data->last_updated = jiffies; 268 - data->valid = 1; 268 + data->valid = true; 269 269 } 270 270 abort: 271 271 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/smsc47b397.c
··· 96 96 97 97 struct mutex update_lock; 98 98 unsigned long last_updated; /* in jiffies */ 99 - int valid; 99 + bool valid; 100 100 101 101 /* register values */ 102 102 u16 fan[4]; ··· 137 137 } 138 138 139 139 data->last_updated = jiffies; 140 - data->valid = 1; 140 + data->valid = true; 141 141 142 142 dev_dbg(dev, "... device update complete\n"); 143 143 }
+2 -2
drivers/hwmon/smsc47m192.c
··· 86 86 struct i2c_client *client; 87 87 const struct attribute_group *groups[3]; 88 88 struct mutex update_lock; 89 - char valid; /* !=0 if following fields are valid */ 89 + bool valid; /* true if following fields are valid */ 90 90 unsigned long last_updated; /* In jiffies */ 91 91 92 92 u8 in[8]; /* Register value */ ··· 157 157 SMSC47M192_REG_ALARM2) << 8); 158 158 159 159 data->last_updated = jiffies; 160 - data->valid = 1; 160 + data->valid = true; 161 161 } 162 162 163 163 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/thmc50.c
··· 62 62 enum chips type; 63 63 unsigned long last_updated; /* In jiffies */ 64 64 char has_temp3; /* !=0 if it is ADM1022 in temp3 mode */ 65 - char valid; /* !=0 if following fields are valid */ 65 + bool valid; /* true if following fields are valid */ 66 66 67 67 /* Register values */ 68 68 s8 temp_input[3]; ··· 107 107 data->alarms = 108 108 i2c_smbus_read_byte_data(client, THMC50_REG_INTR); 109 109 data->last_updated = jiffies; 110 - data->valid = 1; 110 + data->valid = true; 111 111 } 112 112 113 113 mutex_unlock(&data->update_lock);
+73 -30
drivers/hwmon/tmp103.c
··· 51 51 return DIV_ROUND_CLOSEST(val, 1000); 52 52 } 53 53 54 - static ssize_t tmp103_temp_show(struct device *dev, 55 - struct device_attribute *attr, char *buf) 54 + static int tmp103_read(struct device *dev, enum hwmon_sensor_types type, 55 + u32 attr, int channel, long *temp) 56 56 { 57 - struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 58 57 struct regmap *regmap = dev_get_drvdata(dev); 59 58 unsigned int regval; 60 - int ret; 59 + int err, reg; 61 60 62 - ret = regmap_read(regmap, sda->index, &regval); 63 - if (ret < 0) 64 - return ret; 61 + switch (attr) { 62 + case hwmon_temp_input: 63 + reg = TMP103_TEMP_REG; 64 + break; 65 + case hwmon_temp_min: 66 + reg = TMP103_TLOW_REG; 67 + break; 68 + case hwmon_temp_max: 69 + reg = TMP103_THIGH_REG; 70 + break; 71 + default: 72 + return -EOPNOTSUPP; 73 + } 65 74 66 - return sprintf(buf, "%d\n", tmp103_reg_to_mc(regval)); 75 + err = regmap_read(regmap, reg, &regval); 76 + if (err < 0) 77 + return err; 78 + 79 + *temp = tmp103_reg_to_mc(regval); 80 + 81 + return 0; 67 82 } 68 83 69 - static ssize_t tmp103_temp_store(struct device *dev, 70 - struct device_attribute *attr, 71 - const char *buf, size_t count) 84 + static int tmp103_write(struct device *dev, enum hwmon_sensor_types type, 85 + u32 attr, int channel, long temp) 72 86 { 73 - struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); 74 87 struct regmap *regmap = dev_get_drvdata(dev); 75 - long val; 76 - int ret; 88 + int reg; 77 89 78 - if (kstrtol(buf, 10, &val) < 0) 79 - return -EINVAL; 90 + switch (attr) { 91 + case hwmon_temp_min: 92 + reg = TMP103_TLOW_REG; 93 + break; 94 + case hwmon_temp_max: 95 + reg = TMP103_THIGH_REG; 96 + break; 97 + default: 98 + return -EOPNOTSUPP; 99 + } 80 100 81 - val = clamp_val(val, -55000, 127000); 82 - ret = regmap_write(regmap, sda->index, tmp103_mc_to_reg(val)); 83 - return ret ? ret : count; 101 + temp = clamp_val(temp, -55000, 127000); 102 + return regmap_write(regmap, reg, tmp103_mc_to_reg(temp)); 84 103 } 85 104 86 - static SENSOR_DEVICE_ATTR_RO(temp1_input, tmp103_temp, TMP103_TEMP_REG); 105 + static umode_t tmp103_is_visible(const void *data, enum hwmon_sensor_types type, 106 + u32 attr, int channel) 107 + { 108 + if (type != hwmon_temp) 109 + return 0; 87 110 88 - static SENSOR_DEVICE_ATTR_RW(temp1_min, tmp103_temp, TMP103_TLOW_REG); 111 + switch (attr) { 112 + case hwmon_temp_input: 113 + return 0444; 114 + case hwmon_temp_min: 115 + case hwmon_temp_max: 116 + return 0644; 117 + default: 118 + return 0; 119 + } 120 + } 89 121 90 - static SENSOR_DEVICE_ATTR_RW(temp1_max, tmp103_temp, TMP103_THIGH_REG); 91 - 92 - static struct attribute *tmp103_attrs[] = { 93 - &sensor_dev_attr_temp1_input.dev_attr.attr, 94 - &sensor_dev_attr_temp1_min.dev_attr.attr, 95 - &sensor_dev_attr_temp1_max.dev_attr.attr, 122 + static const struct hwmon_channel_info *tmp103_info[] = { 123 + HWMON_CHANNEL_INFO(chip, 124 + HWMON_C_REGISTER_TZ), 125 + HWMON_CHANNEL_INFO(temp, 126 + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_MIN), 96 127 NULL 97 128 }; 98 - ATTRIBUTE_GROUPS(tmp103); 129 + 130 + static const struct hwmon_ops tmp103_hwmon_ops = { 131 + .is_visible = tmp103_is_visible, 132 + .read = tmp103_read, 133 + .write = tmp103_write, 134 + }; 135 + 136 + static const struct hwmon_chip_info tmp103_chip_info = { 137 + .ops = &tmp103_hwmon_ops, 138 + .info = tmp103_info, 139 + }; 99 140 100 141 static bool tmp103_regmap_is_volatile(struct device *dev, unsigned int reg) 101 142 { ··· 171 130 } 172 131 173 132 i2c_set_clientdata(client, regmap); 174 - hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 175 - regmap, tmp103_groups); 133 + hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, 134 + regmap, 135 + &tmp103_chip_info, 136 + NULL); 176 137 return PTR_ERR_OR_ZERO(hwmon_dev); 177 138 } 178 139
+5 -26
drivers/hwmon/tmp401.c
··· 34 34 static const unsigned short normal_i2c[] = { 0x48, 0x49, 0x4a, 0x4c, 0x4d, 35 35 0x4e, 0x4f, I2C_CLIENT_END }; 36 36 37 - enum chips { tmp401, tmp411, tmp431, tmp432, tmp435, tmp461 }; 37 + enum chips { tmp401, tmp411, tmp431, tmp432, tmp435 }; 38 38 39 39 /* 40 40 * The TMP401 registers, note some registers have different addresses for ··· 56 56 { 0x20, 0x19 }, /* therm (crit) limit */ 57 57 { 0x30, 0x34 }, /* lowest */ 58 58 { 0x32, 0x36 }, /* highest */ 59 - { 0, 0x11 }, /* offset */ 60 59 }; 61 60 62 61 static const u8 TMP401_TEMP_MSB_WRITE[7][2] = { ··· 65 66 { 0x20, 0x19 }, /* therm (crit) limit */ 66 67 { 0x30, 0x34 }, /* lowest */ 67 68 { 0x32, 0x36 }, /* highest */ 68 - { 0, 0x11 }, /* offset */ 69 69 }; 70 70 71 71 static const u8 TMP432_TEMP_MSB_READ[4][3] = { ··· 121 123 { "tmp431", tmp431 }, 122 124 { "tmp432", tmp432 }, 123 125 { "tmp435", tmp435 }, 124 - { "tmp461", tmp461 }, 125 126 { } 126 127 }; 127 128 MODULE_DEVICE_TABLE(i2c, tmp401_id); ··· 133 136 struct i2c_client *client; 134 137 const struct attribute_group *groups[3]; 135 138 struct mutex update_lock; 136 - char valid; /* zero until following fields are valid */ 139 + bool valid; /* false until following fields are valid */ 137 140 unsigned long last_updated; /* in jiffies */ 138 141 enum chips kind; 139 142 ··· 264 267 data->temp_crit_hyst = val; 265 268 266 269 data->last_updated = jiffies; 267 - data->valid = 1; 270 + data->valid = true; 268 271 } 269 272 270 273 abort: ··· 410 413 } 411 414 mutex_lock(&data->update_lock); 412 415 i2c_smbus_write_byte_data(client, TMP401_TEMP_MSB_WRITE[5][0], val); 413 - data->valid = 0; 416 + data->valid = false; 414 417 mutex_unlock(&data->update_lock); 415 418 416 419 return count; ··· 568 571 }; 569 572 570 573 /* 571 - * Additional features of the TMP461 chip. 572 - * The TMP461 temperature offset for the remote channel. 573 - */ 574 - static SENSOR_DEVICE_ATTR_2_RW(temp2_offset, temp, 6, 1); 575 - 576 - static struct attribute *tmp461_attributes[] = { 577 - &sensor_dev_attr_temp2_offset.dev_attr.attr, 578 - NULL 579 - }; 580 - 581 - static const struct attribute_group tmp461_group = { 582 - .attrs = tmp461_attributes, 583 - }; 584 - 585 - /* 586 574 * Begin non sysfs callback code (aka Real code) 587 575 */ 588 576 ··· 668 686 static int tmp401_probe(struct i2c_client *client) 669 687 { 670 688 static const char * const names[] = { 671 - "TMP401", "TMP411", "TMP431", "TMP432", "TMP435", "TMP461" 689 + "TMP401", "TMP411", "TMP431", "TMP432", "TMP435" 672 690 }; 673 691 struct device *dev = &client->dev; 674 692 struct device *hwmon_dev; ··· 698 716 /* Register additional tmp432 sysfs hooks */ 699 717 if (data->kind == tmp432) 700 718 data->groups[groups++] = &tmp432_group; 701 - 702 - if (data->kind == tmp461) 703 - data->groups[groups++] = &tmp461_group; 704 719 705 720 hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name, 706 721 data, data->groups);
+170 -16
drivers/hwmon/tmp421.c
··· 29 29 30 30 enum chips { tmp421, tmp422, tmp423, tmp441, tmp442 }; 31 31 32 + #define MAX_CHANNELS 4 32 33 /* The TMP421 registers */ 33 34 #define TMP421_STATUS_REG 0x08 34 35 #define TMP421_CONFIG_REG_1 0x09 36 + #define TMP421_CONFIG_REG_2 0x0A 37 + #define TMP421_CONFIG_REG_REN(x) (BIT(3 + (x))) 38 + #define TMP421_CONFIG_REG_REN_MASK GENMASK(6, 3) 35 39 #define TMP421_CONVERSION_RATE_REG 0x0B 40 + #define TMP421_N_FACTOR_REG_1 0x21 36 41 #define TMP421_MANUFACTURER_ID_REG 0xFE 37 42 #define TMP421_DEVICE_ID_REG 0xFF 38 43 39 - static const u8 TMP421_TEMP_MSB[4] = { 0x00, 0x01, 0x02, 0x03 }; 40 - static const u8 TMP421_TEMP_LSB[4] = { 0x10, 0x11, 0x12, 0x13 }; 44 + static const u8 TMP421_TEMP_MSB[MAX_CHANNELS] = { 0x00, 0x01, 0x02, 0x03 }; 45 + static const u8 TMP421_TEMP_LSB[MAX_CHANNELS] = { 0x10, 0x11, 0x12, 0x13 }; 41 46 42 47 /* Flags */ 43 48 #define TMP421_CONFIG_SHUTDOWN 0x40 ··· 91 86 }; 92 87 MODULE_DEVICE_TABLE(of, tmp421_of_match); 93 88 89 + struct tmp421_channel { 90 + const char *label; 91 + bool enabled; 92 + s16 temp; 93 + }; 94 + 94 95 struct tmp421_data { 95 96 struct i2c_client *client; 96 97 struct mutex update_lock; 97 - u32 temp_config[5]; 98 + u32 temp_config[MAX_CHANNELS + 1]; 98 99 struct hwmon_channel_info temp_info; 99 100 const struct hwmon_channel_info *info[2]; 100 101 struct hwmon_chip_info chip; 101 - char valid; 102 + bool valid; 102 103 unsigned long last_updated; 103 104 unsigned long channels; 104 105 u8 config; 105 - s16 temp[4]; 106 + struct tmp421_channel channel[MAX_CHANNELS]; 106 107 }; 107 108 108 109 static int temp_from_raw(u16 reg, bool extended) ··· 143 132 ret = i2c_smbus_read_byte_data(client, TMP421_TEMP_MSB[i]); 144 133 if (ret < 0) 145 134 goto exit; 146 - data->temp[i] = ret << 8; 135 + data->channel[i].temp = ret << 8; 147 136 148 137 ret = i2c_smbus_read_byte_data(client, TMP421_TEMP_LSB[i]); 149 138 if (ret < 0) 150 139 goto exit; 151 - data->temp[i] |= ret; 140 + data->channel[i].temp |= ret; 152 141 } 153 142 data->last_updated = jiffies; 154 - data->valid = 1; 143 + data->valid = true; 155 144 } 156 145 157 146 exit: 158 147 mutex_unlock(&data->update_lock); 159 148 160 149 if (ret < 0) { 161 - data->valid = 0; 150 + data->valid = false; 162 151 return ret; 163 152 } 164 153 165 154 return 0; 155 + } 156 + 157 + static int tmp421_enable_channels(struct tmp421_data *data) 158 + { 159 + int err; 160 + struct i2c_client *client = data->client; 161 + struct device *dev = &client->dev; 162 + int old = i2c_smbus_read_byte_data(client, TMP421_CONFIG_REG_2); 163 + int new, i; 164 + 165 + if (old < 0) { 166 + dev_err(dev, "error reading register, can't disable channels\n"); 167 + return old; 168 + } 169 + 170 + new = old & ~TMP421_CONFIG_REG_REN_MASK; 171 + for (i = 0; i < data->channels; i++) 172 + if (data->channel[i].enabled) 173 + new |= TMP421_CONFIG_REG_REN(i); 174 + 175 + if (new == old) 176 + return 0; 177 + 178 + err = i2c_smbus_write_byte_data(client, TMP421_CONFIG_REG_2, new); 179 + if (err < 0) 180 + dev_err(dev, "error writing register, can't disable channels\n"); 181 + 182 + return err; 166 183 } 167 184 168 185 static int tmp421_read(struct device *dev, enum hwmon_sensor_types type, ··· 205 166 206 167 switch (attr) { 207 168 case hwmon_temp_input: 208 - *val = temp_from_raw(tmp421->temp[channel], 169 + if (!tmp421->channel[channel].enabled) 170 + return -ENODATA; 171 + *val = temp_from_raw(tmp421->channel[channel].temp, 209 172 tmp421->config & TMP421_CONFIG_RANGE); 210 173 return 0; 211 174 case hwmon_temp_fault: 175 + if (!tmp421->channel[channel].enabled) 176 + return -ENODATA; 212 177 /* 213 178 * Any of OPEN or /PVLD bits indicate a hardware mulfunction 214 179 * and the conversion result may be incorrect 215 180 */ 216 - *val = !!(tmp421->temp[channel] & 0x03); 181 + *val = !!(tmp421->channel[channel].temp & 0x03); 182 + return 0; 183 + case hwmon_temp_enable: 184 + *val = tmp421->channel[channel].enabled; 217 185 return 0; 218 186 default: 219 187 return -EOPNOTSUPP; 220 188 } 221 189 190 + } 191 + 192 + static int tmp421_read_string(struct device *dev, enum hwmon_sensor_types type, 193 + u32 attr, int channel, const char **str) 194 + { 195 + struct tmp421_data *data = dev_get_drvdata(dev); 196 + 197 + *str = data->channel[channel].label; 198 + 199 + return 0; 200 + } 201 + 202 + static int tmp421_write(struct device *dev, enum hwmon_sensor_types type, 203 + u32 attr, int channel, long val) 204 + { 205 + struct tmp421_data *data = dev_get_drvdata(dev); 206 + int ret; 207 + 208 + switch (attr) { 209 + case hwmon_temp_enable: 210 + data->channel[channel].enabled = val; 211 + ret = tmp421_enable_channels(data); 212 + break; 213 + default: 214 + ret = -EOPNOTSUPP; 215 + } 216 + 217 + return ret; 222 218 } 223 219 224 220 static umode_t tmp421_is_visible(const void *data, enum hwmon_sensor_types type, ··· 263 189 case hwmon_temp_fault: 264 190 case hwmon_temp_input: 265 191 return 0444; 192 + case hwmon_temp_label: 193 + return 0444; 194 + case hwmon_temp_enable: 195 + return 0644; 266 196 default: 267 197 return 0; 268 198 } 269 199 } 270 200 271 - static int tmp421_init_client(struct i2c_client *client) 201 + static int tmp421_init_client(struct tmp421_data *data) 272 202 { 273 203 int config, config_orig; 204 + struct i2c_client *client = data->client; 274 205 275 206 /* Set the conversion rate to 2 Hz */ 276 207 i2c_smbus_write_byte_data(client, TMP421_CONVERSION_RATE_REG, 0x05); ··· 296 217 i2c_smbus_write_byte_data(client, TMP421_CONFIG_REG_1, config); 297 218 } 298 219 299 - return 0; 220 + return tmp421_enable_channels(data); 300 221 } 301 222 302 223 static int tmp421_detect(struct i2c_client *client, ··· 360 281 return 0; 361 282 } 362 283 284 + static int tmp421_probe_child_from_dt(struct i2c_client *client, 285 + struct device_node *child, 286 + struct tmp421_data *data) 287 + 288 + { 289 + struct device *dev = &client->dev; 290 + u32 i; 291 + s32 val; 292 + int err; 293 + 294 + err = of_property_read_u32(child, "reg", &i); 295 + if (err) { 296 + dev_err(dev, "missing reg property of %pOFn\n", child); 297 + return err; 298 + } 299 + 300 + if (i >= data->channels) { 301 + dev_err(dev, "invalid reg %d of %pOFn\n", i, child); 302 + return -EINVAL; 303 + } 304 + 305 + of_property_read_string(child, "label", &data->channel[i].label); 306 + if (data->channel[i].label) 307 + data->temp_config[i] |= HWMON_T_LABEL; 308 + 309 + data->channel[i].enabled = of_device_is_available(child); 310 + 311 + err = of_property_read_s32(child, "ti,n-factor", &val); 312 + if (!err) { 313 + if (i == 0) { 314 + dev_err(dev, "n-factor can't be set for internal channel\n"); 315 + return -EINVAL; 316 + } 317 + 318 + if (val > 127 || val < -128) { 319 + dev_err(dev, "n-factor for channel %d invalid (%d)\n", 320 + i, val); 321 + return -EINVAL; 322 + } 323 + i2c_smbus_write_byte_data(client, TMP421_N_FACTOR_REG_1 + i - 1, 324 + val); 325 + } 326 + 327 + return 0; 328 + } 329 + 330 + static int tmp421_probe_from_dt(struct i2c_client *client, struct tmp421_data *data) 331 + { 332 + struct device *dev = &client->dev; 333 + const struct device_node *np = dev->of_node; 334 + struct device_node *child; 335 + int err; 336 + 337 + for_each_child_of_node(np, child) { 338 + if (strcmp(child->name, "channel")) 339 + continue; 340 + 341 + err = tmp421_probe_child_from_dt(client, child, data); 342 + if (err) { 343 + of_node_put(child); 344 + return err; 345 + } 346 + } 347 + 348 + return 0; 349 + } 350 + 363 351 static const struct hwmon_ops tmp421_ops = { 364 352 .is_visible = tmp421_is_visible, 365 353 .read = tmp421_read, 354 + .read_string = tmp421_read_string, 355 + .write = tmp421_write, 366 356 }; 367 357 368 358 static int tmp421_probe(struct i2c_client *client) ··· 453 305 data->channels = i2c_match_id(tmp421_id, client)->driver_data; 454 306 data->client = client; 455 307 456 - err = tmp421_init_client(client); 308 + for (i = 0; i < data->channels; i++) { 309 + data->temp_config[i] = HWMON_T_INPUT | HWMON_T_FAULT | HWMON_T_ENABLE; 310 + data->channel[i].enabled = true; 311 + } 312 + 313 + err = tmp421_probe_from_dt(client, data); 457 314 if (err) 458 315 return err; 459 316 460 - for (i = 0; i < data->channels; i++) 461 - data->temp_config[i] = HWMON_T_INPUT | HWMON_T_FAULT; 317 + err = tmp421_init_client(data); 318 + if (err) 319 + return err; 462 320 463 321 data->chip.ops = &tmp421_ops; 464 322 data->chip.info = data->info;
+2 -2
drivers/hwmon/via686a.c
··· 304 304 const char *name; 305 305 struct device *hwmon_dev; 306 306 struct mutex update_lock; 307 - char valid; /* !=0 if following fields are valid */ 307 + bool valid; /* true if following fields are valid */ 308 308 unsigned long last_updated; /* In jiffies */ 309 309 310 310 u8 in[5]; /* Register value */ ··· 800 800 VIA686A_REG_ALARM1) | 801 801 (via686a_read_value(data, VIA686A_REG_ALARM2) << 8); 802 802 data->last_updated = jiffies; 803 - data->valid = 1; 803 + data->valid = true; 804 804 } 805 805 806 806 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/vt1211.c
··· 105 105 struct device *hwmon_dev; 106 106 107 107 struct mutex update_lock; 108 - char valid; /* !=0 if following fields are valid */ 108 + bool valid; /* true if following fields are valid */ 109 109 unsigned long last_updated; /* In jiffies */ 110 110 111 111 /* Register values */ ··· 319 319 vt1211_read8(data, VT1211_REG_ALARM1); 320 320 321 321 data->last_updated = jiffies; 322 - data->valid = 1; 322 + data->valid = true; 323 323 } 324 324 325 325 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/vt8231.c
··· 145 145 146 146 struct mutex update_lock; 147 147 struct device *hwmon_dev; 148 - char valid; /* !=0 if following fields are valid */ 148 + bool valid; /* true if following fields are valid */ 149 149 unsigned long last_updated; /* In jiffies */ 150 150 151 151 u8 in[6]; /* Register value */ ··· 929 929 data->alarms &= ~0x80; 930 930 931 931 data->last_updated = jiffies; 932 - data->valid = 1; 932 + data->valid = true; 933 933 } 934 934 935 935 mutex_unlock(&data->update_lock);
+4 -4
drivers/hwmon/w83627ehf.c
··· 320 320 const u16 *scale_in; 321 321 322 322 struct mutex update_lock; 323 - char valid; /* !=0 if following fields are valid */ 323 + bool valid; /* true if following fields are valid */ 324 324 unsigned long last_updated; /* In jiffies */ 325 325 326 326 /* Register values */ ··· 688 688 W83627EHF_REG_CASEOPEN_DET); 689 689 690 690 data->last_updated = jiffies; 691 - data->valid = 1; 691 + data->valid = true; 692 692 } 693 693 694 694 mutex_unlock(&data->update_lock); ··· 1099 1099 reg = w83627ehf_read_value(data, W83627EHF_REG_CASEOPEN_CLR); 1100 1100 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg | mask); 1101 1101 w83627ehf_write_value(data, W83627EHF_REG_CASEOPEN_CLR, reg & ~mask); 1102 - data->valid = 0; /* Force cache refresh */ 1102 + data->valid = false; /* Force cache refresh */ 1103 1103 mutex_unlock(&data->update_lock); 1104 1104 1105 1105 return 0; ··· 2004 2004 w83627ehf_write_value(data, W83627EHF_REG_VBAT, data->vbat); 2005 2005 2006 2006 /* Force re-reading all values */ 2007 - data->valid = 0; 2007 + data->valid = false; 2008 2008 mutex_unlock(&data->update_lock); 2009 2009 2010 2010 return 0;
+3 -3
drivers/hwmon/w83627hf.c
··· 355 355 enum chips type; 356 356 357 357 struct mutex update_lock; 358 - char valid; /* !=0 if following fields are valid */ 358 + bool valid; /* true if following fields are valid */ 359 359 unsigned long last_updated; /* In jiffies */ 360 360 361 361 u8 in[9]; /* Register value */ ··· 448 448 w83627hf_write_value(data, W83781D_REG_SCFG2, data->scfg2); 449 449 450 450 /* Force re-reading all values */ 451 - data->valid = 0; 451 + data->valid = false; 452 452 mutex_unlock(&data->update_lock); 453 453 454 454 return 0; ··· 1905 1905 w83627hf_read_value(data, W83781D_REG_BEEP_INTS1) | 1906 1906 w83627hf_read_value(data, W83781D_REG_BEEP_INTS3) << 16; 1907 1907 data->last_updated = jiffies; 1908 - data->valid = 1; 1908 + data->valid = true; 1909 1909 } 1910 1910 1911 1911 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/w83781d.c
··· 203 203 int isa_addr; 204 204 205 205 struct mutex update_lock; 206 - char valid; /* !=0 if following fields are valid */ 206 + bool valid; /* true if following fields are valid */ 207 207 unsigned long last_updated; /* In jiffies */ 208 208 209 209 struct i2c_client *lm75[2]; /* for secondary I2C addresses */ ··· 1554 1554 W83781D_REG_BEEP_INTS3) << 16; 1555 1555 } 1556 1556 data->last_updated = jiffies; 1557 - data->valid = 1; 1557 + data->valid = true; 1558 1558 } 1559 1559 1560 1560 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/w83791d.c
··· 270 270 struct device *hwmon_dev; 271 271 struct mutex update_lock; 272 272 273 - char valid; /* !=0 if following fields are valid */ 273 + bool valid; /* true if following fields are valid */ 274 274 unsigned long last_updated; /* In jiffies */ 275 275 276 276 /* volts */ ··· 1596 1596 << 4; 1597 1597 1598 1598 data->last_updated = jiffies; 1599 - data->valid = 1; 1599 + data->valid = true; 1600 1600 } 1601 1601 1602 1602 mutex_unlock(&data->update_lock);
+3 -3
drivers/hwmon/w83792d.c
··· 261 261 struct device *hwmon_dev; 262 262 263 263 struct mutex update_lock; 264 - char valid; /* !=0 if following fields are valid */ 264 + bool valid; /* true if following fields are valid */ 265 265 unsigned long last_updated; /* In jiffies */ 266 266 267 267 u8 in[9]; /* Register value */ ··· 740 740 mutex_lock(&data->update_lock); 741 741 reg = w83792d_read_value(client, W83792D_REG_CHASSIS_CLR); 742 742 w83792d_write_value(client, W83792D_REG_CHASSIS_CLR, reg | 0x80); 743 - data->valid = 0; /* Force cache refresh */ 743 + data->valid = false; /* Force cache refresh */ 744 744 mutex_unlock(&data->update_lock); 745 745 746 746 return count; ··· 1589 1589 } 1590 1590 1591 1591 data->last_updated = jiffies; 1592 - data->valid = 1; 1592 + data->valid = true; 1593 1593 } 1594 1594 1595 1595 mutex_unlock(&data->update_lock);
+3 -3
drivers/hwmon/w83793.c
··· 204 204 struct w83793_data { 205 205 struct device *hwmon_dev; 206 206 struct mutex update_lock; 207 - char valid; /* !=0 if following fields are valid */ 207 + bool valid; /* true if following fields are valid */ 208 208 unsigned long last_updated; /* In jiffies */ 209 209 unsigned long last_nonvolatile; /* In jiffies, last time we update the 210 210 * nonvolatile registers ··· 452 452 mutex_lock(&data->update_lock); 453 453 reg = w83793_read_value(client, W83793_REG_CLR_CHASSIS); 454 454 w83793_write_value(client, W83793_REG_CLR_CHASSIS, reg | 0x80); 455 - data->valid = 0; /* Force cache refresh */ 455 + data->valid = false; /* Force cache refresh */ 456 456 mutex_unlock(&data->update_lock); 457 457 return count; 458 458 } ··· 2077 2077 data->vid[1] = w83793_read_value(client, W83793_REG_VID_INB); 2078 2078 w83793_update_nonvolatile(dev); 2079 2079 data->last_updated = jiffies; 2080 - data->valid = 1; 2080 + data->valid = true; 2081 2081 2082 2082 END: 2083 2083 mutex_unlock(&data->update_lock);
+3 -3
drivers/hwmon/w83795.c
··· 379 379 u8 enable_beep; 380 380 u8 beeps[6]; /* Register value */ 381 381 382 - char valid; 382 + bool valid; 383 383 char valid_limits; 384 384 char valid_pwm_config; 385 385 }; ··· 684 684 tmp & ~ALARM_CTRL_RTSACS); 685 685 686 686 data->last_updated = jiffies; 687 - data->valid = 1; 687 + data->valid = true; 688 688 689 689 END: 690 690 mutex_unlock(&data->update_lock); ··· 764 764 765 765 /* Clear status and force cache refresh */ 766 766 w83795_read(client, W83795_REG_ALARM(5)); 767 - data->valid = 0; 767 + data->valid = false; 768 768 mutex_unlock(&data->update_lock); 769 769 return count; 770 770 }
+2 -2
drivers/hwmon/w83l785ts.c
··· 98 98 struct w83l785ts_data { 99 99 struct device *hwmon_dev; 100 100 struct mutex update_lock; 101 - char valid; /* zero until following fields are valid */ 101 + bool valid; /* false until following fields are valid */ 102 102 unsigned long last_updated; /* in jiffies */ 103 103 104 104 /* registers values */ ··· 270 270 W83L785TS_REG_TEMP_OVER, data->temp[1]); 271 271 272 272 data->last_updated = jiffies; 273 - data->valid = 1; 273 + data->valid = true; 274 274 } 275 275 276 276 mutex_unlock(&data->update_lock);
+2 -2
drivers/hwmon/w83l786ng.c
··· 113 113 struct w83l786ng_data { 114 114 struct i2c_client *client; 115 115 struct mutex update_lock; 116 - char valid; /* !=0 if following fields are valid */ 116 + bool valid; /* true if following fields are valid */ 117 117 unsigned long last_updated; /* In jiffies */ 118 118 unsigned long last_nonvolatile; /* In jiffies, last time we update the 119 119 * nonvolatile registers */ ··· 209 209 data->tolerance[1] = (reg_tmp >> 4) & 0x0f; 210 210 211 211 data->last_updated = jiffies; 212 - data->valid = 1; 212 + data->valid = true; 213 213 214 214 } 215 215