From patchwork Fri Dec 1 21:51:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 120390 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp1678296qgn; Fri, 1 Dec 2017 13:52:18 -0800 (PST) X-Google-Smtp-Source: AGs4zMaWgn0zRym9YcH67m2P+wt3/XfcnYDIa8PRaPaKPLGC/fnMe5o5T+ScOJpZWng/GZQOn6ZJ X-Received: by 10.84.254.69 with SMTP id a5mr7315001pln.353.1512165138147; Fri, 01 Dec 2017 13:52:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512165138; cv=none; d=google.com; s=arc-20160816; b=REI7VDgCB4MmKuFvmtuw/FZizqM7TN+Kssjv0aqoenuq4n/HTQJJq6hhOeuZkjR15B kYBPaygcv2zUhavd3JJAzI/Xm4DcFO8EpyiKFhFY7HBFKMDtrO8LvM+0zHLvCkk1lr1Z 1HXXghN8I3aP+knVCi1ZlMBnRS9TCFxOcEsvbVbltJ9EbNzEhI8/IZXbCPgww0SZGlcE A9SeWJPm6yWNgiZ1YB4YfwA7wFNsWLUy4lwB3JGBeX6U4ab2hgVs6HDIVrigEZpBVy9I zMo6Wv6stKR1T8cpHRuXcwjqOs8WKV7fNl/FXl6o+bpdGZ89dtYZbTdCIFCy77ZzHNbq YzTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=JX+ANM7LWkr5EmCur0w4rrtOjl0cs6Wy9uhqHqNivLE=; b=U+PDq6N13TOnleZZKNv0MQ97SIsr1uyDdpCKNXa7qrF01PMV+WrDEj5WTb1NOuKDOI WgcCIBFAG+Cut0x97OvJMN2KyZAym9Sx6C5yl/ny0z9oFdn2yuwLLMfDcILDANIeBUmz 6effkKt7Ky9z6Cf/9UNcPme35WpPvXcpA4OYQC7wPjHwRBLzYHTRD7WHQhB+Tt79C69v coELVHm6gZUtBeL9MMQrTmKJ35vo1fjVc8OWJgd1pbIRFoR/vPL4ZLGhmek7zP1BqEaX gLs5QjnkhyfQbIRdCoAoxeENVVkA9l4UsltDk1F2qFDobqXSJCh6VueU+alMaVvu94uz +cfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=TBRi0aZq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f3si5421634pgn.40.2017.12.01.13.52.17; Fri, 01 Dec 2017 13:52:18 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=TBRi0aZq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751684AbdLAVwP (ORCPT + 28 others); Fri, 1 Dec 2017 16:52:15 -0500 Received: from mail-wr0-f193.google.com ([209.85.128.193]:41897 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751513AbdLAVwL (ORCPT ); Fri, 1 Dec 2017 16:52:11 -0500 Received: by mail-wr0-f193.google.com with SMTP id z18so11531856wrb.8 for ; Fri, 01 Dec 2017 13:52:10 -0800 (PST) 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=JX+ANM7LWkr5EmCur0w4rrtOjl0cs6Wy9uhqHqNivLE=; b=TBRi0aZq3XMEl5s7Zv3xcSvTUFl7W20rkvvC2OGC2ylblxcyYUi8m0SUNoJGeaNOmD DUIIickzfki/r9MVUCMBpAYgorKBgIexlppGtpEqrHhVDXANWK9FxJ5CX9xdh9/Y15iY uhS0yLztNWmyB8A++L3JS5/cKZmI196EPGi/f3ubQvXa2pdSFUkJ1xHgeQjXsZuliq2l l/cX4yMuJj/5fNOxIY332wcriQ7gGV/MsUXnRxqz63bsKDpWNXzSVb4Urvmty9Q47o34 x45FNsp4K+J7lStXp13cs865+q8TxKn3+UP6U8omDnR4blsvV4s95AhDEHb8m9+QwO5H OivA== 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=JX+ANM7LWkr5EmCur0w4rrtOjl0cs6Wy9uhqHqNivLE=; b=CqNkPLrjlvCM20S6YWHT46/VcZzyP/XztoeI0qoVnQfYOw7F8b6jCDn7zH1VBVdvmW sSlJLgI2sqXMHuUC5Z40Mme8yaPFU9AU5VG8K0hOFXToiO2QdkSSIEQ+6f2uuX//vLIm tQ5KE/g+ctwYzuRifJZu4o/n5cL/VSEAygG25Wn67Dkawzd3uLvDG6k7c+7LyCF8Goys gblTXfeZwduxz/4FLPu133xhlaRLpoY3LfyimtC68fi68p1zPNDxvsAn9bbo3WWrUnRL MXWZ0DBxaO5JWxoNTExevf+b1GwQr3+9GXuYNbGsaT50mCalvICxz6cSlSSp6OgndnPf KdAA== X-Gm-Message-State: AJaThX6n+eUplJL1BdKHkNIrHymTv/pBWjeK/XoLCGpU/Jt2di+8eAYP jTzI9fHeYpWii26bIbCXm6Kb7A== X-Received: by 10.223.184.197 with SMTP id c5mr6189452wrg.18.1512165129654; Fri, 01 Dec 2017 13:52:09 -0800 (PST) Received: from localhost.localdomain (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id m134sm2078804wmg.6.2017.12.01.13.52.08 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Fri, 01 Dec 2017 13:52:09 -0800 (PST) From: Jerome Brunet To: Stephen Boyd , Michael Turquette Cc: Jerome Brunet , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, Russell King , Linus Walleij , Quentin Schulz , Kevin Hilman , Maxime Ripard Subject: [PATCH v5 02/10] clk: take the prepare lock out of clk_core_set_parent Date: Fri, 1 Dec 2017 22:51:52 +0100 Message-Id: <20171201215200.23523-3-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171201215200.23523-1-jbrunet@baylibre.com> References: <20171201215200.23523-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. Acked-by: Linus Walleij Tested-by: Quentin Schulz Tested-by: Maxime Ripard Acked-by: Michael Turquette Signed-off-by: Jerome Brunet --- drivers/clk/clk.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) -- 2.14.3 diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 5fe9e63b15c6..e60b2a26b10b 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1871,32 +1871,28 @@ 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; unsigned long p_rate = 0; + lockdep_assert_held(&prepare_lock); + 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 = -EPERM; - goto out; - } + if (core->num_parents > 1 && !core->ops->set_parent) + return -EPERM; /* 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) { @@ -1904,15 +1900,14 @@ 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; } ret = clk_pm_runtime_get(core); if (ret) - goto out; + return ret; /* propagate PRE_RATE_CHANGE notifications */ ret = __clk_speculate_rates(core, p_rate); @@ -1934,8 +1929,6 @@ static int clk_core_set_parent(struct clk_core *core, struct clk_core *parent) runtime_put: clk_pm_runtime_put(core); -out: - clk_prepare_unlock(); return ret; } @@ -1959,10 +1952,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); @@ -2851,7 +2851,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);