* [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-27 7:47 ` Geert Uytterhoeven
2016-04-26 21:52 ` [PATCH v2 2/6] rtc: m68k: provide ioctl for q40 Arnd Bergmann
` (5 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
The rtc-generic driver provides an architecture specific
wrapper on top of the generic rtc_class_ops abstraction,
and m68k has another abstraction on top, which is a bit
silly.
This changes the m68k rtc-generic device to provide its
rtc_class_ops directly, to reduce the number of layers
by one.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/m68k/kernel/time.c | 24 ++++++++++++++++++++++--
1 file changed, 22 insertions(+), 2 deletions(-)
diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c
index 3857737e3958..fe35890feede 100644
--- a/arch/m68k/kernel/time.c
+++ b/arch/m68k/kernel/time.c
@@ -86,7 +86,24 @@ void read_persistent_clock(struct timespec *ts)
}
}
-#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
+#if defined(CONFIG_ARCH_USES_GETTIMEOFFSET) && defined(CONFIG_RTC_DRV_GENERIC)
+static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm)
+{
+ mach_hwclk(0, tm);
+ return rtc_valid_tm(tm);
+}
+
+static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
+{
+ if (mach_hwclk(1, tm) < 0)
+ return -EOPNOTSUPP;
+ return 0;
+}
+
+static const struct rtc_class_ops generic_rtc_ops = {
+ .read_time = rtc_generic_get_time,
+ .set_time = rtc_generic_set_time,
+};
static int __init rtc_init(void)
{
@@ -95,7 +112,10 @@ static int __init rtc_init(void)
if (!mach_hwclk)
return -ENODEV;
- pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
+ /* or just call devm_rtc_device_register instead? */
+ pdev = platform_device_register_data(NULL, "rtc-generic", -1,
+ &generic_rtc_ops,
+ sizeof(generic_rtc_ops));
return PTR_ERR_OR_ZERO(pdev);
}
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly
2016-04-26 21:52 ` [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly Arnd Bergmann
@ 2016-04-27 7:47 ` Geert Uytterhoeven
2016-04-27 10:34 ` Arnd Bergmann
0 siblings, 1 reply; 12+ messages in thread
From: Geert Uytterhoeven @ 2016-04-27 7:47 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Alexandre Belloni, Helge Deller, Benjamin Herrenschmidt,
Michael Ellerman, Rich Felker, David Howells, alpha,
Alessandro Zummo, linux-kernel@vger.kernel.org, Parisc List,
linuxppc-dev@lists.ozlabs.org, Linux-sh list, linux-m68k,
RTCLINUX, Linux-Arch
Hi Arnd,
On Tue, Apr 26, 2016 at 11:52 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> The rtc-generic driver provides an architecture specific
> wrapper on top of the generic rtc_class_ops abstraction,
> and m68k has another abstraction on top, which is a bit
> silly.
>
> This changes the m68k rtc-generic device to provide its
> rtc_class_ops directly, to reduce the number of layers
> by one.
>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> arch/m68k/kernel/time.c | 24 ++++++++++++++++++++++--
> 1 file changed, 22 insertions(+), 2 deletions(-)
>
> diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c
> index 3857737e3958..fe35890feede 100644
> --- a/arch/m68k/kernel/time.c
> +++ b/arch/m68k/kernel/time.c
> @@ -86,7 +86,24 @@ void read_persistent_clock(struct timespec *ts)
> }
> }
>
> -#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
> +#if defined(CONFIG_ARCH_USES_GETTIMEOFFSET) && defined(CONFIG_RTC_DRV_GENERIC)
s/defined/IS_ENABLED/ for the modular case.
> @@ -95,7 +112,10 @@ static int __init rtc_init(void)
> if (!mach_hwclk)
> return -ENODEV;
>
> - pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
> + /* or just call devm_rtc_device_register instead? */
I guess this comment is a bogus leftover? There's no "dev" parameter to
pass to devm_rtc_device_register() here.
> + pdev = platform_device_register_data(NULL, "rtc-generic", -1,
> + &generic_rtc_ops,
> + sizeof(generic_rtc_ops));
> return PTR_ERR_OR_ZERO(pdev);
> }
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly
2016-04-27 7:47 ` Geert Uytterhoeven
@ 2016-04-27 10:34 ` Arnd Bergmann
0 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-27 10:34 UTC (permalink / raw)
To: Geert Uytterhoeven
Cc: Alexandre Belloni, Helge Deller, Benjamin Herrenschmidt,
Michael Ellerman, Rich Felker, David Howells, alpha,
Alessandro Zummo, linux-kernel@vger.kernel.org, Parisc List,
linuxppc-dev@lists.ozlabs.org, Linux-sh list, linux-m68k,
RTCLINUX, Linux-Arch
On Wednesday 27 April 2016 09:47:56 Geert Uytterhoeven wrote:
> > --- a/arch/m68k/kernel/time.c
> > +++ b/arch/m68k/kernel/time.c
> > @@ -86,7 +86,24 @@ void read_persistent_clock(struct timespec *ts)
> > }
> > }
> >
> > -#ifdef CONFIG_ARCH_USES_GETTIMEOFFSET
> > +#if defined(CONFIG_ARCH_USES_GETTIMEOFFSET) && defined(CONFIG_RTC_DRV_GENERIC)
>
> s/defined/IS_ENABLED/ for the modular case.
Thanks, fixed in all three architectures/
> > @@ -95,7 +112,10 @@ static int __init rtc_init(void)
> > if (!mach_hwclk)
> > return -ENODEV;
> >
> > - pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
> > + /* or just call devm_rtc_device_register instead? */
>
> I guess this comment is a bogus leftover? There's no "dev" parameter to
> pass to devm_rtc_device_register() here.
Sort of. When I wrote it, I thought that a NULL argument would work,
and I later found out myself that it doesn't.
I'll drop the comment there, but there are still a few ways we (probably
not me, but whoever is interested) could take this further:
- register both the device and the driver here, and call
devm_rtc_device_register from the probe function so we can move away
from drivers/rtc/rtc-generic.c
- do this separately for mac, mvme147, mvme16x, sun3, q40 and sun3x
- move the six implementations into drivers/rtc as standalone drivers.
One (AFAIK) unsolved problem here is the question of how to handle
read_boot_clock/read_persistent_clock/update_persistent_clock in this
case. This is a really odd API that is implemented in various ways
on a few major architectures, and not at all on others, so it's all
highly inconsistent.
Arnd
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 2/6] rtc: m68k: provide ioctl for q40
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 3/6] rtc: powerpc: provide rtc_class_ops directly Arnd Bergmann
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
The q40 platform is the only machine in the kernel that provides
RTC_PLL_GET/RTC_PLL_SET ioctl commands in its rtc through the
mach_get_rtc_pll/mach_set_rtc_pll callbacks.
However, this currenctly works only in the old-style genrtc
driver, not the (somewhat) modern rtc-generic driver replacing
it. This adds an ioctl implementation to the m68k generic_rtc_ops
in order to let both drivers provide the same API.
After this, we should be able to remove support for genrtc
from the m68k architecture.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/m68k/kernel/time.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/arch/m68k/kernel/time.c b/arch/m68k/kernel/time.c
index fe35890feede..5f0a5826a05e 100644
--- a/arch/m68k/kernel/time.c
+++ b/arch/m68k/kernel/time.c
@@ -100,7 +100,32 @@ static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
return 0;
}
+static int rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
+{
+ struct rtc_pll_info pll;
+ struct rtc_pll_info __user *argp = (void __user *)arg;
+
+ switch (cmd) {
+ case RTC_PLL_GET:
+ if (!mach_get_rtc_pll || mach_get_rtc_pll(&pll))
+ return -EINVAL;
+ return copy_to_user(argp, &pll, sizeof pll) ? -EFAULT : 0;
+
+ case RTC_PLL_SET:
+ if (!mach_set_rtc_pll)
+ return -EINVAL;
+ if (!capable(CAP_SYS_TIME))
+ return -EACCES;
+ if (copy_from_user(&pll, argp, sizeof(pll)))
+ return -EFAULT;
+ return mach_set_rtc_pll(&pll);
+ }
+
+ return -ENOIOCTLCMD;
+}
+
static const struct rtc_class_ops generic_rtc_ops = {
+ .ioctl = rtc_ioctl,
.read_time = rtc_generic_get_time,
.set_time = rtc_generic_set_time,
};
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v2 3/6] rtc: powerpc: provide rtc_class_ops directly
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 1/6] rtc: m68k: provide rtc_class_ops directly Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 2/6] rtc: m68k: provide ioctl for q40 Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 4/6] rtc: parisc: " Arnd Bergmann
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
The rtc-generic driver provides an architecture specific
wrapper on top of the generic rtc_class_ops abstraction,
and powerpc has another abstraction on top, which is a bit
silly.
This changes the powerpc rtc-generic device to provide its
rtc_class_ops directly, to reduce the number of layers
by one.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/powerpc/kernel/time.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
index 3ed9a5a21d77..aeac4d9591f9 100644
--- a/arch/powerpc/kernel/time.c
+++ b/arch/powerpc/kernel/time.c
@@ -56,6 +56,7 @@
#include <linux/irq_work.h>
#include <linux/clk-provider.h>
#include <linux/suspend.h>
+#include <linux/rtc.h>
#include <asm/trace.h>
#include <asm/io.h>
@@ -1081,6 +1082,29 @@ void calibrate_delay(void)
loops_per_jiffy = tb_ticks_per_jiffy;
}
+#ifdef CONFIG_RTC_DRV_GENERIC
+static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm)
+{
+ ppc_md.get_rtc_time(tm);
+ return rtc_valid_tm(tm);
+}
+
+static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
+{
+ if (!ppc_md.set_rtc_time)
+ return -EOPNOTSUPP;
+
+ if (ppc_md.set_rtc_time(tm) < 0)
+ return -EOPNOTSUPP;
+
+ return 0;
+}
+
+static const struct rtc_class_ops rtc_generic_ops = {
+ .read_time = rtc_generic_get_time,
+ .set_time = rtc_generic_set_time,
+};
+
static int __init rtc_init(void)
{
struct platform_device *pdev;
@@ -1088,9 +1112,12 @@ static int __init rtc_init(void)
if (!ppc_md.get_rtc_time)
return -ENODEV;
- pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
+ pdev = platform_device_register_data(NULL, "rtc-generic", -1,
+ &rtc_generic_ops,
+ sizeof(rtc_generic_ops));
return PTR_ERR_OR_ZERO(pdev);
}
device_initcall(rtc_init);
+#endif
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v2 4/6] rtc: parisc: provide rtc_class_ops directly
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
` (2 preceding siblings ...)
2016-04-26 21:52 ` [PATCH v2 3/6] rtc: powerpc: provide rtc_class_ops directly Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-27 0:22 ` kbuild test robot
2016-04-26 21:52 ` [PATCH v2 5/6] rtc: sh: " Arnd Bergmann
` (2 subsequent siblings)
6 siblings, 1 reply; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
The rtc-generic driver provides an architecture specific
wrapper on top of the generic rtc_class_ops abstraction,
and on pa-risc, that is implemented using an open-coded
version of rtc_time_to_tm/rtc_tm_to_time.
This changes the parisc rtc-generic device to provide its
rtc_class_ops directly, using the normal helper functions,
which makes this y2038 safe (on 32-bit) and simplifies
the implementation.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/parisc/kernel/time.c | 36 +++++++++++++++++++++++++++++++++++-
1 file changed, 35 insertions(+), 1 deletion(-)
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c
index 58dd6801f5be..1338d92fc87b 100644
--- a/arch/parisc/kernel/time.c
+++ b/arch/parisc/kernel/time.c
@@ -12,6 +12,7 @@
*/
#include <linux/errno.h>
#include <linux/module.h>
+#include <linux/rtc.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/param.h>
@@ -248,14 +249,47 @@ void __init start_cpu_itimer(void)
per_cpu(cpu_data, cpu).it_value = next_tick;
}
+#ifdef CONFIG_RTC_DRV_GENERIC
+static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm)
+{
+ struct pdc_tod tod_data;
+
+ memset(tm, 0, sizeof(*tm));
+ if (pdc_tod_read(&tod_data) < 0)
+ return -EOPNOTSUPP;
+
+ /* we treat tod_sec as unsigned, so this can work until year 2106 */
+ rtc_time64_to_tm(tod_data.tod_sec, &tm);
+ return rtc_valid_tm(tm);
+}
+
+static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
+{
+ time64_t secs = rtc_tm_to_time64(tm);
+
+ if (pdc_tod_set(secs, 0) < 0)
+ return -EOPNOTSUPP;
+
+ return 0;
+}
+
+static const struct rtc_class_ops rtc_generic_ops = {
+ .read_time = rtc_generic_get_time,
+ .set_time = rtc_generic_set_time,
+};
+
static int __init rtc_init(void)
{
struct platform_device *pdev;
- pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
+ pdev = platform_device_register_data(NULL, "rtc-generic", -1,
+ &rtc_generic_ops,
+ sizeof(rtc_generic_ops));
+
return PTR_ERR_OR_ZERO(pdev);
}
device_initcall(rtc_init);
+#endif
void read_persistent_clock(struct timespec *ts)
{
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 4/6] rtc: parisc: provide rtc_class_ops directly
2016-04-26 21:52 ` [PATCH v2 4/6] rtc: parisc: " Arnd Bergmann
@ 2016-04-27 0:22 ` kbuild test robot
2016-04-27 10:10 ` Arnd Bergmann
0 siblings, 1 reply; 12+ messages in thread
From: kbuild test robot @ 2016-04-27 0:22 UTC (permalink / raw)
To: Arnd Bergmann
Cc: kbuild-all, Alexandre Belloni, Arnd Bergmann, geert, deller, benh,
mpe, dalias, dhowells, linux-alpha, a.zummo, linux-kernel,
linux-parisc, linuxppc-dev, linux-sh, linux-m68k, rtc-linux,
linux-arch
[-- Attachment #1: Type: text/plain, Size: 2045 bytes --]
Hi,
[auto build test ERROR on next-20160426]
[cannot apply to m68k/for-next abelloni/rtc-next v4.6-rc5 v4.6-rc4 v4.6-rc3 v4.6-rc5]
[if your patch is applied to the wrong git tree, please drop us a note to help improving the system]
url: https://github.com/0day-ci/linux/commits/Arnd-Bergmann/simplify-rtc-generic-driver/20160427-055751
config: parisc-c3000_defconfig (attached as .config)
compiler: hppa-linux-gnu-gcc (Debian 5.3.1-8) 5.3.1 20160205
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=parisc
Note: the linux-review/Arnd-Bergmann/simplify-rtc-generic-driver/20160427-055751 HEAD ba518829eb442ee7f7806864a806fa45791f787f builds fine.
It only hurts bisectibility.
All errors (new ones prefixed by >>):
arch/parisc/kernel/time.c: In function 'rtc_generic_get_time':
>> arch/parisc/kernel/time.c:262:37: error: passing argument 2 of 'rtc_time64_to_tm' from incompatible pointer type [-Werror=incompatible-pointer-types]
rtc_time64_to_tm(tod_data.tod_sec, &tm);
^
In file included from arch/parisc/kernel/time.c:15:0:
include/linux/rtc.h:23:13: note: expected 'struct rtc_time *' but argument is of type 'struct rtc_time **'
extern void rtc_time64_to_tm(time64_t time, struct rtc_time *tm);
^
cc1: some warnings being treated as errors
vim +/rtc_time64_to_tm +262 arch/parisc/kernel/time.c
256
257 memset(tm, 0, sizeof(*tm));
258 if (pdc_tod_read(&tod_data) < 0)
259 return -EOPNOTSUPP;
260
261 /* we treat tod_sec as unsigned, so this can work until year 2106 */
> 262 rtc_time64_to_tm(tod_data.tod_sec, &tm);
263 return rtc_valid_tm(tm);
264 }
265
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 14216 bytes --]
^ permalink raw reply [flat|nested] 12+ messages in thread* Re: [PATCH v2 4/6] rtc: parisc: provide rtc_class_ops directly
2016-04-27 0:22 ` kbuild test robot
@ 2016-04-27 10:10 ` Arnd Bergmann
0 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-27 10:10 UTC (permalink / raw)
To: linuxppc-dev
Cc: kbuild test robot, linux-arch, a.zummo, dalias, linux-parisc,
linux-sh, deller, linux-alpha, linux-kernel, dhowells, linux-m68k,
geert, kbuild-all, rtc-linux, Alexandre Belloni
On Wednesday 27 April 2016 08:22:24 kbuild test robot wrote:
>
> 256
> 257 memset(tm, 0, sizeof(*tm));
> 258 if (pdc_tod_read(&tod_data) < 0)
> 259 return -EOPNOTSUPP;
> 260
> 261 /* we treat tod_sec as unsigned, so this can work until year 2106 */
> > 262 rtc_time64_to_tm(tod_data.tod_sec, &tm);
> 263 return rtc_valid_tm(tm);
> 264 }
>
Fixed, thanks!
Arnd
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 5/6] rtc: sh: provide rtc_class_ops directly
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
` (3 preceding siblings ...)
2016-04-26 21:52 ` [PATCH v2 4/6] rtc: parisc: " Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-26 21:52 ` [PATCH v2 6/6] rtc: generic: remove get_rtc_time/set_rtc_time wrappers Arnd Bergmann
2016-04-27 7:50 ` [PATCH v2 0/6] simplify rtc-generic driver Geert Uytterhoeven
6 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
The rtc-generic driver provides an architecture specific
wrapper on top of the generic rtc_class_ops abstraction,
and on sh, that goes through another indirection using
the rtc_sh_get_time/rtc_sh_set_time functions.
This changes the sh rtc-generic device to provide its
rtc_class_ops directly, skipping one of the abstraction
levels.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
arch/sh/kernel/time.c | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/arch/sh/kernel/time.c b/arch/sh/kernel/time.c
index d6d0a986c6e9..92cd676970d9 100644
--- a/arch/sh/kernel/time.c
+++ b/arch/sh/kernel/time.c
@@ -50,27 +50,30 @@ int update_persistent_clock(struct timespec now)
}
#endif
-unsigned int get_rtc_time(struct rtc_time *tm)
+static int rtc_generic_get_time(struct device *dev, struct rtc_time *tm)
{
- if (rtc_sh_get_time != null_rtc_get_time) {
- struct timespec tv;
+ struct timespec tv;
- rtc_sh_get_time(&tv);
- rtc_time_to_tm(tv.tv_sec, tm);
- }
-
- return RTC_24H;
+ rtc_sh_get_time(&tv);
+ rtc_time_to_tm(tv.tv_sec, tm);
+ return 0;
}
-EXPORT_SYMBOL(get_rtc_time);
-int set_rtc_time(struct rtc_time *tm)
+static int rtc_generic_set_time(struct device *dev, struct rtc_time *tm)
{
unsigned long secs;
rtc_tm_to_time(tm, &secs);
- return rtc_sh_set_time(secs);
+ if (!rtc_sh_set_time || rtc_sh_set_time(secs) < 0)
+ return -EOPNOTSUPP;
+
+ return 0;
}
-EXPORT_SYMBOL(set_rtc_time);
+
+static const struct rtc_class_ops rtc_generic_ops = {
+ .read_time = rtc_generic_get_time,
+ .set_time = rtc_generic_set_time,
+};
static int __init rtc_generic_init(void)
{
@@ -79,7 +82,10 @@ static int __init rtc_generic_init(void)
if (rtc_sh_get_time == null_rtc_get_time)
return -ENODEV;
- pdev = platform_device_register_simple("rtc-generic", -1, NULL, 0);
+ pdev = platform_device_register_data(NULL, "rtc-generic", -1,
+ &rtc_generic_ops,
+ sizeof(rtc_generic_ops));
+
return PTR_ERR_OR_ZERO(pdev);
}
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* [PATCH v2 6/6] rtc: generic: remove get_rtc_time/set_rtc_time wrappers
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
` (4 preceding siblings ...)
2016-04-26 21:52 ` [PATCH v2 5/6] rtc: sh: " Arnd Bergmann
@ 2016-04-26 21:52 ` Arnd Bergmann
2016-04-27 7:50 ` [PATCH v2 0/6] simplify rtc-generic driver Geert Uytterhoeven
6 siblings, 0 replies; 12+ messages in thread
From: Arnd Bergmann @ 2016-04-26 21:52 UTC (permalink / raw)
To: Alexandre Belloni
Cc: Arnd Bergmann, geert, deller, benh, mpe, dalias, dhowells,
linux-alpha, a.zummo, linux-kernel, linux-parisc, linuxppc-dev,
linux-sh, linux-m68k, rtc-linux, linux-arch
All architectures using this driver are now converted to
provide their own operations, so this one can be turned
into a trivial stub driver relying on its platform data.
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
drivers/rtc/rtc-generic.c | 36 +-----------------------------------
1 file changed, 1 insertion(+), 35 deletions(-)
diff --git a/drivers/rtc/rtc-generic.c b/drivers/rtc/rtc-generic.c
index d726c6aa96a8..1bf5d2347928 100644
--- a/drivers/rtc/rtc-generic.c
+++ b/drivers/rtc/rtc-generic.c
@@ -9,44 +9,10 @@
#include <linux/platform_device.h>
#include <linux/rtc.h>
-#if defined(CONFIG_M68K) || defined(CONFIG_PARISC) || \
- defined(CONFIG_PPC) || defined(CONFIG_SUPERH32)
-#include <asm/rtc.h>
-
-static int generic_get_time(struct device *dev, struct rtc_time *tm)
-{
- unsigned int ret = get_rtc_time(tm);
-
- if (ret & RTC_BATT_BAD)
- return -EOPNOTSUPP;
-
- return rtc_valid_tm(tm);
-}
-
-static int generic_set_time(struct device *dev, struct rtc_time *tm)
-{
- if (set_rtc_time(tm) < 0)
- return -EOPNOTSUPP;
-
- return 0;
-}
-
-static const struct rtc_class_ops generic_rtc_ops = {
- .read_time = generic_get_time,
- .set_time = generic_set_time,
-};
-#else
-#define generic_rtc_ops *(struct rtc_class_ops*)NULL
-#endif
-
static int __init generic_rtc_probe(struct platform_device *dev)
{
struct rtc_device *rtc;
- const struct rtc_class_ops *ops;
-
- ops = dev_get_platdata(&dev->dev);
- if (!ops)
- ops = &generic_rtc_ops;
+ const struct rtc_class_ops *ops = dev_get_platdata(&dev->dev);
rtc = devm_rtc_device_register(&dev->dev, "rtc-generic",
ops, THIS_MODULE);
--
2.7.0
^ permalink raw reply related [flat|nested] 12+ messages in thread* Re: [PATCH v2 0/6] simplify rtc-generic driver
2016-04-26 21:52 [PATCH v2 0/6] simplify rtc-generic driver Arnd Bergmann
` (5 preceding siblings ...)
2016-04-26 21:52 ` [PATCH v2 6/6] rtc: generic: remove get_rtc_time/set_rtc_time wrappers Arnd Bergmann
@ 2016-04-27 7:50 ` Geert Uytterhoeven
6 siblings, 0 replies; 12+ messages in thread
From: Geert Uytterhoeven @ 2016-04-27 7:50 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Alexandre Belloni, Helge Deller, Benjamin Herrenschmidt,
Michael Ellerman, Rich Felker, David Howells, alpha,
Alessandro Zummo, linux-kernel@vger.kernel.org, Parisc List,
linuxppc-dev@lists.ozlabs.org, Linux-sh list, linux-m68k,
RTCLINUX, Linux-Arch
Hi Arnd,
On Tue, Apr 26, 2016 at 11:52 PM, Arnd Bergmann <arnd@arndb.de> wrote:
> This is a resend of an earlier series, to clean up the rtc-generic
> driver by avoiding the dependency on the architecture specific
> include/asm/rtc.h header that after this series is only used
> for the deprecated "genrtc" driver. As I've shown in another
> series, only three architectures (m68k, powerpc, parisc)
> actually use the genrtc driver, and they all support rtc-generic
> as a replacement as well.
>
> The only missing piece appears to be the ioctl support for
> the m68k q40 machine that I'm adding in patch 2 here.
Apparently I had applied your previous version to my local tree, but I had
completely forgotten about it. So it has received quite some compile testing.
CONFIG_GEN_RTC is not enabled in any of the m68k defconfigs, so I think it's
been unused for a while.
CONFIG_RTC_DRV_GENERIC is modular, so I typically don't run-test it.
I just did that, and after fixing patch 1 to use IS_ENABLED() it worked fine
on ARAnyM.
Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
I do not have a Q40, so I couldn't test that part.
Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
^ permalink raw reply [flat|nested] 12+ messages in thread