Commit e56425b1 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'timers-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  posix-timers.c: Don't export local functions
  clocksource: start CMT at clocksource resume
  clocksource: add suspend callback
  clocksource: add argument to resume callback
  ntp: Cleanup xtime references in ntp.c
  ntp: Make time_esterror and time_maxerror static
parents 786f8ba2 6622e670
...@@ -61,7 +61,7 @@ unsigned long long sched_clock(void) ...@@ -61,7 +61,7 @@ unsigned long long sched_clock(void)
#ifdef CONFIG_PARAVIRT #ifdef CONFIG_PARAVIRT
static void static void
paravirt_clocksource_resume(void) paravirt_clocksource_resume(struct clocksource *cs)
{ {
if (pv_time_ops.clocksource_resume) if (pv_time_ops.clocksource_resume)
pv_time_ops.clocksource_resume(); pv_time_ops.clocksource_resume();
......
...@@ -266,7 +266,7 @@ static void hpet_resume_device(void) ...@@ -266,7 +266,7 @@ static void hpet_resume_device(void)
force_hpet_resume(); force_hpet_resume();
} }
static void hpet_resume_counter(void) static void hpet_resume_counter(struct clocksource *cs)
{ {
hpet_resume_device(); hpet_resume_device();
hpet_restart_counter(); hpet_restart_counter();
......
...@@ -740,7 +740,7 @@ static cycle_t __vsyscall_fn vread_tsc(void) ...@@ -740,7 +740,7 @@ static cycle_t __vsyscall_fn vread_tsc(void)
} }
#endif #endif
static void resume_tsc(void) static void resume_tsc(struct clocksource *cs)
{ {
clocksource_tsc.cycle_last = 0; clocksource_tsc.cycle_last = 0;
} }
......
...@@ -40,7 +40,6 @@ struct sh_cmt_priv { ...@@ -40,7 +40,6 @@ struct sh_cmt_priv {
struct platform_device *pdev; struct platform_device *pdev;
unsigned long flags; unsigned long flags;
unsigned long flags_suspend;
unsigned long match_value; unsigned long match_value;
unsigned long next_match_value; unsigned long next_match_value;
unsigned long max_match_value; unsigned long max_match_value;
...@@ -432,6 +431,11 @@ static void sh_cmt_clocksource_disable(struct clocksource *cs) ...@@ -432,6 +431,11 @@ static void sh_cmt_clocksource_disable(struct clocksource *cs)
sh_cmt_stop(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE); sh_cmt_stop(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE);
} }
static void sh_cmt_clocksource_resume(struct clocksource *cs)
{
sh_cmt_start(cs_to_sh_cmt(cs), FLAG_CLOCKSOURCE);
}
static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, static int sh_cmt_register_clocksource(struct sh_cmt_priv *p,
char *name, unsigned long rating) char *name, unsigned long rating)
{ {
...@@ -442,6 +446,8 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p, ...@@ -442,6 +446,8 @@ static int sh_cmt_register_clocksource(struct sh_cmt_priv *p,
cs->read = sh_cmt_clocksource_read; cs->read = sh_cmt_clocksource_read;
cs->enable = sh_cmt_clocksource_enable; cs->enable = sh_cmt_clocksource_enable;
cs->disable = sh_cmt_clocksource_disable; cs->disable = sh_cmt_clocksource_disable;
cs->suspend = sh_cmt_clocksource_disable;
cs->resume = sh_cmt_clocksource_resume;
cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8); cs->mask = CLOCKSOURCE_MASK(sizeof(unsigned long) * 8);
cs->flags = CLOCK_SOURCE_IS_CONTINUOUS; cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;
pr_info("sh_cmt: %s used as clock source\n", cs->name); pr_info("sh_cmt: %s used as clock source\n", cs->name);
...@@ -674,38 +680,11 @@ static int __devexit sh_cmt_remove(struct platform_device *pdev) ...@@ -674,38 +680,11 @@ static int __devexit sh_cmt_remove(struct platform_device *pdev)
return -EBUSY; /* cannot unregister clockevent and clocksource */ return -EBUSY; /* cannot unregister clockevent and clocksource */
} }
static int sh_cmt_suspend(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct sh_cmt_priv *p = platform_get_drvdata(pdev);
/* save flag state and stop CMT channel */
p->flags_suspend = p->flags;
sh_cmt_stop(p, p->flags);
return 0;
}
static int sh_cmt_resume(struct device *dev)
{
struct platform_device *pdev = to_platform_device(dev);
struct sh_cmt_priv *p = platform_get_drvdata(pdev);
/* start CMT channel from saved state */
sh_cmt_start(p, p->flags_suspend);
return 0;
}
static struct dev_pm_ops sh_cmt_dev_pm_ops = {
.suspend = sh_cmt_suspend,
.resume = sh_cmt_resume,
};
static struct platform_driver sh_cmt_device_driver = { static struct platform_driver sh_cmt_device_driver = {
.probe = sh_cmt_probe, .probe = sh_cmt_probe,
.remove = __devexit_p(sh_cmt_remove), .remove = __devexit_p(sh_cmt_remove),
.driver = { .driver = {
.name = "sh_cmt", .name = "sh_cmt",
.pm = &sh_cmt_dev_pm_ops,
} }
}; };
......
...@@ -154,6 +154,7 @@ extern u64 timecounter_cyc2time(struct timecounter *tc, ...@@ -154,6 +154,7 @@ extern u64 timecounter_cyc2time(struct timecounter *tc,
* @max_idle_ns: max idle time permitted by the clocksource (nsecs) * @max_idle_ns: max idle time permitted by the clocksource (nsecs)
* @flags: flags describing special properties * @flags: flags describing special properties
* @vread: vsyscall based read * @vread: vsyscall based read
* @suspend: suspend function for the clocksource, if necessary
* @resume: resume function for the clocksource, if necessary * @resume: resume function for the clocksource, if necessary
*/ */
struct clocksource { struct clocksource {
...@@ -172,7 +173,8 @@ struct clocksource { ...@@ -172,7 +173,8 @@ struct clocksource {
u64 max_idle_ns; u64 max_idle_ns;
unsigned long flags; unsigned long flags;
cycle_t (*vread)(void); cycle_t (*vread)(void);
void (*resume)(void); void (*suspend)(struct clocksource *cs);
void (*resume)(struct clocksource *cs);
#ifdef CONFIG_IA64 #ifdef CONFIG_IA64
void *fsys_mmio; /* used by fsyscall asm code */ void *fsys_mmio; /* used by fsyscall asm code */
#define CLKSRC_FSYS_MMIO_SET(mmio, addr) ((mmio) = (addr)) #define CLKSRC_FSYS_MMIO_SET(mmio, addr) ((mmio) = (addr))
...@@ -277,6 +279,7 @@ extern void clocksource_unregister(struct clocksource*); ...@@ -277,6 +279,7 @@ extern void clocksource_unregister(struct clocksource*);
extern void clocksource_touch_watchdog(void); extern void clocksource_touch_watchdog(void);
extern struct clocksource* clocksource_get_next(void); extern struct clocksource* clocksource_get_next(void);
extern void clocksource_change_rating(struct clocksource *cs, int rating); extern void clocksource_change_rating(struct clocksource *cs, int rating);
extern void clocksource_suspend(void);
extern void clocksource_resume(void); extern void clocksource_resume(void);
extern struct clocksource * __init __weak clocksource_default_clock(void); extern struct clocksource * __init __weak clocksource_default_clock(void);
extern void clocksource_mark_unstable(struct clocksource *cs); extern void clocksource_mark_unstable(struct clocksource *cs);
......
...@@ -238,9 +238,6 @@ extern int tickadj; /* amount of adjustment per tick */ ...@@ -238,9 +238,6 @@ extern int tickadj; /* amount of adjustment per tick */
* phase-lock loop variables * phase-lock loop variables
*/ */
extern int time_status; /* clock synchronization status bits */ extern int time_status; /* clock synchronization status bits */
extern long time_maxerror; /* maximum error */
extern long time_esterror; /* estimated error */
extern long time_adjust; /* The amount of adjtime left */ extern long time_adjust; /* The amount of adjtime left */
extern void ntp_init(void); extern void ntp_init(void);
......
...@@ -256,7 +256,7 @@ static int posix_get_monotonic_coarse(clockid_t which_clock, ...@@ -256,7 +256,7 @@ static int posix_get_monotonic_coarse(clockid_t which_clock,
return 0; return 0;
} }
int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tp) static int posix_get_coarse_res(const clockid_t which_clock, struct timespec *tp)
{ {
*tp = ktime_to_timespec(KTIME_LOW_RES); *tp = ktime_to_timespec(KTIME_LOW_RES);
return 0; return 0;
......
...@@ -452,6 +452,18 @@ static inline int clocksource_watchdog_kthread(void *data) { return 0; } ...@@ -452,6 +452,18 @@ static inline int clocksource_watchdog_kthread(void *data) { return 0; }
#endif /* CONFIG_CLOCKSOURCE_WATCHDOG */ #endif /* CONFIG_CLOCKSOURCE_WATCHDOG */
/**
* clocksource_suspend - suspend the clocksource(s)
*/
void clocksource_suspend(void)
{
struct clocksource *cs;
list_for_each_entry_reverse(cs, &clocksource_list, list)
if (cs->suspend)
cs->suspend(cs);
}
/** /**
* clocksource_resume - resume the clocksource(s) * clocksource_resume - resume the clocksource(s)
*/ */
...@@ -461,7 +473,7 @@ void clocksource_resume(void) ...@@ -461,7 +473,7 @@ void clocksource_resume(void)
list_for_each_entry(cs, &clocksource_list, list) list_for_each_entry(cs, &clocksource_list, list)
if (cs->resume) if (cs->resume)
cs->resume(); cs->resume(cs);
clocksource_resume_watchdog(); clocksource_resume_watchdog();
} }
......
...@@ -58,10 +58,10 @@ static s64 time_offset; ...@@ -58,10 +58,10 @@ static s64 time_offset;
static long time_constant = 2; static long time_constant = 2;
/* maximum error (usecs): */ /* maximum error (usecs): */
long time_maxerror = NTP_PHASE_LIMIT; static long time_maxerror = NTP_PHASE_LIMIT;
/* estimated error (usecs): */ /* estimated error (usecs): */
long time_esterror = NTP_PHASE_LIMIT; static long time_esterror = NTP_PHASE_LIMIT;
/* frequency offset (scaled nsecs/secs): */ /* frequency offset (scaled nsecs/secs): */
static s64 time_freq; static s64 time_freq;
...@@ -142,11 +142,11 @@ static void ntp_update_offset(long offset) ...@@ -142,11 +142,11 @@ static void ntp_update_offset(long offset)
* Select how the frequency is to be controlled * Select how the frequency is to be controlled
* and in which mode (PLL or FLL). * and in which mode (PLL or FLL).
*/ */
secs = xtime.tv_sec - time_reftime; secs = get_seconds() - time_reftime;
if (unlikely(time_status & STA_FREQHOLD)) if (unlikely(time_status & STA_FREQHOLD))
secs = 0; secs = 0;
time_reftime = xtime.tv_sec; time_reftime = get_seconds();
offset64 = offset; offset64 = offset;
freq_adj = (offset64 * secs) << freq_adj = (offset64 * secs) <<
...@@ -368,7 +368,7 @@ static inline void process_adj_status(struct timex *txc, struct timespec *ts) ...@@ -368,7 +368,7 @@ static inline void process_adj_status(struct timex *txc, struct timespec *ts)
* reference time to current time. * reference time to current time.
*/ */
if (!(time_status & STA_PLL) && (txc->status & STA_PLL)) if (!(time_status & STA_PLL) && (txc->status & STA_PLL))
time_reftime = xtime.tv_sec; time_reftime = get_seconds();
/* only set allowed bits */ /* only set allowed bits */
time_status &= STA_RONLY; time_status &= STA_RONLY;
......
...@@ -622,6 +622,7 @@ static int timekeeping_suspend(struct sys_device *dev, pm_message_t state) ...@@ -622,6 +622,7 @@ static int timekeeping_suspend(struct sys_device *dev, pm_message_t state)
write_sequnlock_irqrestore(&xtime_lock, flags); write_sequnlock_irqrestore(&xtime_lock, flags);
clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL); clockevents_notify(CLOCK_EVT_NOTIFY_SUSPEND, NULL);
clocksource_suspend();
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment