diff options
author | Jon Hunter <jonathanh@nvidia.com> | 2016-06-28 12:38:24 +0200 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2016-06-30 11:52:51 +0200 |
commit | 11131895cd1ba1cf58a87c6acb574cbeec5818af (patch) | |
tree | 2d5710a1f17f8103ac299165ccb63890a726f474 /drivers/soc | |
parent | soc/tegra: pmc: Ensure powergate is available when powering on (diff) | |
download | linux-11131895cd1ba1cf58a87c6acb574cbeec5818af.tar.xz linux-11131895cd1ba1cf58a87c6acb574cbeec5818af.zip |
soc/tegra: pmc: Fix early initialisation of PMC
During early initialisation, the available power partitions for a given
device is configured as well as the polarity of the PMC interrupt. Both
of which should only be configured if there is a valid device node for
the PMC device. This is because the soc data used for configuring the
power partitions is only available if a device node for the PMC is found
and the code to configure the interrupt polarity uses the device node
pointer directly.
Some early device-tree images may not have this device node and so fix
this by ensuring the device node pointer is valid when configuring these
items.
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Diffstat (limited to 'drivers/soc')
-rw-r--r-- | drivers/soc/tegra/pmc.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c index 52a9e9703668..2e031c4ad547 100644 --- a/drivers/soc/tegra/pmc.c +++ b/drivers/soc/tegra/pmc.c @@ -1550,27 +1550,29 @@ static int __init tegra_pmc_early_init(void) return -ENXIO; } - /* Create a bit-map of the available and valid partitions */ - for (i = 0; i < pmc->soc->num_powergates; i++) - if (pmc->soc->powergates[i]) - set_bit(i, pmc->powergates_available); - mutex_init(&pmc->powergates_lock); - /* - * Invert the interrupt polarity if a PMC device tree node exists and - * contains the nvidia,invert-interrupt property. - */ - invert = of_property_read_bool(np, "nvidia,invert-interrupt"); + if (np) { + /* Create a bit-map of the available and valid partitions */ + for (i = 0; i < pmc->soc->num_powergates; i++) + if (pmc->soc->powergates[i]) + set_bit(i, pmc->powergates_available); - value = tegra_pmc_readl(PMC_CNTRL); + /* + * Invert the interrupt polarity if a PMC device tree node + * exists and contains the nvidia,invert-interrupt property. + */ + invert = of_property_read_bool(np, "nvidia,invert-interrupt"); - if (invert) - value |= PMC_CNTRL_INTR_POLARITY; - else - value &= ~PMC_CNTRL_INTR_POLARITY; + value = tegra_pmc_readl(PMC_CNTRL); - tegra_pmc_writel(value, PMC_CNTRL); + if (invert) + value |= PMC_CNTRL_INTR_POLARITY; + else + value &= ~PMC_CNTRL_INTR_POLARITY; + + tegra_pmc_writel(value, PMC_CNTRL); + } return 0; } |