| From a2e54bf8c7bbfc421b16e28fd2ea7770d1c11cf5 Mon Sep 17 00:00:00 2001 |
| From: Nicolai Stange <nicstange@gmail.com> |
| Date: Mon, 6 Feb 2017 22:12:01 +0100 |
| Subject: [PATCH 001/286] clocksource: em_sti: Split clock prepare and enable |
| steps |
| |
| Currently, the em_sti driver prepares and enables the needed clock in |
| em_sti_enable(), potentially called through its clockevent device's |
| ->set_state_oneshot(). |
| |
| However, the clk_prepare() step may sleep whereas tick_program_event() and |
| thus, ->set_state_oneshot(), can be called in atomic context. |
| |
| Split the clk_prepare_enable() in em_sti_enable() into two steps: |
| - prepare the clock at device probing via clk_prepare() |
| - and enable it in em_sti_enable() via clk_enable(). |
| Slightly reorder resource initialization in em_sti_probe() in order to |
| facilitate error handling in later patches. |
| |
| Signed-off-by: Nicolai Stange <nicstange@gmail.com> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| (cherry picked from commit 3814ae092d36da04d5fbaf777c1564dc4ee68559) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/clocksource/em_sti.c | 21 ++++++++++++++------- |
| 1 file changed, 14 insertions(+), 7 deletions(-) |
| |
| --- a/drivers/clocksource/em_sti.c |
| +++ b/drivers/clocksource/em_sti.c |
| @@ -78,7 +78,7 @@ static int em_sti_enable(struct em_sti_p |
| int ret; |
| |
| /* enable clock */ |
| - ret = clk_prepare_enable(p->clk); |
| + ret = clk_enable(p->clk); |
| if (ret) { |
| dev_err(&p->pdev->dev, "cannot enable clock\n"); |
| return ret; |
| @@ -107,7 +107,7 @@ static void em_sti_disable(struct em_sti |
| em_sti_write(p, STI_INTENCLR, 3); |
| |
| /* stop clock */ |
| - clk_disable_unprepare(p->clk); |
| + clk_disable(p->clk); |
| } |
| |
| static cycle_t em_sti_count(struct em_sti_priv *p) |
| @@ -303,6 +303,7 @@ static int em_sti_probe(struct platform_ |
| struct em_sti_priv *p; |
| struct resource *res; |
| int irq; |
| + int ret; |
| |
| p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL); |
| if (p == NULL) |
| @@ -323,6 +324,13 @@ static int em_sti_probe(struct platform_ |
| if (IS_ERR(p->base)) |
| return PTR_ERR(p->base); |
| |
| + if (devm_request_irq(&pdev->dev, irq, em_sti_interrupt, |
| + IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING, |
| + dev_name(&pdev->dev), p)) { |
| + dev_err(&pdev->dev, "failed to request low IRQ\n"); |
| + return -ENOENT; |
| + } |
| + |
| /* get hold of clock */ |
| p->clk = devm_clk_get(&pdev->dev, "sclk"); |
| if (IS_ERR(p->clk)) { |
| @@ -330,11 +338,10 @@ static int em_sti_probe(struct platform_ |
| return PTR_ERR(p->clk); |
| } |
| |
| - if (devm_request_irq(&pdev->dev, irq, em_sti_interrupt, |
| - IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING, |
| - dev_name(&pdev->dev), p)) { |
| - dev_err(&pdev->dev, "failed to request low IRQ\n"); |
| - return -ENOENT; |
| + ret = clk_prepare(p->clk); |
| + if (ret < 0) { |
| + dev_err(&pdev->dev, "cannot prepare clock\n"); |
| + return ret; |
| } |
| |
| raw_spin_lock_init(&p->lock); |