Commit 051b782e authored by Viresh Kumar's avatar Viresh Kumar Committed by Daniel Lezcano

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

Migrate sh_cmt 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 b49b5704
...@@ -538,7 +538,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id) ...@@ -538,7 +538,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)
if (ch->flags & FLAG_CLOCKEVENT) { if (ch->flags & FLAG_CLOCKEVENT) {
if (!(ch->flags & FLAG_SKIPEVENT)) { if (!(ch->flags & FLAG_SKIPEVENT)) {
if (ch->ced.mode == CLOCK_EVT_MODE_ONESHOT) { if (clockevent_state_oneshot(&ch->ced)) {
ch->next_match_value = ch->max_match_value; ch->next_match_value = ch->max_match_value;
ch->flags |= FLAG_REPROGRAM; ch->flags |= FLAG_REPROGRAM;
} }
...@@ -554,7 +554,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id) ...@@ -554,7 +554,7 @@ static irqreturn_t sh_cmt_interrupt(int irq, void *dev_id)
sh_cmt_clock_event_program_verify(ch, 1); sh_cmt_clock_event_program_verify(ch, 1);
if (ch->flags & FLAG_CLOCKEVENT) if (ch->flags & FLAG_CLOCKEVENT)
if ((ch->ced.mode == CLOCK_EVT_MODE_SHUTDOWN) if ((clockevent_state_shutdown(&ch->ced))
|| (ch->match_value == ch->next_match_value)) || (ch->match_value == ch->next_match_value))
ch->flags &= ~FLAG_REPROGRAM; ch->flags &= ~FLAG_REPROGRAM;
} }
...@@ -720,39 +720,37 @@ static void sh_cmt_clock_event_start(struct sh_cmt_channel *ch, int periodic) ...@@ -720,39 +720,37 @@ static void sh_cmt_clock_event_start(struct sh_cmt_channel *ch, int periodic)
sh_cmt_set_next(ch, ch->max_match_value); sh_cmt_set_next(ch, ch->max_match_value);
} }
static void sh_cmt_clock_event_mode(enum clock_event_mode mode, static int sh_cmt_clock_event_shutdown(struct clock_event_device *ced)
struct clock_event_device *ced) {
struct sh_cmt_channel *ch = ced_to_sh_cmt(ced);
sh_cmt_stop(ch, FLAG_CLOCKEVENT);
return 0;
}
static int sh_cmt_clock_event_set_state(struct clock_event_device *ced,
int periodic)
{ {
struct sh_cmt_channel *ch = ced_to_sh_cmt(ced); struct sh_cmt_channel *ch = ced_to_sh_cmt(ced);
/* deal with old setting first */ /* deal with old setting first */
switch (ced->mode) { if (clockevent_state_oneshot(ced) || clockevent_state_periodic(ced))
case CLOCK_EVT_MODE_PERIODIC:
case CLOCK_EVT_MODE_ONESHOT:
sh_cmt_stop(ch, FLAG_CLOCKEVENT); sh_cmt_stop(ch, FLAG_CLOCKEVENT);
break;
default:
break;
}
switch (mode) { dev_info(&ch->cmt->pdev->dev, "ch%u: used for %s clock events\n",
case CLOCK_EVT_MODE_PERIODIC: ch->index, periodic ? "periodic" : "oneshot");
dev_info(&ch->cmt->pdev->dev, sh_cmt_clock_event_start(ch, periodic);
"ch%u: used for periodic clock events\n", ch->index); return 0;
sh_cmt_clock_event_start(ch, 1); }
break;
case CLOCK_EVT_MODE_ONESHOT: static int sh_cmt_clock_event_set_oneshot(struct clock_event_device *ced)
dev_info(&ch->cmt->pdev->dev, {
"ch%u: used for oneshot clock events\n", ch->index); return sh_cmt_clock_event_set_state(ced, 0);
sh_cmt_clock_event_start(ch, 0); }
break;
case CLOCK_EVT_MODE_SHUTDOWN: static int sh_cmt_clock_event_set_periodic(struct clock_event_device *ced)
case CLOCK_EVT_MODE_UNUSED: {
sh_cmt_stop(ch, FLAG_CLOCKEVENT); return sh_cmt_clock_event_set_state(ced, 1);
break;
default:
break;
}
} }
static int sh_cmt_clock_event_next(unsigned long delta, static int sh_cmt_clock_event_next(unsigned long delta,
...@@ -760,7 +758,7 @@ static int sh_cmt_clock_event_next(unsigned long delta, ...@@ -760,7 +758,7 @@ static int sh_cmt_clock_event_next(unsigned long delta,
{ {
struct sh_cmt_channel *ch = ced_to_sh_cmt(ced); struct sh_cmt_channel *ch = ced_to_sh_cmt(ced);
BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT); BUG_ON(!clockevent_state_oneshot(ced));
if (likely(ch->flags & FLAG_IRQCONTEXT)) if (likely(ch->flags & FLAG_IRQCONTEXT))
ch->next_match_value = delta - 1; ch->next_match_value = delta - 1;
else else
...@@ -814,7 +812,9 @@ static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch, ...@@ -814,7 +812,9 @@ static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
ced->rating = 125; ced->rating = 125;
ced->cpumask = cpu_possible_mask; ced->cpumask = cpu_possible_mask;
ced->set_next_event = sh_cmt_clock_event_next; ced->set_next_event = sh_cmt_clock_event_next;
ced->set_mode = sh_cmt_clock_event_mode; ced->set_state_shutdown = sh_cmt_clock_event_shutdown;
ced->set_state_periodic = sh_cmt_clock_event_set_periodic;
ced->set_state_oneshot = sh_cmt_clock_event_set_oneshot;
ced->suspend = sh_cmt_clock_event_suspend; ced->suspend = sh_cmt_clock_event_suspend;
ced->resume = sh_cmt_clock_event_resume; ced->resume = sh_cmt_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