Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 554ef387 authored by Viresh Kumar's avatar Viresh Kumar Committed by Ingo Molnar
Browse files

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Acked-by: default avatarPeter 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: default avatarIngo Molnar <mingo@kernel.org>
parent fe5fba05
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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 *);
+21 −9
Original line number Diff line number Diff line
@@ -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;
	}

+1 −1
Original line number Diff line number Diff line
@@ -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:
+1 −1
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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);

Loading