clockevents: Handle tick device's resume separately
Upcoming patch will redefine possible states of a clockevent device. The RESUME mode is a special case only for tick's clockevent devices. In future it can be replaced by ->resume() callback already available for clockevent devices. Lets handle it separately so that clockevents_set_mode() only handles states valid across all devices. This also renames set_mode_resume() to tick_resume() to make it more explicit. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Kevin Hilman <khilman@linaro.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Preeti U Murthy <preeti@linux.vnet.ibm.com> Cc: linaro-kernel@lists.linaro.org Cc: linaro-networking@linaro.org Cc: linux-arm-kernel@lists.infradead.org Link: http://lkml.kernel.org/r/c1b0112410870f49e7bf06958e1483eac6c15e20.1425037853.git.viresh.kumar@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
fe5fba05b4
commit
554ef3876c
6 changed files with 28 additions and 15 deletions
|
@ -87,7 +87,7 @@ enum clock_event_mode {
|
|||
* @set_mode_periodic: switch mode to periodic, if !set_mode
|
||||
* @set_mode_oneshot: switch mode to oneshot, if !set_mode
|
||||
* @set_mode_shutdown: switch mode to shutdown, if !set_mode
|
||||
* @set_mode_resume: resume clkevt device, if !set_mode
|
||||
* @tick_resume: resume clkevt device, if !set_mode
|
||||
* @broadcast: function to broadcast events
|
||||
* @min_delta_ticks: minimum delta value in ticks stored for reconfiguration
|
||||
* @max_delta_ticks: maximum delta value in ticks stored for reconfiguration
|
||||
|
@ -125,7 +125,7 @@ struct clock_event_device {
|
|||
int (*set_mode_periodic)(struct clock_event_device *);
|
||||
int (*set_mode_oneshot)(struct clock_event_device *);
|
||||
int (*set_mode_shutdown)(struct clock_event_device *);
|
||||
int (*set_mode_resume)(struct clock_event_device *);
|
||||
int (*tick_resume)(struct clock_event_device *);
|
||||
|
||||
void (*broadcast)(const struct cpumask *mask);
|
||||
void (*suspend)(struct clock_event_device *);
|
||||
|
|
|
@ -100,7 +100,7 @@ static int __clockevents_set_mode(struct clock_event_device *dev,
|
|||
/* Transition with legacy set_mode() callback */
|
||||
if (dev->set_mode) {
|
||||
/* Legacy callback doesn't support new modes */
|
||||
if (mode > CLOCK_EVT_MODE_RESUME)
|
||||
if (mode > CLOCK_EVT_MODE_ONESHOT)
|
||||
return -ENOSYS;
|
||||
dev->set_mode(mode, dev);
|
||||
return 0;
|
||||
|
@ -133,13 +133,6 @@ static int __clockevents_set_mode(struct clock_event_device *dev,
|
|||
return -ENOSYS;
|
||||
return dev->set_mode_oneshot(dev);
|
||||
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
/* Optional callback */
|
||||
if (dev->set_mode_resume)
|
||||
return dev->set_mode_resume(dev);
|
||||
else
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@ -184,6 +177,25 @@ void clockevents_shutdown(struct clock_event_device *dev)
|
|||
dev->next_event.tv64 = KTIME_MAX;
|
||||
}
|
||||
|
||||
/**
|
||||
* clockevents_tick_resume - Resume the tick device before using it again
|
||||
* @dev: device to resume
|
||||
*/
|
||||
int clockevents_tick_resume(struct clock_event_device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (dev->set_mode)
|
||||
dev->set_mode(CLOCK_EVT_MODE_RESUME, dev);
|
||||
else if (dev->tick_resume)
|
||||
ret = dev->tick_resume(dev);
|
||||
|
||||
if (likely(!ret))
|
||||
dev->mode = CLOCK_EVT_MODE_RESUME;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST
|
||||
|
||||
/* Limit min_delta to a jiffie */
|
||||
|
@ -433,7 +445,7 @@ static int clockevents_sanity_check(struct clock_event_device *dev)
|
|||
if (dev->set_mode) {
|
||||
/* We shouldn't be supporting new modes now */
|
||||
WARN_ON(dev->set_mode_periodic || dev->set_mode_oneshot ||
|
||||
dev->set_mode_shutdown || dev->set_mode_resume);
|
||||
dev->set_mode_shutdown || dev->tick_resume);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -464,7 +464,7 @@ int tick_resume_broadcast(void)
|
|||
bc = tick_broadcast_device.evtdev;
|
||||
|
||||
if (bc) {
|
||||
clockevents_set_mode(bc, CLOCK_EVT_MODE_RESUME);
|
||||
clockevents_tick_resume(bc);
|
||||
|
||||
switch (tick_broadcast_device.mode) {
|
||||
case TICKDEV_MODE_PERIODIC:
|
||||
|
|
|
@ -384,7 +384,7 @@ void tick_resume(void)
|
|||
struct tick_device *td = this_cpu_ptr(&tick_cpu_device);
|
||||
int broadcast = tick_resume_broadcast();
|
||||
|
||||
clockevents_set_mode(td->evtdev, CLOCK_EVT_MODE_RESUME);
|
||||
clockevents_tick_resume(td->evtdev);
|
||||
|
||||
if (!broadcast) {
|
||||
if (td->mode == TICKDEV_MODE_PERIODIC)
|
||||
|
|
|
@ -32,6 +32,7 @@ extern bool tick_check_replacement(struct clock_event_device *curdev,
|
|||
extern void tick_install_replacement(struct clock_event_device *dev);
|
||||
|
||||
extern void clockevents_shutdown(struct clock_event_device *dev);
|
||||
extern int clockevents_tick_resume(struct clock_event_device *dev);
|
||||
|
||||
extern ssize_t sysfs_get_uname(const char *buf, char *dst, size_t cnt);
|
||||
|
||||
|
|
|
@ -251,9 +251,9 @@ print_tickdevice(struct seq_file *m, struct tick_device *td, int cpu)
|
|||
SEQ_printf(m, "\n");
|
||||
}
|
||||
|
||||
if (dev->set_mode_resume) {
|
||||
if (dev->tick_resume) {
|
||||
SEQ_printf(m, " resume: ");
|
||||
print_name_offset(m, dev->set_mode_resume);
|
||||
print_name_offset(m, dev->tick_resume);
|
||||
SEQ_printf(m, "\n");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue