From: Chris Packham <chris.packham@alliedtelesis.co.nz>
To: jdelvare@suse.com, linux@roeck-us.net, robh+dt@kernel.org
Cc: linux-hwmon@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org,
Chris Packham <chris.packham@alliedtelesis.co.nz>
Subject: [PATCH 2/2] hwmon: (adt7475) Add support for pin configuration
Date: Thu, 17 Mar 2022 12:41:34 +1300 [thread overview]
Message-ID: <20220316234134.290492-3-chris.packham@alliedtelesis.co.nz> (raw)
In-Reply-To: <20220316234134.290492-1-chris.packham@alliedtelesis.co.nz>
The adt7473, adt7475, adt7476 and adt7490 have pins that can be used for
different functions. On the adt7473 and adt7475 this is pins 5 and 9.
On the adt7476 and adt7490 this is pins 10 and 14.
The first pin can either be PWM2(default) or SMBALERT#. The second pin
can be TACH4(default), THERM#, SMBALERT# or GPIO.
The adt7475 driver has always been able to detect the configuration if
it had been done by an earlier boot stage. Add support for configuring
the pins based on the hardware description in the device tree.
Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
---
drivers/hwmon/adt7475.c | 95 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 9d5b019651f2..ad5e5a7a844b 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -112,6 +112,8 @@
#define CONFIG3_THERM 0x02
#define CONFIG4_PINFUNC 0x03
+#define CONFIG4_THERM 0x01
+#define CONFIG4_SMBALERT 0x02
#define CONFIG4_MAXDUTY 0x08
#define CONFIG4_ATTN_IN10 0x30
#define CONFIG4_ATTN_IN43 0xC0
@@ -1460,6 +1462,95 @@ static int adt7475_update_limits(struct i2c_client *client)
return 0;
}
+static int load_pin10_config(const struct i2c_client *client, const char *propname)
+{
+ const char *function;
+ u8 config3;
+ int err;
+
+ err = of_property_read_string(client->dev.of_node, propname, &function);
+ if (!err) {
+ config3 = adt7475_read(REG_CONFIG3);
+
+ if (!strcmp("pwm2", function))
+ config3 &= ~CONFIG3_SMBALERT;
+ else if (!strcmp("smbalert#", function))
+ config3 |= CONFIG3_SMBALERT;
+ else
+ return -EINVAL;
+
+ return i2c_smbus_write_byte_data(client, REG_CONFIG3, config3);
+ }
+
+ return 0;
+}
+
+static int load_pin14_config(const struct i2c_client *client, const char *propname)
+{
+ const char *function;
+ u8 config4;
+ int err;
+
+ err = of_property_read_string(client->dev.of_node, propname, &function);
+ if (!err) {
+ config4 = adt7475_read(REG_CONFIG4);
+ config4 &= ~CONFIG4_PINFUNC;
+
+ if (!strcmp("tach4", function))
+ ;
+ else if (!strcmp("therm#", function))
+ config4 |= CONFIG4_THERM;
+ else if (!strcmp("smbalert#", function))
+ config4 |= CONFIG4_SMBALERT;
+ else if (!strcmp("gpio", function))
+ config4 |= CONFIG4_PINFUNC;
+ else
+ return -EINVAL;
+
+ return i2c_smbus_write_byte_data(client, REG_CONFIG4, config4);
+ }
+
+ return 0;
+}
+
+static int load_config(const struct i2c_client *client, int chip)
+{
+ int err;
+ const char *conf_prop1, *conf_prop2;
+
+ switch (chip) {
+ case adt7473:
+ case adt7475:
+ conf_prop1 = "adi,pin5-function";
+ conf_prop2 = "adi,pin9-function";
+ break;
+ case adt7476:
+ case adt7490:
+ conf_prop1 = "adi,pin10-function";
+ conf_prop2 = "adi,pin14-function";
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (chip != adt7476 && chip != adt7490)
+ return 0;
+
+ err = load_pin10_config(client, conf_prop1);
+ if (err) {
+ dev_err(&client->dev, "failed to configure PIN10\n");
+ return err;
+ }
+
+ err = load_pin14_config(client, conf_prop2);
+ if (err) {
+ dev_err(&client->dev, "failed to configure PIN14\n");
+ return err;
+ }
+
+ return 0;
+}
+
static int set_property_bit(const struct i2c_client *client, char *property,
u8 *config, u8 bit_index)
{
@@ -1585,6 +1676,10 @@ static int adt7475_probe(struct i2c_client *client)
revision = adt7475_read(REG_DEVID2) & 0x07;
}
+ ret = load_config(client, chip);
+ if (ret)
+ return ret;
+
config3 = adt7475_read(REG_CONFIG3);
/* Pin PWM2 may alternatively be used for ALERT output */
if (!(config3 & CONFIG3_SMBALERT))
--
2.35.1
next prev parent reply other threads:[~2022-03-16 23:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-16 23:41 [PATCH 0/2] hwmon: (adt7475) pin configuration Chris Packham
2022-03-16 23:41 ` [PATCH 1/2] dt-bindings: hwmon: Document adt7475 pin-function properties Chris Packham
2022-03-17 9:23 ` Krzysztof Kozlowski
2022-03-16 23:41 ` Chris Packham [this message]
2022-03-17 13:28 ` [PATCH 2/2] hwmon: (adt7475) Add support for pin configuration Guenter Roeck
2022-03-17 21:35 ` Chris Packham
2022-03-17 22:01 ` 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=20220316234134.290492-3-chris.packham@alliedtelesis.co.nz \
--to=chris.packham@alliedtelesis.co.nz \
--cc=devicetree@vger.kernel.org \
--cc=jdelvare@suse.com \
--cc=linux-hwmon@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@roeck-us.net \
--cc=robh+dt@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).