lkml.org 
[lkml]   [2014]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3/4 v3] GPIO: gpio-dwapb: Support Debounce
    Date
    This patch enables 'debounce' for the designware GPIO, and
    it is based on Josef Ahmad's previous work.

    Reviewed-by: Hock Leong Kweh <hock.leong.kweh@intel.com>
    Reviewed-by: Shevchenko, Andriy <andriy.shevchenko@intel.com>
    Signed-off-by: Weike Chen <alvin.chen@intel.com>
    ---
    drivers/gpio/gpio-dwapb.c | 28 ++++++++++++++++++++++++++++
    1 file changed, 28 insertions(+)

    diff --git a/drivers/gpio/gpio-dwapb.c b/drivers/gpio/gpio-dwapb.c
    index c78a878..a90afb9 100644
    --- a/drivers/gpio/gpio-dwapb.c
    +++ b/drivers/gpio/gpio-dwapb.c
    @@ -37,6 +37,7 @@
    #define GPIO_INTTYPE_LEVEL 0x38
    #define GPIO_INT_POLARITY 0x3c
    #define GPIO_INTSTATUS 0x40
    +#define GPIO_PORTA_DEBOUNCE 0x48
    #define GPIO_PORTA_EOI 0x4c
    #define GPIO_EXT_PORTA 0x50
    #define GPIO_EXT_PORTB 0x54
    @@ -235,6 +236,29 @@ static int dwapb_irq_set_type(struct irq_data *d, u32 type)
    return 0;
    }

    +static int dwapb_gpio_set_debounce(struct gpio_chip *gc,
    + unsigned offset, unsigned debounce)
    +{
    + struct bgpio_chip *bgc = to_bgpio_chip(gc);
    + struct dwapb_gpio_port *port =
    + container_of(bgc, struct dwapb_gpio_port, bgc);
    + struct dwapb_gpio *gpio = port->gpio;
    + unsigned long flags, val_deb;
    + unsigned long mask = bgc->pin2mask(bgc, offset);
    +
    + spin_lock_irqsave(&bgc->lock, flags);
    +
    + val_deb = dwapb_read(gpio, GPIO_PORTA_DEBOUNCE);
    + if (debounce)
    + dwapb_write(gpio, GPIO_PORTA_DEBOUNCE, mask | val_deb);
    + else
    + dwapb_write(gpio, GPIO_PORTA_DEBOUNCE, ~mask & val_deb);
    +
    + spin_unlock_irqrestore(&bgc->lock, flags);
    +
    + return 0;
    +}
    +
    static irqreturn_t dwapb_irq_handler_mfd(int irq, void *dev_id)
    {
    u32 worked;
    @@ -373,6 +397,10 @@ static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
    port->bgc.gc.ngpio = pp->ngpio;
    port->bgc.gc.base = pp->gpio_base;

    + /* Only port A support debounce */
    + if (pp->idx == 0)
    + port->bgc.gc.set_debounce = dwapb_gpio_set_debounce;
    +
    if (pp->irq)
    dwapb_configure_irqs(gpio, port, pp);

    --
    1.7.9.5


    \
     
     \ /
      Last update: 2014-09-09 12:41    [W:2.904 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site