diff options
| -rw-r--r-- | drivers/pinctrl/qcom/pinctrl-apq8064.c | 7 | ||||
| -rw-r--r-- | drivers/pinctrl/qcom/pinctrl-msm.c | 30 |
2 files changed, 36 insertions, 1 deletions
diff --git a/drivers/pinctrl/qcom/pinctrl-apq8064.c b/drivers/pinctrl/qcom/pinctrl-apq8064.c index feb6f152f9b7..ef1263c7bdde 100644 --- a/drivers/pinctrl/qcom/pinctrl-apq8064.c +++ b/drivers/pinctrl/qcom/pinctrl-apq8064.c | |||
| @@ -324,6 +324,7 @@ enum apq8064_functions { | |||
| 324 | APQ_MUX_tsif1, | 324 | APQ_MUX_tsif1, |
| 325 | APQ_MUX_tsif2, | 325 | APQ_MUX_tsif2, |
| 326 | APQ_MUX_usb2_hsic, | 326 | APQ_MUX_usb2_hsic, |
| 327 | APQ_MUX_ps_hold, | ||
| 327 | APQ_MUX_NA, | 328 | APQ_MUX_NA, |
| 328 | }; | 329 | }; |
| 329 | 330 | ||
| @@ -351,6 +352,9 @@ static const char * const gpio_groups[] = { | |||
| 351 | "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84", | 352 | "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84", |
| 352 | "gpio85", "gpio86", "gpio87", "gpio88", "gpio89" | 353 | "gpio85", "gpio86", "gpio87", "gpio88", "gpio89" |
| 353 | }; | 354 | }; |
| 355 | static const char * const ps_hold_groups[] = { | ||
| 356 | "gpio78" | ||
| 357 | }; | ||
| 354 | static const char * const gsbi1_groups[] = { | 358 | static const char * const gsbi1_groups[] = { |
| 355 | "gpio18", "gpio19", "gpio20", "gpio21" | 359 | "gpio18", "gpio19", "gpio20", "gpio21" |
| 356 | }; | 360 | }; |
| @@ -477,6 +481,7 @@ static const struct msm_function apq8064_functions[] = { | |||
| 477 | FUNCTION(tsif1), | 481 | FUNCTION(tsif1), |
| 478 | FUNCTION(tsif2), | 482 | FUNCTION(tsif2), |
| 479 | FUNCTION(usb2_hsic), | 483 | FUNCTION(usb2_hsic), |
| 484 | FUNCTION(ps_hold), | ||
| 480 | }; | 485 | }; |
| 481 | 486 | ||
| 482 | static const struct msm_pingroup apq8064_groups[] = { | 487 | static const struct msm_pingroup apq8064_groups[] = { |
| @@ -558,7 +563,7 @@ static const struct msm_pingroup apq8064_groups[] = { | |||
| 558 | PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 563 | PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 559 | PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 564 | PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 560 | PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 565 | PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 561 | PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 566 | PINGROUP(78, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 562 | PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 567 | PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 563 | PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 568 | PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
| 564 | PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), | 569 | PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), |
diff --git a/drivers/pinctrl/qcom/pinctrl-msm.c b/drivers/pinctrl/qcom/pinctrl-msm.c index 9175bbc298c7..80a64cad907d 100644 --- a/drivers/pinctrl/qcom/pinctrl-msm.c +++ b/drivers/pinctrl/qcom/pinctrl-msm.c | |||
| @@ -12,6 +12,7 @@ | |||
| 12 | * GNU General Public License for more details. | 12 | * GNU General Public License for more details. |
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | #include <linux/delay.h> | ||
| 15 | #include <linux/err.h> | 16 | #include <linux/err.h> |
| 16 | #include <linux/io.h> | 17 | #include <linux/io.h> |
| 17 | #include <linux/module.h> | 18 | #include <linux/module.h> |
| @@ -27,12 +28,15 @@ | |||
| 27 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
| 28 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
| 29 | 30 | ||
| 31 | #include <asm/system_misc.h> | ||
| 32 | |||
| 30 | #include "../core.h" | 33 | #include "../core.h" |
| 31 | #include "../pinconf.h" | 34 | #include "../pinconf.h" |
| 32 | #include "pinctrl-msm.h" | 35 | #include "pinctrl-msm.h" |
| 33 | #include "../pinctrl-utils.h" | 36 | #include "../pinctrl-utils.h" |
| 34 | 37 | ||
| 35 | #define MAX_NR_GPIO 300 | 38 | #define MAX_NR_GPIO 300 |
| 39 | #define PS_HOLD_OFFSET 0x820 | ||
| 36 | 40 | ||
| 37 | /** | 41 | /** |
| 38 | * struct msm_pinctrl - state for a pinctrl-msm device | 42 | * struct msm_pinctrl - state for a pinctrl-msm device |
| @@ -850,6 +854,30 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl) | |||
| 850 | return 0; | 854 | return 0; |
| 851 | } | 855 | } |
| 852 | 856 | ||
| 857 | #ifdef CONFIG_ARM | ||
| 858 | static void __iomem *msm_ps_hold; | ||
| 859 | |||
| 860 | static void msm_reset(enum reboot_mode reboot_mode, const char *cmd) | ||
| 861 | { | ||
| 862 | writel(0, msm_ps_hold); | ||
| 863 | mdelay(10000); | ||
| 864 | } | ||
| 865 | |||
| 866 | static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl) | ||
| 867 | { | ||
| 868 | int i = 0; | ||
| 869 | const struct msm_function *func = pctrl->soc->functions; | ||
| 870 | |||
| 871 | for (; i <= pctrl->soc->nfunctions; i++) | ||
| 872 | if (!strcmp(func[i].name, "ps_hold")) { | ||
| 873 | msm_ps_hold = pctrl->regs + PS_HOLD_OFFSET; | ||
| 874 | arm_pm_restart = msm_reset; | ||
| 875 | } | ||
| 876 | } | ||
| 877 | #else | ||
| 878 | static void msm_pinctrl_setup_pm_reset(const struct msm_pinctrl *pctrl) {} | ||
| 879 | #endif | ||
| 880 | |||
| 853 | int msm_pinctrl_probe(struct platform_device *pdev, | 881 | int msm_pinctrl_probe(struct platform_device *pdev, |
| 854 | const struct msm_pinctrl_soc_data *soc_data) | 882 | const struct msm_pinctrl_soc_data *soc_data) |
| 855 | { | 883 | { |
| @@ -873,6 +901,8 @@ int msm_pinctrl_probe(struct platform_device *pdev, | |||
| 873 | if (IS_ERR(pctrl->regs)) | 901 | if (IS_ERR(pctrl->regs)) |
| 874 | return PTR_ERR(pctrl->regs); | 902 | return PTR_ERR(pctrl->regs); |
| 875 | 903 | ||
| 904 | msm_pinctrl_setup_pm_reset(pctrl); | ||
| 905 | |||
| 876 | pctrl->irq = platform_get_irq(pdev, 0); | 906 | pctrl->irq = platform_get_irq(pdev, 0); |
| 877 | if (pctrl->irq < 0) { | 907 | if (pctrl->irq < 0) { |
| 878 | dev_err(&pdev->dev, "No interrupt defined for msmgpio\n"); | 908 | dev_err(&pdev->dev, "No interrupt defined for msmgpio\n"); |
