2 * Copyright 2011 Tilera Corporation. All Rights Reserved.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
14 * Tilera-specific RTC driver.
17 #include <linux/module.h>
18 #include <linux/device.h>
19 #include <linux/rtc.h>
20 #include <linux/platform_device.h>
22 /* Platform device pointer. */
23 static struct platform_device
*tile_rtc_platform_device
;
26 * RTC read routine. Gets time info from RTC chip via hypervisor syscall.
28 static int read_rtc_time(struct device
*dev
, struct rtc_time
*tm
)
30 HV_RTCTime hvtm
= hv_get_rtc();
32 tm
->tm_sec
= hvtm
.tm_sec
;
33 tm
->tm_min
= hvtm
.tm_min
;
34 tm
->tm_hour
= hvtm
.tm_hour
;
35 tm
->tm_mday
= hvtm
.tm_mday
;
36 tm
->tm_mon
= hvtm
.tm_mon
;
37 tm
->tm_year
= hvtm
.tm_year
;
42 if (rtc_valid_tm(tm
) < 0)
43 dev_warn(dev
, "Read invalid date/time from RTC\n");
49 * RTC write routine. Sends time info to hypervisor via syscall, to be
50 * written to RTC chip.
52 static int set_rtc_time(struct device
*dev
, struct rtc_time
*tm
)
56 hvtm
.tm_sec
= tm
->tm_sec
;
57 hvtm
.tm_min
= tm
->tm_min
;
58 hvtm
.tm_hour
= tm
->tm_hour
;
59 hvtm
.tm_mday
= tm
->tm_mday
;
60 hvtm
.tm_mon
= tm
->tm_mon
;
61 hvtm
.tm_year
= tm
->tm_year
;
71 static const struct rtc_class_ops tile_rtc_ops
= {
72 .read_time
= read_rtc_time
,
73 .set_time
= set_rtc_time
,
77 * Device probe routine.
79 static int tile_rtc_probe(struct platform_device
*dev
)
81 struct rtc_device
*rtc
;
83 rtc
= devm_rtc_device_register(&dev
->dev
, "tile",
84 &tile_rtc_ops
, THIS_MODULE
);
89 platform_set_drvdata(dev
, rtc
);
94 static struct platform_driver tile_rtc_platform_driver
= {
99 .probe
= tile_rtc_probe
,
103 * Driver init routine.
105 static int __init
tile_rtc_driver_init(void)
109 err
= platform_driver_register(&tile_rtc_platform_driver
);
113 tile_rtc_platform_device
= platform_device_alloc("rtc-tile", 0);
114 if (tile_rtc_platform_device
== NULL
) {
116 goto exit_driver_unregister
;
119 err
= platform_device_add(tile_rtc_platform_device
);
121 goto exit_device_put
;
126 platform_device_put(tile_rtc_platform_device
);
128 exit_driver_unregister
:
129 platform_driver_unregister(&tile_rtc_platform_driver
);
134 * Driver cleanup routine.
136 static void __exit
tile_rtc_driver_exit(void)
138 platform_device_unregister(tile_rtc_platform_device
);
139 platform_driver_unregister(&tile_rtc_platform_driver
);
142 module_init(tile_rtc_driver_init
);
143 module_exit(tile_rtc_driver_exit
);
145 MODULE_DESCRIPTION("Tilera-specific Real Time Clock Driver");
146 MODULE_LICENSE("GPL");
147 MODULE_ALIAS("platform:rtc-tile");