diff options
Diffstat (limited to 'drivers/rtc/rtc-at91rm9200.c')
-rw-r--r-- | drivers/rtc/rtc-at91rm9200.c | 38 |
1 files changed, 8 insertions, 30 deletions
diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c index bc8bbca9a2e2..e39b77a4609a 100644 --- a/drivers/rtc/rtc-at91rm9200.c +++ b/drivers/rtc/rtc-at91rm9200.c | |||
@@ -60,7 +60,7 @@ static void at91_rtc_decodetime(unsigned int timereg, unsigned int calreg, | |||
60 | /* | 60 | /* |
61 | * The Calendar Alarm register does not have a field for | 61 | * The Calendar Alarm register does not have a field for |
62 | * the year - so these will return an invalid value. When an | 62 | * the year - so these will return an invalid value. When an |
63 | * alarm is set, at91_alarm_year wille store the current year. | 63 | * alarm is set, at91_alarm_year will store the current year. |
64 | */ | 64 | */ |
65 | tm->tm_year = bcd2bin(date & AT91_RTC_CENT) * 100; /* century */ | 65 | tm->tm_year = bcd2bin(date & AT91_RTC_CENT) * 100; /* century */ |
66 | tm->tm_year += bcd2bin((date & AT91_RTC_YEAR) >> 8); /* year */ | 66 | tm->tm_year += bcd2bin((date & AT91_RTC_YEAR) >> 8); /* year */ |
@@ -183,40 +183,18 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) | |||
183 | return 0; | 183 | return 0; |
184 | } | 184 | } |
185 | 185 | ||
186 | /* | 186 | static int at91_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) |
187 | * Handle commands from user-space | ||
188 | */ | ||
189 | static int at91_rtc_ioctl(struct device *dev, unsigned int cmd, | ||
190 | unsigned long arg) | ||
191 | { | 187 | { |
192 | int ret = 0; | 188 | pr_debug("%s(): cmd=%08x\n", __func__, enabled); |
193 | 189 | ||
194 | pr_debug("%s(): cmd=%08x, arg=%08lx.\n", __func__, cmd, arg); | 190 | if (enabled) { |
195 | |||
196 | /* important: scrub old status before enabling IRQs */ | ||
197 | switch (cmd) { | ||
198 | case RTC_AIE_OFF: /* alarm off */ | ||
199 | at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM); | ||
200 | break; | ||
201 | case RTC_AIE_ON: /* alarm on */ | ||
202 | at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM); | 191 | at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM); |
203 | at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM); | 192 | at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM); |
204 | break; | 193 | } else |
205 | case RTC_UIE_OFF: /* update off */ | 194 | at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM); |
206 | at91_sys_write(AT91_RTC_IDR, AT91_RTC_SECEV); | ||
207 | break; | ||
208 | case RTC_UIE_ON: /* update on */ | ||
209 | at91_sys_write(AT91_RTC_SCCR, AT91_RTC_SECEV); | ||
210 | at91_sys_write(AT91_RTC_IER, AT91_RTC_SECEV); | ||
211 | break; | ||
212 | default: | ||
213 | ret = -ENOIOCTLCMD; | ||
214 | break; | ||
215 | } | ||
216 | 195 | ||
217 | return ret; | 196 | return 0; |
218 | } | 197 | } |
219 | |||
220 | /* | 198 | /* |
221 | * Provide additional RTC information in /proc/driver/rtc | 199 | * Provide additional RTC information in /proc/driver/rtc |
222 | */ | 200 | */ |
@@ -264,12 +242,12 @@ static irqreturn_t at91_rtc_interrupt(int irq, void *dev_id) | |||
264 | } | 242 | } |
265 | 243 | ||
266 | static const struct rtc_class_ops at91_rtc_ops = { | 244 | static const struct rtc_class_ops at91_rtc_ops = { |
267 | .ioctl = at91_rtc_ioctl, | ||
268 | .read_time = at91_rtc_readtime, | 245 | .read_time = at91_rtc_readtime, |
269 | .set_time = at91_rtc_settime, | 246 | .set_time = at91_rtc_settime, |
270 | .read_alarm = at91_rtc_readalarm, | 247 | .read_alarm = at91_rtc_readalarm, |
271 | .set_alarm = at91_rtc_setalarm, | 248 | .set_alarm = at91_rtc_setalarm, |
272 | .proc = at91_rtc_proc, | 249 | .proc = at91_rtc_proc, |
250 | .alarm_irq_enable = at91_rtc_alarm_irq_enable, | ||
273 | }; | 251 | }; |
274 | 252 | ||
275 | /* | 253 | /* |