]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
pinctrl: sh-pfc: r8a77990: Add support for pull-up only pins
authorGeert Uytterhoeven <geert+renesas@glider.be>
Thu, 6 Dec 2018 16:30:39 +0000 (17:30 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Tue, 18 Dec 2018 10:02:33 +0000 (11:02 +0100)
The R-Car Gen3 HardWare Manual Errata for Rev. 1.00 (Jul 2, 2018) states
that the USB30_OVC pin supports pull-up only.  It has a bit assigned in
the pull-enable register (PUEN5), but not in the pull-up/down control
register (PUD5).

Add a check for this, to prevent configuring a prohibited setting.

Reported-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Fixes: 83f6941a42a5e773 ("pinctrl: sh-pfc: r8a77990: Add bias pinconf support")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
drivers/pinctrl/sh-pfc/pfc-r8a77990.c

index 8c06d72753890e323bb5e6d4ce94184e44cc6465..784d4400c3e0e7eae27f895f29a702d61c803a63 100644 (file)
@@ -4914,6 +4914,17 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
        { /* sentinel */ },
 };
 
+static bool pin_has_pud(unsigned int pin)
+{
+       /* Some pins are pull-up only */
+       switch (pin) {
+       case RCAR_GP_PIN(6, 9): /* USB30_OVC  */
+               return false;
+       }
+
+       return true;
+}
+
 static unsigned int r8a77990_pinmux_get_bias(struct sh_pfc *pfc,
                                             unsigned int pin)
 {
@@ -4926,7 +4937,7 @@ static unsigned int r8a77990_pinmux_get_bias(struct sh_pfc *pfc,
 
        if (!(sh_pfc_read(pfc, reg->puen) & BIT(bit)))
                return PIN_CONFIG_BIAS_DISABLE;
-       else if (sh_pfc_read(pfc, reg->pud) & BIT(bit))
+       else if (!pin_has_pud(pin) || (sh_pfc_read(pfc, reg->pud) & BIT(bit)))
                return PIN_CONFIG_BIAS_PULL_UP;
        else
                return PIN_CONFIG_BIAS_PULL_DOWN;
@@ -4947,11 +4958,13 @@ static void r8a77990_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
        if (bias != PIN_CONFIG_BIAS_DISABLE)
                enable |= BIT(bit);
 
-       updown = sh_pfc_read(pfc, reg->pud) & ~BIT(bit);
-       if (bias == PIN_CONFIG_BIAS_PULL_UP)
-               updown |= BIT(bit);
+       if (pin_has_pud(pin)) {
+               updown = sh_pfc_read(pfc, reg->pud) & ~BIT(bit);
+               if (bias == PIN_CONFIG_BIAS_PULL_UP)
+                       updown |= BIT(bit);
 
-       sh_pfc_write(pfc, reg->pud, updown);
+               sh_pfc_write(pfc, reg->pud, updown);
+       }
        sh_pfc_write(pfc, reg->puen, enable);
 }