gpio: stm32f7: replace ODR update by BSRR write
authorPatrice Chotard <patrice.chotard@st.com>
Thu, 9 Aug 2018 09:57:57 +0000 (11:57 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 11 Sep 2018 00:48:18 +0000 (20:48 -0400)
Replace clrsetbits on ODR register (2 operations: one read + one write)
by writing on the correct bit (SET or RESET) of the BSRR register
(only 1 write operation).

Moreover this register if safe for simultaneous access by 2 master on
the bus.

Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
Signed-off-by: Patrice Chotard <patrice.chotard@st.com>
drivers/gpio/stm32f7_gpio.c

index 5b08e7ee275ce3545a729bdd21f7c5757c12c495..4c0786fff88da382e3be6db392f53dc062b2d84f 100644 (file)
@@ -18,7 +18,7 @@
 #define STM32_GPIOS_PER_BANK           16
 #define MODE_BITS(gpio_pin)            (gpio_pin * 2)
 #define MODE_BITS_MASK                 3
-#define IN_OUT_BIT_INDEX(gpio_pin)     (1UL << (gpio_pin))
+#define BSRR_BIT(gpio_pin, value)      BIT(gpio_pin + (value ? 0 : 16))
 
 static int stm32_gpio_direction_input(struct udevice *dev, unsigned offset)
 {
@@ -41,8 +41,8 @@ static int stm32_gpio_direction_output(struct udevice *dev, unsigned offset,
        int mask = MODE_BITS_MASK << bits_index;
 
        clrsetbits_le32(&regs->moder, mask, STM32_GPIO_MODE_OUT << bits_index);
-       mask = IN_OUT_BIT_INDEX(offset);
-       clrsetbits_le32(&regs->odr, mask, value ? mask : 0);
+
+       writel(BSRR_BIT(offset, value), &regs->bsrr);
 
        return 0;
 }
@@ -52,16 +52,15 @@ static int stm32_gpio_get_value(struct udevice *dev, unsigned offset)
        struct stm32_gpio_priv *priv = dev_get_priv(dev);
        struct stm32_gpio_regs *regs = priv->regs;
 
-       return readl(&regs->idr) & IN_OUT_BIT_INDEX(offset) ? 1 : 0;
+       return readl(&regs->idr) & BIT(offset) ? 1 : 0;
 }
 
 static int stm32_gpio_set_value(struct udevice *dev, unsigned offset, int value)
 {
        struct stm32_gpio_priv *priv = dev_get_priv(dev);
        struct stm32_gpio_regs *regs = priv->regs;
-       int mask = IN_OUT_BIT_INDEX(offset);
 
-       clrsetbits_le32(&regs->odr, mask, value ? mask : 0);
+       writel(BSRR_BIT(offset, value), &regs->bsrr);
 
        return 0;
 }