Skip to content

Commit e64fbfa

Browse files
committed
pinctrl: intel: Protect IO in few call backs by lock
Protect IO in intel_gpio_get_direction(), intel_gpio_community_irq_handler(), intel_config_get_debounce() and intel_config_get_pull() by lock. Even for simple readl() we better serialize IO to avoid potential problems. Signed-off-by: Andy Shevchenko <[email protected]> Acked-by: Mika Westerberg <[email protected]>
1 parent 81ab554 commit e64fbfa

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

drivers/pinctrl/intel/pinctrl-intel.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,11 +526,15 @@ static int intel_config_get_pull(struct intel_pinctrl *pctrl, unsigned int pin,
526526
{
527527
const struct intel_community *community;
528528
void __iomem *padcfg1;
529+
unsigned long flags;
529530
u32 value, term;
530531

531532
community = intel_get_community(pctrl, pin);
532533
padcfg1 = intel_get_padcfg(pctrl, pin, PADCFG1);
534+
535+
raw_spin_lock_irqsave(&pctrl->lock, flags);
533536
value = readl(padcfg1);
537+
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
534538

535539
term = (value & PADCFG1_TERM_MASK) >> PADCFG1_TERM_SHIFT;
536540

@@ -592,14 +596,17 @@ static int intel_config_get_debounce(struct intel_pinctrl *pctrl, unsigned int p
592596
enum pin_config_param param, u32 *arg)
593597
{
594598
void __iomem *padcfg2;
599+
unsigned long flags;
595600
unsigned long v;
596601
u32 value2;
597602

598603
padcfg2 = intel_get_padcfg(pctrl, pin, PADCFG2);
599604
if (!padcfg2)
600605
return -ENOTSUPP;
601606

607+
raw_spin_lock_irqsave(&pctrl->lock, flags);
602608
value2 = readl(padcfg2);
609+
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
603610
if (!(value2 & PADCFG2_DEBEN))
604611
return -EINVAL;
605612

@@ -934,6 +941,7 @@ static void intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
934941
static int intel_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
935942
{
936943
struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
944+
unsigned long flags;
937945
void __iomem *reg;
938946
u32 padcfg0;
939947
int pin;
@@ -946,8 +954,9 @@ static int intel_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
946954
if (!reg)
947955
return -EINVAL;
948956

957+
raw_spin_lock_irqsave(&pctrl->lock, flags);
949958
padcfg0 = readl(reg);
950-
959+
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
951960
if (padcfg0 & PADCFG0_PMODE_MASK)
952961
return -EINVAL;
953962

@@ -1134,12 +1143,17 @@ static int intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
11341143
for (gpp = 0; gpp < community->ngpps; gpp++) {
11351144
const struct intel_padgroup *padgrp = &community->gpps[gpp];
11361145
unsigned long pending, enabled, gpp_offset;
1146+
unsigned long flags;
1147+
1148+
raw_spin_lock_irqsave(&pctrl->lock, flags);
11371149

11381150
pending = readl(community->regs + community->is_offset +
11391151
padgrp->reg_num * 4);
11401152
enabled = readl(community->regs + community->ie_offset +
11411153
padgrp->reg_num * 4);
11421154

1155+
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
1156+
11431157
/* Only interrupts that are enabled */
11441158
pending &= enabled;
11451159

0 commit comments

Comments
 (0)