All of lore.kernel.org
 help / color / mirror / Atom feed
From: Guenter Roeck <linux@roeck-us.net>
To: linux-hwmon@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, Jean Delvare <jdelvare@suse.com>,
	Slawomir Stepien <sst@poczta.fm>,
	Guenter Roeck <linux@roeck-us.net>
Subject: [PATCH 19/40] hwmon: (lm90) Add explicit support for MAX6648/MAX6692
Date: Wed, 25 May 2022 06:57:37 -0700	[thread overview]
Message-ID: <20220525135758.2944744-20-linux@roeck-us.net> (raw)
In-Reply-To: <20220525135758.2944744-1-linux@roeck-us.net>

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: Guenter Roeck <linux@roeck-us.net>
---
 Documentation/hwmon/lm90.rst | 12 +++++++++--
 drivers/hwmon/lm90.c         | 41 ++++++++++++++++++++++++++++++++----
 2 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/Documentation/hwmon/lm90.rst b/Documentation/hwmon/lm90.rst
index 9886a298797f..e947e609990b 100644
--- a/Documentation/hwmon/lm90.rst
+++ b/Documentation/hwmon/lm90.rst
@@ -105,7 +105,7 @@ Supported chips:
 
   * Maxim MAX6648
 
-    Prefix: 'max6646'
+    Prefix: 'max6648'
 
     Addresses scanned: I2C 0x4c
 
@@ -191,7 +191,7 @@ Supported chips:
 
   * Maxim MAX6692
 
-    Prefix: 'max6646'
+    Prefix: 'max6648'
 
     Addresses scanned: I2C 0x4c
 
@@ -324,6 +324,14 @@ ADT7461, ADT7461A, NCT1008:
   * Lower resolution for remote temperature
   * SMBus PEC support for Write Byte and Receive Byte transactions.
 
+MAX6646, MAX6647, MAX6649:
+  * Better local resolution
+  * Extended range unsigned external temperature
+
+MAX6648, MAX6692:
+  * Better local resolution
+  * Unsigned temperature
+
 MAX6654:
   * Better local resolution
   * Selectable address
diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
index e23dcf299b03..df4b861024e3 100644
--- a/drivers/hwmon/lm90.c
+++ b/drivers/hwmon/lm90.c
@@ -115,7 +115,7 @@ static const unsigned short normal_i2c[] = {
 	0x4d, 0x4e, 0x4f, I2C_CLIENT_END };
 
 enum chips { adm1032, adt7461, adt7461a, g781, lm86, lm90, lm99,
-	max6646, max6654, max6657, max6659, max6680, max6696,
+	max6646, max6648, max6654, max6657, max6659, max6680, max6696,
 	sa56004, tmp451, tmp461, w83l771,
 };
 
@@ -179,6 +179,7 @@ enum chips { adm1032, adt7461, adt7461a, g781, lm86, lm90, lm99,
 #define LM90_HAVE_PEC		BIT(11)	/* Chip supports PEC		*/
 #define LM90_HAVE_PARTIAL_PEC	BIT(12)	/* Partial PEC support (adm1032)*/
 #define LM90_HAVE_ALARMS	BIT(13)	/* Create 'alarms' attribute	*/
+#define LM90_HAVE_EXT_UNSIGNED	BIT(14)	/* extended unsigned temperature*/
 
 /* LM90 status */
 #define LM90_STATUS_LTHRM	BIT(0)	/* local THERM limit tripped */
@@ -213,6 +214,7 @@ static const struct i2c_device_id lm90_id[] = {
 	{ "lm99", lm99 },
 	{ "max6646", max6646 },
 	{ "max6647", max6646 },
+	{ "max6648", max6648 },
 	{ "max6649", max6646 },
 	{ "max6654", max6654 },
 	{ "max6657", max6657 },
@@ -220,6 +222,7 @@ static const struct i2c_device_id lm90_id[] = {
 	{ "max6659", max6659 },
 	{ "max6680", max6680 },
 	{ "max6681", max6680 },
+	{ "max6692", max6648 },
 	{ "max6695", max6696 },
 	{ "max6696", max6696 },
 	{ "nct1008", adt7461a },
@@ -400,7 +403,14 @@ static const struct lm90_params lm90_params[] = {
 	},
 	[max6646] = {
 		.flags = LM90_HAVE_CRIT | LM90_HAVE_BROKEN_ALERT
-		  | LM90_HAVE_UNSIGNED_TEMP | LM90_HAVE_ALARMS,
+		  | LM90_HAVE_EXT_UNSIGNED | LM90_HAVE_ALARMS,
+		.alert_alarms = 0x7c,
+		.max_convrate = 6,
+		.reg_local_ext = MAX6657_REG_LOCAL_TEMPL,
+	},
+	[max6648] = {
+		.flags = LM90_HAVE_UNSIGNED_TEMP | LM90_HAVE_CRIT
+		  | LM90_HAVE_BROKEN_ALERT,
 		.alert_alarms = 0x7c,
 		.max_convrate = 6,
 		.reg_local_ext = MAX6657_REG_LOCAL_TEMPL,
@@ -1119,7 +1129,7 @@ static int lm90_temp_from_reg(u32 flags, u16 regval, u8 resolution)
 
 	if (flags & LM90_HAVE_EXTENDED_TEMP)
 		val = regval - 0x4000;
-	else if (flags & LM90_HAVE_UNSIGNED_TEMP)
+	else if (flags & (LM90_HAVE_UNSIGNED_TEMP | LM90_HAVE_EXT_UNSIGNED))
 		val = regval;
 	else
 		val = (s16)regval;
@@ -1147,6 +1157,8 @@ static u16 lm90_temp_to_reg(u32 flags, long val, u8 resolution)
 	if (flags & LM90_HAVE_EXTENDED_TEMP) {
 		val = clamp_val(val, -64000, 191000 + fraction);
 		val += 64000;
+	} else if (flags & LM90_HAVE_EXT_UNSIGNED) {
+		val = clamp_val(val, 0, 255000 + fraction);
 	} else if (flags & LM90_HAVE_UNSIGNED_TEMP) {
 		val = clamp_val(val, 0, 127000 + fraction);
 	} else {
@@ -1673,11 +1685,32 @@ static const char *lm90_detect_maxim(struct i2c_client *client, int chip_id,
 		 * The chip_id register of the MAX6646/6647/6649 holds the
 		 * revision of the chip. The lowest 6 bits of the config1
 		 * register are unused and should return zero when read.
+		 * The I2C address of MAX6648/6692 is fixed at 0x4c.
+		 * MAX6646 is at address 0x4d, MAX6647 is at address 0x4e,
+		 * and MAX6649 is at address 0x4c. A slight difference between
+		 * the two sets of chips is that the remote temperature register
+		 * reports different values if the DXP pin is open or shorted.
+		 * We can use that information to help distinguish between the
+		 * chips. MAX6648 will be mis-detected as MAX6649 if the remote
+		 * diode is connected, but there isn't really anything we can
+		 * do about that.
 		 */
 		if (!(config1 & 0x3f) && convrate <= 0x07) {
+			int temp;
+
 			switch (address) {
 			case 0x4c:
-				name = "max6649";
+				/*
+				 * MAX6649 reports an external temperature
+				 * value of 0xff if DXP is open or shorted.
+				 * MAX6648 reports 0x80 in that case.
+				 */
+				temp = i2c_smbus_read_byte_data(client,
+								LM90_REG_REMOTE_TEMPH);
+				if (temp == 0x80)
+					name = "max6648";
+				else
+					name = "max6649";
 				break;
 			case 0x4d:
 				name = "max6646";
-- 
2.35.1


  parent reply	other threads:[~2022-05-25 14:00 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-25 13:57 [PATCH 00/40] hwmon: (lm90) Various improvements to lm90 driver Guenter Roeck
2022-05-25 13:57 ` [PATCH 01/40] hwmon: (lm90) Generate sysfs and udev events for all alarms Guenter Roeck
2022-05-25 13:57 ` [PATCH 02/40] hwmon: (lm90) Rework alarm/status handling Guenter Roeck
2022-05-25 13:57 ` [PATCH 03/40] hwmon: (lm90) Reorder include files in alphabetical order Guenter Roeck
2022-05-25 13:57 ` [PATCH 04/40] hwmon: (lm90) Reorder chip enumeration to be " Guenter Roeck
2022-05-25 13:57 ` [PATCH 05/40] hwmon: (lm90) Use BIT macro Guenter Roeck
2022-05-25 13:57 ` [PATCH 06/40] hwmon: (lm90) Move status register bit shifts to compile time Guenter Roeck
2022-05-25 13:57 ` [PATCH 07/40] hwmon: (lm90) Stop using R_/W_ register prefix Guenter Roeck
2022-05-25 13:57 ` [PATCH 08/40] hwmon: (lm90) Improve PEC support Guenter Roeck
2022-05-25 13:57 ` [PATCH 09/40] hwmon: (lm90) Add partial PEC support for ADT7461 Guenter Roeck
2022-05-25 13:57 ` [PATCH 10/40] hwmon: (lm90) Enable full PEC support for ADT7461A Guenter Roeck
2022-05-25 13:57 ` [PATCH 11/40] hwmon: (lm90) Add support for unsigned and signed temperatures Guenter Roeck
2022-05-25 13:57 ` [PATCH 12/40] hwmon: (lm90) Only re-read registers if volatile Guenter Roeck
2022-05-25 13:57 ` [PATCH 13/40] hwmon: (lm90) Support multiple temperature resolutions Guenter Roeck
2022-05-26  7:12   ` Slawomir Stepien
2022-05-26 14:32     ` Guenter Roeck
2022-05-25 13:57 ` [PATCH 14/40] hwmon: (lm90) Use single flag to indicate extended temperature support Guenter Roeck
2022-05-25 13:57 ` [PATCH 15/40] hwmon: (lm90) Rework detect function Guenter Roeck
2022-05-25 13:57 ` [PATCH 16/40] hwmon: (lm90) Add support for additional chip revision of NCT1008 Guenter Roeck
2022-05-25 13:57 ` [PATCH 17/40] hwmon: (lm90) Fix/Add detection of G781-1 Guenter Roeck
2022-05-25 13:57 ` [PATCH 18/40] hwmon: (lm90) Add flag to indicate 'alarms' attribute support Guenter Roeck
2022-05-25 13:57 ` Guenter Roeck [this message]
2022-05-25 13:57 ` [PATCH 20/40] hwmon: (lm90) Add support for ADT7481, ADT7482, and ADT7483 Guenter Roeck
2022-05-27  5:08   ` Slawomir Stepien
2022-05-25 13:57 ` [PATCH 21/40] hwmon: (lm90) Strengthen chip detection for ADM1032, ADT7461(A), and NCT1008 Guenter Roeck
2022-05-25 13:57 ` [PATCH 22/40] hwmon: (lm90) Add support for MAX6690 Guenter Roeck
2022-05-25 13:57 ` [PATCH 23/40] hwmon: (lm90) Add flag to indicate support for minimum temperature limits Guenter Roeck
2022-05-25 13:57 ` [PATCH 24/40] hwmon: (lm90) Add flag to indicate conversion rate support Guenter Roeck
2022-05-25 13:57 ` [PATCH 25/40] hwmon: (lm90) Add support for MAX6642 Guenter Roeck
2022-05-25 13:57 ` [PATCH 26/40] hwmon: (lm90) Let lm90_read16() handle 8-bit read operations Guenter Roeck
2022-05-25 13:57 ` [PATCH 27/40] hwmon: (lm90) Introduce 16-bit register write function Guenter Roeck
2022-05-25 13:57 ` [PATCH 28/40] hwmon: (lm90) Support MAX1617 and LM84 Guenter Roeck
2022-05-25 13:57 ` [PATCH 29/40] hwmon: (lm90) Add support for ADM1021, ADM1021A, and ADM1023 Guenter Roeck
2022-05-25 13:57 ` [PATCH 30/40] hwmon: (lm90) Add remaining chips supported by adm1021 driver Guenter Roeck
2022-05-25 13:57 ` [PATCH 31/40] hwmon: (lm90) Combine lm86 and lm90 configuration Guenter Roeck
2022-05-25 13:57 ` [PATCH 32/40] hwmon: (lm90) Add explicit support for NCT210 Guenter Roeck
2022-05-25 13:57 ` [PATCH 33/40] hwmon: (lm90) Add support for ON Semiconductor NCT214 and NCT72 Guenter Roeck
2022-05-25 13:57 ` [PATCH 34/40] hwmon: (lm90) Add support for ON Semiconductor NCT218 Guenter Roeck
2022-05-25 13:57 ` [PATCH 35/40] hwmon: (lm90) Add support for ADT7421 Guenter Roeck
2022-05-25 13:57 ` [PATCH 36/40] hwmon: (lm90) Only disable alerts if not already disabled Guenter Roeck
2022-05-25 13:57 ` [PATCH 37/40] hwmon: (lm90) Add explicit support for ADM1020 Guenter Roeck
2022-05-25 13:57 ` [PATCH 38/40] hwmon: (lm90) Add support and detection of Philips/NXP NE1618 Guenter Roeck
2022-05-25 13:57 ` [PATCH 39/40] hwmon: (lm90) Add table with supported Analog/ONSEMI devices Guenter Roeck
2022-05-25 13:57 ` [PATCH 40/40] hwmon: (lm90) Support temp_samples attribute Guenter Roeck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220525135758.2944744-20-linux@roeck-us.net \
    --to=linux@roeck-us.net \
    --cc=jdelvare@suse.com \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sst@poczta.fm \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.