From patchwork Thu May 18 16:37:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 9734781 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 34CB6601C8 for ; Thu, 18 May 2017 16:38:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 23B0E285EC for ; Thu, 18 May 2017 16:38:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 187612879E; Thu, 18 May 2017 16:38:14 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 39BBD28775 for ; Thu, 18 May 2017 16:38:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756638AbdERQiL (ORCPT ); Thu, 18 May 2017 12:38:11 -0400 Received: from mail-wm0-f50.google.com ([74.125.82.50]:36147 "EHLO mail-wm0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754455AbdERQiK (ORCPT ); Thu, 18 May 2017 12:38:10 -0400 Received: by mail-wm0-f50.google.com with SMTP id 70so53061647wmq.1 for ; Thu, 18 May 2017 09:38:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nrMnHGML8dCnvIltWFV38MjWiIbtCIbqAzWNgTaxHb8=; b=tCpTQ+KjQRn36UZKXwbU0fk2ZBZNCfsu88+Sv/v5STgrHoy3caIAWs5LgCd9OW/CEs GQk/WtyDROCbqrvvpo3/ICq0ahlRR9IqCmze/IilNe5cRsa0mLuhL8UI+8H5czLwWiPL MmsBJmeFS5g7tQnepZvysJSpcPaT9d/umaGjUGJ5cE2rtm3kY6I8e1dh6ppF6YrzqGG4 Gptfgu2/NAIfPsIek9v6h3nUfp7Ou7l1shXjVKw6yKmd8UImOy9yHQYnhXk+tj0l7Tpx fTZ5h8Ku9+kAlqZFVkXfaqxpNPd0CWHqcPYyFQ2qhO4xSSl9nJeeXoEWeUCY/m3m2aMs Vf5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=nrMnHGML8dCnvIltWFV38MjWiIbtCIbqAzWNgTaxHb8=; b=iVRcH7ukX2FJi3aR/kxRL/vjnnS2i7vIvmrqNCBqxjv8HJeGIP7BVwE44PZ9Eh3xWc uXDajMsfG6A9ZKOFOte/E8NTFm1l7S1xzguGRS8jT03lL6CsCRz8wqorpYpg/+f/yfKT ejYznzbw178QKSjiziGfjIdTF1RgdQPMbJ0vK+9YolcIDoWMbn5I2VligWE+brvWl/yv vedP9bDuopvY2qd97Loy9iAeH1PLQURA/VxA6n7ud0N5lBx2Ovc64kMEmkcOa8/euMNq RJe3BrONAeI2OTDcX7eI3Apg/4or58oPcMF/0FLYBeXFwBuYNx0IG0LxUN62Rh0cd+Wg kOyA== X-Gm-Message-State: AODbwcBArpL2AXcV7CdZ8/10Ano/8WZOyo5uLzHkaKsJPT+1Vwm3CVSW ixHKLTQ4vXd7wKtS X-Received: by 10.28.170.11 with SMTP id t11mr3395930wme.44.1495125488941; Thu, 18 May 2017 09:38:08 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.googlemail.com with ESMTPSA id 4sm7357655wrv.33.2017.05.18.09.38.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 18 May 2017 09:38:08 -0700 (PDT) From: Jerome Brunet To: Michael Turquette , Stephen Boyd , Kevin Hilman Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-amlogic@lists.infradead.org Subject: [PATCH 01/10] clk: take the prepare lock out of clk_core_set_paren Date: Thu, 18 May 2017 18:37:55 +0200 Message-Id: <20170518163804.14123-2-jbrunet@baylibre.com> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170518163804.14123-1-jbrunet@baylibre.com> References: <20170518163804.14123-1-jbrunet@baylibre.com> Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Rework set_parent core function so it can be called when the prepare lock is already held by the caller. This rework is done to ease the integration of the "protected" clock functionality. Signed-off-by: Jerome Brunet --- drivers/clk/clk.c | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index fc58c52a26b4..f5c371532509 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1787,7 +1787,8 @@ bool clk_has_parent(struct clk *clk, struct clk *parent) } EXPORT_SYMBOL_GPL(clk_has_parent); -static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) +static int clk_core_set_parent_nolock(struct clk_core *core, + struct clk_core *parent) { int ret = 0; int p_index = 0; @@ -1796,23 +1797,16 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) if (!core) return 0; - /* prevent racing with updates to the clock topology */ - clk_prepare_lock(); - if (core->parent == parent) - goto out; + return 0; /* verify ops for for multi-parent clks */ - if ((core->num_parents > 1) && (!core->ops->set_parent)) { - ret = -ENOSYS; - goto out; - } + if ((core->num_parents > 1) && (!core->ops->set_parent)) + return -ENOSYS; /* check that we are allowed to re-parent if the clock is in use */ - if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) { - ret = -EBUSY; - goto out; - } + if ((core->flags & CLK_SET_PARENT_GATE) && core->prepare_count) + return -EBUSY; /* try finding the new parent index */ if (parent) { @@ -1820,8 +1814,7 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) if (p_index < 0) { pr_debug("%s: clk %s can not be parent of clk %s\n", __func__, parent->name, core->name); - ret = p_index; - goto out; + return p_index; } p_rate = parent->rate; } @@ -1831,7 +1824,7 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) /* abort if a driver objects */ if (ret & NOTIFY_STOP_MASK) - goto out; + return ret; /* do the re-parent */ ret = __clk_set_parent(core, parent, p_index); @@ -1844,9 +1837,6 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) __clk_recalc_accuracies(core); } -out: - clk_prepare_unlock(); - return ret; } @@ -1869,10 +1859,17 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) */ int clk_set_parent(struct clk *clk, struct clk *parent) { + int ret; + if (!clk) return 0; - return clk_core_set_parent(clk->core, parent ? parent->core : NULL); + clk_prepare_lock(); + ret = clk_core_set_parent_nolock(clk->core, + parent ? parent->core : NULL); + clk_prepare_unlock(); + + return ret; } EXPORT_SYMBOL_GPL(clk_set_parent); @@ -2753,7 +2750,7 @@ void clk_unregister(struct clk *clk) /* Reparent all children to the orphan list. */ hlist_for_each_entry_safe(child, t, &clk->core->children, child_node) - clk_core_set_parent(child, NULL); + clk_core_set_parent_nolock(child, NULL); } hlist_del_init(&clk->core->child_node);