diff options
Diffstat (limited to 'drivers/rtc/proc.c')
-rw-r--r-- | drivers/rtc/proc.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/drivers/rtc/proc.c b/drivers/rtc/proc.c new file mode 100644 index 000000000000..4d74e4f4ff30 --- /dev/null +++ b/drivers/rtc/proc.c | |||
@@ -0,0 +1,95 @@ | |||
1 | /* | ||
2 | * RTC subsystem, proc interface | ||
3 | * | ||
4 | * Copyright (C) 2005-06 Tower Technologies | ||
5 | * Author: Alessandro Zummo <a.zummo@towertech.it> | ||
6 | * | ||
7 | * based on arch/arm/common/rtctime.c | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | |||
14 | #include <linux/module.h> | ||
15 | #include <linux/rtc.h> | ||
16 | #include <linux/proc_fs.h> | ||
17 | #include <linux/seq_file.h> | ||
18 | |||
19 | #include "rtc-core.h" | ||
20 | |||
21 | #define NAME_SIZE 10 | ||
22 | |||
23 | #if defined(CONFIG_RTC_HCTOSYS_DEVICE) | ||
24 | static bool is_rtc_hctosys(struct rtc_device *rtc) | ||
25 | { | ||
26 | int size; | ||
27 | char name[NAME_SIZE]; | ||
28 | |||
29 | size = scnprintf(name, NAME_SIZE, "rtc%d", rtc->id); | ||
30 | if (size > NAME_SIZE) | ||
31 | return false; | ||
32 | |||
33 | return !strncmp(name, CONFIG_RTC_HCTOSYS_DEVICE, NAME_SIZE); | ||
34 | } | ||
35 | #else | ||
36 | static bool is_rtc_hctosys(struct rtc_device *rtc) | ||
37 | { | ||
38 | return (rtc->id == 0); | ||
39 | } | ||
40 | #endif | ||
41 | |||
42 | static int rtc_proc_show(struct seq_file *seq, void *offset) | ||
43 | { | ||
44 | int err; | ||
45 | struct rtc_device *rtc = seq->private; | ||
46 | const struct rtc_class_ops *ops = rtc->ops; | ||
47 | struct rtc_wkalrm alrm; | ||
48 | struct rtc_time tm; | ||
49 | |||
50 | err = rtc_read_time(rtc, &tm); | ||
51 | if (err == 0) { | ||
52 | seq_printf(seq, | ||
53 | "rtc_time\t: %ptRt\n" | ||
54 | "rtc_date\t: %ptRd\n", | ||
55 | &tm, &tm); | ||
56 | } | ||
57 | |||
58 | err = rtc_read_alarm(rtc, &alrm); | ||
59 | if (err == 0) { | ||
60 | seq_printf(seq, "alrm_time\t: %ptRt\n", &alrm.time); | ||
61 | seq_printf(seq, "alrm_date\t: %ptRd\n", &alrm.time); | ||
62 | seq_printf(seq, "alarm_IRQ\t: %s\n", | ||
63 | alrm.enabled ? "yes" : "no"); | ||
64 | seq_printf(seq, "alrm_pending\t: %s\n", | ||
65 | alrm.pending ? "yes" : "no"); | ||
66 | seq_printf(seq, "update IRQ enabled\t: %s\n", | ||
67 | (rtc->uie_rtctimer.enabled) ? "yes" : "no"); | ||
68 | seq_printf(seq, "periodic IRQ enabled\t: %s\n", | ||
69 | (rtc->pie_enabled) ? "yes" : "no"); | ||
70 | seq_printf(seq, "periodic IRQ frequency\t: %d\n", | ||
71 | rtc->irq_freq); | ||
72 | seq_printf(seq, "max user IRQ frequency\t: %d\n", | ||
73 | rtc->max_user_freq); | ||
74 | } | ||
75 | |||
76 | seq_printf(seq, "24hr\t\t: yes\n"); | ||
77 | |||
78 | if (ops->proc) | ||
79 | ops->proc(rtc->dev.parent, seq); | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | void rtc_proc_add_device(struct rtc_device *rtc) | ||
85 | { | ||
86 | if (is_rtc_hctosys(rtc)) | ||
87 | proc_create_single_data("driver/rtc", 0, NULL, rtc_proc_show, | ||
88 | rtc); | ||
89 | } | ||
90 | |||
91 | void rtc_proc_del_device(struct rtc_device *rtc) | ||
92 | { | ||
93 | if (is_rtc_hctosys(rtc)) | ||
94 | remove_proc_entry("driver/rtc", NULL); | ||
95 | } | ||