mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-04-01 03:54:02 +00:00
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
This commit is contained in:
commit
e56425b135
10 changed files with 34 additions and 42 deletions
|
@ -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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
#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 {
|
||||||
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)
|
||||||
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,
|
||||||
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)
|
||||||
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,
|
||||||
* @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 {
|
||||||
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*);
|
||||||
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 */
|
||||||
* 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,
|
||||||
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; }
|
||||||
|
|
||||||
#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)
|
||||||
|
|
||||||
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;
|
||||||
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)
|
||||||
* 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)
|
||||||
* 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)
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue