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: |
consumption.
Datasheets:
http://www.ti.com/lit/gpn/tmp513
http://www.ti.com/lit/gpn/tmp512
https://www.ti.com/lit/gpn/tmp513
https://www.ti.com/lit/gpn/tmp512
properties:
......
......@@ -9,7 +9,7 @@ Supported chips:
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
......
......@@ -10,7 +10,7 @@ Supported chips:
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:
- Philip Pokorny <ppokorny@penguincomputing.com> for Penguin Computing
......
......@@ -10,7 +10,7 @@ Supported chips:
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
......@@ -20,7 +20,7 @@ Supported chips:
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:
- Alexandre d'Alton <alex@alexdalton.org>
......
......@@ -49,7 +49,7 @@ Supported chips:
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>
......
......@@ -11,7 +11,7 @@ Supported chips:
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
Prefix: 'adt7420'
......@@ -20,7 +20,7 @@ Supported chips:
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
......@@ -30,7 +30,7 @@ Supported chips:
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
......@@ -40,7 +40,7 @@ Supported chips:
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>
......
.. SPDX-License-Identifier: GPL-2.0-or-later
Kernel driver corsair-cpro
==========================
Supported devices:
* Corsair Commander Pro
* Corsair Commander Pro (1000D)
Author: Marius Zachmann
Description
-----------
This driver implements the sysfs interface for the Corsair Commander Pro.
The Corsair Commander Pro is a USB device with 6 fan connectors,
4 temperature sensor connectors and 2 Corsair LED connectors.
It can read the voltage levels on the SATA power connector.
Usage Notes
-----------
Since it is a USB device, hotswapping is possible. The device is autodetected.
Sysfs entries
-------------
======================= =====================================================================
in0_input Voltage on SATA 12v
in1_input Voltage on SATA 5v
in2_input Voltage on SATA 3.3v
temp[1-4]_input Temperature on connected temperature sensors
fan[1-6]_input Connected fan rpm.
fan[1-6]_label Shows fan type as detected by the device.
fan[1-6]_target Sets fan speed target rpm.
When reading, it reports the last value if it was set by the driver.
Otherwise returns an error.
pwm[1-6] Sets the fan speed. Values from 0-255. Can only be read if pwm
was set directly.
======================= =====================================================================
......@@ -12,7 +12,7 @@ Supported chips:
Datasheets:
- 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
......@@ -33,7 +33,7 @@ Supported chips:
Datasheet:
- http://ww1.microchip.com/downloads/en/DeviceDoc/1422.pdf
- https://ww1.microchip.com/downloads/en/DeviceDoc/1422.pdf
* SMSC / Microchip EMC1423, EMC1424
......@@ -43,7 +43,7 @@ Supported chips:
Datasheet:
- http://ww1.microchip.com/downloads/en/DeviceDoc/1423_1424.pdf
- https://ww1.microchip.com/downloads/en/DeviceDoc/1423_1424.pdf
Author:
Kalhan Trisal <kalhan.trisal@intel.com
......
......@@ -145,7 +145,7 @@ motherboard, so the driver assumes that the BIOS set the method
properly.
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
to low temp! This is how things are implemented in the IC, and the driver
mimics this.
......
......@@ -10,7 +10,7 @@ Supported chips:
Addresses scanned: -
Datasheet:
http://www.ti.com/lit/gpn/ina209
https://www.ti.com/lit/gpn/ina209
Author:
- Paul Hays <Paul.Hays@cattail.ca>
......
......@@ -11,7 +11,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
* Texas Instruments INA220
......@@ -21,7 +21,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
* Texas Instruments INA226
......@@ -31,7 +31,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
* Texas Instruments INA230
......@@ -41,7 +41,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
* Texas Instruments INA231
......@@ -51,7 +51,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
Author: Lothar Felten <lothar.felten@gmail.com>
......
......@@ -11,7 +11,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/
https://www.ti.com/
Author: Andrew F. Davis <afd@ti.com>
......
......@@ -47,6 +47,7 @@ Hardware Monitoring Kernel Drivers
bel-pfe
bt1-pvt
coretemp
corsair-cpro
da9052
da9055
dell-smm-hwmon
......
......@@ -7,7 +7,7 @@ Supported chips:
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
......@@ -39,37 +39,37 @@ Supported chips:
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
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
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
......
......@@ -9,7 +9,7 @@ Supported chips:
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
......
......@@ -11,9 +11,9 @@ Supported chips:
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
......@@ -55,7 +55,7 @@ Supported chips:
Datasheet:
http://www.ti.com/product/LM5066I
https://www.ti.com/product/LM5066I
Author: Guenter Roeck <linux@roeck-us.net>
......
......@@ -39,7 +39,7 @@ Author: Jean Delvare <jdelvare@suse.de>
Thanks go to Tyan and especially Alex Buckingham for setting up a remote
access to their S4882 test platform for this driver.
http://www.tyan.com/
https://www.tyan.com/
Description
-----------
......
......@@ -13,15 +13,15 @@ Supported chips:
* Texas Instruments TMP122/TMP124
Information: http://www.ti.com/product/tmp122
Information: https://www.ti.com/product/tmp122
* National Semiconductor LM71
Datasheet: http://www.ti.com/product/LM71
Datasheet: https://www.ti.com/product/LM71
* National Semiconductor LM74
Datasheet: http://www.ti.com/product/LM74
Datasheet: https://www.ti.com/product/LM74
Author:
......
......@@ -11,7 +11,7 @@ Supported chips:
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>
......
......@@ -31,7 +31,7 @@ Supported chips:
Datasheet: Publicly available at the Maxim website
http://www.maximintegrated.com/
https://www.maximintegrated.com/
* Maxim MAX6625, MAX6626, MAX31725, MAX31726
......@@ -71,7 +71,7 @@ Supported chips:
Datasheet: Publicly available at the Analog Devices website
http://www.analog.com/adt75
https://www.analog.com/adt75
* ST Microelectronics STDS75
......@@ -101,23 +101,23 @@ Supported chips:
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
......@@ -127,9 +127,9 @@ Supported chips:
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>
......
......@@ -17,7 +17,7 @@ Supported chips:
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
......@@ -25,7 +25,7 @@ Supported chips:
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
......@@ -33,7 +33,7 @@ Supported chips:
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
......@@ -41,7 +41,7 @@ Supported chips:
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
......
......@@ -17,7 +17,7 @@ Supported chips:
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:
......
......@@ -51,7 +51,7 @@ Supported chips:
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
......@@ -61,7 +61,7 @@ Supported chips:
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
......@@ -71,7 +71,7 @@ Supported chips:
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
......@@ -81,7 +81,7 @@ Supported chips:
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
......@@ -263,7 +263,7 @@ Supported chips:
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>
......
......@@ -133,7 +133,7 @@ Smart Tach Mode (from the datasheet)::
four signals are measured within 4 seconds.
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
enabled if the PWM output frequency is 22500 Hz (see below).
......
......@@ -9,7 +9,7 @@ Supported chips:
Datasheet: Publicly available at the Texas Instruments website
http://www.ti.com/product/lm95233
https://www.ti.com/product/lm95233
* National Semiconductor / Texas Instruments LM95234
......@@ -17,7 +17,7 @@ Supported chips:
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>
......
......@@ -9,7 +9,7 @@ Supported chips:
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
......@@ -17,7 +17,7 @@ Supported chips:
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>
......
......@@ -179,7 +179,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.analog.com/ltm4680
Datasheet: https://www.analog.com/ltm4680
* Analog Devices LTM4686
......@@ -187,7 +187,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.analog.com/ltm4686
Datasheet: https://www.analog.com/ltm4686
* Analog Devices LTM4700
......@@ -195,7 +195,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.analog.com/ltm4700
Datasheet: https://www.analog.com/ltm4700
......
......@@ -5,6 +5,14 @@ Kernel driver max20730
Supported chips:
* Maxim MAX20710
Prefix: 'max20710'
Addresses scanned: -
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX20710.pdf
* Maxim MAX20730
Prefix: 'max20730'
......@@ -35,7 +43,7 @@ Author: Guenter Roeck <linux@roeck-us.net>
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.
The driver is a client driver to the core PMBus driver.
......
......@@ -9,9 +9,9 @@ Supported chips:
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>
......
......@@ -9,7 +9,7 @@ Supported chips:
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>
......
......@@ -9,7 +9,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34440.pdf
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34440.pdf
* Maxim MAX34441
......@@ -19,7 +19,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34441.pdf
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34441.pdf
* Maxim MAX34446
......@@ -29,7 +29,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34446.pdf
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34446.pdf
* Maxim MAX34451
......@@ -39,7 +39,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34451.pdf
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34451.pdf
* Maxim MAX34460
......@@ -49,7 +49,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://datasheets.maximintegrated.com/en/ds/MAX34460.pdf
Datasheet: https://datasheets.maximintegrated.com/en/ds/MAX34460.pdf
* Maxim MAX34461
......@@ -59,7 +59,7 @@ Supported chips:
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>
......
......@@ -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
temperatures, and in some cases the reported temperature declines if the actual
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.
......@@ -21,11 +21,11 @@ Supported chips:
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
......@@ -53,15 +53,15 @@ Supported chips:
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
......
......@@ -11,7 +11,7 @@ Supported chips:
Datasheet: Publicly available at the Sensirion website
http://www.sensirion.com/file/datasheet_sht21
https://www.sensirion.com/file/datasheet_sht21
......@@ -23,7 +23,7 @@ Supported chips:
Datasheet: Publicly available at the Sensirion website
http://www.sensirion.com/file/datasheet_sht25
https://www.sensirion.com/file/datasheet_sht25
......
......@@ -9,7 +9,7 @@ Supported chips:
Addresses scanned: none
Datasheet: http://www.sensirion.com/file/datasheet_shtc1
Datasheet: https://www.sensirion.com/file/datasheet_shtc1
......@@ -19,7 +19,7 @@ Supported chips:
Addresses scanned: none
Datasheet: http://www.sensirion.com/file/datasheet_shtw1
Datasheet: https://www.sensirion.com/file/datasheet_shtw1
......@@ -29,7 +29,7 @@ Supported chips:
Addresses scanned: none
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:
Addresses scanned: I2C 0x2c - 0x2e
Datasheet: http://www.ti.com/
Datasheet: https://www.ti.com/
Author: Krzysztof Helt <krzysztof.h1@wp.pl>
......
......@@ -9,7 +9,7 @@ Supported chips:
Addresses scanned: none
Product info and datasheet: http://www.ti.com/product/tmp103
Product info and datasheet: https://www.ti.com/product/tmp103
Author:
......
......@@ -9,7 +9,7 @@ Supported chips:
Addresses scanned: none
Datasheet: http://www.ti.com/product/tmp108
Datasheet: https://www.ti.com/product/tmp108
Author:
......
......@@ -47,7 +47,7 @@ Supported chips:
Prefix: 'tmp461'
Datasheet: http://www.ti.com/product/tmp461
Datasheet: https://www.ti.com/product/tmp461
......
......@@ -33,7 +33,7 @@ Supported chips:
Addresses scanned: I2C 0x2a, 0x4c, 0x4d, 0x4e and 0x4f
Datasheet: http://www.ti.com/product/tmp441
Datasheet: https://www.ti.com/product/tmp441
* Texas Instruments TMP442
......@@ -41,7 +41,7 @@ Supported chips:
Addresses scanned: I2C 0x4c and 0x4d
Datasheet: http://www.ti.com/product/tmp442
Datasheet: https://www.ti.com/product/tmp442
Authors:
......
......@@ -9,13 +9,13 @@ Supported chips:
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
Prefix: 'tmp513'
Datasheet: http://www.ti.com/lit/ds/symlink/tmp513.pdf
Datasheet: https://www.ti.com/lit/ds/symlink/tmp513.pdf
Authors:
......
......@@ -9,7 +9,7 @@ Supported chips:
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>
......
......@@ -9,7 +9,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.ti.com/lit/gpn/tps53647
Datasheet: https://www.ti.com/lit/gpn/tps53647
* Texas Instruments TPS53667
......@@ -17,7 +17,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.ti.com/lit/gpn/TPS53667
Datasheet: https://www.ti.com/lit/gpn/TPS53667
* Texas Instruments TPS53679
......@@ -25,7 +25,7 @@ Supported chips:
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
......@@ -33,7 +33,7 @@ Supported chips:
Addresses scanned: -
Datasheet: http://www.ti.com/lit/gpn/TPS53681
Datasheet: https://www.ti.com/lit/gpn/TPS53681
* Texas Instruments TPS53688
......
......@@ -96,7 +96,7 @@ sensors. The configured source for each of the temperature sensors is provided
in tempX_label.
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.
An alarm is triggered when the temperature gets higher than high limit;
it stays on until the temperature falls below the hysteresis value.
......
......@@ -17,7 +17,7 @@ Supported chips:
Addresses scanned: I2C 0x28 - 0x2f, ISA 0x290 (8 I/O ports)
Datasheet: http://www.winbond.com
Datasheet: https://www.winbond.com
* Winbond W83783S
......
......@@ -36,7 +36,7 @@ Temperatures are measured in degrees Celsius and measurement resolution is 1
degC for temp1 and temp2.
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.
Voltage sensors (also known as IN sensors) report their values in millivolts.
......
......@@ -4444,6 +4444,12 @@ S: Maintained
F: Documentation/hwmon/coretemp.rst
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
M: Jan "Yenya" Kasprzak <kas@fi.muni.cz>
S: Maintained
......
......@@ -439,6 +439,16 @@ config SENSORS_BT1_PVT_ALARMS
the data conversion will be periodically performed and the data will be
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
tristate "Hard disk drives with temperature sensors"
depends on SCSI && ATA
......@@ -515,6 +525,16 @@ config SENSORS_I5K_AMB
This driver can also be built as a module. If so, the module
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
tristate "Fintek F71805F/FG, F71806F/FG and F71872F/FG"
depends on !PPC
......
......@@ -56,6 +56,7 @@ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
obj-$(CONFIG_SENSORS_AXI_FAN_CONTROL) += axi-fan-control.o
obj-$(CONFIG_SENSORS_BT1_PVT) += bt1-pvt.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_DA9055)+= da9055-hwmon.o
obj-$(CONFIG_SENSORS_DELL_SMM) += dell-smm-hwmon.o
......@@ -167,6 +168,7 @@ obj-$(CONFIG_SENSORS_SMM665) += smm665.o
obj-$(CONFIG_SENSORS_SMSC47B397)+= smsc47b397.o
obj-$(CONFIG_SENSORS_SMSC47M1) += smsc47m1.o
obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o
obj-$(CONFIG_SENSORS_SPARX5) += sparx5-temp.o
obj-$(CONFIG_SENSORS_STTS751) += stts751.o
obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o
obj-$(CONFIG_SENSORS_TC74) += tc74.o
......
......@@ -393,6 +393,7 @@ static int adc128_init_client(struct adc128_data *data)
{
struct i2c_client *client = data->client;
int err;
u8 regval = 0x0;
/*
* Reset chip to defaults.
......@@ -403,10 +404,17 @@ static int adc128_init_client(struct adc128_data *data)
return err;
/* Set operation mode, if non-default */
if (data->mode != 0) {
err = i2c_smbus_write_byte_data(client,
ADC128_REG_CONFIG_ADV,
data->mode << 1);
if (data->mode != 0)
regval |= 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)
return err;
}
......@@ -416,14 +424,6 @@ static int adc128_init_client(struct adc128_data *data)
if (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;
}
......
......@@ -13,7 +13,7 @@
* resolution of about 0.5% of the nominal value). Temperature values are
* reported with a 1 deg resolution and a 3 deg accuracy. Complete
* 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
* only in that it has "open-drain VID inputs while the ADM1025 has
......
......@@ -7,7 +7,7 @@
*
* 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>
......
......@@ -15,10 +15,6 @@
#include <linux/of.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 */
#define ADI_REG_RSTN 0x0080
#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 = {
},
.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",
.matches = {
......
......@@ -159,7 +159,7 @@ gsc_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
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);
if (ret)
return ret;
......@@ -186,7 +186,8 @@ gsc_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32 attr,
/* adjust by uV offset */
tmp += ch->mvoffset;
break;
case mode_voltage:
case mode_voltage_24bit:
case mode_voltage_16bit:
/* no adjustment needed */
break;
}
......@@ -336,7 +337,8 @@ static int gsc_hwmon_probe(struct platform_device *pdev)
HWMON_T_LABEL;
i_temp++;
break;
case mode_voltage:
case mode_voltage_24bit:
case mode_voltage_16bit:
case mode_voltage_raw:
if (i_in == GSC_HWMON_MAX_IN_CH) {
dev_err(gsc->dev, "too many input channels\n");
......
......@@ -49,15 +49,15 @@
* The 13 specification corresponds to the Intel Pentium M series. There
* doesn't seem to be any named specification for these. The conversion
* 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
* doesn't seem to be any named specification for these. The conversion
* 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.
* http://www.intel.com/design/processor/applnots/313214.htm
* https://www.intel.com/design/processor/applnots/313214.htm
*/
/*
......
......@@ -396,7 +396,7 @@ static int i5k_amb_hwmon_init(struct platform_device *pdev)
static int i5k_amb_add(void)
{
int res = -ENODEV;
int res;
/* only ever going to be one of these */
amb_pdev = platform_device_alloc(DRVNAME, 0);
......@@ -427,11 +427,13 @@ static int i5k_find_amb_registers(struct i5k_amb_data *data,
if (!pcidev)
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;
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;
data->amb_len = val32;
......@@ -458,11 +460,13 @@ static int i5k_channel_probe(u16 *amb_present, unsigned long dev_id)
if (!pcidev)
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;
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;
amb_present[1] = val16;
......
......@@ -14,7 +14,7 @@
* Thanks to Jan Volkering
*
* Datasheet:
* http://www.ti.com/lit/gpn/ina209
* https://www.ti.com/lit/gpn/ina209
*/
#include <linux/kernel.h>
......
......@@ -4,19 +4,19 @@
*
* INA219:
* 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:
* Bi-Directional Current/Power Monitor with I2C Interface
* Datasheet: http://www.ti.com/product/ina220
* Datasheet: https://www.ti.com/product/ina220
*
* INA226:
* Bi-Directional Current/Power Monitor with I2C Interface
* Datasheet: http://www.ti.com/product/ina226
* Datasheet: https://www.ti.com/product/ina226
*
* INA230:
* 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>
* Thanks to Jan Volkering
......@@ -148,7 +148,7 @@ static const struct ina2xx_config ina2xx_config[] = {
* Available averaging rates for ina226. The indices correspond with
* the bit values expected by the chip (according to the ina226 datasheet,
* 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 };
......
......@@ -2,7 +2,7 @@
/*
* 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>
*/
......
......@@ -40,7 +40,7 @@
* This driver also supports the ADM1024, a sensor chip made by Analog
* Devices. That chip is fully compatible with the LM87. Complete
* 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>
......
......@@ -57,6 +57,8 @@ static const u8 MAX6697_REG_CRIT[] = {
#define MAX6581_REG_IDEALITY_SELECT 0x4c
#define MAX6581_REG_OFFSET 0x4d
#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 */
......@@ -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)
{
struct max6697_data *data = dev_get_drvdata(dev);
......@@ -317,6 +324,70 @@ static ssize_t temp_store(struct device *dev,
return ret < 0 ? ret : count;
}
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_2_RW(temp1_max, temp, 0, MAX6697_TEMP_MAX);
static SENSOR_DEVICE_ATTR_2_RW(temp1_crit, temp, 0, MAX6697_TEMP_CRIT);
......@@ -375,6 +446,15 @@ static SENSOR_DEVICE_ATTR_RO(temp6_fault, alarm, 5);
static SENSOR_DEVICE_ATTR_RO(temp7_fault, alarm, 6);
static SENSOR_DEVICE_ATTR_RO(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 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 max6697_data *data = dev_get_drvdata(dev);
const struct max6697_chip_data *chip = data->chip;
int channel = index / 6; /* channel number */
int nr = index % 6; /* attribute index within channel */
int channel = index / 7; /* channel number */
int nr = index % 7; /* attribute index within channel */
if (channel >= chip->channels)
return 0;
......@@ -393,6 +473,10 @@ static umode_t max6697_is_visible(struct kobject *kobj, struct attribute *attr,
return 0;
if (nr == 5 && !(chip->have_fault & (1 << channel)))
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;
}
......@@ -409,6 +493,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp1_crit.dev_attr.attr,
&sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
&dev_attr_dummy.attr,
&dev_attr_dummy.attr,
&sensor_dev_attr_temp2_input.dev_attr.attr,
&sensor_dev_attr_temp2_max.dev_attr.attr,
......@@ -416,6 +501,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp2_crit.dev_attr.attr,
&sensor_dev_attr_temp2_crit_alarm.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_max.dev_attr.attr,
......@@ -423,6 +509,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp3_crit.dev_attr.attr,
&sensor_dev_attr_temp3_crit_alarm.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_max.dev_attr.attr,
......@@ -430,6 +517,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp4_crit.dev_attr.attr,
&sensor_dev_attr_temp4_crit_alarm.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_max.dev_attr.attr,
......@@ -437,6 +525,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp5_crit.dev_attr.attr,
&sensor_dev_attr_temp5_crit_alarm.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_max.dev_attr.attr,
......@@ -444,6 +533,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp6_crit.dev_attr.attr,
&sensor_dev_attr_temp6_crit_alarm.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_max.dev_attr.attr,
......@@ -451,6 +541,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp7_crit.dev_attr.attr,
&sensor_dev_attr_temp7_crit_alarm.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_max.dev_attr.attr,
......@@ -458,6 +549,7 @@ static struct attribute *max6697_attributes[] = {
&sensor_dev_attr_temp8_crit.dev_attr.attr,
&sensor_dev_attr_temp8_crit_alarm.dev_attr.attr,
&sensor_dev_attr_temp8_fault.dev_attr.attr,
&sensor_dev_attr_temp8_offset.dev_attr.attr,
NULL
};
......
......@@ -674,7 +674,7 @@ show_in_reg(struct device *dev, struct device_attribute *attr, char *buf)
static umode_t nct6683_in_is_visible(struct kobject *kobj,
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);
int nr = index % 4; /* attribute */
......@@ -739,7 +739,7 @@ show_fan_pulses(struct device *dev, struct device_attribute *attr, char *buf)
static umode_t nct6683_fan_is_visible(struct kobject *kobj,
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);
int fan = index / 3; /* fan index */
int nr = index % 3; /* attribute index */
......@@ -857,7 +857,7 @@ show_temp_type(struct device *dev, struct device_attribute *attr, char *buf)
static umode_t nct6683_temp_is_visible(struct kobject *kobj,
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);
int temp = index / 7; /* temp index */
int nr = index % 7; /* attribute index */
......@@ -944,7 +944,7 @@ SENSOR_TEMPLATE(pwm, "pwm%d", S_IRUGO, show_pwm, store_pwm, 0);
static umode_t nct6683_pwm_is_visible(struct kobject *kobj,
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);
int pwm = index; /* pwm index */
......
......@@ -156,10 +156,10 @@ config SENSORS_MAX16601
be called max16601.
config SENSORS_MAX20730
tristate "Maxim MAX20730, MAX20734, MAX20743"
tristate "Maxim MAX20710, MAX20730, MAX20734, MAX20743"
help
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
be called max20730.
......
......@@ -683,11 +683,13 @@ static int adm1275_probe(struct i2c_client *client,
tindex = 3;
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) */
if (!(config & ADM1278_VOUT_EN)) {
config |= ADM1278_VOUT_EN;
/* Enable VOUT & TEMP1 if not enabled (disabled by default) */
if ((config & (ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) !=
(ADM1278_VOUT_EN | ADM1278_TEMP1_EN)) {
config |= ADM1278_VOUT_EN | ADM1278_TEMP1_EN;
ret = i2c_smbus_write_byte_data(client,
ADM1275_PMON_CONFIG,
config);
......@@ -698,9 +700,6 @@ static int adm1275_probe(struct i2c_client *client,
}
}
if (config & ADM1278_TEMP1_EN)
info->func[0] |=
PMBUS_HAVE_TEMP | PMBUS_HAVE_STATUS_TEMP;
if (config & ADM1278_VIN_EN)
info->func[0] |= PMBUS_HAVE_VIN;
break;
......
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Driver for MAX20730, MAX20734, and MAX20743 Integrated, Step-Down
* Switching Regulators
* Driver for MAX20710, MAX20730, MAX20734, and MAX20743 Integrated,
* Step-Down Switching Regulators
*
* Copyright 2019 Google LLC.
* Copyright 2020 Maxim Integrated
*/
#include <linux/bits.h>
......@@ -19,6 +20,7 @@
#include "pmbus.h"
enum chips {
max20710,
max20730,
max20734,
max20743
......@@ -80,6 +82,7 @@ static long direct_to_val(u16 w, enum pmbus_sensor_classes class,
}
static u32 max_current[][5] = {
[max20710] = { 6200, 8000, 9700, 11600 },
[max20730] = { 13000, 16600, 20100, 23600 },
[max20734] = { 21000, 27000, 32000, 38000 },
[max20743] = { 18900, 24100, 29200, 34100 },
......@@ -164,6 +167,35 @@ static int max20730_write_word_data(struct i2c_client *client, int page,
}
static const struct pmbus_driver_info max20730_info[] = {
[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] = {
.pages = 1,
.read_word_data = max20730_read_word_data,
......@@ -200,7 +232,8 @@ static const struct pmbus_driver_info max20730_info[] = {
.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_TEMP | PMBUS_HAVE_STATUS_TEMP |
PMBUS_HAVE_STATUS_INPUT,
},
[max20734] = {
.pages = 1,
......@@ -228,7 +261,8 @@ static const struct pmbus_driver_info max20730_info[] = {
.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_TEMP | PMBUS_HAVE_STATUS_TEMP |
PMBUS_HAVE_STATUS_INPUT,
},
[max20743] = {
.pages = 1,
......@@ -256,7 +290,8 @@ static const struct pmbus_driver_info max20730_info[] = {
.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_TEMP | PMBUS_HAVE_STATUS_TEMP |
PMBUS_HAVE_STATUS_INPUT,
},
};
......@@ -339,6 +374,7 @@ static int max20730_probe(struct i2c_client *client,
}
static const struct i2c_device_id max20730_id[] = {
{ "max20710", max20710 },
{ "max20730", max20730 },
{ "max20734", max20734 },
{ "max20743", max20743 },
......@@ -348,6 +384,7 @@ static const struct i2c_device_id max20730_id[] = {
MODULE_DEVICE_TABLE(i2c, max20730_id);
static const struct of_device_id max20730_of_match[] = {
{ .compatible = "maxim,max20710", .data = (void *)max20710 },
{ .compatible = "maxim,max20730", .data = (void *)max20730 },
{ .compatible = "maxim,max20734", .data = (void *)max20734 },
{ .compatible = "maxim,max20743", .data = (void *)max20743 },
......@@ -369,5 +406,5 @@ static struct i2c_driver max20730_driver = {
module_i2c_driver(max20730_driver);
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");
......@@ -628,12 +628,12 @@ static struct pmbus_data *pmbus_update_device(struct device *dev)
* Convert linear sensor values to milli- or micro-units
* 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)
{
s16 exponent;
s32 mantissa;
long val;
s64 val;
if (sensor->class == PSC_VOLTAGE_OUT) { /* LINEAR16 */
exponent = data->exponent[sensor->page];
......@@ -647,11 +647,11 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
/* scale result to milli-units for all sensors except fans */
if (sensor->class != PSC_FAN)
val = val * 1000L;
val = val * 1000LL;
/* scale result to micro-units for power sensors */
if (sensor->class == PSC_POWER)
val = val * 1000L;
val = val * 1000LL;
if (exponent >= 0)
val <<= exponent;
......@@ -665,7 +665,7 @@ static long pmbus_reg2data_linear(struct pmbus_data *data,
* Convert direct sensor values to milli- or micro-units
* 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)
{
s64 b, val = (s16)sensor->data;
......@@ -702,14 +702,14 @@ static long pmbus_reg2data_direct(struct pmbus_data *data,
}
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
* 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)
{
long val = sensor->data;
......@@ -740,9 +740,9 @@ static long pmbus_reg2data_vid(struct pmbus_data *data,
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)
return sensor->data;
......@@ -766,7 +766,7 @@ static long pmbus_reg2data(struct pmbus_data *data, struct pmbus_sensor *sensor)
#define MIN_MANTISSA (511 * 1000)
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;
bool negative = false;
......@@ -788,8 +788,8 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
val <<= -data->exponent[sensor->page];
else
val >>= data->exponent[sensor->page];
val = DIV_ROUND_CLOSEST(val, 1000);
return val & 0xffff;
val = DIV_ROUND_CLOSEST_ULL(val, 1000);
return clamp_val(val, 0, 0xffff);
}
if (val < 0) {
......@@ -799,14 +799,14 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
/* Power is in uW. Convert to mW before converting. */
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
* before calculating the exponent.
*/
if (sensor->class == PSC_FAN)
val = val * 1000;
val = val * 1000LL;
/* Reduce large mantissa until it fits into 10 bit */
while (val >= MAX_MANTISSA && exponent < 15) {
......@@ -820,11 +820,7 @@ static u16 pmbus_data2reg_linear(struct pmbus_data *data,
}
/* Convert mantissa from milli-units to units */
mantissa = DIV_ROUND_CLOSEST(val, 1000);
/* Ensure that resulting number is within range */
if (mantissa > 0x3ff)
mantissa = 0x3ff;
mantissa = clamp_val(DIV_ROUND_CLOSEST_ULL(val, 1000), 0, 0x3ff);
/* restore sign */
if (negative)
......@@ -835,9 +831,9 @@ static u16 pmbus_data2reg_linear(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;
m = data->info->m[sensor->class];
......@@ -855,30 +851,30 @@ static u16 pmbus_data2reg_direct(struct pmbus_data *data,
R -= 3; /* Adjust R and b for data in milli-units */
b *= 1000;
}
val64 = val64 * m + b;
val = val * m + b;
while (R > 0) {
val64 *= 10;
val *= 10;
R--;
}
while (R < 0) {
val64 = div_s64(val64 + 5LL, 10L); /* round closest */
val = div_s64(val + 5LL, 10L); /* round closest */
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,
struct pmbus_sensor *sensor, long val)
struct pmbus_sensor *sensor, s64 val)
{
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,
struct pmbus_sensor *sensor, long val)
struct pmbus_sensor *sensor, s64 val)
{
u16 regval;
......@@ -944,7 +940,7 @@ static int pmbus_get_boolean(struct pmbus_data *data, struct pmbus_boolean *b,
WARN(1, "Bad boolean descriptor %p: s1=%p, s2=%p\n", b, s1, s2);
return 0;
} else {
long v1, v2;
s64 v1, v2;
if (s1->data < 0)
return s1->data;
......@@ -981,7 +977,7 @@ static ssize_t pmbus_show_sensor(struct device *dev,
if (sensor->data < 0)
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,
......@@ -992,11 +988,11 @@ static ssize_t pmbus_set_sensor(struct device *dev,
struct pmbus_data *data = i2c_get_clientdata(client);
struct pmbus_sensor *sensor = to_pmbus_sensor(devattr);
ssize_t rv = count;
long val = 0;
s64 val;
int ret;
u16 regval;
if (kstrtol(buf, 10, &val) < 0)
if (kstrtos64(buf, 10, &val) < 0)
return -EINVAL;
mutex_lock(&data->update_lock);
......
......@@ -4,7 +4,7 @@
* and monitor. Users can read all ADC inputs along with their labels
* 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>
*/
......
......@@ -3,7 +3,7 @@
*
* 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>
......
// SPDX-License-Identifier: GPL-2.0-or-later
/* Sparx5 SoC temperature sensor driver
*
* Copyright (C) 2020 Lars Povlsen <lars.povlsen@microchip.com>
*/
#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/hwmon.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#define TEMP_CTRL 0
#define TEMP_CFG 4
#define TEMP_CFG_CYCLES GENMASK(24, 15)
#define TEMP_CFG_ENA BIT(0)
#define TEMP_STAT 8
#define TEMP_STAT_VALID BIT(12)
#define TEMP_STAT_TEMP GENMASK(11, 0)
struct s5_hwmon {
void __iomem *base;
struct clk *clk;
};
static void s5_temp_clk_disable(void *data)
{
struct clk *clk = data;
clk_disable_unprepare(clk);
}
static void s5_temp_enable(struct s5_hwmon *hwmon)
{
u32 val = readl(hwmon->base + TEMP_CFG);
u32 clk = clk_get_rate(hwmon->clk) / USEC_PER_SEC;
val &= ~TEMP_CFG_CYCLES;
val |= FIELD_PREP(TEMP_CFG_CYCLES, clk);
val |= TEMP_CFG_ENA;
writel(val, hwmon->base + TEMP_CFG);
}
static int s5_read(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long *temp)
{
struct s5_hwmon *hwmon = dev_get_drvdata(dev);
int rc = 0, value;
u32 stat;
switch (attr) {
case hwmon_temp_input:
stat = readl_relaxed(hwmon->base + TEMP_STAT);
if (!(stat & TEMP_STAT_VALID))
return -EIO;
value = stat & TEMP_STAT_TEMP;
/*
* From register documentation:
* Temp(C) = TEMP_SENSOR_STAT.TEMP / 4096 * 352.2 - 109.4
*/
value = DIV_ROUND_CLOSEST(value * 3522, 4096) - 1094;
/*
* Scale down by 10 from above and multiply by 1000 to
* have millidegrees as specified by the hwmon sysfs
* interface.
*/
value *= 100;
*temp = value;
break;
default:
rc = -EOPNOTSUPP;
break;
}
return rc;
}
static umode_t s5_is_visible(const void *_data, enum hwmon_sensor_types type,
u32 attr, int channel)
{
if (type != hwmon_temp)
return 0;
switch (attr) {
case hwmon_temp_input:
return 0444;
default:
return 0;
}
}
static const struct hwmon_channel_info *s5_info[] = {
HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ),
HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
NULL
};
static const struct hwmon_ops s5_hwmon_ops = {
.is_visible = s5_is_visible,
.read = s5_read,
};
static const struct hwmon_chip_info s5_chip_info = {
.ops = &s5_hwmon_ops,
.info = s5_info,
};
static int s5_temp_probe(struct platform_device *pdev)
{
struct device *hwmon_dev;
struct s5_hwmon *hwmon;
int ret;
hwmon = devm_kzalloc(&pdev->dev, sizeof(*hwmon), GFP_KERNEL);
if (!hwmon)
return -ENOMEM;
hwmon->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(hwmon->base))
return PTR_ERR(hwmon->base);
hwmon->clk = devm_clk_get(&pdev->dev, NULL);
if (IS_ERR(hwmon->clk))
return PTR_ERR(hwmon->clk);
ret = clk_prepare_enable(hwmon->clk);
if (ret)
return ret;
ret = devm_add_action_or_reset(&pdev->dev, s5_temp_clk_disable,
hwmon->clk);
if (ret)
return ret;
s5_temp_enable(hwmon);
hwmon_dev = devm_hwmon_device_register_with_info(&pdev->dev,
"s5_temp",
hwmon,
&s5_chip_info,
NULL);
return PTR_ERR_OR_ZERO(hwmon_dev);
}
static const struct of_device_id s5_temp_match[] = {
{ .compatible = "microchip,sparx5-temp" },
{},
};
MODULE_DEVICE_TABLE(of, s5_temp_match);
static struct platform_driver s5_temp_driver = {
.probe = s5_temp_probe,
.driver = {
.name = "sparx5-temp",
.of_match_table = s5_temp_match,
},
};
module_platform_driver(s5_temp_driver);
MODULE_AUTHOR("Lars Povlsen <lars.povlsen@microchip.com>");
MODULE_DESCRIPTION("Sparx5 SoC temperature sensor driver");
MODULE_LICENSE("GPL");
......@@ -5,12 +5,12 @@
* TMP513:
* Thermal/Power Management with Triple Remote and
* Local Temperature Sensor and Current Shunt Monitor
* Datasheet: http://www.ti.com/lit/gpn/tmp513
* Datasheet: https://www.ti.com/lit/gpn/tmp513
*
* TMP512:
* Thermal/Power Management with Dual Remote
* 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>
*
......
......@@ -992,8 +992,8 @@ static int vt8231_pci_probe(struct pci_dev *dev,
return -ENODEV;
}
if (PCIBIOS_SUCCESSFUL != pci_read_config_word(dev, VT8231_BASE_REG,
&val))
pci_read_config_word(dev, VT8231_BASE_REG, &val);
if (val == (u16)~0)
return -ENODEV;
address = val & ~(VT8231_EXTENT - 1);
......@@ -1002,8 +1002,8 @@ static int vt8231_pci_probe(struct pci_dev *dev,
return -ENODEV;
}
if (PCIBIOS_SUCCESSFUL != pci_read_config_word(dev, VT8231_ENABLE_REG,
&val))
pci_read_config_word(dev, VT8231_ENABLE_REG, &val);
if (val == (u16)~0)
return -ENODEV;
if (!(val & 0x0001)) {
......
......@@ -4,8 +4,9 @@
enum gsc_hwmon_mode {
mode_temperature,
mode_voltage,
mode_voltage_24bit,
mode_voltage_raw,
mode_voltage_16bit,
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