linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jon Hunter <jonathanh@nvidia.com>
To: Philipp Zabel <p.zabel@pengutronix.de>,
	Stephen Warren <swarren@wwwdotorg.org>,
	Thierry Reding <thierry.reding@gmail.com>,
	Alexandre Courbot <gnurou@gmail.com>,
	Rafael Wysocki <rjw@rjwysocki.net>,
	Kevin Hilman <khilman@kernel.org>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>
Cc: Vince Hsu <vinceh@nvidia.com>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-tegra@vger.kernel.org, linux-pm@vger.kernel.org,
	Jon Hunter <jonathanh@nvidia.com>
Subject: [PATCH V4 08/16] soc: tegra: pmc: Fix checking of valid partitions
Date: Fri, 4 Dec 2015 14:57:09 +0000	[thread overview]
Message-ID: <1449241037-22193-9-git-send-email-jonathanh@nvidia.com> (raw)
In-Reply-To: <1449241037-22193-1-git-send-email-jonathanh@nvidia.com>

The tegra power partitions are referenced by a numerical ID which are
the same values programmed into the PMC registers for controlling the
partition. For a given device, the valid partition IDs may not be
contiguous and so simply checking that an ID is not greater than the
maximum ID supported may not mean it is valid. Fix this by computing
a bit-mask of the valid partition IDs for a device and add a macro that
will test if the partition is valid based upon this mask.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
---
 drivers/soc/tegra/pmc.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index 28d3106d3add..0967bba13947 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -103,6 +103,7 @@
 #define GPU_RG_CNTRL			0x2d4
 
 #define PMC_PWRGATE_STATE(status, id)	((status & BIT(id)) != 0)
+#define PMC_PWRGATE_IS_VALID(id)	(pmc->powergates_mask & BIT(id))
 
 struct tegra_pmc_soc {
 	unsigned int num_powergates;
@@ -134,6 +135,7 @@ struct tegra_pmc_soc {
  * @cpu_pwr_good_en: CPU power good signal is enabled
  * @lp0_vec_phys: physical base address of the LP0 warm boot code
  * @lp0_vec_size: size of the LP0 warm boot code
+ * @powergates_mask: Bit mask of valid power gates
  * @powergates_lock: mutex for power gate register access
  */
 struct tegra_pmc {
@@ -158,6 +160,7 @@ struct tegra_pmc {
 	bool cpu_pwr_good_en;
 	u32 lp0_vec_phys;
 	u32 lp0_vec_size;
+	u32 powergates_mask;
 
 	struct mutex powergates_lock;
 };
@@ -213,7 +216,7 @@ static int tegra_powergate_set(int id, bool new_state)
  */
 int tegra_powergate_power_on(int id)
 {
-	if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+	if (!PMC_PWRGATE_IS_VALID(id))
 		return -EINVAL;
 
 	return tegra_powergate_set(id, true);
@@ -225,7 +228,7 @@ int tegra_powergate_power_on(int id)
  */
 int tegra_powergate_power_off(int id)
 {
-	if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+	if (!PMC_PWRGATE_IS_VALID(id))
 		return -EINVAL;
 
 	return tegra_powergate_set(id, false);
@@ -240,7 +243,7 @@ int tegra_powergate_is_powered(int id)
 {
 	u32 status;
 
-	if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+	if (!PMC_PWRGATE_IS_VALID(id))
 		return -EINVAL;
 
 	status = tegra_pmc_readl(PWRGATE_STATUS);
@@ -256,7 +259,7 @@ int tegra_powergate_remove_clamping(int id)
 {
 	u32 mask;
 
-	if (!pmc->soc || id < 0 || id >= pmc->soc->num_powergates)
+	if (!PMC_PWRGATE_IS_VALID(id))
 		return -EINVAL;
 
 	/*
@@ -1084,7 +1087,7 @@ static int __init tegra_pmc_early_init(void)
 	struct device_node *np;
 	struct resource regs;
 	bool invert;
-	u32 value;
+	u32 value, i;
 
 	np = of_find_matching_node_and_match(NULL, tegra_pmc_match, &match);
 	if (!np) {
@@ -1136,6 +1139,11 @@ static int __init tegra_pmc_early_init(void)
 		return -ENXIO;
 	}
 
+	/* Create a bit-mask of the valid partitions */
+	for (i = 0; i < pmc->soc->num_powergates; i++)
+		if (pmc->soc->powergates[i])
+			pmc->powergates_mask |= BIT(i);
+
 	mutex_init(&pmc->powergates_lock);
 
 	/*
-- 
2.1.4


  parent reply	other threads:[~2015-12-04 15:03 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-04 14:57 [PATCH V4 00/16] Add generic PM domain support for Tegra Jon Hunter
2015-12-04 14:57 ` [PATCH V4 01/16] reset: add of_reset_control_get_by_index() Jon Hunter
2015-12-04 14:57 ` [PATCH V4 02/16] soc: tegra: pmc: Add missing structure members to kernel-doc Jon Hunter
2016-01-25 13:20   ` Thierry Reding
2015-12-04 14:57 ` [PATCH V4 03/16] soc: tegra: pmc: Fix sparse warning for tegra_pmc_init_tsense_reset Jon Hunter
2016-01-25 13:21   ` Thierry Reding
2015-12-04 14:57 ` [PATCH V4 04/16] soc: tegra: pmc: Remove debugfs entry on probe failure Jon Hunter
2016-01-25 13:25   ` Thierry Reding
2015-12-04 14:57 ` [PATCH V4 05/16] soc: tegra: pmc: Avoid extra remapping of PMC registers Jon Hunter
2016-01-14 13:45   ` Thierry Reding
2016-01-14 16:35     ` Jon Hunter
2016-01-14 17:24       ` Thierry Reding
2016-01-14 19:02         ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 06/16] soc: tegra: pmc: Wait for powergate state to change Jon Hunter
2016-01-14 14:01   ` Thierry Reding
2016-01-15  9:06     ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 07/16] soc: tegra: pmc: Remove non-existing power partitions for T210 Jon Hunter
2016-01-25 13:27   ` Thierry Reding
2015-12-04 14:57 ` Jon Hunter [this message]
2016-01-14 14:11   ` [PATCH V4 08/16] soc: tegra: pmc: Fix checking of valid partitions Thierry Reding
2016-01-15  9:08     ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 09/16] soc: tegra: pmc: Ensure partitions can be toggled on/off by PMC Jon Hunter
2016-01-14 14:14   ` Thierry Reding
2016-01-15  9:32     ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 10/16] PM / Domains: Add function to remove a pm-domain Jon Hunter
2015-12-04 14:57 ` [PATCH V4 11/16] Documentation: DT: bindings: Update NVIDIA PMC for Tegra210 Jon Hunter
2015-12-06  0:31   ` Rob Herring
2015-12-07  9:54     ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 12/16] Documentation: DT: bindings: Add power domain info for NVIDIA PMC Jon Hunter
2015-12-06  0:37   ` Rob Herring
2015-12-07  9:56     ` Jon Hunter
2015-12-08 19:07   ` Kevin Hilman
2015-12-09 12:23     ` Jon Hunter
2015-12-09 12:33       ` Jon Hunter
2015-12-15  0:42         ` Kevin Hilman
2015-12-15  0:34       ` Kevin Hilman
2016-01-14 14:41   ` Thierry Reding
2016-01-15  9:43     ` Jon Hunter
2015-12-04 14:57 ` [PATCH V4 13/16] soc: tegra: pmc: Add generic PM domain support Jon Hunter
2016-01-14 14:39   ` Thierry Reding
2016-01-15  9:42     ` Jon Hunter
2016-01-15 10:01       ` Lucas Stach
2015-12-04 14:57 ` [PATCH V4 14/16] clk: tegra210: Add the APB2APE audio clock Jon Hunter
2015-12-04 14:57 ` [PATCH V4 15/16] ARM64: tegra: Add audio PM domain device node for Tegra210 Jon Hunter
2015-12-04 14:57 ` [PATCH V4 16/16] ARM64: tegra: select PM_GENERIC_DOMAINS Jon Hunter
2015-12-15 19:54   ` Ulf Hansson
2015-12-16  9:40     ` Jon Hunter
2015-12-16  9:47       ` Ulf Hansson
2015-12-16 11:40         ` Jon Hunter
2015-12-16 12:51           ` Ulf Hansson
2016-01-13 17:03   ` Thierry Reding
2016-01-13 20:43     ` Arnd Bergmann
2016-01-14  8:57       ` Ulf Hansson
2016-01-14  9:21         ` Arnd Bergmann
2016-01-14 10:29           ` Thierry Reding
2016-01-14 11:11             ` Arnd Bergmann
2016-01-26 17:30               ` Thierry Reding
2016-01-26 21:52                 ` Kevin Hilman
2016-01-14 17:16           ` Jon Hunter
2016-01-26 17:01             ` Jon Hunter
2016-01-27  9:43               ` Ulf Hansson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1449241037-22193-9-git-send-email-jonathanh@nvidia.com \
    --to=jonathanh@nvidia.com \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=gnurou@gmail.com \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=khilman@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=p.zabel@pengutronix.de \
    --cc=pawel.moll@arm.com \
    --cc=rjw@rjwysocki.net \
    --cc=robh+dt@kernel.org \
    --cc=swarren@wwwdotorg.org \
    --cc=thierry.reding@gmail.com \
    --cc=ulf.hansson@linaro.org \
    --cc=vinceh@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).