From patchwork Tue May 17 04:25:00 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Packham X-Patchwork-Id: 95849 X-Patchwork-Delegate: prafulla@marvell.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id E1ABEB6EE8 for ; Tue, 17 May 2011 14:25:39 +1000 (EST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 9C16E28089; Tue, 17 May 2011 06:25:36 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id VApmw3WfsNwm; Tue, 17 May 2011 06:25:36 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id D0C2E28080; Tue, 17 May 2011 06:25:33 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 1279928080 for ; Tue, 17 May 2011 06:25:32 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at theia.denx.de Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id u0+zJL8BoDe1 for ; Tue, 17 May 2011 06:25:30 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-pv0-f172.google.com (mail-pv0-f172.google.com [74.125.83.172]) by theia.denx.de (Postfix) with ESMTPS id 05F262807F for ; Tue, 17 May 2011 06:25:27 +0200 (CEST) Received: by pvh18 with SMTP id 18so72604pvh.3 for ; Mon, 16 May 2011 21:25:23 -0700 (PDT) Received: by 10.143.96.17 with SMTP id y17mr132730wfl.151.1305606323642; Mon, 16 May 2011 21:25:23 -0700 (PDT) Received: from localhost.localdomain (gate1.alliedtelesyn.co.nz [202.49.72.36]) by mx.google.com with ESMTPS id x11sm153876wfd.13.2011.05.16.21.25.19 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 16 May 2011 21:25:22 -0700 (PDT) From: Chris Packham To: u-boot@lists.denx.de Date: Tue, 17 May 2011 16:25:00 +1200 Message-Id: <1305606300-10431-1-git-send-email-judge.packham@gmail.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: References: Cc: Luuk Paulussen Subject: [U-Boot] [PATCHv2] rtc: add driver for internal RTC on kirkwood SoC X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.9 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: u-boot-bounces@lists.denx.de Errors-To: u-boot-bounces@lists.denx.de From: Luuk Paulussen Signed-off-by: Luuk Paulussen Acked-by: Chris Packham Cc: Prafulla Wadaskar --- Changes since v1: - run through checkpatch.pl and fix style issues (spaces before bracket and lines > 80 chars) arch/arm/include/asm/arch-kirkwood/kirkwood.h | 2 + drivers/rtc/Makefile | 1 + drivers/rtc/kirkwood.c | 79 +++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 0 deletions(-) create mode 100644 drivers/rtc/kirkwood.c diff --git a/arch/arm/include/asm/arch-kirkwood/kirkwood.h b/arch/arm/include/asm/arch-kirkwood/kirkwood.h index 0104418..15922eb 100644 --- a/arch/arm/include/asm/arch-kirkwood/kirkwood.h +++ b/arch/arm/include/asm/arch-kirkwood/kirkwood.h @@ -50,6 +50,8 @@ #define KW_MPP_BASE (KW_REGISTER(0x10000)) #define KW_GPIO0_BASE (KW_REGISTER(0x10100)) #define KW_GPIO1_BASE (KW_REGISTER(0x10140)) +#define KW_RTC_TIME (KW_REGISTER(0x10300)) +#define KW_RTC_DATE (KW_REGISTER(0x10304)) #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..ec064d9 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -43,6 +43,7 @@ COBJS-$(CONFIG_RTC_DS174x) += ds174x.o COBJS-$(CONFIG_RTC_DS3231) += ds3231.o COBJS-$(CONFIG_RTC_FTRTC010) += ftrtc010.o COBJS-$(CONFIG_RTC_ISL1208) += isl1208.o +COBJS-$(CONFIG_RTC_KIRKWOOD) += kirkwood.o COBJS-$(CONFIG_RTC_M41T11) += m41t11.o COBJS-$(CONFIG_RTC_M41T60) += m41t60.o COBJS-$(CONFIG_RTC_M41T62) += m41t62.o diff --git a/drivers/rtc/kirkwood.c b/drivers/rtc/kirkwood.c new file mode 100644 index 0000000..b08fd91 --- /dev/null +++ b/drivers/rtc/kirkwood.c @@ -0,0 +1,79 @@ +/* + * Driver for the RTC in Marvell SoCs. + * + * Based on Linux Kernel driver. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include +#include +#include +#include +#include + +#if defined(CONFIG_CMD_DATE) + +#define RTC_TIME_REG_OFFS 0 +#define RTC_SECONDS_OFFS 0 +#define RTC_MINUTES_OFFS 8 +#define RTC_HOURS_OFFS 16 +#define RTC_WDAY_OFFS 24 +#define RTC_HOURS_12H_MODE (1 << 22) /* 12 hours mode */ + +#define RTC_DATE_REG_OFFS 4 +#define RTC_MDAY_OFFS 0 +#define RTC_MONTH_OFFS 8 +#define RTC_YEAR_OFFS 16 +#define KIRKWOOD_YEAR_BASE 2000 + +int rtc_set(struct rtc_time *tmp) +{ + ulong rtc_reg; + + GregorianDay(tmp); + + rtc_reg = (bin2bcd(tmp->tm_sec) << RTC_SECONDS_OFFS) | + (bin2bcd(tmp->tm_min) << RTC_MINUTES_OFFS) | + (bin2bcd(tmp->tm_hour) << RTC_HOURS_OFFS) | + (bin2bcd(tmp->tm_wday) << RTC_WDAY_OFFS); + writel(rtc_reg, KW_RTC_TIME); + + rtc_reg = (bin2bcd(tmp->tm_mday) << RTC_MDAY_OFFS) | + (bin2bcd(tmp->tm_mon + 1) << RTC_MONTH_OFFS) | + (bin2bcd(tmp->tm_year - KIRKWOOD_YEAR_BASE) + << RTC_YEAR_OFFS); + writel(rtc_reg, KW_RTC_DATE); + + return 0; +} + +int rtc_get(struct rtc_time *tmp) +{ + ulong rtc_time, rtc_date; + + rtc_time = readl(KW_RTC_TIME); + rtc_date = readl(KW_RTC_DATE); + + tmp->tm_sec = bcd2bin(rtc_time & 0x7f); + tmp->tm_min = bcd2bin((rtc_time >> RTC_MINUTES_OFFS) & 0x7f); + /* assume 24 hour mode */ + tmp->tm_hour = bcd2bin((rtc_time >> RTC_HOURS_OFFS) & 0x3f); + tmp->tm_mday = bcd2bin(rtc_date & 0x3f); + tmp->tm_wday = bcd2bin((rtc_time >> RTC_WDAY_OFFS) & 0x7); + tmp->tm_mon = bcd2bin((rtc_date >> RTC_MONTH_OFFS) & 0x3f) - 1; + /* hw counts from year 2000, but tm_year is relative to 0 */ + tmp->tm_year = bcd2bin((rtc_date >> RTC_YEAR_OFFS) & 0xff) + + KIRKWOOD_YEAR_BASE; + + return 0; +} + +void rtc_reset(void) +{ + return; +} + +#endif /* CONFIG_CMD_DATE */