rtc: pcf85363: add support for the quartz-load-femtofarads property
authorJavier Carrasco <javier.carrasco@wolfvision.net>
Wed, 15 Feb 2023 08:18:15 +0000 (09:18 +0100)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Wed, 22 Feb 2023 14:31:01 +0000 (15:31 +0100)
The quartz oscillator load capacitance of the PCF85263 and PCF85363 can
be adjusted to 6 pF, 7 pF (default) and 12.5 pF with the CL[1:0] bits in
the oscillator control register (address 25h).

Signed-off-by: Javier Carrasco <javier.carrasco@wolfvision.net>
Link: https://lore.kernel.org/r/20230215081815.3141776-3-javier.carrasco@wolfvision.net
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/rtc/rtc-pcf85363.c

index 5de323a..8958ead 100644 (file)
 #define PIN_IO_INTA_OUT        2
 #define PIN_IO_INTA_HIZ        3
 
+#define OSC_CAP_SEL    GENMASK(1, 0)
+#define OSC_CAP_6000   0x01
+#define OSC_CAP_12500  0x02
+
 #define STOP_EN_STOP   BIT(0)
 
 #define RESET_CPR      0xa4
@@ -117,6 +121,32 @@ struct pcf85x63_config {
        unsigned int num_nvram;
 };
 
+static int pcf85363_load_capacitance(struct pcf85363 *pcf85363, struct device_node *node)
+{
+       u32 load = 7000;
+       u8 value = 0;
+
+       of_property_read_u32(node, "quartz-load-femtofarads", &load);
+
+       switch (load) {
+       default:
+               dev_warn(&pcf85363->rtc->dev, "Unknown quartz-load-femtofarads value: %d. Assuming 7000",
+                        load);
+               fallthrough;
+       case 7000:
+               break;
+       case 6000:
+               value = OSC_CAP_6000;
+               break;
+       case 12500:
+               value = OSC_CAP_12500;
+               break;
+       }
+
+       return regmap_update_bits(pcf85363->regmap, CTRL_OSCILLATOR,
+                                 OSC_CAP_SEL, value);
+}
+
 static int pcf85363_rtc_read_time(struct device *dev, struct rtc_time *tm)
 {
        struct pcf85363 *pcf85363 = dev_get_drvdata(dev);
@@ -372,7 +402,7 @@ static int pcf85363_probe(struct i2c_client *client)
                        .reg_write = pcf85363_nvram_write,
                },
        };
-       int ret, i;
+       int ret, i, err;
 
        if (data)
                config = data;
@@ -394,6 +424,11 @@ static int pcf85363_probe(struct i2c_client *client)
        if (IS_ERR(pcf85363->rtc))
                return PTR_ERR(pcf85363->rtc);
 
+       err = pcf85363_load_capacitance(pcf85363, client->dev.of_node);
+       if (err < 0)
+               dev_warn(&client->dev, "failed to set xtal load capacitance: %d",
+                        err);
+
        pcf85363->rtc->ops = &rtc_ops;
        pcf85363->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
        pcf85363->rtc->range_max = RTC_TIMESTAMP_END_2099;