1. 13 Jul, 2022 40 commits
    • Guenter Roeck's avatar
      hwmon: (pmbus) Add IEEE 754 half precision support to PMBus core · 4036a48e
      Guenter Roeck authored
      Add support for the IEEE 754 half precision data format as specified
      in PMBus v1.3.1.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      4036a48e
    • Guenter Roeck's avatar
      hwmon: (lm90) Support temp_samples attribute · ca99633a
      Guenter Roeck authored
      Several of the chips supported by this driver support configuring the
      number of samples (or the fault queue depth) necessary before a fault
      or alarm is reported. This is done either with a bit in the configuration
      register or with a separate "consecutive alert" register. Support this
      functionality with the temp_samples attribute.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      ca99633a
    • Guenter Roeck's avatar
      hwmon: (lm90) Add table with supported Analog/ONSEMI devices · 018b8287
      Guenter Roeck authored
      Add table with device names and known register values for supported
      devices from Analog / ON Semiconductor.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      018b8287
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support and detection of Philips/NXP NE1618 · 9a198663
      Guenter Roeck authored
      NE1618 is similar to NE1617 but supports manufacturer and chip ID
      registers as well as 11 bit external temperature resolution.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      9a198663
    • Guenter Roeck's avatar
      hwmon: (lm90) Add explicit support for ADM1020 · f63f6cce
      Guenter Roeck authored
      ADM1020 is compatible with ADM1021 but has a separate chip revision and
      a limited I2C address range.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      f63f6cce
    • Guenter Roeck's avatar
      hwmon: (lm90) Only disable alerts if not already disabled · b1526b38
      Guenter Roeck authored
      It was observed that the alert handler may be called from the i2c core
      even after alerts have already been disabled. Only disable alerts if
      they have not already been disabled.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      b1526b38
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for ADT7421 · 41e6d721
      Guenter Roeck authored
      ADT7421 is similar to ADT7461A but supports configurable Beta Compensation.
      Packet Error Checking (PEC) is supported but undocumented.
      
      A devicetree node is not added for the added chip since it is quite
      unlikely that such an old chip will ever be used in a devicetree based
      system. It can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      41e6d721
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for ON Semiconductor NCT218 · d8521f82
      Guenter Roeck authored
      NCT218 is compatible to NCT72 and NCT214. It also supports PEC (packet
      error checking). Similar to NCT72 and NCT214, PEC support is undocumented.
      
      Unlike NCT214 and NCT72, NCT218 does not support the undocumented secondary
      chip and manufacturer ID registers at 0x3e and 0x3f and returns 0x00 when
      reading those registers. The value for the chip revision register is not
      documented but was observed to be 0xca. Use that information to improve
      chip detection accuracy.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      d8521f82
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for ON Semiconductor NCT214 and NCT72 · 2c6cb6c5
      Guenter Roeck authored
      NCT214 and NCT72 are compatible to ADT7461/ADT7461A but have full
      PEC (packet error checking) support. PEC support is undocumented.
      
      Both chips support the undocumented secondary chip and manufacturer
      ID registers at 0x3e and 0x3f, and return 0x61 as chip ID. Use this
      information to improve the accuracy of chip detection code.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      2c6cb6c5
    • Guenter Roeck's avatar
      hwmon: (lm90) Add explicit support for NCT210 · af4540b1
      Guenter Roeck authored
      Unlike ADM1023 and compatible chips, NCT210 does not support a temperature
      offset register. A real chip was found to have a chip revision of 0x3f.
      Use it to detect NCT210 explicitly.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      af4540b1
    • Guenter Roeck's avatar
      hwmon: (lm90) Combine lm86 and lm90 configuration · df18fccd
      Guenter Roeck authored
      LM86 and LM90 support exactly the same features, so there is no need
      to keep their configuration options separate. Combine to reduce data
      size.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      df18fccd
    • Guenter Roeck's avatar
      hwmon: (lm90) Add remaining chips supported by adm1021 driver · 37d1dc8d
      Guenter Roeck authored
      All chips supported by the ADM1021 driver are also supported by the LM90
      driver. Make that support official.
      
      After this change, the adm1021 driver is only needed if the lm90 driver
      is disabled. Also, the adm1021 driver misdetects a variety of chips as
      MAX1617A, which is unwanted if any of those chips is in the system.
      For this reason. make the adm1021 driver dependent on !SENSORS_LM90 to
      show that it is not needed if the lm90 driver is enabled, and to avoid
      misdetection if a chip supported by the lm90 driver is in the system.
      
      Devicetree nodes are not added for the added chips since it is quite
      unlikely that such old chips will ever be used in a devicetree based
      system. They can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      37d1dc8d
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for ADM1021, ADM1021A, and ADM1023 · 0c6bffd4
      Guenter Roeck authored
      Both chips are quite similar to other chips of this series, so add
      support for them to the lm90 driver. Also mention ON Semiconductor NCT210,
      which is pin and register compatible to ADM1021A.
      
      None of the chips support the secondary manufacturer and chip ID registers
      at 0x3e and 0x3f, but return 0 when reading from those registers.
      Use that information to improve the accuracy of chip detection code.
      
      Devicetree nodes are not added for the added chips since it is quite
      unlikely that such old chips will ever be used in a devicetree based
      system. They can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      0c6bffd4
    • Guenter Roeck's avatar
      hwmon: (lm90) Support MAX1617 and LM84 · c09472fc
      Guenter Roeck authored
      MAX1617 and LM84 are stripped-down versions of LM90, so they can easily
      be supported by the LM90 driver. The most difficult part is chip detection,
      since those old chips do not support manufacturer ID or chip ID registers.
      
      The "alarms" attribute is enabled for both chips to match the functionality
      of the adm1021 driver. Chip detection was improved and is less prone to
      misdetection than the chip detection in the adm1021 driver.
      
      Devicetree nodes are not added for the added chips since it is quite
      unlikely that such old chips will ever be used in a devicetree based
      system. They can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      c09472fc
    • Guenter Roeck's avatar
      hwmon: (lm90) Introduce 16-bit register write function · 6be4b1a4
      Guenter Roeck authored
      Introduce 16-bit register write function to simplify the code in
      some places.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      6be4b1a4
    • Guenter Roeck's avatar
      hwmon: (lm90) Let lm90_read16() handle 8-bit read operations · c9933a44
      Guenter Roeck authored
      Simplify the code a bit by handling single-register read operations
      in lm90_read16(). All we need to do is to skip the low-byte read
      operation if the register address is 0.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      c9933a44
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for MAX6642 · 3c1ecccb
      Guenter Roeck authored
      MAX6642 is a reduced version of LM90 with no low limits and no conversion
      rate register. Its alert functionality is broken, similar to many other
      chips supported by the lm90 driver.
      
      After this change, the stand-alone max6642 driver is only needed if the
      lm90 driver is disabled. Make it dependent on SENSORS_LM90=n to show that
      it is not needed if the lm90 driver is enabled.
      
      A devicetree node is not added for this chip since it is quite unlikely
      that such an old chip will ever be used in a devicetree based system.
      It can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      3c1ecccb
    • Guenter Roeck's avatar
      hwmon: (lm90) Add flag to indicate conversion rate support · ca6bfa3b
      Guenter Roeck authored
      A flag indicating support for setting the conversion rate doesn't cost
      much and will enable us to add support for MAX6642 to the lm90 driver.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      ca6bfa3b
    • Guenter Roeck's avatar
      hwmon: (lm90) Add flag to indicate support for minimum temperature limits · 2cb8d9d8
      Guenter Roeck authored
      A flag indicating support for minimum temperature limits doesn't cost much
      and will enable us to add support for MAX6642 to the lm90 driver.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      2cb8d9d8
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for MAX6690 · 399a8a00
      Guenter Roeck authored
      MAX6690 is all but identical to MAX6654. Revision 1 of its
      datasheet lists the same chip ID as MAX6654, and a chip labeled
      MAX6654 was found to have the chip ID listed as MAX6690 chip ID
      in Revision 2 of its datasheet.
      
      A devicetree node is not added for this chip since it is quite unlikely
      that such an old chip will ever be used in a devicetree based system.
      It can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      399a8a00
    • Guenter Roeck's avatar
      hwmon: (lm90) Strengthen chip detection for ADM1032, ADT7461(A), and NCT1008 · 9888775b
      Guenter Roeck authored
      ADT7461A and NCT1008 support the undocumented manufacturer and chip ID
      registers at 0x3e and 0x3f, and return 0x61 as chip ID. ADM1032 and
      ADT7461 do not support those registers but return 0 when reading them.
      Use this information to improve the accuracy of the chip detection code.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      9888775b
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for ADT7481, ADT7482, and ADT7483 · a9f3d3a8
      Guenter Roeck authored
      ADT7481, ADT7482, and ADT7483 are similar to ADT7461, but support two
      external temperature sensors, similar to MAX6695/6696. They support an
      extended temperature range similar to ADT7461. Registers for the second
      external channel can be accessed directly or by using the same method as
      used by MAX6695/6696. For simplicity, the access method implemented for
      MAX6695/6696 is used.
      
      The chips support PEC (packet error checking). Set the PEC feature flag
      and let the user decide if it should be enabled or not (it is by default
      disabled).
      
      Even though it is only documented for ADT7483, all three chips support a
      secondary manufacturer ID register at 0x3e and a chip ID register at 0x3f.
      Use the contents of those registers register for improved chip detection
      accuracy. Add the same check to the ADT7461A detection code since this chip
      also supports the same (undocumented) registers.
      
      Devicetree nodes are not added for the added chips since it is quite
      unlikely that such old chips will ever be used in a devicetree based
      system. They can be added later if needed.
      Reviewed-by: default avatarSlawomir Stepien <sst@poczta.fm>
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      a9f3d3a8
    • Guenter Roeck's avatar
      hwmon: (lm90) Add explicit support for MAX6648/MAX6692 · 904a6fe6
      Guenter Roeck authored
      Unlike MAX6646/MAX6647/MAX6649, MAX6648 and MAX6692 only support
      a temperature range of 0..127 degrees C. Separate support for the
      two sets of chips to be able to support maximum temperature ranges
      correctly for all chips. Introduce new feature flag to indicate
      temperature support up to 255 degrees C.
      
      Since the chips are almost identical except for the supported temperature
      range, automatic chip detection is limited. Effectively this means that
      MAX6648 may be mis-detected as MAX6649 when auto-detected, but there is
      nothing we can do about that.
      
      Devicetree nodes are not added for the added chips since it is quite
      unlikely that such old chips will ever be used in a devicetree based
      system. They can be added later if needed.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      904a6fe6
    • Guenter Roeck's avatar
      hwmon: (lm90) Add flag to indicate 'alarms' attribute support · e9684fdb
      Guenter Roeck authored
      We don't want to support the obsolete 'alarms' attribute for new
      chips supported by this driver. Add flag to indicate 'alarms' attribute
      support and use it for existing chips. This flag will not be set for
      additional chips supported by this driver in the future.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      e9684fdb
    • Guenter Roeck's avatar
      hwmon: (lm90) Fix/Add detection of G781-1 · 0707dda6
      Guenter Roeck authored
      When support for G781 was added, chips with ID 0x01 were found at I2C
      addresses 0x4c and 0x4d. The G781 datasheet (version 1.3 from October 2003)
      says that the device ID for G781-1 is 0x03, not 0x01. Also, the datasheet
      states that the chip at I2C address is G781 and the chip at I2C address
      0x4d is G781-1.
      
      A G781-1 at I2C address 0x4d was now found to have a chip ID of 0x03
      as suggested by the datasheet. Accept both 0x01 and 0x03 chip IDs at both
      addresses to ensure that all variants of G781 are detected properly.
      
      While at it, improve chip detection accuracy by reading two additional
      registers and ensuring that only expected bits are set in those registers.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      0707dda6
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for additional chip revision of NCT1008 · d277fbd5
      Guenter Roeck authored
      The NCT1008 datasheet, Revision 3, states that its chip revision is
      0x57. This matches the ADT7461A chip revision, and NCT1008 is therefore
      detected as ADT7461A. In revision 6 of the datasheet, the chip revision
      register is no longer documented. Multiple samples of NCT1008 were found
      to report a chip revision of 0x54. As it turns out, one of the patches
      submitted to add NCT1008 support to the lm90 driver already included a
      check for chip revision 0x54. Unfortunately, that patch never made it into
      the kernel. Remedy the situation and explicitly detect chips with revision
      0x54 as NCT1008.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      d277fbd5
    • Guenter Roeck's avatar
      hwmon: (lm90) Rework detect function · c7cebce9
      Guenter Roeck authored
      The detect function is getting larger and larger and difficult to
      understand or review. Split it into per-manufacturer detect functions
      to improve readability.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      c7cebce9
    • Guenter Roeck's avatar
      hwmon: (lm90) Use single flag to indicate extended temperature support · b977ed27
      Guenter Roeck authored
      Since temperature conversion functions are now unified, there is no need
      to keep "the chip supports a configurable extended temperature range" and
      "the chip has extended temperature range enabled" flags separate.
      Use a single flag instead to reflect both.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      b977ed27
    • Guenter Roeck's avatar
      hwmon: (lm90) Support multiple temperature resolutions · a8ddcc57
      Guenter Roeck authored
      While most LM90 compatible chips support a temperature sensor resolution
      of 11 bit, this is not the case for all chips. ADT7461 only supports a
      resolution of 10 bit, and TMP451/TMP461 support a resolution of 12 bit.
      
      Add support for various temperature sensor resolutions. To do this,
      model all temperature sensors as 16 bit sensors, and use unified
      temperature conversion functions which take the sensor resolution
      as parameter.
      
      While enhancing functionality, this has the positive side effect of
      reducing code size by about 5%.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      a8ddcc57
    • Guenter Roeck's avatar
      hwmon: (lm90) Only re-read registers if volatile · 8f19501d
      Guenter Roeck authored
      When reading 16-bit volatile registers, the code uses a trick to
      determine if a temperature is consistent: It reads the high part
      of the register twice. If the values are the same, the code assumes
      that the reading is consistent. If the value differs, the code
      re-reads the second register as well and assumes that it now has
      correct values.
      
      This is only necessary for volatile registers. Add a parameter to
      lm90_read16() to indicate if the register is volatile to avoid the
      extra overhead for non-volatile registers.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      8f19501d
    • Guenter Roeck's avatar
      hwmon: (lm90) Add support for unsigned and signed temperatures · b2644494
      Guenter Roeck authored
      ADT7461 and TMP451 temperature sensors support extended temperature ranges.
      If standard temperature range is selected, the temperature range is
      unsigned and limited to 0 .. 127 degrees C. For TMP461, the standard
      temperature range is -128000 ... 127000 degrees C. Distinguish between
      the two chips by introducing a feature flag indicating if the standard
      temperature range is signed or unsigned. Use the same flag for MAX6646/
      MAX6647 as well since those chips also support unsigned temperatures.
      
      Note that while the datasheet for ADT7461 suggests that the default
      temperature range is unsigned, tests with a real chip suggest that this
      is not the case: If the temperature offset is set to a value << 0,
      the temperature register does report negative values.
      
      Tests with real chips show that MAX6680/MAX6681 and SA56004 report
      temperatures of 128 degrees C and higher as negative temperatures.
      Add respective comments to the code.
      
      Also use clamp_val() and DIV_ROUND_CLOSEST where appropriate in
      calculations.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      b2644494
    • Guenter Roeck's avatar
      hwmon: (lm90) Enable full PEC support for ADT7461A · d70fa73d
      Guenter Roeck authored
      Experiments show that ADT7461A and NCT1008 support PEC, even though it is
      not documented. Enable support for it in the driver. Since ADT7461 only
      supports partial PEC, this means that the configuration for ADT7461A
      needs to be separated from ADT7461.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      d70fa73d
    • Guenter Roeck's avatar
      hwmon: (lm90) Add partial PEC support for ADT7461 · 425f5b5d
      Guenter Roeck authored
      Revision 0 of the ADT7461 datasheet suggests that the chip supports PEC
      (packet error checking). This information is gone in later versions of the
      datasheet. Experiments show that PEC support on ADT7461 is similar to PEC
      support in ADM1032, ie it is only supported for read operations. Add
      support for it to the driver.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      425f5b5d
    • Guenter Roeck's avatar
      hwmon: (lm90) Improve PEC support · 3b0982ff
      Guenter Roeck authored
      PEC (packet error checking) support for ADM1032 is currently only enabled
      if the chip was auto-detected, but not if a chip is instantiated
      explicitly. Always enable PEC support by introducing a chip feature flag
      indicating partial PEC support. Also, for consistency, disable PEC support
      by default to match existing functionality if the chip was not auto-
      detected.
      
      At the same time, introduce generic support for PEC with a separate feature
      flag. This will be used when support for chips with full PEC functionality
      is added.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      3b0982ff
    • Guenter Roeck's avatar
      hwmon: (lm90) Stop using R_/W_ register prefix · f68480cc
      Guenter Roeck authored
      The register write address either matches the read address, or it is the
      read address plus 6. Simplify the code and resolve the write address
      programmatically instead of having two defines for each register.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      f68480cc
    • Guenter Roeck's avatar
      hwmon: (lm90) Move status register bit shifts to compile time · ca7b9b14
      Guenter Roeck authored
      Handling bit shifts necessary to extract status bits during compile time
      reduces code and data size by almost 5% when building for x86_64.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      ca7b9b14
    • Guenter Roeck's avatar
      hwmon: (lm90) Use BIT macro · ddf2a609
      Guenter Roeck authored
      Use BIT macro instead of shift operation to improve readability.
      No functional change.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      ddf2a609
    • Guenter Roeck's avatar
      hwmon: (lm90) Reorder chip enumeration to be in alphabetical order · ff8f0a65
      Guenter Roeck authored
      Reorder chip enumeration in alphabetical order to make it easier to
      see which chips are supported, and to clarify where to add support
      new chip types. No functional change.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      ff8f0a65
    • Guenter Roeck's avatar
      hwmon: (lm90) Reorder include files in alphabetical order · 479f21d4
      Guenter Roeck authored
      Reorder include files in alphabetical order to reduce the chance of
      duplicates and to make it clear where new include files should be
      added. Drop the unnecessary include of linux/sysfs.h. Include
      linux/device.h instead because that is what is actually used.
      
      No functional change.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      479f21d4
    • Guenter Roeck's avatar
      hwmon: (lm90) Rework alarm/status handling · f6d07751
      Guenter Roeck authored
      Many chips supported by this driver clear status registers after it
      is read and update it in the next measurement cycle. Normally this falls
      under the radar because all registers are only read once per measurement
      cycle. However, there is an exception: Status registers are always read
      during interrupt and laert handling. This can result in invalid status
      reports if userspace reads an alarm attribute immediately afterwards.
      
      Rework alarm/status handling by keeping a shadow register with 'current'
      alarms, and by ensuring that the register is either only updated once per
      measurement cycle or not cleared.
      
      A second problem is related to alert handling: Alert handling is disabled
      for chips with broken alert after an alert was reported, but only
      re-enabled if attributes are read by the user. This means that alert
      conditions may appear and disappear unnoticed. Remedy the situation
      by introducing a worker to periodically read the status register(s) while
      alert handling is disabled, and re-enable alerts after the alert condition
      clears.
      
      Yet another problem is that sysfs and udev events are currently only
      reported to userspace if an alarm is raised, but not if an alarm condition
      clears. Use the new worker to detect that situation and also generate
      sysfs and udev events in that case.
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      f6d07751