From: Søren Andersen <san@xxxxxxx> Add support for specifying the quartz load in the DT node. The pcf85063 may use either a 7 pF or an 12.5 pF xtal. If the rtc has the wrong configuration the time will drift several hours/week. If nothing is specified in DT then the factory default of 7 pF is used. Signed-off-by: Søren Andersen <san@xxxxxxx> Signed-off-by: Sam Ravnborg <sam@xxxxxxxxxxxx> Cc: Alessandro Zummo <a.zummo@xxxxxxxxxxxx> Cc: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx> --- drivers/rtc/rtc-pcf85063.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c index 283c2335b01b..38163446664f 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,31 @@ static const struct rtc_class_ops pcf85063_rtc_ops = { .set_time = pcf85063_rtc_set_time }; +static int pcf85063_select_capacitance(struct i2c_client *client) +{ + int rc; + u8 reg; + + rc = i2c_smbus_read_byte_data(client, PCF85063_REG_CTRL1); + if (rc < 0) { + dev_err(&client->dev, "Failing to read Control1 reg\n"); + return -EIO; + } + + if (device_property_present(&client->dev, "nxp,quartz_load_12.5pf")) + reg = rc |= PCF85063_REG_CTRL1_CAP_SEL; + else + reg = rc &= ~PCF85063_REG_CTRL1_CAP_SEL; + + rc = i2c_smbus_write_byte_data(client, PCF85063_REG_CTRL1, reg); + if (rc < 0) { + dev_err(&client->dev, "Failing to configure device\n"); + return -EIO; + } + + return 0; +} + static int pcf85063_probe(struct i2c_client *client, const struct i2c_device_id *id) { @@ -197,6 +223,11 @@ static int pcf85063_probe(struct i2c_client *client, return err; } + err = pcf85063_select_capacitance(client); + if (err < 0) + dev_warn(&client->dev, + "Capacitance setup failed. Trying to continue\n"); + rtc = devm_rtc_device_register(&client->dev, pcf85063_driver.driver.name, &pcf85063_rtc_ops, THIS_MODULE); -- 2.12.0