From: Robert Hancock <robert.hancock@calian.com>
To: mturquette@baylibre.com, sboyd@kernel.org
Cc: mike.looijmans@topic.nl, devicetree@vger.kernel.org,
linux-clk@vger.kernel.org,
Robert Hancock <robert.hancock@calian.com>
Subject: [PATCH 9/9] clk: si5341: Add sysfs properties to allow checking/resetting device faults
Date: Thu, 11 Mar 2021 16:24:36 -0600 [thread overview]
Message-ID: <20210311222436.3826800-10-robert.hancock@calian.com> (raw)
In-Reply-To: <20210311222436.3826800-1-robert.hancock@calian.com>
Add sysfs property files to allow viewing the current and latched states of
the input present and PLL lock bits, and allow resetting the latched fault
state. This allows manual checks or automated userspace polling for faults
occurring after initialization.
Signed-off-by: Robert Hancock <robert.hancock@calian.com>
---
drivers/clk/clk-si5341.c | 96 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/drivers/clk/clk-si5341.c b/drivers/clk/clk-si5341.c
index 4cd80ef389d2..f2bcaedf1c71 100644
--- a/drivers/clk/clk-si5341.c
+++ b/drivers/clk/clk-si5341.c
@@ -1479,6 +1479,94 @@ static int si5341_check_healthy(struct clk_si5341 *data)
return 0;
}
+static ssize_t input_present_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct clk_si5341 *data = dev_get_drvdata(dev);
+ u32 status;
+ int res = regmap_read(data->regmap, SI5341_STATUS, &status);
+
+ if (res < 0)
+ return res;
+ res = !(status & SI5341_STATUS_LOSREF);
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
+}
+static DEVICE_ATTR_RO(input_present);
+
+static ssize_t input_present_sticky_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct clk_si5341 *data = dev_get_drvdata(dev);
+ u32 status;
+ int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status);
+
+ if (res < 0)
+ return res;
+ res = !(status & SI5341_STATUS_LOSREF);
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
+}
+static DEVICE_ATTR_RO(input_present_sticky);
+
+static ssize_t pll_locked_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct clk_si5341 *data = dev_get_drvdata(dev);
+ u32 status;
+ int res = regmap_read(data->regmap, SI5341_STATUS, &status);
+
+ if (res < 0)
+ return res;
+ res = !(status & SI5341_STATUS_LOL);
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
+}
+static DEVICE_ATTR_RO(pll_locked);
+
+static ssize_t pll_locked_sticky_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct clk_si5341 *data = dev_get_drvdata(dev);
+ u32 status;
+ int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status);
+
+ if (res < 0)
+ return res;
+ res = !(status & SI5341_STATUS_LOL);
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
+}
+static DEVICE_ATTR_RO(pll_locked_sticky);
+
+static ssize_t clear_sticky_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct clk_si5341 *data = dev_get_drvdata(dev);
+ long val;
+
+ if (kstrtol(buf, 10, &val))
+ return -EINVAL;
+ if (val) {
+ int res = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0);
+
+ if (res < 0)
+ return res;
+ }
+ return count;
+}
+static DEVICE_ATTR_WO(clear_sticky);
+
+static const struct attribute *si5341_attributes[] = {
+ &dev_attr_input_present.attr,
+ &dev_attr_input_present_sticky.attr,
+ &dev_attr_pll_locked.attr,
+ &dev_attr_pll_locked_sticky.attr,
+ &dev_attr_clear_sticky.attr,
+ NULL
+};
+
static int si5341_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1706,6 +1794,12 @@ static int si5341_probe(struct i2c_client *client,
goto cleanup;
}
+ err = sysfs_create_files(&client->dev.kobj, si5341_attributes);
+ if (err) {
+ dev_err(&client->dev, "unable to create sysfs files\n");
+ goto cleanup;
+ }
+
/* Free the names, clk framework makes copies */
for (i = 0; i < data->num_synth; ++i)
devm_kfree(&client->dev, (void *)synth_clock_names[i]);
@@ -1725,6 +1819,8 @@ int si5341_remove(struct i2c_client *client)
struct clk_si5341 *data = i2c_get_clientdata(client);
int i;
+ sysfs_remove_files(&client->dev.kobj, si5341_attributes);
+
for (i = 0; i < SI5341_MAX_NUM_OUTPUTS; ++i) {
if (data->clk[i].vdd_reg)
regulator_disable(data->clk[i].vdd_reg);
--
2.27.0
prev parent reply other threads:[~2021-03-11 22:26 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-11 22:24 [PATCH 0/9] Si5341 driver updates Robert Hancock
[not found] ` <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.a5c64a18-101d-4705-9716-1c41c644d43a@emailsignatures365.codetwo.com>
[not found] ` <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.9334a909-9494-43d0-954a-ed0ddcbb7b5d@emailsignatures365.codetwo.com>
[not found] ` <1b153bce-a66a-45ee-a5c6-963ea6fb1c82.949ef384-8293-46b8-903f-40a477c056ae.b1dc66c0-d7df-44f1-9f1a-e729e77f49c2@emailsignatures365.codetwo.com>
2021-03-11 22:24 ` [PATCH 1/9] dt-bindings: clock: clk-si5341: Add new attributes Robert Hancock
2021-03-11 22:24 ` [PATCH 2/9] clk: si5341: Wait for DEVICE_READY on startup Robert Hancock
2021-03-12 6:39 ` Mike Looijmans
2021-03-12 15:23 ` Robert Hancock
2021-03-11 22:24 ` [PATCH 3/9] clk: si5341: Avoid divide errors due to bogus register contents Robert Hancock
2021-03-11 22:24 ` [PATCH 4/9] clk: si5341: Check for input clock presence and PLL lock on startup Robert Hancock
2021-03-12 6:47 ` Mike Looijmans
2021-03-12 15:23 ` Robert Hancock
2021-03-11 22:24 ` [PATCH 5/9] clk: si5341: Update initialization magic Robert Hancock
2021-03-11 22:24 ` [PATCH 6/9] clk: si5341: Allow different output VDD_SEL values Robert Hancock
2021-03-12 0:09 ` kernel test robot
2021-03-12 0:09 ` [RFC PATCH] clk: si5341: si5341_remove() can be static kernel test robot
2021-03-12 0:48 ` [PATCH 6/9] clk: si5341: Allow different output VDD_SEL values kernel test robot
2021-03-11 22:24 ` [PATCH 7/9] clk: si5341: Add silabs,xaxb-ext-clk property Robert Hancock
2021-03-11 22:24 ` [PATCH 8/9] clk: si5341: Add silabs,iovdd-33 property Robert Hancock
2021-03-12 6:44 ` Mike Looijmans
2021-03-12 15:39 ` Robert Hancock
2021-03-11 22:24 ` Robert Hancock [this message]
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=20210311222436.3826800-10-robert.hancock@calian.com \
--to=robert.hancock@calian.com \
--cc=devicetree@vger.kernel.org \
--cc=linux-clk@vger.kernel.org \
--cc=mike.looijmans@topic.nl \
--cc=mturquette@baylibre.com \
--cc=sboyd@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