[PATCH v2 5/5] rtc: pcf85063: set xtal load capacitance from DT
From: Sam Ravnborg
Date: Tue Jan 08 2019 - 13:54:59 EST
Add support for specifying the xtal load capacitance in the DT node.
The pcf85063 supports xtal load capacitance of 7pF or 12.5pF.
If the rtc has the wrong configuration the time will
drift several hours/week.
The driver use the default value 7pF.
The DT may specify either 7000fF or 12500fF.
(The DT uses femto Farad to avoid decimal numbers).
Other values are warned and the driver uses the default value.
Signed-off-by: Sam Ravnborg <sam@xxxxxxxxxxxx>
Cc: Alessandro Zummo <a.zummo@xxxxxxxxxxxx>
Cc: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx>
Cc: Urs FÃssler <urs.fassler@xxxxxx>
---
drivers/rtc/rtc-pcf85063.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c
index 283c2335b01b..0c0b6030627e 100644
--- a/drivers/rtc/rtc-pcf85063.c
+++ b/drivers/rtc/rtc-pcf85063.c
@@ -27,6 +27,7 @@
*/
#define PCF85063_REG_CTRL1 0x00 /* status */
+#define PCF85063_REG_CTRL1_CAP_SEL BIT(0)
#define PCF85063_REG_CTRL1_STOP BIT(5)
#define PCF85063_REG_CTRL2 0x01
@@ -180,6 +181,39 @@ static const struct rtc_class_ops pcf85063_rtc_ops = {
.set_time = pcf85063_rtc_set_time
};
+static int pcf85063_load_capacitance(struct i2c_client *client)
+{
+ u32 load;
+ int rc;
+ u8 reg;
+
+ rc = i2c_smbus_read_byte_data(client, PCF85063_REG_CTRL1);
+ if (rc < 0)
+ return rc;
+
+ reg = rc;
+ load = 7000;
+ of_property_read_u32(client->dev.of_node, "quartz-load-femtofarads",
+ &load);
+
+ switch (load) {
+ default:
+ dev_warn(&client->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 7000",
+ load);
+ /* fall through */
+ case 7000:
+ reg &= ~PCF85063_REG_CTRL1_CAP_SEL;
+ break;
+ case 12500:
+ reg |= PCF85063_REG_CTRL1_CAP_SEL;
+ break;
+ }
+
+ rc = i2c_smbus_write_byte_data(client, PCF85063_REG_CTRL1, reg);
+
+ return rc;
+}
+
static int pcf85063_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -197,6 +231,11 @@ static int pcf85063_probe(struct i2c_client *client,
return err;
}
+ err = pcf85063_load_capacitance(client);
+ if (err < 0)
+ dev_warn(&client->dev, "failed to set xtal load capacitance: %d",
+ err);
+
rtc = devm_rtc_device_register(&client->dev,
pcf85063_driver.driver.name,
&pcf85063_rtc_ops, THIS_MODULE);
--
2.12.0