rtc: sh: provide rtc_class_ops directly

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>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Rich Felker <dalias@libc.org>
Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
This commit is contained in:
Arnd Bergmann 2016-05-30 20:57:52 +02:00 committed by Alexandre Belloni
parent 463a86304c
commit d4db68741d
3 changed files with 21 additions and 25 deletions

View File

@ -6,17 +6,6 @@ extern void (*board_time_init)(void);
extern void (*rtc_sh_get_time)(struct timespec *); extern void (*rtc_sh_get_time)(struct timespec *);
extern int (*rtc_sh_set_time)(const time_t); extern int (*rtc_sh_set_time)(const time_t);
/* some dummy definitions */
#define RTC_BATT_BAD 0x100 /* battery bad */
#define RTC_SQWE 0x08 /* enable square-wave output */
#define RTC_DM_BINARY 0x04 /* all time/date values are BCD if clear */
#define RTC_24H 0x02 /* 24 hour mode - else hours bit 7 means pm */
#define RTC_DST_EN 0x01 /* auto switch DST - works f. USA only */
struct rtc_time;
unsigned int get_rtc_time(struct rtc_time *);
int set_rtc_time(struct rtc_time *);
#define RTC_CAP_4_DIGIT_YEAR (1 << 0) #define RTC_CAP_4_DIGIT_YEAR (1 << 0)
struct sh_rtc_platform_info { struct sh_rtc_platform_info {

View File

@ -50,27 +50,31 @@ int update_persistent_clock(struct timespec now)
} }
#endif #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_sh_get_time(&tv);
rtc_time_to_tm(tv.tv_sec, tm); rtc_time_to_tm(tv.tv_sec, tm);
} return 0;
return RTC_24H;
} }
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; unsigned long secs;
rtc_tm_to_time(tm, &secs); rtc_tm_to_time(tm, &secs);
return rtc_sh_set_time(secs); if ((rtc_sh_set_time == null_rtc_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) static int __init rtc_generic_init(void)
{ {
@ -79,7 +83,10 @@ static int __init rtc_generic_init(void)
if (rtc_sh_get_time == null_rtc_get_time) if (rtc_sh_get_time == null_rtc_get_time)
return -ENODEV; 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); return PTR_ERR_OR_ZERO(pdev);
} }

View File

@ -10,7 +10,7 @@
#include <linux/rtc.h> #include <linux/rtc.h>
#if defined(CONFIG_M68K) || defined(CONFIG_PARISC) || \ #if defined(CONFIG_M68K) || defined(CONFIG_PARISC) || \
defined(CONFIG_PPC) || defined(CONFIG_SUPERH32) defined(CONFIG_PPC)
#include <asm/rtc.h> #include <asm/rtc.h>
static int generic_get_time(struct device *dev, struct rtc_time *tm) static int generic_get_time(struct device *dev, struct rtc_time *tm)