@@ -526,11 +526,15 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
526
526
{
527
527
const struct intel_community * community ;
528
528
void __iomem * padcfg1 ;
529
+ unsigned long flags ;
529
530
u32 value , term ;
530
531
531
532
community = intel_get_community (pctrl , pin );
532
533
padcfg1 = intel_get_padcfg (pctrl , pin , PADCFG1 );
534
+
535
+ raw_spin_lock_irqsave (& pctrl -> lock , flags );
533
536
value = readl (padcfg1 );
537
+ raw_spin_unlock_irqrestore (& pctrl -> lock , flags );
534
538
535
539
term = (value & PADCFG1_TERM_MASK ) >> PADCFG1_TERM_SHIFT ;
536
540
@@ -592,14 +596,17 @@ static int intel_config_get_debounce(struct intel_pinctrl *pctrl, unsigned int p
592
596
enum pin_config_param param , u32 * arg )
593
597
{
594
598
void __iomem * padcfg2 ;
599
+ unsigned long flags ;
595
600
unsigned long v ;
596
601
u32 value2 ;
597
602
598
603
padcfg2 = intel_get_padcfg (pctrl , pin , PADCFG2 );
599
604
if (!padcfg2 )
600
605
return - ENOTSUPP ;
601
606
607
+ raw_spin_lock_irqsave (& pctrl -> lock , flags );
602
608
value2 = readl (padcfg2 );
609
+ raw_spin_unlock_irqrestore (& pctrl -> lock , flags );
603
610
if (!(value2 & PADCFG2_DEBEN ))
604
611
return - EINVAL ;
605
612
@@ -934,6 +941,7 @@ static void intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
934
941
static int intel_gpio_get_direction (struct gpio_chip * chip , unsigned int offset )
935
942
{
936
943
struct intel_pinctrl * pctrl = gpiochip_get_data (chip );
944
+ unsigned long flags ;
937
945
void __iomem * reg ;
938
946
u32 padcfg0 ;
939
947
int pin ;
@@ -946,8 +954,9 @@ static int intel_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
946
954
if (!reg )
947
955
return - EINVAL ;
948
956
957
+ raw_spin_lock_irqsave (& pctrl -> lock , flags );
949
958
padcfg0 = readl (reg );
950
-
959
+ raw_spin_unlock_irqrestore ( & pctrl -> lock , flags );
951
960
if (padcfg0 & PADCFG0_PMODE_MASK )
952
961
return - EINVAL ;
953
962
@@ -1134,12 +1143,17 @@ static int intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
1134
1143
for (gpp = 0 ; gpp < community -> ngpps ; gpp ++ ) {
1135
1144
const struct intel_padgroup * padgrp = & community -> gpps [gpp ];
1136
1145
unsigned long pending , enabled , gpp_offset ;
1146
+ unsigned long flags ;
1147
+
1148
+ raw_spin_lock_irqsave (& pctrl -> lock , flags );
1137
1149
1138
1150
pending = readl (community -> regs + community -> is_offset +
1139
1151
padgrp -> reg_num * 4 );
1140
1152
enabled = readl (community -> regs + community -> ie_offset +
1141
1153
padgrp -> reg_num * 4 );
1142
1154
1155
+ raw_spin_unlock_irqrestore (& pctrl -> lock , flags );
1156
+
1143
1157
/* Only interrupts that are enabled */
1144
1158
pending &= enabled ;
1145
1159
0 commit comments