From patchwork Wed Jun 1 14:46:22 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 102264 Delivered-To: patch@linaro.org Received: by 10.140.92.199 with SMTP id b65csp137819qge; Wed, 1 Jun 2016 07:47:40 -0700 (PDT) X-Received: by 10.202.65.133 with SMTP id o127mr23902547oia.43.1464792458994; Wed, 01 Jun 2016 07:47:38 -0700 (PDT) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p6si7111010pap.46.2016.06.01.07.47.38; Wed, 01 Jun 2016 07:47:38 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758521AbcFAOrg (ORCPT + 30 others); Wed, 1 Jun 2016 10:47:36 -0400 Received: from mout.kundenserver.de ([212.227.126.134]:53869 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758290AbcFAOre (ORCPT ); Wed, 1 Jun 2016 10:47:34 -0400 Received: from wuerfel.lan. ([78.42.132.4]) by mrelayeu.kundenserver.de (mreue005) with ESMTPA (Nemesis) id 0MIAjy-1b4H8r1iQQ-003r0h; Wed, 01 Jun 2016 16:47:19 +0200 From: Arnd Bergmann To: Alexandre Belloni Cc: Arnd Bergmann , David Howells , Greg Kroah-Hartman , Alessandro Zummo , linux-am33-list@redhat.com, linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com Subject: [PATCH 1/2] mn10300: use RTC_DRV_CMOS instead of CONFIG_RTC Date: Wed, 1 Jun 2016 16:46:22 +0200 Message-Id: <1464792470-1565319-1-git-send-email-arnd@arndb.de> X-Mailer: git-send-email 2.7.0 X-Provags-ID: V03:K0:MhnrEkQPIO+FyNUcSTqlUOhXxmQufO71YqunvCa6eef0ZIXDqZu GcBPFFmOs3srs2o33DnOpa0YB4d/6SO2a4FMWGRSupb0Kgkgq9S//iEPT2kW5bjdJh0F13G 16qXfQyJ8F8+QmG8sDN/cF0kEhQAjXWmcUQdtKt7zqsaErFvIMJj868iki2fwUrdF1TBN3Z eej1feCGB9qcGNBGbbcNA== X-UI-Out-Filterresults: notjunk:1; V01:K0:FhLd3ftbvtA=:53ntVNni3sph+BXdJ1iHMF n6bCDW2wqEGHjFCGr8vuL75V7zqnGgm4WtWiKNyqdqY1kU+Zy7eUBLbd/LXQb50s5mvHunxYC j9AZO5SmPF26Kq19ri0kj5U/yMCSVQgFBug1jBPUn/r4Nem0YJ8DVzEn/369/nptbiiPr6GUL Ww4gd3WZBBUVcT6TVkT4F/NaSYjhlFGSaDq1PXgXvWhE1eDF+e3nHbZWWLY2Y3Y9USrakIGJO AtC1OC3RpV6VCSbAUCi020oTl34YG15E3cWCRXTKrQW30yg/5jV1gqkx9wH5Maop1QAacttZZ Wo5eSdLd35X40gUVgJBsCoioFXUjksN+QiDMF9+DiajTemfCSNoBmEU9/j0ZDi6e27gmzVnaQ D7w/2wFRtY89T6MRn3X54qpYsBZREvlcVwWN/GGOHl1wIBwvVtBmGmUPlHqI60U91+tjdgVMG qucZGuRgnH4rK83i3BtKLa+Zo4LANDolhOcgf3GYxDClYS9qhZS5n5n6uXeUxifbM8YhlAkOb iTt6eoE1DkqXfUJE/SZQHm5bERKJSAF58Bl3AR3CNv1dbrGszGAz38A10xdCoVkFDvTbSDR64 F3AZkmHhIoh4lAg1t8pQsHJy7K5tpZiNYQBDknden7ZRJp6OcU6J9Cyu9C4W18+luxAs1mwNr W0gdmibnAjzHQal9PIKlAd/Akd3+w8wCW928nZYv7A/mJKH5EtCnjODl5qogXlfhEnfw= Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org nn10300 has a dependency on mc146818_get_time/mc146818_set_time, which we want to move from the mc146818rtc.h header into the rtc subsystem, which in turn is not usable on mn10300. This changes mn10300 to use the modern rtc-cmos driver instead of the old RTC driver, and that in turn lets us completely remove the read_persistent_clock/update_persistent_clock callbacks. Signed-off-by: Arnd Bergmann --- We should probably get both these patches through the rtc tree, but it would be nice to have some confirmation from the mn10300 maintainer that this is a reasonable patch. arch/mn10300/Kconfig | 4 +- arch/mn10300/include/asm/rtc-regs.h | 4 +- arch/mn10300/kernel/rtc.c | 104 +++----------------------------- arch/mn10300/proc-mn103e010/proc-init.c | 1 + drivers/char/Kconfig | 2 +- drivers/rtc/Kconfig | 2 +- drivers/rtc/rtc-cmos.c | 2 +- 7 files changed, 18 insertions(+), 101 deletions(-) -- 2.7.0 diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig index 9627e81a6cbb..38e3494bfb63 100644 --- a/arch/mn10300/Kconfig +++ b/arch/mn10300/Kconfig @@ -236,7 +236,9 @@ source "kernel/Kconfig.hz" config MN10300_RTC bool "Using MN10300 RTC" depends on MN10300_PROC_MN103E010 || MN10300_PROC_MN2WS0050 - select GENERIC_CMOS_UPDATE + select RTC_CLASS + select RTC_DRV_CMOS + select RTC_SYSTOHC default n help This option enables support for the RTC, thus enabling time to be diff --git a/arch/mn10300/include/asm/rtc-regs.h b/arch/mn10300/include/asm/rtc-regs.h index c42deefaec11..c81cacecb6e3 100644 --- a/arch/mn10300/include/asm/rtc-regs.h +++ b/arch/mn10300/include/asm/rtc-regs.h @@ -75,9 +75,9 @@ #define RTC_PORT(x) 0xd8600000 #define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ -#define CMOS_READ(addr) __SYSREG(0xd8600000 + (addr), u8) +#define CMOS_READ(addr) __SYSREG(0xd8600000 + (u32)(addr), u8) #define CMOS_WRITE(val, addr) \ - do { __SYSREG(0xd8600000 + (addr), u8) = val; } while (0) + do { __SYSREG(0xd8600000 + (u32)(addr), u8) = val; } while (0) #define RTC_IRQ RTIRQ diff --git a/arch/mn10300/kernel/rtc.c b/arch/mn10300/kernel/rtc.c index 77e0be4d92ea..f81f37025072 100644 --- a/arch/mn10300/kernel/rtc.c +++ b/arch/mn10300/kernel/rtc.c @@ -12,107 +12,19 @@ #include #include #include -#include -#include +#include +#include + #include #include DEFINE_SPINLOCK(rtc_lock); EXPORT_SYMBOL(rtc_lock); -/* - * Read the current RTC time - */ -void read_persistent_clock(struct timespec *ts) -{ - struct rtc_time tm; - - mc146818_set_time(&tm); - - ts->tv_nsec = 0; - ts->tv_sec = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec); - - /* if rtc is way off in the past, set something reasonable */ - if (ts->tv_sec < 0) - ts->tv_sec = mktime(2009, 1, 1, 12, 0, 0); -} - -/* - * In order to set the CMOS clock precisely, set_rtc_mmss has to be called 500 - * ms after the second nowtime has started, because when nowtime is written - * into the registers of the CMOS clock, it will jump to the next second - * precisely 500 ms later. Check the Motorola MC146818A or Dallas DS12887 data - * sheet for details. - * - * BUG: This routine does not handle hour overflow properly; it just - * sets the minutes. Usually you'll only notice that after reboot! - */ -static int set_rtc_mmss(unsigned long nowtime) -{ - unsigned char save_control, save_freq_select; - int retval = 0; - int real_seconds, real_minutes, cmos_minutes; - - /* gets recalled with irq locally disabled */ - spin_lock(&rtc_lock); - save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being - * set */ - CMOS_WRITE(save_control | RTC_SET, RTC_CONTROL); - - save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset - * prescaler */ - CMOS_WRITE(save_freq_select | RTC_DIV_RESET2, RTC_FREQ_SELECT); - - cmos_minutes = CMOS_READ(RTC_MINUTES); - if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) - cmos_minutes = bcd2bin(cmos_minutes); - - /* - * since we're only adjusting minutes and seconds, - * don't interfere with hour overflow. This avoids - * messing with unknown time zones but requires your - * RTC not to be off by more than 15 minutes - */ - real_seconds = nowtime % 60; - real_minutes = nowtime / 60; - if (((abs(real_minutes - cmos_minutes) + 15) / 30) & 1) - /* correct for half hour time zone */ - real_minutes += 30; - real_minutes %= 60; - - if (abs(real_minutes - cmos_minutes) < 30) { - if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) { - real_seconds = bin2bcd(real_seconds); - real_minutes = bin2bcd(real_minutes); - } - CMOS_WRITE(real_seconds, RTC_SECONDS); - CMOS_WRITE(real_minutes, RTC_MINUTES); - } else { - printk_once(KERN_NOTICE - "set_rtc_mmss: can't update from %d to %d\n", - cmos_minutes, real_minutes); - retval = -1; - } - - /* The following flags have to be released exactly in this order, - * otherwise the DS12887 (popular MC146818A clone with integrated - * battery and quartz) will not reset the oscillator and will not - * update precisely 500 ms later. You won't find this mentioned in - * the Dallas Semiconductor data sheets, but who believes data - * sheets anyway ... -- Markus Kuhn - */ - CMOS_WRITE(save_control, RTC_CONTROL); - CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT); - spin_unlock(&rtc_lock); - - return retval; -} - -int update_persistent_clock(struct timespec now) -{ - return set_rtc_mmss(now.tv_sec); -} +static const __initdata struct resource res[] = { + DEFINE_RES_IO(RTC_PORT(0), RTC_IO_EXTENT), + DEFINE_RES_IRQ(RTC_IRQ), +}; /* * calibrate the TSC clock against the RTC @@ -129,4 +41,6 @@ void __init calibrate_clock(void) RTCRA |= RTCRA_DVR; RTCRA &= ~RTCRA_DVR; RTCRB &= ~RTCRB_SET; + + platform_device_register_simple("rtc_cmos", -1, res, ARRAY_SIZE(res)); } diff --git a/arch/mn10300/proc-mn103e010/proc-init.c b/arch/mn10300/proc-mn103e010/proc-init.c index d4dcb0c56b35..f4990dffff94 100644 --- a/arch/mn10300/proc-mn103e010/proc-init.c +++ b/arch/mn10300/proc-mn103e010/proc-init.c @@ -9,6 +9,7 @@ * 2 of the Licence, or (at your option) any later version. */ #include +#include #include #include #include diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 0ec91cc6c2fb..273b5492fbcf 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig @@ -279,7 +279,7 @@ if RTC_LIB=n config RTC tristate "Enhanced Real Time Clock Support (legacy PC RTC driver)" - depends on ALPHA || (MIPS && MACH_LOONGSON64) || MN10300 + depends on ALPHA || (MIPS && MACH_LOONGSON64) ---help--- If you say Y here and create a character special file /dev/rtc with major number 10 and minor number 135 using mknod ("man mknod"), you diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 18639e0cb6e2..e8ef709f3945 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -795,7 +795,7 @@ comment "Platform RTC drivers" config RTC_DRV_CMOS tristate "PC-style 'CMOS'" - depends on X86 || ARM || M32R || PPC || MIPS || SPARC64 + depends on X86 || ARM || M32R || PPC || MIPS || SPARC64 || MN10300 default y if X86 help Say "yes" here to get direct support for the real time clock diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index cf8eb98382ce..f9fdb6fc641c 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -630,7 +630,7 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) address_space = 64; #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \ || defined(__sparc__) || defined(__mips__) \ - || defined(__powerpc__) + || defined(__powerpc__) || defined(CONFIG_MN10300) address_space = 128; #else #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes.