23
23
#include <linux/pm.h>
24
24
#include <linux/log2.h>
25
25
26
+ #include <linux/soc/qcom/irq.h>
27
+
26
28
#include "../core.h"
27
29
#include "../pinconf.h"
28
30
#include "pinctrl-msm.h"
44
46
* @enabled_irqs: Bitmap of currently enabled irqs.
45
47
* @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
46
48
* detection.
49
+ * @skip_wake_irqs: Skip IRQs that are handled by wakeup interrupt controller
47
50
* @soc; Reference to soc_data of platform specific data.
48
51
* @regs: Base addresses for the TLMM tiles.
49
52
*/
@@ -61,6 +64,7 @@ struct msm_pinctrl {
61
64
62
65
DECLARE_BITMAP (dual_edge_irqs , MAX_NR_GPIO );
63
66
DECLARE_BITMAP (enabled_irqs , MAX_NR_GPIO );
67
+ DECLARE_BITMAP (skip_wake_irqs , MAX_NR_GPIO );
64
68
65
69
const struct msm_pinctrl_soc_data * soc ;
66
70
void __iomem * regs [MAX_NR_TILES ];
@@ -707,6 +711,12 @@ static void msm_gpio_irq_mask(struct irq_data *d)
707
711
unsigned long flags ;
708
712
u32 val ;
709
713
714
+ if (d -> parent_data )
715
+ irq_chip_mask_parent (d );
716
+
717
+ if (test_bit (d -> hwirq , pctrl -> skip_wake_irqs ))
718
+ return ;
719
+
710
720
g = & pctrl -> soc -> groups [d -> hwirq ];
711
721
712
722
raw_spin_lock_irqsave (& pctrl -> lock , flags );
@@ -751,6 +761,12 @@ static void msm_gpio_irq_clear_unmask(struct irq_data *d, bool status_clear)
751
761
unsigned long flags ;
752
762
u32 val ;
753
763
764
+ if (d -> parent_data )
765
+ irq_chip_unmask_parent (d );
766
+
767
+ if (test_bit (d -> hwirq , pctrl -> skip_wake_irqs ))
768
+ return ;
769
+
754
770
g = & pctrl -> soc -> groups [d -> hwirq ];
755
771
756
772
raw_spin_lock_irqsave (& pctrl -> lock , flags );
@@ -778,10 +794,35 @@ static void msm_gpio_irq_clear_unmask(struct irq_data *d, bool status_clear)
778
794
779
795
static void msm_gpio_irq_enable (struct irq_data * d )
780
796
{
797
+ /*
798
+ * Clear the interrupt that may be pending before we enable
799
+ * the line.
800
+ * This is especially a problem with the GPIOs routed to the
801
+ * PDC. These GPIOs are direct-connect interrupts to the GIC.
802
+ * Disabling the interrupt line at the PDC does not prevent
803
+ * the interrupt from being latched at the GIC. The state at
804
+ * GIC needs to be cleared before enabling.
805
+ */
806
+ if (d -> parent_data ) {
807
+ irq_chip_set_parent_state (d , IRQCHIP_STATE_PENDING , 0 );
808
+ irq_chip_enable_parent (d );
809
+ }
781
810
782
811
msm_gpio_irq_clear_unmask (d , true);
783
812
}
784
813
814
+ static void msm_gpio_irq_disable (struct irq_data * d )
815
+ {
816
+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
817
+ struct msm_pinctrl * pctrl = gpiochip_get_data (gc );
818
+
819
+ if (d -> parent_data )
820
+ irq_chip_disable_parent (d );
821
+
822
+ if (!test_bit (d -> hwirq , pctrl -> skip_wake_irqs ))
823
+ msm_gpio_irq_mask (d );
824
+ }
825
+
785
826
static void msm_gpio_irq_unmask (struct irq_data * d )
786
827
{
787
828
msm_gpio_irq_clear_unmask (d , false);
@@ -795,6 +836,9 @@ static void msm_gpio_irq_ack(struct irq_data *d)
795
836
unsigned long flags ;
796
837
u32 val ;
797
838
839
+ if (test_bit (d -> hwirq , pctrl -> skip_wake_irqs ))
840
+ return ;
841
+
798
842
g = & pctrl -> soc -> groups [d -> hwirq ];
799
843
800
844
raw_spin_lock_irqsave (& pctrl -> lock , flags );
@@ -820,6 +864,12 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
820
864
unsigned long flags ;
821
865
u32 val ;
822
866
867
+ if (d -> parent_data )
868
+ irq_chip_set_type_parent (d , type );
869
+
870
+ if (test_bit (d -> hwirq , pctrl -> skip_wake_irqs ))
871
+ return 0 ;
872
+
823
873
g = & pctrl -> soc -> groups [d -> hwirq ];
824
874
825
875
raw_spin_lock_irqsave (& pctrl -> lock , flags );
@@ -912,6 +962,15 @@ static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
912
962
struct msm_pinctrl * pctrl = gpiochip_get_data (gc );
913
963
unsigned long flags ;
914
964
965
+ /*
966
+ * While they may not wake up when the TLMM is powered off,
967
+ * some GPIOs would like to wakeup the system from suspend
968
+ * when TLMM is powered on. To allow that, enable the GPIO
969
+ * summary line to be wakeup capable at GIC.
970
+ */
971
+ if (d -> parent_data )
972
+ irq_chip_set_wake_parent (d , on );
973
+
915
974
raw_spin_lock_irqsave (& pctrl -> lock , flags );
916
975
917
976
irq_set_irq_wake (pctrl -> irq , on );
@@ -990,6 +1049,30 @@ static void msm_gpio_irq_handler(struct irq_desc *desc)
990
1049
chained_irq_exit (chip , desc );
991
1050
}
992
1051
1052
+ static int msm_gpio_wakeirq (struct gpio_chip * gc ,
1053
+ unsigned int child ,
1054
+ unsigned int child_type ,
1055
+ unsigned int * parent ,
1056
+ unsigned int * parent_type )
1057
+ {
1058
+ struct msm_pinctrl * pctrl = gpiochip_get_data (gc );
1059
+ const struct msm_gpio_wakeirq_map * map ;
1060
+ int i ;
1061
+
1062
+ * parent = GPIO_NO_WAKE_IRQ ;
1063
+ * parent_type = IRQ_TYPE_EDGE_RISING ;
1064
+
1065
+ for (i = 0 ; i < pctrl -> soc -> nwakeirq_map ; i ++ ) {
1066
+ map = & pctrl -> soc -> wakeirq_map [i ];
1067
+ if (map -> gpio == child ) {
1068
+ * parent = map -> wakeirq ;
1069
+ break ;
1070
+ }
1071
+ }
1072
+
1073
+ return 0 ;
1074
+ }
1075
+
993
1076
static bool msm_gpio_needs_valid_mask (struct msm_pinctrl * pctrl )
994
1077
{
995
1078
if (pctrl -> soc -> reserved_gpios )
@@ -1002,8 +1085,10 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
1002
1085
{
1003
1086
struct gpio_chip * chip ;
1004
1087
struct gpio_irq_chip * girq ;
1005
- int ret ;
1006
- unsigned ngpio = pctrl -> soc -> ngpios ;
1088
+ int i , ret ;
1089
+ unsigned gpio , ngpio = pctrl -> soc -> ngpios ;
1090
+ struct device_node * np ;
1091
+ bool skip ;
1007
1092
1008
1093
if (WARN_ON (ngpio > MAX_NR_GPIO ))
1009
1094
return - EINVAL ;
@@ -1020,17 +1105,40 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
1020
1105
1021
1106
pctrl -> irq_chip .name = "msmgpio" ;
1022
1107
pctrl -> irq_chip .irq_enable = msm_gpio_irq_enable ;
1108
+ pctrl -> irq_chip .irq_disable = msm_gpio_irq_disable ;
1023
1109
pctrl -> irq_chip .irq_mask = msm_gpio_irq_mask ;
1024
1110
pctrl -> irq_chip .irq_unmask = msm_gpio_irq_unmask ;
1025
1111
pctrl -> irq_chip .irq_ack = msm_gpio_irq_ack ;
1112
+ pctrl -> irq_chip .irq_eoi = irq_chip_eoi_parent ;
1026
1113
pctrl -> irq_chip .irq_set_type = msm_gpio_irq_set_type ;
1027
1114
pctrl -> irq_chip .irq_set_wake = msm_gpio_irq_set_wake ;
1028
1115
pctrl -> irq_chip .irq_request_resources = msm_gpio_irq_reqres ;
1029
1116
pctrl -> irq_chip .irq_release_resources = msm_gpio_irq_relres ;
1030
1117
1118
+ np = of_parse_phandle (pctrl -> dev -> of_node , "wakeup-parent" , 0 );
1119
+ if (np ) {
1120
+ chip -> irq .parent_domain = irq_find_matching_host (np ,
1121
+ DOMAIN_BUS_WAKEUP );
1122
+ of_node_put (np );
1123
+ if (!chip -> irq .parent_domain )
1124
+ return - EPROBE_DEFER ;
1125
+ chip -> irq .child_to_parent_hwirq = msm_gpio_wakeirq ;
1126
+
1127
+ /*
1128
+ * Let's skip handling the GPIOs, if the parent irqchip
1129
+ * is handling the direct connect IRQ of the GPIO.
1130
+ */
1131
+ skip = irq_domain_qcom_handle_wakeup (chip -> irq .parent_domain );
1132
+ for (i = 0 ; skip && i < pctrl -> soc -> nwakeirq_map ; i ++ ) {
1133
+ gpio = pctrl -> soc -> wakeirq_map [i ].gpio ;
1134
+ set_bit (gpio , pctrl -> skip_wake_irqs );
1135
+ }
1136
+ }
1137
+
1031
1138
girq = & chip -> irq ;
1032
1139
girq -> chip = & pctrl -> irq_chip ;
1033
1140
girq -> parent_handler = msm_gpio_irq_handler ;
1141
+ girq -> fwnode = pctrl -> dev -> fwnode ;
1034
1142
girq -> num_parents = 1 ;
1035
1143
girq -> parents = devm_kcalloc (pctrl -> dev , 1 , sizeof (* girq -> parents ),
1036
1144
GFP_KERNEL );
0 commit comments