From patchwork Mon Apr 3 13:42:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Gautam X-Patchwork-Id: 746450 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vxYFj1fgSz9s83 for ; Mon, 3 Apr 2017 23:42:49 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=codeaurora.org header.i=@codeaurora.org header.b="e1UPd5AY"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="YLNQ23dZ"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753400AbdDCNme (ORCPT ); Mon, 3 Apr 2017 09:42:34 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:42048 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751515AbdDCNmb (ORCPT ); Mon, 3 Apr 2017 09:42:31 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 23E8660727; Mon, 3 Apr 2017 13:42:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1491226951; bh=4pgswm907PwbfzGx/JBClbCd6mrxLib89mkHNfrq6kQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=e1UPd5AYZs3Jqi33qsyugf4aRVSMxDTDh5MosXRtbfGbx7nzWqxuRceBlH8dKkTG+ pva9HITgFPgMwwojhc+c5dN3mvnAnG2p85Ceou5F7GfYQoAZq0Cbdz+sAA2MtLjpRK YXxhZQQenryulxQqp7ZVzeCkDqZL0i9MvkWSpdFs= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED, T_DKIM_INVALID autolearn=no autolearn_force=no version=3.4.0 Received: from blr-ubuntu-41.ap.qualcomm.com (unknown [202.46.23.61]) (using TLSv1.1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: vivek.gautam@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 7642560DE2; Mon, 3 Apr 2017 13:42:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1491226950; bh=4pgswm907PwbfzGx/JBClbCd6mrxLib89mkHNfrq6kQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=YLNQ23dZ7+eldxuuaHceF5KISN++uvJ1DbBjQMiESXVZ+WJbq4WOdjFFeotUhz9LS X5ZqVzXOswnH8EGrjTbi6k44cj16HVghV5yYwpBEFdsICcvOJGmcRAbrTWMHcRKLbJ 6xs8M/VhDZ0eYdSa0NIUJicuf1VtDawKjhuDRplM= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 7642560DE2 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=vivek.gautam@codeaurora.org From: Vivek Gautam To: linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org Cc: p.zabel@pengutronix.de, swarren@wwwdotorg.org, thierry.reding@gmail.com, balbi@kernel.org, Vivek Gautam , Thierry Reding Subject: [PATCH v2 4/4] soc/tegra: pmc: Use the new reset APIs to manage reset controllers Date: Mon, 3 Apr 2017 19:12:02 +0530 Message-Id: <1491226922-20307-5-git-send-email-vivek.gautam@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1491226922-20307-1-git-send-email-vivek.gautam@codeaurora.org> References: <1491226922-20307-1-git-send-email-vivek.gautam@codeaurora.org> Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org Make use of reset_control_array_*() set of APIs to manage an array of reset controllers available with the device. Cc: Thierry Reding Cc: Philipp Zabel Signed-off-by: Vivek Gautam --- Changes since v1: - New patch added to the series to enable this driver use the newer set of APIs that manage reset control array. drivers/soc/tegra/pmc.c | 92 +++++++++++++++++++++---------------------------- 1 file changed, 39 insertions(+), 53 deletions(-) diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index e233dd5dcab3..d06e624381aa 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -124,7 +124,7 @@ struct tegra_powergate { unsigned int id; struct clk **clks; unsigned int num_clks; - struct reset_control **resets; + struct reset_control_array *resets; unsigned int num_resets; }; @@ -348,32 +348,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_array_assert(pg->num_resets, pg->resets); } -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_array_deassert(pg->num_resets, pg->resets); } static int tegra_powergate_power_up(struct tegra_powergate *pg, @@ -566,12 +548,24 @@ 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.resets = kcalloc(1, sizeof(pg.resets), GFP_KERNEL); + if (!pg.resets) + return -ENOMEM; + + pg.resets[0].rst = rst; + err = tegra_powergate_power_up(&pg, false); - if (err) + if (err) { pr_err("failed to turn on partition %d: %d\n", id, err); + goto free_reset; + } + + return 0; + +free_reset: + kfree(pg.resets); return err; } @@ -755,44 +749,38 @@ 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; + unsigned int count; int err; - count = of_count_phandle_with_args(np, "resets", "#reset-cells"); - if (count == 0) - return -ENODEV; + count = of_reset_control_get_count(np); + if (count < 0) + return count; - pg->resets = kcalloc(count, sizeof(rst), GFP_KERNEL); + pg->resets = kcalloc(count, sizeof(pg->resets), 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; - } + err = of_reset_control_array_get_exclusive(np, count, pg->resets); + if (err) { + pr_err("failed to get device resets\n"); + goto free_reset; + } - if (off) - err = reset_control_assert(pg->resets[i]); - else - err = reset_control_deassert(pg->resets[i]); + if (off) + err = reset_control_array_assert(count, pg->resets); + else + err = reset_control_array_deassert(count, pg->resets); - if (err) { - reset_control_put(pg->resets[i]); - goto error; - } - } + if (err) + goto put_reset; pg->num_resets = count; return 0; -error: - while (i--) - reset_control_put(pg->resets[i]); - +put_reset: + reset_control_array_put(count, pg->resets); +free_reset: kfree(pg->resets); return err; @@ -885,9 +873,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]); - + reset_control_array_put(pg->num_resets, pg->resets); kfree(pg->resets); remove_clks: