1. 29 5月, 2014 1 次提交
  2. 15 5月, 2014 1 次提交
  3. 13 5月, 2014 1 次提交
    • A
      Input: fix ps2/serio module dependency · 0a4ac2ea
      Arnd Bergmann 提交于
      The ps2 mouse and keyboard drivers use the "serio" framework that they
      correctly select in Kconfig, and that in turn depends on the i8042 driver,
      which is also allowed to be disabled for architectures that don't have an
      i8042.
      
      However, Kconfig also allows i8042 to be built as a module while
      the serio framework is built-in, which causes this link error:
      
      drivers/built-in.o: In function `ps2_begin_command':
      :(.text+0x26b6cc): undefined reference to `i8042_check_port_owner'
      :(.text+0x26b6d4): undefined reference to `i8042_lock_chip'
      drivers/built-in.o: In function `ps2_end_command':
      :(.text+0x26b734): undefined reference to `i8042_check_port_owner'
      :(.text+0x26b73c): undefined reference to `i8042_unlock_chip'
      
      On x86, a specific 'select SERIO_I8042' takes care of it, but
      not on the other architecture that potentially have a i8042.
      
      This patch changes the Kconfig logic to ensure that whenever
      there is an i8042, it does get used for the serio driver, avoiding
      the link error above.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NDmitry Torokhov <dmitry.torokhov@gmail.com>
      0a4ac2ea
  4. 31 3月, 2014 1 次提交
  5. 28 3月, 2014 1 次提交
  6. 06 12月, 2013 1 次提交
  7. 31 10月, 2013 2 次提交
  8. 13 9月, 2013 1 次提交
  9. 19 6月, 2013 1 次提交
  10. 11 6月, 2013 1 次提交
  11. 05 6月, 2013 1 次提交
  12. 16 4月, 2013 1 次提交
  13. 05 4月, 2013 1 次提交
  14. 16 2月, 2013 1 次提交
  15. 14 2月, 2013 2 次提交
  16. 07 2月, 2013 1 次提交
  17. 25 1月, 2013 1 次提交
  18. 19 1月, 2013 1 次提交
    • J
      tty: Added a CONFIG_TTY option to allow removal of TTY · 4f73bc4d
      Joe Millenbach 提交于
      The option allows you to remove TTY and compile without errors. This
      saves space on systems that won't support TTY interfaces anyway.
      bloat-o-meter output is below.
      
      The bulk of this patch consists of Kconfig changes adding "depends on
      TTY" to various serial devices and similar drivers that require the TTY
      layer.  Ideally, these dependencies would occur on a common intermediate
      symbol such as SERIO, but most drivers "select SERIO" rather than
      "depends on SERIO", and "select" does not respect dependencies.
      
      bloat-o-meter output comparing our previous minimal to new minimal by
      removing TTY.  The list is filtered to not show removed entries with awk
      '$3 != "-"' as the list was very long.
      
      add/remove: 0/226 grow/shrink: 2/14 up/down: 6/-35356 (-35350)
      function                                     old     new   delta
      chr_dev_init                                 166     170      +4
      allow_signal                                  80      82      +2
      static.__warned                              143     142      -1
      disallow_signal                               63      62      -1
      __set_special_pids                            95      94      -1
      unregister_console                           126     121      -5
      start_kernel                                 546     541      -5
      register_console                             593     588      -5
      copy_from_user                                45      40      -5
      sys_setsid                                   128     120      -8
      sys_vhangup                                   32      19     -13
      do_exit                                     1543    1526     -17
      bitmap_zero                                   60      40     -20
      arch_local_irq_save                          137     117     -20
      release_task                                 674     652     -22
      static.spin_unlock_irqrestore                308     260     -48
      Signed-off-by: NJoe Millenbach <jmillenbach@gmail.com>
      Reviewed-by: NJamey Sharp <jamey@minilop.net>
      Reviewed-by: NJosh Triplett <josh@joshtriplett.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4f73bc4d
  19. 17 12月, 2012 1 次提交
  20. 05 11月, 2012 1 次提交
    • L
      ARM: plat-nomadik: move MTU, kill plat-nomadik · 694e33a7
      Linus Walleij 提交于
      This moves the MTU timer driver from arch/arm/plat-nomadik
      to drivers/clocksource and moves the header file to the
      platform_data directory.
      
      As this moves the last file being compiled to an object out
      of arch/arm/plat-nomadik, we have to "turn off the light"
      and delete the plat-nomadik directory, because it is not
      allowed to have an empty Makefile in a plat-* directory.
      This is probably also a desired side effect of depopulating
      the arch/arm directory of drivers. Luckily we have just
      deleted all the <plat/*> include files prior to this so
      by moving the last one we may delete the directory.
      
      After this all the Ux500 and Nomadik device drivers live
      outside of the arch/arm hierarchy.
      
      Cc: Alessandro Rubini <rubini@unipv.it>
      Acked-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      694e33a7
  21. 30 10月, 2012 1 次提交
  22. 25 10月, 2012 1 次提交
  23. 13 9月, 2012 1 次提交
  24. 18 7月, 2012 1 次提交
  25. 11 5月, 2012 2 次提交
    • D
      Input: matrix-keymap - uninline and prepare for device tree support · 1932811f
      Dmitry Torokhov 提交于
      Change matrix-keymap helper to be out-of-line, like sparse keymap,
      allow the helper perform basic keymap validation and return errors,
      and prepare for device tree support.
      Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
      1932811f
    • P
      Input: omap-keypad - dynamically handle register offsets · f77621cc
      Poddar, Sourav 提交于
      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: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NG, Manjunath Kondaiah <manjugk@ti.com>
      Signed-off-by: NSourav Poddar <sourav.poddar@ti.com>
      Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
      f77621cc
  26. 05 4月, 2012 1 次提交
  27. 17 3月, 2012 1 次提交
  28. 14 3月, 2012 1 次提交
  29. 16 11月, 2011 1 次提交
  30. 30 10月, 2011 1 次提交
  31. 19 10月, 2011 1 次提交
    • M
      Input: adp5589-keys - add support for the ADP5585 derivatives · 3f48e735
      Michael Hennerich 提交于
      The ADP5585 family keypad decoder and IO expander is similar to the ADP5589,
      however it features less IO pins, and lacks hardware assisted key-lock
      functionality. Unfortunately the register addresses are different, as well as
      the event codes and bit organization within the port related registers.
      
      Move ADP5589 Register defines from the header file into the main source file.
      Add new defines while making sure we don't break existing platform_data.
      Add register address translation, and turn device specific defines into variables.
      Introduce some helper functions and disable functions that doesn't
      exist on the added devices.
      Signed-off-by: NMichael Hennerich <michael.hennerich@analog.com>
      Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
      3f48e735
  32. 27 5月, 2011 1 次提交
  33. 19 5月, 2011 1 次提交
  34. 12 5月, 2011 1 次提交
  35. 14 3月, 2011 1 次提交
  36. 21 1月, 2011 2 次提交