All of lore.kernel.org
 help / color / mirror / Atom feed
From: Logan Shaw <logan.shaw@alliedtelesis.co.nz>
To: jdelvare@suse.com, linux@roeck-us.net
Cc: logan.shaw@alliedtelesis.co.nz, joshua.scott@alliedtelesis.co.nz,
	linux-hwmon@vger.kernel.org
Subject: [PATCH v2 1/2] hwmon: (adt7475) Added attenuator bypass support
Date: Thu, 19 Dec 2019 16:32:12 +1300	[thread overview]
Message-ID: <20191219033213.30364-2-logan.shaw@alliedtelesis.co.nz> (raw)
In-Reply-To: <20191219033213.30364-1-logan.shaw@alliedtelesis.co.nz>

Added support for reading DTS properties to set attenuators on
device probe. Only bypasses attenuators on the ADT7476 and ADT7490
(other chips do not support this).

Signed-off-by: Logan Shaw <logan.shaw@alliedtelesis.co.nz>
---
---
 drivers/hwmon/adt7475.c | 73 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 73 insertions(+)

diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
index 6c64d50c9aae..1e6ca1bc28ce 100644
--- a/drivers/hwmon/adt7475.c
+++ b/drivers/hwmon/adt7475.c
@@ -19,6 +19,7 @@
 #include <linux/hwmon-vid.h>
 #include <linux/err.h>
 #include <linux/jiffies.h>
+#include <linux/of.h>
 #include <linux/util_macros.h>
 
 /* Indexes for the sysfs hooks */
@@ -1457,6 +1458,68 @@ static int adt7475_update_limits(struct i2c_client *client)
 	return 0;
 }
 
+/**
+ * Reads individual voltage input bypass attenuator properties from the DTS,
+ * and if the property is present the corresponding bit is set in the
+ * register. Only the ADT7476 and ADT7490 support bypassing individual
+ * attenuators.
+ *
+ * Properties must be in the form of "bypass-attenuator-inx", where x is an
+ * integer from the set {0, 1, 3, 4} (can not bypass in2 attenuator).
+ *
+ * Returns a negative error code if there was an error writing to the register.
+ */
+static int load_individual_bypass_attenuators(const struct i2c_client *client,
+					      u8 *config4)
+{
+	u8 config4_copy = *config4;
+
+	if (of_get_property(client->dev.of_node, "bypass-attenuator-in0", NULL))
+		config4_copy |= (1 << 4);
+
+	if (of_get_property(client->dev.of_node, "bypass-attenuator-in1", NULL))
+		config4_copy |= (1 << 5);
+
+	if (of_get_property(client->dev.of_node, "bypass-attenuator-in3", NULL))
+		config4_copy |= (1 << 6);
+
+	if (of_get_property(client->dev.of_node, "bypass-attenuator-in4", NULL))
+		config4_copy |= (1 << 7);
+
+	if (i2c_smbus_write_byte_data(client, REG_CONFIG4, config4_copy) < 0)
+		return -EREMOTEIO;
+
+	*config4 = config4_copy;
+
+	return 0;
+}
+
+/**
+ * Sets the bypass all attenuators bit, if the "bypass-attenuator-all"
+ * property exists in the DTS.
+ *
+ * Returns a negative error code if there was an error writing to the
+ * register.
+ */
+static int load_all_bypass_attenuator(const struct i2c_client *client,
+				      u8 *config2)
+{
+	u8 config2_copy = *config2;
+
+	if (!of_get_property(client->dev.of_node,
+			     "bypass-attenuator-all", NULL))
+		return 0;
+
+	config2_copy |= (1 << 5);
+
+	if (i2c_smbus_write_byte_data(client, REG_CONFIG2, config2_copy) < 0)
+		return -EREMOTEIO;
+
+	*config2 = config2_copy;
+
+	return 0;
+}
+
 static int adt7475_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
 {
@@ -1545,7 +1608,17 @@ static int adt7475_probe(struct i2c_client *client,
 	}
 
 	/* Voltage attenuators can be bypassed, globally or individually */
+	if (chip == adt7476 || chip == adt7490)
+		if (load_individual_bypass_attenuators(client,
+							&(data->config4)) < 0)
+			dev_warn(&client->dev,
+				 "Error setting bypass attenuator bits\n");
+
 	config2 = adt7475_read(REG_CONFIG2);
+	if (chip == adt7476 || chip == adt7490)
+		if (load_all_bypass_attenuator(client, &config2) < 0)
+			dev_warn(&client->dev, "Error setting bypass all attenuator\n");
+
 	if (config2 & CONFIG2_ATTN) {
 		data->bypass_attn = (0x3 << 3) | 0x3;
 	} else {
-- 
2.23.0


  reply	other threads:[~2019-12-19  3:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-19  3:32 [PATCH v2 0/2] hwmon: (adt7475) Added attenuator bypass support Logan Shaw
2019-12-19  3:32 ` Logan Shaw [this message]
2019-12-19  3:32 ` [PATCH v2 2/2] " Logan Shaw
2019-12-19  3:53   ` Guenter Roeck
2019-12-27  2:53     ` Logan Shaw
2020-01-09  3:07       ` Logan Shaw
2020-01-09 23:03       ` Guenter Roeck
2020-01-13  0:08     ` Chris Packham

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=20191219033213.30364-2-logan.shaw@alliedtelesis.co.nz \
    --to=logan.shaw@alliedtelesis.co.nz \
    --cc=jdelvare@suse.com \
    --cc=joshua.scott@alliedtelesis.co.nz \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux@roeck-us.net \
    /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.