From patchwork Fri Dec 4 17:03:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Belloni X-Patchwork-Id: 7769881 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 4E27EBEEE1 for ; Fri, 4 Dec 2015 17:06:53 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id A99422046F for ; Fri, 4 Dec 2015 17:06:51 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 55A3E20454 for ; Fri, 4 Dec 2015 17:06:50 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1a4tmq-0001G9-Of; Fri, 04 Dec 2015 17:04:48 +0000 Received: from down.free-electrons.com ([37.187.137.238] helo=mail.free-electrons.com) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1a4tmP-00010k-3z for linux-arm-kernel@lists.infradead.org; Fri, 04 Dec 2015 17:04:25 +0000 Received: by mail.free-electrons.com (Postfix, from userid 110) id 92F0130E; Fri, 4 Dec 2015 18:03:59 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 Received: from localhost (unknown [88.191.26.124]) by mail.free-electrons.com (Postfix) with ESMTPSA id 5E0EC42; Fri, 4 Dec 2015 18:03:59 +0100 (CET) From: Alexandre Belloni To: Nicolas Ferre , Boris Brezillon Subject: [PATCH v3 03/13] clk: at91: clk-main: factorize irq handling Date: Fri, 4 Dec 2015 18:03:38 +0100 Message-Id: <1449248628-3486-4-git-send-email-alexandre.belloni@free-electrons.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1449248628-3486-1-git-send-email-alexandre.belloni@free-electrons.com> References: <1449248628-3486-1-git-send-email-alexandre.belloni@free-electrons.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20151204_090421_560394_2EB00CD8 X-CRM114-Status: GOOD ( 15.43 ) X-Spam-Score: -2.6 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael Turquette , Stephen Boyd , linux-kernel@vger.kernel.org, Alexandre Belloni , Jean-Christophe Plagniol-Villard , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP The three different irq handlers are doing the same thing, factorize their code in a generic irq handler. Signed-off-by: Alexandre Belloni Acked-by: Stephen Boyd --- drivers/clk/at91/clk-main.c | 144 +++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 81 deletions(-) diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c index c1f119748bdc..5841eb958f83 100644 --- a/drivers/clk/at91/clk-main.c +++ b/drivers/clk/at91/clk-main.c @@ -34,25 +34,28 @@ #define MOR_KEY_MASK (0xff << 16) -struct clk_main_osc { +struct clk_main { struct clk_hw hw; struct regmap *regmap; unsigned int irq; wait_queue_head_t wait; }; -#define to_clk_main_osc(hw) container_of(hw, struct clk_main_osc, hw) +#define to_clk_main(hw) container_of(hw, struct clk_main, hw) + +struct clk_main_osc { + struct clk_main base; +}; + +#define to_clk_main_osc(hw) container_of(hw, struct clk_main_osc, base.hw) struct clk_main_rc_osc { - struct clk_hw hw; - struct regmap *regmap; - unsigned int irq; - wait_queue_head_t wait; + struct clk_main base; unsigned long frequency; unsigned long accuracy; }; -#define to_clk_main_rc_osc(hw) container_of(hw, struct clk_main_rc_osc, hw) +#define to_clk_main_rc_osc(hw) container_of(hw, struct clk_main_rc_osc, base.hw) struct clk_rm9200_main { struct clk_hw hw; @@ -62,21 +65,20 @@ struct clk_rm9200_main { #define to_clk_rm9200_main(hw) container_of(hw, struct clk_rm9200_main, hw) struct clk_sam9x5_main { - struct clk_hw hw; - struct regmap *regmap; - unsigned int irq; - wait_queue_head_t wait; + struct clk_main base; u8 parent; }; -#define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, hw) +#define to_clk_sam9x5_main(hw) container_of(hw, struct clk_sam9x5_main, base.hw) -static irqreturn_t clk_main_osc_irq_handler(int irq, void *dev_id) +/* Generic structure */ + +static irqreturn_t clk_main_irq_handler(int irq, void *dev_id) { - struct clk_main_osc *osc = dev_id; + struct clk_main *clkmain = dev_id; - wake_up(&osc->wait); - disable_irq_nosync(osc->irq); + wake_up(&clkmain->wait); + disable_irq_nosync(clkmain->irq); return IRQ_HANDLED; } @@ -93,7 +95,7 @@ static inline bool clk_main_osc_ready(struct regmap *regmap) static int clk_main_osc_prepare(struct clk_hw *hw) { struct clk_main_osc *osc = to_clk_main_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; u32 tmp; regmap_read(regmap, AT91_CKGR_MOR, &tmp); @@ -108,8 +110,8 @@ static int clk_main_osc_prepare(struct clk_hw *hw) } while (!clk_main_osc_ready(regmap)) { - enable_irq(osc->irq); - wait_event(osc->wait, + enable_irq(osc->base.irq); + wait_event(osc->base.wait, clk_main_osc_ready(regmap)); } @@ -119,7 +121,7 @@ static int clk_main_osc_prepare(struct clk_hw *hw) static void clk_main_osc_unprepare(struct clk_hw *hw) { struct clk_main_osc *osc = to_clk_main_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; u32 tmp; regmap_read(regmap, AT91_CKGR_MOR, &tmp); @@ -136,7 +138,7 @@ static void clk_main_osc_unprepare(struct clk_hw *hw) static int clk_main_osc_is_prepared(struct clk_hw *hw) { struct clk_main_osc *osc = to_clk_main_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; u32 tmp, status; regmap_read(regmap, AT91_CKGR_MOR, &tmp); @@ -179,14 +181,14 @@ at91_clk_register_main_osc(struct regmap *regmap, init.num_parents = 1; init.flags = CLK_IGNORE_UNUSED; - osc->hw.init = &init; - osc->regmap = regmap; - osc->irq = irq; + osc->base.hw.init = &init; + osc->base.regmap = regmap; + osc->base.irq = irq; - init_waitqueue_head(&osc->wait); - irq_set_status_flags(osc->irq, IRQ_NOAUTOEN); - ret = request_irq(osc->irq, clk_main_osc_irq_handler, - IRQF_TRIGGER_HIGH, name, osc); + init_waitqueue_head(&osc->base.wait); + irq_set_status_flags(irq, IRQ_NOAUTOEN); + ret = request_irq(irq, clk_main_irq_handler, + IRQF_TRIGGER_HIGH, name, &osc->base); if (ret) { kfree(osc); return ERR_PTR(ret); @@ -198,7 +200,7 @@ at91_clk_register_main_osc(struct regmap *regmap, AT91_PMC_MOSCEN, AT91_PMC_OSCBYPASS | AT91_PMC_KEY); - clk = clk_register(NULL, &osc->hw); + clk = clk_register(NULL, &osc->base.hw); if (IS_ERR(clk)) { free_irq(irq, osc); kfree(osc); @@ -237,16 +239,6 @@ static void __init of_at91rm9200_clk_main_osc_setup(struct device_node *np) CLK_OF_DECLARE(at91rm9200_clk_main_osc, "atmel,at91rm9200-clk-main-osc", of_at91rm9200_clk_main_osc_setup); -static irqreturn_t clk_main_rc_osc_irq_handler(int irq, void *dev_id) -{ - struct clk_main_rc_osc *osc = dev_id; - - wake_up(&osc->wait); - disable_irq_nosync(osc->irq); - - return IRQ_HANDLED; -} - static bool clk_main_rc_osc_ready(struct regmap *regmap) { unsigned int status; @@ -259,7 +251,7 @@ static bool clk_main_rc_osc_ready(struct regmap *regmap) static int clk_main_rc_osc_prepare(struct clk_hw *hw) { struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; unsigned int mor; regmap_read(regmap, AT91_CKGR_MOR, &mor); @@ -270,8 +262,8 @@ static int clk_main_rc_osc_prepare(struct clk_hw *hw) AT91_PMC_MOSCRCEN | AT91_PMC_KEY); while (!clk_main_rc_osc_ready(regmap)) { - enable_irq(osc->irq); - wait_event(osc->wait, + enable_irq(osc->base.irq); + wait_event(osc->base.wait, clk_main_rc_osc_ready(regmap)); } @@ -281,7 +273,7 @@ static int clk_main_rc_osc_prepare(struct clk_hw *hw) static void clk_main_rc_osc_unprepare(struct clk_hw *hw) { struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; unsigned int mor; regmap_read(regmap, AT91_CKGR_MOR, &mor); @@ -296,7 +288,7 @@ static void clk_main_rc_osc_unprepare(struct clk_hw *hw) static int clk_main_rc_osc_is_prepared(struct clk_hw *hw) { struct clk_main_rc_osc *osc = to_clk_main_rc_osc(hw); - struct regmap *regmap = osc->regmap; + struct regmap *regmap = osc->base.regmap; unsigned int mor, status; regmap_read(regmap, AT91_CKGR_MOR, &mor); @@ -353,20 +345,20 @@ at91_clk_register_main_rc_osc(struct regmap *regmap, init.num_parents = 0; init.flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED; - osc->hw.init = &init; - osc->regmap = regmap; - osc->irq = irq; + osc->base.hw.init = &init; + osc->base.regmap = regmap; + osc->base.irq = irq; osc->frequency = frequency; osc->accuracy = accuracy; - init_waitqueue_head(&osc->wait); - irq_set_status_flags(osc->irq, IRQ_NOAUTOEN); - ret = request_irq(osc->irq, clk_main_rc_osc_irq_handler, - IRQF_TRIGGER_HIGH, name, osc); + init_waitqueue_head(&osc->base.wait); + irq_set_status_flags(irq, IRQ_NOAUTOEN); + ret = request_irq(irq, clk_main_irq_handler, + IRQF_TRIGGER_HIGH, name, &osc->base); if (ret) return ERR_PTR(ret); - clk = clk_register(NULL, &osc->hw); + clk = clk_register(NULL, &osc->base.hw); if (IS_ERR(clk)) { free_irq(irq, osc); kfree(osc); @@ -529,16 +521,6 @@ static void __init of_at91rm9200_clk_main_setup(struct device_node *np) CLK_OF_DECLARE(at91rm9200_clk_main, "atmel,at91rm9200-clk-main", of_at91rm9200_clk_main_setup); -static irqreturn_t clk_sam9x5_main_irq_handler(int irq, void *dev_id) -{ - struct clk_sam9x5_main *clkmain = dev_id; - - wake_up(&clkmain->wait); - disable_irq_nosync(clkmain->irq); - - return IRQ_HANDLED; -} - static inline bool clk_sam9x5_main_ready(struct regmap *regmap) { unsigned int status; @@ -551,11 +533,11 @@ static inline bool clk_sam9x5_main_ready(struct regmap *regmap) static int clk_sam9x5_main_prepare(struct clk_hw *hw) { struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); - struct regmap *regmap = clkmain->regmap; + struct regmap *regmap = clkmain->base.regmap; while (!clk_sam9x5_main_ready(regmap)) { - enable_irq(clkmain->irq); - wait_event(clkmain->wait, + enable_irq(clkmain->base.irq); + wait_event(clkmain->base.wait, clk_sam9x5_main_ready(regmap)); } @@ -566,7 +548,7 @@ static int clk_sam9x5_main_is_prepared(struct clk_hw *hw) { struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); - return clk_sam9x5_main_ready(clkmain->regmap); + return clk_sam9x5_main_ready(clkmain->base.regmap); } static unsigned long clk_sam9x5_main_recalc_rate(struct clk_hw *hw, @@ -574,13 +556,13 @@ static unsigned long clk_sam9x5_main_recalc_rate(struct clk_hw *hw, { struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); - return clk_main_recalc_rate(clkmain->regmap, parent_rate); + return clk_main_recalc_rate(clkmain->base.regmap, parent_rate); } static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index) { struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); - struct regmap *regmap = clkmain->regmap; + struct regmap *regmap = clkmain->base.regmap; unsigned int tmp; if (index > 1) @@ -595,8 +577,8 @@ static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index) regmap_write(regmap, AT91_CKGR_MOR, tmp & ~AT91_PMC_MOSCSEL); while (!clk_sam9x5_main_ready(regmap)) { - enable_irq(clkmain->irq); - wait_event(clkmain->wait, + enable_irq(clkmain->base.irq); + wait_event(clkmain->base.wait, clk_sam9x5_main_ready(regmap)); } @@ -608,7 +590,7 @@ static u8 clk_sam9x5_main_get_parent(struct clk_hw *hw) struct clk_sam9x5_main *clkmain = to_clk_sam9x5_main(hw); unsigned int status; - regmap_read(clkmain->regmap, AT91_CKGR_MOR, &status); + regmap_read(clkmain->base.regmap, AT91_CKGR_MOR, &status); return status & AT91_PMC_MOSCEN ? 1 : 0; } @@ -650,21 +632,21 @@ at91_clk_register_sam9x5_main(struct regmap *regmap, init.num_parents = num_parents; init.flags = CLK_SET_PARENT_GATE; - clkmain->hw.init = &init; - clkmain->regmap = regmap; - clkmain->irq = irq; - regmap_read(clkmain->regmap, AT91_CKGR_MOR, &status); + clkmain->base.hw.init = &init; + clkmain->base.regmap = regmap; + clkmain->base.irq = irq; + regmap_read(clkmain->base.regmap, AT91_CKGR_MOR, &status); clkmain->parent = status & AT91_PMC_MOSCEN ? 1 : 0; - init_waitqueue_head(&clkmain->wait); - irq_set_status_flags(clkmain->irq, IRQ_NOAUTOEN); - ret = request_irq(clkmain->irq, clk_sam9x5_main_irq_handler, - IRQF_TRIGGER_HIGH, name, clkmain); + init_waitqueue_head(&clkmain->base.wait); + irq_set_status_flags(irq, IRQ_NOAUTOEN); + ret = request_irq(irq, clk_main_irq_handler, + IRQF_TRIGGER_HIGH, name, &clkmain->base); if (ret) return ERR_PTR(ret); - clk = clk_register(NULL, &clkmain->hw); + clk = clk_register(NULL, &clkmain->base.hw); if (IS_ERR(clk)) { - free_irq(clkmain->irq, clkmain); + free_irq(irq, clkmain); kfree(clkmain); }