aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAapo Vienamo <avienamo@nvidia.com>2018-08-10 14:08:07 -0400
committerThierry Reding <treding@nvidia.com>2018-08-27 06:25:17 -0400
commit13136a47a061c01c91df78b37f7708dd5ce7035f (patch)
tree231b0f8fefa0be14b109b2502011adea6c77bd87
parent1dc6bd5e39a29453bdcc17348dd2a89f1aa4004e (diff)
soc/tegra: pmc: Fix pad voltage configuration for Tegra186
Implement support for the PMC_IMPL_E_33V_PWR register which replaces PMC_PWR_DET register interface of the SoC generations preceding Tegra186. Also add the voltage bit offsets to the tegra186_io_pads[] table and the AO_HV pad. Signed-off-by: Aapo Vienamo <avienamo@nvidia.com> Acked-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/soc/tegra/pmc.c55
-rw-r--r--include/soc/tegra/pmc.h1
2 files changed, 40 insertions, 16 deletions
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index ed71a4c9c8b2..75fd907fce23 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -65,6 +65,8 @@
65 65
66#define PWRGATE_STATUS 0x38 66#define PWRGATE_STATUS 0x38
67 67
68#define PMC_IMPL_E_33V_PWR 0x40
69
68#define PMC_PWR_DET 0x48 70#define PMC_PWR_DET 0x48
69 71
70#define PMC_SCRATCH0_MODE_RECOVERY BIT(31) 72#define PMC_SCRATCH0_MODE_RECOVERY BIT(31)
@@ -154,6 +156,7 @@ struct tegra_pmc_soc {
154 bool has_tsense_reset; 156 bool has_tsense_reset;
155 bool has_gpu_clamps; 157 bool has_gpu_clamps;
156 bool needs_mbist_war; 158 bool needs_mbist_war;
159 bool has_impl_33v_pwr;
157 160
158 const struct tegra_io_pad_soc *io_pads; 161 const struct tegra_io_pad_soc *io_pads;
159 unsigned int num_io_pads; 162 unsigned int num_io_pads;
@@ -1073,20 +1076,31 @@ int tegra_io_pad_set_voltage(enum tegra_io_pad id,
1073 1076
1074 mutex_lock(&pmc->powergates_lock); 1077 mutex_lock(&pmc->powergates_lock);
1075 1078
1076 /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */ 1079 if (pmc->soc->has_impl_33v_pwr) {
1077 value = tegra_pmc_readl(PMC_PWR_DET); 1080 value = tegra_pmc_readl(PMC_IMPL_E_33V_PWR);
1078 value |= BIT(pad->voltage);
1079 tegra_pmc_writel(value, PMC_PWR_DET);
1080 1081
1081 /* update I/O voltage */ 1082 if (voltage == TEGRA_IO_PAD_1800000UV)
1082 value = tegra_pmc_readl(PMC_PWR_DET_VALUE); 1083 value &= ~BIT(pad->voltage);
1084 else
1085 value |= BIT(pad->voltage);
1083 1086
1084 if (voltage == TEGRA_IO_PAD_1800000UV) 1087 tegra_pmc_writel(value, PMC_IMPL_E_33V_PWR);
1085 value &= ~BIT(pad->voltage); 1088 } else {
1086 else 1089 /* write-enable PMC_PWR_DET_VALUE[pad->voltage] */
1090 value = tegra_pmc_readl(PMC_PWR_DET);
1087 value |= BIT(pad->voltage); 1091 value |= BIT(pad->voltage);
1092 tegra_pmc_writel(value, PMC_PWR_DET);
1093
1094 /* update I/O voltage */
1095 value = tegra_pmc_readl(PMC_PWR_DET_VALUE);
1088 1096
1089 tegra_pmc_writel(value, PMC_PWR_DET_VALUE); 1097 if (voltage == TEGRA_IO_PAD_1800000UV)
1098 value &= ~BIT(pad->voltage);
1099 else
1100 value |= BIT(pad->voltage);
1101
1102 tegra_pmc_writel(value, PMC_PWR_DET_VALUE);
1103 }
1090 1104
1091 mutex_unlock(&pmc->powergates_lock); 1105 mutex_unlock(&pmc->powergates_lock);
1092 1106
@@ -1108,7 +1122,10 @@ int tegra_io_pad_get_voltage(enum tegra_io_pad id)
1108 if (pad->voltage == UINT_MAX) 1122 if (pad->voltage == UINT_MAX)
1109 return -ENOTSUPP; 1123 return -ENOTSUPP;
1110 1124
1111 value = tegra_pmc_readl(PMC_PWR_DET_VALUE); 1125 if (pmc->soc->has_impl_33v_pwr)
1126 value = tegra_pmc_readl(PMC_IMPL_E_33V_PWR);
1127 else
1128 value = tegra_pmc_readl(PMC_PWR_DET_VALUE);
1112 1129
1113 if ((value & BIT(pad->voltage)) == 0) 1130 if ((value & BIT(pad->voltage)) == 0)
1114 return TEGRA_IO_PAD_1800000UV; 1131 return TEGRA_IO_PAD_1800000UV;
@@ -1567,6 +1584,7 @@ static const struct tegra_pmc_soc tegra30_pmc_soc = {
1567 .cpu_powergates = tegra30_cpu_powergates, 1584 .cpu_powergates = tegra30_cpu_powergates,
1568 .has_tsense_reset = true, 1585 .has_tsense_reset = true,
1569 .has_gpu_clamps = false, 1586 .has_gpu_clamps = false,
1587 .has_impl_33v_pwr = false,
1570 .num_io_pads = 0, 1588 .num_io_pads = 0,
1571 .io_pads = NULL, 1589 .io_pads = NULL,
1572 .regs = &tegra20_pmc_regs, 1590 .regs = &tegra20_pmc_regs,
@@ -1609,6 +1627,7 @@ static const struct tegra_pmc_soc tegra114_pmc_soc = {
1609 .cpu_powergates = tegra114_cpu_powergates, 1627 .cpu_powergates = tegra114_cpu_powergates,
1610 .has_tsense_reset = true, 1628 .has_tsense_reset = true,
1611 .has_gpu_clamps = false, 1629 .has_gpu_clamps = false,
1630 .has_impl_33v_pwr = false,
1612 .num_io_pads = 0, 1631 .num_io_pads = 0,
1613 .io_pads = NULL, 1632 .io_pads = NULL,
1614 .regs = &tegra20_pmc_regs, 1633 .regs = &tegra20_pmc_regs,
@@ -1689,6 +1708,7 @@ static const struct tegra_pmc_soc tegra124_pmc_soc = {
1689 .cpu_powergates = tegra124_cpu_powergates, 1708 .cpu_powergates = tegra124_cpu_powergates,
1690 .has_tsense_reset = true, 1709 .has_tsense_reset = true,
1691 .has_gpu_clamps = true, 1710 .has_gpu_clamps = true,
1711 .has_impl_33v_pwr = false,
1692 .num_io_pads = ARRAY_SIZE(tegra124_io_pads), 1712 .num_io_pads = ARRAY_SIZE(tegra124_io_pads),
1693 .io_pads = tegra124_io_pads, 1713 .io_pads = tegra124_io_pads,
1694 .regs = &tegra20_pmc_regs, 1714 .regs = &tegra20_pmc_regs,
@@ -1778,6 +1798,7 @@ static const struct tegra_pmc_soc tegra210_pmc_soc = {
1778 .cpu_powergates = tegra210_cpu_powergates, 1798 .cpu_powergates = tegra210_cpu_powergates,
1779 .has_tsense_reset = true, 1799 .has_tsense_reset = true,
1780 .has_gpu_clamps = true, 1800 .has_gpu_clamps = true,
1801 .has_impl_33v_pwr = false,
1781 .needs_mbist_war = true, 1802 .needs_mbist_war = true,
1782 .num_io_pads = ARRAY_SIZE(tegra210_io_pads), 1803 .num_io_pads = ARRAY_SIZE(tegra210_io_pads),
1783 .io_pads = tegra210_io_pads, 1804 .io_pads = tegra210_io_pads,
@@ -1806,7 +1827,7 @@ static const struct tegra_io_pad_soc tegra186_io_pads[] = {
1806 { .id = TEGRA_IO_PAD_HDMI_DP0, .dpd = 28, .voltage = UINT_MAX }, 1827 { .id = TEGRA_IO_PAD_HDMI_DP0, .dpd = 28, .voltage = UINT_MAX },
1807 { .id = TEGRA_IO_PAD_HDMI_DP1, .dpd = 29, .voltage = UINT_MAX }, 1828 { .id = TEGRA_IO_PAD_HDMI_DP1, .dpd = 29, .voltage = UINT_MAX },
1808 { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = 32, .voltage = UINT_MAX }, 1829 { .id = TEGRA_IO_PAD_PEX_CNTRL, .dpd = 32, .voltage = UINT_MAX },
1809 { .id = TEGRA_IO_PAD_SDMMC2_HV, .dpd = 34, .voltage = UINT_MAX }, 1830 { .id = TEGRA_IO_PAD_SDMMC2_HV, .dpd = 34, .voltage = 5 },
1810 { .id = TEGRA_IO_PAD_SDMMC4, .dpd = 36, .voltage = UINT_MAX }, 1831 { .id = TEGRA_IO_PAD_SDMMC4, .dpd = 36, .voltage = UINT_MAX },
1811 { .id = TEGRA_IO_PAD_CAM, .dpd = 38, .voltage = UINT_MAX }, 1832 { .id = TEGRA_IO_PAD_CAM, .dpd = 38, .voltage = UINT_MAX },
1812 { .id = TEGRA_IO_PAD_DSIB, .dpd = 40, .voltage = UINT_MAX }, 1833 { .id = TEGRA_IO_PAD_DSIB, .dpd = 40, .voltage = UINT_MAX },
@@ -1818,12 +1839,13 @@ static const struct tegra_io_pad_soc tegra186_io_pads[] = {
1818 { .id = TEGRA_IO_PAD_CSIF, .dpd = 46, .voltage = UINT_MAX }, 1839 { .id = TEGRA_IO_PAD_CSIF, .dpd = 46, .voltage = UINT_MAX },
1819 { .id = TEGRA_IO_PAD_SPI, .dpd = 47, .voltage = UINT_MAX }, 1840 { .id = TEGRA_IO_PAD_SPI, .dpd = 47, .voltage = UINT_MAX },
1820 { .id = TEGRA_IO_PAD_UFS, .dpd = 49, .voltage = UINT_MAX }, 1841 { .id = TEGRA_IO_PAD_UFS, .dpd = 49, .voltage = UINT_MAX },
1821 { .id = TEGRA_IO_PAD_DMIC_HV, .dpd = 52, .voltage = UINT_MAX }, 1842 { .id = TEGRA_IO_PAD_DMIC_HV, .dpd = 52, .voltage = 2 },
1822 { .id = TEGRA_IO_PAD_EDP, .dpd = 53, .voltage = UINT_MAX }, 1843 { .id = TEGRA_IO_PAD_EDP, .dpd = 53, .voltage = UINT_MAX },
1823 { .id = TEGRA_IO_PAD_SDMMC1_HV, .dpd = 55, .voltage = UINT_MAX }, 1844 { .id = TEGRA_IO_PAD_SDMMC1_HV, .dpd = 55, .voltage = 4 },
1824 { .id = TEGRA_IO_PAD_SDMMC3_HV, .dpd = 56, .voltage = UINT_MAX }, 1845 { .id = TEGRA_IO_PAD_SDMMC3_HV, .dpd = 56, .voltage = 6 },
1825 { .id = TEGRA_IO_PAD_CONN, .dpd = 60, .voltage = UINT_MAX }, 1846 { .id = TEGRA_IO_PAD_CONN, .dpd = 60, .voltage = UINT_MAX },
1826 { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = UINT_MAX }, 1847 { .id = TEGRA_IO_PAD_AUDIO_HV, .dpd = 61, .voltage = 1 },
1848 { .id = TEGRA_IO_PAD_AO_HV, .dpd = UINT_MAX, .voltage = 0 },
1827}; 1849};
1828 1850
1829static const struct tegra_pmc_regs tegra186_pmc_regs = { 1851static const struct tegra_pmc_regs tegra186_pmc_regs = {
@@ -1876,6 +1898,7 @@ static const struct tegra_pmc_soc tegra186_pmc_soc = {
1876 .cpu_powergates = NULL, 1898 .cpu_powergates = NULL,
1877 .has_tsense_reset = false, 1899 .has_tsense_reset = false,
1878 .has_gpu_clamps = false, 1900 .has_gpu_clamps = false,
1901 .has_impl_33v_pwr = true,
1879 .num_io_pads = ARRAY_SIZE(tegra186_io_pads), 1902 .num_io_pads = ARRAY_SIZE(tegra186_io_pads),
1880 .io_pads = tegra186_io_pads, 1903 .io_pads = tegra186_io_pads,
1881 .regs = &tegra186_pmc_regs, 1904 .regs = &tegra186_pmc_regs,
diff --git a/include/soc/tegra/pmc.h b/include/soc/tegra/pmc.h
index c32bf91c23e6..445aa66514e9 100644
--- a/include/soc/tegra/pmc.h
+++ b/include/soc/tegra/pmc.h
@@ -134,6 +134,7 @@ enum tegra_io_pad {
134 TEGRA_IO_PAD_USB2, 134 TEGRA_IO_PAD_USB2,
135 TEGRA_IO_PAD_USB3, 135 TEGRA_IO_PAD_USB3,
136 TEGRA_IO_PAD_USB_BIAS, 136 TEGRA_IO_PAD_USB_BIAS,
137 TEGRA_IO_PAD_AO_HV,
137}; 138};
138 139
139/* deprecated, use TEGRA_IO_PAD_{HDMI,LVDS} instead */ 140/* deprecated, use TEGRA_IO_PAD_{HDMI,LVDS} instead */