diff options
Diffstat (limited to 'drivers/rtc/rtc-omap.c')
-rw-r--r-- | drivers/rtc/rtc-omap.c | 45 |
1 files changed, 9 insertions, 36 deletions
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 73377b0d65d..de0dd7b1f14 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c | |||
@@ -135,42 +135,17 @@ static irqreturn_t rtc_irq(int irq, void *rtc) | |||
135 | return IRQ_HANDLED; | 135 | return IRQ_HANDLED; |
136 | } | 136 | } |
137 | 137 | ||
138 | #ifdef CONFIG_RTC_INTF_DEV | 138 | static int omap_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
139 | |||
140 | static int | ||
141 | omap_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | ||
142 | { | 139 | { |
143 | u8 reg; | 140 | u8 reg; |
144 | 141 | ||
145 | switch (cmd) { | ||
146 | case RTC_AIE_OFF: | ||
147 | case RTC_AIE_ON: | ||
148 | case RTC_UIE_OFF: | ||
149 | case RTC_UIE_ON: | ||
150 | break; | ||
151 | default: | ||
152 | return -ENOIOCTLCMD; | ||
153 | } | ||
154 | |||
155 | local_irq_disable(); | 142 | local_irq_disable(); |
156 | rtc_wait_not_busy(); | 143 | rtc_wait_not_busy(); |
157 | reg = rtc_read(OMAP_RTC_INTERRUPTS_REG); | 144 | reg = rtc_read(OMAP_RTC_INTERRUPTS_REG); |
158 | switch (cmd) { | 145 | if (enabled) |
159 | /* AIE = Alarm Interrupt Enable */ | ||
160 | case RTC_AIE_OFF: | ||
161 | reg &= ~OMAP_RTC_INTERRUPTS_IT_ALARM; | ||
162 | break; | ||
163 | case RTC_AIE_ON: | ||
164 | reg |= OMAP_RTC_INTERRUPTS_IT_ALARM; | 146 | reg |= OMAP_RTC_INTERRUPTS_IT_ALARM; |
165 | break; | 147 | else |
166 | /* UIE = Update Interrupt Enable (1/second) */ | 148 | reg &= ~OMAP_RTC_INTERRUPTS_IT_ALARM; |
167 | case RTC_UIE_OFF: | ||
168 | reg &= ~OMAP_RTC_INTERRUPTS_IT_TIMER; | ||
169 | break; | ||
170 | case RTC_UIE_ON: | ||
171 | reg |= OMAP_RTC_INTERRUPTS_IT_TIMER; | ||
172 | break; | ||
173 | } | ||
174 | rtc_wait_not_busy(); | 149 | rtc_wait_not_busy(); |
175 | rtc_write(reg, OMAP_RTC_INTERRUPTS_REG); | 150 | rtc_write(reg, OMAP_RTC_INTERRUPTS_REG); |
176 | local_irq_enable(); | 151 | local_irq_enable(); |
@@ -178,10 +153,6 @@ omap_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | |||
178 | return 0; | 153 | return 0; |
179 | } | 154 | } |
180 | 155 | ||
181 | #else | ||
182 | #define omap_rtc_ioctl NULL | ||
183 | #endif | ||
184 | |||
185 | /* this hardware doesn't support "don't care" alarm fields */ | 156 | /* this hardware doesn't support "don't care" alarm fields */ |
186 | static int tm2bcd(struct rtc_time *tm) | 157 | static int tm2bcd(struct rtc_time *tm) |
187 | { | 158 | { |
@@ -304,11 +275,11 @@ static int omap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alm) | |||
304 | } | 275 | } |
305 | 276 | ||
306 | static struct rtc_class_ops omap_rtc_ops = { | 277 | static struct rtc_class_ops omap_rtc_ops = { |
307 | .ioctl = omap_rtc_ioctl, | ||
308 | .read_time = omap_rtc_read_time, | 278 | .read_time = omap_rtc_read_time, |
309 | .set_time = omap_rtc_set_time, | 279 | .set_time = omap_rtc_set_time, |
310 | .read_alarm = omap_rtc_read_alarm, | 280 | .read_alarm = omap_rtc_read_alarm, |
311 | .set_alarm = omap_rtc_set_alarm, | 281 | .set_alarm = omap_rtc_set_alarm, |
282 | .alarm_irq_enable = omap_rtc_alarm_irq_enable, | ||
312 | }; | 283 | }; |
313 | 284 | ||
314 | static int omap_rtc_alarm; | 285 | static int omap_rtc_alarm; |
@@ -429,13 +400,14 @@ fail1: | |||
429 | fail0: | 400 | fail0: |
430 | iounmap(rtc_base); | 401 | iounmap(rtc_base); |
431 | fail: | 402 | fail: |
432 | release_resource(mem); | 403 | release_mem_region(mem->start, resource_size(mem)); |
433 | return -EIO; | 404 | return -EIO; |
434 | } | 405 | } |
435 | 406 | ||
436 | static int __exit omap_rtc_remove(struct platform_device *pdev) | 407 | static int __exit omap_rtc_remove(struct platform_device *pdev) |
437 | { | 408 | { |
438 | struct rtc_device *rtc = platform_get_drvdata(pdev); | 409 | struct rtc_device *rtc = platform_get_drvdata(pdev); |
410 | struct resource *mem = dev_get_drvdata(&rtc->dev); | ||
439 | 411 | ||
440 | device_init_wakeup(&pdev->dev, 0); | 412 | device_init_wakeup(&pdev->dev, 0); |
441 | 413 | ||
@@ -447,8 +419,9 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) | |||
447 | if (omap_rtc_timer != omap_rtc_alarm) | 419 | if (omap_rtc_timer != omap_rtc_alarm) |
448 | free_irq(omap_rtc_alarm, rtc); | 420 | free_irq(omap_rtc_alarm, rtc); |
449 | 421 | ||
450 | release_resource(dev_get_drvdata(&rtc->dev)); | ||
451 | rtc_device_unregister(rtc); | 422 | rtc_device_unregister(rtc); |
423 | iounmap(rtc_base); | ||
424 | release_mem_region(mem->start, resource_size(mem)); | ||
452 | return 0; | 425 | return 0; |
453 | } | 426 | } |
454 | 427 | ||