diff options
author | Chris Zhong <zyw@rock-chips.com> | 2014-10-29 07:52:00 -0400 |
---|---|---|
committer | Heiko Stuebner <heiko@sntech.de> | 2014-10-31 18:50:39 -0400 |
commit | 8dca9331270240125fedbe83e0a2cd5750ed9fff (patch) | |
tree | 351922c2328f4ba2fee37ebe20d05ecb62258939 /drivers/pinctrl/pinctrl-rockchip.c | |
parent | 9198f509c888f1ca8f5a50047d702b1ab29459a5 (diff) |
pinctrl: rockchip: save and restore gpio6_c6 pinmux in suspend/resume
Save and restore the gpio6_c6 pinmux setting, since Maskrom of RK3288
would modify it to sdmmc0_det, so it need to be restored to the correct
setting after resume from Maskrom.
Signed-off-by: Chris Zhong <zyw@rock-chips.com>
Tested-by: Doug Anderson <dianders@chromium.org>
Reviewed-by: Doug Anderson <dianders@chromium.org>
Tested-by: Heiko Stuebner <heiko@sntech.de>
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
Diffstat (limited to 'drivers/pinctrl/pinctrl-rockchip.c')
-rw-r--r-- | drivers/pinctrl/pinctrl-rockchip.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 28b12187c2c1..40970c305dd0 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c | |||
@@ -1796,16 +1796,44 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data( | |||
1796 | return ctrl; | 1796 | return ctrl; |
1797 | } | 1797 | } |
1798 | 1798 | ||
1799 | #define RK3288_GRF_GPIO6C_IOMUX 0x64 | ||
1800 | #define GPIO6C6_SEL_WRITE_ENABLE BIT(28) | ||
1801 | |||
1802 | static u32 rk3288_grf_gpio6c_iomux; | ||
1803 | |||
1799 | static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev) | 1804 | static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev) |
1800 | { | 1805 | { |
1801 | struct rockchip_pinctrl *info = dev_get_drvdata(dev); | 1806 | struct rockchip_pinctrl *info = dev_get_drvdata(dev); |
1807 | int ret = pinctrl_force_sleep(info->pctl_dev); | ||
1808 | |||
1809 | if (ret) | ||
1810 | return ret; | ||
1811 | |||
1812 | /* | ||
1813 | * RK3288 GPIO6_C6 mux would be modified by Maskrom when resume, so save | ||
1814 | * the setting here, and restore it at resume. | ||
1815 | */ | ||
1816 | if (info->ctrl->type == RK3288) { | ||
1817 | ret = regmap_read(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, | ||
1818 | &rk3288_grf_gpio6c_iomux); | ||
1819 | if (ret) { | ||
1820 | pinctrl_force_default(info->pctl_dev); | ||
1821 | return ret; | ||
1822 | } | ||
1823 | } | ||
1802 | 1824 | ||
1803 | return pinctrl_force_sleep(info->pctl_dev); | 1825 | return 0; |
1804 | } | 1826 | } |
1805 | 1827 | ||
1806 | static int __maybe_unused rockchip_pinctrl_resume(struct device *dev) | 1828 | static int __maybe_unused rockchip_pinctrl_resume(struct device *dev) |
1807 | { | 1829 | { |
1808 | struct rockchip_pinctrl *info = dev_get_drvdata(dev); | 1830 | struct rockchip_pinctrl *info = dev_get_drvdata(dev); |
1831 | int ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, | ||
1832 | rk3288_grf_gpio6c_iomux | | ||
1833 | GPIO6C6_SEL_WRITE_ENABLE); | ||
1834 | |||
1835 | if (ret) | ||
1836 | return ret; | ||
1809 | 1837 | ||
1810 | return pinctrl_force_default(info->pctl_dev); | 1838 | return pinctrl_force_default(info->pctl_dev); |
1811 | } | 1839 | } |