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
= {
98 .probe
= tile_rtc_probe
,
102 * Driver init routine.
104 static int __init
tile_rtc_driver_init(void)
108 err
= platform_driver_register(&tile_rtc_platform_driver
);
112 tile_rtc_platform_device
= platform_device_alloc("rtc-tile", 0);
113 if (tile_rtc_platform_device
== NULL
) {
115 goto exit_driver_unregister
;
118 err
= platform_device_add(tile_rtc_platform_device
);
120 goto exit_device_put
;
125 platform_device_put(tile_rtc_platform_device
);
127 exit_driver_unregister
:
128 platform_driver_unregister(&tile_rtc_platform_driver
);
133 * Driver cleanup routine.
135 static void __exit
tile_rtc_driver_exit(void)
137 platform_device_unregister(tile_rtc_platform_device
);
138 platform_driver_unregister(&tile_rtc_platform_driver
);
141 module_init(tile_rtc_driver_init
);
142 module_exit(tile_rtc_driver_exit
);
144 MODULE_DESCRIPTION("Tilera-specific Real Time Clock Driver");
145 MODULE_LICENSE("GPL");
146 MODULE_ALIAS("platform:rtc-tile");