[v3 1/8] rtc: pcf8563: support driver model
Priyanka Jain
priyanka.jain at nxp.com
Thu Dec 5 07:36:39 CET 2019
>-----Original Message-----
>From: Biwen Li <biwen.li at nxp.com>
>Sent: Thursday, December 5, 2019 11:40 AM
>To: Jagdish Gediya <jagdish.gediya at nxp.com>; Priyanka Jain
><priyanka.jain at nxp.com>; hs at denx.de; jagan at amarulasolutions.com;
>aford173 at gmail.com; Alison Wang <alison.wang at nxp.com>;
>bhaskar.upadhaya at nxp.com; feng.li_2 at nxp.com; jh80.chung at samsung.com;
>Pramod Kumar <pramod.kumar_1 at nxp.com>; Rajesh Bhagat
><rajesh.bhagat at nxp.com>; Ruchika Gupta <ruchika.gupta at nxp.com>;
>olteanv at gmail.com
>Cc: Xiaobo Xie <xiaobo.xie at nxp.com>; Jiafei Pan <jiafei.pan at nxp.com>; u-
>boot at lists.denx.de; Biwen Li <biwen.li at nxp.com>
>Subject: [v3 1/8] rtc: pcf8563: support driver model
Please update subject to something like : rtc: pcf8563: Add driver model support
>
>This supports driver model for pcf8563
Please update description to something like : "Add support of driver model of pcf8563"
>
>Signed-off-by: Biwen Li <biwen.li at nxp.com>
>---
>Changes in v3:
> - update commit messages
>
>Changes in v2:
> - none
>
> drivers/rtc/pcf8563.c | 107 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 107 insertions(+)
>
>diff --git a/drivers/rtc/pcf8563.c b/drivers/rtc/pcf8563.c index
>a839d6cc98..44204e133e 100644
>--- a/drivers/rtc/pcf8563.c
>+++ b/drivers/rtc/pcf8563.c
>@@ -12,9 +12,11 @@
>
As significant code changes are done, this might need change in copyright. Please check
> #include <common.h>
> #include <command.h>
>+#include <dm.h>
> #include <rtc.h>
> #include <i2c.h>
>
>+#if !CONFIG_IS_ENABLED(DM_RTC)
> static uchar rtc_read (uchar reg);
> static void rtc_write (uchar reg, uchar val);
>
>@@ -115,3 +117,108 @@ static void rtc_write (uchar reg, uchar val) {
> i2c_reg_write (CONFIG_SYS_I2C_RTC_ADDR, reg, val); }
>+#else
>+static int pcf8563_rtc_get(struct udevice *dev, struct rtc_time *tmp) {
>+ int rel = 0;
>+ uchar sec, min, hour, mday, wday, mon_cent, year;
>+
>+ sec = dm_i2c_reg_read(dev, 0x02);
>+ min = dm_i2c_reg_read(dev, 0x03);
>+ hour = dm_i2c_reg_read(dev, 0x04);
>+ mday = dm_i2c_reg_read(dev, 0x05);
>+ wday = dm_i2c_reg_read(dev, 0x06);
>+ mon_cent = dm_i2c_reg_read(dev, 0x07);
>+ year = dm_i2c_reg_read(dev, 0x08);
>+
>+ debug ("Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x
>"
>+ "hr: %02x min: %02x sec: %02x\n",
>+ year, mon_cent, mday, wday,
>+ hour, min, sec);
>+ debug ("Alarms: wday: %02x day: %02x hour: %02x min: %02x\n",
>+ dm_i2c_reg_read(dev, 0x0C),
>+ dm_i2c_reg_read(dev, 0x0B),
>+ dm_i2c_reg_read(dev, 0x0A),
>+ dm_i2c_reg_read(dev, 0x09));
>+
>+ if (sec & 0x80) {
>+ puts ("### Warning: RTC Low Voltage - date/time not
>reliable\n");
>+ rel = -1;
>+ }
>+
>+ tmp->tm_sec = bcd2bin (sec & 0x7F);
>+ tmp->tm_min = bcd2bin (min & 0x7F);
>+ tmp->tm_hour = bcd2bin (hour & 0x3F);
>+ tmp->tm_mday = bcd2bin (mday & 0x3F);
>+ tmp->tm_mon = bcd2bin (mon_cent & 0x1F);
>+ tmp->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ? 1900 : 2000);
>+ tmp->tm_wday = bcd2bin (wday & 0x07);
>+ tmp->tm_yday = 0;
>+ tmp->tm_isdst = 0;
>+
>+ debug ("Get DATE: %4d-%02d-%02d (wday=%d) TIME:
>%2d:%02d:%02d\n",
>+ tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
>+ tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
>+
>+ return rel;
>+}
>+
>+static int pcf8563_rtc_set(struct udevice *dev, const struct rtc_time
>+*tmp) {
>+ uchar century;
>+
>+ debug ("Set DATE: %4d-%02d-%02d (wday=%d) TIME:
>%2d:%02d:%02d\n",
>+ tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
>+ tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
>+
>+ dm_i2c_reg_write(dev, 0x08, bin2bcd(tmp->tm_year % 100));
>+
>+ century = (tmp->tm_year >= 2000) ? 0 : 0x80;
>+ dm_i2c_reg_write(dev, 0x07, bin2bcd(tmp->tm_mon) | century);
>+
>+ dm_i2c_reg_write(dev, 0x06, bin2bcd(tmp->tm_wday));
>+ dm_i2c_reg_write(dev, 0x05, bin2bcd(tmp->tm_mday));
>+ dm_i2c_reg_write(dev, 0x04, bin2bcd(tmp->tm_hour));
>+ dm_i2c_reg_write(dev, 0x03, bin2bcd(tmp->tm_min));
>+ dm_i2c_reg_write(dev, 0x02, bin2bcd(tmp->tm_sec));
>+
>+ return 0;
>+}
>+
>+static int pcf8563_rtc_reset(struct udevice *dev) {
>+ /* clear all control & status registers */
>+ dm_i2c_reg_write(dev, 0x00, 0x00);
>+ dm_i2c_reg_write(dev, 0x01, 0x00);
>+ dm_i2c_reg_write(dev, 0x0D, 0x00);
>+
>+ /* clear Voltage Low bit */
>+ dm_i2c_reg_write(dev, 0x02, dm_i2c_reg_read (dev, 0x02) & 0x7F);
>+
>+ /* reset all alarms */
>+ dm_i2c_reg_write(dev, 0x09, 0x00);
>+ dm_i2c_reg_write(dev, 0x0A, 0x00);
>+ dm_i2c_reg_write(dev, 0x0B, 0x00);
>+ dm_i2c_reg_write(dev, 0x0C, 0x00);
>+
>+ return 0;
>+}
>+
>+static const struct rtc_ops pcf8563_rtc_ops = {
>+ .get = pcf8563_rtc_get,
>+ .set = pcf8563_rtc_set,
>+ .reset = pcf8563_rtc_reset,
>+};
>+
>+static const struct udevice_id pcf8563_rtc_ids[] = {
>+ { .compatible = "nxp,pcf8563" },
>+ { }
>+};
>+
>+U_BOOT_DRIVER(rtc_pcf8563) = {
>+ .name = "rtc-pcf8563",
>+ .id = UCLASS_RTC,
>+ .of_match = pcf8563_rtc_ids,
>+ .ops = &pcf8563_rtc_ops,
>+};
>+#endif
>--
>2.17.1
priyankajain
More information about the U-Boot
mailing list