hwmon updates for v5.9
Highlights: - New driver for Sparx5 SoC temperature sensot - New driver for Corsair Commander Pro - MAX20710 support added to max20730 driver Enhancements: - max6697: Allow max6581 to create tempX_offset attributes - gsc (Gateworks System Controller): add 16bit pre-scaled voltage mode - adm1275: Enable adm1278 ADM1278_TEMP1_EN - dell-smm: Add Latitude 5480 to fan control whitelist Fixes: - adc128d818: Fix advanced configuration register init - pmbus/core: Use s64 instead of long for calculations to fix overflow issues with 32-bit architectures Plus various cleanups in several drivers. -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEiHPvMQj9QTOCiqgVyx8mb86fmYEFAl8p1d8ACgkQyx8mb86f mYGECw//RIhcVCvmSgnhRnAhN0EOJrl/QzFkukdl5MGnJIWQyW/od/Hjjg0A31VS GdrUGilP0vDwzy7QD9N1CgGaYM42yP0OlhlfcvRoYXGJsPhCcWMGT2EnNsbuCpYj O1CR/fjgYSrNmU1TvUKVLTnaCikckP3NGlbJVXViPd4LyP8kgSp2ZTqNGOOw5ByT tAryzG2TDg/0V1aB/jniTPsZtp3Ezw4I0+DtGfXNKLw6LBZaMPVoLuDqLAv3KgUa m2sZ1CG1gzvflLznDtb03g9xakwdq1Nj0xx0+t3tJtztte2FG3AsXlA3feAXZAL8 cH83xXUKFhb40n90RhGt6DWwKbvygtTuCe+6EaixYhesHvU8sC36FMBxCp7dSPUb 0ppJx0cmQB/3EMOsSzl7+dhwos/9yGkkGKJi1bPv0zYHq4BxtTYcV2vkx7q+DKHA 86e/IQNdoLqPOiGD+oFHAZzyJy7GEcVT054I7wuGrkHXlsm4aJIxOYOxFgRmcrjl /RGGdPypMWxNE3NwoNOOHFBiKVi8Bh26JpncLaNmY96fHEhsUtfNICFxIVFgaZCt sOa+pZjPbQtR3UAMnB3ZZfvzBELzAgY/FMm6fdVfrpIukK3dss3CIlNbZVm4P+0a CmOdA4a8EMQPDOFcFxeyv+0/PhIdf/tAZBtRDkT7E1oeaqfb18Q= =nMNN -----END PGP SIGNATURE----- Merge tag 'hwmon-for-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging Pull hwmon updates from Guenter Roeck: "Highlights: - New driver for Sparx5 SoC temperature sensot - New driver for Corsair Commander Pro - MAX20710 support added to max20730 driver Enhancements: - max6697: Allow max6581 to create tempX_offset attributes - gsc (Gateworks System Controller): add 16bit pre-scaled voltage mode - adm1275: Enable adm1278 ADM1278_TEMP1_EN - dell-smm: Add Latitude 5480 to fan control whitelist Fixes: - adc128d818: Fix advanced configuration register init - pmbus/core: Use s64 instead of long for calculations to fix overflow issues with 32-bit architectures Plus various cleanups in several drivers" * tag 'hwmon-for-v5.9' of git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging: (32 commits) hwmon: (adc128d818) Fix advanced configuration register init hwmon: (axi-fan-control) remove duplicate macros hwmon: (i5k_amb, vt8231) Drop uses of pci_read_config_*() return value hwmon: (sparx5) Make symbol 's5_temp_match' static hwmon: (corsair-cpro) add reading pwm values hwmon: sparx5: Add Sparx5 SoC temperature driver dt-bindings: hwmon: Add Sparx5 temperature sensor hwmon: (tmp401) Replace HTTP links with HTTPS ones hwmon: (lm95234) Replace HTTP links with HTTPS ones hwmon: (lm90) Replace HTTP links with HTTPS ones hwmon: (k8temp) Replace HTTP links with HTTPS ones hwmon: (jc42) Replace HTTP links with HTTPS ones hwmon: (ina2xx) Replace HTTP links with HTTPS ones hwmon: (ina209) Replace HTTP links with HTTPS ones hwmon: Replace HTTP links with HTTPS ones docs: hwmon: Replace HTTP links with HTTPS ones hwmon: (adm1025) Replace HTTP links with HTTPS ones hwmon: add Corsair Commander Pro driver hwmon: (max6697) Allow max6581 to create tempX_offset hwmon: (tmmp513) Replace HTTP links with HTTPS links ...
This commit is contained in:
commit
9aebd3254c
|
@ -0,0 +1,44 @@
|
||||||
|
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||||
|
%YAML 1.2
|
||||||
|
---
|
||||||
|
$id: http://devicetree.org/schemas/hwmon/microchip,sparx5-temp.yaml#
|
||||||
|
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||||
|
|
||||||
|
title: Microchip Sparx5 Temperature Monitor
|
||||||
|
|
||||||
|
maintainers:
|
||||||
|
- Lars Povlsen <lars.povlsen@microchip.com>
|
||||||
|
|
||||||
|
description: |
|
||||||
|
Microchip Sparx5 embedded temperature monitor
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
enum:
|
||||||
|
- microchip,sparx5-temp
|
||||||
|
|
||||||
|
reg:
|
||||||
|
maxItems: 1
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
items:
|
||||||
|
- description: AHB reference clock
|
||||||
|
|
||||||
|
'#thermal-sensor-cells':
|
||||||
|
const: 0
|
||||||
|
|
||||||
|
required:
|
||||||
|
- compatible
|
||||||
|
- reg
|
||||||
|
- clocks
|
||||||
|
|
||||||
|
additionalProperties: false
|
||||||
|
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
tmon0: tmon@610508110 {
|
||||||
|
compatible = "microchip,sparx5-temp";
|
||||||
|
reg = <0x10508110 0xc>;
|
||||||
|
#thermal-sensor-cells = <0>;
|
||||||
|
clocks = <&ahb_clk>;
|
||||||
|
};
|
|
@ -18,8 +18,8 @@ description: |
|
||||||
consumption.
|
consumption.
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
http://www.ti.com/lit/gpn/tmp513
|
https://www.ti.com/lit/gpn/tmp513
|
||||||
http://www.ti.com/lit/gpn/tmp512
|
https://www.ti.com/lit/gpn/tmp512
|
||||||
|
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x1d, 0x1e, 0x1f, 0x2d, 0x2e, 0x2f
|
Addresses scanned: I2C 0x1d, 0x1e, 0x1f, 0x2d, 0x2e, 0x2f
|
||||||
|
|
||||||
Datasheet: Publicly available at the TI website http://www.ti.com/
|
Datasheet: Publicly available at the TI website https://www.ti.com/
|
||||||
|
|
||||||
Author: Guenter Roeck
|
Author: Guenter Roeck
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.onsemi.com/PowerSolutions/product.do?id=ADM1026
|
https://www.onsemi.com/PowerSolutions/product.do?id=ADM1026
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
- Philip Pokorny <ppokorny@penguincomputing.com> for Penguin Computing
|
- Philip Pokorny <ppokorny@penguincomputing.com> for Penguin Computing
|
||||||
|
|
|
@ -10,7 +10,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/en/prod/0%2C2877%2CADM1030%2C00.html
|
https://www.analog.com/en/prod/0%2C2877%2CADM1030%2C00.html
|
||||||
|
|
||||||
* Analog Devices ADM1031
|
* Analog Devices ADM1031
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/en/prod/0%2C2877%2CADM1031%2C00.html
|
https://www.analog.com/en/prod/0%2C2877%2CADM1031%2C00.html
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
- Alexandre d'Alton <alex@alexdalton.org>
|
- Alexandre d'Alton <alex@alexdalton.org>
|
||||||
|
|
|
@ -49,7 +49,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.analog.com/media/en/technical-documentation/data-sheets/ADM1293_1294.pdf
|
Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADM1293_1294.pdf
|
||||||
|
|
||||||
Author: Guenter Roeck <linux@roeck-us.net>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7410.pdf
|
https://www.analog.com/static/imported-files/data_sheets/ADT7410.pdf
|
||||||
* Analog Devices ADT7420
|
* Analog Devices ADT7420
|
||||||
|
|
||||||
Prefix: 'adt7420'
|
Prefix: 'adt7420'
|
||||||
|
@ -20,7 +20,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7420.pdf
|
https://www.analog.com/static/imported-files/data_sheets/ADT7420.pdf
|
||||||
|
|
||||||
* Analog Devices ADT7310
|
* Analog Devices ADT7310
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7310.pdf
|
https://www.analog.com/static/imported-files/data_sheets/ADT7310.pdf
|
||||||
|
|
||||||
* Analog Devices ADT7320
|
* Analog Devices ADT7320
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7320.pdf
|
https://www.analog.com/static/imported-files/data_sheets/ADT7320.pdf
|
||||||
|
|
||||||
Author: Hartmut Knaack <knaack.h@gmx.de>
|
Author: Hartmut Knaack <knaack.h@gmx.de>
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
Kernel driver corsair-cpro
|
||||||
|
==========================
|
||||||
|
|
||||||
|
Supported devices:
|
||||||
|
|
||||||
|
* Corsair Commander Pro
|
||||||
|
* Corsair Commander Pro (1000D)
|
||||||
|
|
||||||
|
Author: Marius Zachmann
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver implements the sysfs interface for the Corsair Commander Pro.
|
||||||
|
The Corsair Commander Pro is a USB device with 6 fan connectors,
|
||||||
|
4 temperature sensor connectors and 2 Corsair LED connectors.
|
||||||
|
It can read the voltage levels on the SATA power connector.
|
||||||
|
|
||||||
|
Usage Notes
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Since it is a USB device, hotswapping is possible. The device is autodetected.
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
======================= =====================================================================
|
||||||
|
in0_input Voltage on SATA 12v
|
||||||
|
in1_input Voltage on SATA 5v
|
||||||
|
in2_input Voltage on SATA 3.3v
|
||||||
|
temp[1-4]_input Temperature on connected temperature sensors
|
||||||
|
fan[1-6]_input Connected fan rpm.
|
||||||
|
fan[1-6]_label Shows fan type as detected by the device.
|
||||||
|
fan[1-6]_target Sets fan speed target rpm.
|
||||||
|
When reading, it reports the last value if it was set by the driver.
|
||||||
|
Otherwise returns an error.
|
||||||
|
pwm[1-6] Sets the fan speed. Values from 0-255. Can only be read if pwm
|
||||||
|
was set directly.
|
||||||
|
======================= =====================================================================
|
|
@ -12,7 +12,7 @@ Supported chips:
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
- http://ww1.microchip.com/downloads/en/DeviceDoc/1412.pdf
|
- http://ww1.microchip.com/downloads/en/DeviceDoc/1412.pdf
|
||||||
- http://ww1.microchip.com/downloads/en/DeviceDoc/1402.pdf
|
- https://ww1.microchip.com/downloads/en/DeviceDoc/1402.pdf
|
||||||
|
|
||||||
* SMSC / Microchip EMC1403, EMC1404, EMC1413, EMC1414
|
* SMSC / Microchip EMC1403, EMC1404, EMC1413, EMC1414
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet:
|
Datasheet:
|
||||||
|
|
||||||
- http://ww1.microchip.com/downloads/en/DeviceDoc/1422.pdf
|
- https://ww1.microchip.com/downloads/en/DeviceDoc/1422.pdf
|
||||||
|
|
||||||
* SMSC / Microchip EMC1423, EMC1424
|
* SMSC / Microchip EMC1423, EMC1424
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet:
|
Datasheet:
|
||||||
|
|
||||||
- http://ww1.microchip.com/downloads/en/DeviceDoc/1423_1424.pdf
|
- https://ww1.microchip.com/downloads/en/DeviceDoc/1423_1424.pdf
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
Kalhan Trisal <kalhan.trisal@intel.com
|
Kalhan Trisal <kalhan.trisal@intel.com
|
||||||
|
|
|
@ -145,7 +145,7 @@ motherboard, so the driver assumes that the BIOS set the method
|
||||||
properly.
|
properly.
|
||||||
|
|
||||||
Note that the lowest numbered temperature zone trip point corresponds to
|
Note that the lowest numbered temperature zone trip point corresponds to
|
||||||
to the border between the highest and one but highest temperature zones, and
|
the border between the highest and one but highest temperature zones, and
|
||||||
vica versa. So the temperature zone trip points 1-4 (or 1-2) go from high temp
|
vica versa. So the temperature zone trip points 1-4 (or 1-2) go from high temp
|
||||||
to low temp! This is how things are implemented in the IC, and the driver
|
to low temp! This is how things are implemented in the IC, and the driver
|
||||||
mimics this.
|
mimics this.
|
||||||
|
|
|
@ -10,7 +10,7 @@ Supported chips:
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet:
|
Datasheet:
|
||||||
http://www.ti.com/lit/gpn/ina209
|
https://www.ti.com/lit/gpn/ina209
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
- Paul Hays <Paul.Hays@cattail.ca>
|
- Paul Hays <Paul.Hays@cattail.ca>
|
||||||
|
|
|
@ -11,7 +11,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
* Texas Instruments INA220
|
* Texas Instruments INA220
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
* Texas Instruments INA226
|
* Texas Instruments INA226
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
* Texas Instruments INA230
|
* Texas Instruments INA230
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
* Texas Instruments INA231
|
* Texas Instruments INA231
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
Author: Lothar Felten <lothar.felten@gmail.com>
|
Author: Lothar Felten <lothar.felten@gmail.com>
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/
|
https://www.ti.com/
|
||||||
|
|
||||||
Author: Andrew F. Davis <afd@ti.com>
|
Author: Andrew F. Davis <afd@ti.com>
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ Hardware Monitoring Kernel Drivers
|
||||||
bel-pfe
|
bel-pfe
|
||||||
bt1-pvt
|
bt1-pvt
|
||||||
coretemp
|
coretemp
|
||||||
|
corsair-cpro
|
||||||
da9052
|
da9052
|
||||||
da9055
|
da9055
|
||||||
dell-smm-hwmon
|
dell-smm-hwmon
|
||||||
|
|
|
@ -7,7 +7,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
https://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
||||||
|
|
||||||
* Atmel AT30TS00, AT30TS002A/B, AT30TSE004A
|
* Atmel AT30TS00, AT30TS002A/B, AT30TSE004A
|
||||||
|
|
||||||
|
@ -39,37 +39,37 @@ Supported chips:
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/25095A.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/25095A.pdf
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
||||||
|
|
||||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22327A.pdf
|
https://ww1.microchip.com/downloads/en/DeviceDoc/22327A.pdf
|
||||||
|
|
||||||
* NXP Semiconductors SE97, SE97B, SE98, SE98A
|
* NXP Semiconductors SE97, SE97B, SE98, SE98A
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://www.nxp.com/documents/data_sheet/SE97.pdf
|
https://www.nxp.com/documents/data_sheet/SE97.pdf
|
||||||
|
|
||||||
http://www.nxp.com/documents/data_sheet/SE97B.pdf
|
https://www.nxp.com/documents/data_sheet/SE97B.pdf
|
||||||
|
|
||||||
http://www.nxp.com/documents/data_sheet/SE98.pdf
|
https://www.nxp.com/documents/data_sheet/SE98.pdf
|
||||||
|
|
||||||
http://www.nxp.com/documents/data_sheet/SE98A.pdf
|
https://www.nxp.com/documents/data_sheet/SE98A.pdf
|
||||||
|
|
||||||
* ON Semiconductor CAT34TS02, CAT6095
|
* ON Semiconductor CAT34TS02, CAT6095
|
||||||
|
|
||||||
Datasheet:
|
Datasheet:
|
||||||
|
|
||||||
http://www.onsemi.com/pub_link/Collateral/CAT34TS02-D.PDF
|
https://www.onsemi.com/pub_link/Collateral/CAT34TS02-D.PDF
|
||||||
|
|
||||||
http://www.onsemi.com/pub/Collateral/CAT6095-D.PDF
|
https://www.onsemi.com/pub/Collateral/CAT6095-D.PDF
|
||||||
|
|
||||||
* ST Microelectronics STTS424, STTS424E02, STTS2002, STTS2004, STTS3000
|
* ST Microelectronics STTS424, STTS424E02, STTS2002, STTS2004, STTS3000
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: PCI space
|
Addresses scanned: PCI space
|
||||||
|
|
||||||
Datasheet: http://www.amd.com/system/files/TechDocs/32559.pdf
|
Datasheet: https://www.amd.com/system/files/TechDocs/32559.pdf
|
||||||
|
|
||||||
Author: Rudolf Marek
|
Author: Rudolf Marek
|
||||||
|
|
||||||
|
|
|
@ -11,9 +11,9 @@ Supported chips:
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/lm25056
|
https://www.ti.com/lit/gpn/lm25056
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/lm25056a
|
https://www.ti.com/lit/gpn/lm25056a
|
||||||
|
|
||||||
* National Semiconductor LM25066
|
* National Semiconductor LM25066
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet:
|
Datasheet:
|
||||||
|
|
||||||
http://www.ti.com/product/LM5066I
|
https://www.ti.com/product/LM5066I
|
||||||
|
|
||||||
|
|
||||||
Author: Guenter Roeck <linux@roeck-us.net>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
|
@ -39,7 +39,7 @@ Author: Jean Delvare <jdelvare@suse.de>
|
||||||
Thanks go to Tyan and especially Alex Buckingham for setting up a remote
|
Thanks go to Tyan and especially Alex Buckingham for setting up a remote
|
||||||
access to their S4882 test platform for this driver.
|
access to their S4882 test platform for this driver.
|
||||||
|
|
||||||
http://www.tyan.com/
|
https://www.tyan.com/
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
|
@ -13,15 +13,15 @@ Supported chips:
|
||||||
|
|
||||||
* Texas Instruments TMP122/TMP124
|
* Texas Instruments TMP122/TMP124
|
||||||
|
|
||||||
Information: http://www.ti.com/product/tmp122
|
Information: https://www.ti.com/product/tmp122
|
||||||
|
|
||||||
* National Semiconductor LM71
|
* National Semiconductor LM71
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/LM71
|
Datasheet: https://www.ti.com/product/LM71
|
||||||
|
|
||||||
* National Semiconductor LM74
|
* National Semiconductor LM74
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/LM74
|
Datasheet: https://www.ti.com/product/LM74
|
||||||
|
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
|
|
|
@ -11,7 +11,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/product/lm73
|
https://www.ti.com/product/lm73
|
||||||
|
|
||||||
|
|
||||||
Author: Guillaume Ligneul <guillaume.ligneul@gmail.com>
|
Author: Guillaume Ligneul <guillaume.ligneul@gmail.com>
|
||||||
|
|
|
@ -31,7 +31,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Maxim website
|
Datasheet: Publicly available at the Maxim website
|
||||||
|
|
||||||
http://www.maximintegrated.com/
|
https://www.maximintegrated.com/
|
||||||
|
|
||||||
* Maxim MAX6625, MAX6626, MAX31725, MAX31726
|
* Maxim MAX6625, MAX6626, MAX31725, MAX31726
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Analog Devices website
|
Datasheet: Publicly available at the Analog Devices website
|
||||||
|
|
||||||
http://www.analog.com/adt75
|
https://www.analog.com/adt75
|
||||||
|
|
||||||
* ST Microelectronics STDS75
|
* ST Microelectronics STDS75
|
||||||
|
|
||||||
|
@ -101,23 +101,23 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/product/tmp100
|
https://www.ti.com/product/tmp100
|
||||||
|
|
||||||
http://www.ti.com/product/tmp101
|
https://www.ti.com/product/tmp101
|
||||||
|
|
||||||
http://www.ti.com/product/tmp105
|
https://www.ti.com/product/tmp105
|
||||||
|
|
||||||
http://www.ti.com/product/tmp112
|
https://www.ti.com/product/tmp112
|
||||||
|
|
||||||
http://www.ti.com/product/tmp75
|
https://www.ti.com/product/tmp75
|
||||||
|
|
||||||
http://www.ti.com/product/tmp75b
|
https://www.ti.com/product/tmp75b
|
||||||
|
|
||||||
http://www.ti.com/product/tmp75c
|
https://www.ti.com/product/tmp75c
|
||||||
|
|
||||||
http://www.ti.com/product/tmp175
|
https://www.ti.com/product/tmp175
|
||||||
|
|
||||||
http://www.ti.com/product/tmp275
|
https://www.ti.com/product/tmp275
|
||||||
|
|
||||||
* NXP LM75B, PCT2075
|
* NXP LM75B, PCT2075
|
||||||
|
|
||||||
|
@ -127,9 +127,9 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the NXP website
|
Datasheet: Publicly available at the NXP website
|
||||||
|
|
||||||
http://www.nxp.com/documents/data_sheet/LM75B.pdf
|
https://www.nxp.com/documents/data_sheet/LM75B.pdf
|
||||||
|
|
||||||
http://www.nxp.com/docs/en/data-sheet/PCT2075.pdf
|
https://www.nxp.com/docs/en/data-sheet/PCT2075.pdf
|
||||||
|
|
||||||
Author: Frodo Looijaard <frodol@dds.nl>
|
Author: Frodo Looijaard <frodol@dds.nl>
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/ds/symlink/lm96000.pdf
|
Datasheet: https://www.ti.com/lit/ds/symlink/lm96000.pdf
|
||||||
|
|
||||||
* Analog Devices ADM1027
|
* Analog Devices ADM1027
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.onsemi.com/PowerSolutions/product.do?id=ADM1027
|
Datasheet: https://www.onsemi.com/PowerSolutions/product.do?id=ADM1027
|
||||||
|
|
||||||
* Analog Devices ADT7463
|
* Analog Devices ADT7463
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.onsemi.com/PowerSolutions/product.do?id=ADT7463
|
Datasheet: https://www.onsemi.com/PowerSolutions/product.do?id=ADT7463
|
||||||
|
|
||||||
* Analog Devices ADT7468
|
* Analog Devices ADT7468
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
Addresses scanned: I2C 0x2c, 0x2d, 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.onsemi.com/PowerSolutions/product.do?id=ADT7468
|
Datasheet: https://www.onsemi.com/PowerSolutions/product.do?id=ADT7468
|
||||||
|
|
||||||
* SMSC EMC6D100, SMSC EMC6D101
|
* SMSC EMC6D100, SMSC EMC6D101
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c - 0x2e
|
Addresses scanned: I2C 0x2c - 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.analog.com/en/prod/0,2877,ADM1024,00.html
|
Datasheet: https://www.analog.com/en/prod/0,2877,ADM1024,00.html
|
||||||
|
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
|
|
|
@ -51,7 +51,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the ON Semiconductor website
|
Datasheet: Publicly available at the ON Semiconductor website
|
||||||
|
|
||||||
http://www.onsemi.com/PowerSolutions/product.do?id=ADM1032
|
https://www.onsemi.com/PowerSolutions/product.do?id=ADM1032
|
||||||
|
|
||||||
* Analog Devices ADT7461
|
* Analog Devices ADT7461
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the ON Semiconductor website
|
Datasheet: Publicly available at the ON Semiconductor website
|
||||||
|
|
||||||
http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461
|
https://www.onsemi.com/PowerSolutions/product.do?id=ADT7461
|
||||||
|
|
||||||
* Analog Devices ADT7461A
|
* Analog Devices ADT7461A
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the ON Semiconductor website
|
Datasheet: Publicly available at the ON Semiconductor website
|
||||||
|
|
||||||
http://www.onsemi.com/PowerSolutions/product.do?id=ADT7461A
|
https://www.onsemi.com/PowerSolutions/product.do?id=ADT7461A
|
||||||
|
|
||||||
* ON Semiconductor NCT1008
|
* ON Semiconductor NCT1008
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the ON Semiconductor website
|
Datasheet: Publicly available at the ON Semiconductor website
|
||||||
|
|
||||||
http://www.onsemi.com/PowerSolutions/product.do?id=NCT1008
|
https://www.onsemi.com/PowerSolutions/product.do?id=NCT1008
|
||||||
|
|
||||||
* Maxim MAX6646
|
* Maxim MAX6646
|
||||||
|
|
||||||
|
@ -263,7 +263,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at TI website
|
Datasheet: Publicly available at TI website
|
||||||
|
|
||||||
http://www.ti.com/litv/pdf/sbos686
|
https://www.ti.com/litv/pdf/sbos686
|
||||||
|
|
||||||
Author: Jean Delvare <jdelvare@suse.de>
|
Author: Jean Delvare <jdelvare@suse.de>
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ Smart Tach Mode (from the datasheet)::
|
||||||
four signals are measured within 4 seconds.
|
four signals are measured within 4 seconds.
|
||||||
|
|
||||||
Smart tach mode is enabled by the driver by writing 1 or 2 (associating the
|
Smart tach mode is enabled by the driver by writing 1 or 2 (associating the
|
||||||
the fan tachometer with a pwm) to the sysfs file fan<n>_smart_tach. A zero
|
fan tachometer with a pwm) to the sysfs file fan<n>_smart_tach. A zero
|
||||||
will disable the function for that fan. Note that Smart tach mode cannot be
|
will disable the function for that fan. Note that Smart tach mode cannot be
|
||||||
enabled if the PWM output frequency is 22500 Hz (see below).
|
enabled if the PWM output frequency is 22500 Hz (see below).
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/product/lm95233
|
https://www.ti.com/product/lm95233
|
||||||
|
|
||||||
* National Semiconductor / Texas Instruments LM95234
|
* National Semiconductor / Texas Instruments LM95234
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Texas Instruments website
|
Datasheet: Publicly available at the Texas Instruments website
|
||||||
|
|
||||||
http://www.ti.com/product/lm95234
|
https://www.ti.com/product/lm95234
|
||||||
|
|
||||||
Author: Guenter Roeck <linux@roeck-us.net>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the TI website
|
Datasheet: Publicly available at the TI website
|
||||||
|
|
||||||
http://www.ti.com/lit/ds/symlink/lm95235.pdf
|
https://www.ti.com/lit/ds/symlink/lm95235.pdf
|
||||||
|
|
||||||
* TI / National Semiconductor LM95245
|
* TI / National Semiconductor LM95245
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the TI website
|
Datasheet: Publicly available at the TI website
|
||||||
|
|
||||||
http://www.ti.com/lit/ds/symlink/lm95245.pdf
|
https://www.ti.com/lit/ds/symlink/lm95245.pdf
|
||||||
|
|
||||||
Author: Alexander Stein <alexander.stein@systec-electronic.com>
|
Author: Alexander Stein <alexander.stein@systec-electronic.com>
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.analog.com/ltm4680
|
Datasheet: https://www.analog.com/ltm4680
|
||||||
|
|
||||||
* Analog Devices LTM4686
|
* Analog Devices LTM4686
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.analog.com/ltm4686
|
Datasheet: https://www.analog.com/ltm4686
|
||||||
|
|
||||||
* Analog Devices LTM4700
|
* Analog Devices LTM4700
|
||||||
|
|
||||||
|
@ -195,7 +195,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.analog.com/ltm4700
|
Datasheet: https://www.analog.com/ltm4700
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,14 @@ Kernel driver max20730
|
||||||
|
|
||||||
Supported chips:
|
Supported chips:
|
||||||
|
|
||||||
|
* Maxim MAX20710
|
||||||
|
|
||||||
|
Prefix: 'max20710'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20710.pdf
|
||||||
|
|
||||||
* Maxim MAX20730
|
* Maxim MAX20730
|
||||||
|
|
||||||
Prefix: 'max20730'
|
Prefix: 'max20730'
|
||||||
|
@ -35,7 +43,7 @@ Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
This driver implements support for Maxim MAX20730, MAX20734, and MAX20743
|
This driver implements support for Maxim MAX20710, MAX20730, MAX20734, and MAX20743
|
||||||
Integrated, Step-Down Switching Regulators with PMBus support.
|
Integrated, Step-Down Switching Regulators with PMBus support.
|
||||||
|
|
||||||
The driver is a client driver to the core PMBus driver.
|
The driver is a client driver to the core PMBus driver.
|
||||||
|
|
|
@ -9,9 +9,9 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX20751.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20751.pdf
|
||||||
|
|
||||||
Application note: http://pdfserv.maximintegrated.com/en/an/AN5941.pdf
|
Application note: https://pdfserv.maximintegrated.com/en/an/AN5941.pdf
|
||||||
|
|
||||||
Author: Guenter Roeck <linux@roeck-us.net>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://pdfserv.maximintegrated.com/en/ds/MAX31790.pdf
|
Datasheet: https://pdfserv.maximintegrated.com/en/ds/MAX31790.pdf
|
||||||
|
|
||||||
Author: Il Han <corone.il.han@gmail.com>
|
Author: Il Han <corone.il.han@gmail.com>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34440.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34440.pdf
|
||||||
|
|
||||||
* Maxim MAX34441
|
* Maxim MAX34441
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34441.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34441.pdf
|
||||||
|
|
||||||
* Maxim MAX34446
|
* Maxim MAX34446
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34446.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34446.pdf
|
||||||
|
|
||||||
* Maxim MAX34451
|
* Maxim MAX34451
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34451.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34451.pdf
|
||||||
|
|
||||||
* Maxim MAX34460
|
* Maxim MAX34460
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34460.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34460.pdf
|
||||||
|
|
||||||
* Maxim MAX34461
|
* Maxim MAX34461
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34461.pdf
|
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34461.pdf
|
||||||
|
|
||||||
Author: Guenter Roeck <linux@roeck-us.net>
|
Author: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
|
||||||
|
|
|
@ -276,5 +276,5 @@ temperature measurement device. As a result, the temperature reported on CPUTIN
|
||||||
will not reflect a usable value. It often reports unreasonably high
|
will not reflect a usable value. It often reports unreasonably high
|
||||||
temperatures, and in some cases the reported temperature declines if the actual
|
temperatures, and in some cases the reported temperature declines if the actual
|
||||||
temperature increases (similar to the raw PECI temperature value - see PECI
|
temperature increases (similar to the raw PECI temperature value - see PECI
|
||||||
specification for details). CPUTIN should therefore be be ignored on ASUS
|
specification for details). CPUTIN should therefore be ignored on ASUS
|
||||||
boards. The CPU temperature on ASUS boards is reported from PECI 0.
|
boards. The CPU temperature on ASUS boards is reported from PECI 0.
|
||||||
|
|
|
@ -21,11 +21,11 @@ Supported chips:
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://www.onsemi.com/pub_link/Collateral/ADP4000-D.PDF
|
https://www.onsemi.com/pub_link/Collateral/ADP4000-D.PDF
|
||||||
|
|
||||||
http://www.onsemi.com/pub_link/Collateral/NCP4200-D.PDF
|
https://www.onsemi.com/pub_link/Collateral/NCP4200-D.PDF
|
||||||
|
|
||||||
http://www.onsemi.com/pub_link/Collateral/JUNE%202009-%20REV.%200.PDF
|
https://www.onsemi.com/pub_link/Collateral/JUNE%202009-%20REV.%200.PDF
|
||||||
|
|
||||||
* Lineage Power
|
* Lineage Power
|
||||||
|
|
||||||
|
@ -53,15 +53,15 @@ Supported chips:
|
||||||
|
|
||||||
Datasheets:
|
Datasheets:
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps40400
|
https://www.ti.com/lit/gpn/tps40400
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps544b20
|
https://www.ti.com/lit/gpn/tps544b20
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps544b25
|
https://www.ti.com/lit/gpn/tps544b25
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps544c20
|
https://www.ti.com/lit/gpn/tps544c20
|
||||||
|
|
||||||
http://www.ti.com/lit/gpn/tps544c25
|
https://www.ti.com/lit/gpn/tps544c25
|
||||||
|
|
||||||
* Maxim MAX20796
|
* Maxim MAX20796
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Sensirion website
|
Datasheet: Publicly available at the Sensirion website
|
||||||
|
|
||||||
http://www.sensirion.com/file/datasheet_sht21
|
https://www.sensirion.com/file/datasheet_sht21
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ Supported chips:
|
||||||
|
|
||||||
Datasheet: Publicly available at the Sensirion website
|
Datasheet: Publicly available at the Sensirion website
|
||||||
|
|
||||||
http://www.sensirion.com/file/datasheet_sht25
|
https://www.sensirion.com/file/datasheet_sht25
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
|
|
||||||
Datasheet: http://www.sensirion.com/file/datasheet_shtc1
|
Datasheet: https://www.sensirion.com/file/datasheet_shtc1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
|
|
||||||
Datasheet: http://www.sensirion.com/file/datasheet_shtw1
|
Datasheet: https://www.sensirion.com/file/datasheet_shtw1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
|
|
||||||
Datasheet: http://www.sensirion.com/file/datasheet_shtc3
|
Datasheet: https://www.sensirion.com/file/datasheet_shtc3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,33 @@
|
||||||
|
.. SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
|
||||||
|
Microchip SparX-5 SoC
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
|
||||||
|
* VSC7546, VSC7549, VSC755, VSC7556, and VSC7558 (Sparx5 series)
|
||||||
|
|
||||||
|
Prefix: 'sparx5-temp'
|
||||||
|
|
||||||
|
Addresses scanned: -
|
||||||
|
|
||||||
|
Datasheet: Provided by Microchip upon request and under NDA
|
||||||
|
|
||||||
|
Author: Lars Povlsen <lars.povlsen@microchip.com>
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Sparx5 SoC contains a temperature sensor based on the MR74060
|
||||||
|
Moortec IP.
|
||||||
|
|
||||||
|
The sensor has a range of -40°C to +125°C and an accuracy of +/-5°C.
|
||||||
|
|
||||||
|
Sysfs entries
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The following attributes are supported.
|
||||||
|
|
||||||
|
======================= ========================================================
|
||||||
|
temp1_input Die temperature (in millidegree Celsius.)
|
||||||
|
======================= ========================================================
|
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2c - 0x2e
|
Addresses scanned: I2C 0x2c - 0x2e
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/
|
Datasheet: https://www.ti.com/
|
||||||
|
|
||||||
|
|
||||||
Author: Krzysztof Helt <krzysztof.h1@wp.pl>
|
Author: Krzysztof Helt <krzysztof.h1@wp.pl>
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
|
|
||||||
Product info and datasheet: http://www.ti.com/product/tmp103
|
Product info and datasheet: https://www.ti.com/product/tmp103
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: none
|
Addresses scanned: none
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/tmp108
|
Datasheet: https://www.ti.com/product/tmp108
|
||||||
|
|
||||||
Author:
|
Author:
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ Supported chips:
|
||||||
|
|
||||||
Prefix: 'tmp461'
|
Prefix: 'tmp461'
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/tmp461
|
Datasheet: https://www.ti.com/product/tmp461
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x2a, 0x4c, 0x4d, 0x4e and 0x4f
|
Addresses scanned: I2C 0x2a, 0x4c, 0x4d, 0x4e and 0x4f
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/tmp441
|
Datasheet: https://www.ti.com/product/tmp441
|
||||||
|
|
||||||
* Texas Instruments TMP442
|
* Texas Instruments TMP442
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x4c and 0x4d
|
Addresses scanned: I2C 0x4c and 0x4d
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/product/tmp442
|
Datasheet: https://www.ti.com/product/tmp442
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
|
|
||||||
|
|
|
@ -9,13 +9,13 @@ Supported chips:
|
||||||
|
|
||||||
Prefix: 'tmp512'
|
Prefix: 'tmp512'
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/ds/symlink/tmp512.pdf
|
Datasheet: https://www.ti.com/lit/ds/symlink/tmp512.pdf
|
||||||
|
|
||||||
* Texas Instruments TMP513
|
* Texas Instruments TMP513
|
||||||
|
|
||||||
Prefix: 'tmp513'
|
Prefix: 'tmp513'
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/ds/symlink/tmp513.pdf
|
Datasheet: https://www.ti.com/lit/ds/symlink/tmp513.pdf
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/gpn/tps40422
|
Datasheet: https://www.ti.com/lit/gpn/tps40422
|
||||||
|
|
||||||
Author: Zhu Laiwen <richard.zhu@nsn.com>
|
Author: Zhu Laiwen <richard.zhu@nsn.com>
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/gpn/tps53647
|
Datasheet: https://www.ti.com/lit/gpn/tps53647
|
||||||
|
|
||||||
* Texas Instruments TPS53667
|
* Texas Instruments TPS53667
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/gpn/TPS53667
|
Datasheet: https://www.ti.com/lit/gpn/TPS53667
|
||||||
|
|
||||||
* Texas Instruments TPS53679
|
* Texas Instruments TPS53679
|
||||||
|
|
||||||
|
@ -25,7 +25,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/gpn/TPS53679 (short version)
|
Datasheet: https://www.ti.com/lit/gpn/TPS53679 (short version)
|
||||||
|
|
||||||
* Texas Instruments TPS53681
|
* Texas Instruments TPS53681
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: -
|
Addresses scanned: -
|
||||||
|
|
||||||
Datasheet: http://www.ti.com/lit/gpn/TPS53681
|
Datasheet: https://www.ti.com/lit/gpn/TPS53681
|
||||||
|
|
||||||
* Texas Instruments TPS53688
|
* Texas Instruments TPS53688
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@ sensors. The configured source for each of the temperature sensors is provided
|
||||||
in tempX_label.
|
in tempX_label.
|
||||||
|
|
||||||
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||||
degC for temp1 and and 0.5 degC for temp2 and temp3. For temp4 and higher,
|
degC for temp1 and 0.5 degC for temp2 and temp3. For temp4 and higher,
|
||||||
resolution is 1 degC for W83667HG-B and 0.0 degC for NCT6775F and NCT6776F.
|
resolution is 1 degC for W83667HG-B and 0.0 degC for NCT6775F and NCT6776F.
|
||||||
An alarm is triggered when the temperature gets higher than high limit;
|
An alarm is triggered when the temperature gets higher than high limit;
|
||||||
it stays on until the temperature falls below the hysteresis value.
|
it stays on until the temperature falls below the hysteresis value.
|
||||||
|
|
|
@ -17,7 +17,7 @@ Supported chips:
|
||||||
|
|
||||||
Addresses scanned: I2C 0x28 - 0x2f, ISA 0x290 (8 I/O ports)
|
Addresses scanned: I2C 0x28 - 0x2f, ISA 0x290 (8 I/O ports)
|
||||||
|
|
||||||
Datasheet: http://www.winbond.com
|
Datasheet: https://www.winbond.com
|
||||||
|
|
||||||
* Winbond W83783S
|
* Winbond W83783S
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||||
degC for temp1 and temp2.
|
degC for temp1 and temp2.
|
||||||
|
|
||||||
Fan rotation speeds are reported in RPM (rotations per minute). Fan readings
|
Fan rotation speeds are reported in RPM (rotations per minute). Fan readings
|
||||||
readings can be divided by a programmable divider (1, 2, 4, 8, 16, 32, 64
|
can be divided by a programmable divider (1, 2, 4, 8, 16, 32, 64
|
||||||
or 128 for fan 1/2) to give the readings more range or accuracy.
|
or 128 for fan 1/2) to give the readings more range or accuracy.
|
||||||
|
|
||||||
Voltage sensors (also known as IN sensors) report their values in millivolts.
|
Voltage sensors (also known as IN sensors) report their values in millivolts.
|
||||||
|
|
|
@ -4444,6 +4444,12 @@ S: Maintained
|
||||||
F: Documentation/hwmon/coretemp.rst
|
F: Documentation/hwmon/coretemp.rst
|
||||||
F: drivers/hwmon/coretemp.c
|
F: drivers/hwmon/coretemp.c
|
||||||
|
|
||||||
|
CORSAIR-CPRO HARDWARE MONITOR DRIVER
|
||||||
|
M: Marius Zachmann <mail@mariuszachmann.de>
|
||||||
|
L: linux-hwmon@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/hwmon/corsair-cpro.c
|
||||||
|
|
||||||
COSA/SRP SYNC SERIAL DRIVER
|
COSA/SRP SYNC SERIAL DRIVER
|
||||||
M: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
|
M: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
|
@ -439,6 +439,16 @@ config SENSORS_BT1_PVT_ALARMS
|
||||||
the data conversion will be periodically performed and the data will be
|
the data conversion will be periodically performed and the data will be
|
||||||
saved in the internal driver cache.
|
saved in the internal driver cache.
|
||||||
|
|
||||||
|
config SENSORS_CORSAIR_CPRO
|
||||||
|
tristate "Corsair Commander Pro controller"
|
||||||
|
depends on HID
|
||||||
|
help
|
||||||
|
If you say yes here you get support for the Corsair Commander Pro
|
||||||
|
controller.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called corsair-cpro.
|
||||||
|
|
||||||
config SENSORS_DRIVETEMP
|
config SENSORS_DRIVETEMP
|
||||||
tristate "Hard disk drives with temperature sensors"
|
tristate "Hard disk drives with temperature sensors"
|
||||||
depends on SCSI && ATA
|
depends on SCSI && ATA
|
||||||
|
@ -515,6 +525,16 @@ config SENSORS_I5K_AMB
|
||||||
This driver can also be built as a module. If so, the module
|
This driver can also be built as a module. If so, the module
|
||||||
will be called i5k_amb.
|
will be called i5k_amb.
|
||||||
|
|
||||||
|
config SENSORS_SPARX5
|
||||||
|
tristate "Sparx5 SoC temperature sensor"
|
||||||
|
depends on ARCH_SPARX5 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
If you say yes here you get support for temperature monitoring
|
||||||
|
with the Microchip Sparx5 SoC.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called sparx5-temp.
|
||||||
|
|
||||||
config SENSORS_F71805F
|
config SENSORS_F71805F
|
||||||
tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG"
|
tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG"
|
||||||
depends on !PPC
|
depends on !PPC
|
||||||
|
|
|
@ -56,6 +56,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
|
||||||
obj-$(CONFIG_SENSORS_AXI_FAN_CONTROL) += axi-fan-control.o
|
obj-$(CONFIG_SENSORS_AXI_FAN_CONTROL) += axi-fan-control.o
|
||||||
obj-$(CONFIG_SENSORS_BT1_PVT) += bt1-pvt.o
|
obj-$(CONFIG_SENSORS_BT1_PVT) += bt1-pvt.o
|
||||||
obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
|
obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
|
||||||
|
obj-$(CONFIG_SENSORS_CORSAIR_CPRO) += corsair-cpro.o
|
||||||
obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o
|
obj-$(CONFIG_SENSORS_DA9052_ADC)+= da9052-hwmon.o
|
||||||
obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
|
obj-$(CONFIG_SENSORS_DA9055)+= da9055-hwmon.o
|
||||||
obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o
|
obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o
|
||||||
|
@ -167,6 +168,7 @@ obj-$(CONFIG_SENSORS_SMM665) += smm665.o
|
||||||
obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
|
obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
|
||||||
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
|
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
|
||||||
obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o
|
obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o
|
||||||
|
obj-$(CONFIG_SENSORS_SPARX5) += sparx5-temp.o
|
||||||
obj-$(CONFIG_SENSORS_STTS751) += stts751.o
|
obj-$(CONFIG_SENSORS_STTS751) += stts751.o
|
||||||
obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o
|
obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o
|
||||||
obj-$(CONFIG_SENSORS_TC74) += tc74.o
|
obj-$(CONFIG_SENSORS_TC74) += tc74.o
|
||||||
|
|
|
@ -393,6 +393,7 @@ static int adc128_init_client(struct adc128_data *data)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = data->client;
|
struct i2c_client *client = data->client;
|
||||||
int err;
|
int err;
|
||||||
|
u8 regval = 0x0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reset chip to defaults.
|
* Reset chip to defaults.
|
||||||
|
@ -403,10 +404,17 @@ static int adc128_init_client(struct adc128_data *data)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* Set operation mode, if non-default */
|
/* Set operation mode, if non-default */
|
||||||
if (data->mode != 0) {
|
if (data->mode != 0)
|
||||||
err = i2c_smbus_write_byte_data(client,
|
regval |= data->mode << 1;
|
||||||
ADC128_REG_CONFIG_ADV,
|
|
||||||
data->mode << 1);
|
/* If external vref is selected, configure the chip to use it */
|
||||||
|
if (data->regulator)
|
||||||
|
regval |= 0x01;
|
||||||
|
|
||||||
|
/* Write advanced configuration register */
|
||||||
|
if (regval != 0x0) {
|
||||||
|
err = i2c_smbus_write_byte_data(client, ADC128_REG_CONFIG_ADV,
|
||||||
|
regval);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -416,14 +424,6 @@ static int adc128_init_client(struct adc128_data *data)
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
/* If external vref is selected, configure the chip to use it */
|
|
||||||
if (data->regulator) {
|
|
||||||
err = i2c_smbus_write_byte_data(client,
|
|
||||||
ADC128_REG_CONFIG_ADV, 0x01);
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
* resolution of about 0.5% of the nominal value). Temperature values are
|
* resolution of about 0.5% of the nominal value). Temperature values are
|
||||||
* reported with a 1 deg resolution and a 3 deg accuracy. Complete
|
* reported with a 1 deg resolution and a 3 deg accuracy. Complete
|
||||||
* datasheet can be obtained from Analog's website at:
|
* datasheet can be obtained from Analog's website at:
|
||||||
* http://www.onsemi.com/PowerSolutions/product.do?id=ADM1025
|
* https://www.onsemi.com/PowerSolutions/product.do?id=ADM1025
|
||||||
*
|
*
|
||||||
* This driver also supports the ADM1025A, which differs from the ADM1025
|
* This driver also supports the ADM1025A, which differs from the ADM1025
|
||||||
* only in that it has "open-drain VID inputs while the ADM1025 has
|
* only in that it has "open-drain VID inputs while the ADM1025 has
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
*
|
*
|
||||||
* Chip details at:
|
* Chip details at:
|
||||||
*
|
*
|
||||||
* <http://www.onsemi.com/PowerSolutions/product.do?id=ADM1026>
|
* <https://www.onsemi.com/PowerSolutions/product.do?id=ADM1026>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
|
@ -15,10 +15,6 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#define ADI_AXI_PCORE_VER_MAJOR(version) (((version) >> 16) & 0xff)
|
|
||||||
#define ADI_AXI_PCORE_VER_MINOR(version) (((version) >> 8) & 0xff)
|
|
||||||
#define ADI_AXI_PCORE_VER_PATCH(version) ((version) & 0xff)
|
|
||||||
|
|
||||||
/* register map */
|
/* register map */
|
||||||
#define ADI_REG_RSTN 0x0080
|
#define ADI_REG_RSTN 0x0080
|
||||||
#define ADI_REG_PWM_WIDTH 0x0084
|
#define ADI_REG_PWM_WIDTH 0x0084
|
||||||
|
|
|
@ -0,0 +1,582 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* corsair-cpro.c - Linux driver for Corsair Commander Pro
|
||||||
|
* Copyright (C) 2020 Marius Zachmann <mail@mariuszachmann.de>
|
||||||
|
*
|
||||||
|
* This driver uses hid reports to communicate with the device to allow hidraw userspace drivers
|
||||||
|
* still being used. The device does not use report ids. When using hidraw and this driver
|
||||||
|
* simultaniously, reports could be switched.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/completion.h>
|
||||||
|
#include <linux/hid.h>
|
||||||
|
#include <linux/hwmon.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_CORSAIR 0x1b1c
|
||||||
|
#define USB_PRODUCT_ID_CORSAIR_COMMANDERPRO 0x0c10
|
||||||
|
#define USB_PRODUCT_ID_CORSAIR_1000D 0x1d00
|
||||||
|
|
||||||
|
#define OUT_BUFFER_SIZE 63
|
||||||
|
#define IN_BUFFER_SIZE 16
|
||||||
|
#define LABEL_LENGTH 11
|
||||||
|
#define REQ_TIMEOUT 300
|
||||||
|
|
||||||
|
#define CTL_GET_TMP_CNCT 0x10 /*
|
||||||
|
* returns in bytes 1-4 for each temp sensor:
|
||||||
|
* 0 not connected
|
||||||
|
* 1 connected
|
||||||
|
*/
|
||||||
|
#define CTL_GET_TMP 0x11 /*
|
||||||
|
* send: byte 1 is channel, rest zero
|
||||||
|
* rcv: returns temp for channel in centi-degree celsius
|
||||||
|
* in bytes 1 and 2
|
||||||
|
* returns 0x11 in byte 0 if no sensor is connected
|
||||||
|
*/
|
||||||
|
#define CTL_GET_VOLT 0x12 /*
|
||||||
|
* send: byte 1 is rail number: 0 = 12v, 1 = 5v, 2 = 3.3v
|
||||||
|
* rcv: returns millivolt in bytes 1,2
|
||||||
|
* returns error 0x10 if request is invalid
|
||||||
|
*/
|
||||||
|
#define CTL_GET_FAN_CNCT 0x20 /*
|
||||||
|
* returns in bytes 1-6 for each fan:
|
||||||
|
* 0 not connected
|
||||||
|
* 1 3pin
|
||||||
|
* 2 4pin
|
||||||
|
*/
|
||||||
|
#define CTL_GET_FAN_RPM 0x21 /*
|
||||||
|
* send: byte 1 is channel, rest zero
|
||||||
|
* rcv: returns rpm in bytes 1,2
|
||||||
|
*/
|
||||||
|
#define CTL_GET_FAN_PWM 0x22 /*
|
||||||
|
* send: byte 1 is channel, rest zero
|
||||||
|
* rcv: returns pwm in byte 1 if it was set
|
||||||
|
* returns error 0x12 if fan is controlled via
|
||||||
|
* fan_target or fan curve
|
||||||
|
*/
|
||||||
|
#define CTL_SET_FAN_FPWM 0x23 /*
|
||||||
|
* set fixed pwm
|
||||||
|
* send: byte 1 is fan number
|
||||||
|
* send: byte 2 is percentage from 0 - 100
|
||||||
|
*/
|
||||||
|
#define CTL_SET_FAN_TARGET 0x24 /*
|
||||||
|
* set target rpm
|
||||||
|
* send: byte 1 is fan number
|
||||||
|
* send: byte 2-3 is target
|
||||||
|
* device accepts all values from 0x00 - 0xFFFF
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define NUM_FANS 6
|
||||||
|
#define NUM_TEMP_SENSORS 4
|
||||||
|
|
||||||
|
struct ccp_device {
|
||||||
|
struct hid_device *hdev;
|
||||||
|
struct device *hwmon_dev;
|
||||||
|
struct completion wait_input_report;
|
||||||
|
struct mutex mutex; /* whenever buffer is used, lock before send_usb_cmd */
|
||||||
|
u8 *buffer;
|
||||||
|
int target[6];
|
||||||
|
DECLARE_BITMAP(temp_cnct, NUM_TEMP_SENSORS);
|
||||||
|
DECLARE_BITMAP(fan_cnct, NUM_FANS);
|
||||||
|
char fan_label[6][LABEL_LENGTH];
|
||||||
|
};
|
||||||
|
|
||||||
|
/* converts response error in buffer to errno */
|
||||||
|
static int ccp_get_errno(struct ccp_device *ccp)
|
||||||
|
{
|
||||||
|
switch (ccp->buffer[0]) {
|
||||||
|
case 0x00: /* success */
|
||||||
|
return 0;
|
||||||
|
case 0x01: /* called invalid command */
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
case 0x10: /* called GET_VOLT / GET_TMP with invalid arguments */
|
||||||
|
return -EINVAL;
|
||||||
|
case 0x11: /* requested temps of disconnected sensors */
|
||||||
|
case 0x12: /* requested pwm of not pwm controlled channels */
|
||||||
|
return -ENODATA;
|
||||||
|
default:
|
||||||
|
hid_dbg(ccp->hdev, "unknown device response error: %d", ccp->buffer[0]);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send command, check for error in response, response in ccp->buffer */
|
||||||
|
static int send_usb_cmd(struct ccp_device *ccp, u8 command, u8 byte1, u8 byte2, u8 byte3)
|
||||||
|
{
|
||||||
|
unsigned long t;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset(ccp->buffer, 0x00, OUT_BUFFER_SIZE);
|
||||||
|
ccp->buffer[0] = command;
|
||||||
|
ccp->buffer[1] = byte1;
|
||||||
|
ccp->buffer[2] = byte2;
|
||||||
|
ccp->buffer[3] = byte3;
|
||||||
|
|
||||||
|
reinit_completion(&ccp->wait_input_report);
|
||||||
|
|
||||||
|
ret = hid_hw_output_report(ccp->hdev, ccp->buffer, OUT_BUFFER_SIZE);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
t = wait_for_completion_timeout(&ccp->wait_input_report, msecs_to_jiffies(REQ_TIMEOUT));
|
||||||
|
if (!t)
|
||||||
|
return -ETIMEDOUT;
|
||||||
|
|
||||||
|
return ccp_get_errno(ccp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ccp_raw_event(struct hid_device *hdev, struct hid_report *report, u8 *data, int size)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp = hid_get_drvdata(hdev);
|
||||||
|
|
||||||
|
/* only copy buffer when requested */
|
||||||
|
if (completion_done(&ccp->wait_input_report))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
memcpy(ccp->buffer, data, min(IN_BUFFER_SIZE, size));
|
||||||
|
complete(&ccp->wait_input_report);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* requests and returns single data values depending on channel */
|
||||||
|
static int get_data(struct ccp_device *ccp, int command, int channel, bool two_byte_data)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&ccp->mutex);
|
||||||
|
|
||||||
|
ret = send_usb_cmd(ccp, command, channel, 0, 0);
|
||||||
|
if (ret)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
ret = ccp->buffer[1];
|
||||||
|
if (two_byte_data)
|
||||||
|
ret = (ret << 8) + ccp->buffer[2];
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
|
mutex_unlock(&ccp->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_pwm(struct ccp_device *ccp, int channel, long val)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (val < 0 || val > 255)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* The Corsair Commander Pro uses values from 0-100 */
|
||||||
|
val = DIV_ROUND_CLOSEST(val * 100, 255);
|
||||||
|
|
||||||
|
mutex_lock(&ccp->mutex);
|
||||||
|
|
||||||
|
ret = send_usb_cmd(ccp, CTL_SET_FAN_FPWM, channel, val, 0);
|
||||||
|
if (!ret)
|
||||||
|
ccp->target[channel] = -ENODATA;
|
||||||
|
|
||||||
|
mutex_unlock(&ccp->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_target(struct ccp_device *ccp, int channel, long val)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
val = clamp_val(val, 0, 0xFFFF);
|
||||||
|
ccp->target[channel] = val;
|
||||||
|
|
||||||
|
mutex_lock(&ccp->mutex);
|
||||||
|
ret = send_usb_cmd(ccp, CTL_SET_FAN_TARGET, channel, val >> 8, val);
|
||||||
|
|
||||||
|
mutex_unlock(&ccp->mutex);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ccp_read_string(struct device *dev, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel, const char **str)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case hwmon_fan:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_fan_label:
|
||||||
|
*str = ccp->fan_label[channel];
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ccp_read(struct device *dev, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel, long *val)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp = dev_get_drvdata(dev);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case hwmon_temp:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_temp_input:
|
||||||
|
ret = get_data(ccp, CTL_GET_TMP, channel, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
*val = ret * 10;
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_fan:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_fan_input:
|
||||||
|
ret = get_data(ccp, CTL_GET_FAN_RPM, channel, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
*val = ret;
|
||||||
|
return 0;
|
||||||
|
case hwmon_fan_target:
|
||||||
|
/* how to read target values from the device is unknown */
|
||||||
|
/* driver returns last set value or 0 */
|
||||||
|
if (ccp->target[channel] < 0)
|
||||||
|
return -ENODATA;
|
||||||
|
*val = ccp->target[channel];
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_pwm:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_pwm_input:
|
||||||
|
ret = get_data(ccp, CTL_GET_FAN_PWM, channel, false);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
*val = DIV_ROUND_CLOSEST(ret * 255, 100);
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_in:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_in_input:
|
||||||
|
ret = get_data(ccp, CTL_GET_VOLT, channel, true);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
*val = ret;
|
||||||
|
return 0;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int ccp_write(struct device *dev, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel, long val)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case hwmon_pwm:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_pwm_input:
|
||||||
|
return set_pwm(ccp, channel, val);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_fan:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_fan_target:
|
||||||
|
return set_target(ccp, channel, val);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
};
|
||||||
|
|
||||||
|
static umode_t ccp_is_visible(const void *data, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel)
|
||||||
|
{
|
||||||
|
const struct ccp_device *ccp = data;
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case hwmon_temp:
|
||||||
|
if (!test_bit(channel, ccp->temp_cnct))
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_temp_input:
|
||||||
|
return 0444;
|
||||||
|
case hwmon_temp_label:
|
||||||
|
return 0444;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_fan:
|
||||||
|
if (!test_bit(channel, ccp->fan_cnct))
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_fan_input:
|
||||||
|
return 0444;
|
||||||
|
case hwmon_fan_label:
|
||||||
|
return 0444;
|
||||||
|
case hwmon_fan_target:
|
||||||
|
return 0644;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_pwm:
|
||||||
|
if (!test_bit(channel, ccp->fan_cnct))
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_pwm_input:
|
||||||
|
return 0644;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case hwmon_in:
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_in_input:
|
||||||
|
return 0444;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hwmon_ops ccp_hwmon_ops = {
|
||||||
|
.is_visible = ccp_is_visible,
|
||||||
|
.read = ccp_read,
|
||||||
|
.read_string = ccp_read_string,
|
||||||
|
.write = ccp_write,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hwmon_channel_info *ccp_info[] = {
|
||||||
|
HWMON_CHANNEL_INFO(chip,
|
||||||
|
HWMON_C_REGISTER_TZ),
|
||||||
|
HWMON_CHANNEL_INFO(temp,
|
||||||
|
HWMON_T_INPUT,
|
||||||
|
HWMON_T_INPUT,
|
||||||
|
HWMON_T_INPUT,
|
||||||
|
HWMON_T_INPUT
|
||||||
|
),
|
||||||
|
HWMON_CHANNEL_INFO(fan,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET,
|
||||||
|
HWMON_F_INPUT | HWMON_F_LABEL | HWMON_F_TARGET
|
||||||
|
),
|
||||||
|
HWMON_CHANNEL_INFO(pwm,
|
||||||
|
HWMON_PWM_INPUT,
|
||||||
|
HWMON_PWM_INPUT,
|
||||||
|
HWMON_PWM_INPUT,
|
||||||
|
HWMON_PWM_INPUT,
|
||||||
|
HWMON_PWM_INPUT,
|
||||||
|
HWMON_PWM_INPUT
|
||||||
|
),
|
||||||
|
HWMON_CHANNEL_INFO(in,
|
||||||
|
HWMON_I_INPUT,
|
||||||
|
HWMON_I_INPUT,
|
||||||
|
HWMON_I_INPUT
|
||||||
|
),
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hwmon_chip_info ccp_chip_info = {
|
||||||
|
.ops = &ccp_hwmon_ops,
|
||||||
|
.info = ccp_info,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* read fan connection status and set labels */
|
||||||
|
static int get_fan_cnct(struct ccp_device *ccp)
|
||||||
|
{
|
||||||
|
int channel;
|
||||||
|
int mode;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = send_usb_cmd(ccp, CTL_GET_FAN_CNCT, 0, 0, 0);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (channel = 0; channel < NUM_FANS; channel++) {
|
||||||
|
mode = ccp->buffer[channel + 1];
|
||||||
|
if (mode == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
set_bit(channel, ccp->fan_cnct);
|
||||||
|
ccp->target[channel] = -ENODATA;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case 1:
|
||||||
|
scnprintf(ccp->fan_label[channel], LABEL_LENGTH,
|
||||||
|
"fan%d 3pin", channel + 1);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
scnprintf(ccp->fan_label[channel], LABEL_LENGTH,
|
||||||
|
"fan%d 4pin", channel + 1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
scnprintf(ccp->fan_label[channel], LABEL_LENGTH,
|
||||||
|
"fan%d other", channel + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read temp sensor connection status */
|
||||||
|
static int get_temp_cnct(struct ccp_device *ccp)
|
||||||
|
{
|
||||||
|
int channel;
|
||||||
|
int mode;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = send_usb_cmd(ccp, CTL_GET_TMP_CNCT, 0, 0, 0);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
for (channel = 0; channel < NUM_TEMP_SENSORS; channel++) {
|
||||||
|
mode = ccp->buffer[channel + 1];
|
||||||
|
if (mode == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
set_bit(channel, ccp->temp_cnct);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ccp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ccp = devm_kzalloc(&hdev->dev, sizeof(*ccp), GFP_KERNEL);
|
||||||
|
if (!ccp)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ccp->buffer = devm_kmalloc(&hdev->dev, OUT_BUFFER_SIZE, GFP_KERNEL);
|
||||||
|
if (!ccp->buffer)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = hid_parse(hdev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = hid_hw_start(hdev, HID_CONNECT_HIDRAW);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = hid_hw_open(hdev);
|
||||||
|
if (ret)
|
||||||
|
goto out_hw_stop;
|
||||||
|
|
||||||
|
ccp->hdev = hdev;
|
||||||
|
hid_set_drvdata(hdev, ccp);
|
||||||
|
mutex_init(&ccp->mutex);
|
||||||
|
init_completion(&ccp->wait_input_report);
|
||||||
|
|
||||||
|
hid_device_io_start(hdev);
|
||||||
|
|
||||||
|
/* temp and fan connection status only updates when device is powered on */
|
||||||
|
ret = get_temp_cnct(ccp);
|
||||||
|
if (ret)
|
||||||
|
goto out_hw_close;
|
||||||
|
|
||||||
|
ret = get_fan_cnct(ccp);
|
||||||
|
if (ret)
|
||||||
|
goto out_hw_close;
|
||||||
|
ccp->hwmon_dev = hwmon_device_register_with_info(&hdev->dev, "corsaircpro",
|
||||||
|
ccp, &ccp_chip_info, 0);
|
||||||
|
if (IS_ERR(ccp->hwmon_dev)) {
|
||||||
|
ret = PTR_ERR(ccp->hwmon_dev);
|
||||||
|
goto out_hw_close;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
out_hw_close:
|
||||||
|
hid_hw_close(hdev);
|
||||||
|
out_hw_stop:
|
||||||
|
hid_hw_stop(hdev);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ccp_remove(struct hid_device *hdev)
|
||||||
|
{
|
||||||
|
struct ccp_device *ccp = hid_get_drvdata(hdev);
|
||||||
|
|
||||||
|
hwmon_device_unregister(ccp->hwmon_dev);
|
||||||
|
hid_hw_close(hdev);
|
||||||
|
hid_hw_stop(hdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct hid_device_id ccp_devices[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_PRODUCT_ID_CORSAIR_COMMANDERPRO) },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_PRODUCT_ID_CORSAIR_1000D) },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct hid_driver ccp_driver = {
|
||||||
|
.name = "corsair-cpro",
|
||||||
|
.id_table = ccp_devices,
|
||||||
|
.probe = ccp_probe,
|
||||||
|
.remove = ccp_remove,
|
||||||
|
.raw_event = ccp_raw_event,
|
||||||
|
};
|
||||||
|
|
||||||
|
MODULE_DEVICE_TABLE(hid, ccp_devices);
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
|
static int __init ccp_init(void)
|
||||||
|
{
|
||||||
|
return hid_register_driver(&ccp_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit ccp_exit(void)
|
||||||
|
{
|
||||||
|
hid_unregister_driver(&ccp_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When compiling this driver as built-in, hwmon initcalls will get called before the
|
||||||
|
* hid driver and this driver would fail to register. late_initcall solves this.
|
||||||
|
*/
|
||||||
|
late_initcall(ccp_init);
|
||||||
|
module_exit(ccp_exit);
|
|
@ -1187,6 +1187,14 @@ static struct dmi_system_id i8k_whitelist_fan_control[] __initdata = {
|
||||||
},
|
},
|
||||||
.driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
|
.driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.ident = "Dell Latitude 5480",
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||||
|
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Latitude 5480"),
|
||||||
|
},
|
||||||
|
.driver_data = (void *)&i8k_fan_control_data[I8K_FAN_34A3_35A3],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.ident = "Dell Latitude E6440",
|
.ident = "Dell Latitude E6440",
|
||||||
.matches = {
|
.matches = {
|
||||||
|
|
|
@ -159,7 +159,7 @@ gsc_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
sz = (ch->mode == mode_voltage) ? 3 : 2;
|
sz = (ch->mode == mode_voltage_24bit) ? 3 : 2;
|
||||||
ret = regmap_bulk_read(hwmon->regmap, ch->reg, buf, sz);
|
ret = regmap_bulk_read(hwmon->regmap, ch->reg, buf, sz);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -186,7 +186,8 @@ gsc_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
|
||||||
/* adjust by uV offset */
|
/* adjust by uV offset */
|
||||||
tmp += ch->mvoffset;
|
tmp += ch->mvoffset;
|
||||||
break;
|
break;
|
||||||
case mode_voltage:
|
case mode_voltage_24bit:
|
||||||
|
case mode_voltage_16bit:
|
||||||
/* no adjustment needed */
|
/* no adjustment needed */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -336,7 +337,8 @@ static int gsc_hwmon_probe(struct platform_device *pdev)
|
||||||
HWMON_T_LABEL;
|
HWMON_T_LABEL;
|
||||||
i_temp++;
|
i_temp++;
|
||||||
break;
|
break;
|
||||||
case mode_voltage:
|
case mode_voltage_24bit:
|
||||||
|
case mode_voltage_16bit:
|
||||||
case mode_voltage_raw:
|
case mode_voltage_raw:
|
||||||
if (i_in == GSC_HWMON_MAX_IN_CH) {
|
if (i_in == GSC_HWMON_MAX_IN_CH) {
|
||||||
dev_err(gsc->dev, "too many input channels\n");
|
dev_err(gsc->dev, "too many input channels\n");
|
||||||
|
|
|
@ -49,15 +49,15 @@
|
||||||
* The 13 specification corresponds to the Intel Pentium M series. There
|
* The 13 specification corresponds to the Intel Pentium M series. There
|
||||||
* doesn't seem to be any named specification for these. The conversion
|
* doesn't seem to be any named specification for these. The conversion
|
||||||
* tables are detailed directly in the various Pentium M datasheets:
|
* tables are detailed directly in the various Pentium M datasheets:
|
||||||
* http://www.intel.com/design/intarch/pentiumm/docs_pentiumm.htm
|
* https://www.intel.com/design/intarch/pentiumm/docs_pentiumm.htm
|
||||||
*
|
*
|
||||||
* The 14 specification corresponds to Intel Core series. There
|
* The 14 specification corresponds to Intel Core series. There
|
||||||
* doesn't seem to be any named specification for these. The conversion
|
* doesn't seem to be any named specification for these. The conversion
|
||||||
* tables are detailed directly in the various Pentium Core datasheets:
|
* tables are detailed directly in the various Pentium Core datasheets:
|
||||||
* http://www.intel.com/design/mobile/datashts/309221.htm
|
* https://www.intel.com/design/mobile/datashts/309221.htm
|
||||||
*
|
*
|
||||||
* The 110 (VRM 11) specification corresponds to Intel Conroe based series.
|
* The 110 (VRM 11) specification corresponds to Intel Conroe based series.
|
||||||
* http://www.intel.com/design/processor/applnots/313214.htm
|
* https://www.intel.com/design/processor/applnots/313214.htm
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -396,7 +396,7 @@ static int i5k_amb_hwmon_init(struct platform_device *pdev)
|
||||||
|
|
||||||
static int i5k_amb_add(void)
|
static int i5k_amb_add(void)
|
||||||
{
|
{
|
||||||
int res = -ENODEV;
|
int res;
|
||||||
|
|
||||||
/* only ever going to be one of these */
|
/* only ever going to be one of these */
|
||||||
amb_pdev = platform_device_alloc(DRVNAME, 0);
|
amb_pdev = platform_device_alloc(DRVNAME, 0);
|
||||||
|
@ -427,11 +427,13 @@ static int i5k_find_amb_registers(struct i5k_amb_data *data,
|
||||||
if (!pcidev)
|
if (!pcidev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (pci_read_config_dword(pcidev, I5K_REG_AMB_BASE_ADDR, &val32))
|
pci_read_config_dword(pcidev, I5K_REG_AMB_BASE_ADDR, &val32);
|
||||||
|
if (val32 == (u32)~0)
|
||||||
goto out;
|
goto out;
|
||||||
data->amb_base = val32;
|
data->amb_base = val32;
|
||||||
|
|
||||||
if (pci_read_config_dword(pcidev, I5K_REG_AMB_LEN_ADDR, &val32))
|
pci_read_config_dword(pcidev, I5K_REG_AMB_LEN_ADDR, &val32);
|
||||||
|
if (val32 == (u32)~0)
|
||||||
goto out;
|
goto out;
|
||||||
data->amb_len = val32;
|
data->amb_len = val32;
|
||||||
|
|
||||||
|
@ -458,11 +460,13 @@ static int i5k_channel_probe(u16 *amb_present, unsigned long dev_id)
|
||||||
if (!pcidev)
|
if (!pcidev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (pci_read_config_word(pcidev, I5K_REG_CHAN0_PRESENCE_ADDR, &val16))
|
pci_read_config_word(pcidev, I5K_REG_CHAN0_PRESENCE_ADDR, &val16);
|
||||||
|
if (val16 == (u16)~0)
|
||||||
goto out;
|
goto out;
|
||||||
amb_present[0] = val16;
|
amb_present[0] = val16;
|
||||||
|
|
||||||
if (pci_read_config_word(pcidev, I5K_REG_CHAN1_PRESENCE_ADDR, &val16))
|
pci_read_config_word(pcidev, I5K_REG_CHAN1_PRESENCE_ADDR, &val16);
|
||||||
|
if (val16 == (u16)~0)
|
||||||
goto out;
|
goto out;
|
||||||
amb_present[1] = val16;
|
amb_present[1] = val16;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* Thanks to Jan Volkering
|
* Thanks to Jan Volkering
|
||||||
*
|
*
|
||||||
* Datasheet:
|
* Datasheet:
|
||||||
* http://www.ti.com/lit/gpn/ina209
|
* https://www.ti.com/lit/gpn/ina209
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -4,19 +4,19 @@
|
||||||
*
|
*
|
||||||
* INA219:
|
* INA219:
|
||||||
* Zero Drift Bi-Directional Current/Power Monitor with I2C Interface
|
* Zero Drift Bi-Directional Current/Power Monitor with I2C Interface
|
||||||
* Datasheet: http://www.ti.com/product/ina219
|
* Datasheet: https://www.ti.com/product/ina219
|
||||||
*
|
*
|
||||||
* INA220:
|
* INA220:
|
||||||
* Bi-Directional Current/Power Monitor with I2C Interface
|
* Bi-Directional Current/Power Monitor with I2C Interface
|
||||||
* Datasheet: http://www.ti.com/product/ina220
|
* Datasheet: https://www.ti.com/product/ina220
|
||||||
*
|
*
|
||||||
* INA226:
|
* INA226:
|
||||||
* Bi-Directional Current/Power Monitor with I2C Interface
|
* Bi-Directional Current/Power Monitor with I2C Interface
|
||||||
* Datasheet: http://www.ti.com/product/ina226
|
* Datasheet: https://www.ti.com/product/ina226
|
||||||
*
|
*
|
||||||
* INA230:
|
* INA230:
|
||||||
* Bi-directional Current/Power Monitor with I2C Interface
|
* Bi-directional Current/Power Monitor with I2C Interface
|
||||||
* Datasheet: http://www.ti.com/product/ina230
|
* Datasheet: https://www.ti.com/product/ina230
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012 Lothar Felten <lothar.felten@gmail.com>
|
* Copyright (C) 2012 Lothar Felten <lothar.felten@gmail.com>
|
||||||
* Thanks to Jan Volkering
|
* Thanks to Jan Volkering
|
||||||
|
@ -148,7 +148,7 @@ static const struct ina2xx_config ina2xx_config[] = {
|
||||||
* Available averaging rates for ina226. The indices correspond with
|
* Available averaging rates for ina226. The indices correspond with
|
||||||
* the bit values expected by the chip (according to the ina226 datasheet,
|
* the bit values expected by the chip (according to the ina226 datasheet,
|
||||||
* table 3 AVG bit settings, found at
|
* table 3 AVG bit settings, found at
|
||||||
* http://www.ti.com/lit/ds/symlink/ina226.pdf.
|
* https://www.ti.com/lit/ds/symlink/ina226.pdf.
|
||||||
*/
|
*/
|
||||||
static const int ina226_avg_tab[] = { 1, 4, 16, 64, 128, 256, 512, 1024 };
|
static const int ina226_avg_tab[] = { 1, 4, 16, 64, 128, 256, 512, 1024 };
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* INA3221 Triple Current/Voltage Monitor
|
* INA3221 Triple Current/Voltage Monitor
|
||||||
*
|
*
|
||||||
* Copyright (C) 2016 Texas Instruments Incorporated - http://www.ti.com/
|
* Copyright (C) 2016 Texas Instruments Incorporated - https://www.ti.com/
|
||||||
* Andrew F. Davis <afd@ti.com>
|
* Andrew F. Davis <afd@ti.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
* This driver also supports the ADM1024, a sensor chip made by Analog
|
* This driver also supports the ADM1024, a sensor chip made by Analog
|
||||||
* Devices. That chip is fully compatible with the LM87. Complete
|
* Devices. That chip is fully compatible with the LM87. Complete
|
||||||
* datasheet can be obtained from Analog's website at:
|
* datasheet can be obtained from Analog's website at:
|
||||||
* http://www.analog.com/en/prod/0,2877,ADM1024,00.html
|
* https://www.analog.com/en/prod/0,2877,ADM1024,00.html
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
|
@ -57,6 +57,8 @@ static const u8 MAX6697_REG_CRIT[] = {
|
||||||
#define MAX6581_REG_IDEALITY_SELECT 0x4c
|
#define MAX6581_REG_IDEALITY_SELECT 0x4c
|
||||||
#define MAX6581_REG_OFFSET 0x4d
|
#define MAX6581_REG_OFFSET 0x4d
|
||||||
#define MAX6581_REG_OFFSET_SELECT 0x4e
|
#define MAX6581_REG_OFFSET_SELECT 0x4e
|
||||||
|
#define MAX6581_OFFSET_MIN -31750
|
||||||
|
#define MAX6581_OFFSET_MAX 31750
|
||||||
|
|
||||||
#define MAX6697_CONV_TIME 156 /* ms per channel, worst case */
|
#define MAX6697_CONV_TIME 156 /* ms per channel, worst case */
|
||||||
|
|
||||||
|
@ -172,6 +174,11 @@ static const struct max6697_chip_data max6697_chip_data[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline int max6581_offset_to_millic(int val)
|
||||||
|
{
|
||||||
|
return sign_extend32(val, 7) * 250;
|
||||||
|
}
|
||||||
|
|
||||||
static struct max6697_data *max6697_update_device(struct device *dev)
|
static struct max6697_data *max6697_update_device(struct device *dev)
|
||||||
{
|
{
|
||||||
struct max6697_data *data = dev_get_drvdata(dev);
|
struct max6697_data *data = dev_get_drvdata(dev);
|
||||||
|
@ -317,6 +324,70 @@ static ssize_t temp_store(struct device *dev,
|
||||||
return ret < 0 ? ret : count;
|
return ret < 0 ? ret : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t offset_store(struct device *dev, struct device_attribute *devattr, const char *buf,
|
||||||
|
size_t count)
|
||||||
|
{
|
||||||
|
int val, ret, index, select;
|
||||||
|
struct max6697_data *data;
|
||||||
|
bool channel_enabled;
|
||||||
|
long temp;
|
||||||
|
|
||||||
|
index = to_sensor_dev_attr(devattr)->index;
|
||||||
|
data = dev_get_drvdata(dev);
|
||||||
|
ret = kstrtol(buf, 10, &temp);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
select = i2c_smbus_read_byte_data(data->client, MAX6581_REG_OFFSET_SELECT);
|
||||||
|
if (select < 0) {
|
||||||
|
ret = select;
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
channel_enabled = (select & (1 << (index - 1)));
|
||||||
|
temp = clamp_val(temp, MAX6581_OFFSET_MIN, MAX6581_OFFSET_MAX);
|
||||||
|
val = DIV_ROUND_CLOSEST(temp, 250);
|
||||||
|
/* disable the offset for channel if the new offset is 0 */
|
||||||
|
if (val == 0) {
|
||||||
|
if (channel_enabled)
|
||||||
|
ret = i2c_smbus_write_byte_data(data->client, MAX6581_REG_OFFSET_SELECT,
|
||||||
|
select & ~(1 << (index - 1)));
|
||||||
|
ret = ret < 0 ? ret : count;
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
if (!channel_enabled) {
|
||||||
|
ret = i2c_smbus_write_byte_data(data->client, MAX6581_REG_OFFSET_SELECT,
|
||||||
|
select | (1 << (index - 1)));
|
||||||
|
if (ret < 0)
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
ret = i2c_smbus_write_byte_data(data->client, MAX6581_REG_OFFSET, val);
|
||||||
|
ret = ret < 0 ? ret : count;
|
||||||
|
|
||||||
|
abort:
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t offset_show(struct device *dev, struct device_attribute *devattr, char *buf)
|
||||||
|
{
|
||||||
|
struct max6697_data *data;
|
||||||
|
int select, ret, index;
|
||||||
|
|
||||||
|
index = to_sensor_dev_attr(devattr)->index;
|
||||||
|
data = dev_get_drvdata(dev);
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
select = i2c_smbus_read_byte_data(data->client, MAX6581_REG_OFFSET_SELECT);
|
||||||
|
if (select < 0)
|
||||||
|
ret = select;
|
||||||
|
else if (select & (1 << (index - 1)))
|
||||||
|
ret = i2c_smbus_read_byte_data(data->client, MAX6581_REG_OFFSET);
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
return ret < 0 ? ret : sprintf(buf, "%d\n", max6581_offset_to_millic(ret));
|
||||||
|
}
|
||||||
|
|
||||||
static SENSOR_DEVICE_ATTR_RO(temp1_input, temp_input, 0);
|
static SENSOR_DEVICE_ATTR_RO(temp1_input, temp_input, 0);
|
||||||
static SENSOR_DEVICE_ATTR_2_RW(temp1_max, temp, 0, MAX6697_TEMP_MAX);
|
static SENSOR_DEVICE_ATTR_2_RW(temp1_max, temp, 0, MAX6697_TEMP_MAX);
|
||||||
static SENSOR_DEVICE_ATTR_2_RW(temp1_crit, temp, 0, MAX6697_TEMP_CRIT);
|
static SENSOR_DEVICE_ATTR_2_RW(temp1_crit, temp, 0, MAX6697_TEMP_CRIT);
|
||||||
|
@ -375,6 +446,15 @@ static SENSOR_DEVICE_ATTR_RO(temp6_fault, alarm, 5);
|
||||||
static SENSOR_DEVICE_ATTR_RO(temp7_fault, alarm, 6);
|
static SENSOR_DEVICE_ATTR_RO(temp7_fault, alarm, 6);
|
||||||
static SENSOR_DEVICE_ATTR_RO(temp8_fault, alarm, 7);
|
static SENSOR_DEVICE_ATTR_RO(temp8_fault, alarm, 7);
|
||||||
|
|
||||||
|
/* There is no offset for local temperature so starting from temp2 */
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp2_offset, offset, 1);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp3_offset, offset, 2);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp4_offset, offset, 3);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp5_offset, offset, 4);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp6_offset, offset, 5);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp7_offset, offset, 6);
|
||||||
|
static SENSOR_DEVICE_ATTR_RW(temp8_offset, offset, 7);
|
||||||
|
|
||||||
static DEVICE_ATTR(dummy, 0, NULL, NULL);
|
static DEVICE_ATTR(dummy, 0, NULL, NULL);
|
||||||
|
|
||||||
static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
|
static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||||
|
@ -383,8 +463,8 @@ static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||||
struct device *dev = container_of(kobj, struct device, kobj);
|
struct device *dev = container_of(kobj, struct device, kobj);
|
||||||
struct max6697_data *data = dev_get_drvdata(dev);
|
struct max6697_data *data = dev_get_drvdata(dev);
|
||||||
const struct max6697_chip_data *chip = data->chip;
|
const struct max6697_chip_data *chip = data->chip;
|
||||||
int channel = index / 6; /* channel number */
|
int channel = index / 7; /* channel number */
|
||||||
int nr = index % 6; /* attribute index within channel */
|
int nr = index % 7; /* attribute index within channel */
|
||||||
|
|
||||||
if (channel >= chip->channels)
|
if (channel >= chip->channels)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -393,6 +473,10 @@ static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
|
||||||
return 0;
|
return 0;
|
||||||
if (nr == 5 && !(chip->have_fault & (1 << channel)))
|
if (nr == 5 && !(chip->have_fault & (1 << channel)))
|
||||||
return 0;
|
return 0;
|
||||||
|
/* offset reg is only supported on max6581 remote channels */
|
||||||
|
if (nr == 6)
|
||||||
|
if (data->type != max6581 || channel == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return attr->mode;
|
return attr->mode;
|
||||||
}
|
}
|
||||||
|
@ -409,6 +493,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
&sensor_dev_attr_temp1_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
|
||||||
&dev_attr_dummy.attr,
|
&dev_attr_dummy.attr,
|
||||||
|
&dev_attr_dummy.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp2_input.dev_attr.attr,
|
&sensor_dev_attr_temp2_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp2_max.dev_attr.attr,
|
&sensor_dev_attr_temp2_max.dev_attr.attr,
|
||||||
|
@ -416,6 +501,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp2_crit.dev_attr.attr,
|
&sensor_dev_attr_temp2_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp2_fault.dev_attr.attr,
|
&sensor_dev_attr_temp2_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp2_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp3_input.dev_attr.attr,
|
&sensor_dev_attr_temp3_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp3_max.dev_attr.attr,
|
&sensor_dev_attr_temp3_max.dev_attr.attr,
|
||||||
|
@ -423,6 +509,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp3_crit.dev_attr.attr,
|
&sensor_dev_attr_temp3_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp3_fault.dev_attr.attr,
|
&sensor_dev_attr_temp3_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp3_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp4_input.dev_attr.attr,
|
&sensor_dev_attr_temp4_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp4_max.dev_attr.attr,
|
&sensor_dev_attr_temp4_max.dev_attr.attr,
|
||||||
|
@ -430,6 +517,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp4_crit.dev_attr.attr,
|
&sensor_dev_attr_temp4_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp4_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp4_fault.dev_attr.attr,
|
&sensor_dev_attr_temp4_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp4_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp5_input.dev_attr.attr,
|
&sensor_dev_attr_temp5_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp5_max.dev_attr.attr,
|
&sensor_dev_attr_temp5_max.dev_attr.attr,
|
||||||
|
@ -437,6 +525,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp5_crit.dev_attr.attr,
|
&sensor_dev_attr_temp5_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp5_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp5_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp5_fault.dev_attr.attr,
|
&sensor_dev_attr_temp5_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp5_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp6_input.dev_attr.attr,
|
&sensor_dev_attr_temp6_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp6_max.dev_attr.attr,
|
&sensor_dev_attr_temp6_max.dev_attr.attr,
|
||||||
|
@ -444,6 +533,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp6_crit.dev_attr.attr,
|
&sensor_dev_attr_temp6_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp6_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp6_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp6_fault.dev_attr.attr,
|
&sensor_dev_attr_temp6_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp6_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp7_input.dev_attr.attr,
|
&sensor_dev_attr_temp7_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp7_max.dev_attr.attr,
|
&sensor_dev_attr_temp7_max.dev_attr.attr,
|
||||||
|
@ -451,6 +541,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp7_crit.dev_attr.attr,
|
&sensor_dev_attr_temp7_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp7_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp7_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp7_fault.dev_attr.attr,
|
&sensor_dev_attr_temp7_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp7_offset.dev_attr.attr,
|
||||||
|
|
||||||
&sensor_dev_attr_temp8_input.dev_attr.attr,
|
&sensor_dev_attr_temp8_input.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp8_max.dev_attr.attr,
|
&sensor_dev_attr_temp8_max.dev_attr.attr,
|
||||||
|
@ -458,6 +549,7 @@ static struct attribute *max6697_attributes[] = {
|
||||||
&sensor_dev_attr_temp8_crit.dev_attr.attr,
|
&sensor_dev_attr_temp8_crit.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp8_crit_alarm.dev_attr.attr,
|
&sensor_dev_attr_temp8_crit_alarm.dev_attr.attr,
|
||||||
&sensor_dev_attr_temp8_fault.dev_attr.attr,
|
&sensor_dev_attr_temp8_fault.dev_attr.attr,
|
||||||
|
&sensor_dev_attr_temp8_offset.dev_attr.attr,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -674,7 +674,7 @@ show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
static umode_t nct6683_in_is_visible(struct kobject *kobj,
|
static umode_t nct6683_in_is_visible(struct kobject *kobj,
|
||||||
struct attribute *attr, int index)
|
struct attribute *attr, int index)
|
||||||
{
|
{
|
||||||
struct device *dev = container_of(kobj, struct device, kobj);
|
struct device *dev = kobj_to_dev(kobj);
|
||||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||||
int nr = index % 4; /* attribute */
|
int nr = index % 4; /* attribute */
|
||||||
|
|
||||||
|
@ -739,7 +739,7 @@ show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
static umode_t nct6683_fan_is_visible(struct kobject *kobj,
|
static umode_t nct6683_fan_is_visible(struct kobject *kobj,
|
||||||
struct attribute *attr, int index)
|
struct attribute *attr, int index)
|
||||||
{
|
{
|
||||||
struct device *dev = container_of(kobj, struct device, kobj);
|
struct device *dev = kobj_to_dev(kobj);
|
||||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||||
int fan = index / 3; /* fan index */
|
int fan = index / 3; /* fan index */
|
||||||
int nr = index % 3; /* attribute index */
|
int nr = index % 3; /* attribute index */
|
||||||
|
@ -857,7 +857,7 @@ show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
static umode_t nct6683_temp_is_visible(struct kobject *kobj,
|
static umode_t nct6683_temp_is_visible(struct kobject *kobj,
|
||||||
struct attribute *attr, int index)
|
struct attribute *attr, int index)
|
||||||
{
|
{
|
||||||
struct device *dev = container_of(kobj, struct device, kobj);
|
struct device *dev = kobj_to_dev(kobj);
|
||||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||||
int temp = index / 7; /* temp index */
|
int temp = index / 7; /* temp index */
|
||||||
int nr = index % 7; /* attribute index */
|
int nr = index % 7; /* attribute index */
|
||||||
|
@ -944,7 +944,7 @@ SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, store_pwm, 0);
|
||||||
static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
|
static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
|
||||||
struct attribute *attr, int index)
|
struct attribute *attr, int index)
|
||||||
{
|
{
|
||||||
struct device *dev = container_of(kobj, struct device, kobj);
|
struct device *dev = kobj_to_dev(kobj);
|
||||||
struct nct6683_data *data = dev_get_drvdata(dev);
|
struct nct6683_data *data = dev_get_drvdata(dev);
|
||||||
int pwm = index; /* pwm index */
|
int pwm = index; /* pwm index */
|
||||||
|
|
||||||
|
|
|
@ -156,10 +156,10 @@ config SENSORS_MAX16601
|
||||||
be called max16601.
|
be called max16601.
|
||||||
|
|
||||||
config SENSORS_MAX20730
|
config SENSORS_MAX20730
|
||||||
tristate "Maxim MAX20730, MAX20734, MAX20743"
|
tristate "Maxim MAX20710, MAX20730, MAX20734, MAX20743"
|
||||||
help
|
help
|
||||||
If you say yes here you get hardware monitoring support for Maxim
|
If you say yes here you get hardware monitoring support for Maxim
|
||||||
MAX20730, MAX20734, and MAX20743.
|
MAX20710, MAX20730, MAX20734, and MAX20743.
|
||||||
|
|
||||||
This driver can also be built as a module. If so, the module will
|
This driver can also be built as a module. If so, the module will
|
||||||
be called max20730.
|
be called max20730.
|
||||||
|
|
|
@ -683,11 +683,13 @@ static int adm1275_probe(struct i2c_client *client,
|
||||||
tindex = 3;
|
tindex = 3;
|
||||||
|
|
||||||
info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
|
info->func[0] |= PMBUS_HAVE_PIN | PMBUS_HAVE_STATUS_INPUT |
|
||||||
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT;
|
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
||||||
|
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
|
||||||
|
|
||||||
/* Enable VOUT if not enabled (it is disabled by default) */
|
/* Enable VOUT & TEMP1 if not enabled (disabled by default) */
|
||||||
if (!(config & ADM1278_VOUT_EN)) {
|
if ((config & (ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) !=
|
||||||
config |= ADM1278_VOUT_EN;
|
(ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) {
|
||||||
|
config |= ADM1278_VOUT_EN | ADM1278_TEMP1_EN;
|
||||||
ret = i2c_smbus_write_byte_data(client,
|
ret = i2c_smbus_write_byte_data(client,
|
||||||
ADM1275_PMON_CONFIG,
|
ADM1275_PMON_CONFIG,
|
||||||
config);
|
config);
|
||||||
|
@ -698,9 +700,6 @@ static int adm1275_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config & ADM1278_TEMP1_EN)
|
|
||||||
info->func[0] |=
|
|
||||||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
|
|
||||||
if (config & ADM1278_VIN_EN)
|
if (config & ADM1278_VIN_EN)
|
||||||
info->func[0] |= PMBUS_HAVE_VIN;
|
info->func[0] |= PMBUS_HAVE_VIN;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
/*
|
/*
|
||||||
* Driver for MAX20730, MAX20734, and MAX20743 Integrated, Step-Down
|
* Driver for MAX20710, MAX20730, MAX20734, and MAX20743 Integrated,
|
||||||
* Switching Regulators
|
* Step-Down Switching Regulators
|
||||||
*
|
*
|
||||||
* Copyright 2019 Google LLC.
|
* Copyright 2019 Google LLC.
|
||||||
|
* Copyright 2020 Maxim Integrated
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/bits.h>
|
#include <linux/bits.h>
|
||||||
|
@ -19,6 +20,7 @@
|
||||||
#include "pmbus.h"
|
#include "pmbus.h"
|
||||||
|
|
||||||
enum chips {
|
enum chips {
|
||||||
|
max20710,
|
||||||
max20730,
|
max20730,
|
||||||
max20734,
|
max20734,
|
||||||
max20743
|
max20743
|
||||||
|
@ -80,6 +82,7 @@ static long direct_to_val(u16 w, enum pmbus_sensor_classes class,
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 max_current[][5] = {
|
static u32 max_current[][5] = {
|
||||||
|
[max20710] = { 6200, 8000, 9700, 11600 },
|
||||||
[max20730] = { 13000, 16600, 20100, 23600 },
|
[max20730] = { 13000, 16600, 20100, 23600 },
|
||||||
[max20734] = { 21000, 27000, 32000, 38000 },
|
[max20734] = { 21000, 27000, 32000, 38000 },
|
||||||
[max20743] = { 18900, 24100, 29200, 34100 },
|
[max20743] = { 18900, 24100, 29200, 34100 },
|
||||||
|
@ -164,6 +167,35 @@ static int max20730_write_word_data(struct i2c_client *client, int page,
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct pmbus_driver_info max20730_info[] = {
|
static const struct pmbus_driver_info max20730_info[] = {
|
||||||
|
[max20710] = {
|
||||||
|
.pages = 1,
|
||||||
|
.read_word_data = max20730_read_word_data,
|
||||||
|
.write_word_data = max20730_write_word_data,
|
||||||
|
|
||||||
|
/* Source : Maxim AN6140 and AN6042 */
|
||||||
|
.format[PSC_TEMPERATURE] = direct,
|
||||||
|
.m[PSC_TEMPERATURE] = 21,
|
||||||
|
.b[PSC_TEMPERATURE] = 5887,
|
||||||
|
.R[PSC_TEMPERATURE] = -1,
|
||||||
|
|
||||||
|
.format[PSC_VOLTAGE_IN] = direct,
|
||||||
|
.m[PSC_VOLTAGE_IN] = 3609,
|
||||||
|
.b[PSC_VOLTAGE_IN] = 0,
|
||||||
|
.R[PSC_VOLTAGE_IN] = -2,
|
||||||
|
|
||||||
|
.format[PSC_CURRENT_OUT] = direct,
|
||||||
|
.m[PSC_CURRENT_OUT] = 153,
|
||||||
|
.b[PSC_CURRENT_OUT] = 4976,
|
||||||
|
.R[PSC_CURRENT_OUT] = -1,
|
||||||
|
|
||||||
|
.format[PSC_VOLTAGE_OUT] = linear,
|
||||||
|
|
||||||
|
.func[0] = PMBUS_HAVE_VIN |
|
||||||
|
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
||||||
|
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
||||||
|
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
|
||||||
|
PMBUS_HAVE_STATUS_INPUT,
|
||||||
|
},
|
||||||
[max20730] = {
|
[max20730] = {
|
||||||
.pages = 1,
|
.pages = 1,
|
||||||
.read_word_data = max20730_read_word_data,
|
.read_word_data = max20730_read_word_data,
|
||||||
|
@ -200,7 +232,8 @@ static const struct pmbus_driver_info max20730_info[] = {
|
||||||
.func[0] = PMBUS_HAVE_VIN |
|
.func[0] = PMBUS_HAVE_VIN |
|
||||||
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
||||||
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
||||||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
|
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
|
||||||
|
PMBUS_HAVE_STATUS_INPUT,
|
||||||
},
|
},
|
||||||
[max20734] = {
|
[max20734] = {
|
||||||
.pages = 1,
|
.pages = 1,
|
||||||
|
@ -228,7 +261,8 @@ static const struct pmbus_driver_info max20730_info[] = {
|
||||||
.func[0] = PMBUS_HAVE_VIN |
|
.func[0] = PMBUS_HAVE_VIN |
|
||||||
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
||||||
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
||||||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
|
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
|
||||||
|
PMBUS_HAVE_STATUS_INPUT,
|
||||||
},
|
},
|
||||||
[max20743] = {
|
[max20743] = {
|
||||||
.pages = 1,
|
.pages = 1,
|
||||||
|
@ -256,7 +290,8 @@ static const struct pmbus_driver_info max20730_info[] = {
|
||||||
.func[0] = PMBUS_HAVE_VIN |
|
.func[0] = PMBUS_HAVE_VIN |
|
||||||
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
PMBUS_HAVE_VOUT | PMBUS_HAVE_STATUS_VOUT |
|
||||||
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
PMBUS_HAVE_IOUT | PMBUS_HAVE_STATUS_IOUT |
|
||||||
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP,
|
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP |
|
||||||
|
PMBUS_HAVE_STATUS_INPUT,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -339,6 +374,7 @@ static int max20730_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct i2c_device_id max20730_id[] = {
|
static const struct i2c_device_id max20730_id[] = {
|
||||||
|
{ "max20710", max20710 },
|
||||||
{ "max20730", max20730 },
|
{ "max20730", max20730 },
|
||||||
{ "max20734", max20734 },
|
{ "max20734", max20734 },
|
||||||
{ "max20743", max20743 },
|
{ "max20743", max20743 },
|
||||||
|
@ -348,6 +384,7 @@ static const struct i2c_device_id max20730_id[] = {
|
||||||
MODULE_DEVICE_TABLE(i2c, max20730_id);
|
MODULE_DEVICE_TABLE(i2c, max20730_id);
|
||||||
|
|
||||||
static const struct of_device_id max20730_of_match[] = {
|
static const struct of_device_id max20730_of_match[] = {
|
||||||
|
{ .compatible = "maxim,max20710", .data = (void *)max20710 },
|
||||||
{ .compatible = "maxim,max20730", .data = (void *)max20730 },
|
{ .compatible = "maxim,max20730", .data = (void *)max20730 },
|
||||||
{ .compatible = "maxim,max20734", .data = (void *)max20734 },
|
{ .compatible = "maxim,max20734", .data = (void *)max20734 },
|
||||||
{ .compatible = "maxim,max20743", .data = (void *)max20743 },
|
{ .compatible = "maxim,max20743", .data = (void *)max20743 },
|
||||||
|
@ -369,5 +406,5 @@ static struct i2c_driver max20730_driver = {
|
||||||
module_i2c_driver(max20730_driver);
|
module_i2c_driver(max20730_driver);
|
||||||
|
|
||||||
MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
|
MODULE_AUTHOR("Guenter Roeck <linux@roeck-us.net>");
|
||||||
MODULE_DESCRIPTION("PMBus driver for Maxim MAX20730 / MAX20734 / MAX20743");
|
MODULE_DESCRIPTION("PMBus driver for Maxim MAX20710 / MAX20730 / MAX20734 / MAX20743");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
|
@ -628,12 +628,12 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
|
||||||
* Convert linear sensor values to milli- or micro-units
|
* Convert linear sensor values to milli- or micro-units
|
||||||
* depending on sensor type.
|
* depending on sensor type.
|
||||||
*/
|
*/
|
||||||
static long pmbus_reg2data_linear(struct pmbus_data *data,
|
static s64 pmbus_reg2data_linear(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor)
|
struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
s16 exponent;
|
s16 exponent;
|
||||||
s32 mantissa;
|
s32 mantissa;
|
||||||
long val;
|
s64 val;
|
||||||
|
|
||||||
if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
|
if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
|
||||||
exponent = data->exponent[sensor->page];
|
exponent = data->exponent[sensor->page];
|
||||||
|
@ -647,11 +647,11 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
|
||||||
|
|
||||||
/* scale result to milli-units for all sensors except fans */
|
/* scale result to milli-units for all sensors except fans */
|
||||||
if (sensor->class != PSC_FAN)
|
if (sensor->class != PSC_FAN)
|
||||||
val = val * 1000L;
|
val = val * 1000LL;
|
||||||
|
|
||||||
/* scale result to micro-units for power sensors */
|
/* scale result to micro-units for power sensors */
|
||||||
if (sensor->class == PSC_POWER)
|
if (sensor->class == PSC_POWER)
|
||||||
val = val * 1000L;
|
val = val * 1000LL;
|
||||||
|
|
||||||
if (exponent >= 0)
|
if (exponent >= 0)
|
||||||
val <<= exponent;
|
val <<= exponent;
|
||||||
|
@ -665,8 +665,8 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
|
||||||
* Convert direct sensor values to milli- or micro-units
|
* Convert direct sensor values to milli- or micro-units
|
||||||
* depending on sensor type.
|
* depending on sensor type.
|
||||||
*/
|
*/
|
||||||
static long pmbus_reg2data_direct(struct pmbus_data *data,
|
static s64 pmbus_reg2data_direct(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor)
|
struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
s64 b, val = (s16)sensor->data;
|
s64 b, val = (s16)sensor->data;
|
||||||
s32 m, R;
|
s32 m, R;
|
||||||
|
@ -702,15 +702,15 @@ static long pmbus_reg2data_direct(struct pmbus_data *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
val = div_s64(val - b, m);
|
val = div_s64(val - b, m);
|
||||||
return clamp_val(val, LONG_MIN, LONG_MAX);
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convert VID sensor values to milli- or micro-units
|
* Convert VID sensor values to milli- or micro-units
|
||||||
* depending on sensor type.
|
* depending on sensor type.
|
||||||
*/
|
*/
|
||||||
static long pmbus_reg2data_vid(struct pmbus_data *data,
|
static s64 pmbus_reg2data_vid(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor)
|
struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
long val = sensor->data;
|
long val = sensor->data;
|
||||||
long rv = 0;
|
long rv = 0;
|
||||||
|
@ -740,9 +740,9 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
|
static s64 pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
|
||||||
{
|
{
|
||||||
long val;
|
s64 val;
|
||||||
|
|
||||||
if (!sensor->convert)
|
if (!sensor->convert)
|
||||||
return sensor->data;
|
return sensor->data;
|
||||||
|
@ -766,7 +766,7 @@ static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
|
||||||
#define MIN_MANTISSA (511 * 1000)
|
#define MIN_MANTISSA (511 * 1000)
|
||||||
|
|
||||||
static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor, long val)
|
struct pmbus_sensor *sensor, s64 val)
|
||||||
{
|
{
|
||||||
s16 exponent = 0, mantissa;
|
s16 exponent = 0, mantissa;
|
||||||
bool negative = false;
|
bool negative = false;
|
||||||
|
@ -788,8 +788,8 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
||||||
val <<= -data->exponent[sensor->page];
|
val <<= -data->exponent[sensor->page];
|
||||||
else
|
else
|
||||||
val >>= data->exponent[sensor->page];
|
val >>= data->exponent[sensor->page];
|
||||||
val = DIV_ROUND_CLOSEST(val, 1000);
|
val = DIV_ROUND_CLOSEST_ULL(val, 1000);
|
||||||
return val & 0xffff;
|
return clamp_val(val, 0, 0xffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
|
@ -799,14 +799,14 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
||||||
|
|
||||||
/* Power is in uW. Convert to mW before converting. */
|
/* Power is in uW. Convert to mW before converting. */
|
||||||
if (sensor->class == PSC_POWER)
|
if (sensor->class == PSC_POWER)
|
||||||
val = DIV_ROUND_CLOSEST(val, 1000L);
|
val = DIV_ROUND_CLOSEST_ULL(val, 1000);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For simplicity, convert fan data to milli-units
|
* For simplicity, convert fan data to milli-units
|
||||||
* before calculating the exponent.
|
* before calculating the exponent.
|
||||||
*/
|
*/
|
||||||
if (sensor->class == PSC_FAN)
|
if (sensor->class == PSC_FAN)
|
||||||
val = val * 1000;
|
val = val * 1000LL;
|
||||||
|
|
||||||
/* Reduce large mantissa until it fits into 10 bit */
|
/* Reduce large mantissa until it fits into 10 bit */
|
||||||
while (val >= MAX_MANTISSA && exponent < 15) {
|
while (val >= MAX_MANTISSA && exponent < 15) {
|
||||||
|
@ -820,11 +820,7 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert mantissa from milli-units to units */
|
/* Convert mantissa from milli-units to units */
|
||||||
mantissa = DIV_ROUND_CLOSEST(val, 1000);
|
mantissa = clamp_val(DIV_ROUND_CLOSEST_ULL(val, 1000), 0, 0x3ff);
|
||||||
|
|
||||||
/* Ensure that resulting number is within range */
|
|
||||||
if (mantissa > 0x3ff)
|
|
||||||
mantissa = 0x3ff;
|
|
||||||
|
|
||||||
/* restore sign */
|
/* restore sign */
|
||||||
if (negative)
|
if (negative)
|
||||||
|
@ -835,9 +831,9 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 pmbus_data2reg_direct(struct pmbus_data *data,
|
static u16 pmbus_data2reg_direct(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor, long val)
|
struct pmbus_sensor *sensor, s64 val)
|
||||||
{
|
{
|
||||||
s64 b, val64 = val;
|
s64 b;
|
||||||
s32 m, R;
|
s32 m, R;
|
||||||
|
|
||||||
m = data->info->m[sensor->class];
|
m = data->info->m[sensor->class];
|
||||||
|
@ -855,30 +851,30 @@ static u16 pmbus_data2reg_direct(struct pmbus_data *data,
|
||||||
R -= 3; /* Adjust R and b for data in milli-units */
|
R -= 3; /* Adjust R and b for data in milli-units */
|
||||||
b *= 1000;
|
b *= 1000;
|
||||||
}
|
}
|
||||||
val64 = val64 * m + b;
|
val = val * m + b;
|
||||||
|
|
||||||
while (R > 0) {
|
while (R > 0) {
|
||||||
val64 *= 10;
|
val *= 10;
|
||||||
R--;
|
R--;
|
||||||
}
|
}
|
||||||
while (R < 0) {
|
while (R < 0) {
|
||||||
val64 = div_s64(val64 + 5LL, 10L); /* round closest */
|
val = div_s64(val + 5LL, 10L); /* round closest */
|
||||||
R++;
|
R++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (u16)clamp_val(val64, S16_MIN, S16_MAX);
|
return (u16)clamp_val(val, S16_MIN, S16_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 pmbus_data2reg_vid(struct pmbus_data *data,
|
static u16 pmbus_data2reg_vid(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor, long val)
|
struct pmbus_sensor *sensor, s64 val)
|
||||||
{
|
{
|
||||||
val = clamp_val(val, 500, 1600);
|
val = clamp_val(val, 500, 1600);
|
||||||
|
|
||||||
return 2 + DIV_ROUND_CLOSEST((1600 - val) * 100, 625);
|
return 2 + DIV_ROUND_CLOSEST_ULL((1600LL - val) * 100LL, 625);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u16 pmbus_data2reg(struct pmbus_data *data,
|
static u16 pmbus_data2reg(struct pmbus_data *data,
|
||||||
struct pmbus_sensor *sensor, long val)
|
struct pmbus_sensor *sensor, s64 val)
|
||||||
{
|
{
|
||||||
u16 regval;
|
u16 regval;
|
||||||
|
|
||||||
|
@ -944,7 +940,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, struct pmbus_boolean *b,
|
||||||
WARN(1, "Bad boolean descriptor %p: s1=%p, s2=%p\n", b, s1, s2);
|
WARN(1, "Bad boolean descriptor %p: s1=%p, s2=%p\n", b, s1, s2);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
long v1, v2;
|
s64 v1, v2;
|
||||||
|
|
||||||
if (s1->data < 0)
|
if (s1->data < 0)
|
||||||
return s1->data;
|
return s1->data;
|
||||||
|
@ -981,7 +977,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,
|
||||||
if (sensor->data < 0)
|
if (sensor->data < 0)
|
||||||
return sensor->data;
|
return sensor->data;
|
||||||
|
|
||||||
return snprintf(buf, PAGE_SIZE, "%ld\n", pmbus_reg2data(data, sensor));
|
return snprintf(buf, PAGE_SIZE, "%lld\n", pmbus_reg2data(data, sensor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t pmbus_set_sensor(struct device *dev,
|
static ssize_t pmbus_set_sensor(struct device *dev,
|
||||||
|
@ -992,11 +988,11 @@ static ssize_t pmbus_set_sensor(struct device *dev,
|
||||||
struct pmbus_data *data = i2c_get_clientdata(client);
|
struct pmbus_data *data = i2c_get_clientdata(client);
|
||||||
struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
|
struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
|
||||||
ssize_t rv = count;
|
ssize_t rv = count;
|
||||||
long val = 0;
|
s64 val;
|
||||||
int ret;
|
int ret;
|
||||||
u16 regval;
|
u16 regval;
|
||||||
|
|
||||||
if (kstrtol(buf, 10, &val) < 0)
|
if (kstrtos64(buf, 10, &val) < 0)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&data->update_lock);
|
mutex_lock(&data->update_lock);
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* and monitor. Users can read all ADC inputs along with their labels
|
* and monitor. Users can read all ADC inputs along with their labels
|
||||||
* using the sysfs nodes.
|
* using the sysfs nodes.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2014 Echo360 http://www.echo360.com
|
* Copyright (c) 2014 Echo360 https://www.echo360.com
|
||||||
* Scott Kanowitz <skanowitz@echo360.com> <scott.kanowitz@gmail.com>
|
* Scott Kanowitz <skanowitz@echo360.com> <scott.kanowitz@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Urs Fleisch <urs.fleisch@sensirion.com>
|
* Copyright (C) 2010 Urs Fleisch <urs.fleisch@sensirion.com>
|
||||||
*
|
*
|
||||||
* Data sheet available at http://www.sensirion.com/file/datasheet_sht21
|
* Data sheet available at https://www.sensirion.com/file/datasheet_sht21
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
|
@ -0,0 +1,168 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/* Sparx5 SoC temperature sensor driver
|
||||||
|
*
|
||||||
|
* Copyright (C) 2020 Lars Povlsen <lars.povlsen@microchip.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/bitfield.h>
|
||||||
|
#include <linux/clk.h>
|
||||||
|
#include <linux/hwmon.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/mod_devicetable.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
#define TEMP_CTRL 0
|
||||||
|
#define TEMP_CFG 4
|
||||||
|
#define TEMP_CFG_CYCLES GENMASK(24, 15)
|
||||||
|
#define TEMP_CFG_ENA BIT(0)
|
||||||
|
#define TEMP_STAT 8
|
||||||
|
#define TEMP_STAT_VALID BIT(12)
|
||||||
|
#define TEMP_STAT_TEMP GENMASK(11, 0)
|
||||||
|
|
||||||
|
struct s5_hwmon {
|
||||||
|
void __iomem *base;
|
||||||
|
struct clk *clk;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void s5_temp_clk_disable(void *data)
|
||||||
|
{
|
||||||
|
struct clk *clk = data;
|
||||||
|
|
||||||
|
clk_disable_unprepare(clk);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void s5_temp_enable(struct s5_hwmon *hwmon)
|
||||||
|
{
|
||||||
|
u32 val = readl(hwmon->base + TEMP_CFG);
|
||||||
|
u32 clk = clk_get_rate(hwmon->clk) / USEC_PER_SEC;
|
||||||
|
|
||||||
|
val &= ~TEMP_CFG_CYCLES;
|
||||||
|
val |= FIELD_PREP(TEMP_CFG_CYCLES, clk);
|
||||||
|
val |= TEMP_CFG_ENA;
|
||||||
|
|
||||||
|
writel(val, hwmon->base + TEMP_CFG);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int s5_read(struct device *dev, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel, long *temp)
|
||||||
|
{
|
||||||
|
struct s5_hwmon *hwmon = dev_get_drvdata(dev);
|
||||||
|
int rc = 0, value;
|
||||||
|
u32 stat;
|
||||||
|
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_temp_input:
|
||||||
|
stat = readl_relaxed(hwmon->base + TEMP_STAT);
|
||||||
|
if (!(stat & TEMP_STAT_VALID))
|
||||||
|
return -EIO;
|
||||||
|
value = stat & TEMP_STAT_TEMP;
|
||||||
|
/*
|
||||||
|
* From register documentation:
|
||||||
|
* Temp(C) = TEMP_SENSOR_STAT.TEMP / 4096 * 352.2 - 109.4
|
||||||
|
*/
|
||||||
|
value = DIV_ROUND_CLOSEST(value * 3522, 4096) - 1094;
|
||||||
|
/*
|
||||||
|
* Scale down by 10 from above and multiply by 1000 to
|
||||||
|
* have millidegrees as specified by the hwmon sysfs
|
||||||
|
* interface.
|
||||||
|
*/
|
||||||
|
value *= 100;
|
||||||
|
*temp = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rc = -EOPNOTSUPP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static umode_t s5_is_visible(const void *_data, enum hwmon_sensor_types type,
|
||||||
|
u32 attr, int channel)
|
||||||
|
{
|
||||||
|
if (type != hwmon_temp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (attr) {
|
||||||
|
case hwmon_temp_input:
|
||||||
|
return 0444;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct hwmon_channel_info *s5_info[] = {
|
||||||
|
HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
|
||||||
|
HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hwmon_ops s5_hwmon_ops = {
|
||||||
|
.is_visible = s5_is_visible,
|
||||||
|
.read = s5_read,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct hwmon_chip_info s5_chip_info = {
|
||||||
|
.ops = &s5_hwmon_ops,
|
||||||
|
.info = s5_info,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int s5_temp_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *hwmon_dev;
|
||||||
|
struct s5_hwmon *hwmon;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
hwmon = devm_kzalloc(&pdev->dev, sizeof(*hwmon), GFP_KERNEL);
|
||||||
|
if (!hwmon)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
hwmon->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
if (IS_ERR(hwmon->base))
|
||||||
|
return PTR_ERR(hwmon->base);
|
||||||
|
|
||||||
|
hwmon->clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
if (IS_ERR(hwmon->clk))
|
||||||
|
return PTR_ERR(hwmon->clk);
|
||||||
|
|
||||||
|
ret = clk_prepare_enable(hwmon->clk);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = devm_add_action_or_reset(&pdev->dev, s5_temp_clk_disable,
|
||||||
|
hwmon->clk);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
s5_temp_enable(hwmon);
|
||||||
|
|
||||||
|
hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
|
||||||
|
"s5_temp",
|
||||||
|
hwmon,
|
||||||
|
&s5_chip_info,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return PTR_ERR_OR_ZERO(hwmon_dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id s5_temp_match[] = {
|
||||||
|
{ .compatible = "microchip,sparx5-temp" },
|
||||||
|
{},
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, s5_temp_match);
|
||||||
|
|
||||||
|
static struct platform_driver s5_temp_driver = {
|
||||||
|
.probe = s5_temp_probe,
|
||||||
|
.driver = {
|
||||||
|
.name = "sparx5-temp",
|
||||||
|
.of_match_table = s5_temp_match,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
module_platform_driver(s5_temp_driver);
|
||||||
|
|
||||||
|
MODULE_AUTHOR("Lars Povlsen <lars.povlsen@microchip.com>");
|
||||||
|
MODULE_DESCRIPTION("Sparx5 SoC temperature sensor driver");
|
||||||
|
MODULE_LICENSE("GPL");
|
|
@ -5,12 +5,12 @@
|
||||||
* TMP513:
|
* TMP513:
|
||||||
* Thermal/Power Management with Triple Remote and
|
* Thermal/Power Management with Triple Remote and
|
||||||
* Local Temperature Sensor and Current Shunt Monitor
|
* Local Temperature Sensor and Current Shunt Monitor
|
||||||
* Datasheet: http://www.ti.com/lit/gpn/tmp513
|
* Datasheet: https://www.ti.com/lit/gpn/tmp513
|
||||||
*
|
*
|
||||||
* TMP512:
|
* TMP512:
|
||||||
* Thermal/Power Management with Dual Remote
|
* Thermal/Power Management with Dual Remote
|
||||||
* and Local Temperature Sensor and Current Shunt Monitor
|
* and Local Temperature Sensor and Current Shunt Monitor
|
||||||
* Datasheet: http://www.ti.com/lit/gpn/tmp512
|
* Datasheet: https://www.ti.com/lit/gpn/tmp512
|
||||||
*
|
*
|
||||||
* Copyright (C) 2019 Eric Tremblay <etremblay@distech-controls.com>
|
* Copyright (C) 2019 Eric Tremblay <etremblay@distech-controls.com>
|
||||||
*
|
*
|
||||||
|
|
|
@ -992,8 +992,8 @@ static int vt8231_pci_probe(struct pci_dev *dev,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PCIBIOS_SUCCESSFUL != pci_read_config_word(dev, VT8231_BASE_REG,
|
pci_read_config_word(dev, VT8231_BASE_REG, &val);
|
||||||
&val))
|
if (val == (u16)~0)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
address = val & ~(VT8231_EXTENT - 1);
|
address = val & ~(VT8231_EXTENT - 1);
|
||||||
|
@ -1002,8 +1002,8 @@ static int vt8231_pci_probe(struct pci_dev *dev,
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PCIBIOS_SUCCESSFUL != pci_read_config_word(dev, VT8231_ENABLE_REG,
|
pci_read_config_word(dev, VT8231_ENABLE_REG, &val);
|
||||||
&val))
|
if (val == (u16)~0)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (!(val & 0x0001)) {
|
if (!(val & 0x0001)) {
|
||||||
|
|
|
@ -4,8 +4,9 @@
|
||||||
|
|
||||||
enum gsc_hwmon_mode {
|
enum gsc_hwmon_mode {
|
||||||
mode_temperature,
|
mode_temperature,
|
||||||
mode_voltage,
|
mode_voltage_24bit,
|
||||||
mode_voltage_raw,
|
mode_voltage_raw,
|
||||||
|
mode_voltage_16bit,
|
||||||
mode_max,
|
mode_max,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue