timers/rtc changes for v3.1
Subsystems (5)
Linus,
Please pull the latest timers-rtc-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git timers-rtc-for-linus
Thanks,
Ingo
------------------>
Jan Beulich (2):
x86: Serialize SMP bootup CMOS accesses on rtc_lock
x86: Serialize EFI time accesses on rtc_lock
Wolfram Sang (6):
rtc: vt8500: Use define instead of hardcoded value for status bit
rtc: stmp3xxx: Restore register definitions
rtc: stmp3xxx: Port stmp-functions to mxs-equivalents
rtc: stmp3xxx: Initialize drvdata before registering device
rtc: stmp3xxx: Get rid of mach-specific accessors
rtc: stmp3xxx: Remove UIE handlers
arch/x86/include/asm/smpboot_hooks.h | 8 ++ arch/x86/platform/efi/efi.c | 39 +++++++-- drivers/rtc/Kconfig | 6 +- drivers/rtc/rtc-stmp3xxx.c | 153 +++++++++++++++++---------------- drivers/rtc/rtc-vt8500.c | 6 +- 5 files changed, 127 insertions(+), 85 deletions(-)
arch/x86/include/asm/smpboot_hooks.h +8 -0
@@ -10,7 +10,11 @@ static inline void smpboot_clear_io_apic_irqs(void)static inline void smpboot_setup_warm_reset_vector (unsigned long start_eip) { +unsigned long flags; + +spin_lock_irqsave (&rtc_lock, flags);CMOS_WRITE (0xa ,0xf ); +spin_unlock_irqrestore (&rtc_lock, flags);local_flush_tlb ();pr_debug ("1.\n" ); *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_high)) =
@@ -23,6 +27,8 @@ static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)static inline void smpboot_restore_warm_reset_vector (void ) { +unsigned long flags; +/* * Install writable page 0 entry to set BIOS data area. */
@@ -32,7 +38,9 @@ static inline void smpboot_restore_warm_reset_vector(void)* Paranoid: Set warm reset code and vector here back * to default values. */ +spin_lock_irqsave (&rtc_lock, flags);CMOS_WRITE (0 ,0xf ); +spin_unlock_irqrestore (&rtc_lock, flags); *((volatile u32 *)phys_to_virt (apic->trampoline_phys_low)) =0 ; }
arch/x86/platform/efi/efi.c +33 -6
@@ -79,26 +79,50 @@ early_param("add_efi_memmap", setup_add_efi_memmap);static efi_status_t virt_efi_get_time (efi_time_t *tm,efi_time_cap_t *tc) { -return efi_call_virt2 (get_time, tm, tc); +unsigned long flags; +efi_status_t status; + +spin_lock_irqsave (&rtc_lock, flags); + status =efi_call_virt2 (get_time, tm, tc); +spin_unlock_irqrestore (&rtc_lock, flags); +return status; }static efi_status_t virt_efi_set_time (efi_time_t *tm) { -return efi_call_virt1 (set_time, tm); +unsigned long flags; +efi_status_t status; + +spin_lock_irqsave (&rtc_lock, flags); + status =efi_call_virt1 (set_time, tm); +spin_unlock_irqrestore (&rtc_lock, flags); +return status; }static efi_status_t virt_efi_get_wakeup_time (efi_bool_t *enabled,efi_bool_t *pending,efi_time_t *tm) { -return efi_call_virt3 (get_wakeup_time, - enabled, pending, tm); +unsigned long flags; +efi_status_t status; + +spin_lock_irqsave (&rtc_lock, flags); + status =efi_call_virt3 (get_wakeup_time, + enabled, pending, tm); +spin_unlock_irqrestore (&rtc_lock, flags); +return status; }static efi_status_t virt_efi_set_wakeup_time (efi_bool_t enabled,efi_time_t *tm) { -return efi_call_virt2 (set_wakeup_time, - enabled, tm); +unsigned long flags; +efi_status_t status; + +spin_lock_irqsave (&rtc_lock, flags); + status =efi_call_virt2 (set_wakeup_time, + enabled, tm); +spin_unlock_irqrestore (&rtc_lock, flags); +return status; } static efi_status_t virt_efi_get_variable(efi_char16_t *name,
@@ -164,11 +188,14 @@ static efi_status_t __init phys_efi_set_virtual_address_map(static efi_status_t __init phys_efi_get_time (efi_time_t *tm,efi_time_cap_t *tc) { +unsigned long flags;efi_status_t status; +spin_lock_irqsave (&rtc_lock, flags);efi_call_phys_prelog (); status =efi_call_phys2 (efi_phys.get_time, tm, tc);efi_call_phys_epilog (); +spin_unlock_irqrestore (&rtc_lock, flags);return status; }
drivers/rtc/Kconfig +3 -3
@@ -981,11 +981,11 @@ config RTC_DRV_COH901331 config RTC_DRV_STMP - tristate "Freescale STMP3xxx RTC" - depends on ARCH_STMP3XXX + tristate "Freescale STMP3xxx/i.MX23/i.MX28 RTC" + depends on ARCH_MXS help If you say yes here you will get support for the onboard - STMP3xxx RTC. + STMP3xxx/i.MX23/i.MX28 RTC. This driver can also be built as a module. If so, the module will be called rtc-stmp3xxx.
drivers/rtc/rtc-stmp3xxx.c +79 -74
269 lines not on this page · raw message
drivers/rtc/rtc-vt8500.c +4 -2
@@ -74,6 +74,8 @@#define VT8500_RTC_CR_SM_SEC (1 << 3)/* 0: 1Hz/60, 1: 1Hz */ #define VT8500_RTC_CR_CALIB (1 << 4)/* Enable calibration */ +#define VT8500_RTC_IS_ALARM (1 << 0)/* Alarm interrupt status */ +struct vt8500_rtc {void __iomem *regbase;struct resource *res;
@@ -96,7 +98,7 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id)spin_unlock (&vt8500_rtc->lock); -if (isr &1 ) +if (isr &VT8500_RTC_IS_ALARM ) events |=RTC_AF |RTC_IRQF ;rtc_update_irq (vt8500_rtc->rtc,1 , events);
@@ -161,8 +163,8 @@ static int vt8500_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) alrm->time.tm_sec =bcd2bin ((alarm &TIME_SEC_MASK )); alrm->enabled = (alarm &ALARM_ENABLE_MASK ) ?1 :0 ; + alrm->pending = (isr &VT8500_RTC_IS_ALARM ) ?1 :0 ; - alrm->pending = (isr &1 ) ?1 :0 ;return rtc_valid_tm (&alrm->time); }