From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jon Hunter Subject: Re: [PATCH v7 4/4] soc/tegra: pmc: Use the new reset APIs to manage reset controllers Date: Fri, 20 Oct 2017 16:51:24 +0100 Message-ID: <1071671c-9edb-e3b0-a710-843b8644a512@nvidia.com> References: <1500479948-29988-1-git-send-email-p.zabel@pengutronix.de> <1500479948-29988-5-git-send-email-p.zabel@pengutronix.de> <1508426260.7665.24.camel@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1508426260.7665.24.camel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org> Content-Language: en-US Sender: linux-tegra-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Philipp Zabel , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: Vivek Gautam , Felipe Balbi , Greg Kroah-Hartman , Thierry Reding , linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, kernel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org List-Id: linux-tegra@vger.kernel.org Hi Philipp, On 19/10/17 16:17, Philipp Zabel wrote: > Hi Jon, Thierry, > > On Wed, 2017-07-19 at 17:59 +0200, Philipp Zabel wrote: >> From: Vivek Gautam >> >> Make use of of_reset_control_array_get_exclusive() to manage >> an array of reset controllers available with the device. >> >> Cc: Jon Hunter >> Cc: Thierry Reding >> Signed-off-by: Vivek Gautam >> [p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org: switch to hidden reset control array] >> Signed-off-by: Philipp Zabel > > will you pick this up now that the prerequisite patch 1 is contained in > master? > Please let me know if there are any issues with this patch. > > regards > Philipp > >> --- >> No changes since v6. >> --- >> drivers/soc/tegra/pmc.c | 82 ++++++++++++------------------------------------- >> 1 file changed, 20 insertions(+), 62 deletions(-) >> >> diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c >> index e233dd5dcab3d..749b218147a19 100644 >> --- a/drivers/soc/tegra/pmc.c >> +++ b/drivers/soc/tegra/pmc.c >> @@ -124,8 +124,7 @@ struct tegra_powergate { >> unsigned int id; >> struct clk **clks; >> unsigned int num_clks; >> - struct reset_control **resets; >> - unsigned int num_resets; >> + struct reset_control *reset; >> }; >> >> struct tegra_io_pad_soc { >> @@ -348,32 +347,14 @@ static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) >> return err; >> } >> >> -static int tegra_powergate_reset_assert(struct tegra_powergate *pg) >> +static inline int tegra_powergate_reset_assert(struct tegra_powergate *pg) >> { >> - unsigned int i; >> - int err; >> - >> - for (i = 0; i < pg->num_resets; i++) { >> - err = reset_control_assert(pg->resets[i]); >> - if (err) >> - return err; >> - } >> - >> - return 0; >> + return reset_control_assert(pg->reset); >> } >> >> -static int tegra_powergate_reset_deassert(struct tegra_powergate *pg) >> +static inline int tegra_powergate_reset_deassert(struct tegra_powergate *pg) >> { >> - unsigned int i; >> - int err; >> - >> - for (i = 0; i < pg->num_resets; i++) { >> - err = reset_control_deassert(pg->resets[i]); >> - if (err) >> - return err; >> - } >> - >> - return 0; >> + return reset_control_deassert(pg->reset); >> } Nit-pick ... I think we should just get rid of this inline functions now and just call reset_control_assert/deassert() where these are used. >> static int tegra_powergate_power_up(struct tegra_powergate *pg, >> @@ -566,8 +547,7 @@ int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk, >> pg.id = id; >> pg.clks = &clk; >> pg.num_clks = 1; >> - pg.resets = &rst; >> - pg.num_resets = 1; >> + pg.reset = IS_ERR(rst) ? NULL : rst; >> >> err = tegra_powergate_power_up(&pg, false); >> if (err) >> @@ -755,45 +735,26 @@ static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, >> static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, >> struct device_node *np, bool off) >> { >> - struct reset_control *rst; >> - unsigned int i, count; >> int err; >> >> - count = of_count_phandle_with_args(np, "resets", "#reset-cells"); >> - if (count == 0) >> - return -ENODEV; >> - >> - pg->resets = kcalloc(count, sizeof(rst), GFP_KERNEL); >> - if (!pg->resets) >> - return -ENOMEM; >> - >> - for (i = 0; i < count; i++) { >> - pg->resets[i] = of_reset_control_get_by_index(np, i); >> - if (IS_ERR(pg->resets[i])) { >> - err = PTR_ERR(pg->resets[i]); >> - goto error; >> - } >> - >> - if (off) >> - err = reset_control_assert(pg->resets[i]); >> - else >> - err = reset_control_deassert(pg->resets[i]); >> - >> - if (err) { >> - reset_control_put(pg->resets[i]); >> - goto error; >> - } >> + pg->reset = of_reset_control_array_get_exclusive(np); >> + if (IS_ERR(pg->reset)) { >> + pr_err("failed to get device resets\n"); >> + return PTR_ERR(pg->reset); >> } >> >> - pg->num_resets = count; >> + if (off) >> + err = reset_control_assert(pg->reset); >> + else >> + err = reset_control_deassert(pg->reset); >> >> - return 0; >> + if (err) >> + goto put_reset; >> >> -error: >> - while (i--) >> - reset_control_put(pg->resets[i]); >> + return 0; >> >> - kfree(pg->resets); >> +put_reset: >> + reset_control_put(pg->reset); >> >> return err; >> } >> @@ -885,10 +846,7 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) >> pm_genpd_remove(&pg->genpd); >> >> remove_resets: >> - while (pg->num_resets--) >> - reset_control_put(pg->resets[pg->num_resets]); >> - >> - kfree(pg->resets); >> + reset_control_put(pg->reset); >> >> remove_clks: >> while (pg->num_clks--) Otherwise ... Acked-by: Jon Hunter Thierry has just sent out his pull requests for v4.15 so we may have missed this release :-( Cheers Jon -- nvpublic From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752467AbdJTPyJ (ORCPT ); Fri, 20 Oct 2017 11:54:09 -0400 Received: from hqemgate14.nvidia.com ([216.228.121.143]:2417 "EHLO hqemgate14.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752009AbdJTPyH (ORCPT ); Fri, 20 Oct 2017 11:54:07 -0400 X-PGP-Universal: processed; by hqpgpgate101.nvidia.com on Fri, 20 Oct 2017 08:53:36 -0700 Subject: Re: [PATCH v7 4/4] soc/tegra: pmc: Use the new reset APIs to manage reset controllers To: Philipp Zabel , CC: Vivek Gautam , Felipe Balbi , Greg Kroah-Hartman , "Thierry Reding" , , , , References: <1500479948-29988-1-git-send-email-p.zabel@pengutronix.de> <1500479948-29988-5-git-send-email-p.zabel@pengutronix.de> <1508426260.7665.24.camel@pengutronix.de> From: Jon Hunter Message-ID: <1071671c-9edb-e3b0-a710-843b8644a512@nvidia.com> Date: Fri, 20 Oct 2017 16:51:24 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <1508426260.7665.24.camel@pengutronix.de> X-Originating-IP: [10.21.132.144] X-ClientProxiedBy: UKMAIL101.nvidia.com (10.26.138.13) To UKMAIL101.nvidia.com (10.26.138.13) Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Philipp, On 19/10/17 16:17, Philipp Zabel wrote: > Hi Jon, Thierry, > > On Wed, 2017-07-19 at 17:59 +0200, Philipp Zabel wrote: >> From: Vivek Gautam >> >> Make use of of_reset_control_array_get_exclusive() to manage >> an array of reset controllers available with the device. >> >> Cc: Jon Hunter >> Cc: Thierry Reding >> Signed-off-by: Vivek Gautam >> [p.zabel@pengutronix.de: switch to hidden reset control array] >> Signed-off-by: Philipp Zabel > > will you pick this up now that the prerequisite patch 1 is contained in > master? > Please let me know if there are any issues with this patch. > > regards > Philipp > >> --- >> No changes since v6. >> --- >> drivers/soc/tegra/pmc.c | 82 ++++++++++++------------------------------------- >> 1 file changed, 20 insertions(+), 62 deletions(-) >> >> diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c >> index e233dd5dcab3d..749b218147a19 100644 >> --- a/drivers/soc/tegra/pmc.c >> +++ b/drivers/soc/tegra/pmc.c >> @@ -124,8 +124,7 @@ struct tegra_powergate { >> unsigned int id; >> struct clk **clks; >> unsigned int num_clks; >> - struct reset_control **resets; >> - unsigned int num_resets; >> + struct reset_control *reset; >> }; >> >> struct tegra_io_pad_soc { >> @@ -348,32 +347,14 @@ static int tegra_powergate_enable_clocks(struct tegra_powergate *pg) >> return err; >> } >> >> -static int tegra_powergate_reset_assert(struct tegra_powergate *pg) >> +static inline int tegra_powergate_reset_assert(struct tegra_powergate *pg) >> { >> - unsigned int i; >> - int err; >> - >> - for (i = 0; i < pg->num_resets; i++) { >> - err = reset_control_assert(pg->resets[i]); >> - if (err) >> - return err; >> - } >> - >> - return 0; >> + return reset_control_assert(pg->reset); >> } >> >> -static int tegra_powergate_reset_deassert(struct tegra_powergate *pg) >> +static inline int tegra_powergate_reset_deassert(struct tegra_powergate *pg) >> { >> - unsigned int i; >> - int err; >> - >> - for (i = 0; i < pg->num_resets; i++) { >> - err = reset_control_deassert(pg->resets[i]); >> - if (err) >> - return err; >> - } >> - >> - return 0; >> + return reset_control_deassert(pg->reset); >> } Nit-pick ... I think we should just get rid of this inline functions now and just call reset_control_assert/deassert() where these are used. >> static int tegra_powergate_power_up(struct tegra_powergate *pg, >> @@ -566,8 +547,7 @@ int tegra_powergate_sequence_power_up(unsigned int id, struct clk *clk, >> pg.id = id; >> pg.clks = &clk; >> pg.num_clks = 1; >> - pg.resets = &rst; >> - pg.num_resets = 1; >> + pg.reset = IS_ERR(rst) ? NULL : rst; >> >> err = tegra_powergate_power_up(&pg, false); >> if (err) >> @@ -755,45 +735,26 @@ static int tegra_powergate_of_get_clks(struct tegra_powergate *pg, >> static int tegra_powergate_of_get_resets(struct tegra_powergate *pg, >> struct device_node *np, bool off) >> { >> - struct reset_control *rst; >> - unsigned int i, count; >> int err; >> >> - count = of_count_phandle_with_args(np, "resets", "#reset-cells"); >> - if (count == 0) >> - return -ENODEV; >> - >> - pg->resets = kcalloc(count, sizeof(rst), GFP_KERNEL); >> - if (!pg->resets) >> - return -ENOMEM; >> - >> - for (i = 0; i < count; i++) { >> - pg->resets[i] = of_reset_control_get_by_index(np, i); >> - if (IS_ERR(pg->resets[i])) { >> - err = PTR_ERR(pg->resets[i]); >> - goto error; >> - } >> - >> - if (off) >> - err = reset_control_assert(pg->resets[i]); >> - else >> - err = reset_control_deassert(pg->resets[i]); >> - >> - if (err) { >> - reset_control_put(pg->resets[i]); >> - goto error; >> - } >> + pg->reset = of_reset_control_array_get_exclusive(np); >> + if (IS_ERR(pg->reset)) { >> + pr_err("failed to get device resets\n"); >> + return PTR_ERR(pg->reset); >> } >> >> - pg->num_resets = count; >> + if (off) >> + err = reset_control_assert(pg->reset); >> + else >> + err = reset_control_deassert(pg->reset); >> >> - return 0; >> + if (err) >> + goto put_reset; >> >> -error: >> - while (i--) >> - reset_control_put(pg->resets[i]); >> + return 0; >> >> - kfree(pg->resets); >> +put_reset: >> + reset_control_put(pg->reset); >> >> return err; >> } >> @@ -885,10 +846,7 @@ static void tegra_powergate_add(struct tegra_pmc *pmc, struct device_node *np) >> pm_genpd_remove(&pg->genpd); >> >> remove_resets: >> - while (pg->num_resets--) >> - reset_control_put(pg->resets[pg->num_resets]); >> - >> - kfree(pg->resets); >> + reset_control_put(pg->reset); >> >> remove_clks: >> while (pg->num_clks--) Otherwise ... Acked-by: Jon Hunter Thierry has just sent out his pull requests for v4.15 so we may have missed this release :-( Cheers Jon -- nvpublic