aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRhyland Klein <rklein@nvidia.com>2016-04-07 17:37:08 -0400
committerLinus Walleij <linus.walleij@linaro.org>2016-04-14 08:01:25 -0400
commit26e6aaafc8a1e862437003d6e06ba748e7177ea8 (patch)
tree04ff0595a8c41c7a2dfa54a5bd59212cc0a9b4e6
parent6ba20a00a36bb47c64581bfa08f1606d4bf0589f (diff)
pinctrl: tegra: clear park bit for all pins
Parking bits might not be cleared by the bootloader properly (if for instance it doesn't use the device configured by that pin). Clear the park bits for all the pins during pinctrl probe. This is present on T210 platforms but not earlier ones, so for earlier generations, set parked_reg = -1 to disable. The park bit is used to prevent glitching when reprogramming pinctrl registers. Based on work by: Shravani Dingari <shravanid@nvidia.com> Signed-off-by: Rhyland Klein <rklein@nvidia.com> Acked-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra.c18
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra.h6
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra114.c2
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra124.c2
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra20.c3
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra210.c4
-rw-r--r--drivers/pinctrl/tegra/pinctrl-tegra30.c2
7 files changed, 37 insertions, 0 deletions
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.c b/drivers/pinctrl/tegra/pinctrl-tegra.c
index 3f7fce9075ab..053d62016e5a 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra.c
@@ -625,6 +625,22 @@ static struct pinctrl_desc tegra_pinctrl_desc = {
625 .owner = THIS_MODULE, 625 .owner = THIS_MODULE,
626}; 626};
627 627
628static void tegra_pinctrl_clear_parked_bits(struct tegra_pmx *pmx)
629{
630 int i = 0;
631 const struct tegra_pingroup *g;
632 u32 val;
633
634 for (i = 0; i < pmx->soc->ngroups; ++i) {
635 if (pmx->soc->groups[i].parked_reg >= 0) {
636 g = &pmx->soc->groups[i];
637 val = pmx_readl(pmx, g->parked_bank, g->parked_reg);
638 val &= ~(1 << g->parked_bit);
639 pmx_writel(pmx, val, g->parked_bank, g->parked_reg);
640 }
641 }
642}
643
628static bool gpio_node_has_range(void) 644static bool gpio_node_has_range(void)
629{ 645{
630 struct device_node *np; 646 struct device_node *np;
@@ -725,6 +741,8 @@ int tegra_pinctrl_probe(struct platform_device *pdev,
725 return PTR_ERR(pmx->pctl); 741 return PTR_ERR(pmx->pctl);
726 } 742 }
727 743
744 tegra_pinctrl_clear_parked_bits(pmx);
745
728 if (!gpio_node_has_range()) 746 if (!gpio_node_has_range())
729 pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range); 747 pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range);
730 748
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra.h b/drivers/pinctrl/tegra/pinctrl-tegra.h
index 1615db7e3a4b..20b893443d0b 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra.h
+++ b/drivers/pinctrl/tegra/pinctrl-tegra.h
@@ -93,6 +93,9 @@ struct tegra_function {
93 * @tri_reg: Tri-state register offset. 93 * @tri_reg: Tri-state register offset.
94 * @tri_bank: Tri-state register bank. 94 * @tri_bank: Tri-state register bank.
95 * @tri_bit: Tri-state register bit. 95 * @tri_bit: Tri-state register bit.
96 * @parked_reg: Parked register offset. -1 if unsupported.
97 * @parked_bank: Parked register bank. 0 if unsupported.
98 * @parked_bit: Parked register bit. 0 if unsupported.
96 * @einput_bit: Enable-input register bit. 99 * @einput_bit: Enable-input register bit.
97 * @odrain_bit: Open-drain register bit. 100 * @odrain_bit: Open-drain register bit.
98 * @lock_bit: Lock register bit. 101 * @lock_bit: Lock register bit.
@@ -135,13 +138,16 @@ struct tegra_pingroup {
135 s16 pupd_reg; 138 s16 pupd_reg;
136 s16 tri_reg; 139 s16 tri_reg;
137 s16 drv_reg; 140 s16 drv_reg;
141 s16 parked_reg;
138 u32 mux_bank:2; 142 u32 mux_bank:2;
139 u32 pupd_bank:2; 143 u32 pupd_bank:2;
140 u32 tri_bank:2; 144 u32 tri_bank:2;
141 u32 drv_bank:2; 145 u32 drv_bank:2;
146 u32 parked_bank:2;
142 s32 mux_bit:6; 147 s32 mux_bit:6;
143 s32 pupd_bit:6; 148 s32 pupd_bit:6;
144 s32 tri_bit:6; 149 s32 tri_bit:6;
150 s32 parked_bit:6;
145 s32 einput_bit:6; 151 s32 einput_bit:6;
146 s32 odrain_bit:6; 152 s32 odrain_bit:6;
147 s32 lock_bit:6; 153 s32 lock_bit:6;
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra114.c b/drivers/pinctrl/tegra/pinctrl-tegra114.c
index 05e49d5137ab..b831dcfa5359 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra114.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra114.c
@@ -1578,6 +1578,7 @@ static struct tegra_function tegra114_functions[] = {
1578 .lock_bit = 7, \ 1578 .lock_bit = 7, \
1579 .ioreset_bit = PINGROUP_BIT_##ior(8), \ 1579 .ioreset_bit = PINGROUP_BIT_##ior(8), \
1580 .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9), \ 1580 .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9), \
1581 .parked_reg = -1, \
1581 .drv_reg = -1, \ 1582 .drv_reg = -1, \
1582 } 1583 }
1583 1584
@@ -1598,6 +1599,7 @@ static struct tegra_function tegra114_functions[] = {
1598 .rcv_sel_bit = -1, \ 1599 .rcv_sel_bit = -1, \
1599 .drv_reg = DRV_PINGROUP_REG(r), \ 1600 .drv_reg = DRV_PINGROUP_REG(r), \
1600 .drv_bank = 0, \ 1601 .drv_bank = 0, \
1602 .parked_reg = -1, \
1601 .hsm_bit = hsm_b, \ 1603 .hsm_bit = hsm_b, \
1602 .schmitt_bit = schmitt_b, \ 1604 .schmitt_bit = schmitt_b, \
1603 .lpmd_bit = lpmd_b, \ 1605 .lpmd_bit = lpmd_b, \
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra124.c b/drivers/pinctrl/tegra/pinctrl-tegra124.c
index 7cd44c7c296d..199d301f7c3e 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra124.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra124.c
@@ -1747,6 +1747,7 @@ static struct tegra_function tegra124_functions[] = {
1747 .lock_bit = 7, \ 1747 .lock_bit = 7, \
1748 .ioreset_bit = PINGROUP_BIT_##ior(8), \ 1748 .ioreset_bit = PINGROUP_BIT_##ior(8), \
1749 .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9), \ 1749 .rcv_sel_bit = PINGROUP_BIT_##rcv_sel(9), \
1750 .parked_reg = -1, \
1750 .drv_reg = -1, \ 1751 .drv_reg = -1, \
1751 } 1752 }
1752 1753
@@ -1767,6 +1768,7 @@ static struct tegra_function tegra124_functions[] = {
1767 .rcv_sel_bit = -1, \ 1768 .rcv_sel_bit = -1, \
1768 .drv_reg = DRV_PINGROUP_REG(r), \ 1769 .drv_reg = DRV_PINGROUP_REG(r), \
1769 .drv_bank = 0, \ 1770 .drv_bank = 0, \
1771 .parked_reg = -1, \
1770 .hsm_bit = hsm_b, \ 1772 .hsm_bit = hsm_b, \
1771 .schmitt_bit = schmitt_b, \ 1773 .schmitt_bit = schmitt_b, \
1772 .lpmd_bit = lpmd_b, \ 1774 .lpmd_bit = lpmd_b, \
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra20.c b/drivers/pinctrl/tegra/pinctrl-tegra20.c
index 4833db4433d9..a2d0b98d72b3 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra20.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra20.c
@@ -1994,6 +1994,7 @@ static struct tegra_function tegra20_functions[] = {
1994 .tri_reg = ((tri_r) - TRISTATE_REG_A), \ 1994 .tri_reg = ((tri_r) - TRISTATE_REG_A), \
1995 .tri_bank = 0, \ 1995 .tri_bank = 0, \
1996 .tri_bit = tri_b, \ 1996 .tri_bit = tri_b, \
1997 .parked_reg = -1, \
1997 .einput_bit = -1, \ 1998 .einput_bit = -1, \
1998 .odrain_bit = -1, \ 1999 .odrain_bit = -1, \
1999 .lock_bit = -1, \ 2000 .lock_bit = -1, \
@@ -2013,6 +2014,7 @@ static struct tegra_function tegra20_functions[] = {
2013 .pupd_bank = 2, \ 2014 .pupd_bank = 2, \
2014 .pupd_bit = pupd_b, \ 2015 .pupd_bit = pupd_b, \
2015 .drv_reg = -1, \ 2016 .drv_reg = -1, \
2017 .parked_reg = -1, \
2016 } 2018 }
2017 2019
2018/* Pin groups for drive strength registers (configurable version) */ 2020/* Pin groups for drive strength registers (configurable version) */
@@ -2028,6 +2030,7 @@ static struct tegra_function tegra20_functions[] = {
2028 .tri_reg = -1, \ 2030 .tri_reg = -1, \
2029 .drv_reg = ((r) - PINGROUP_REG_A), \ 2031 .drv_reg = ((r) - PINGROUP_REG_A), \
2030 .drv_bank = 3, \ 2032 .drv_bank = 3, \
2033 .parked_reg = -1, \
2031 .hsm_bit = hsm_b, \ 2034 .hsm_bit = hsm_b, \
2032 .schmitt_bit = schmitt_b, \ 2035 .schmitt_bit = schmitt_b, \
2033 .lpmd_bit = lpmd_b, \ 2036 .lpmd_bit = lpmd_b, \
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra210.c b/drivers/pinctrl/tegra/pinctrl-tegra210.c
index 252b464901c0..825bf62d939a 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra210.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra210.c
@@ -1310,6 +1310,9 @@ static struct tegra_function tegra210_functions[] = {
1310 .lock_bit = 7, \ 1310 .lock_bit = 7, \
1311 .ioreset_bit = -1, \ 1311 .ioreset_bit = -1, \
1312 .rcv_sel_bit = PINGROUP_BIT_##e_io_hv(10), \ 1312 .rcv_sel_bit = PINGROUP_BIT_##e_io_hv(10), \
1313 .parked_reg = PINGROUP_REG(r), \
1314 .parked_bank = 1, \
1315 .parked_bit = 5, \
1313 .hsm_bit = PINGROUP_BIT_##hsm(9), \ 1316 .hsm_bit = PINGROUP_BIT_##hsm(9), \
1314 .schmitt_bit = 12, \ 1317 .schmitt_bit = 12, \
1315 .drvtype_bit = PINGROUP_BIT_##drvtype(13), \ 1318 .drvtype_bit = PINGROUP_BIT_##drvtype(13), \
@@ -1342,6 +1345,7 @@ static struct tegra_function tegra210_functions[] = {
1342 .rcv_sel_bit = -1, \ 1345 .rcv_sel_bit = -1, \
1343 .drv_reg = DRV_PINGROUP_REG(r), \ 1346 .drv_reg = DRV_PINGROUP_REG(r), \
1344 .drv_bank = 0, \ 1347 .drv_bank = 0, \
1348 .parked_reg = -1, \
1345 .hsm_bit = -1, \ 1349 .hsm_bit = -1, \
1346 .schmitt_bit = -1, \ 1350 .schmitt_bit = -1, \
1347 .lpmd_bit = -1, \ 1351 .lpmd_bit = -1, \
diff --git a/drivers/pinctrl/tegra/pinctrl-tegra30.c b/drivers/pinctrl/tegra/pinctrl-tegra30.c
index 47b2fd8bb2e9..4dc9642c914a 100644
--- a/drivers/pinctrl/tegra/pinctrl-tegra30.c
+++ b/drivers/pinctrl/tegra/pinctrl-tegra30.c
@@ -2139,6 +2139,7 @@ static struct tegra_function tegra30_functions[] = {
2139 .lock_bit = 7, \ 2139 .lock_bit = 7, \
2140 .ioreset_bit = PINGROUP_BIT_##ior(8), \ 2140 .ioreset_bit = PINGROUP_BIT_##ior(8), \
2141 .rcv_sel_bit = -1, \ 2141 .rcv_sel_bit = -1, \
2142 .parked_reg = -1, \
2142 .drv_reg = -1, \ 2143 .drv_reg = -1, \
2143 } 2144 }
2144 2145
@@ -2159,6 +2160,7 @@ static struct tegra_function tegra30_functions[] = {
2159 .rcv_sel_bit = -1, \ 2160 .rcv_sel_bit = -1, \
2160 .drv_reg = DRV_PINGROUP_REG(r), \ 2161 .drv_reg = DRV_PINGROUP_REG(r), \
2161 .drv_bank = 0, \ 2162 .drv_bank = 0, \
2163 .parked_reg = -1, \
2162 .hsm_bit = hsm_b, \ 2164 .hsm_bit = hsm_b, \
2163 .schmitt_bit = schmitt_b, \ 2165 .schmitt_bit = schmitt_b, \
2164 .lpmd_bit = lpmd_b, \ 2166 .lpmd_bit = lpmd_b, \