Skip to content

Commit

Permalink
clocksource: sh_cmt: Add clk_prepare/unprepare support
Browse files Browse the repository at this point in the history
Prepare the clock at probe time, as there is no other appropriate place
in the driver where we're allowed to sleep.

Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
  • Loading branch information
Laurent Pinchart authored and Daniel Lezcano committed Dec 18, 2013
1 parent dc1ccc4 commit 57dee99
Showing 1 changed file with 16 additions and 4 deletions.
20 changes: 16 additions & 4 deletions drivers/clocksource/sh_cmt.c
Original file line number Diff line number Diff line change
Expand Up @@ -634,12 +634,18 @@ static int sh_cmt_clock_event_next(unsigned long delta,

static void sh_cmt_clock_event_suspend(struct clock_event_device *ced)
{
pm_genpd_syscore_poweroff(&ced_to_sh_cmt(ced)->pdev->dev);
struct sh_cmt_priv *p = ced_to_sh_cmt(ced);

pm_genpd_syscore_poweroff(&p->pdev->dev);
clk_unprepare(p->clk);
}

static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
{
pm_genpd_syscore_poweron(&ced_to_sh_cmt(ced)->pdev->dev);
struct sh_cmt_priv *p = ced_to_sh_cmt(ced);

clk_prepare(p->clk);
pm_genpd_syscore_poweron(&p->pdev->dev);
}

static void sh_cmt_register_clockevent(struct sh_cmt_priv *p,
Expand Down Expand Up @@ -737,6 +743,10 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
goto err2;
}

ret = clk_prepare(p->clk);
if (ret < 0)
goto err3;

if (res2 && (resource_size(res2) == 4)) {
/* assume both CMSTR and CMCSR to be 32-bit */
p->read_control = sh_cmt_read32;
Expand Down Expand Up @@ -773,19 +783,21 @@ static int sh_cmt_setup(struct sh_cmt_priv *p, struct platform_device *pdev)
cfg->clocksource_rating);
if (ret) {
dev_err(&p->pdev->dev, "registration failed\n");
goto err3;
goto err4;
}
p->cs_enabled = false;

ret = setup_irq(irq, &p->irqaction);
if (ret) {
dev_err(&p->pdev->dev, "failed to request irq %d\n", irq);
goto err3;
goto err4;
}

platform_set_drvdata(pdev, p);

return 0;
err4:
clk_unprepare(p->clk);
err3:
clk_put(p->clk);
err2:
Expand Down

0 comments on commit 57dee99

Please sign in to comment.