[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