diff options
Diffstat (limited to 'arch/x86/kernel/hpet.c')
-rw-r--r-- | arch/x86/kernel/hpet.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index b946a9eac7d9..ad0de0c2714e 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -2,7 +2,6 @@ | |||
2 | #include <linux/clockchips.h> | 2 | #include <linux/clockchips.h> |
3 | #include <linux/interrupt.h> | 3 | #include <linux/interrupt.h> |
4 | #include <linux/export.h> | 4 | #include <linux/export.h> |
5 | #include <linux/sysdev.h> | ||
6 | #include <linux/delay.h> | 5 | #include <linux/delay.h> |
7 | #include <linux/errno.h> | 6 | #include <linux/errno.h> |
8 | #include <linux/i8253.h> | 7 | #include <linux/i8253.h> |
@@ -32,8 +31,6 @@ | |||
32 | #define HPET_MIN_CYCLES 128 | 31 | #define HPET_MIN_CYCLES 128 |
33 | #define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1)) | 32 | #define HPET_MIN_PROG_DELTA (HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1)) |
34 | 33 | ||
35 | #define EVT_TO_HPET_DEV(evt) container_of(evt, struct hpet_dev, evt) | ||
36 | |||
37 | /* | 34 | /* |
38 | * HPET address is set in acpi/boot.c, when an ACPI entry exists | 35 | * HPET address is set in acpi/boot.c, when an ACPI entry exists |
39 | */ | 36 | */ |
@@ -55,6 +52,11 @@ struct hpet_dev { | |||
55 | char name[10]; | 52 | char name[10]; |
56 | }; | 53 | }; |
57 | 54 | ||
55 | inline struct hpet_dev *EVT_TO_HPET_DEV(struct clock_event_device *evtdev) | ||
56 | { | ||
57 | return container_of(evtdev, struct hpet_dev, evt); | ||
58 | } | ||
59 | |||
58 | inline unsigned int hpet_readl(unsigned int a) | 60 | inline unsigned int hpet_readl(unsigned int a) |
59 | { | 61 | { |
60 | return readl(hpet_virt_address + a); | 62 | return readl(hpet_virt_address + a); |
@@ -1049,6 +1051,14 @@ int hpet_rtc_timer_init(void) | |||
1049 | } | 1051 | } |
1050 | EXPORT_SYMBOL_GPL(hpet_rtc_timer_init); | 1052 | EXPORT_SYMBOL_GPL(hpet_rtc_timer_init); |
1051 | 1053 | ||
1054 | static void hpet_disable_rtc_channel(void) | ||
1055 | { | ||
1056 | unsigned long cfg; | ||
1057 | cfg = hpet_readl(HPET_T1_CFG); | ||
1058 | cfg &= ~HPET_TN_ENABLE; | ||
1059 | hpet_writel(cfg, HPET_T1_CFG); | ||
1060 | } | ||
1061 | |||
1052 | /* | 1062 | /* |
1053 | * The functions below are called from rtc driver. | 1063 | * The functions below are called from rtc driver. |
1054 | * Return 0 if HPET is not being used. | 1064 | * Return 0 if HPET is not being used. |
@@ -1060,6 +1070,9 @@ int hpet_mask_rtc_irq_bit(unsigned long bit_mask) | |||
1060 | return 0; | 1070 | return 0; |
1061 | 1071 | ||
1062 | hpet_rtc_flags &= ~bit_mask; | 1072 | hpet_rtc_flags &= ~bit_mask; |
1073 | if (unlikely(!hpet_rtc_flags)) | ||
1074 | hpet_disable_rtc_channel(); | ||
1075 | |||
1063 | return 1; | 1076 | return 1; |
1064 | } | 1077 | } |
1065 | EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit); | 1078 | EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit); |
@@ -1125,15 +1138,11 @@ EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq); | |||
1125 | 1138 | ||
1126 | static void hpet_rtc_timer_reinit(void) | 1139 | static void hpet_rtc_timer_reinit(void) |
1127 | { | 1140 | { |
1128 | unsigned int cfg, delta; | 1141 | unsigned int delta; |
1129 | int lost_ints = -1; | 1142 | int lost_ints = -1; |
1130 | 1143 | ||
1131 | if (unlikely(!hpet_rtc_flags)) { | 1144 | if (unlikely(!hpet_rtc_flags)) |
1132 | cfg = hpet_readl(HPET_T1_CFG); | 1145 | hpet_disable_rtc_channel(); |
1133 | cfg &= ~HPET_TN_ENABLE; | ||
1134 | hpet_writel(cfg, HPET_T1_CFG); | ||
1135 | return; | ||
1136 | } | ||
1137 | 1146 | ||
1138 | if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit) | 1147 | if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit) |
1139 | delta = hpet_default_delta; | 1148 | delta = hpet_default_delta; |