Skip to content

Commit f513b35

Browse files
CL WangCharlesWu465
authored andcommitted
gpio: andes: atcgpio100: Fix recursive deadlock when setting the direction of a GPIO.
Please see the following link for details. https://es.andestech.com/scp/tasks.php?id=3717 Signed-off-by: CL Wang <[email protected]>
1 parent afbbde8 commit f513b35

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

drivers/gpio/gpio-atcgpio100.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,25 @@ static int atcgpio_get(struct gpio_chip *gc, unsigned int gpio)
7272
return (val >> gpio & 1);
7373
}
7474

75-
static void atcgpio_set(struct gpio_chip *gc, unsigned int gpio, int data)
75+
static void atcgpio_setgpio_val(struct atcgpio_priv *priv, unsigned int gpio, int data)
7676
{
77-
unsigned long flags;
78-
struct atcgpio_priv *priv;
7977
unsigned long val;
8078

81-
priv = gpiochip_get_data(gc);
82-
spin_lock_irqsave(&priv->lock, flags);
8379
if (data)
8480
val = GPIO_READL(GPIO_DATA_OUT, priv->base) | (0x1UL << gpio);
8581
else
8682
val = GPIO_READL(GPIO_DATA_OUT, priv->base) & ~(0x1UL << gpio);
8783
GPIO_WRITEL(val, GPIO_DATA_OUT, priv->base);
84+
}
85+
86+
static void atcgpio_set(struct gpio_chip *gc, unsigned int gpio, int data)
87+
{
88+
unsigned long flags;
89+
struct atcgpio_priv *priv;
90+
91+
priv = gpiochip_get_data(gc);
92+
spin_lock_irqsave(&priv->lock, flags);
93+
atcgpio_setgpio_val(priv, gpio, data);
8894
spin_unlock_irqrestore(&priv->lock, flags);
8995
}
9096

@@ -111,9 +117,9 @@ static int atcgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int data)
111117

112118
priv = gpiochip_get_data(gc);
113119
spin_lock_irqsave(&priv->lock, flags);
120+
atcgpio_setgpio_val(priv, gpio, data);
114121
val = GPIO_READL(PIN_DIR, priv->base) | (0x1UL << gpio);
115122
GPIO_WRITEL(val, PIN_DIR, priv->base);
116-
gc->set(gc, gpio, data);
117123
spin_unlock_irqrestore(&priv->lock, flags);
118124

119125
return 0;

0 commit comments

Comments
 (0)