* [PATCH v4 0/4] ARM: at91: Properly handle slow clock
@ 2015-08-16 9:23 Alexandre Belloni
2015-08-16 9:23 ` [PATCH v4 4/4] misc: atmel_tclib: get and use " Alexandre Belloni
0 siblings, 1 reply; 6+ messages in thread
From: Alexandre Belloni @ 2015-08-16 9:23 UTC (permalink / raw)
To: Nicolas Ferre
Cc: Boris Brezillon, linux-arm-kernel, linux-kernel,
Alexandre Belloni, Daniel Lezcano, linux-pwm, linux-watchdog,
Thierry Reding, Thomas Gleixner, Wim Van Sebroeck
Hi,
It was discovered that all the slow clock user were not properly claiming it.
This can end up in a system hang because the last registered user is releasing
it, and it gets disabled.
commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system hang")
was a workaround. This series is adding the slow clock to the necessary drivers
to avoid the issue and then removes that workaround.
Changes in v4:
- enable slow_clk before t2_clk in tcb_clksrc.c
- properly disable slow_clk in the error path of atmel_tcb_pwm_probe()
- added Daniel's acks
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: linux-pwm@vger.kernel.org
Cc: linux-watchdog@vger.kernel.org
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Wim Van Sebroeck <wim@iguana.be>
Alexandre Belloni (2):
watchdog: at91sam9: get and use slow clock
clocksource: atmel-st: get and use slow clock
Boris Brezillon (2):
clocksource: tcb_clksrc: fix setup_clkevents error path
misc: atmel_tclib: get and use slow clock
drivers/clocksource/tcb_clksrc.c | 12 ++++++++++--
drivers/clocksource/timer-atmel-st.c | 31 ++++++++++++++++++++++---------
drivers/misc/atmel_tclib.c | 4 ++++
drivers/pwm/pwm-atmel-tcb.c | 26 +++++++++++++++++++-------
drivers/watchdog/at91sam9_wdt.c | 22 ++++++++++++++++++++--
include/linux/atmel_tc.h | 1 +
6 files changed, 76 insertions(+), 20 deletions(-)
--
2.1.4
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v4 4/4] misc: atmel_tclib: get and use slow clock 2015-08-16 9:23 [PATCH v4 0/4] ARM: at91: Properly handle slow clock Alexandre Belloni @ 2015-08-16 9:23 ` Alexandre Belloni 2015-08-19 21:24 ` Daniel Lezcano 2015-10-05 15:27 ` Thierry Reding 0 siblings, 2 replies; 6+ messages in thread From: Alexandre Belloni @ 2015-08-16 9:23 UTC (permalink / raw) To: Nicolas Ferre Cc: Boris Brezillon, linux-pwm, Daniel Lezcano, linux-kernel, Thierry Reding, Alexandre Belloni, linux-arm-kernel From: Boris Brezillon <boris.brezillon@free-electrons.com> Commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system hang") added a workaround for the slow clock as it is not properly handled by its users. Get and use the slow clock as it is necessary for the timer counters. Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> --- Cc: Daniel Lezcano <daniel.lezcano@linaro.org> Cc: Thierry Reding <thierry.reding@gmail.com> Cc: linux-pwm@vger.kernel.org drivers/clocksource/tcb_clksrc.c | 10 +++++++++- drivers/misc/atmel_tclib.c | 4 ++++ drivers/pwm/pwm-atmel-tcb.c | 26 +++++++++++++++++++------- include/linux/atmel_tc.h | 1 + 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c index b9b7277173c2..ba1e5d55d3bf 100644 --- a/drivers/clocksource/tcb_clksrc.c +++ b/drivers/clocksource/tcb_clksrc.c @@ -184,10 +184,17 @@ static int __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) struct clk *t2_clk = tc->clk[2]; int irq = tc->irq[2]; + ret = clk_prepare_enable(tc->slow_clk); + if (ret) + return ret; + /* try to enable t2 clk to avoid future errors in mode change */ ret = clk_prepare_enable(t2_clk); - if (ret) + if (ret) { + clk_disable_unprepare(tc->slow_clk); return ret; + } + clk_disable(t2_clk); clkevt.regs = tc->regs; @@ -200,6 +207,7 @@ static int __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) ret = request_irq(irq, ch2_irq, IRQF_TIMER, "tc_clkevt", &clkevt); if (ret) { clk_unprepare(t2_clk); + clk_disable_unprepare(tc->slow_clk); return ret; } diff --git a/drivers/misc/atmel_tclib.c b/drivers/misc/atmel_tclib.c index 0ca05c3ec8d6..ac24a4bd63f7 100644 --- a/drivers/misc/atmel_tclib.c +++ b/drivers/misc/atmel_tclib.c @@ -125,6 +125,10 @@ static int __init tc_probe(struct platform_device *pdev) if (IS_ERR(clk)) return PTR_ERR(clk); + tc->slow_clk = devm_clk_get(&pdev->dev, "slow_clk"); + if (IS_ERR(tc->slow_clk)) + return PTR_ERR(tc->slow_clk); + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); tc->regs = devm_ioremap_resource(&pdev->dev, r); if (IS_ERR(tc->regs)) diff --git a/drivers/pwm/pwm-atmel-tcb.c b/drivers/pwm/pwm-atmel-tcb.c index d14e0677c92d..f64ee392f620 100644 --- a/drivers/pwm/pwm-atmel-tcb.c +++ b/drivers/pwm/pwm-atmel-tcb.c @@ -305,7 +305,7 @@ static int atmel_tcb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, */ if (i == 5) { i = slowclk; - rate = 32768; + rate = clk_get_rate(tc->slow_clk); min = div_u64(NSEC_PER_SEC, rate); max = min << tc->tcb_config->counter_width; @@ -387,9 +387,9 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev) tcbpwm = devm_kzalloc(&pdev->dev, sizeof(*tcbpwm), GFP_KERNEL); if (tcbpwm == NULL) { - atmel_tc_free(tc); + err = -ENOMEM; dev_err(&pdev->dev, "failed to allocate memory\n"); - return -ENOMEM; + goto err_free_tc; } tcbpwm->chip.dev = &pdev->dev; @@ -400,17 +400,27 @@ static int atmel_tcb_pwm_probe(struct platform_device *pdev) tcbpwm->chip.npwm = NPWM; tcbpwm->tc = tc; + err = clk_prepare_enable(tc->slow_clk); + if (err) + goto err_free_tc; + spin_lock_init(&tcbpwm->lock); err = pwmchip_add(&tcbpwm->chip); - if (err < 0) { - atmel_tc_free(tc); - return err; - } + if (err < 0) + goto err_disable_clk; platform_set_drvdata(pdev, tcbpwm); return 0; + +err_disable_clk: + clk_disable_unprepare(tcbpwm->tc->slow_clk); + +err_free_tc: + atmel_tc_free(tc); + + return err; } static int atmel_tcb_pwm_remove(struct platform_device *pdev) @@ -418,6 +428,8 @@ static int atmel_tcb_pwm_remove(struct platform_device *pdev) struct atmel_tcb_pwm_chip *tcbpwm = platform_get_drvdata(pdev); int err; + clk_disable_unprepare(tcbpwm->tc->slow_clk); + err = pwmchip_remove(&tcbpwm->chip); if (err < 0) return err; diff --git a/include/linux/atmel_tc.h b/include/linux/atmel_tc.h index b87c1c7c242a..468fdfa643f0 100644 --- a/include/linux/atmel_tc.h +++ b/include/linux/atmel_tc.h @@ -67,6 +67,7 @@ struct atmel_tc { const struct atmel_tcb_config *tcb_config; int irq[3]; struct clk *clk[3]; + struct clk *slow_clk; struct list_head node; bool allocated; }; -- 2.1.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] misc: atmel_tclib: get and use slow clock 2015-08-16 9:23 ` [PATCH v4 4/4] misc: atmel_tclib: get and use " Alexandre Belloni @ 2015-08-19 21:24 ` Daniel Lezcano 2015-10-05 15:27 ` Thierry Reding 1 sibling, 0 replies; 6+ messages in thread From: Daniel Lezcano @ 2015-08-19 21:24 UTC (permalink / raw) To: Alexandre Belloni, Nicolas Ferre Cc: Boris Brezillon, linux-arm-kernel, linux-kernel, Thierry Reding, linux-pwm On 08/16/2015 11:23 AM, Alexandre Belloni wrote: > From: Boris Brezillon <boris.brezillon@free-electrons.com> > > Commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system > hang") added a workaround for the slow clock as it is not properly handled > by its users. > > Get and use the slow clock as it is necessary for the timer counters. > > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > --- Acked-by: Daniel Lezcano <daniel.lezcano@linaro.org> -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] misc: atmel_tclib: get and use slow clock 2015-08-16 9:23 ` [PATCH v4 4/4] misc: atmel_tclib: get and use " Alexandre Belloni 2015-08-19 21:24 ` Daniel Lezcano @ 2015-10-05 15:27 ` Thierry Reding 2015-10-05 16:58 ` Alexandre Belloni 1 sibling, 1 reply; 6+ messages in thread From: Thierry Reding @ 2015-10-05 15:27 UTC (permalink / raw) To: Alexandre Belloni Cc: Nicolas Ferre, Boris Brezillon, linux-arm-kernel, linux-kernel, Daniel Lezcano, linux-pwm [-- Attachment #1: Type: text/plain, Size: 1125 bytes --] On Sun, Aug 16, 2015 at 11:23:46AM +0200, Alexandre Belloni wrote: > From: Boris Brezillon <boris.brezillon@free-electrons.com> > > Commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system > hang") added a workaround for the slow clock as it is not properly handled > by its users. > > Get and use the slow clock as it is necessary for the timer counters. > > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > --- > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > Cc: Thierry Reding <thierry.reding@gmail.com> > Cc: linux-pwm@vger.kernel.org > drivers/clocksource/tcb_clksrc.c | 10 +++++++++- > drivers/misc/atmel_tclib.c | 4 ++++ > drivers/pwm/pwm-atmel-tcb.c | 26 +++++++++++++++++++------- > include/linux/atmel_tc.h | 1 + > 4 files changed, 33 insertions(+), 8 deletions(-) This doesn't seem to apply anymore. Does it need to be rebased? Or do I need some other patch as a dependency? Thierry [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] misc: atmel_tclib: get and use slow clock 2015-10-05 15:27 ` Thierry Reding @ 2015-10-05 16:58 ` Alexandre Belloni 2015-10-06 7:33 ` Thierry Reding 0 siblings, 1 reply; 6+ messages in thread From: Alexandre Belloni @ 2015-10-05 16:58 UTC (permalink / raw) To: Thierry Reding Cc: Nicolas Ferre, Boris Brezillon, linux-arm-kernel, linux-kernel, Daniel Lezcano, linux-pwm On 05/10/2015 at 17:27:06 +0200, Thierry Reding wrote : > On Sun, Aug 16, 2015 at 11:23:46AM +0200, Alexandre Belloni wrote: > > From: Boris Brezillon <boris.brezillon@free-electrons.com> > > > > Commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system > > hang") added a workaround for the slow clock as it is not properly handled > > by its users. > > > > Get and use the slow clock as it is necessary for the timer counters. > > > > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> > > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > --- > > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > > Cc: Thierry Reding <thierry.reding@gmail.com> > > Cc: linux-pwm@vger.kernel.org > > drivers/clocksource/tcb_clksrc.c | 10 +++++++++- > > drivers/misc/atmel_tclib.c | 4 ++++ > > drivers/pwm/pwm-atmel-tcb.c | 26 +++++++++++++++++++------- > > include/linux/atmel_tc.h | 1 + > > 4 files changed, 33 insertions(+), 8 deletions(-) > > This doesn't seem to apply anymore. Does it need to be rebased? Or do I > need some other patch as a dependency? > It will apply cleanly after [PATCH v4 3/4] clocksource: tcb_clksrc: fix setup_clkevents error path It already has Daniel's ack so you can also take it if you want. Else, we can take it through at91. -- Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 4/4] misc: atmel_tclib: get and use slow clock 2015-10-05 16:58 ` Alexandre Belloni @ 2015-10-06 7:33 ` Thierry Reding 0 siblings, 0 replies; 6+ messages in thread From: Thierry Reding @ 2015-10-06 7:33 UTC (permalink / raw) To: Alexandre Belloni Cc: Nicolas Ferre, Boris Brezillon, linux-arm-kernel, linux-kernel, Daniel Lezcano, linux-pwm [-- Attachment #1: Type: text/plain, Size: 1673 bytes --] On Mon, Oct 05, 2015 at 06:58:16PM +0200, Alexandre Belloni wrote: > On 05/10/2015 at 17:27:06 +0200, Thierry Reding wrote : > > On Sun, Aug 16, 2015 at 11:23:46AM +0200, Alexandre Belloni wrote: > > > From: Boris Brezillon <boris.brezillon@free-electrons.com> > > > > > > Commit dca1a4b5ff6e ("clk: at91: keep slow clk enabled to prevent system > > > hang") added a workaround for the slow clock as it is not properly handled > > > by its users. > > > > > > Get and use the slow clock as it is necessary for the timer counters. > > > > > > Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com> > > > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com> > > > Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > > --- > > > Cc: Daniel Lezcano <daniel.lezcano@linaro.org> > > > Cc: Thierry Reding <thierry.reding@gmail.com> > > > Cc: linux-pwm@vger.kernel.org > > > drivers/clocksource/tcb_clksrc.c | 10 +++++++++- > > > drivers/misc/atmel_tclib.c | 4 ++++ > > > drivers/pwm/pwm-atmel-tcb.c | 26 +++++++++++++++++++------- > > > include/linux/atmel_tc.h | 1 + > > > 4 files changed, 33 insertions(+), 8 deletions(-) > > > > This doesn't seem to apply anymore. Does it need to be rebased? Or do I > > need some other patch as a dependency? > > > > It will apply cleanly after [PATCH v4 3/4] clocksource: tcb_clksrc: fix > setup_clkevents error path > > It already has Daniel's ack so you can also take it if you want. Else, > we can take it through at91. Might be best to take it all into the at91 tree, so: Acked-by: Thierry Reding <thierry.reding@gmail.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-06 7:33 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-08-16 9:23 [PATCH v4 0/4] ARM: at91: Properly handle slow clock Alexandre Belloni 2015-08-16 9:23 ` [PATCH v4 4/4] misc: atmel_tclib: get and use " Alexandre Belloni 2015-08-19 21:24 ` Daniel Lezcano 2015-10-05 15:27 ` Thierry Reding 2015-10-05 16:58 ` Alexandre Belloni 2015-10-06 7:33 ` Thierry Reding
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).