[PATCH] gpio/generic: initialize the shadow of direction register

Shawn Guo shawn.guo at freescale.com
Wed May 16 01:33:02 EDT 2012


On Tue, May 15, 2012 at 09:17:50AM +0200, Lothar Waßmann wrote:
> This will blow up in your face when calling bgpio_init() without any
> direction register (which is well supported by the generic driver).
> 
> You need to do this in the platform specific driver that uses the
> generic driver. See gpio-mxc.c for reference:
> |        err = bgpio_init(&port->bgc, &pdev->dev, 4,
> |                         port->base + GPIO_PSR,
> |                         port->base + GPIO_DR, NULL,
> |                         port->base + GPIO_GDIR, NULL, false);
> |        if (err)
> |                goto out_iounmap;
> |
> |        port->bgc.gc.to_irq = mxc_gpio_to_irq;
> |        port->bgc.gc.base = pdev->id * 32;
> |        port->bgc.dir = port->bgc.read_reg(port->bgc.reg_dir);
> |        port->bgc.data = port->bgc.read_reg(port->bgc.reg_set);
> 
Ah, thanks for the info.  I did not know that we ran into the issue
on gpio-mxc and had it fixed there.  But instead of asking every
single platform gpio driver to do the fixup, we should really fix it
in generic driver.  Imaging if you fixed the issue in gpio-generic
when you ran into the problem on MXC/IMX, I wouldn't have spent half
day to track the issue down on MXS :)

So back to the right fixing, does the following one look good to you?

@@ -394,6 +394,10 @@ int bgpio_init(struct bgpio_chip *bgc, struct device *dev,
                return ret;

        bgc->data = bgc->read_reg(bgc->reg_dat);
+       if (bgc->gc.set == bgpio_set_set)
+               bgc->data = bgc->read_reg(bgc->reg_set);
+       if (bgc->reg_dir)
+               bgc->dir = bgc->read_reg(bgc->reg_dir);

        return ret;
 }

-- 
Regards,
Shawn




More information about the linux-arm-kernel mailing list