diff options
author | Aapo Vienamo <avienamo@nvidia.com> | 2018-08-10 14:08:07 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2018-08-27 06:25:17 -0400 |
commit | 13136a47a061c01c91df78b37f7708dd5ce7035f (patch) | |
tree | 231b0f8fefa0be14b109b2502011adea6c77bd87 | |
parent | 1dc6bd5e39a29453bdcc17348dd2a89f1aa4004e (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.c | 55 | ||||
-rw-r--r-- | include/soc/tegra/pmc.h | 1 |
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 | ||
1829 | static const struct tegra_pmc_regs tegra186_pmc_regs = { | 1851 | static 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 */ |