blob: ee4e9a3fb58318dd81e826a17e5be520e5d8874b [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{
dann frazier05439f12009-03-31 15:24:50 -070016 unsigned long ret;
Kyle McMartin9eb16862008-09-10 14:24:07 +000017
Kyle McMartin9eb16862008-09-10 14:24:07 +000018 ret = get_rtc_time(tm);
Kyle McMartin9eb16862008-09-10 14:24:07 +000019
20 if (ret & RTC_BATT_BAD)
21 return -EOPNOTSUPP;
22
23 return 0;
24}
25
26static int parisc_set_time(struct device *dev, struct rtc_time *tm)
27{
Roel Kluin022b7692008-12-03 04:16:04 +000028 int ret;
Kyle McMartin9eb16862008-09-10 14:24:07 +000029
Kyle McMartin9eb16862008-09-10 14:24:07 +000030 ret = set_rtc_time(tm);
Kyle McMartin9eb16862008-09-10 14:24:07 +000031
32 if (ret < 0)
33 return -EOPNOTSUPP;
34
35 return 0;
36}
37
38static const struct rtc_class_ops parisc_rtc_ops = {
39 .read_time = parisc_get_time,
40 .set_time = parisc_set_time,
41};
42
43static int __devinit parisc_rtc_probe(struct platform_device *dev)
44{
dann frazier6b318f62009-03-31 15:24:51 -070045 struct rtc_device *p;
Kyle McMartin9eb16862008-09-10 14:24:07 +000046
47 p = kzalloc(sizeof (*p), GFP_KERNEL);
48 if (!p)
49 return -ENOMEM;
50
dann frazier6b318f62009-03-31 15:24:51 -070051 p = rtc_device_register("rtc-parisc", &dev->dev, &parisc_rtc_ops,
52 THIS_MODULE);
53 if (IS_ERR(p)) {
54 int err = PTR_ERR(p);
Kyle McMartin9eb16862008-09-10 14:24:07 +000055 kfree(p);
56 return err;
57 }
58
59 platform_set_drvdata(dev, p);
60
61 return 0;
62}
63
64static int __devexit parisc_rtc_remove(struct platform_device *dev)
65{
dann frazier6b318f62009-03-31 15:24:51 -070066 struct rtc_device *p = platform_get_drvdata(dev);
Kyle McMartin9eb16862008-09-10 14:24:07 +000067
dann frazier6b318f62009-03-31 15:24:51 -070068 rtc_device_unregister(p);
Kyle McMartin9eb16862008-09-10 14:24:07 +000069 kfree(p);
70
71 return 0;
72}
73
74static struct platform_driver parisc_rtc_driver = {
75 .driver = {
76 .name = "rtc-parisc",
77 .owner = THIS_MODULE,
78 },
79 .probe = parisc_rtc_probe,
80 .remove = __devexit_p(parisc_rtc_remove),
81};
82
83static int __init parisc_rtc_init(void)
84{
85 return platform_driver_register(&parisc_rtc_driver);
86}
87
88static void __exit parisc_rtc_fini(void)
89{
90 platform_driver_unregister(&parisc_rtc_driver);
91}
92
93module_init(parisc_rtc_init);
94module_exit(parisc_rtc_fini);
95
96MODULE_AUTHOR("Kyle McMartin <kyle@mcmartin.ca>");
97MODULE_LICENSE("GPL");
98MODULE_DESCRIPTION("HP PA-RISC RTC driver");