Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756142AbcCQUKA (ORCPT ); Thu, 17 Mar 2016 16:10:00 -0400 Received: from down.free-electrons.com ([37.187.137.238]:58166 "EHLO mail.free-electrons.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751742AbcCQUJz (ORCPT ); Thu, 17 Mar 2016 16:09:55 -0400 From: Alexandre Belloni To: bigeasy@linutronix.de, Thomas Gleixner Cc: Boris Brezillon , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-rt-users@vger.kernel.org, Nicolas Ferre , Alexandre Belloni Subject: [PATCH] clockevents/drivers/timer-atmel-pit: fix double free_irq Date: Thu, 17 Mar 2016 21:09:43 +0100 Message-Id: <1458245383-9859-1-git-send-email-alexandre.belloni@free-electrons.com> X-Mailer: git-send-email 2.7.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1595 Lines: 51 clockevents_exchange_device() changes the state from detached to shutdown and so at that point the IRQ has not yet been requested. Signed-off-by: Alexandre Belloni --- Hi Sebastian, This patch fixes the last warning for preempt-rt on at91. It applies on v4.4.4-rt11. Note that the whome PIT/TCB mess will be fixed in another way in the mainline as we are reworking the tcb driver to avoid using the pit when booting. drivers/clocksource/timer-atmel-pit.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/clocksource/timer-atmel-pit.c b/drivers/clocksource/timer-atmel-pit.c index a7abdb6638cd..7a40f7e88468 100644 --- a/drivers/clocksource/timer-atmel-pit.c +++ b/drivers/clocksource/timer-atmel-pit.c @@ -46,6 +46,7 @@ struct pit_data { u32 cycle; u32 cnt; unsigned int irq; + bool irq_requested; struct clk *mck; }; @@ -96,7 +97,10 @@ static int pit_clkevt_shutdown(struct clock_event_device *dev) /* disable irq, leaving the clocksource active */ pit_write(data->base, AT91_PIT_MR, (data->cycle - 1) | AT91_PIT_PITEN); - free_irq(data->irq, data); + if (data->irq_requested) { + free_irq(data->irq, data); + data->irq_requested = false; + } return 0; } @@ -115,6 +119,8 @@ static int pit_clkevt_set_periodic(struct clock_event_device *dev) if (ret) panic(pr_fmt("Unable to setup IRQ\n")); + data->irq_requested = true; + /* update clocksource counter */ data->cnt += data->cycle * PIT_PICNT(pit_read(data->base, AT91_PIT_PIVR)); pit_write(data->base, AT91_PIT_MR, -- 2.7.0