at v2.6.33 12 kB view raw
1/* 2 * RTC subsystem, dev interface 3 * 4 * Copyright (C) 2005 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/sched.h> 17#include "rtc-core.h" 18 19static dev_t rtc_devt; 20 21#define RTC_DEV_MAX 16 /* 16 RTCs should be enough for everyone... */ 22 23static int rtc_dev_open(struct inode *inode, struct file *file) 24{ 25 int err; 26 struct rtc_device *rtc = container_of(inode->i_cdev, 27 struct rtc_device, char_dev); 28 const struct rtc_class_ops *ops = rtc->ops; 29 30 if (test_and_set_bit_lock(RTC_DEV_BUSY, &rtc->flags)) 31 return -EBUSY; 32 33 file->private_data = rtc; 34 35 err = ops->open ? ops->open(rtc->dev.parent) : 0; 36 if (err == 0) { 37 spin_lock_irq(&rtc->irq_lock); 38 rtc->irq_data = 0; 39 spin_unlock_irq(&rtc->irq_lock); 40 41 return 0; 42 } 43 44 /* something has gone wrong */ 45 clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); 46 return err; 47} 48 49#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL 50/* 51 * Routine to poll RTC seconds field for change as often as possible, 52 * after first RTC_UIE use timer to reduce polling 53 */ 54static void rtc_uie_task(struct work_struct *work) 55{ 56 struct rtc_device *rtc = 57 container_of(work, struct rtc_device, uie_task); 58 struct rtc_time tm; 59 int num = 0; 60 int err; 61 62 err = rtc_read_time(rtc, &tm); 63 64 spin_lock_irq(&rtc->irq_lock); 65 if (rtc->stop_uie_polling || err) { 66 rtc->uie_task_active = 0; 67 } else if (rtc->oldsecs != tm.tm_sec) { 68 num = (tm.tm_sec + 60 - rtc->oldsecs) % 60; 69 rtc->oldsecs = tm.tm_sec; 70 rtc->uie_timer.expires = jiffies + HZ - (HZ/10); 71 rtc->uie_timer_active = 1; 72 rtc->uie_task_active = 0; 73 add_timer(&rtc->uie_timer); 74 } else if (schedule_work(&rtc->uie_task) == 0) { 75 rtc->uie_task_active = 0; 76 } 77 spin_unlock_irq(&rtc->irq_lock); 78 if (num) 79 rtc_update_irq(rtc, num, RTC_UF | RTC_IRQF); 80} 81static void rtc_uie_timer(unsigned long data) 82{ 83 struct rtc_device *rtc = (struct rtc_device *)data; 84 unsigned long flags; 85 86 spin_lock_irqsave(&rtc->irq_lock, flags); 87 rtc->uie_timer_active = 0; 88 rtc->uie_task_active = 1; 89 if ((schedule_work(&rtc->uie_task) == 0)) 90 rtc->uie_task_active = 0; 91 spin_unlock_irqrestore(&rtc->irq_lock, flags); 92} 93 94static int clear_uie(struct rtc_device *rtc) 95{ 96 spin_lock_irq(&rtc->irq_lock); 97 if (rtc->uie_irq_active) { 98 rtc->stop_uie_polling = 1; 99 if (rtc->uie_timer_active) { 100 spin_unlock_irq(&rtc->irq_lock); 101 del_timer_sync(&rtc->uie_timer); 102 spin_lock_irq(&rtc->irq_lock); 103 rtc->uie_timer_active = 0; 104 } 105 if (rtc->uie_task_active) { 106 spin_unlock_irq(&rtc->irq_lock); 107 flush_scheduled_work(); 108 spin_lock_irq(&rtc->irq_lock); 109 } 110 rtc->uie_irq_active = 0; 111 } 112 spin_unlock_irq(&rtc->irq_lock); 113 return 0; 114} 115 116static int set_uie(struct rtc_device *rtc) 117{ 118 struct rtc_time tm; 119 int err; 120 121 err = rtc_read_time(rtc, &tm); 122 if (err) 123 return err; 124 spin_lock_irq(&rtc->irq_lock); 125 if (!rtc->uie_irq_active) { 126 rtc->uie_irq_active = 1; 127 rtc->stop_uie_polling = 0; 128 rtc->oldsecs = tm.tm_sec; 129 rtc->uie_task_active = 1; 130 if (schedule_work(&rtc->uie_task) == 0) 131 rtc->uie_task_active = 0; 132 } 133 rtc->irq_data = 0; 134 spin_unlock_irq(&rtc->irq_lock); 135 return 0; 136} 137 138int rtc_dev_update_irq_enable_emul(struct rtc_device *rtc, unsigned int enabled) 139{ 140 if (enabled) 141 return set_uie(rtc); 142 else 143 return clear_uie(rtc); 144} 145EXPORT_SYMBOL(rtc_dev_update_irq_enable_emul); 146 147#endif /* CONFIG_RTC_INTF_DEV_UIE_EMUL */ 148 149static ssize_t 150rtc_dev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 151{ 152 struct rtc_device *rtc = file->private_data; 153 154 DECLARE_WAITQUEUE(wait, current); 155 unsigned long data; 156 ssize_t ret; 157 158 if (count != sizeof(unsigned int) && count < sizeof(unsigned long)) 159 return -EINVAL; 160 161 add_wait_queue(&rtc->irq_queue, &wait); 162 do { 163 __set_current_state(TASK_INTERRUPTIBLE); 164 165 spin_lock_irq(&rtc->irq_lock); 166 data = rtc->irq_data; 167 rtc->irq_data = 0; 168 spin_unlock_irq(&rtc->irq_lock); 169 170 if (data != 0) { 171 ret = 0; 172 break; 173 } 174 if (file->f_flags & O_NONBLOCK) { 175 ret = -EAGAIN; 176 break; 177 } 178 if (signal_pending(current)) { 179 ret = -ERESTARTSYS; 180 break; 181 } 182 schedule(); 183 } while (1); 184 set_current_state(TASK_RUNNING); 185 remove_wait_queue(&rtc->irq_queue, &wait); 186 187 if (ret == 0) { 188 /* Check for any data updates */ 189 if (rtc->ops->read_callback) 190 data = rtc->ops->read_callback(rtc->dev.parent, 191 data); 192 193 if (sizeof(int) != sizeof(long) && 194 count == sizeof(unsigned int)) 195 ret = put_user(data, (unsigned int __user *)buf) ?: 196 sizeof(unsigned int); 197 else 198 ret = put_user(data, (unsigned long __user *)buf) ?: 199 sizeof(unsigned long); 200 } 201 return ret; 202} 203 204static unsigned int rtc_dev_poll(struct file *file, poll_table *wait) 205{ 206 struct rtc_device *rtc = file->private_data; 207 unsigned long data; 208 209 poll_wait(file, &rtc->irq_queue, wait); 210 211 data = rtc->irq_data; 212 213 return (data != 0) ? (POLLIN | POLLRDNORM) : 0; 214} 215 216static long rtc_dev_ioctl(struct file *file, 217 unsigned int cmd, unsigned long arg) 218{ 219 int err = 0; 220 struct rtc_device *rtc = file->private_data; 221 const struct rtc_class_ops *ops = rtc->ops; 222 struct rtc_time tm; 223 struct rtc_wkalrm alarm; 224 void __user *uarg = (void __user *) arg; 225 226 err = mutex_lock_interruptible(&rtc->ops_lock); 227 if (err) 228 return err; 229 230 /* check that the calling task has appropriate permissions 231 * for certain ioctls. doing this check here is useful 232 * to avoid duplicate code in each driver. 233 */ 234 switch (cmd) { 235 case RTC_EPOCH_SET: 236 case RTC_SET_TIME: 237 if (!capable(CAP_SYS_TIME)) 238 err = -EACCES; 239 break; 240 241 case RTC_IRQP_SET: 242 if (arg > rtc->max_user_freq && !capable(CAP_SYS_RESOURCE)) 243 err = -EACCES; 244 break; 245 246 case RTC_PIE_ON: 247 if (rtc->irq_freq > rtc->max_user_freq && 248 !capable(CAP_SYS_RESOURCE)) 249 err = -EACCES; 250 break; 251 } 252 253 if (err) 254 goto done; 255 256 /* try the driver's ioctl interface */ 257 if (ops->ioctl) { 258 err = ops->ioctl(rtc->dev.parent, cmd, arg); 259 if (err != -ENOIOCTLCMD) { 260 mutex_unlock(&rtc->ops_lock); 261 return err; 262 } 263 } 264 265 /* if the driver does not provide the ioctl interface 266 * or if that particular ioctl was not implemented 267 * (-ENOIOCTLCMD), we will try to emulate here. 268 * 269 * Drivers *SHOULD NOT* provide ioctl implementations 270 * for these requests. Instead, provide methods to 271 * support the following code, so that the RTC's main 272 * features are accessible without using ioctls. 273 * 274 * RTC and alarm times will be in UTC, by preference, 275 * but dual-booting with MS-Windows implies RTCs must 276 * use the local wall clock time. 277 */ 278 279 switch (cmd) { 280 case RTC_ALM_READ: 281 mutex_unlock(&rtc->ops_lock); 282 283 err = rtc_read_alarm(rtc, &alarm); 284 if (err < 0) 285 return err; 286 287 if (copy_to_user(uarg, &alarm.time, sizeof(tm))) 288 err = -EFAULT; 289 return err; 290 291 case RTC_ALM_SET: 292 mutex_unlock(&rtc->ops_lock); 293 294 if (copy_from_user(&alarm.time, uarg, sizeof(tm))) 295 return -EFAULT; 296 297 alarm.enabled = 0; 298 alarm.pending = 0; 299 alarm.time.tm_wday = -1; 300 alarm.time.tm_yday = -1; 301 alarm.time.tm_isdst = -1; 302 303 /* RTC_ALM_SET alarms may be up to 24 hours in the future. 304 * Rather than expecting every RTC to implement "don't care" 305 * for day/month/year fields, just force the alarm to have 306 * the right values for those fields. 307 * 308 * RTC_WKALM_SET should be used instead. Not only does it 309 * eliminate the need for a separate RTC_AIE_ON call, it 310 * doesn't have the "alarm 23:59:59 in the future" race. 311 * 312 * NOTE: some legacy code may have used invalid fields as 313 * wildcards, exposing hardware "periodic alarm" capabilities. 314 * Not supported here. 315 */ 316 { 317 unsigned long now, then; 318 319 err = rtc_read_time(rtc, &tm); 320 if (err < 0) 321 return err; 322 rtc_tm_to_time(&tm, &now); 323 324 alarm.time.tm_mday = tm.tm_mday; 325 alarm.time.tm_mon = tm.tm_mon; 326 alarm.time.tm_year = tm.tm_year; 327 err = rtc_valid_tm(&alarm.time); 328 if (err < 0) 329 return err; 330 rtc_tm_to_time(&alarm.time, &then); 331 332 /* alarm may need to wrap into tomorrow */ 333 if (then < now) { 334 rtc_time_to_tm(now + 24 * 60 * 60, &tm); 335 alarm.time.tm_mday = tm.tm_mday; 336 alarm.time.tm_mon = tm.tm_mon; 337 alarm.time.tm_year = tm.tm_year; 338 } 339 } 340 341 return rtc_set_alarm(rtc, &alarm); 342 343 case RTC_RD_TIME: 344 mutex_unlock(&rtc->ops_lock); 345 346 err = rtc_read_time(rtc, &tm); 347 if (err < 0) 348 return err; 349 350 if (copy_to_user(uarg, &tm, sizeof(tm))) 351 err = -EFAULT; 352 return err; 353 354 case RTC_SET_TIME: 355 mutex_unlock(&rtc->ops_lock); 356 357 if (copy_from_user(&tm, uarg, sizeof(tm))) 358 return -EFAULT; 359 360 return rtc_set_time(rtc, &tm); 361 362 case RTC_PIE_ON: 363 err = rtc_irq_set_state(rtc, NULL, 1); 364 break; 365 366 case RTC_PIE_OFF: 367 err = rtc_irq_set_state(rtc, NULL, 0); 368 break; 369 370 case RTC_AIE_ON: 371 mutex_unlock(&rtc->ops_lock); 372 return rtc_alarm_irq_enable(rtc, 1); 373 374 case RTC_AIE_OFF: 375 mutex_unlock(&rtc->ops_lock); 376 return rtc_alarm_irq_enable(rtc, 0); 377 378 case RTC_UIE_ON: 379 mutex_unlock(&rtc->ops_lock); 380 return rtc_update_irq_enable(rtc, 1); 381 382 case RTC_UIE_OFF: 383 mutex_unlock(&rtc->ops_lock); 384 return rtc_update_irq_enable(rtc, 0); 385 386 case RTC_IRQP_SET: 387 err = rtc_irq_set_freq(rtc, NULL, arg); 388 break; 389 390 case RTC_IRQP_READ: 391 err = put_user(rtc->irq_freq, (unsigned long __user *)uarg); 392 break; 393 394#if 0 395 case RTC_EPOCH_SET: 396#ifndef rtc_epoch 397 /* 398 * There were no RTC clocks before 1900. 399 */ 400 if (arg < 1900) { 401 err = -EINVAL; 402 break; 403 } 404 rtc_epoch = arg; 405 err = 0; 406#endif 407 break; 408 409 case RTC_EPOCH_READ: 410 err = put_user(rtc_epoch, (unsigned long __user *)uarg); 411 break; 412#endif 413 case RTC_WKALM_SET: 414 mutex_unlock(&rtc->ops_lock); 415 if (copy_from_user(&alarm, uarg, sizeof(alarm))) 416 return -EFAULT; 417 418 return rtc_set_alarm(rtc, &alarm); 419 420 case RTC_WKALM_RD: 421 mutex_unlock(&rtc->ops_lock); 422 err = rtc_read_alarm(rtc, &alarm); 423 if (err < 0) 424 return err; 425 426 if (copy_to_user(uarg, &alarm, sizeof(alarm))) 427 err = -EFAULT; 428 return err; 429 430 default: 431 err = -ENOTTY; 432 break; 433 } 434 435done: 436 mutex_unlock(&rtc->ops_lock); 437 return err; 438} 439 440static int rtc_dev_fasync(int fd, struct file *file, int on) 441{ 442 struct rtc_device *rtc = file->private_data; 443 return fasync_helper(fd, file, on, &rtc->async_queue); 444} 445 446static int rtc_dev_release(struct inode *inode, struct file *file) 447{ 448 struct rtc_device *rtc = file->private_data; 449 450 /* We shut down the repeating IRQs that userspace enabled, 451 * since nothing is listening to them. 452 * - Update (UIE) ... currently only managed through ioctls 453 * - Periodic (PIE) ... also used through rtc_*() interface calls 454 * 455 * Leave the alarm alone; it may be set to trigger a system wakeup 456 * later, or be used by kernel code, and is a one-shot event anyway. 457 */ 458 459 /* Keep ioctl until all drivers are converted */ 460 rtc_dev_ioctl(file, RTC_UIE_OFF, 0); 461 rtc_update_irq_enable(rtc, 0); 462 rtc_irq_set_state(rtc, NULL, 0); 463 464 if (rtc->ops->release) 465 rtc->ops->release(rtc->dev.parent); 466 467 clear_bit_unlock(RTC_DEV_BUSY, &rtc->flags); 468 return 0; 469} 470 471static const struct file_operations rtc_dev_fops = { 472 .owner = THIS_MODULE, 473 .llseek = no_llseek, 474 .read = rtc_dev_read, 475 .poll = rtc_dev_poll, 476 .unlocked_ioctl = rtc_dev_ioctl, 477 .open = rtc_dev_open, 478 .release = rtc_dev_release, 479 .fasync = rtc_dev_fasync, 480}; 481 482/* insertion/removal hooks */ 483 484void rtc_dev_prepare(struct rtc_device *rtc) 485{ 486 if (!rtc_devt) 487 return; 488 489 if (rtc->id >= RTC_DEV_MAX) { 490 pr_debug("%s: too many RTC devices\n", rtc->name); 491 return; 492 } 493 494 rtc->dev.devt = MKDEV(MAJOR(rtc_devt), rtc->id); 495 496#ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL 497 INIT_WORK(&rtc->uie_task, rtc_uie_task); 498 setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc); 499#endif 500 501 cdev_init(&rtc->char_dev, &rtc_dev_fops); 502 rtc->char_dev.owner = rtc->owner; 503} 504 505void rtc_dev_add_device(struct rtc_device *rtc) 506{ 507 if (cdev_add(&rtc->char_dev, rtc->dev.devt, 1)) 508 printk(KERN_WARNING "%s: failed to add char device %d:%d\n", 509 rtc->name, MAJOR(rtc_devt), rtc->id); 510 else 511 pr_debug("%s: dev (%d:%d)\n", rtc->name, 512 MAJOR(rtc_devt), rtc->id); 513} 514 515void rtc_dev_del_device(struct rtc_device *rtc) 516{ 517 if (rtc->dev.devt) 518 cdev_del(&rtc->char_dev); 519} 520 521void __init rtc_dev_init(void) 522{ 523 int err; 524 525 err = alloc_chrdev_region(&rtc_devt, 0, RTC_DEV_MAX, "rtc"); 526 if (err < 0) 527 printk(KERN_ERR "%s: failed to allocate char dev region\n", 528 __FILE__); 529} 530 531void __exit rtc_dev_exit(void) 532{ 533 if (rtc_devt) 534 unregister_chrdev_region(rtc_devt, RTC_DEV_MAX); 535}