Received: by 2002:ac0:8845:0:0:0:0:0 with SMTP id g63csp1117043img; Tue, 26 Feb 2019 14:37:40 -0800 (PST) X-Google-Smtp-Source: AHgI3IYF4XYLUT+2PQ1KhmkAFoJGgeZw0GPXWfqxtQP0xz/gGYIg64f1+cZtLwih0cjaFYG3bLss X-Received: by 2002:a17:902:7007:: with SMTP id y7mr28408983plk.167.1551220660671; Tue, 26 Feb 2019 14:37:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551220660; cv=none; d=google.com; s=arc-20160816; b=lIaogPmn8+8XOwrzpz65N076SR8qJVcqST48l2X+NzNe2NylBkCbDzhpNJa66QtEIp p7JX/8rcKVOuaJ8WFQJZWXrmDoZ6CgfYZDEgMAPGemKTO8brNv3JX2JQgO20T4FvS3vT OZkchnUIIRmHoGlr8PLEwLonz4LcvFpa45WG0W8mhqfZ2mEF7kPfXzpVXBEiqknplgkB j/5pt6S5J4HrjfPRYPITfal4E52bv5NgSK37BdoyUxUb7alRHeyvJAnRFuzw26VF8i6s DTfi657tLvpf3lK1vR62M+3Is6Q9gSRcqhum77vcA2R4gI8KEerseehQWo8lfqy5ftQB pSWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8XAG5jXJJ0FelXmZN70Y5fD7/Yd8JopXNPDtog3IK8s=; b=RqY200L4Idvk5+4qY0gGC5uonAkTvuom/6NJsfuDCUz7jgm7niSlj+VhN3QOaFOMvN i+x9LWuEV4rkBWoS7hnrC/+vldrqvynKtjr0lvW3R/xnv5+r85Rh6Lk271HwQw8DGeaS OkaEVw9DFNmCcPy+zAgfnvb9lii4jOVsRT34114/m5z91KxTzcZgy4pTreLl0Fi2DD0f W2E3b4Ww/EwNP5EtCK89rJX7oV8EHPWHTk3iCc6TAV/1VUmreVgIgs7RwOORv0HIcX8z kb/alI2+KqvpwC26a44elH3EKaOYgdPnWusD8wJXBG38PBJNgOEHeFSOXS7wAopgEkZB fEeg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=hNIam5HF; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id r7si13085360pgi.20.2019.02.26.14.37.25; Tue, 26 Feb 2019 14:37:40 -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=@kernel.org header.s=default header.b=hNIam5HF; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729467AbfBZWfF (ORCPT + 99 others); Tue, 26 Feb 2019 17:35:05 -0500 Received: from mail.kernel.org ([198.145.29.99]:48264 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729271AbfBZWed (ORCPT ); Tue, 26 Feb 2019 17:34:33 -0500 Received: from mail.kernel.org (unknown [104.132.0.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 28470218A3; Tue, 26 Feb 2019 22:34:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1551220472; bh=CNGc4u8PnghQnh+ikISWqbDu3OKYkonz9V2RmyYaTE4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hNIam5HF71LbkVi/xsPCWYSZm98Q0U3/O5pitnFgl8+W2E1rpQFVbXfuLsAyYS8Rh Pss/IcoIESZ/i9emST83KAhIGv/3zLNjtgpdVcTuZAVTsZNqlEs4qTy00H+vtBBTp7 /m6nzSTCPcMpAX5NVG4rkKX6s8HiYa/meu36CIJo= From: Stephen Boyd To: Michael Turquette , Stephen Boyd Cc: linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, Miquel Raynal , Jerome Brunet , Russell King , Jeffrey Hugo , Chen-Yu Tsai Subject: [PATCH v2 4/8] clk: Inform the core about consumer devices Date: Tue, 26 Feb 2019 14:34:25 -0800 Message-Id: <20190226223429.193873-5-sboyd@kernel.org> X-Mailer: git-send-email 2.21.0.rc2.261.ga7da99ff1b-goog In-Reply-To: <20190226223429.193873-1-sboyd@kernel.org> References: <20190226223429.193873-1-sboyd@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We'd like to have a pointer to the device that's consuming a particular clk in the clk framework so we can link the consumer to the clk provider with a PM device link. Add a device argument to clk_hw_create_clk() for this so it can be used in subsequent patches to add and remove the link. Cc: Miquel Raynal Cc: Jerome Brunet Cc: Russell King Cc: Michael Turquette Cc: Jeffrey Hugo Cc: Chen-Yu Tsai Signed-off-by: Stephen Boyd --- drivers/clk/clk.c | 7 +++++-- drivers/clk/clk.h | 7 +++++-- drivers/clk/clkdev.c | 16 +++++++++++----- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index 04288063847b..8244ef2ba977 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -82,6 +82,7 @@ struct clk_core { struct clk { struct clk_core *core; + struct device *dev; const char *dev_id; const char *con_id; unsigned long min_rate; @@ -3273,6 +3274,7 @@ static void free_clk(struct clk *clk) /** * clk_hw_create_clk: Allocate and link a clk consumer to a clk_core given * a clk_hw + * @dev: clk consumer device * @hw: clk_hw associated with the clk being consumed * @dev_id: string describing device name * @con_id: connection ID string on device @@ -3281,7 +3283,7 @@ static void free_clk(struct clk *clk) * consumers. It connects a consumer to the clk_core and clk_hw structures * used by the framework and clk provider respectively. */ -struct clk *clk_hw_create_clk(struct clk_hw *hw, +struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw, const char *dev_id, const char *con_id) { struct clk *clk; @@ -3295,6 +3297,7 @@ struct clk *clk_hw_create_clk(struct clk_hw *hw, clk = alloc_clk(core, dev_id, con_id); if (IS_ERR(clk)) return clk; + clk->dev = dev; if (!try_module_get(core->owner)) { free_clk(clk); @@ -4149,7 +4152,7 @@ struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec) { struct clk_hw *hw = of_clk_get_hw_from_clkspec(clkspec); - return clk_hw_create_clk(hw, NULL, __func__); + return clk_hw_create_clk(NULL, hw, NULL, __func__); } EXPORT_SYMBOL_GPL(of_clk_get_from_provider); diff --git a/drivers/clk/clk.h b/drivers/clk/clk.h index 5a0ca0e3c1f1..5ea2185e57a1 100644 --- a/drivers/clk/clk.h +++ b/drivers/clk/clk.h @@ -5,6 +5,8 @@ */ struct clk_hw; +struct device; +struct of_phandle_args; #if defined(CONFIG_OF) && defined(CONFIG_COMMON_CLK) int of_parse_clkspec(const struct device_node *np, int index, const char *name, @@ -13,13 +15,14 @@ struct clk_hw *of_clk_get_hw_from_clkspec(struct of_phandle_args *clkspec); #endif #ifdef CONFIG_COMMON_CLK -struct clk *clk_hw_create_clk(struct clk_hw *hw, +struct clk *clk_hw_create_clk(struct device *dev, struct clk_hw *hw, const char *dev_id, const char *con_id); void __clk_put(struct clk *clk); #else /* All these casts to avoid ifdefs in clkdev... */ static inline struct clk * -clk_hw_create_clk(struct clk_hw *hw, const char *dev_id, const char *con_id) +clk_hw_create_clk(struct device *dev, struct clk_hw *hw, const char *dev_id, + const char *con_id) { return (struct clk *)hw; } diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c index 5ebb2119c0b9..f2f4f2afd28c 100644 --- a/drivers/clk/clkdev.c +++ b/drivers/clk/clkdev.c @@ -51,7 +51,7 @@ static struct clk *__of_clk_get(struct device_node *np, { struct clk_hw *hw = of_clk_get_hw(np, index, con_id); - return clk_hw_create_clk(hw, dev_id, con_id); + return clk_hw_create_clk(NULL, hw, dev_id, con_id); } struct clk *of_clk_get(struct device_node *np, int index) @@ -130,7 +130,8 @@ static struct clk_lookup *clk_find(const char *dev_id, const char *con_id) return cl; } -struct clk *clk_get_sys(const char *dev_id, const char *con_id) +static struct clk *__clk_get_sys(struct device *dev, const char *dev_id, + const char *con_id) { struct clk_lookup *cl; struct clk *clk = NULL; @@ -141,7 +142,7 @@ struct clk *clk_get_sys(const char *dev_id, const char *con_id) if (!cl) goto out; - clk = clk_hw_create_clk(cl->clk_hw, dev_id, con_id); + clk = clk_hw_create_clk(dev, cl->clk_hw, dev_id, con_id); if (IS_ERR(clk)) cl = NULL; out: @@ -149,6 +150,11 @@ struct clk *clk_get_sys(const char *dev_id, const char *con_id) return cl ? clk : ERR_PTR(-ENOENT); } + +struct clk *clk_get_sys(const char *dev_id, const char *con_id) +{ + return __clk_get_sys(NULL, dev_id, con_id); +} EXPORT_SYMBOL(clk_get_sys); struct clk *clk_get(struct device *dev, const char *con_id) @@ -159,10 +165,10 @@ struct clk *clk_get(struct device *dev, const char *con_id) if (dev && dev->of_node) { hw = of_clk_get_hw(dev->of_node, 0, con_id); if (!IS_ERR(hw) || PTR_ERR(hw) == -EPROBE_DEFER) - return clk_hw_create_clk(hw, dev_id, con_id); + return clk_hw_create_clk(dev, hw, dev_id, con_id); } - return clk_get_sys(dev_id, con_id); + return __clk_get_sys(dev, dev_id, con_id); } EXPORT_SYMBOL(clk_get); -- Sent by a computer through tubes