Commit 9aebd325 authored by Linus Torvalds's avatar Linus Torvalds

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
  ...
parents 44197797 e2f75e6b
# 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: | ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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>
......
.. 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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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> ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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):: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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> ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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
......
.. 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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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: ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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
......
// 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 = { ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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 @@ ...@@ -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 @@ ...@@ -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[] = { ...@@ -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 @@ ...@@ -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 @@ ...@@ -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[] = { ...@@ -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[] = { ...@@ -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, ...@@ -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); ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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); ...@@ -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 ...@@ -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, ...@@ -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, ...@@ -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;
......
// 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 @@ ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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, ...@@ -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[] = { ...@@ -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 = { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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 @@ ...@@ -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>
......
// 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 @@ ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment