aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2016-09-14 18:41:12 -0400
committerArnd Bergmann <arnd@arndb.de>2016-09-14 18:41:12 -0400
commitbdfb3af1b3a22bf2eaf98f0965ce797f0ae8b5ce (patch)
tree8438c99a8093aa0e323901c3947fa3fa1f296316
parent8cfc48bcc71edfe322b08f8506fb20b0ebbeb571 (diff)
parenta9ccc123a8e05365f7515dcd023b01100809a6fa (diff)
Merge tag 'tegra-for-4.9-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into next/drivers
Pull "soc/tegra: Changes for v4.9-rc1" from Thierry Reding: This contains a single patch to fix an issue with setting the deep power down mode of I/O rails. * tag 'tegra-for-4.9-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: soc/tegra: pmc: Fix incorrect DPD request
-rw-r--r--drivers/soc/tegra/pmc.c28
1 files changed, 8 insertions, 20 deletions
diff --git a/drivers/soc/tegra/pmc.c b/drivers/soc/tegra/pmc.c
index 71c834f3847e..7792ed88d80b 100644
--- a/drivers/soc/tegra/pmc.c
+++ b/drivers/soc/tegra/pmc.c
@@ -967,8 +967,8 @@ static void tegra_io_rail_unprepare(void)
967 967
968int tegra_io_rail_power_on(unsigned int id) 968int tegra_io_rail_power_on(unsigned int id)
969{ 969{
970 unsigned long request, status, value; 970 unsigned long request, status;
971 unsigned int bit, mask; 971 unsigned int bit;
972 int err; 972 int err;
973 973
974 mutex_lock(&pmc->powergates_lock); 974 mutex_lock(&pmc->powergates_lock);
@@ -977,15 +977,9 @@ int tegra_io_rail_power_on(unsigned int id)
977 if (err) 977 if (err)
978 goto error; 978 goto error;
979 979
980 mask = 1 << bit; 980 tegra_pmc_writel(IO_DPD_REQ_CODE_OFF | BIT(bit), request);
981 981
982 value = tegra_pmc_readl(request); 982 err = tegra_io_rail_poll(status, BIT(bit), 0, 250);
983 value |= mask;
984 value &= ~IO_DPD_REQ_CODE_MASK;
985 value |= IO_DPD_REQ_CODE_OFF;
986 tegra_pmc_writel(value, request);
987
988 err = tegra_io_rail_poll(status, mask, 0, 250);
989 if (err) { 983 if (err) {
990 pr_info("tegra_io_rail_poll() failed: %d\n", err); 984 pr_info("tegra_io_rail_poll() failed: %d\n", err);
991 goto error; 985 goto error;
@@ -1002,8 +996,8 @@ EXPORT_SYMBOL(tegra_io_rail_power_on);
1002 996
1003int tegra_io_rail_power_off(unsigned int id) 997int tegra_io_rail_power_off(unsigned int id)
1004{ 998{
1005 unsigned long request, status, value; 999 unsigned long request, status;
1006 unsigned int bit, mask; 1000 unsigned int bit;
1007 int err; 1001 int err;
1008 1002
1009 mutex_lock(&pmc->powergates_lock); 1003 mutex_lock(&pmc->powergates_lock);
@@ -1014,15 +1008,9 @@ int tegra_io_rail_power_off(unsigned int id)
1014 goto error; 1008 goto error;
1015 } 1009 }
1016 1010
1017 mask = 1 << bit; 1011 tegra_pmc_writel(IO_DPD_REQ_CODE_ON | BIT(bit), request);
1018
1019 value = tegra_pmc_readl(request);
1020 value |= mask;
1021 value &= ~IO_DPD_REQ_CODE_MASK;
1022 value |= IO_DPD_REQ_CODE_ON;
1023 tegra_pmc_writel(value, request);
1024 1012
1025 err = tegra_io_rail_poll(status, mask, mask, 250); 1013 err = tegra_io_rail_poll(status, BIT(bit), BIT(bit), 250);
1026 if (err) 1014 if (err)
1027 goto error; 1015 goto error;
1028 1016