[PATCH 2/2] rtc: pcf85063: add support for oscillator capacitor selection

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Configure the oscillator capacitor selection if specified.

Co-developed-by: Lukas Stockmann <lukas.stockmann@xxxxxxxxxxx>
Signed-off-by: Urs Fässler <urs.fassler@xxxxxx>
Signed-off-by: Lukas Stockmann <lukas.stockmann@xxxxxxxxxxx>
Signed-off-by: Pascal Bach <pascal.bach@xxxxxxxxxxx>
---
 drivers/rtc/rtc-pcf85063.c | 54 +++++++++++++++++++++++++++++++++++---
 1 file changed, 50 insertions(+), 4 deletions(-)

diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c
index 283c2335b01b..69ee72f00164 100644
--- a/drivers/rtc/rtc-pcf85063.c
+++ b/drivers/rtc/rtc-pcf85063.c
@@ -180,21 +180,67 @@ static const struct rtc_class_ops pcf85063_rtc_ops = {
 	.set_time	= pcf85063_rtc_set_time
 };
 
+
+#ifdef CONFIG_OF
+static int setup_oscillator_capacitor(struct i2c_client *client, u8 ctrl1)
+{
+	int ret;
+	u32 cap_sel;
+
+	ret = of_property_read_u32(client->dev.of_node, "cap-sel", &cap_sel);
+	if (ret != 0) {
+		/* no capacitor selection defined, but that is ok */
+		return 0;
+	}
+
+	if ((cap_sel & 0xfe) != 0) {
+		dev_err(&client->dev,
+			 "Unsupported cap-sel value %u in dt\n", cap_sel);
+		return -EINVAL;
+	}
+
+	ctrl1 = (ctrl1 & 0xfe) | cap_sel;
+	ret = i2c_smbus_write_byte_data(client, PCF85063_REG_CTRL1, ctrl1);
+
+	if (ret < 0) {
+		dev_err(&client->dev, "set oscillator capacitor failed\n");
+		return -EIO;
+	}
+
+	dev_info(&client->dev,
+		 "set oscillator capacitor selection to %u\n", cap_sel);
+
+	return 0;
+}
+#else
+static int setup_oscillator_capacitor(struct i2c_client *client, u8 ctrl1)
+{
+	return 0;
+}
+#endif
+
 static int pcf85063_probe(struct i2c_client *client,
 				const struct i2c_device_id *id)
 {
 	struct rtc_device *rtc;
-	int err;
+	int ret;
+	u8 ctrl1;
 
 	dev_dbg(&client->dev, "%s\n", __func__);
 
 	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
 		return -ENODEV;
 
-	err = i2c_smbus_read_byte_data(client, PCF85063_REG_CTRL1);
-	if (err < 0) {
+	ret = i2c_smbus_read_byte_data(client, PCF85063_REG_CTRL1);
+	if (ret < 0) {
 		dev_err(&client->dev, "RTC chip is not present\n");
-		return err;
+		return ret;
+	}
+	ctrl1 = ret;
+
+	ret = setup_oscillator_capacitor(client, ctrl1);
+	if (ret < 0) {
+		return ret;
 	}
 
 	rtc = devm_rtc_device_register(&client->dev,
-- 
2.18.0




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux