diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-02-17 12:27:37 -0500 |
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-02-17 12:28:05 -0500 |
| commit | b7e56edba4b02f2079042c326a8cd72a44635817 (patch) | |
| tree | b5042002e9747cd8fb1278d61f86d8b92a74c018 /drivers/rtc/rtc-cmos.c | |
| parent | 13ca0fcaa33f6b1984c4111b6ec5df42689fea6f (diff) | |
| parent | b0483e78e5c4c9871fc5541875b3bc006846d46b (diff) | |
Merge branch 'linus' into x86/mm
x86/mm is on 32-rc4 and missing the spinlock namespace changes which
are needed for further commits into this topic.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/rtc/rtc-cmos.c')
| -rw-r--r-- | drivers/rtc/rtc-cmos.c | 90 |
1 files changed, 42 insertions, 48 deletions
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index f7a4701bf863..e9aa814ddd23 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
| @@ -420,49 +420,43 @@ static int cmos_irq_set_state(struct device *dev, int enabled) | |||
| 420 | return 0; | 420 | return 0; |
| 421 | } | 421 | } |
| 422 | 422 | ||
| 423 | #if defined(CONFIG_RTC_INTF_DEV) || defined(CONFIG_RTC_INTF_DEV_MODULE) | 423 | static int cmos_alarm_irq_enable(struct device *dev, unsigned int enabled) |
| 424 | |||
| 425 | static int | ||
| 426 | cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | ||
| 427 | { | 424 | { |
| 428 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 425 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
| 429 | unsigned long flags; | 426 | unsigned long flags; |
| 430 | 427 | ||
| 431 | switch (cmd) { | 428 | if (!is_valid_irq(cmos->irq)) |
| 432 | case RTC_AIE_OFF: | 429 | return -EINVAL; |
| 433 | case RTC_AIE_ON: | ||
| 434 | case RTC_UIE_OFF: | ||
| 435 | case RTC_UIE_ON: | ||
| 436 | if (!is_valid_irq(cmos->irq)) | ||
| 437 | return -EINVAL; | ||
| 438 | break; | ||
| 439 | /* PIE ON/OFF is handled by cmos_irq_set_state() */ | ||
| 440 | default: | ||
| 441 | return -ENOIOCTLCMD; | ||
| 442 | } | ||
| 443 | 430 | ||
| 444 | spin_lock_irqsave(&rtc_lock, flags); | 431 | spin_lock_irqsave(&rtc_lock, flags); |
| 445 | switch (cmd) { | 432 | |
| 446 | case RTC_AIE_OFF: /* alarm off */ | 433 | if (enabled) |
| 447 | cmos_irq_disable(cmos, RTC_AIE); | ||
| 448 | break; | ||
| 449 | case RTC_AIE_ON: /* alarm on */ | ||
| 450 | cmos_irq_enable(cmos, RTC_AIE); | 434 | cmos_irq_enable(cmos, RTC_AIE); |
| 451 | break; | 435 | else |
| 452 | case RTC_UIE_OFF: /* update off */ | 436 | cmos_irq_disable(cmos, RTC_AIE); |
| 453 | cmos_irq_disable(cmos, RTC_UIE); | 437 | |
| 454 | break; | ||
| 455 | case RTC_UIE_ON: /* update on */ | ||
| 456 | cmos_irq_enable(cmos, RTC_UIE); | ||
| 457 | break; | ||
| 458 | } | ||
| 459 | spin_unlock_irqrestore(&rtc_lock, flags); | 438 | spin_unlock_irqrestore(&rtc_lock, flags); |
| 460 | return 0; | 439 | return 0; |
| 461 | } | 440 | } |
| 462 | 441 | ||
| 463 | #else | 442 | static int cmos_update_irq_enable(struct device *dev, unsigned int enabled) |
| 464 | #define cmos_rtc_ioctl NULL | 443 | { |
| 465 | #endif | 444 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
| 445 | unsigned long flags; | ||
| 446 | |||
| 447 | if (!is_valid_irq(cmos->irq)) | ||
| 448 | return -EINVAL; | ||
| 449 | |||
| 450 | spin_lock_irqsave(&rtc_lock, flags); | ||
| 451 | |||
| 452 | if (enabled) | ||
| 453 | cmos_irq_enable(cmos, RTC_UIE); | ||
| 454 | else | ||
| 455 | cmos_irq_disable(cmos, RTC_UIE); | ||
| 456 | |||
| 457 | spin_unlock_irqrestore(&rtc_lock, flags); | ||
| 458 | return 0; | ||
| 459 | } | ||
| 466 | 460 | ||
| 467 | #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE) | 461 | #if defined(CONFIG_RTC_INTF_PROC) || defined(CONFIG_RTC_INTF_PROC_MODULE) |
| 468 | 462 | ||
| @@ -503,14 +497,15 @@ static int cmos_procfs(struct device *dev, struct seq_file *seq) | |||
| 503 | #endif | 497 | #endif |
| 504 | 498 | ||
| 505 | static const struct rtc_class_ops cmos_rtc_ops = { | 499 | static const struct rtc_class_ops cmos_rtc_ops = { |
| 506 | .ioctl = cmos_rtc_ioctl, | 500 | .read_time = cmos_read_time, |
| 507 | .read_time = cmos_read_time, | 501 | .set_time = cmos_set_time, |
| 508 | .set_time = cmos_set_time, | 502 | .read_alarm = cmos_read_alarm, |
| 509 | .read_alarm = cmos_read_alarm, | 503 | .set_alarm = cmos_set_alarm, |
| 510 | .set_alarm = cmos_set_alarm, | 504 | .proc = cmos_procfs, |
| 511 | .proc = cmos_procfs, | 505 | .irq_set_freq = cmos_irq_set_freq, |
| 512 | .irq_set_freq = cmos_irq_set_freq, | 506 | .irq_set_state = cmos_irq_set_state, |
| 513 | .irq_set_state = cmos_irq_set_state, | 507 | .alarm_irq_enable = cmos_alarm_irq_enable, |
| 508 | .update_irq_enable = cmos_update_irq_enable, | ||
| 514 | }; | 509 | }; |
| 515 | 510 | ||
| 516 | /*----------------------------------------------------------------*/ | 511 | /*----------------------------------------------------------------*/ |
| @@ -691,7 +686,8 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) | |||
| 691 | */ | 686 | */ |
| 692 | #if defined(CONFIG_ATARI) | 687 | #if defined(CONFIG_ATARI) |
| 693 | address_space = 64; | 688 | address_space = 64; |
| 694 | #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) || defined(__sparc__) | 689 | #elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) \ |
| 690 | || defined(__sparc__) || defined(__mips__) | ||
| 695 | address_space = 128; | 691 | address_space = 128; |
| 696 | #else | 692 | #else |
| 697 | #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes. | 693 | #warning Assuming 128 bytes of RTC+NVRAM address space, not 64 bytes. |
| @@ -871,8 +867,9 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg) | |||
| 871 | mask = RTC_IRQMASK; | 867 | mask = RTC_IRQMASK; |
| 872 | tmp &= ~mask; | 868 | tmp &= ~mask; |
| 873 | CMOS_WRITE(tmp, RTC_CONTROL); | 869 | CMOS_WRITE(tmp, RTC_CONTROL); |
| 874 | hpet_mask_rtc_irq_bit(mask); | ||
| 875 | 870 | ||
| 871 | /* shut down hpet emulation - we don't need it for alarm */ | ||
| 872 | hpet_mask_rtc_irq_bit(RTC_PIE|RTC_AIE|RTC_UIE); | ||
| 876 | cmos_checkintr(cmos, tmp); | 873 | cmos_checkintr(cmos, tmp); |
| 877 | } | 874 | } |
| 878 | spin_unlock_irq(&rtc_lock); | 875 | spin_unlock_irq(&rtc_lock); |
| @@ -1099,9 +1096,9 @@ static int cmos_pnp_resume(struct pnp_dev *pnp) | |||
| 1099 | #define cmos_pnp_resume NULL | 1096 | #define cmos_pnp_resume NULL |
| 1100 | #endif | 1097 | #endif |
| 1101 | 1098 | ||
| 1102 | static void cmos_pnp_shutdown(struct device *pdev) | 1099 | static void cmos_pnp_shutdown(struct pnp_dev *pnp) |
| 1103 | { | 1100 | { |
| 1104 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(pdev)) | 1101 | if (system_state == SYSTEM_POWER_OFF && !cmos_poweroff(&pnp->dev)) |
| 1105 | return; | 1102 | return; |
| 1106 | 1103 | ||
| 1107 | cmos_do_shutdown(); | 1104 | cmos_do_shutdown(); |
| @@ -1120,15 +1117,12 @@ static struct pnp_driver cmos_pnp_driver = { | |||
| 1120 | .id_table = rtc_ids, | 1117 | .id_table = rtc_ids, |
| 1121 | .probe = cmos_pnp_probe, | 1118 | .probe = cmos_pnp_probe, |
| 1122 | .remove = __exit_p(cmos_pnp_remove), | 1119 | .remove = __exit_p(cmos_pnp_remove), |
| 1120 | .shutdown = cmos_pnp_shutdown, | ||
| 1123 | 1121 | ||
| 1124 | /* flag ensures resume() gets called, and stops syslog spam */ | 1122 | /* flag ensures resume() gets called, and stops syslog spam */ |
| 1125 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, | 1123 | .flags = PNP_DRIVER_RES_DO_NOT_CHANGE, |
| 1126 | .suspend = cmos_pnp_suspend, | 1124 | .suspend = cmos_pnp_suspend, |
| 1127 | .resume = cmos_pnp_resume, | 1125 | .resume = cmos_pnp_resume, |
| 1128 | .driver = { | ||
| 1129 | .name = (char *)driver_name, | ||
| 1130 | .shutdown = cmos_pnp_shutdown, | ||
| 1131 | } | ||
| 1132 | }; | 1126 | }; |
| 1133 | 1127 | ||
| 1134 | #endif /* CONFIG_PNP */ | 1128 | #endif /* CONFIG_PNP */ |
