From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 02847C4363D for ; Fri, 25 Sep 2020 10:56:20 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7146F21D91 for ; Fri, 25 Sep 2020 10:56:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="zgnlyEpR"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="TWoLkNjQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7146F21D91 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=2Ett2tQvOZ2iinr93NimQchEXsPAEIcNs6lJ0MZAxG0=; b=zgnlyEpRaBA0psAXMA6dd2sWS iOZhTD+MGxiIeVbBaE760ewAIaDvjfpC3YNvOBIjB9u7auGD905njV3SnVQ0GKh1YLnycai74z/x+ 5QdERkjejjzTr/ipExVJUfQZ+pOedSYE+2XUdFgoiJgoPNfQYrRYPwbkMbQKyuwjv/oBiH2IBPB+D k4KIiF92U/JZznqFWE3W1cfZpUx2XqDobJgOegqjOiSGFY2mMlWonzJB25JzVnsnmaQSG1VVkkhTF KWqWHoYhHCAEWBuz1YekvhjupOsm4e5sn7/P4aNqE85jd0yCWt6Ic1u6+OU2tISd/4kK9XjBioOq8 4RIbfMSBQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLlOa-0000yd-AR; Fri, 25 Sep 2020 10:56:08 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLlOY-0000xe-10; Fri, 25 Sep 2020 10:56:07 +0000 X-UUID: 4861cb09f90a410cbc25d24202bfbb8c-20200925 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=QSsY9bGW8QogtB8BuZJoi6P8Bw0CZxSbHu+WA8g8Uzo=; b=TWoLkNjQMHlV/2mvM+1ozpjNM0gv4MJw+MHWCreeILUfB5/wRevpCOiqLU9A8fkOXarDpLqWq+5g2uGq1WvHejxNpVrCzDXo13PckiUB92xvlmEXnuHUA6mEKF7g73ZUfy3c9wlXAA2at2BIvzsHcvtAcHxZVhEG1MhgkPp5H/k=; X-UUID: 4861cb09f90a410cbc25d24202bfbb8c-20200925 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1824756973; Fri, 25 Sep 2020 02:56:02 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 25 Sep 2020 03:56:00 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 25 Sep 2020 18:55:53 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 25 Sep 2020 18:55:52 +0800 Message-ID: <1601031353.1346.71.camel@mtksdaap41> Subject: Re: [PATCH 08/12] soc: mediatek: pm-domains: Add subsystem clocks From: Weiyi Lu To: Enric Balletbo i Serra Date: Fri, 25 Sep 2020 18:55:53 +0800 In-Reply-To: <20200910172826.3074357-9-enric.balletbo@collabora.com> References: <20200910172826.3074357-1-enric.balletbo@collabora.com> <20200910172826.3074357-9-enric.balletbo@collabora.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200925_065606_206389_92771700 X-CRM114-Status: GOOD ( 26.62 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: drinkcat@chromium.org, linux-kernel@vger.kernel.org, fparent@baylibre.com, Matthias Brugger , linux-mediatek@lists.infradead.org, hsinyi@chromium.org, matthias.bgg@gmail.com, Collabora Kernel ML , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Thu, 2020-09-10 at 19:28 +0200, Enric Balletbo i Serra wrote: > From: Matthias Brugger > > For the bus protection operations, some subsystem clocks need to be enabled > before releasing the protection. This patch identifies the subsystem clocks > by it's name. > > Suggested-by: Weiyi Lu > [Adapted the patch to the mtk-pm-domains driver] > Signed-off-by: Matthias Brugger > Signed-off-by: Enric Balletbo i Serra > --- > > drivers/soc/mediatek/mtk-pm-domains.c | 82 +++++++++++++++++++++++---- > 1 file changed, 70 insertions(+), 12 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c > index 0802eccc3a0b..52a93a87e313 100644 > --- a/drivers/soc/mediatek/mtk-pm-domains.c > +++ b/drivers/soc/mediatek/mtk-pm-domains.c > @@ -3,6 +3,7 @@ > * Copyright (c) 2020 Collabora Ltd. > */ > #include > +#include > #include > #include > #include > @@ -81,6 +82,8 @@ struct scpsys_bus_prot_data { > bool bus_prot_reg_update; > }; > > +#define MAX_SUBSYS_CLKS 10 > + > /** > * struct scpsys_domain_data - scp domain data for power on/off flow > * @sta_mask: The mask for power on/off status bit. > @@ -107,6 +110,8 @@ struct scpsys_domain { > struct scpsys *scpsys; > int num_clks; > struct clk_bulk_data *clks; > + int num_subsys_clks; > + struct clk_bulk_data *subsys_clks; > struct regmap *infracfg; > struct regmap *smi; > }; > @@ -309,16 +314,22 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) > val |= PWR_RST_B_BIT; > writel(val, ctl_addr); > > + ret = clk_bulk_enable(pd->num_subsys_clks, pd->subsys_clks); > + if (ret) > + goto err_pwr_ack; > + > ret = scpsys_sram_enable(pd, ctl_addr); > if (ret < 0) > - goto err_pwr_ack; > + goto err_sram; > > ret = scpsys_bus_protect_disable(pd); > if (ret < 0) > - goto err_pwr_ack; > + goto err_sram; > > return 0; > > +err_sram: > + clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > err_pwr_ack: > clk_bulk_disable(pd->num_clks, pd->clks); > dev_err(scpsys->dev, "Failed to power on domain %s\n", genpd->name); > @@ -342,6 +353,8 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) > if (ret < 0) > return ret; > > + clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > + > /* subsys power off */ > val = readl(ctl_addr); > val |= PWR_ISO_BIT; > @@ -374,8 +387,11 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > { > const struct scpsys_domain_data *domain_data; > struct scpsys_domain *pd; > - int i, ret; > + int i, ret, num_clks; > u32 id; > + int clk_ind = 0; > + struct property *prop; > + const char *clk_name; > > ret = of_property_read_u32(node, "reg", &id); > if (ret) { > @@ -410,28 +426,60 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > if (IS_ERR(pd->smi)) > pd->smi = NULL; > > - pd->num_clks = of_clk_get_parent_count(node); > - if (pd->num_clks > 0) { > + num_clks = of_clk_get_parent_count(node); > + if (num_clks > 0) { > + /* Calculate number of subsys_clks */ > + of_property_for_each_string(node, "clock-names", prop, clk_name) { > + char *subsys; > + > + subsys = strchr(clk_name, '-'); > + if (subsys) > + pd->num_subsys_clks++; > + else > + pd->num_clks++; > + } > + In fact, I don't like the clock naming rules, as Matthias mentioned before. So in my work v17[1] I put subsystem clocks under each power domain sub-node without giving the clock name but put the basic clocks under the power controller node. [1] https://patchwork.kernel.org/patch/11703191/ > pd->clks = devm_kcalloc(scpsys->dev, pd->num_clks, sizeof(*pd->clks), GFP_KERNEL); > if (!pd->clks) > return -ENOMEM; > - } else { > - pd->num_clks = 0; > + > + pd->subsys_clks = devm_kcalloc(scpsys->dev, pd->num_subsys_clks, > + sizeof(*pd->subsys_clks), GFP_KERNEL); > + if (!pd->subsys_clks) > + return -ENOMEM; > } > > for (i = 0; i < pd->num_clks; i++) { > - pd->clks[i].clk = of_clk_get(node, i); > - if (IS_ERR(pd->clks[i].clk)) { > - ret = PTR_ERR(pd->clks[i].clk); > + struct clk *clk = of_clk_get(node, i); > + if (IS_ERR(clk)) { > + ret = PTR_ERR(clk); > dev_err(scpsys->dev, "%pOFn: failed to get clk at index %d: %d\n", node, i, > ret); > - return ret; > + goto err_put_clocks; > + } > + > + pd->clks[clk_ind++].clk = clk; > + } > + > + for (i = 0; i < pd->num_subsys_clks; i++) { > + struct clk *clk = of_clk_get(node, i + clk_ind); > + if (IS_ERR(clk)) { > + ret = PTR_ERR(clk); > + dev_err(scpsys->dev, "%pOFn: failed to get clk at index %d: %d\n", node, > + i + clk_ind, ret); > + goto err_put_subsys_clocks; > } > + > + pd->subsys_clks[i].clk = clk; > } > > + ret = clk_bulk_prepare(pd->num_subsys_clks, pd->subsys_clks); > + if (ret) > + goto err_put_subsys_clocks; > + > ret = clk_bulk_prepare(pd->num_clks, pd->clks); > if (ret) > - goto err_put_clocks; > + goto err_unprepare_subsys_clocks; > > /* > * Initially turn on all domains to make the domains usable > @@ -456,6 +504,12 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > > err_unprepare_clocks: > clk_bulk_unprepare(pd->num_clks, pd->clks); > +err_unprepare_subsys_clocks: > + clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > +err_put_subsys_clocks: > + clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > + devm_kfree(scpsys->dev, pd->subsys_clks); > + pd->num_subsys_clks = 0; > err_put_clocks: > clk_bulk_put(pd->num_clks, pd->clks); > devm_kfree(scpsys->dev, pd->clks); > @@ -537,6 +591,10 @@ static void scpsys_remove_one_domain(struct scpsys_domain *pd) > clk_bulk_unprepare(pd->num_clks, pd->clks); > clk_bulk_put(pd->num_clks, pd->clks); > pd->num_clks = 0; > + > + clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > + clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > + pd->num_subsys_clks = 0; > } > > static void scpsys_domain_cleanup(struct scpsys *scpsys) _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.4 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 80466C4363D for ; Fri, 25 Sep 2020 10:57:39 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 17EF921D91 for ; Fri, 25 Sep 2020 10:57:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="fJE66VtE"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="TWoLkNjQ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 17EF921D91 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=jeYMVB5qEky559j5OotDmcKv59Uw6b2IRHH7zSl7Z24=; b=fJE66VtEQkMVl5fbUut+rJic4 aVK1Hcq9vB70AON6zVzxSSfuy0Ifh38yUCWK0JHMMfFBQ567dH7gCsftJU2MyJOfvBDhGtKSiP3uM Ak8l5QodI9it5bm6uxbuHx0IfwirdzbzwOzX93YqYGnsSJfLDFJTfapvOSKbA6W2teCBkth4/1Wu7 w/GELRnMgeJcEod3EbigDLuPEFDTxT7bbpQSgfuSKpnkhmx0nno5J0W25zIAZDZolYZ03Ond5ZKGf xvsMBDDLt8Tm7D2gMBYCl4jTxONBWpAu/kv9QUz/pN0IVLEkHug0zC3NYV8dbCNxsL2qqtHAKqCk4 s6zmT5pfA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLlOb-0000yn-Vt; Fri, 25 Sep 2020 10:56:10 +0000 Received: from mailgw01.mediatek.com ([216.200.240.184]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kLlOY-0000xe-10; Fri, 25 Sep 2020 10:56:07 +0000 X-UUID: 4861cb09f90a410cbc25d24202bfbb8c-20200925 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=QSsY9bGW8QogtB8BuZJoi6P8Bw0CZxSbHu+WA8g8Uzo=; b=TWoLkNjQMHlV/2mvM+1ozpjNM0gv4MJw+MHWCreeILUfB5/wRevpCOiqLU9A8fkOXarDpLqWq+5g2uGq1WvHejxNpVrCzDXo13PckiUB92xvlmEXnuHUA6mEKF7g73ZUfy3c9wlXAA2at2BIvzsHcvtAcHxZVhEG1MhgkPp5H/k=; X-UUID: 4861cb09f90a410cbc25d24202bfbb8c-20200925 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw01.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 1824756973; Fri, 25 Sep 2020 02:56:02 -0800 Received: from MTKMBS01N1.mediatek.inc (172.21.101.68) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 25 Sep 2020 03:56:00 -0700 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 25 Sep 2020 18:55:53 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 25 Sep 2020 18:55:52 +0800 Message-ID: <1601031353.1346.71.camel@mtksdaap41> Subject: Re: [PATCH 08/12] soc: mediatek: pm-domains: Add subsystem clocks From: Weiyi Lu To: Enric Balletbo i Serra Date: Fri, 25 Sep 2020 18:55:53 +0800 In-Reply-To: <20200910172826.3074357-9-enric.balletbo@collabora.com> References: <20200910172826.3074357-1-enric.balletbo@collabora.com> <20200910172826.3074357-9-enric.balletbo@collabora.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200925_065606_206389_92771700 X-CRM114-Status: GOOD ( 26.62 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: drinkcat@chromium.org, linux-kernel@vger.kernel.org, fparent@baylibre.com, Matthias Brugger , linux-mediatek@lists.infradead.org, hsinyi@chromium.org, matthias.bgg@gmail.com, Collabora Kernel ML , linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Thu, 2020-09-10 at 19:28 +0200, Enric Balletbo i Serra wrote: > From: Matthias Brugger > > For the bus protection operations, some subsystem clocks need to be enabled > before releasing the protection. This patch identifies the subsystem clocks > by it's name. > > Suggested-by: Weiyi Lu > [Adapted the patch to the mtk-pm-domains driver] > Signed-off-by: Matthias Brugger > Signed-off-by: Enric Balletbo i Serra > --- > > drivers/soc/mediatek/mtk-pm-domains.c | 82 +++++++++++++++++++++++---- > 1 file changed, 70 insertions(+), 12 deletions(-) > > diff --git a/drivers/soc/mediatek/mtk-pm-domains.c b/drivers/soc/mediatek/mtk-pm-domains.c > index 0802eccc3a0b..52a93a87e313 100644 > --- a/drivers/soc/mediatek/mtk-pm-domains.c > +++ b/drivers/soc/mediatek/mtk-pm-domains.c > @@ -3,6 +3,7 @@ > * Copyright (c) 2020 Collabora Ltd. > */ > #include > +#include > #include > #include > #include > @@ -81,6 +82,8 @@ struct scpsys_bus_prot_data { > bool bus_prot_reg_update; > }; > > +#define MAX_SUBSYS_CLKS 10 > + > /** > * struct scpsys_domain_data - scp domain data for power on/off flow > * @sta_mask: The mask for power on/off status bit. > @@ -107,6 +110,8 @@ struct scpsys_domain { > struct scpsys *scpsys; > int num_clks; > struct clk_bulk_data *clks; > + int num_subsys_clks; > + struct clk_bulk_data *subsys_clks; > struct regmap *infracfg; > struct regmap *smi; > }; > @@ -309,16 +314,22 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) > val |= PWR_RST_B_BIT; > writel(val, ctl_addr); > > + ret = clk_bulk_enable(pd->num_subsys_clks, pd->subsys_clks); > + if (ret) > + goto err_pwr_ack; > + > ret = scpsys_sram_enable(pd, ctl_addr); > if (ret < 0) > - goto err_pwr_ack; > + goto err_sram; > > ret = scpsys_bus_protect_disable(pd); > if (ret < 0) > - goto err_pwr_ack; > + goto err_sram; > > return 0; > > +err_sram: > + clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > err_pwr_ack: > clk_bulk_disable(pd->num_clks, pd->clks); > dev_err(scpsys->dev, "Failed to power on domain %s\n", genpd->name); > @@ -342,6 +353,8 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) > if (ret < 0) > return ret; > > + clk_bulk_disable(pd->num_subsys_clks, pd->subsys_clks); > + > /* subsys power off */ > val = readl(ctl_addr); > val |= PWR_ISO_BIT; > @@ -374,8 +387,11 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > { > const struct scpsys_domain_data *domain_data; > struct scpsys_domain *pd; > - int i, ret; > + int i, ret, num_clks; > u32 id; > + int clk_ind = 0; > + struct property *prop; > + const char *clk_name; > > ret = of_property_read_u32(node, "reg", &id); > if (ret) { > @@ -410,28 +426,60 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > if (IS_ERR(pd->smi)) > pd->smi = NULL; > > - pd->num_clks = of_clk_get_parent_count(node); > - if (pd->num_clks > 0) { > + num_clks = of_clk_get_parent_count(node); > + if (num_clks > 0) { > + /* Calculate number of subsys_clks */ > + of_property_for_each_string(node, "clock-names", prop, clk_name) { > + char *subsys; > + > + subsys = strchr(clk_name, '-'); > + if (subsys) > + pd->num_subsys_clks++; > + else > + pd->num_clks++; > + } > + In fact, I don't like the clock naming rules, as Matthias mentioned before. So in my work v17[1] I put subsystem clocks under each power domain sub-node without giving the clock name but put the basic clocks under the power controller node. [1] https://patchwork.kernel.org/patch/11703191/ > pd->clks = devm_kcalloc(scpsys->dev, pd->num_clks, sizeof(*pd->clks), GFP_KERNEL); > if (!pd->clks) > return -ENOMEM; > - } else { > - pd->num_clks = 0; > + > + pd->subsys_clks = devm_kcalloc(scpsys->dev, pd->num_subsys_clks, > + sizeof(*pd->subsys_clks), GFP_KERNEL); > + if (!pd->subsys_clks) > + return -ENOMEM; > } > > for (i = 0; i < pd->num_clks; i++) { > - pd->clks[i].clk = of_clk_get(node, i); > - if (IS_ERR(pd->clks[i].clk)) { > - ret = PTR_ERR(pd->clks[i].clk); > + struct clk *clk = of_clk_get(node, i); > + if (IS_ERR(clk)) { > + ret = PTR_ERR(clk); > dev_err(scpsys->dev, "%pOFn: failed to get clk at index %d: %d\n", node, i, > ret); > - return ret; > + goto err_put_clocks; > + } > + > + pd->clks[clk_ind++].clk = clk; > + } > + > + for (i = 0; i < pd->num_subsys_clks; i++) { > + struct clk *clk = of_clk_get(node, i + clk_ind); > + if (IS_ERR(clk)) { > + ret = PTR_ERR(clk); > + dev_err(scpsys->dev, "%pOFn: failed to get clk at index %d: %d\n", node, > + i + clk_ind, ret); > + goto err_put_subsys_clocks; > } > + > + pd->subsys_clks[i].clk = clk; > } > > + ret = clk_bulk_prepare(pd->num_subsys_clks, pd->subsys_clks); > + if (ret) > + goto err_put_subsys_clocks; > + > ret = clk_bulk_prepare(pd->num_clks, pd->clks); > if (ret) > - goto err_put_clocks; > + goto err_unprepare_subsys_clocks; > > /* > * Initially turn on all domains to make the domains usable > @@ -456,6 +504,12 @@ static int scpsys_add_one_domain(struct scpsys *scpsys, struct device_node *node > > err_unprepare_clocks: > clk_bulk_unprepare(pd->num_clks, pd->clks); > +err_unprepare_subsys_clocks: > + clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > +err_put_subsys_clocks: > + clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > + devm_kfree(scpsys->dev, pd->subsys_clks); > + pd->num_subsys_clks = 0; > err_put_clocks: > clk_bulk_put(pd->num_clks, pd->clks); > devm_kfree(scpsys->dev, pd->clks); > @@ -537,6 +591,10 @@ static void scpsys_remove_one_domain(struct scpsys_domain *pd) > clk_bulk_unprepare(pd->num_clks, pd->clks); > clk_bulk_put(pd->num_clks, pd->clks); > pd->num_clks = 0; > + > + clk_bulk_unprepare(pd->num_subsys_clks, pd->subsys_clks); > + clk_bulk_put(pd->num_subsys_clks, pd->subsys_clks); > + pd->num_subsys_clks = 0; > } > > static void scpsys_domain_cleanup(struct scpsys *scpsys) _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_SANE_2 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 23E77C4363D for ; Fri, 25 Sep 2020 10:56:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CE8FE21D91 for ; Fri, 25 Sep 2020 10:56:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="TWoLkNjQ" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728112AbgIYK4C (ORCPT ); Fri, 25 Sep 2020 06:56:02 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:57363 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726255AbgIYK4C (ORCPT ); Fri, 25 Sep 2020 06:56:02 -0400 X-UUID: 4845c4a290464180a08aaa0720a79215-20200925 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=QSsY9bGW8QogtB8BuZJoi6P8Bw0CZxSbHu+WA8g8Uzo=; b=TWoLkNjQMHlV/2mvM+1ozpjNM0gv4MJw+MHWCreeILUfB5/wRevpCOiqLU9A8fkOXarDpLqWq+5g2uGq1WvHejxNpVrCzDXo13PckiUB92xvlmEXnuHUA6mEKF7g73ZUfy3c9wlXAA2at2BIvzsHcvtAcHxZVhEG1MhgkPp5H/k=; X-UUID: 4845c4a290464180a08aaa0720a79215-20200925 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.14 Build 0819 with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 505310534; Fri, 25 Sep 2020 18:55:55 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n1.mediatek.inc (172.21.101.68) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Fri, 25 Sep 2020 18:55:53 +0800 Received: from [172.21.77.4] (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Fri, 25 Sep 2020 18:55:52 +0800 Message-ID: <1601031353.1346.71.camel@mtksdaap41> Subject: Re: [PATCH 08/12] soc: mediatek: pm-domains: Add subsystem clocks From: Weiyi Lu To: Enric Balletbo i Serra CC: , Collabora Kernel ML , , , , , Matthias Brugger , , Date: Fri, 25 Sep 2020 18:55:53 +0800 In-Reply-To: <20200910172826.3074357-9-enric.balletbo@collabora.com> References: <20200910172826.3074357-1-enric.balletbo@collabora.com> <20200910172826.3074357-9-enric.balletbo@collabora.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gVGh1LCAyMDIwLTA5LTEwIGF0IDE5OjI4ICswMjAwLCBFbnJpYyBCYWxsZXRibyBpIFNlcnJh IHdyb3RlOg0KPiBGcm9tOiBNYXR0aGlhcyBCcnVnZ2VyIDxtYnJ1Z2dlckBzdXNlLmNvbT4NCj4g DQo+IEZvciB0aGUgYnVzIHByb3RlY3Rpb24gb3BlcmF0aW9ucywgc29tZSBzdWJzeXN0ZW0gY2xv Y2tzIG5lZWQgdG8gYmUgZW5hYmxlZA0KPiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBwcm90ZWN0aW9u LiBUaGlzIHBhdGNoIGlkZW50aWZpZXMgdGhlIHN1YnN5c3RlbSBjbG9ja3MNCj4gYnkgaXQncyBu YW1lLg0KPiANCj4gU3VnZ2VzdGVkLWJ5OiBXZWl5aSBMdSA8d2VpeWkubHVAbWVkaWF0ZWsuY29t Pg0KPiBbQWRhcHRlZCB0aGUgcGF0Y2ggdG8gdGhlIG10ay1wbS1kb21haW5zIGRyaXZlcl0NCj4g U2lnbmVkLW9mZi1ieTogTWF0dGhpYXMgQnJ1Z2dlciA8bWJydWdnZXJAc3VzZS5jb20+DQo+IFNp Z25lZC1vZmYtYnk6IEVucmljIEJhbGxldGJvIGkgU2VycmEgPGVucmljLmJhbGxldGJvQGNvbGxh Ym9yYS5jb20+DQo+IC0tLQ0KPiANCj4gIGRyaXZlcnMvc29jL21lZGlhdGVrL210ay1wbS1kb21h aW5zLmMgfCA4MiArKysrKysrKysrKysrKysrKysrKysrKy0tLS0NCj4gIDEgZmlsZSBjaGFuZ2Vk LCA3MCBpbnNlcnRpb25zKCspLCAxMiBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3NvYy9tZWRpYXRlay9tdGstcG0tZG9tYWlucy5jIGIvZHJpdmVycy9zb2MvbWVkaWF0 ZWsvbXRrLXBtLWRvbWFpbnMuYw0KPiBpbmRleCAwODAyZWNjYzNhMGIuLjUyYTkzYTg3ZTMxMyAx MDA2NDQNCj4gLS0tIGEvZHJpdmVycy9zb2MvbWVkaWF0ZWsvbXRrLXBtLWRvbWFpbnMuYw0KPiAr KysgYi9kcml2ZXJzL3NvYy9tZWRpYXRlay9tdGstcG0tZG9tYWlucy5jDQo+IEBAIC0zLDYgKzMs NyBAQA0KPiAgICogQ29weXJpZ2h0IChjKSAyMDIwIENvbGxhYm9yYSBMdGQuDQo+ICAgKi8NCj4g ICNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCj4gKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIu aD4NCj4gICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQo+ICAjaW5jbHVkZSA8bGludXgvaW8uaD4N Cj4gICNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4NCj4gQEAgLTgxLDYgKzgyLDggQEAgc3RydWN0 IHNjcHN5c19idXNfcHJvdF9kYXRhIHsNCj4gIAlib29sIGJ1c19wcm90X3JlZ191cGRhdGU7DQo+ ICB9Ow0KPiAgDQo+ICsjZGVmaW5lIE1BWF9TVUJTWVNfQ0xLUyAxMA0KPiArDQo+ICAvKioNCj4g ICAqIHN0cnVjdCBzY3BzeXNfZG9tYWluX2RhdGEgLSBzY3AgZG9tYWluIGRhdGEgZm9yIHBvd2Vy IG9uL29mZiBmbG93DQo+ICAgKiBAc3RhX21hc2s6IFRoZSBtYXNrIGZvciBwb3dlciBvbi9vZmYg c3RhdHVzIGJpdC4NCj4gQEAgLTEwNyw2ICsxMTAsOCBAQCBzdHJ1Y3Qgc2Nwc3lzX2RvbWFpbiB7 DQo+ICAJc3RydWN0IHNjcHN5cyAqc2Nwc3lzOw0KPiAgCWludCBudW1fY2xrczsNCj4gIAlzdHJ1 Y3QgY2xrX2J1bGtfZGF0YSAqY2xrczsNCj4gKwlpbnQgbnVtX3N1YnN5c19jbGtzOw0KPiArCXN0 cnVjdCBjbGtfYnVsa19kYXRhICpzdWJzeXNfY2xrczsNCj4gIAlzdHJ1Y3QgcmVnbWFwICppbmZy YWNmZzsNCj4gIAlzdHJ1Y3QgcmVnbWFwICpzbWk7DQo+ICB9Ow0KPiBAQCAtMzA5LDE2ICszMTQs MjIgQEAgc3RhdGljIGludCBzY3BzeXNfcG93ZXJfb24oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWlu ICpnZW5wZCkNCj4gIAl2YWwgfD0gUFdSX1JTVF9CX0JJVDsNCj4gIAl3cml0ZWwodmFsLCBjdGxf YWRkcik7DQo+ICANCj4gKwlyZXQgPSBjbGtfYnVsa19lbmFibGUocGQtPm51bV9zdWJzeXNfY2xr cywgcGQtPnN1YnN5c19jbGtzKTsNCj4gKwlpZiAocmV0KQ0KPiArCQlnb3RvIGVycl9wd3JfYWNr Ow0KPiArDQo+ICAJcmV0ID0gc2Nwc3lzX3NyYW1fZW5hYmxlKHBkLCBjdGxfYWRkcik7DQo+ICAJ aWYgKHJldCA8IDApDQo+IC0JCWdvdG8gZXJyX3B3cl9hY2s7DQo+ICsJCWdvdG8gZXJyX3NyYW07 DQo+ICANCj4gIAlyZXQgPSBzY3BzeXNfYnVzX3Byb3RlY3RfZGlzYWJsZShwZCk7DQo+ICAJaWYg KHJldCA8IDApDQo+IC0JCWdvdG8gZXJyX3B3cl9hY2s7DQo+ICsJCWdvdG8gZXJyX3NyYW07DQo+ ICANCj4gIAlyZXR1cm4gMDsNCj4gIA0KPiArZXJyX3NyYW06DQo+ICsJY2xrX2J1bGtfZGlzYWJs ZShwZC0+bnVtX3N1YnN5c19jbGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiAgZXJyX3B3cl9hY2s6 DQo+ICAJY2xrX2J1bGtfZGlzYWJsZShwZC0+bnVtX2Nsa3MsIHBkLT5jbGtzKTsNCj4gIAlkZXZf ZXJyKHNjcHN5cy0+ZGV2LCAiRmFpbGVkIHRvIHBvd2VyIG9uIGRvbWFpbiAlc1xuIiwgZ2VucGQt Pm5hbWUpOw0KPiBAQCAtMzQyLDYgKzM1Myw4IEBAIHN0YXRpYyBpbnQgc2Nwc3lzX3Bvd2VyX29m ZihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQ0KPiAgCWlmIChyZXQgPCAwKQ0KPiAg CQlyZXR1cm4gcmV0Ow0KPiAgDQo+ICsJY2xrX2J1bGtfZGlzYWJsZShwZC0+bnVtX3N1YnN5c19j bGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiArDQo+ICAJLyogc3Vic3lzIHBvd2VyIG9mZiAqLw0K PiAgCXZhbCA9IHJlYWRsKGN0bF9hZGRyKTsNCj4gIAl2YWwgfD0gUFdSX0lTT19CSVQ7DQo+IEBA IC0zNzQsOCArMzg3LDExIEBAIHN0YXRpYyBpbnQgc2Nwc3lzX2FkZF9vbmVfZG9tYWluKHN0cnVj dCBzY3BzeXMgKnNjcHN5cywgc3RydWN0IGRldmljZV9ub2RlICpub2RlDQo+ICB7DQo+ICAJY29u c3Qgc3RydWN0IHNjcHN5c19kb21haW5fZGF0YSAqZG9tYWluX2RhdGE7DQo+ICAJc3RydWN0IHNj cHN5c19kb21haW4gKnBkOw0KPiAtCWludCBpLCByZXQ7DQo+ICsJaW50IGksIHJldCwgbnVtX2Ns a3M7DQo+ICAJdTMyIGlkOw0KPiArCWludCBjbGtfaW5kID0gMDsNCj4gKwlzdHJ1Y3QgcHJvcGVy dHkgKnByb3A7DQo+ICsJY29uc3QgY2hhciAqY2xrX25hbWU7DQo+ICANCj4gIAlyZXQgPSBvZl9w cm9wZXJ0eV9yZWFkX3UzMihub2RlLCAicmVnIiwgJmlkKTsNCj4gIAlpZiAocmV0KSB7DQo+IEBA IC00MTAsMjggKzQyNiw2MCBAQCBzdGF0aWMgaW50IHNjcHN5c19hZGRfb25lX2RvbWFpbihzdHJ1 Y3Qgc2Nwc3lzICpzY3BzeXMsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZQ0KPiAgCWlmIChJU19F UlIocGQtPnNtaSkpDQo+ICAJCXBkLT5zbWkgPSBOVUxMOw0KPiAgDQo+IC0JcGQtPm51bV9jbGtz ID0gb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobm9kZSk7DQo+IC0JaWYgKHBkLT5udW1fY2xrcyA+ IDApIHsNCj4gKwludW1fY2xrcyA9IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5vZGUpOw0KPiAr CWlmIChudW1fY2xrcyA+IDApIHsNCj4gKwkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBzdWJzeXNf Y2xrcyAqLw0KPiArCQlvZl9wcm9wZXJ0eV9mb3JfZWFjaF9zdHJpbmcobm9kZSwgImNsb2NrLW5h bWVzIiwgcHJvcCwgY2xrX25hbWUpIHsNCj4gKwkJCWNoYXIgKnN1YnN5czsNCj4gKw0KPiArCQkJ c3Vic3lzID0gc3RyY2hyKGNsa19uYW1lLCAnLScpOw0KPiArCQkJaWYgKHN1YnN5cykNCj4gKwkJ CQlwZC0+bnVtX3N1YnN5c19jbGtzKys7DQo+ICsJCQllbHNlDQo+ICsJCQkJcGQtPm51bV9jbGtz Kys7DQo+ICsJCX0NCj4gKw0KDQpJbiBmYWN0LCBJIGRvbid0IGxpa2UgdGhlIGNsb2NrIG5hbWlu ZyBydWxlcywgYXMgTWF0dGhpYXMgbWVudGlvbmVkDQpiZWZvcmUuIFNvIGluIG15IHdvcmsgdjE3 WzFdDQpJIHB1dCBzdWJzeXN0ZW0gY2xvY2tzIHVuZGVyIGVhY2ggcG93ZXIgZG9tYWluIHN1Yi1u b2RlIHdpdGhvdXQgZ2l2aW5nDQp0aGUgY2xvY2sgbmFtZSBidXQgcHV0IHRoZSBiYXNpYyBjbG9j a3MgdW5kZXIgdGhlIHBvd2VyIGNvbnRyb2xsZXIgbm9kZS4NCg0KWzFdIGh0dHBzOi8vcGF0Y2h3 b3JrLmtlcm5lbC5vcmcvcGF0Y2gvMTE3MDMxOTEvDQoNCg0KPiAgCQlwZC0+Y2xrcyA9IGRldm1f a2NhbGxvYyhzY3BzeXMtPmRldiwgcGQtPm51bV9jbGtzLCBzaXplb2YoKnBkLT5jbGtzKSwgR0ZQ X0tFUk5FTCk7DQo+ICAJCWlmICghcGQtPmNsa3MpDQo+ICAJCQlyZXR1cm4gLUVOT01FTTsNCj4g LQl9IGVsc2Ugew0KPiAtCQlwZC0+bnVtX2Nsa3MgPSAwOw0KPiArDQo+ICsJCXBkLT5zdWJzeXNf Y2xrcyA9IGRldm1fa2NhbGxvYyhzY3BzeXMtPmRldiwgcGQtPm51bV9zdWJzeXNfY2xrcywNCj4g KwkJCQkJICAgICAgIHNpemVvZigqcGQtPnN1YnN5c19jbGtzKSwgR0ZQX0tFUk5FTCk7DQo+ICsJ CWlmICghcGQtPnN1YnN5c19jbGtzKQ0KPiArCQkJcmV0dXJuIC1FTk9NRU07DQo+ICAJfQ0KPiAg DQo+ICAJZm9yIChpID0gMDsgaSA8IHBkLT5udW1fY2xrczsgaSsrKSB7DQo+IC0JCXBkLT5jbGtz W2ldLmNsayA9IG9mX2Nsa19nZXQobm9kZSwgaSk7DQo+IC0JCWlmIChJU19FUlIocGQtPmNsa3Nb aV0uY2xrKSkgew0KPiAtCQkJcmV0ID0gUFRSX0VSUihwZC0+Y2xrc1tpXS5jbGspOw0KPiArCQlz dHJ1Y3QgY2xrICpjbGsgPSBvZl9jbGtfZ2V0KG5vZGUsIGkpOw0KPiArCQlpZiAoSVNfRVJSKGNs aykpIHsNCj4gKwkJCXJldCA9IFBUUl9FUlIoY2xrKTsNCj4gIAkJCWRldl9lcnIoc2Nwc3lzLT5k ZXYsICIlcE9GbjogZmFpbGVkIHRvIGdldCBjbGsgYXQgaW5kZXggJWQ6ICVkXG4iLCBub2RlLCBp LA0KPiAgCQkJCXJldCk7DQo+IC0JCQlyZXR1cm4gcmV0Ow0KPiArCQkJZ290byBlcnJfcHV0X2Ns b2NrczsNCj4gKwkJfQ0KPiArDQo+ICsJCXBkLT5jbGtzW2Nsa19pbmQrK10uY2xrID0gY2xrOw0K PiArCX0NCj4gKw0KPiArCWZvciAoaSA9IDA7IGkgPCBwZC0+bnVtX3N1YnN5c19jbGtzOyBpKysp IHsNCj4gKwkJc3RydWN0IGNsayAqY2xrID0gb2ZfY2xrX2dldChub2RlLCBpICsgY2xrX2luZCk7 DQo+ICsJCWlmIChJU19FUlIoY2xrKSkgew0KPiArCQkJcmV0ID0gUFRSX0VSUihjbGspOw0KPiAr CQkJZGV2X2VycihzY3BzeXMtPmRldiwgIiVwT0ZuOiBmYWlsZWQgdG8gZ2V0IGNsayBhdCBpbmRl eCAlZDogJWRcbiIsIG5vZGUsDQo+ICsJCQkJaSArIGNsa19pbmQsIHJldCk7DQo+ICsJCQlnb3Rv IGVycl9wdXRfc3Vic3lzX2Nsb2NrczsNCj4gIAkJfQ0KPiArDQo+ICsJCXBkLT5zdWJzeXNfY2xr c1tpXS5jbGsgPSBjbGs7DQo+ICAJfQ0KPiAgDQo+ICsJcmV0ID0gY2xrX2J1bGtfcHJlcGFyZShw ZC0+bnVtX3N1YnN5c19jbGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiArCWlmIChyZXQpDQo+ICsJ CWdvdG8gZXJyX3B1dF9zdWJzeXNfY2xvY2tzOw0KPiArDQo+ICAJcmV0ID0gY2xrX2J1bGtfcHJl cGFyZShwZC0+bnVtX2Nsa3MsIHBkLT5jbGtzKTsNCj4gIAlpZiAocmV0KQ0KPiAtCQlnb3RvIGVy cl9wdXRfY2xvY2tzOw0KPiArCQlnb3RvIGVycl91bnByZXBhcmVfc3Vic3lzX2Nsb2NrczsNCj4g IA0KPiAgCS8qDQo+ICAJICogSW5pdGlhbGx5IHR1cm4gb24gYWxsIGRvbWFpbnMgdG8gbWFrZSB0 aGUgZG9tYWlucyB1c2FibGUNCj4gQEAgLTQ1Niw2ICs1MDQsMTIgQEAgc3RhdGljIGludCBzY3Bz eXNfYWRkX29uZV9kb21haW4oc3RydWN0IHNjcHN5cyAqc2Nwc3lzLCBzdHJ1Y3QgZGV2aWNlX25v ZGUgKm5vZGUNCj4gIA0KPiAgZXJyX3VucHJlcGFyZV9jbG9ja3M6DQo+ICAJY2xrX2J1bGtfdW5w cmVwYXJlKHBkLT5udW1fY2xrcywgcGQtPmNsa3MpOw0KPiArZXJyX3VucHJlcGFyZV9zdWJzeXNf Y2xvY2tzOg0KPiArCWNsa19idWxrX3VucHJlcGFyZShwZC0+bnVtX3N1YnN5c19jbGtzLCBwZC0+ c3Vic3lzX2Nsa3MpOw0KPiArZXJyX3B1dF9zdWJzeXNfY2xvY2tzOg0KPiArCWNsa19idWxrX3B1 dChwZC0+bnVtX3N1YnN5c19jbGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiArCWRldm1fa2ZyZWUo c2Nwc3lzLT5kZXYsIHBkLT5zdWJzeXNfY2xrcyk7DQo+ICsJcGQtPm51bV9zdWJzeXNfY2xrcyA9 IDA7DQo+ICBlcnJfcHV0X2Nsb2NrczoNCj4gIAljbGtfYnVsa19wdXQocGQtPm51bV9jbGtzLCBw ZC0+Y2xrcyk7DQo+ICAJZGV2bV9rZnJlZShzY3BzeXMtPmRldiwgcGQtPmNsa3MpOw0KPiBAQCAt NTM3LDYgKzU5MSwxMCBAQCBzdGF0aWMgdm9pZCBzY3BzeXNfcmVtb3ZlX29uZV9kb21haW4oc3Ry dWN0IHNjcHN5c19kb21haW4gKnBkKQ0KPiAgCWNsa19idWxrX3VucHJlcGFyZShwZC0+bnVtX2Ns a3MsIHBkLT5jbGtzKTsNCj4gIAljbGtfYnVsa19wdXQocGQtPm51bV9jbGtzLCBwZC0+Y2xrcyk7 DQo+ICAJcGQtPm51bV9jbGtzID0gMDsNCj4gKw0KPiArCWNsa19idWxrX3VucHJlcGFyZShwZC0+ bnVtX3N1YnN5c19jbGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiArCWNsa19idWxrX3B1dChwZC0+ bnVtX3N1YnN5c19jbGtzLCBwZC0+c3Vic3lzX2Nsa3MpOw0KPiArCXBkLT5udW1fc3Vic3lzX2Ns a3MgPSAwOw0KPiAgfQ0KPiAgDQo+ICBzdGF0aWMgdm9pZCBzY3BzeXNfZG9tYWluX2NsZWFudXAo c3RydWN0IHNjcHN5cyAqc2Nwc3lzKQ0KDQo=