blob: 48ef5b4d016a870c6a4139fd3c2e16a4e08f8a46 [file] [log] [blame]
Kyle McMartin9eb16862008-09-10 14:24:07 +00001/* rtc-parisc: RTC for HP PA-RISC firmware
2 *
3 * Copyright (C) 2008 Kyle McMartin <kyle@mcmartin.ca>
4 */
5
6#include <linux/kernel.h>
7#include <linux/module.h>
8#include <linux/time.h>
9#include <linux/platform_device.h>
dann frazier93d456d2009-03-31 15:24:49 -070010#include <linux/rtc.h>
Kyle McMartin9eb16862008-09-10 14:24:07 +000011
12#include <asm/rtc.h>
13
Kyle McMartin9eb16862008-09-10 14:24:07 +000014static int parisc_get_time(struct device *dev, struct rtc_time *tm)
15{
Geert Uytterhoeven55457162009-03-06 15:54:54 +010016 unsigned int ret = get_rtc_time(tm);
Kyle McMartin9eb16862008-09-10 14:24:07 +000017
18 if (ret & RTC_BATT_BAD)
19 return -EOPNOTSUPP;
20
dann frazierf62bacd2009-03-31 15:24:52 -070021 return rtc_valid_tm(tm);
Kyle McMartin9eb16862008-09-10 14:24:07 +000022}
23
24static int parisc_set_time(struct device *dev, struct rtc_time *tm)
25{
dann fraziera8c20cd2009-03-31 15:24:55 -070026 if (set_rtc_time(tm) < 0)
Kyle McMartin9eb16862008-09-10 14:24:07 +000027 return -EOPNOTSUPP;
28
29 return 0;
30}
31
32static const struct rtc_class_ops parisc_rtc_ops = {
33 .read_time = parisc_get_time,
34 .set_time = parisc_set_time,
35};
36
dann frazier2b93cff2009-03-31 15:24:52 -070037static int __init parisc_rtc_probe(struct platform_device *dev)
Kyle McMartin9eb16862008-09-10 14:24:07 +000038{
dann frazierb250c962009-03-31 15:24:55 -070039 struct rtc_device *rtc;
Kyle McMartin9eb16862008-09-10 14:24:07 +000040
dann frazierb250c962009-03-31 15:24:55 -070041 rtc = rtc_device_register("rtc-parisc", &dev->dev, &parisc_rtc_ops,
42 THIS_MODULE);
43 if (IS_ERR(rtc))
44 return PTR_ERR(rtc);
Kyle McMartin9eb16862008-09-10 14:24:07 +000045
dann frazierb250c962009-03-31 15:24:55 -070046 platform_set_drvdata(dev, rtc);
Kyle McMartin9eb16862008-09-10 14:24:07 +000047
48 return 0;
49}
50
dann frazier2b93cff2009-03-31 15:24:52 -070051static int __exit parisc_rtc_remove(struct platform_device *dev)
Kyle McMartin9eb16862008-09-10 14:24:07 +000052{
dann frazierb250c962009-03-31 15:24:55 -070053 struct rtc_device *rtc = platform_get_drvdata(dev);
Kyle McMartin9eb16862008-09-10 14:24:07 +000054
dann frazierb250c962009-03-31 15:24:55 -070055 rtc_device_unregister(rtc);
Kyle McMartin9eb16862008-09-10 14:24:07 +000056
57 return 0;
58}
59
60static struct platform_driver parisc_rtc_driver = {
61 .driver = {
62 .name = "rtc-parisc",
63 .owner = THIS_MODULE,
64 },
Geert Uytterhoeven2c830712009-03-06 15:57:06 +010065 .remove = __exit_p(parisc_rtc_remove),
Kyle McMartin9eb16862008-09-10 14:24:07 +000066};
67
68static int __init parisc_rtc_init(void)
69{
dann frazier2b93cff2009-03-31 15:24:52 -070070 return platform_driver_probe(&parisc_rtc_driver, parisc_rtc_probe);
Kyle McMartin9eb16862008-09-10 14:24:07 +000071}
72
73static void __exit parisc_rtc_fini(void)
74{
75 platform_driver_unregister(&parisc_rtc_driver);
76}
77
78module_init(parisc_rtc_init);
79module_exit(parisc_rtc_fini);
80
81MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
82MODULE_LICENSE("GPL");
83MODULE_DESCRIPTION("HP PA-RISC RTC driver");
Geert Uytterhoeven8c534e92009-02-19 15:50:53 +010084MODULE_ALIAS("platform:rtc-parisc");