From patchwork Sun Sep 24 20:00:24 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 114152 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp1855187qgf; Sun, 24 Sep 2017 13:02:11 -0700 (PDT) X-Received: by 10.98.70.137 with SMTP id o9mr5385919pfi.173.1506283331458; Sun, 24 Sep 2017 13:02:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506283331; cv=none; d=google.com; s=arc-20160816; b=EBVEjzj/gZBGU8hNEDiUf9+EqcLPeCmpjYv7INXVqTVHKB6RjmcQYBbfUpinac/HBa 3rF6pIEFefQh8dXXebU5lbJAyPMSy/JiNWXdXQxD8rX37gL1N40YUsWxmtsrmq8b91mV 478ArF7MJDtuTJ5M8R9vEs4j/b316MV+0rzC2Qmf8KEWm5yWYPj7KejrldIK1IBMoCtX ZRQhVQx4t9I2RM2mjkZgepqikAHTsO404GptBIaGMFUofCiCDzbZkMfBRVj+MwEN7mvd svM6Wvzi7p4hRHt1zzYtdu+lASuxn4fKrWMJFkLfgjuVx08a4RCY5av+MmvZtlM9ogrG WdNw== 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=y05AWxwwzaziUJ8pCZoL9SnezJMN/Sm3ZMoU593tH5o=; b=0IDmvPfSuo0kK6Gqniks/8Q9Aj6rnFk+fdMmScH5v1KHdq/pjB0hhPshUqOUfqFO7e Cv9M6eFJvb7K2T0AAYdrUuIrIydjefLBPtoQ1DuiI54zKGGHdPdjcWoWv80AZtKPDZBZ hEXE4ukwg5k9kPlgZVIjGJkc+V3kVvbaBloGa579DwS+BqNlzpIblHsZkNeogRJ+ohNL v0tnjsIiMxQmcNp+Wm4lmnjC6KeT263DxCmXEGeJXlAO+dJU7+HSfDHP61G8hot2EZ8S 9hUCGgLx2BNY5hdaFBNbCTAtZB7/OG/H9NSu8QlPk54k6A4qAfTwbBv4CkwFRgo1Eyf4 g2tw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=hzYZPrP6; 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 91si3032740ply.91.2017.09.24.13.02.11; Sun, 24 Sep 2017 13:02:11 -0700 (PDT) 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=hzYZPrP6; 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 S1753150AbdIXUCI (ORCPT + 26 others); Sun, 24 Sep 2017 16:02:08 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:48611 "EHLO mail-wm0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752900AbdIXUAm (ORCPT ); Sun, 24 Sep 2017 16:00:42 -0400 Received: by mail-wm0-f52.google.com with SMTP id m127so14363903wmm.3 for ; Sun, 24 Sep 2017 13:00:42 -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=y05AWxwwzaziUJ8pCZoL9SnezJMN/Sm3ZMoU593tH5o=; b=hzYZPrP6BgbH2JxawfdImDq+QqbzDgrnP2ErEQcGV9BFhSJbTZE/vVxWLbohLYFnS3 qBIpwhNxByzHdI3TKW5b7KtSJ//Y148nxNASgBn/r/IqBSwvaVRncfto378tXXjScalz s181uiKOznoE8mhyLB/liyt+Ma6mb9znu2LtEs1Z2wp1A1KdE3ptiowsmuj6hNHGMH0P 5fZR/Iuc9SLw912CSdHaf7Vtgt42RaFhAVma5MB4nyAxH8tLHYL/k4HXzFK1SCPVsoI1 WELCz8vXtFTBNIQf4ea0kUZ7IzyZ2qJN0/4i47BwAJPvrNO8D74UsLk0VCaMbFpVyWHW eX8A== 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=y05AWxwwzaziUJ8pCZoL9SnezJMN/Sm3ZMoU593tH5o=; b=LUxSWTh2K2Bfdsls6eEiz+expaDRsc1CyWRtdvOS7I+dnuTwYSRrmn/5uaH2hLheib mfQ9iKbsb6kP3luWLwc33Htdmmic8eEdFs8Pif3OOVjEPwhNXCeicXqc4cNOuJCHj6Ex qz0s8lfVWee3PhzcU7gmYe37M+XoMDatC1l2Md6g68u9dILhKVhVJYQbrXWPCg+GRvuN oHig5cXlEOmL/HJi0hQSgYkWbnvR1DUif/LFURAMg1WR5HFaqCktWP+CZHUbUrpnajEC GYAvUy68dk40w7DyEzmXNqUAgZyBOGF7IfP+gq1GqSFUNtQui2KrUVw1IOqxECxk39SP v2vQ== X-Gm-Message-State: AHPjjUjHOXO27i33Aytw0W4sNw/QtKlaSXZsqQLOnCKJD5MV5ObFonmu t5/J46S+rbspRfaQ18agqleXkA== X-Google-Smtp-Source: AOwi7QB3avSopLm97A/OvkmSrUlQokMwpCFHpSwEHZYc5MMia+s26OGEts4/7fln2BeRTjHZqjfVhw== X-Received: by 10.28.58.136 with SMTP id h130mr7875764wma.56.1506283241380; Sun, 24 Sep 2017 13:00:41 -0700 (PDT) Received: from localhost.localdomain (cag06-3-82-243-161-21.fbx.proxad.net. [82.243.161.21]) by smtp.googlemail.com with ESMTPSA id j5sm6786144wmg.8.2017.09.24.13.00.40 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 24 Sep 2017 13:00:40 -0700 (PDT) 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 Subject: [PATCH v4 04/10] clk: rework calls to round and determine rate callbacks Date: Sun, 24 Sep 2017 22:00:24 +0200 Message-Id: <20170924200030.6227-5-jbrunet@baylibre.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: <20170924200030.6227-1-jbrunet@baylibre.com> References: <20170924200030.6227-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rework the way the callbacks round_rate() and determine_rate() are called. The goal is to do this at a single point and make it easier to add conditions before calling them. Because of this factorization, rate returned by determine_rate() is also checked against the min and max rate values This rework is done to ease the integration of "protected" clock functionality. Acked-by: Linus Walleij Tested-by: Quentin Schulz Signed-off-by: Jerome Brunet --- drivers/clk/clk.c | 82 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 30 deletions(-) -- 2.13.5 diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 0913688dacb0..0905139a1893 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -833,10 +833,9 @@ static int clk_disable_unused(void) } late_initcall_sync(clk_disable_unused); -static int clk_core_round_rate_nolock(struct clk_core *core, - struct clk_rate_request *req) +static int clk_core_determine_round_nolock(struct clk_core *core, + struct clk_rate_request *req) { - struct clk_core *parent; long rate; lockdep_assert_held(&prepare_lock); @@ -844,15 +843,6 @@ static int clk_core_round_rate_nolock(struct clk_core *core, if (!core) return 0; - parent = core->parent; - if (parent) { - req->best_parent_hw = parent->hw; - req->best_parent_rate = parent->rate; - } else { - req->best_parent_hw = NULL; - req->best_parent_rate = 0; - } - if (core->ops->determine_rate) { return core->ops->determine_rate(core->hw, req); } else if (core->ops->round_rate) { @@ -862,15 +852,58 @@ static int clk_core_round_rate_nolock(struct clk_core *core, return rate; req->rate = rate; - } else if (core->flags & CLK_SET_RATE_PARENT) { - return clk_core_round_rate_nolock(parent, req); } else { - req->rate = core->rate; + return -EINVAL; } return 0; } +static void clk_core_init_rate_req(struct clk_core * const core, + struct clk_rate_request *req) +{ + struct clk_core *parent; + + if (WARN_ON(!core || !req)) + return; + + parent = core->parent; + if (parent) { + req->best_parent_hw = parent->hw; + req->best_parent_rate = parent->rate; + } else { + req->best_parent_hw = NULL; + req->best_parent_rate = 0; + } +} + +static bool clk_core_can_round(struct clk_core * const core) +{ + if (core->ops->determine_rate || core->ops->round_rate) + return true; + + return false; +} + +static int clk_core_round_rate_nolock(struct clk_core *core, + struct clk_rate_request *req) +{ + lockdep_assert_held(&prepare_lock); + + if (!core) + return 0; + + clk_core_init_rate_req(core, req); + + if (clk_core_can_round(core)) + return clk_core_determine_round_nolock(core, req); + else if (core->flags & CLK_SET_RATE_PARENT) + return clk_core_round_rate_nolock(core->parent, req); + + req->rate = core->rate; + return 0; +} + /** * __clk_determine_rate - get the closest rate actually supported by a clock * @hw: determine the rate of this clock @@ -1356,34 +1389,23 @@ static struct clk_core *clk_calc_new_rates(struct clk_core *core, clk_core_get_boundaries(core, &min_rate, &max_rate); /* find the closest rate and parent clk/rate */ - if (core->ops->determine_rate) { + if (clk_core_can_round(core)) { struct clk_rate_request req; req.rate = rate; req.min_rate = min_rate; req.max_rate = max_rate; - if (parent) { - req.best_parent_hw = parent->hw; - req.best_parent_rate = parent->rate; - } else { - req.best_parent_hw = NULL; - req.best_parent_rate = 0; - } - ret = core->ops->determine_rate(core->hw, &req); + clk_core_init_rate_req(core, &req); + + ret = clk_core_determine_round_nolock(core, &req); if (ret < 0) return NULL; best_parent_rate = req.best_parent_rate; new_rate = req.rate; parent = req.best_parent_hw ? req.best_parent_hw->core : NULL; - } else if (core->ops->round_rate) { - ret = core->ops->round_rate(core->hw, rate, - &best_parent_rate); - if (ret < 0) - return NULL; - new_rate = ret; if (new_rate < min_rate || new_rate > max_rate) return NULL; } else if (!parent || !(core->flags & CLK_SET_RATE_PARENT)) {