From nobody Mon Oct 6 17:04:35 2025 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2284528314B for ; Fri, 18 Jul 2025 14:13:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847989; cv=none; b=IkUPDK0y7F31bGzruBgOvAM+FFw53AKJOV0LlT9w1Lmeg6gJNXewYJzxDYT7YNyd2DdwpHNJ8cUTn8jP4Dwm5vvYEJuXhjWL5uEHwOWio+5IkSTu11ZQDTHeeD1i/VF+wnH5Q4kKVymjjPFLIKYBAtdXTISJZfb20I9qH0yhov4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847989; c=relaxed/simple; bh=m8eeowTFOQ6rASGzd6J4wlcDNzQpxR4Dg/XHN9ePewg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b/D8iUooo5AZJqfRVW+izKIllIDIV0TXjwO9cvZetVc8iYpz32ZPAk+feK4/ijtkwL9WvtjZBM1R5mwl5SxKNZwRtbjg5CQtpacVCPHKO7hMv1Etsbtg6wbbEtptnBp9zDFWXqY/JrrOR4D6CkNqvfHct7npx4/4M++FACBkBJo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1uclpT-00065i-KS; Fri, 18 Jul 2025 16:12:51 +0200 From: Jonas Rebmann Date: Fri, 18 Jul 2025 16:12:48 +0200 Subject: [PATCH v2 1/3] hwmon: ina238: Fix inconsistent whitespace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250718-ina228-v2-1-227feb62f709@pengutronix.de> References: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> In-Reply-To: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , devicetree@vger.kernel.org, kernel@pengutronix.de, Jonas Rebmann X-Mailer: b4 0.15-dev-19c33 X-Developer-Signature: v=1; a=openpgp-sha256; l=5075; i=jre@pengutronix.de; h=from:subject:message-id; bh=m8eeowTFOQ6rASGzd6J4wlcDNzQpxR4Dg/XHN9ePewg=; b=owGbwMvMwCF2ZcYT3onnbjcwnlZLYsioCkt828G4Z3Vxo9s3v2mG+ioLKnY/dp2Qs8CW3do+P uEGg9X6jlIWBjEOBlkxRZZYNTkFIWP/62aVdrEwc1iZQIYwcHEKwESO/GVkmFr0d5ndE4dpm9V/ vvc3d9BYKvdx4fl82catUflHTzJdP83IsOViTOXuMlPe7k6H40vmzihdfsS6w1u3hVu1hHe1YsV nRgA= X-Developer-Key: i=jre@pengutronix.de; a=openpgp; fpr=0B7B750D5D3CD21B3B130DE8B61515E135CD49B5 X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::ac X-SA-Exim-Mail-From: jre@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Some purely cosmetic changes in ina238.c: - When aligning definitions, do so consistently with tab stop of 8. - Use spaces instead of tabs around operators. - Align wrapped lines. Signed-off-by: Jonas Rebmann --- drivers/hwmon/ina238.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/hwmon/ina238.c b/drivers/hwmon/ina238.c index 9a5fd16a4ec2..5e43bbe8817d 100644 --- a/drivers/hwmon/ina238.c +++ b/drivers/hwmon/ina238.c @@ -41,7 +41,7 @@ =20 #define INA238_CONFIG_ADCRANGE BIT(4) #define SQ52206_CONFIG_ADCRANGE_HIGH BIT(4) -#define SQ52206_CONFIG_ADCRANGE_LOW BIT(3) +#define SQ52206_CONFIG_ADCRANGE_LOW BIT(3) =20 #define INA238_DIAG_ALERT_TMPOL BIT(7) #define INA238_DIAG_ALERT_SHNTOL BIT(6) @@ -104,7 +104,7 @@ =20 #define INA238_SHUNT_VOLTAGE_LSB 5 /* 5 uV/lsb */ #define INA238_BUS_VOLTAGE_LSB 3125 /* 3.125 mV/lsb */ -#define INA238_DIE_TEMP_LSB 1250000 /* 125.0000 mC/lsb */ +#define INA238_DIE_TEMP_LSB 1250000 /* 125.0000 mC/lsb */ #define SQ52206_BUS_VOLTAGE_LSB 3750 /* 3.75 mV/lsb */ #define SQ52206_DIE_TEMP_LSB 78125 /* 7.8125 mC/lsb */ =20 @@ -118,12 +118,12 @@ enum ina238_ids { ina238, ina237, sq52206 }; =20 struct ina238_config { bool has_power_highest; /* chip detection power peak */ - bool has_energy; /* chip detection energy */ - u8 temp_shift; /* fixed parameters for temp calculate */ + bool has_energy; /* chip detection energy */ + u8 temp_shift; /* fixed parameters for temp calculate */ u32 power_calculate_factor; /* fixed parameters for power calculate */ - u16 config_default; /* Power-on default state */ + u16 config_default; /* Power-on default state */ int bus_voltage_lsb; /* use for temperature calculate, uV/lsb */ - int temp_lsb; /* use for temperature calculate */ + int temp_lsb; /* use for temperature calculate */ }; =20 struct ina238_data { @@ -271,7 +271,7 @@ static int ina238_read_in(struct device *dev, u32 attr,= int channel, if (channel =3D=3D 0) /* gain of 1 -> LSB / 4 */ *val =3D (regval * INA238_SHUNT_VOLTAGE_LSB) * - data->gain / (1000 * 4); + data->gain / (1000 * 4); else *val =3D (regval * data->config->bus_voltage_lsb) / 1000; break; @@ -370,7 +370,7 @@ static int ina238_read_power(struct device *dev, u32 at= tr, long *val) return err; =20 /* Fixed 1mA lsb, scaled by 1000000 to have result in uW */ - power =3D div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain * + power =3D div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain * data->config->power_calculate_factor, 4 * 100 * data->rshunt); /* Clamp value to maximum value of long */ *val =3D clamp_val(power, 0, LONG_MAX); @@ -381,7 +381,7 @@ static int ina238_read_power(struct device *dev, u32 at= tr, long *val) return err; =20 /* Fixed 1mA lsb, scaled by 1000000 to have result in uW */ - power =3D div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain * + power =3D div_u64(regval * 1000ULL * INA238_FIXED_SHUNT * data->gain * data->config->power_calculate_factor, 4 * 100 * data->rshunt); /* Clamp value to maximum value of long */ *val =3D clamp_val(power, 0, LONG_MAX); @@ -395,7 +395,7 @@ static int ina238_read_power(struct device *dev, u32 at= tr, long *val) * Truncated 24-bit compare register, lower 8-bits are * truncated. Same conversion to/from uW as POWER register. */ - power =3D div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT * data->g= ain * + power =3D div_u64((regval << 8) * 1000ULL * INA238_FIXED_SHUNT * data->g= ain * data->config->power_calculate_factor, 4 * 100 * data->rshunt); /* Clamp value to maximum value of long */ *val =3D clamp_val(power, 0, LONG_MAX); @@ -448,7 +448,7 @@ static int ina238_read_temp(struct device *dev, u32 att= r, long *val) return err; /* Signed, result in mC */ *val =3D div_s64(((s64)((s16)regval) >> data->config->temp_shift) * - (s64)data->config->temp_lsb, 10000); + (s64)data->config->temp_lsb, 10000); break; case hwmon_temp_max: err =3D regmap_read(data->regmap, INA238_TEMP_LIMIT, ®val); @@ -456,7 +456,7 @@ static int ina238_read_temp(struct device *dev, u32 att= r, long *val) return err; /* Signed, result in mC */ *val =3D div_s64(((s64)((s16)regval) >> data->config->temp_shift) * - (s64)data->config->temp_lsb, 10000); + (s64)data->config->temp_lsb, 10000); break; case hwmon_temp_max_alarm: err =3D regmap_read(data->regmap, INA238_DIAG_ALERT, ®val); @@ -501,8 +501,8 @@ static ssize_t energy1_input_show(struct device *dev, return ret; =20 /* result in uJ */ - energy =3D div_u64(regval * INA238_FIXED_SHUNT * data->gain * 16 * 10 * - data->config->power_calculate_factor, 4 * data->rshunt); + energy =3D div_u64(regval * INA238_FIXED_SHUNT * data->gain * 16 * 10 * + data->config->power_calculate_factor, 4 * data->rshunt); =20 return sysfs_emit(buf, "%llu\n", energy); } --=20 2.50.1.319.g90c0775e97 From nobody Mon Oct 6 17:04:35 2025 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 249D529A331 for ; Fri, 18 Jul 2025 14:13:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847989; cv=none; b=ek3+NcQxEJ1w7OAfTiPXiMTVlv+csGlcpylL0Kvn+1ZaWxYO9BbSar1GI9xLG1Z4bLCdbCEa4tOGti1IuziZs9XwD2XKyrtE6ncSlwoD3CoofW4U1JMieO6a51urcq/fsveBH0wfXMecJtQeEmf60xsw64R+nsOS1BQ3Mn0n3Yo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847989; c=relaxed/simple; bh=gRuoFQtmKUaRfbJUjBRpS3qKwR1FuGR+n2lAdbqy5Cg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=DInnfb5HKVRJX98uZgxJzf13QAqE/wxdDD/h+0C+1RukTkZ+TwN/uRjZMsDMLiKZDhDAIapEd/H4KMc1h5PRnKI95XbMzTAPFypl3MRtc2UJVdOIpBIvDSjCmu0NY6eVIFzhBWaPSdfXTEoSgOwzFdAC3BN+qBMukJZnK6aD1qI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1uclpT-00065i-MF; Fri, 18 Jul 2025 16:12:51 +0200 From: Jonas Rebmann Date: Fri, 18 Jul 2025 16:12:49 +0200 Subject: [PATCH v2 2/3] dt-bindings: Add INA228 to ina2xx devicetree bindings Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250718-ina228-v2-2-227feb62f709@pengutronix.de> References: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> In-Reply-To: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , devicetree@vger.kernel.org, kernel@pengutronix.de, Jonas Rebmann , Krzysztof Kozlowski X-Mailer: b4 0.15-dev-19c33 X-Developer-Signature: v=1; a=openpgp-sha256; l=978; i=jre@pengutronix.de; h=from:subject:message-id; bh=gRuoFQtmKUaRfbJUjBRpS3qKwR1FuGR+n2lAdbqy5Cg=; b=owGbwMvMwCF2ZcYT3onnbjcwnlZLYsioCktqOjnH/tLRi74R9vpL7rx+2Wlisoi39urfDevq1 jOplLQwd5SyMIhxMMiKKbLEqskpCBn7XzertIuFmcPKBDKEgYtTACbSWMzw30OoMd+1oUNYSY7D R1P/0c4lf2bcm/VUoywq/4mW7bG56gz/VCNSjjtPtYlqn6IWyp7UbcIwy/D+jX3TxNNfHfnMdt+ HGwA= X-Developer-Key: i=jre@pengutronix.de; a=openpgp; fpr=0B7B750D5D3CD21B3B130DE8B61515E135CD49B5 X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::ac X-SA-Exim-Mail-From: jre@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Add the ina228 to ina2xx bindings. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Jonas Rebmann --- Documentation/devicetree/bindings/hwmon/ti,ina2xx.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Documentation/devicetree/bindings/hwmon/ti,ina2xx.yaml b/Docum= entation/devicetree/bindings/hwmon/ti,ina2xx.yaml index d1fb7b9abda0..fa68b99ef2e2 100644 --- a/Documentation/devicetree/bindings/hwmon/ti,ina2xx.yaml +++ b/Documentation/devicetree/bindings/hwmon/ti,ina2xx.yaml @@ -25,6 +25,7 @@ properties: - ti,ina219 - ti,ina220 - ti,ina226 + - ti,ina228 - ti,ina230 - ti,ina231 - ti,ina233 @@ -107,6 +108,7 @@ allOf: - ti,ina219 - ti,ina220 - ti,ina226 + - ti,ina228 - ti,ina230 - ti,ina231 - ti,ina237 --=20 2.50.1.319.g90c0775e97 From nobody Mon Oct 6 17:04:35 2025 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CFA9F15E5C2 for ; Fri, 18 Jul 2025 14:13:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847990; cv=none; b=phe/YRtAKuIJW5pdQTjR4GGmor2H/dipb2I4CyTs6U8gyy/PgOiUgp013Mc2N8ENmrKqU50qsvpfrEkyA1rQ0QVASmvUqs80IK2m/28SCV4WkCDCEJcrntm3Fnf27dqgmtMPIRK9/rvqtt46KfPiB1c7V3JFYZWaKvWLFXsIWA0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1752847990; c=relaxed/simple; bh=xj6S3M8xJY8PbtvB49mSf5ejLhiwBMln/kdBPNm/grU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bJcg5vzIOmL2G2jWADjX+Bm4QcyNLXjqWxfnu0mX0J9ekb5iKlQuXeFlFVWiZmiUCKFvKsbyN8B0Oirn6SyYWyzFVReZzga5vyL2S/cO7+rjr6ZNlhhq6Glk7iXTQJBB0wPdvDhorhb1Rb8RE1DuA0N8HTMrL1mGYU3siVqZ/Bk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1uclpT-00065i-No; Fri, 18 Jul 2025 16:12:51 +0200 From: Jonas Rebmann Date: Fri, 18 Jul 2025 16:12:50 +0200 Subject: [PATCH v2 3/3] hwmon: ina238: Add support for INA228 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250718-ina228-v2-3-227feb62f709@pengutronix.de> References: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> In-Reply-To: <20250718-ina228-v2-0-227feb62f709@pengutronix.de> To: Jean Delvare , Guenter Roeck , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: linux-hwmon@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , devicetree@vger.kernel.org, kernel@pengutronix.de, Jonas Rebmann X-Mailer: b4 0.15-dev-19c33 X-Developer-Signature: v=1; a=openpgp-sha256; l=7291; i=jre@pengutronix.de; h=from:subject:message-id; bh=xj6S3M8xJY8PbtvB49mSf5ejLhiwBMln/kdBPNm/grU=; b=owGbwMvMwCF2ZcYT3onnbjcwnlZLYsioCkviqXp19aZqZ9HjvpbtUxaf05/csmf1/tOcyxKaK za9WBe8rqOUhUGMg0FWTJElVk1OQcjY/7pZpV0szBxWJpAhDFycAjAR1UiGv1IWdmqLzyluUXz5 IJZf5Mzl2lXi7pF7mtMWvDB5HTznfizDf09nlow1yztnutt8eLb/UYT0tEWsBo2ruZriFr1fpf7 9FCMA X-Developer-Key: i=jre@pengutronix.de; a=openpgp; fpr=0B7B750D5D3CD21B3B130DE8B61515E135CD49B5 X-SA-Exim-Connect-IP: 2a0a:edc0:0:1101:1d::ac X-SA-Exim-Mail-From: jre@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Add support for the Texas Instruments INA228 Ultra-Precise Power/Energy/Charge Monitor. The INA228 is very similar to the INA238 but offers four bits of extra precision in the temperature, voltage and current measurement fields. It also supports energy and charge monitoring, the latter of which is not supported through this patch. While it seems in the datasheet that some constants such as LSB values differ between the 228 and the 238, they differ only for those registers where four bits of precision have been added and they differ by a factor of 16 (VBUS, VSHUNT, DIETEMP, CURRENT). Therefore, the INA238 constants are still applicable with regard to the bit of the same significance. Signed-off-by: Jonas Rebmann --- drivers/hwmon/ina238.c | 106 +++++++++++++++++++++++++++++++++++++++++++++= +--- 1 file changed, 101 insertions(+), 5 deletions(-) diff --git a/drivers/hwmon/ina238.c b/drivers/hwmon/ina238.c index 5e43bbe8817d..5a394eeff676 100644 --- a/drivers/hwmon/ina238.c +++ b/drivers/hwmon/ina238.c @@ -6,6 +6,7 @@ * Copyright (C) 2021 Nathan Rossi */ =20 +#include #include #include #include @@ -107,6 +108,7 @@ #define INA238_DIE_TEMP_LSB 1250000 /* 125.0000 mC/lsb */ #define SQ52206_BUS_VOLTAGE_LSB 3750 /* 3.75 mV/lsb */ #define SQ52206_DIE_TEMP_LSB 78125 /* 7.8125 mC/lsb */ +#define INA228_DIE_TEMP_LSB 78125 /* 7.8125 mC/lsb */ =20 static const struct regmap_config ina238_regmap_config =3D { .max_register =3D INA238_REGISTERS, @@ -114,9 +116,10 @@ static const struct regmap_config ina238_regmap_config= =3D { .val_bits =3D 16, }; =20 -enum ina238_ids { ina238, ina237, sq52206 }; +enum ina238_ids { ina238, ina237, sq52206, ina228 }; =20 struct ina238_config { + bool has_20bit_voltage_current; /* vshunt, vbus and current are 20-bit fi= elds */ bool has_power_highest; /* chip detection power peak */ bool has_energy; /* chip detection energy */ u8 temp_shift; /* fixed parameters for temp calculate */ @@ -137,6 +140,7 @@ struct ina238_data { =20 static const struct ina238_config ina238_config[] =3D { [ina238] =3D { + .has_20bit_voltage_current =3D false, .has_energy =3D false, .has_power_highest =3D false, .temp_shift =3D 4, @@ -146,6 +150,7 @@ static const struct ina238_config ina238_config[] =3D { .temp_lsb =3D INA238_DIE_TEMP_LSB, }, [ina237] =3D { + .has_20bit_voltage_current =3D false, .has_energy =3D false, .has_power_highest =3D false, .temp_shift =3D 4, @@ -155,6 +160,7 @@ static const struct ina238_config ina238_config[] =3D { .temp_lsb =3D INA238_DIE_TEMP_LSB, }, [sq52206] =3D { + .has_20bit_voltage_current =3D false, .has_energy =3D true, .has_power_highest =3D true, .temp_shift =3D 0, @@ -163,6 +169,16 @@ static const struct ina238_config ina238_config[] =3D { .bus_voltage_lsb =3D SQ52206_BUS_VOLTAGE_LSB, .temp_lsb =3D SQ52206_DIE_TEMP_LSB, }, + [ina228] =3D { + .has_20bit_voltage_current =3D true, + .has_energy =3D true, + .has_power_highest =3D false, + .temp_shift =3D 0, + .power_calculate_factor =3D 20, + .config_default =3D INA238_CONFIG_DEFAULT, + .bus_voltage_lsb =3D INA238_BUS_VOLTAGE_LSB, + .temp_lsb =3D INA228_DIE_TEMP_LSB, + }, }; =20 static int ina238_read_reg24(const struct i2c_client *client, u8 reg, u32 = *val) @@ -199,6 +215,65 @@ static int ina238_read_reg40(const struct i2c_client *= client, u8 reg, u64 *val) return 0; } =20 +static int ina238_read_field_s20(const struct i2c_client *client, u8 reg, = s32 *val) +{ + u32 regval; + int err; + + err =3D ina238_read_reg24(client, reg, ®val); + if (err) + return err; + + /* bits 3-0 Reserved, always zero */ + regval >>=3D 4; + + *val =3D sign_extend32(regval, 19); + + return 0; +} + +static int ina228_read_shunt_voltage(struct device *dev, u32 attr, int cha= nnel, + long *val) +{ + struct ina238_data *data =3D dev_get_drvdata(dev); + int regval; + int err; + + err =3D ina238_read_field_s20(data->client, INA238_SHUNT_VOLTAGE, ®val= ); + if (err) + return err; + + /* + * gain of 1 -> LSB / 4 + * This field has 16 bit on ina238. ina228 adds another 4 bits of + * precision. ina238 conversion factors can still be applied when + * dividing by 16. + */ + *val =3D (regval * INA238_SHUNT_VOLTAGE_LSB) * data->gain / (1000 * 4) / = 16; + return 0; +} + +static int ina228_read_bus_voltage(struct device *dev, u32 attr, int chann= el, + long *val) +{ + struct ina238_data *data =3D dev_get_drvdata(dev); + int regval; + int err; + + err =3D ina238_read_field_s20(data->client, INA238_BUS_VOLTAGE, ®val); + if (err) + return err; + + /* + * gain of 1 -> LSB / 4 + * This field has 16 bit on ina238. ina228 adds another 4 bits of + * precision. ina238 conversion factors can still be applied when + * dividing by 16. + */ + *val =3D (regval * data->config->bus_voltage_lsb) / 1000 / 16; + return 0; +} + static int ina238_read_in(struct device *dev, u32 attr, int channel, long *val) { @@ -211,6 +286,8 @@ static int ina238_read_in(struct device *dev, u32 attr,= int channel, case 0: switch (attr) { case hwmon_in_input: + if (data->config->has_20bit_voltage_current) + return ina228_read_shunt_voltage(dev, attr, channel, val); reg =3D INA238_SHUNT_VOLTAGE; break; case hwmon_in_max: @@ -234,6 +311,8 @@ static int ina238_read_in(struct device *dev, u32 attr,= int channel, case 1: switch (attr) { case hwmon_in_input: + if (data->config->has_20bit_voltage_current) + return ina228_read_bus_voltage(dev, attr, channel, val); reg =3D INA238_BUS_VOLTAGE; break; case hwmon_in_max: @@ -341,13 +420,25 @@ static int ina238_read_current(struct device *dev, u3= 2 attr, long *val) =20 switch (attr) { case hwmon_curr_input: - err =3D regmap_read(data->regmap, INA238_CURRENT, ®val); - if (err < 0) - return err; + if (data->config->has_20bit_voltage_current) { + err =3D ina238_read_field_s20(data->client, INA238_CURRENT, ®val); + if (err) + return err; + } else { + err =3D regmap_read(data->regmap, INA238_CURRENT, ®val); + if (err < 0) + return err; + /* sign-extend */ + regval =3D (s16)regval; + } =20 /* Signed register, fixed 1mA current lsb. result in mA */ - *val =3D div_s64((s16)regval * INA238_FIXED_SHUNT * data->gain, + *val =3D div_s64((s64)regval * INA238_FIXED_SHUNT * data->gain, data->rshunt * 4); + + /* Account for 4 bit offset */ + if (data->config->has_20bit_voltage_current) + *val /=3D 16; break; default: return -EOPNOTSUPP; @@ -750,6 +841,7 @@ static int ina238_probe(struct i2c_client *client) } =20 static const struct i2c_device_id ina238_id[] =3D { + { "ina228", ina228 }, { "ina237", ina237 }, { "ina238", ina238 }, { "sq52206", sq52206 }, @@ -758,6 +850,10 @@ static const struct i2c_device_id ina238_id[] =3D { MODULE_DEVICE_TABLE(i2c, ina238_id); =20 static const struct of_device_id __maybe_unused ina238_of_match[] =3D { + { + .compatible =3D "ti,ina228", + .data =3D (void *)ina228 + }, { .compatible =3D "ti,ina237", .data =3D (void *)ina237 --=20 2.50.1.319.g90c0775e97