1. 11 May, 2012 14 commits
    • Jean-François Dagenais's avatar
    • Poddar, Sourav's avatar
      Input: omap-keypad - dynamically handle register offsets · f77621cc
      Poddar, Sourav authored
      Hi Dmitry,
      
      On Wed, May 9, 2012 at 3:14 PM, Poddar, Sourav <sourav.poddar@ti.com> wrote:
      > Hi Dmitry,
      >
      > I did some minor fixes to the patch which you suggested above and
      > the keypad is functional now.
      >
      > Changes:
      > - Move "pm_runtime_enable" before using "pm_runtime_get_sync".
      >
      > Sending the patch inlined..(also attached).
      >
      > From: G, Manjunath Kondaiah <manjugk@ti.com>
      > Date: Mon, 10 Oct 2011 20:52:05 +0530
      > Subject: [PATCH] Input: omap-keypad: dynamically handle register offsets
      >
      > Keypad controller register offsets are different for omap4
      > and omap5. Handle these offsets through static mapping and
      > assign these mappings during run time.
      >
      > Tested on omap4430 sdp with 3.4-rc3.
      > Tested on omap5430evm with 3.1-custom kernel.
      >
      > Cc: Andrew Morton <akpm@linux-foundation.org>
      > Signed-off-by: Felipe Balbi <balbi@ti.com>
      > Signed-off-by: G, Manjunath Kondaiah <manjugk@ti.com>
      > Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
      > Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
      > ---
      >  drivers/input/keyboard/Kconfig        |    4 +-
      >  drivers/input/keyboard/omap4-keypad.c |  120 +++++++++++++++++++++++++-------
      >  2 files changed, 95 insertions(+), 29 deletions(-)
      >
      > diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
      > index f354813..33bbdee 100644
      > --- a/drivers/input/keyboard/Kconfig
      > +++ b/drivers/input/keyboard/Kconfig
      > @@ -512,9 +512,9 @@ config KEYBOARD_OMAP
      >          module will be called omap-keypad.
      >
      >  config KEYBOARD_OMAP4
      > -       tristate "TI OMAP4 keypad support"
      > +       tristate "TI OMAP4+ keypad support"
      >        help
      > -         Say Y here if you want to use the OMAP4 keypad.
      > +         Say Y here if you want to use the OMAP4+ keypad.
      >
      >          To compile this driver as a module, choose M here: the
      >          module will be called omap4-keypad.
      > diff --git a/drivers/input/keyboard/omap4-keypad.c
      > b/drivers/input/keyboard/omap4-keypad.c
      > index e809ac0..d7102e8 100644
      > --- a/drivers/input/keyboard/omap4-keypad.c
      > +++ b/drivers/input/keyboard/omap4-keypad.c
      > @@ -68,19 +68,52 @@
      >
      >  #define OMAP4_MASK_IRQSTATUSDISABLE    0xFFFF
      >
      > +enum {
      > +       KBD_REVISION_OMAP4 = 0,
      > +       KBD_REVISION_OMAP5,
      > +};
      > +
      >  struct omap4_keypad {
      >        struct input_dev *input;
      >
      >        void __iomem *base;
      > -       int irq;
      > +       unsigned int irq;
      >
      >        unsigned int rows;
      >        unsigned int cols;
      > +       u32 reg_offset;
      > +       u32 irqreg_offset;
      >        unsigned int row_shift;
      >        unsigned char key_state[8];
      >        unsigned short keymap[];
      >  };
      >
      > +static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset)
      > +{
      > +       return __raw_readl(keypad_data->base +
      > +                               keypad_data->reg_offset + offset);
      > +}
      > +
      > +static void kbd_writel(struct omap4_keypad *keypad_data, u32 offset, u32 value)
      > +{
      > +       __raw_writel(value,
      > +                    keypad_data->base + keypad_data->reg_offset + offset);
      > +}
      > +
      > +static int kbd_read_irqreg(struct omap4_keypad *keypad_data, u32 offset)
      > +{
      > +       return __raw_readl(keypad_data->base +
      > +                               keypad_data->irqreg_offset + offset);
      > +}
      > +
      > +static void kbd_write_irqreg(struct omap4_keypad *keypad_data,
      > +                            u32 offset, u32 value)
      > +{
      > +       __raw_writel(value,
      > +                    keypad_data->base + keypad_data->irqreg_offset + offset);
      > +}
      > +
      > +
      >  /* Interrupt handler */
      >  static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
      >  {
      > @@ -91,12 +124,11 @@ static irqreturn_t omap4_keypad_interrupt(int
      > irq, void *dev_id)
      >        u32 *new_state = (u32 *) key_state;
      >
      >        /* Disable interrupts */
      > -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      > -                    keypad_data->base + OMAP4_KBD_IRQENABLE);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      > +                        OMAP4_VAL_IRQDISABLE);
      >
      > -       *new_state = __raw_readl(keypad_data->base + OMAP4_KBD_FULLCODE31_0);
      > -       *(new_state + 1) = __raw_readl(keypad_data->base
      > -                                               + OMAP4_KBD_FULLCODE63_32);
      > +       *new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
      > +       *(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);
      >
      >        for (row = 0; row < keypad_data->rows; row++) {
      >                changed = key_state[row] ^ keypad_data->key_state[row];
      > @@ -121,12 +153,13 @@ static irqreturn_t omap4_keypad_interrupt(int
      > irq, void *dev_id)
      >                sizeof(keypad_data->key_state));
      >
      >        /* clear pending interrupts */
      > -       __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
      > -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      > +                        kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
      >
      >        /* enable interrupts */
      > -       __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
      > -                       keypad_data->base + OMAP4_KBD_IRQENABLE);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      > +               OMAP4_DEF_IRQENABLE_EVENTEN |
      > +                               OMAP4_DEF_IRQENABLE_LONGKEY);
      >
      >        return IRQ_HANDLED;
      >  }
      > @@ -139,16 +172,17 @@ static int omap4_keypad_open(struct input_dev *input)
      >
      >        disable_irq(keypad_data->irq);
      >
      > -       __raw_writel(OMAP4_VAL_FUNCTIONALCFG,
      > -                       keypad_data->base + OMAP4_KBD_CTRL);
      > -       __raw_writel(OMAP4_VAL_DEBOUNCINGTIME,
      > -                       keypad_data->base + OMAP4_KBD_DEBOUNCINGTIME);
      > -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      > -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      > -       __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
      > -                       keypad_data->base + OMAP4_KBD_IRQENABLE);
      > -       __raw_writel(OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA,
      > -                       keypad_data->base + OMAP4_KBD_WAKEUPENABLE);
      > +       kbd_writel(keypad_data, OMAP4_KBD_CTRL,
      > +                       OMAP4_VAL_FUNCTIONALCFG);
      > +       kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
      > +                       OMAP4_VAL_DEBOUNCINGTIME);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      > +                       OMAP4_VAL_IRQDISABLE);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      > +                       OMAP4_DEF_IRQENABLE_EVENTEN |
      > +                               OMAP4_DEF_IRQENABLE_LONGKEY);
      > +       kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE,
      > +                       OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA);
      >
      >        enable_irq(keypad_data->irq);
      >
      > @@ -162,12 +196,12 @@ static void omap4_keypad_close(struct input_dev *input)
      >        disable_irq(keypad_data->irq);
      >
      >        /* Disable interrupts */
      > -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      > -                    keypad_data->base + OMAP4_KBD_IRQENABLE);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      > +                        OMAP4_VAL_IRQDISABLE);
      >
      >        /* clear pending interrupts */
      > -       __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
      > -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      > +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      > +                        kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
      >
      >        enable_irq(keypad_data->irq);
      >
      > @@ -182,6 +216,7 @@ static int __devinit omap4_keypad_probe(struct
      > platform_device *pdev)
      >        struct resource *res;
      >        resource_size_t size;
      >        unsigned int row_shift, max_keys;
      > +       int rev;
      >        int irq;
      >        int error;
      >
      > @@ -241,11 +276,40 @@ static int __devinit omap4_keypad_probe(struct
      > platform_device *pdev)
      >        keypad_data->rows = pdata->rows;
      >        keypad_data->cols = pdata->cols;
      >
      > +       /*
      > +       * Enable clocks for the keypad module so that we can read
      > +       * revision register.
      > +       */
      > +       pm_runtime_enable(&pdev->dev);
      > +       error = pm_runtime_get_sync(&pdev->dev);
      > +       if (error) {
      > +               dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n");
      > +               goto err_unmap;
      > +       }
      > +       rev = __raw_readl(keypad_data->base + OMAP4_KBD_REVISION);
      > +       rev &= 0x03 << 30;
      > +       rev >>= 30;
      > +       switch (rev) {
      > +       case KBD_REVISION_OMAP4:
      > +               keypad_data->reg_offset = 0x00;
      > +               keypad_data->irqreg_offset = 0x00;
      > +               break;
      > +       case KBD_REVISION_OMAP5:
      > +               keypad_data->reg_offset = 0x10;
      > +               keypad_data->irqreg_offset = 0x0c;
      > +               break;
      > +       default:
      > +               dev_err(&pdev->dev,
      > +                       "Keypad reports unsupported revision %d", rev);
      > +               error = -EINVAL;
      > +               goto err_pm_put_sync;
      > +       }
      > +
      >        /* input device allocation */
      >        keypad_data->input = input_dev = input_allocate_device();
      >        if (!input_dev) {
      >                error = -ENOMEM;
      > -               goto err_unmap;
      > +               goto err_pm_put_sync;
      >        }
      >
      >        input_dev->name = pdev->name;
      > @@ -273,14 +337,14 @@ static int __devinit omap4_keypad_probe(struct
      > platform_device *pdev)
      >                        input_dev->keycode, input_dev->keybit);
      >
      >        error = request_irq(keypad_data->irq, omap4_keypad_interrupt,
      > -                            IRQF_TRIGGER_RISING,
      > +                           IRQF_DISABLED | IRQF_TRIGGER_RISING,
      Sorry, " IRQF_DISABLED" got included by mistake.
      Removing this stray change and sending it again.
      
      >                             "omap4-keypad", keypad_data);
      >        if (error) {
      >                dev_err(&pdev->dev, "failed to register interrupt\n");
      >                goto err_free_input;
      >        }
      >
      > -       pm_runtime_enable(&pdev->dev);
      > +       pm_runtime_put_sync(&pdev->dev);
      >
      >        error = input_register_device(keypad_data->input);
      >        if (error < 0) {
      > @@ -296,6 +360,8 @@ err_pm_disable:
      >        free_irq(keypad_data->irq, keypad_data);
      >  err_free_input:
      >        input_free_device(input_dev);
      > +err_pm_put_sync:
      > +       pm_runtime_put_sync(&pdev->dev);
      >  err_unmap:
      >        iounmap(keypad_data->base);
      >  err_release_mem:
      >
      >
      > ~Sourav
      >
      > On Wed, May 9, 2012 at 1:15 PM, Dmitry Torokhov
      > <dmitry.torokhov@gmail.com> wrote:
      >>> Hi Dmitry ,
      >>>
      >>>
      >>> On Wed, May 9, 2012 at 10:48 AM, Dmitry Torokhov
      >>> <dmitry.torokhov@gmail.com> wrote:
      >>> > Ho Sourav,
      >>> >
      >>> > On Thu, Apr 26, 2012 at 11:24:37AM +0530, Sourav Poddar wrote:
      >>> >>
      >>> >> -config KEYBOARD_OMAP4
      >>> >> -     tristate "TI OMAP4 keypad support"
      >>> >> +config KEYBOARD_OMAP4+
      >>> >
      >>> > I think this works purely by accident - '+' sign getting dropped by
      >>> > parser...
      >>> >
      >>> >> @@ -139,16 +192,33 @@ static int omap4_keypad_open(struct input_dev *input)
      >>> >>
      >>> >>       disable_irq(keypad_data->irq);
      >>> >>
      >>> >> -     __raw_writel(OMAP4_VAL_FUNCTIONALCFG,
      >>> >> -                     keypad_data->base + OMAP4_KBD_CTRL);
      >>> >> -     __raw_writel(OMAP4_VAL_DEBOUNCINGTIME,
      >>> >> -                     keypad_data->base + OMAP4_KBD_DEBOUNCINGTIME);
      >>> >> -     __raw_writel(OMAP4_VAL_IRQDISABLE,
      >>> >> -                     keypad_data->base + OMAP4_KBD_IRQSTATUS);
      >>> >> -     __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
      >>> >> -                     keypad_data->base + OMAP4_KBD_IRQENABLE);
      >>> >> -     __raw_writel(OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA,
      >>> >> -                     keypad_data->base + OMAP4_KBD_WAKEUPENABLE);
      >>> >> +     keypad_data->revision = kbd_read_revision(keypad_data,
      >>> >> +                     OMAP4_KBD_REVISION);
      >>> >> +     switch (keypad_data->revision) {
      >>> >> +     case 1:
      >>> >> +             keypad_data->irqstatus = OMAP4_KBD_IRQSTATUS + 0x0c;
      >>> >> +             keypad_data->irqenable = OMAP4_KBD_IRQENABLE + 0x0c;
      >>> >> +             keypad_data->reg_offset = 0x10;
      >>> >> +             break;
      >>> >
      >>> > This should be done in probe().
      >>> >
      >>> Dont we then require "pm_runtime_put_sync" in probe, since we are trying
      >>> to read the keypad revision register.?
      >>
      >> Ah, indeed, but I think not pm_runtime_get_sync() but
      >> pm_runtime_set_active().
      >>
      >> Not sure if this will fix the crash...
      >>
      >> --
      >> Dmitry
      >>
      >>
      >> Input: omap-keypad - dynamically handle register offsets
      >>
      >> From: G, Manjunath Kondaiah <manjugk@ti.com>
      >>
      >> Keypad controller register offsets are different for omap4
      >> and omap5. Handle these offsets through static mapping and
      >> assign these mappings during run time.
      >>
      >> Tested on omap4430 sdp with 3.4-rc3.
      >> Tested on omap5430evm with 3.1-custom kernel.
      >>
      >> Signed-off-by: Felipe Balbi <balbi@ti.com>
      >> Signed-off-by: G, Manjunath Kondaiah <manjugk@ti.com>
      >> Signed-off-by: Sourav Poddar <sourav.poddar@ti.com>
      >> Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
      >> ---
      >>
      >>  drivers/input/keyboard/Kconfig        |    4 +
      >>  drivers/input/keyboard/omap4-keypad.c |  117 ++++++++++++++++++++++++++-------
      >>  2 files changed, 94 insertions(+), 27 deletions(-)
      >>
      >>
      >> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
      >> index 20a3753..84ee155 100644
      >> --- a/drivers/input/keyboard/Kconfig
      >> +++ b/drivers/input/keyboard/Kconfig
      >> @@ -531,9 +531,9 @@ config KEYBOARD_OMAP
      >>          module will be called omap-keypad.
      >>
      >>  config KEYBOARD_OMAP4
      >> -       tristate "TI OMAP4 keypad support"
      >> +       tristate "TI OMAP4+ keypad support"
      >>        help
      >> -         Say Y here if you want to use the OMAP4 keypad.
      >> +         Say Y here if you want to use the OMAP4+ keypad.
      >>
      >>          To compile this driver as a module, choose M here: the
      >>          module will be called omap4-keypad.
      >> diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c
      >> index e809ac0..c9fd0df 100644
      >> --- a/drivers/input/keyboard/omap4-keypad.c
      >> +++ b/drivers/input/keyboard/omap4-keypad.c
      >> @@ -68,19 +68,52 @@
      >>
      >>  #define OMAP4_MASK_IRQSTATUSDISABLE    0xFFFF
      >>
      >> +enum {
      >> +       KBD_REVISION_OMAP4 = 0,
      >> +       KBD_REVISION_OMAP5,
      >> +};
      >> +
      >>  struct omap4_keypad {
      >>        struct input_dev *input;
      >>
      >>        void __iomem *base;
      >> -       int irq;
      >> +       unsigned int irq;
      >>
      >>        unsigned int rows;
      >>        unsigned int cols;
      >> +       u32 reg_offset;
      >> +       u32 irqreg_offset;
      >>        unsigned int row_shift;
      >>        unsigned char key_state[8];
      >>        unsigned short keymap[];
      >>  };
      >>
      >> +static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset)
      >> +{
      >> +       return __raw_readl(keypad_data->base +
      >> +                               keypad_data->reg_offset + offset);
      >> +}
      >> +
      >> +static void kbd_writel(struct omap4_keypad *keypad_data, u32 offset, u32 value)
      >> +{
      >> +       __raw_writel(value,
      >> +                    keypad_data->base + keypad_data->reg_offset + offset);
      >> +}
      >> +
      >> +static int kbd_read_irqreg(struct omap4_keypad *keypad_data, u32 offset)
      >> +{
      >> +       return __raw_readl(keypad_data->base +
      >> +                               keypad_data->irqreg_offset + offset);
      >> +}
      >> +
      >> +static void kbd_write_irqreg(struct omap4_keypad *keypad_data,
      >> +                            u32 offset, u32 value)
      >> +{
      >> +       __raw_writel(value,
      >> +                    keypad_data->base + keypad_data->irqreg_offset + offset);
      >> +}
      >> +
      >> +
      >>  /* Interrupt handler */
      >>  static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
      >>  {
      >> @@ -91,12 +124,11 @@ static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
      >>        u32 *new_state = (u32 *) key_state;
      >>
      >>        /* Disable interrupts */
      >> -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      >> -                    keypad_data->base + OMAP4_KBD_IRQENABLE);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      >> +                        OMAP4_VAL_IRQDISABLE);
      >>
      >> -       *new_state = __raw_readl(keypad_data->base + OMAP4_KBD_FULLCODE31_0);
      >> -       *(new_state + 1) = __raw_readl(keypad_data->base
      >> -                                               + OMAP4_KBD_FULLCODE63_32);
      >> +       *new_state = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE31_0);
      >> +       *(new_state + 1) = kbd_readl(keypad_data, OMAP4_KBD_FULLCODE63_32);
      >>
      >>        for (row = 0; row < keypad_data->rows; row++) {
      >>                changed = key_state[row] ^ keypad_data->key_state[row];
      >> @@ -121,12 +153,13 @@ static irqreturn_t omap4_keypad_interrupt(int irq, void *dev_id)
      >>                sizeof(keypad_data->key_state));
      >>
      >>        /* clear pending interrupts */
      >> -       __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
      >> -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      >> +                        kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
      >>
      >>        /* enable interrupts */
      >> -       __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
      >> -                       keypad_data->base + OMAP4_KBD_IRQENABLE);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      >> +               OMAP4_DEF_IRQENABLE_EVENTEN |
      >> +                               OMAP4_DEF_IRQENABLE_LONGKEY);
      >>
      >>        return IRQ_HANDLED;
      >>  }
      >> @@ -139,16 +172,17 @@ static int omap4_keypad_open(struct input_dev *input)
      >>
      >>        disable_irq(keypad_data->irq);
      >>
      >> -       __raw_writel(OMAP4_VAL_FUNCTIONALCFG,
      >> -                       keypad_data->base + OMAP4_KBD_CTRL);
      >> -       __raw_writel(OMAP4_VAL_DEBOUNCINGTIME,
      >> -                       keypad_data->base + OMAP4_KBD_DEBOUNCINGTIME);
      >> -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      >> -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      >> -       __raw_writel(OMAP4_DEF_IRQENABLE_EVENTEN | OMAP4_DEF_IRQENABLE_LONGKEY,
      >> -                       keypad_data->base + OMAP4_KBD_IRQENABLE);
      >> -       __raw_writel(OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA,
      >> -                       keypad_data->base + OMAP4_KBD_WAKEUPENABLE);
      >> +       kbd_writel(keypad_data, OMAP4_KBD_CTRL,
      >> +                       OMAP4_VAL_FUNCTIONALCFG);
      >> +       kbd_writel(keypad_data, OMAP4_KBD_DEBOUNCINGTIME,
      >> +                       OMAP4_VAL_DEBOUNCINGTIME);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      >> +                       OMAP4_VAL_IRQDISABLE);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      >> +                       OMAP4_DEF_IRQENABLE_EVENTEN |
      >> +                               OMAP4_DEF_IRQENABLE_LONGKEY);
      >> +       kbd_writel(keypad_data, OMAP4_KBD_WAKEUPENABLE,
      >> +                       OMAP4_DEF_WUP_EVENT_ENA | OMAP4_DEF_WUP_LONG_KEY_ENA);
      >>
      >>        enable_irq(keypad_data->irq);
      >>
      >> @@ -162,12 +196,12 @@ static void omap4_keypad_close(struct input_dev *input)
      >>        disable_irq(keypad_data->irq);
      >>
      >>        /* Disable interrupts */
      >> -       __raw_writel(OMAP4_VAL_IRQDISABLE,
      >> -                    keypad_data->base + OMAP4_KBD_IRQENABLE);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQENABLE,
      >> +                        OMAP4_VAL_IRQDISABLE);
      >>
      >>        /* clear pending interrupts */
      >> -       __raw_writel(__raw_readl(keypad_data->base + OMAP4_KBD_IRQSTATUS),
      >> -                       keypad_data->base + OMAP4_KBD_IRQSTATUS);
      >> +       kbd_write_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS,
      >> +                        kbd_read_irqreg(keypad_data, OMAP4_KBD_IRQSTATUS));
      >>
      >>        enable_irq(keypad_data->irq);
      >>
      >> @@ -182,6 +216,7 @@ static int __devinit omap4_keypad_probe(struct platform_device *pdev)
      >>        struct resource *res;
      >>        resource_size_t size;
      >>        unsigned int row_shift, max_keys;
      >> +       int rev;
      >>        int irq;
      >>        int error;
      >>
      >> @@ -241,11 +276,40 @@ static int __devinit omap4_keypad_probe(struct platform_device *pdev)
      >>        keypad_data->rows = pdata->rows;
      >>        keypad_data->cols = pdata->cols;
      >>
      >> +       /*
      >> +        * Mark device as active (and wake up its parent) so we can read
      >> +        * revision register.
      >> +        */
      >> +       error = pm_runtime_set_active(&pdev->dev);
      >> +       if (error) {
      >> +               dev_err(&pdev->dev, "pm_runtime_set_active() failed\n");
      >> +               goto err_unmap;
      >> +       }
      >> +
      >> +       rev = __raw_readl(keypad_data->base + OMAP4_KBD_REVISION);
      >> +       rev &= 0x03 << 30;
      >> +       rev >>= 30;
      >> +       switch (rev) {
      >> +       case KBD_REVISION_OMAP4:
      >> +               keypad_data->reg_offset = 0x00;
      >> +               keypad_data->irqreg_offset = 0x00;
      >> +               break;
      >> +       case KBD_REVISION_OMAP5:
      >> +               keypad_data->reg_offset = 0x10;
      >> +               keypad_data->irqreg_offset = 0x0c;
      >> +               break;
      >> +       default:
      >> +               dev_err(&pdev->dev,
      >> +                       "Keypad reports unsupported revision %d", rev);
      >> +               error = -EINVAL;
      >> +               goto err_pm_suspended;
      >> +       }
      >> +
      >>        /* input device allocation */
      >>        keypad_data->input = input_dev = input_allocate_device();
      >>        if (!input_dev) {
      >>                error = -ENOMEM;
      >> -               goto err_unmap;
      >> +               goto err_pm_suspended;
      >>        }
      >>
      >>        input_dev->name = pdev->name;
      >> @@ -281,6 +345,7 @@ static int __devinit omap4_keypad_probe(struct platform_device *pdev)
      >>        }
      >>
      >>        pm_runtime_enable(&pdev->dev);
      >> +       pm_runtime_put_sync(&pdev->dev);
      >>
      >>        error = input_register_device(keypad_data->input);
      >>        if (error < 0) {
      >> @@ -296,6 +361,8 @@ err_pm_disable:
      >>        free_irq(keypad_data->irq, keypad_data);
      >>  err_free_input:
      >>        input_free_device(input_dev);
      >> +err_pm_suspended:
      >> +       pm_runtime_set_suspended(&pdev->dev);
      >>  err_unmap:
      >>        iounmap(keypad_data->base);
      >>  err_release_mem:
      
      From: G, Manjunath Kondaiah <manjugk@ti.com>
      Date: Mon, 10 Oct 2011 20:52:05 +0530
      Subject: [PATCH] Input: omap-keypad: dynamically handle register offsets
      
      Keypad controller register offsets are different for omap4
      and omap5. Handle these offsets through static mapping and
      assign these mappings during run time.
      
      Tested on omap4430 sdp with 3.4-rc3.
      Tested on omap5430evm with 3.1-custom kernel.
      
      Cc: Andrew Morton <akpm@linux-foundation.org>
      Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
      Signed-off-by: default avatarG, Manjunath Kondaiah <manjugk@ti.com>
      Signed-off-by: default avatarSourav Poddar <sourav.poddar@ti.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      f77621cc
    • JJ Ding's avatar
      Input: synaptics - fix compile warning · 1a49a0a0
      JJ Ding authored
      Move synaptics_invert_y() inside CONFIG_MOUSE_PS2_SYNAPTICS to get rid of
      a compile warning when we don't select synaptics support.
      
      drivers/input/mouse/synaptics.c:53:12: warning: ‘synaptics_invert_y’ defined but not used [-Wunused-function]
      Signed-off-by: default avatarJJ Ding <dgdunix@gmail.com>
      Reviewed-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      1a49a0a0
    • Dmitry Torokhov's avatar
      MAINTAINERS: adjust input-related patterns · f4eea7e2
      Dmitry Torokhov authored
      Add pattens for input-related headers to MAINTAINERS file.
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      f4eea7e2
    • Dmitry Torokhov's avatar
      Input: ALPS - switch to using input_mt_report_finger_count · 616575c2
      Dmitry Torokhov authored
      Instead of open-coded reporting number of fingers on the touchpad
      let's use input_mt_report_finger_count() helper.
      Acked-by: default avatarSeth Forshee <seth.forshee@canonical.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      616575c2
    • George Pantalos's avatar
      Input: ALPS - add semi-MT support for v4 protocol · 3b7e09fa
      George Pantalos authored
      This patch adds semi-MT support for ALPS v4 protocol touchpads.
      It is based on the work by Seth Forshee for ALPS v3 and v4 protocol
      support. Three packets are required to assemble and process the MT
      data. ST events are reported at once to avoid latency. If there
      were two contacts or more, report MT data instead of ST events.
      
      Thanks to Seth Forshee for providing most of the code, guidance
      and insight for producing this patch.
      Signed-off-by: default avatarGeorge Pantalos <gpantalos@gmail.com>
      Acked-by: default avatarSeth Forshee <seth.forshee@canonical.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      3b7e09fa
    • Paul Parsons's avatar
      Input: Add Synaptics NavPoint (PXA27x SSP/SPI) driver · ae99ea56
      Paul Parsons authored
      This driver adds support for the Synaptics NavPoint touchpad connected
      to a PXA27x SSP port in SPI slave mode. The device emulates a mouse;
      a tap or tap-and-a-half drag gesture emulates the left mouse button.
      For example, use the xf86-input-evdev driver for an X pointing device.
      Signed-off-by: default avatarPaul Parsons <lost.distance@yahoo.com>
      Tested-by: default avatarPhilipp Zabel <philipp.zabel@gmail.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      ae99ea56
    • Daniel Kurtz's avatar
      Input: atmel_mxt_ts - dump each message on just 1 line · 6ee3dbf9
      Daniel Kurtz authored
      Helps ensure all bytes for a single message together in the system log.
      Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Reviewed-by: default avatarJoonyoung Shim <jy0922.shim@samsung.com>
      Acked-by: default avatarNick Dyer <nick.dyer@itdev.co.uk>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      6ee3dbf9
    • Daniel Kurtz's avatar
      Input: atmel_mxt_ts - do not read extra (checksum) byte · 822115ff
      Daniel Kurtz authored
      atmel_mxt devices will send a checksum byte at the end of a message if
      the MSB of the object address is set.
      However, since this driver does not set this bit, the checksum byte
      isn't actually sent, so don't even try to read it.
      Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      822115ff
    • Daniel Kurtz's avatar
      Input: atmel_mxt_ts - verify object size in mxt_write_object · d1ff320f
      Daniel Kurtz authored
      Don't allow writing past the length of an object.
      Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      d1ff320f
    • Daniel Kurtz's avatar
      Input: atmel_mxt_ts - only allow root to update firmware · 71b3e938
      Daniel Kurtz authored
      Restrict permissions on the update_fw sysfs entry to read only for root
      only.
      
      Also, update object permission to use a macro S_IRUGO macro instead of
      hard coded 0444.
      Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Reviewed-by: default avatarJoonyoung Shim <jy0922.shim@samsung.com>
      Acked-by: default avatarNick Dyer <nick.dyer@itdev.co.uk>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      71b3e938
    • Daniel Kurtz's avatar
      Input: atmel_mxt_ts - use CONFIG_PM_SLEEP · 3a73c816
      Daniel Kurtz authored
      Simple cleanup to use newer PM APIs.
      Signed-off-by: default avatarDaniel Kurtz <djkurtz@chromium.org>
      Reviewed-by: default avatarJoonyoung Shim <jy0922.shim@samsung.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      3a73c816
    • Tai-hwa Liang's avatar
      Input: sentelic - report device's production serial number · d3132c5c
      Tai-hwa Liang authored
      Hardware since Cx supports an unique identity (used to identify OEM vendors
      and released lot number) which is very helpful for diagnostic purpose.
      This revision tries to make it as a part of driver boot up message.
      
      Whilst here, also bumping fsp_drv_ver to acknowledge recent addition of
      absolute coordinates output.
      Signed-off-by: default avatarTai-hwa Liang <avatar@sentelic.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      d3132c5c
    • Peter Ujfalusi's avatar
      Input: tl6040-vibra - Device Tree support · 9ac7b1a3
      Peter Ujfalusi authored
      Enable DT based probing of the vibra driver.
      
      Example of dts section to load the twl6040-vibra driver:
      twl6040: twl6040@4b {
      	...
      	twl6040_vibra: twl6040@1 {
      		compatible = "ti,twl6040-vibra";
      		interrupts = <4>;
      		vddvibl-supply = <&vbat>;
      		vddvibr-supply = <&vbat>;
      		vibldrv_res = <8>;
      		vibrdrv_res = <3>;
      		viblmotor_res = <10>;
      		vibrmotor_res = <10>;
      	};
      };
      
      [Sasha Levin <levinsasha928@gmail.com>: fixed build error]
      Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      9ac7b1a3
  2. 02 May, 2012 7 commits
  3. 30 Apr, 2012 5 commits
  4. 24 Apr, 2012 3 commits
  5. 22 Apr, 2012 2 commits
  6. 21 Apr, 2012 9 commits
    • Linus Torvalds's avatar
      Linux 3.4-rc4 · 66f75a5d
      Linus Torvalds authored
      66f75a5d
    • Yong Zhang's avatar
      sparc32,leon: add notify_cpu_starting() · e9a5ea18
      Yong Zhang authored
      Otherwise cpu_active_mask will not set, which lead to other issue.
      Signed-off-by: default avatarYong Zhang <yong.zhang0@gmail.com>
      Signed-off-by: default avatarKonrad Eisele <konrad@gaisler.com>
      Reviewed-by: default avatarSrivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e9a5ea18
    • Linus Torvalds's avatar
      Merge tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc · 8f4f9d4d
      Linus Torvalds authored
      Pull "ARM: SoC fixes" from Olof Johansson:
       * at91, ux500, imx, omap and bcmring:
        - at91 fixes for =m driver build issues, irqdomain fixes and config
          dependency fixes
        - ux500 kconfig dependency fixes and a  smp wakeup bugfix
        - imx idle bugfix and build fix due to irq domain changes
        - omap uart pinmux fixes, softreset regression revert and misc fixes
        - bcmring build error regression fix
      
       * ux500 and imx had some small defconfig updates in this branch
      
      * tag 'fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (27 commits)
        ARM: bcmring: fix UART declarations
        ARM: imx: Fix imx5 idle logic bug
        ARM: imx27-dt: Fix build due to removal of irq_domain_add_simple()
        ARM: imx_v4_v5_defconfig: Add support for CONFIG_REGULATOR_FIXED_VOLTAGE
        ARM: OMAP1: DMTIMER: fix broken timer clock source selection
        ARM: OMAP: serial: Fix the ocp smart idlemode handling bug
        ARM: OMAP2+: UART: Fix incorrect population of default uart pads
        ARM: OMAP: sram: fix BUG in dpll code for !PM case
        dmaengine: Kconfig: fix Atmel at_hdmac entry
        USB: gadget/at91_udc: add gpio_to_irq() function to vbus interrupt
        USB: ohci-at91: change annotations for probe/remove functions
        leds-atmel-pwm.c: Make pwmled_probe() __devinit
        ARM: at91: fix at91sam9261ek Ethernet dm9000 irq
        ARM: at91: fix rm9200ek flash size
        ARM: at91: remove empty at91_init_serial function
        ARM: at91: fix typo in at91_pmc_base assembly declaration
        ARM: at91: Export at91_matrix_base
        ARM: at91: Export at91_pmc_base
        ARM: at91: Export at91_ramc_base
        ARM: at91: Export at91_st_base
        ...
      8f4f9d4d
    • Linus Torvalds's avatar
      Merge tag 'mmc-fixes-for-3.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc · 126a3483
      Linus Torvalds authored
      Pull MMC fixes from Chris Ball:
       - Build fix for omap_hsmmc with OF against 3.4-rc1.
       - Fix CONFIG_MMC_UNSAFE_RESUME semantics regression against 3.3, which
         broke hotplug card detection when UNSAFE_RESUME is set.
       - Fix a race condition in omap_hsmmc with runtime PM.
       - Fix two libertas SDIO-powered-resume regressions.
       - Small fixes for discard/sanitize, dw_mmc, cd-gpio and esdhc-imx.
      
      * tag 'mmc-fixes-for-3.4-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc:
        mmc: core: Do not pre-claim host in suspend
        mmc: dw_mmc: prevent NULL dereference for dma_ops
        mmc: unbreak sdhci-esdhc-imx on i.MX25
        mmc: cd-gpio: Include header to pickup exported symbol prototypes
        mmc: sdhci: refine non-removable card checking for card detection
        mmc: dw_mmc: Fix switch from DMA to PIO
        mmc: remove MMC bus legacy suspend/resume method
        mmc: omap_hsmmc: Get rid of of_have_populated_dt() usage
        mmc: omap_hsmmc: build fix for CONFIG_OF=y and CONFIG_MMC_OMAP_HS=m
        mmc: fixes for eMMC v4.5 sanitize operation
        mmc: fixes for eMMC v4.5 discard operation
      126a3483
    • Linus Torvalds's avatar
      Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media · 88981596
      Linus Torvalds authored
      Pull media fixes from Mauro Carvalho Chehab:
       - Fixes a regression at DVB core when switching from DVB-S2 to DVB-S on
         Kaffeine (Fedora 16 Bugzilla #812895);
       - Fixes a mutex unlock at an error condition at drx-k;
       - Fix winbond-cir set mode;
       - mt9m032: Fix a compilation breakage with some random Kconfig;
       - mt9m032: fix two dead locks;
       - xc5000: don't require an special firmware (that won't be provided by
         the vendor) just because the xtal frequency is different;
       - V4L DocBook: fix some typos at multi-plane formats description.
      
      * 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
        [media] xc5000: support 32MHz & 31.875MHz xtal using the 41.024.5 firmware
        [media] V4L: mt9m032: fix compilation breakage
        [media] V4L: DocBook: Fix typos in the multi-plane formats description
        [media] V4L: mt9m032: fix two dead-locks
        [media] rc-core: set mode for winbond-cir
        [media] drxk: Does not unlock mutex if sanity check failed in scu_command()
        [media] dvb_frontend: Fix a regression when switching back to DVB-S
      88981596
    • Linus Torvalds's avatar
      Merge tag 'mfd-for-linus-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6 · 9f24ff6f
      Linus Torvalds authored
      Pull MFD fixes from Samuel Ortiz:
       "We have 3 build fixes, a OMAP USB host PHY reset fix and the twl6040
        conversion to an i2c driver.  The latter may not sound like a fix but
        the twl6040 MFD driver won't probe without it, triggering an OMAP4
        audio regression."
      
      * tag 'mfd-for-linus-3.4' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6:
        mfd: Fix modular builds of rc5t583 regulator support
        mfd: Fix asic3_gpio_to_irq
        ARM: OMAP3: USB: Fix the EHCI ULPI PHY reset issue
        mfd: Convert twl6040 to i2c driver, and separate it from twl core
        mfd : Fix dbx500 compilation error
      9f24ff6f
    • Dmitry Torokhov's avatar
      Input: serio_raw - ensure we don't block in non-blocking read · 486c8aba
      Dmitry Torokhov authored
      Avoid calling wait_event_interruptible() if client requested non-blocking
      read, since it is not guaranteed that another thread will not consume
      event after we checked if serio_raw->head != serio_raw->tail.
      
      Also ensure we do not return 0 but keep waiting instead in blocking case,
      when another thread steals "our" byte.
      Reviewed-by: default avatarDavid Herrmann <dh.herrmann@googlemail.com>
      Reviewed-by: default avatarChe-Liang Chiou <clchiou@chromium.org>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      486c8aba
    • Dmitry Torokhov's avatar
      Input: tc3589x-keypad - remove unnecessary checks · 71f3d070
      Dmitry Torokhov authored
      settle_time and debounce_period are u8 and thus can not be greater than
      TC3589x_MAX_DEBOUNCE_SETTLE which is 255.
      
      There also no need to mask out nibbles form board->krow and board->kcol
      as we validate that they are in correct range.
      Reported-by: default avatarWerner <w.landgraf@ru.ru>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      71f3d070
    • Dmitry Torokhov's avatar
      Input: cma3000-d0x - remove unneeded checks · bcad87bd
      Dmitry Torokhov authored
      data->mode is unsigned and can not be less than 0.
      Reported-by: default avatarWerner <w.landgraf@ru.ru>
      Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
      bcad87bd