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: 628695 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-lb0-x238.google.com (mail-lb0-x238.google.com [IPv6:2a00:1450:4010:c04::238]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3rKY9W5tDzz9s8d for ; Thu, 2 Jun 2016 00:47:27 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=googlegroups.com header.i=@googlegroups.com header.b=c1dAiweY; dkim-atps=neutral Received: by mail-lb0-x238.google.com with SMTP id rs7sf3694791lbb.1 for ; Wed, 01 Jun 2016 07:47:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=sender:mime-version:from:to:cc:subject:date:message-id :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:x-spam-checked-in-group:list-post :list-help:list-archive:list-subscribe:list-unsubscribe; bh=meNQ0qgLS9CqjyQPlNXSd+bliTiQ9K6LNE5OZfLoM90=; b=c1dAiweYVBQJOSQYupne82/nmd+VrTJyCl/lN5Vi417cJtK6gSpda31jfBsht0f+zK ou1AYfjtNbh8MvzEmBy/0fsNRzpraedBfeKcugb4KIZiidKH9SRaZETn/N0NcupHfFRp 1XcRh79bD1xEGhHK1I34Wqgfw4Xan1hVmCTdtpFq9cjQa+qMHGvWj10cqnUJ8Y0RfpEW NLaUeeqGYqOqcGrKHYhO8l+5jCD2ODkS80gAMy6twWPcdmiYVoBtFnjpt4YJbVWFbCHg ifcxX/GAyAwHDoVVoeg22CAuVEGDsjXudVP7rY+WNPChZl+M8HaWXWsY2q9ltsTPb0G+ 5AJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=sender:x-gm-message-state:mime-version:from:to:cc:subject:date :message-id:x-original-sender:x-original-authentication-results :reply-to:precedence:mailing-list:list-id:x-spam-checked-in-group :list-post:list-help:list-archive:list-subscribe:list-unsubscribe; bh=meNQ0qgLS9CqjyQPlNXSd+bliTiQ9K6LNE5OZfLoM90=; b=mnNgK8FcEWdOqng/g0jWqWjwbuXKs+1eP6WuOX3nTUxXviD0xAlOGXGdD+oIfloVcK nr8y6hb7NhQD3iCTGcenqCfYkwuJizcbL/E8hDqMQdgZOYfYgbU68KXOlc7QROJvwZio 62Jbft2dPEHXNZ0Tjb6BiXTqo21T+12LQiw7hZcyMOom/SDpHfcMUhRV0RWuWfbf5DNm xkdyNrxAaz39v6pVyx5j9TMllvFNrT0YL1oEmiUVd/vO+Hxhn60pFyRKNB/TP7G4wEEM fahyuBRlxMWFz23I3yRM7kPsmqZoUrCU59SC0YJV6LzHlddtUa8RyWN6vIeXpgDRvCwl zd5Q== Sender: rtc-linux@googlegroups.com X-Gm-Message-State: ALyK8tLsDpL7HNCMooAvHgOIMkvfxykw2S7GJC9CCwvv5mffEYFLzEkYjJbh4xjBAUqMMg== X-Received: by 10.28.30.216 with SMTP id e207mr14844wme.11.1464792442720; Wed, 01 Jun 2016 07:47:22 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.28.46.79 with SMTP id u76ls1139718wmu.46.canary; Wed, 01 Jun 2016 07:47:21 -0700 (PDT) X-Received: by 10.194.153.199 with SMTP id vi7mr722602wjb.1.1464792441929; Wed, 01 Jun 2016 07:47:21 -0700 (PDT) Received: from mout.kundenserver.de (mout.kundenserver.de. [212.227.126.134]) by gmr-mx.google.com with ESMTPS id f142si84891wmf.3.2016.06.01.07.47.21 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 01 Jun 2016 07:47:21 -0700 (PDT) Received-SPF: neutral (google.com: 212.227.126.134 is neither permitted nor denied by best guess record for domain of arnd@arndb.de) client-ip=212.227.126.134; 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: [rtc-linux] [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= X-Original-Sender: arnd@arndb.de X-Original-Authentication-Results: gmr-mx.google.com; spf=neutral (google.com: 212.227.126.134 is neither permitted nor denied by best guess record for domain of arnd@arndb.de) smtp.mailfrom=arnd@arndb.de Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: rtc-linux@googlegroups.com X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , 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(-) 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.