pinctrl: bcm2835: reduce GPPUD set-up time
authorStefan Wahren <stefan.wahren@i2se.com>
Mon, 31 Oct 2016 13:21:33 +0000 (13:21 +0000)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 4 Nov 2016 15:28:28 +0000 (16:28 +0100)
Since the BCM2835 datasheet doesn't exactly specify the set-up time for
the GPIO Pull-up/down Clock Registers there was an assumption of 150 cycles
at a clock rate of 1 MHz. During a discussion [1] in the Raspberry Pi forum
it turns out that clock rate refers to the VPU which has a rate of 250 MHz.
So we can reduce the delay to a sensible value and update the comment above.

I tested this optimization with a Raspberry Pi B and a multimeter.

[1] - https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=163352

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/bcm/pinctrl-bcm2835.c

index fa77165fab2c1348163979da507df17e7168c49b..b2dd278f18b11aa454122728669efe706ed5f917 100644 (file)
@@ -917,12 +917,14 @@ static int bcm2835_pinconf_set(struct pinctrl_dev *pctldev,
 
                bcm2835_gpio_wr(pc, GPPUD, arg & 3);
                /*
-                * Docs say to wait 150 cycles, but not of what. We assume a
-                * 1 MHz clock here, which is pretty slow...
+                * BCM2835 datasheet say to wait 150 cycles, but not of what.
+                * But the VideoCore firmware delay for this operation
+                * based nearly on the same amount of VPU cycles and this clock
+                * runs at 250 MHz.
                 */
-               udelay(150);
+               udelay(1);
                bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), BIT(bit));
-               udelay(150);
+               udelay(1);
                bcm2835_gpio_wr(pc, GPPUDCLK0 + (off * 4), 0);
        } /* for each config */