From mboxrd@z Thu Jan 1 00:00:00 1970 From: nicolas.ferre@atmel.com (Nicolas Ferre) Date: Fri, 15 Jan 2016 11:54:20 +0100 Subject: [PATCH] clockevents: tcb_clksrc: stop disabling an already disabled clock In-Reply-To: <1452854061-30370-1-git-send-email-alexandre.belloni@free-electrons.com> References: <1452854061-30370-1-git-send-email-alexandre.belloni@free-electrons.com> Message-ID: <5698CFDC.2090304@atmel.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Le 15/01/2016 11:34, Alexandre Belloni a ?crit : > clockevents_exchange_device is calling clockevents_shutdown() on the new > clockenvents device but it may have never been enabled in the first place. > This results in the tcb clock being disabled without being enabled first: > > ------------[ cut here ]------------ > WARNING: CPU: 0 PID: 1 at drivers/clk/clk.c:680 clk_disable+0x28/0x34() > Modules linked in: > CPU: 0 PID: 1 Comm: swapper Not tainted 4.4.0+ #6 > Hardware name: Atmel AT91SAM9 > [] (unwind_backtrace) from [] (show_stack+0x10/0x14) > [] (show_stack) from [] (warn_slowpath_common+0x78/0xa0) > [] (warn_slowpath_common) from [] (warn_slowpath_null+0x18/0x20) > [] (warn_slowpath_null) from [] (clk_disable+0x28/0x34) > [] (clk_disable) from [] (tc_shutdown+0x38/0x4c) > [] (tc_shutdown) from [] (clockevents_switch_state+0x38/0x6c) > [] (clockevents_switch_state) from [] (clockevents_shutdown+0x10/0x24) > [] (clockevents_shutdown) from [] (tick_check_new_device+0x84/0xac) > [] (tick_check_new_device) from [] (clockevents_register_device+0x7c/0x108) > [] (clockevents_register_device) from [] (tcb_clksrc_init+0x390/0x3e8) > [] (tcb_clksrc_init) from [] (do_one_initcall+0x114/0x1d4) > [] (do_one_initcall) from [] (kernel_init_freeable+0xfc/0x1b8) > [] (kernel_init_freeable) from [] (kernel_init+0x8/0xe0) > [] (kernel_init) from [] (ret_from_fork+0x14/0x24) > ---[ end trace 0000000000000001 ]--- > > Check what state we were in before trying to disable the clock. > > Fixes: cf4541c101ea ("clockevents/drivers/tcb_clksrc: Migrate to new 'set-state' interface") > Signed-off-by: Alexandre Belloni Acked-by: Nicolas Ferre Thanks! > --- > drivers/clocksource/tcb_clksrc.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c > index 6ee91401918e..4da2af9694a2 100644 > --- a/drivers/clocksource/tcb_clksrc.c > +++ b/drivers/clocksource/tcb_clksrc.c > @@ -98,7 +98,8 @@ static int tc_shutdown(struct clock_event_device *d) > > __raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR)); > __raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR)); > - clk_disable(tcd->clk); > + if (!clockevent_state_detached(d)) > + clk_disable(tcd->clk); > > return 0; > } > -- Nicolas Ferre From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757481AbcAOKyZ (ORCPT ); Fri, 15 Jan 2016 05:54:25 -0500 Received: from eusmtp01.atmel.com ([212.144.249.242]:7975 "EHLO eusmtp01.atmel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751325AbcAOKyY (ORCPT ); Fri, 15 Jan 2016 05:54:24 -0500 Subject: Re: [PATCH] clockevents: tcb_clksrc: stop disabling an already disabled clock To: Alexandre Belloni , Daniel Lezcano References: <1452854061-30370-1-git-send-email-alexandre.belloni@free-electrons.com> CC: Thomas Gleixner , Boris Brezillon , , From: Nicolas Ferre Organization: atmel Message-ID: <5698CFDC.2090304@atmel.com> Date: Fri, 15 Jan 2016 11:54:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <1452854061-30370-1-git-send-email-alexandre.belloni@free-electrons.com> Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.161.30.18] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 15/01/2016 11:34, Alexandre Belloni a écrit : > clockevents_exchange_device is calling clockevents_shutdown() on the new > clockenvents device but it may have never been enabled in the first place. > This results in the tcb clock being disabled without being enabled first: > > ------------[ cut here ]------------ > WARNING: CPU: 0 PID: 1 at drivers/clk/clk.c:680 clk_disable+0x28/0x34() > Modules linked in: > CPU: 0 PID: 1 Comm: swapper Not tainted 4.4.0+ #6 > Hardware name: Atmel AT91SAM9 > [] (unwind_backtrace) from [] (show_stack+0x10/0x14) > [] (show_stack) from [] (warn_slowpath_common+0x78/0xa0) > [] (warn_slowpath_common) from [] (warn_slowpath_null+0x18/0x20) > [] (warn_slowpath_null) from [] (clk_disable+0x28/0x34) > [] (clk_disable) from [] (tc_shutdown+0x38/0x4c) > [] (tc_shutdown) from [] (clockevents_switch_state+0x38/0x6c) > [] (clockevents_switch_state) from [] (clockevents_shutdown+0x10/0x24) > [] (clockevents_shutdown) from [] (tick_check_new_device+0x84/0xac) > [] (tick_check_new_device) from [] (clockevents_register_device+0x7c/0x108) > [] (clockevents_register_device) from [] (tcb_clksrc_init+0x390/0x3e8) > [] (tcb_clksrc_init) from [] (do_one_initcall+0x114/0x1d4) > [] (do_one_initcall) from [] (kernel_init_freeable+0xfc/0x1b8) > [] (kernel_init_freeable) from [] (kernel_init+0x8/0xe0) > [] (kernel_init) from [] (ret_from_fork+0x14/0x24) > ---[ end trace 0000000000000001 ]--- > > Check what state we were in before trying to disable the clock. > > Fixes: cf4541c101ea ("clockevents/drivers/tcb_clksrc: Migrate to new 'set-state' interface") > Signed-off-by: Alexandre Belloni Acked-by: Nicolas Ferre Thanks! > --- > drivers/clocksource/tcb_clksrc.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c > index 6ee91401918e..4da2af9694a2 100644 > --- a/drivers/clocksource/tcb_clksrc.c > +++ b/drivers/clocksource/tcb_clksrc.c > @@ -98,7 +98,8 @@ static int tc_shutdown(struct clock_event_device *d) > > __raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR)); > __raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR)); > - clk_disable(tcd->clk); > + if (!clockevent_state_detached(d)) > + clk_disable(tcd->clk); > > return 0; > } > -- Nicolas Ferre