lkml.org 
[lkml]   [2010]   [Sep]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v7-fix] gpio: Add driver for basic memory-mapped GPIO controllers (fix)
    On Fri, Sep 24, 2010 at 02:45:35PM -0700, Andrew Morton wrote:
    > It would be good to document `bits' and `big_endian_bits', and to
    > describe what `lock' locks.

    Done.

    > > +static int bgpio_dir_in(struct gpio_chip *gc, unsigned int gpio)
    > > +{
    > > + return 0;
    > > +}
    >
    > hm, what does this mean. The hardware cannot set pin directions to
    > "in"?

    Nope, 0 is the success. The hardware cannot set pin directions
    at all (well, some hw can, but we don't support these yet).

    > > + return gpiochip_add(&bgc->gc);
    > > +}
    >
    > If this function returns -EINVAL then much head-scratching will ensue.
    > It might make your life easier to emit a diagnostic just before the
    > failure so you can work out why it failed.

    OK.

    Signed-off-by: Anton Vorontsov <cbouatmailru@gmail.com>
    ---

    Thanks!

    drivers/gpio/basic_mmio_gpio.c | 22 +++++++++++++++++++---
    1 files changed, 19 insertions(+), 3 deletions(-)

    diff --git a/drivers/gpio/basic_mmio_gpio.c b/drivers/gpio/basic_mmio_gpio.c
    index c2c11e7..3addea6 100644
    --- a/drivers/gpio/basic_mmio_gpio.c
    +++ b/drivers/gpio/basic_mmio_gpio.c
    @@ -66,12 +66,23 @@ struct bgpio_chip {
    void __iomem *reg_dat;
    void __iomem *reg_set;
    void __iomem *reg_clr;
    - spinlock_t lock;

    + /* Number of bits (GPIOs): <register width> * 8. */
    int bits;
    +
    + /*
    + * Some GPIO controllers work with the big-endian bits notation,
    + * e.g. in a 8-bits register, GPIO7 is the least significant bit.
    + */
    int big_endian_bits;

    - /* shadowed data register to clear/set bits safely */
    + /*
    + * Used to lock bgpio_chip->data. Also, this is needed to keep
    + * shadowed and real data registers writes together.
    + */
    + spinlock_t lock;
    +
    + /* Shadowed data register to clear/set bits safely. */
    unsigned long data;
    };

    @@ -181,6 +192,7 @@ static int __devinit bgpio_probe(struct platform_device *pdev)
    struct resource *res_clr;
    resource_size_t dat_sz;
    int bits;
    + int ret;

    res_dat = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dat");
    if (!res_dat)
    @@ -238,7 +250,11 @@ static int __devinit bgpio_probe(struct platform_device *pdev)

    dev_set_drvdata(dev, bgc);

    - return gpiochip_add(&bgc->gc);
    + ret = gpiochip_add(&bgc->gc);
    + if (ret)
    + dev_err(dev, "gpiochip_add() failed: %d\n", ret);
    +
    + return ret;
    }

    static int __devexit bgpio_remove(struct platform_device *pdev)
    --
    1.7.0.5


    \
     
     \ /
      Last update: 2010-09-28 14:43    [W:3.306 / U:0.804 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site