static void sh_cmt_clock_event_mode(enum clock_event_mode mode, struct clock_event_device *ced) { struct sh_cmt_priv *p = ced_to_sh_cmt(ced); /* deal with old setting first */ switch (ced->mode) { case CLOCK_EVT_MODE_PERIODIC: case CLOCK_EVT_MODE_ONESHOT: sh_cmt_stop(p, FLAG_CLOCKEVENT); break; default: break; } switch (mode) { case CLOCK_EVT_MODE_PERIODIC: pr_info("sh_cmt: %s used for periodic clock events\n", ced->name); sh_cmt_clock_event_start(p, 1); break; case CLOCK_EVT_MODE_ONESHOT: pr_info("sh_cmt: %s used for oneshot clock events\n", ced->name); sh_cmt_clock_event_start(p, 0); break; case CLOCK_EVT_MODE_SHUTDOWN: case CLOCK_EVT_MODE_UNUSED: sh_cmt_stop(p, FLAG_CLOCKEVENT); break; default: break; } }
static void sh_cmt_clock_event_resume(struct clock_event_device *ced) { struct sh_cmt_priv *p = ced_to_sh_cmt(ced); clk_prepare(p->clk); pm_genpd_syscore_poweron(&p->pdev->dev); }
static int sh_cmt_clock_event_next(unsigned long delta, struct clock_event_device *ced) { struct sh_cmt_priv *p = ced_to_sh_cmt(ced); BUG_ON(ced->mode != CLOCK_EVT_MODE_ONESHOT); if (likely(p->flags & FLAG_IRQCONTEXT)) p->next_match_value = delta; else sh_cmt_set_next(p, delta); return 0; }