On Mon, Aug 01, 2011 at 02:09:13PM +0000, Jason Cooper wrote: > This driver can be used for kirkwood SoCs by enabling CONFIG_RTC_MV. Tested > on > Global Scale Technologies Dreamplug. > > Signed-off-by: Jason Cooper <u-b...@lakedaemon.net>
Tested-by: Simon Guinot <sgui...@lacie.com> > --- > Changes from v1: > - renamed files to mvrtc.{c,h} > - used proper c-structs for register access > - used existing macros for register access > - removed RFC > > Changes from v2: > - use bin2bcd() and bcd2bin() to make code easier to read > - changed CONFIG_RTC_MVINTEG -> CONFIG_RTC_MV > - use 24 hour mode, detect if rtc went into 12 hour mode > - add check if ticking to rtc_reset() > > arch/arm/include/asm/arch-kirkwood/kirkwood.h | 1 + > drivers/rtc/Makefile | 1 + > drivers/rtc/mvrtc.c | 124 > +++++++++++++++++++++++++ > drivers/rtc/mvrtc.h | 65 +++++++++++++ > 4 files changed, 191 insertions(+), 0 deletions(-) > create mode 100644 drivers/rtc/mvrtc.c > create mode 100644 drivers/rtc/mvrtc.h > > diff --git a/arch/arm/include/asm/arch-kirkwood/kirkwood.h > b/arch/arm/include/asm/arch-kirkwood/kirkwood.h > index 0104418..3c843a0 100644 > --- a/arch/arm/include/asm/arch-kirkwood/kirkwood.h > +++ b/arch/arm/include/asm/arch-kirkwood/kirkwood.h > @@ -50,6 +50,7 @@ > #define KW_MPP_BASE (KW_REGISTER(0x10000)) > #define KW_GPIO0_BASE (KW_REGISTER(0x10100)) > #define KW_GPIO1_BASE (KW_REGISTER(0x10140)) > +#define KW_RTC_BASE (KW_REGISTER(0x10300)) > #define KW_NANDF_BASE (KW_REGISTER(0x10418)) > #define KW_SPI_BASE (KW_REGISTER(0x10600)) > #define KW_CPU_WIN_BASE (KW_REGISTER(0x20000)) > diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile > index e4be4a4..ca27745 100644 > --- a/drivers/rtc/Makefile > +++ b/drivers/rtc/Makefile > @@ -55,6 +55,7 @@ COBJS-$(CONFIG_MCFRTC) += mcfrtc.o > COBJS-$(CONFIG_RTC_MK48T59) += mk48t59.o > COBJS-$(CONFIG_RTC_MPC5200) += mpc5xxx.o > COBJS-$(CONFIG_RTC_MPC8xx) += mpc8xx.o > +COBJS-$(CONFIG_RTC_MV) += mvrtc.o > COBJS-$(CONFIG_RTC_PCF8563) += pcf8563.o > COBJS-$(CONFIG_RTC_PL031) += pl031.o > COBJS-$(CONFIG_RTC_PT7C4338) += pt7c4338.o > diff --git a/drivers/rtc/mvrtc.c b/drivers/rtc/mvrtc.c > new file mode 100644 > index 0000000..ccc573a > --- /dev/null > +++ b/drivers/rtc/mvrtc.c > @@ -0,0 +1,124 @@ > +/* > + * Copyright (C) 2011 > + * Jason Cooper <u-b...@lakedaemon.net> > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +/* > + * Date & Time support for Marvell Integrated RTC > + */ > + > +#include <common.h> > +#include <command.h> > +#include <rtc.h> > +#include "mvrtc.h" > + > +/* This RTC does not support century, so we assume 20 */ > +#define CENTURY 20 > + > +int rtc_get(struct rtc_time *t) > +{ > + u32 time; > + u32 date; > + struct mvrtc_registers *mvrtc_regs; > + > + mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; > + > + /* read the time register */ > + time = readl(&mvrtc_regs->time); > + > + /* read the date register */ > + date = readl(&mvrtc_regs->date); > + > + /* test for 12 hour clock (can't tell if it's am/pm) */ > + if (time & MVRTC_HRFMT_MSK) { > + printf("Error: RTC in 12 hour mode, can't determine AM/PM.\n"); > + return -1; > + } > + > + /* time */ > + t->tm_sec = bcd2bin((time >> MVRTC_SEC_SFT) & MVRTC_SEC_MSK); > + t->tm_min = bcd2bin((time >> MVRTC_MIN_SFT) & MVRTC_MIN_MSK); > + t->tm_hour = bcd2bin((time >> MVRTC_HOUR_SFT) & MVRTC_HOUR_MSK); > + t->tm_wday = bcd2bin((time >> MVRTC_DAY_SFT) & MVRTC_DAY_MSK); > + t->tm_wday--; > + > + /* date */ > + t->tm_mday = bcd2bin((date >> MVRTC_DATE_SFT) & MVRTC_DATE_MSK); > + t->tm_mon = bcd2bin((date >> MVRTC_MON_SFT) & MVRTC_MON_MSK); > + t->tm_year = bcd2bin((date >> MVRTC_YEAR_SFT) & MVRTC_YEAR_MSK); > + t->tm_year += CENTURY * 100; > + > + /* not supported in this RTC */ > + t->tm_yday = 0; > + t->tm_isdst = 0; > + > + return 0; > +} > + > +int rtc_set(struct rtc_time *t) > +{ > + u32 time = 0; /* sets hour format bit to zero, 24hr format. */ > + u32 date = 0; > + struct mvrtc_registers *mvrtc_regs; > + > + mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; > + > + /* check that this code isn't 80+ years old ;-) */ > + if ((t->tm_year / 100) != CENTURY) > + printf("Warning: Only century %d supported.\n", CENTURY); > + > + /* time */ > + time |= (bin2bcd(t->tm_sec) & MVRTC_SEC_MSK) << MVRTC_SEC_SFT; > + time |= (bin2bcd(t->tm_min) & MVRTC_MIN_MSK) << MVRTC_MIN_SFT; > + time |= (bin2bcd(t->tm_hour) & MVRTC_HOUR_MSK) << MVRTC_HOUR_SFT; > + time |= (bin2bcd(t->tm_wday + 1) & MVRTC_DAY_MSK) << MVRTC_DAY_SFT; > + > + /* date */ > + date |= (bin2bcd(t->tm_mday) & MVRTC_DATE_MSK) << MVRTC_DATE_SFT; > + date |= (bin2bcd(t->tm_mon) & MVRTC_MON_MSK) << MVRTC_MON_SFT; > + date |= (bin2bcd(t->tm_year % 100) & MVRTC_YEAR_MSK) << MVRTC_YEAR_SFT; > + > + /* write the time register */ > + writel(time, &mvrtc_regs->time); > + > + /* write the date register */ > + writel(date, &mvrtc_regs->date); > + > + return 0; > +} > + > +void rtc_reset(void) > +{ > + u32 time; > + u32 sec; > + struct mvrtc_registers *mvrtc_regs; > + > + mvrtc_regs = (struct mvrtc_registers *)KW_RTC_BASE; > + > + /* no init routine for this RTC needed, just check that it's working */ > + time = readl(&mvrtc_regs->time); > + sec = bcd2bin((time >> MVRTC_SEC_SFT) & MVRTC_SEC_MSK); > + udelay(1000000); > + time = readl(&mvrtc_regs->time); > + > + if (sec == bcd2bin((time >> MVRTC_SEC_SFT) & MVRTC_SEC_MSK)) > + printf("Error: RTC did not increment.\n"); > +} > diff --git a/drivers/rtc/mvrtc.h b/drivers/rtc/mvrtc.h > new file mode 100644 > index 0000000..b9d5c6f > --- /dev/null > +++ b/drivers/rtc/mvrtc.h > @@ -0,0 +1,65 @@ > +/* > + * Copyright (C) 2011 > + * Jason Cooper <u-b...@lakedaemon.net> > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > + * MA 02111-1307 USA > + */ > + > +/* > + * Date & Time support for Marvell Integrated RTC > + */ > + > +#ifndef _MVRTC_H_ > +#define _MVRTC_H_ > + > +#include <asm/arch/kirkwood.h> > +#include <compiler.h> > + > +/* RTC registers */ > +struct mvrtc_registers { > + u32 time; > + u32 date; > +}; > + > +/* time register */ > +#define MVRTC_SEC_SFT 0 > +#define MVRTC_SEC_MSK 0x7f > +#define MVRTC_MIN_SFT 8 > +#define MVRTC_MIN_MSK 0x7f > +#define MVRTC_HOUR_SFT 16 > +#define MVRTC_HOUR_MSK 0x3f > +#define MVRTC_DAY_SFT 24 > +#define MVRTC_DAY_MSK 0x7 > + > +/* > + * Hour format bit > + * 1 = 12 hour clock > + * 0 = 24 hour clock > + */ > +#define MVRTC_HRFMT_MSK 0x00400000 > + > +/* date register */ > +#define MVRTC_DATE_SFT 0 > +#define MVRTC_DATE_MSK 0x3f > +#define MVRTC_MON_SFT 8 > +#define MVRTC_MON_MSK 0x1f > +#define MVRTC_YEAR_SFT 16 > +#define MVRTC_YEAR_MSK 0xff > + > +#endif > -- > 1.7.0.4 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > http://lists.denx.de/mailman/listinfo/u-boot
signature.asc
Description: Digital signature
_______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot