[prev in list] [next in list] [prev in thread] [next in thread]
List: linux-rtc
Subject: [v2,4/4] rtc: pcf85063Add support for different loads
From: Søren_Andersen <san () rosetechnology ! dk>
Date: 2015-03-10 20:40:40
Message-ID: 1426020040.5476.25.camel () sanws1 ! rosetechnology ! dk
[Download RAW message or body]
Signed-off-by: Soeren Andersen <san at rosetechnology.dk>
---
drivers/rtc/rtc-pcf85063.c | 37 +++++++++++++++++++++++++++++++------
1 file changed, 31 insertions(+), 6 deletions(-)
diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c
index 6a12bf6..dff5d84 100644
--- a/drivers/rtc/rtc-pcf85063.c
+++ b/drivers/rtc/rtc-pcf85063.c
@@ -16,10 +16,12 @@
#include <linux/rtc.h>
#include <linux/module.h>
-#define DRV_VERSION "0.0.1"
+#define DRV_VERSION "0.0.2"
#define PCF85063_REG_CTRL1 0x00 /* status */
+#define PCF85063_REG_CTRL1_CAP_SEL (1 << 0)
#define PCF85063_REG_CTRL2 0x01
+#define PCF85063_REG_OFFSET 0x02
#define PCF85063_REG_SC 0x04 /* datetime */
#define PCF85063_REG_MN 0x05
@@ -94,10 +96,6 @@ static int pcf85063_set_datetime(struct i2c_client *client, struct rtc_time *tm)
int i = 0, err = 0;
unsigned char buf[11];
- /* Control & status */
- buf[PCF85063_REG_CTRL1] = 0;
- buf[PCF85063_REG_CTRL2] = 5;
-
/* hours, minutes and seconds */
buf[PCF85063_REG_SC] = bin2bcd(tm->tm_sec) & 0x7F;
@@ -117,7 +115,7 @@ static int pcf85063_set_datetime(struct i2c_client *client, struct rtc_time *tm)
buf[PCF85063_REG_YR] = bin2bcd(tm->tm_year % 100);
/* write register's data */
- for (i = 0; i < sizeof(buf); i++) {
+ for (i = PCF85063_REG_SC; i < sizeof(buf); i++) {
unsigned char data[2] = { i, buf[i] };
err = i2c_master_send(client, data, sizeof(data));
@@ -149,7 +147,14 @@ static const struct rtc_class_ops pcf85063_rtc_ops = {
static int pcf85063_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
+ int i = 0, err = 0;
struct pcf85063 *pcf85063;
+ unsigned char buf[3];
+
+ /* Control & status */
+ buf[PCF85063_REG_CTRL1] = 0;
+ buf[PCF85063_REG_CTRL2] = 7;
+ buf[PCF85063_REG_OFFSET] = 0x00;
dev_dbg(&client->dev, "%s\n", __func__);
@@ -169,6 +174,26 @@ static int pcf85063_probe(struct i2c_client *client,
pcf85063_driver.driver.name,
&pcf85063_rtc_ops, THIS_MODULE);
+ if (of_property_match_string(client->dev.of_node,
+ "quartz_load", "12.5pF") == 0)
+ buf[PCF85063_REG_CTRL1] |= PCF85063_REG_CTRL1_CAP_SEL;
+
+ if (of_property_match_string(client->dev.of_node,
+ "quartz_load", "7pF") == 0)
+ buf[PCF85063_REG_CTRL1] &= ~PCF85063_REG_CTRL1_CAP_SEL;
+
+ /* write register's data */
+ for (i = 0; i < sizeof(buf); i++) {
+ unsigned char data[3] = { i, buf[i] };
+
+ err = i2c_master_send(client, data, sizeof(data));
+ if (err != sizeof(data)) {
+ dev_err(&client->dev, "%s: err=%d addr=%02x, data=%02x\n",
+ __func__, err, data[0], data[1]);
+ return -EIO;
+ }
+ }
+
return PTR_ERR_OR_ZERO(pcf85063->rtc);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic