Commit 2bcc4da3 authored by Viresh Kumar's avatar Viresh Kumar Committed by Daniel Lezcano

clockevents/drivers/sh_tmu: Migrate to new 'set-state' interface

Migrate sh_tmu driver to the new 'set-state' interface provided by
clockevents core, the earlier 'set-mode' interface is marked obsolete
now.

This also enables us to implement callbacks for new states of clockevent
devices, for example: ONESHOT_STOPPED.

Cc: Magnus Damm <damm+renesas@opensource.se>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
parent 19a9ffb3
...@@ -240,7 +240,7 @@ static irqreturn_t sh_tmu_interrupt(int irq, void *dev_id) ...@@ -240,7 +240,7 @@ static irqreturn_t sh_tmu_interrupt(int irq, void *dev_id)
struct sh_tmu_channel *ch = dev_id; struct sh_tmu_channel *ch = dev_id;
/* disable or acknowledge interrupt */ /* disable or acknowledge interrupt */
if (ch->ced.mode == CLOCK_EVT_MODE_ONESHOT) if (clockevent_state_oneshot(&ch->ced))
sh_tmu_write(ch, TCR, TCR_TPSC_CLK4); sh_tmu_write(ch, TCR, TCR_TPSC_CLK4);
else else
sh_tmu_write(ch, TCR, TCR_UNIE | TCR_TPSC_CLK4); sh_tmu_write(ch, TCR, TCR_UNIE | TCR_TPSC_CLK4);
...@@ -358,42 +358,37 @@ static void sh_tmu_clock_event_start(struct sh_tmu_channel *ch, int periodic) ...@@ -358,42 +358,37 @@ static void sh_tmu_clock_event_start(struct sh_tmu_channel *ch, int periodic)
} }
} }
static void sh_tmu_clock_event_mode(enum clock_event_mode mode, static int sh_tmu_clock_event_shutdown(struct clock_event_device *ced)
struct clock_event_device *ced)
{ {
struct sh_tmu_channel *ch = ced_to_sh_tmu(ced); struct sh_tmu_channel *ch = ced_to_sh_tmu(ced);
int disabled = 0;
/* deal with old setting first */
switch (ced->mode) {
case CLOCK_EVT_MODE_PERIODIC:
case CLOCK_EVT_MODE_ONESHOT:
sh_tmu_disable(ch); sh_tmu_disable(ch);
disabled = 1; return 0;
break; }
default:
break;
}
switch (mode) { static int sh_tmu_clock_event_set_state(struct clock_event_device *ced,
case CLOCK_EVT_MODE_PERIODIC: int periodic)
dev_info(&ch->tmu->pdev->dev, {
"ch%u: used for periodic clock events\n", ch->index); struct sh_tmu_channel *ch = ced_to_sh_tmu(ced);
sh_tmu_clock_event_start(ch, 1);
break; /* deal with old setting first */
case CLOCK_EVT_MODE_ONESHOT: if (clockevent_state_oneshot(ced) || clockevent_state_periodic(ced))
dev_info(&ch->tmu->pdev->dev,
"ch%u: used for oneshot clock events\n", ch->index);
sh_tmu_clock_event_start(ch, 0);
break;
case CLOCK_EVT_MODE_UNUSED:
if (!disabled)
sh_tmu_disable(ch); sh_tmu_disable(ch);
break;
case CLOCK_EVT_MODE_SHUTDOWN: dev_info(&ch->tmu->pdev->dev, "ch%u: used for %s clock events\n",
default: ch->index, periodic ? "periodic" : "oneshot");
break; sh_tmu_clock_event_start(ch, periodic);
} return 0;
}
static int sh_tmu_clock_event_set_oneshot(struct clock_event_device *ced)
{
return sh_tmu_clock_event_set_state(ced, 0);
}
static int sh_tmu_clock_event_set_periodic(struct clock_event_device *ced)
{
return sh_tmu_clock_event_set_state(ced, 1);
} }
static int sh_tmu_clock_event_next(unsigned long delta, static int sh_tmu_clock_event_next(unsigned long delta,
...@@ -401,7 +396,7 @@ static int sh_tmu_clock_event_next(unsigned long delta, ...@@ -401,7 +396,7 @@ static int sh_tmu_clock_event_next(unsigned long delta,
{ {
struct sh_tmu_channel *ch = ced_to_sh_tmu(ced); struct sh_tmu_channel *ch = ced_to_sh_tmu(ced);
BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT); BUG_ON(!clockevent_state_oneshot(ced));
/* program new delta value */ /* program new delta value */
sh_tmu_set_next(ch, delta, 0); sh_tmu_set_next(ch, delta, 0);
...@@ -430,7 +425,9 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch, ...@@ -430,7 +425,9 @@ static void sh_tmu_register_clockevent(struct sh_tmu_channel *ch,
ced->rating = 200; ced->rating = 200;
ced->cpumask = cpu_possible_mask; ced->cpumask = cpu_possible_mask;
ced->set_next_event = sh_tmu_clock_event_next; ced->set_next_event = sh_tmu_clock_event_next;
ced->set_mode = sh_tmu_clock_event_mode; ced->set_state_shutdown = sh_tmu_clock_event_shutdown;
ced->set_state_periodic = sh_tmu_clock_event_set_periodic;
ced->set_state_oneshot = sh_tmu_clock_event_set_oneshot;
ced->suspend = sh_tmu_clock_event_suspend; ced->suspend = sh_tmu_clock_event_suspend;
ced->resume = sh_tmu_clock_event_resume; ced->resume = sh_tmu_clock_event_resume;
......
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