From patchwork Fri Dec 17 13:09:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 12696654 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 29FD0C433F5 for ; Fri, 17 Dec 2021 13:11:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+UhwTU/UcFqYja7QCwD6YfxmH4G8pDtYL3+FE336Rgo=; b=fXr77PxSOC+xVF WzGnQ3i3UqRuzKtLw6DnOs8pSxiz4vRwe6BjWr3LzhySLNDHvMx6MzF2iefImtalFO6K7QWNmXPW1 0VvRPV9Ya4DhVc1smGzwZxuPfn5HtYbXzxxEfj35860hd/hbVwFYbti8tkisAXkaUvw0qHP68+A68 i91NLqaWcjTx1pMSTxL46fBD3AoFOvyeuima7dqoH5m1L/UnEsL2y7GN5YdwvpOfVs+1MPPNlmcS3 HIC2tydbCSywHp3yRZzSUYdqcD2mGvQ/UoJmWOqgxFhOpqMqyjLgRUl+grfRKVFhii7JUt/pMrEZ1 OchkMWsXpBe14r/XBvtg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1myD00-00AJ9V-3F; Fri, 17 Dec 2021 13:10:12 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzO-00AIog-Li for linux-arm-kernel@lists.infradead.org; Fri, 17 Dec 2021 13:09:41 +0000 Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1myCzF-0004Up-9K; Fri, 17 Dec 2021 14:09:25 +0100 Received: from sha by dude02.hi.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1myCzD-00Cjq0-Vg; Fri, 17 Dec 2021 14:09:23 +0100 From: Sascha Hauer To: linux-rockchip@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Michael Riesch , kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 1/4] soc: rockchip: power-domain: register device for each domain Date: Fri, 17 Dec 2021 14:09:16 +0100 Message-Id: <20211217130919.3035788-2-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211217130919.3035788-1-s.hauer@pengutronix.de> References: <20211217130919.3035788-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211217_050935_124901_D26CC57B X-CRM114-Status: GOOD ( 31.86 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This patch prepares the rockchip power domain driver for regulator support. When a switchable regulator supplies a power domain the logical place to put the regulator is into the device node of that domain. In Linux we can get a regulator from a device node only when a device is attached to it. With this patch we register a device for each domain. Signed-off-by: Sascha Hauer --- drivers/soc/rockchip/pm_domains.c | 275 ++++++++++++++---------------- 1 file changed, 127 insertions(+), 148 deletions(-) diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index 0868b7d406fba..d2f71437c73a9 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -29,6 +29,8 @@ #include #include +struct rockchip_pmu; + struct rockchip_domain_info { const char *name; int pwr_mask; @@ -39,6 +41,10 @@ struct rockchip_domain_info { bool active_wakeup; int pwr_w_mask; int req_w_mask; + + struct rockchip_pmu *pmu; + struct generic_pm_domain *parent_domain; + int id; }; struct rockchip_pmu_info { @@ -81,6 +87,7 @@ struct rockchip_pmu { struct regmap *regmap; const struct rockchip_pmu_info *info; struct mutex mutex; /* mutex lock for pmu */ + atomic_t missing; struct genpd_onecell_data genpd_data; struct generic_pm_domain *domains[]; }; @@ -387,12 +394,11 @@ static void rockchip_pd_detach_dev(struct generic_pm_domain *genpd, } static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, - struct device_node *node) + struct device_node *node, + struct generic_pm_domain *parent_domain) { - const struct rockchip_domain_info *pd_info; - struct rockchip_pm_domain *pd; - struct device_node *qos_node; - int i, j; + struct platform_device *pd_pdev; + struct rockchip_domain_info *domain_info; u32 id; int error; @@ -410,28 +416,98 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, return -EINVAL; } - pd_info = &pmu->info->domain_info[id]; - if (!pd_info) { - dev_err(pmu->dev, "%pOFn: undefined domain id %d\n", - node, id); - return -EINVAL; + pd_pdev = platform_device_alloc("rk-power-domain", id); + if (!pd_pdev) { + dev_err(pmu->dev, "Failed to allocate platform device\n"); + return -ENOMEM; } - pd = devm_kzalloc(pmu->dev, sizeof(*pd), GFP_KERNEL); + error = platform_device_add_data(pd_pdev, + &pmu->info->domain_info[id], + sizeof(pmu->info->domain_info[id])); + if (error) + goto err_put; + + domain_info = pd_pdev->dev.platform_data; + domain_info->parent_domain = parent_domain; + domain_info->pmu = pmu; + domain_info->id = id; + + pd_pdev->dev.parent = pmu->dev; + pd_pdev->dev.of_node = node; + + atomic_inc(&pmu->missing); + + error = platform_device_add(pd_pdev); + if (error) + goto err_put; + + return 0; + +err_put: + platform_device_put(pd_pdev); + + return error; +} + +static void rockchip_pm_add_domains(struct rockchip_pmu *pmu, + struct device_node *parent, + struct generic_pm_domain *parent_domain) +{ + struct device_node *np; + int error; + + /* + * We may only register the genpd provider when we have registered all + * domains that are specified in the device tree. We count the missing + * domains in rockchip_pmu::missing. + * The rockchip pm_domains may have subdomains which means we can be + * called here recursively. Give it one extra count here to prevent + * the counter dropping to zero when we are called recursively. + */ + atomic_inc(&pmu->missing); + + for_each_child_of_node(parent, np) { + error = rockchip_pm_add_one_domain(pmu, np, parent_domain); + if (error) + dev_err(pmu->dev, "failed to handle node %pOFn: %d\n", + np, error); + } + + if (!atomic_dec_and_test(&pmu->missing)) + return; + + error = of_genpd_add_provider_onecell(pmu->dev->of_node, &pmu->genpd_data); + if (error) + dev_err(pmu->dev, "failed to add provider: %d\n", error); +} + +static int rockchip_domain_probe(struct platform_device *pdev) +{ + struct rockchip_domain_info *pd_info = pdev->dev.platform_data; + struct rockchip_pm_domain *pd; + struct device_node *node = pdev->dev.of_node; + struct device_node *qos_node; + struct rockchip_pmu *pmu = pd_info->pmu; + struct generic_pm_domain *parent_domain; + int i, j; + int error; + + pd = devm_kzalloc(&pdev->dev, sizeof(*pd), GFP_KERNEL); if (!pd) return -ENOMEM; pd->info = pd_info; - pd->pmu = pmu; + pd->pmu = pd_info->pmu; pd->num_clks = of_clk_get_parent_count(node); if (pd->num_clks > 0) { - pd->clks = devm_kcalloc(pmu->dev, pd->num_clks, + pd->clks = devm_kcalloc(&pdev->dev, pd->num_clks, sizeof(*pd->clks), GFP_KERNEL); if (!pd->clks) return -ENOMEM; } else { - dev_dbg(pmu->dev, "%pOFn: doesn't have clocks: %d\n", + dev_dbg(&pdev->dev, "%pOFn: doesn't have clocks: %d\n", node, pd->num_clks); pd->num_clks = 0; } @@ -440,7 +516,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, pd->clks[i].clk = of_clk_get(node, i); if (IS_ERR(pd->clks[i].clk)) { error = PTR_ERR(pd->clks[i].clk); - dev_err(pmu->dev, + dev_err(&pdev->dev, "%pOFn: failed to get clk at index %d: %d\n", node, i, error); return error; @@ -455,7 +531,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, NULL); if (pd->num_qos > 0) { - pd->qos_regmap = devm_kcalloc(pmu->dev, pd->num_qos, + pd->qos_regmap = devm_kcalloc(&pdev->dev, pd->num_qos, sizeof(*pd->qos_regmap), GFP_KERNEL); if (!pd->qos_regmap) { @@ -464,7 +540,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, } for (j = 0; j < MAX_QOS_REGS_NUM; j++) { - pd->qos_save_regs[j] = devm_kcalloc(pmu->dev, + pd->qos_save_regs[j] = devm_kcalloc(&pdev->dev, pd->num_qos, sizeof(u32), GFP_KERNEL); @@ -490,7 +566,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, } } - error = rockchip_pd_power(pd, true); + error = rockchip_pd_power_on(&pd->genpd); if (error) { dev_err(pmu->dev, "failed to power on domain '%pOFn': %d\n", @@ -507,13 +583,33 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, pd->genpd.attach_dev = rockchip_pd_attach_dev; pd->genpd.detach_dev = rockchip_pd_detach_dev; pd->genpd.flags = GENPD_FLAG_PM_CLK; - if (pd_info->active_wakeup) + if (pd->info->active_wakeup) pd->genpd.flags |= GENPD_FLAG_ACTIVE_WAKEUP; pm_genpd_init(&pd->genpd, NULL, false); - pmu->genpd_data.domains[id] = &pd->genpd; + parent_domain = pd_info->parent_domain; + if (parent_domain) { + error = pm_genpd_add_subdomain(parent_domain, &pd->genpd); + if (error) { + dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n", + parent_domain->name, pd->genpd.name, error); + goto out_genpd_remove; + } else { + dev_dbg(pmu->dev, "%s add subdomain: %s\n", + parent_domain->name, pd->genpd.name); + } + } + + pmu->genpd_data.domains[pd->info->id] = &pd->genpd; + + atomic_dec(&pmu->missing); + + rockchip_pm_add_domains(pmu, node, &pd->genpd); + return 0; +out_genpd_remove: + pm_genpd_remove(&pd->genpd); err_unprepare_clocks: clk_bulk_unprepare(pd->num_clks, pd->clks); err_put_clocks: @@ -521,46 +617,19 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu, return error; } -static void rockchip_pm_remove_one_domain(struct rockchip_pm_domain *pd) +static int rockchip_domain_remove(struct platform_device *pdev) { - int ret; - - /* - * We're in the error cleanup already, so we only complain, - * but won't emit another error on top of the original one. - */ - ret = pm_genpd_remove(&pd->genpd); - if (ret < 0) - dev_err(pd->pmu->dev, "failed to remove domain '%s' : %d - state may be inconsistent\n", - pd->genpd.name, ret); - - clk_bulk_unprepare(pd->num_clks, pd->clks); - clk_bulk_put(pd->num_clks, pd->clks); - - /* protect the zeroing of pm->num_clks */ - mutex_lock(&pd->pmu->mutex); - pd->num_clks = 0; - mutex_unlock(&pd->pmu->mutex); - - /* devm will free our memory */ + return 0; } -static void rockchip_pm_domain_cleanup(struct rockchip_pmu *pmu) -{ - struct generic_pm_domain *genpd; - struct rockchip_pm_domain *pd; - int i; - - for (i = 0; i < pmu->genpd_data.num_domains; i++) { - genpd = pmu->genpd_data.domains[i]; - if (genpd) { - pd = to_rockchip_pd(genpd); - rockchip_pm_remove_one_domain(pd); - } - } - - /* devm will free our memory */ -} +static struct platform_driver rockchip_domain_driver = { + .driver = { + .name = "rk-power-domain", + }, + .probe = rockchip_domain_probe, + .remove = rockchip_domain_remove, +}; +builtin_platform_driver(rockchip_domain_driver) static void rockchip_configure_pd_cnt(struct rockchip_pmu *pmu, u32 domain_reg_offset, @@ -572,71 +641,14 @@ static void rockchip_configure_pd_cnt(struct rockchip_pmu *pmu, regmap_write(pmu->regmap, domain_reg_offset + 4, count); } -static int rockchip_pm_add_subdomain(struct rockchip_pmu *pmu, - struct device_node *parent) -{ - struct device_node *np; - struct generic_pm_domain *child_domain, *parent_domain; - int error; - - for_each_child_of_node(parent, np) { - u32 idx; - - error = of_property_read_u32(parent, "reg", &idx); - if (error) { - dev_err(pmu->dev, - "%pOFn: failed to retrieve domain id (reg): %d\n", - parent, error); - goto err_out; - } - parent_domain = pmu->genpd_data.domains[idx]; - - error = rockchip_pm_add_one_domain(pmu, np); - if (error) { - dev_err(pmu->dev, "failed to handle node %pOFn: %d\n", - np, error); - goto err_out; - } - - error = of_property_read_u32(np, "reg", &idx); - if (error) { - dev_err(pmu->dev, - "%pOFn: failed to retrieve domain id (reg): %d\n", - np, error); - goto err_out; - } - child_domain = pmu->genpd_data.domains[idx]; - - error = pm_genpd_add_subdomain(parent_domain, child_domain); - if (error) { - dev_err(pmu->dev, "%s failed to add subdomain %s: %d\n", - parent_domain->name, child_domain->name, error); - goto err_out; - } else { - dev_dbg(pmu->dev, "%s add subdomain: %s\n", - parent_domain->name, child_domain->name); - } - - rockchip_pm_add_subdomain(pmu, np); - } - - return 0; - -err_out: - of_node_put(np); - return error; -} - static int rockchip_pm_domain_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; - struct device_node *node; struct device *parent; struct rockchip_pmu *pmu; const struct of_device_id *match; const struct rockchip_pmu_info *pmu_info; - int error; if (!np) { dev_err(dev, "device tree node not found\n"); @@ -688,42 +700,9 @@ static int rockchip_pm_domain_probe(struct platform_device *pdev) rockchip_configure_pd_cnt(pmu, pmu_info->gpu_pwrcnt_offset, pmu_info->gpu_power_transition_time); - error = -ENODEV; - - for_each_available_child_of_node(np, node) { - error = rockchip_pm_add_one_domain(pmu, node); - if (error) { - dev_err(dev, "failed to handle node %pOFn: %d\n", - node, error); - of_node_put(node); - goto err_out; - } - - error = rockchip_pm_add_subdomain(pmu, node); - if (error < 0) { - dev_err(dev, "failed to handle subdomain node %pOFn: %d\n", - node, error); - of_node_put(node); - goto err_out; - } - } - - if (error) { - dev_dbg(dev, "no power domains defined\n"); - goto err_out; - } - - error = of_genpd_add_provider_onecell(np, &pmu->genpd_data); - if (error) { - dev_err(dev, "failed to add provider: %d\n", error); - goto err_out; - } + rockchip_pm_add_domains(pmu, np, NULL); return 0; - -err_out: - rockchip_pm_domain_cleanup(pmu); - return error; } static const struct rockchip_domain_info px30_pm_domains[] = { From patchwork Fri Dec 17 13:09:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 12696652 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5C706C433FE for ; Fri, 17 Dec 2021 13:11:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=Lu3FUv5ae/Y3kjnHxcobuSlpC5Fc5o5kIAIvfwyRl/w=; b=4MFyWWSdEexWcn 32KujYuuWoAvKeaMTYG1W8nbZlHpKIAA2+0puwm9Su6B7bvldXeVNi8nLLuE+9cbDHzFoXQPedjqf ouYuF8V0mBOziyq1KZp1uEJi1CbJkVlVAmmEMhIdrIO+Ll+aOy7CJztWkfeb++XsZboiI/PUTOMGv AHKsDsgGpbD6Op4w3fNtAvn96TJuae3/bMgT3lvdAOTZZGY+0j4sXuir0RfS+xmy7QacgKqe3BONt DQ3NNNm+BXHjjTzMhjXoB9b+TV0lNPcMuiUsbsuX2VmheverRVB/00GpI8jQn+2uE4PpA+dnCY4Ed Mf5yA+IhVXLy8JKD+SBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzY-00AIt7-H2; Fri, 17 Dec 2021 13:09:44 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzI-00AIm8-F6 for linux-arm-kernel@lists.infradead.org; Fri, 17 Dec 2021 13:09:31 +0000 Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1myCzF-0004Uq-9K; Fri, 17 Dec 2021 14:09:25 +0100 Received: from sha by dude02.hi.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1myCzE-00Cjq3-06; Fri, 17 Dec 2021 14:09:24 +0100 From: Sascha Hauer To: linux-rockchip@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Michael Riesch , kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 2/4] soc: rockchip: power-domain: Use devm_clk_bulk_get_all() Date: Fri, 17 Dec 2021 14:09:17 +0100 Message-Id: <20211217130919.3035788-3-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211217130919.3035788-1-s.hauer@pengutronix.de> References: <20211217130919.3035788-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211217_050928_556298_22BDA1A7 X-CRM114-Status: GOOD ( 16.06 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Now that each power domain has its own device we no longer have to use of_clk_get(), but can instead simplify retrieving the clocks by using devm_clk_bulk_get_all(). Signed-off-by: Sascha Hauer --- drivers/soc/rockchip/pm_domains.c | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index d2f71437c73a9..dcfd3db649f58 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -490,7 +490,7 @@ static int rockchip_domain_probe(struct platform_device *pdev) struct device_node *qos_node; struct rockchip_pmu *pmu = pd_info->pmu; struct generic_pm_domain *parent_domain; - int i, j; + int j; int error; pd = devm_kzalloc(&pdev->dev, sizeof(*pd), GFP_KERNEL); @@ -500,32 +500,13 @@ static int rockchip_domain_probe(struct platform_device *pdev) pd->info = pd_info; pd->pmu = pd_info->pmu; - pd->num_clks = of_clk_get_parent_count(node); - if (pd->num_clks > 0) { - pd->clks = devm_kcalloc(&pdev->dev, pd->num_clks, - sizeof(*pd->clks), GFP_KERNEL); - if (!pd->clks) - return -ENOMEM; - } else { - dev_dbg(&pdev->dev, "%pOFn: doesn't have clocks: %d\n", - node, pd->num_clks); - pd->num_clks = 0; - } - - for (i = 0; i < pd->num_clks; i++) { - pd->clks[i].clk = of_clk_get(node, i); - if (IS_ERR(pd->clks[i].clk)) { - error = PTR_ERR(pd->clks[i].clk); - dev_err(&pdev->dev, - "%pOFn: failed to get clk at index %d: %d\n", - node, i, error); - return error; - } - } + pd->num_clks = devm_clk_bulk_get_all(&pdev->dev, &pd->clks); + if (pd->num_clks < 0) + return pd->num_clks; error = clk_bulk_prepare(pd->num_clks, pd->clks); if (error) - goto err_put_clocks; + return error; pd->num_qos = of_count_phandle_with_args(node, "pm_qos", NULL); @@ -612,8 +593,6 @@ static int rockchip_domain_probe(struct platform_device *pdev) pm_genpd_remove(&pd->genpd); err_unprepare_clocks: clk_bulk_unprepare(pd->num_clks, pd->clks); -err_put_clocks: - clk_bulk_put(pd->num_clks, pd->clks); return error; } From patchwork Fri Dec 17 13:09:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 12696651 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1A77DC433EF for ; Fri, 17 Dec 2021 13:11:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=cdO2/ez5mZ9tRmhBIr6UFP0h2P2CK+dbLvRo6Y9c34I=; b=JR31exeWUGF3HF 7vE8zRma8ZNBd5GqKE/UFsBjLcONJmpXnj7rJ7Cttu/dr9zy8fmtQL17Uzf2pCUBRCPYd0JUhRmbQ CZo7shOuCd8Vy2UE5ZTer4NeLbciUnolYb95D+9eks3vz1j+tufmC9DKgjzsR1/TMsJKlyCQvIx58 SAhe/2CWEX68Op2iK7s5WW1RTQOEn20XwDQiRVXdOSQsEZmOVzUa7y7zn3k4rK9xBCHvFM2Dl+MM1 k5yR4wLVhCY3kWACmrZhEsC/raLSXG+vWQM69XgQuMd5ipQFtDf5R3LL/ijhpOZ15eRSKSenKlcbp sdrn40/4f5qbmnFqO5Jg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzM-00AIoJ-Qy; Fri, 17 Dec 2021 13:09:32 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzI-00AImB-Cq for linux-arm-kernel@lists.infradead.org; Fri, 17 Dec 2021 13:09:30 +0000 Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1myCzF-0004Ur-9K; Fri, 17 Dec 2021 14:09:25 +0100 Received: from sha by dude02.hi.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1myCzE-00Cjq6-0c; Fri, 17 Dec 2021 14:09:24 +0100 From: Sascha Hauer To: linux-rockchip@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Michael Riesch , kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 3/4] soc: rockchip: power-domain: Add regulator support Date: Fri, 17 Dec 2021 14:09:18 +0100 Message-Id: <20211217130919.3035788-4-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211217130919.3035788-1-s.hauer@pengutronix.de> References: <20211217130919.3035788-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211217_050928_488576_D3CFFFA1 X-CRM114-Status: GOOD ( 17.39 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This patch allows to let a domain be supplied by a regulator which is needed for the GPU on the rk3568-EVB board. Signed-off-by: Sascha Hauer --- drivers/soc/rockchip/pm_domains.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/soc/rockchip/pm_domains.c b/drivers/soc/rockchip/pm_domains.c index dcfd3db649f58..e7db888cc226c 100644 --- a/drivers/soc/rockchip/pm_domains.c +++ b/drivers/soc/rockchip/pm_domains.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,7 @@ struct rockchip_pm_domain { u32 *qos_save_regs[MAX_QOS_REGS_NUM]; int num_clks; struct clk_bulk_data *clks; + struct regulator *regulator; }; struct rockchip_pmu { @@ -344,6 +346,14 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on) static int rockchip_pd_power_on(struct generic_pm_domain *domain) { struct rockchip_pm_domain *pd = to_rockchip_pd(domain); + struct rockchip_pmu *pmu = pd->pmu; + int ret; + + ret = regulator_enable(pd->regulator); + if (ret) { + dev_err(pmu->dev, "failed to enable regulator: %d\n", ret); + return ret; + } return rockchip_pd_power(pd, true); } @@ -351,8 +361,15 @@ static int rockchip_pd_power_on(struct generic_pm_domain *domain) static int rockchip_pd_power_off(struct generic_pm_domain *domain) { struct rockchip_pm_domain *pd = to_rockchip_pd(domain); + int ret; - return rockchip_pd_power(pd, false); + ret = rockchip_pd_power(pd, false); + if (ret) + return ret; + + regulator_disable(pd->regulator); + + return 0; } static int rockchip_pd_attach_dev(struct generic_pm_domain *genpd, @@ -500,6 +517,11 @@ static int rockchip_domain_probe(struct platform_device *pdev) pd->info = pd_info; pd->pmu = pd_info->pmu; + pd->regulator = devm_regulator_get(&pdev->dev, "power"); + + if (IS_ERR(pd->regulator)) + return PTR_ERR(pd->regulator); + pd->num_clks = devm_clk_bulk_get_all(&pdev->dev, &pd->clks); if (pd->num_clks < 0) return pd->num_clks; From patchwork Fri Dec 17 13:09:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sascha Hauer X-Patchwork-Id: 12696655 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8FF63C433F5 for ; Fri, 17 Dec 2021 13:11:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=nLbYmoJ47O1X3FCNN1m5B9JmksPv5RVP3QHo1PiKIvc=; b=E1nkzZ6fkoGDWT mk0STKmhDrCPM+Lpy4iR5qKri0h+12k60cPgKcM1mqcH6hjvERmVLSPOEJMa4v/eANz5mN24gKceh 3kmfWagntkNnWf32hb5SPk05XKJuI2+X3m3bII7GjJh5QNbpj3WmWWUPU5FWKZnd4FLjqJZCyXHfw EPVPOkmQQk7h8H2br2zx5ihdWcdb53sQd9R/N3rHc+5MRh/HUykfg3VOEBX5LnYoTKlYsnVLOzAUT B29aJRlhbx1M8QBF9Ku6Fazm9AJLVkUVpPuRxUO+ePcmF574JYGOCrWyQzst+oFNQWL7BOc+ezM4F 8bEUDyJKOFsy2sx6fYlw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1myD0G-00AJKM-LF; Fri, 17 Dec 2021 13:10:28 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1myCzW-00AIsE-LH for linux-arm-kernel@lists.infradead.org; Fri, 17 Dec 2021 13:09:43 +0000 Received: from dude02.hi.pengutronix.de ([2001:67c:670:100:1d::28]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1myCzF-0004Us-9N; Fri, 17 Dec 2021 14:09:25 +0100 Received: from sha by dude02.hi.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1myCzE-00Cjq9-15; Fri, 17 Dec 2021 14:09:24 +0100 From: Sascha Hauer To: linux-rockchip@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Michael Riesch , kernel@pengutronix.de, Sascha Hauer Subject: [PATCH 4/4] dt-bindings: power: rockchip: Add power-supply to domain nodes Date: Fri, 17 Dec 2021 14:09:19 +0100 Message-Id: <20211217130919.3035788-5-s.hauer@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211217130919.3035788-1-s.hauer@pengutronix.de> References: <20211217130919.3035788-1-s.hauer@pengutronix.de> MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::28 X-SA-Exim-Mail-From: sha@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211217_050942_743263_CDBCAE4E X-CRM114-Status: UNSURE ( 9.76 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Signed-off-by: Sascha Hauer --- .../bindings/power/rockchip,power-controller.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml index 9b9d710874663..f7e4b95fb6feb 100644 --- a/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml +++ b/Documentation/devicetree/bindings/power/rockchip,power-controller.yaml @@ -71,6 +71,8 @@ patternProperties: "#size-cells": const: 0 + power-supply: true + patternProperties: "^power-domain@[0-9a-f]+$": @@ -85,6 +87,8 @@ patternProperties: "#size-cells": const: 0 + power-supply: true + patternProperties: "^power-domain@[0-9a-f]+$": @@ -96,6 +100,8 @@ patternProperties: "#power-domain-cells": const: 0 + power-supply: true + $defs: pd-node: type: object