- 11 5月, 2012 3 次提交
-
-
由 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>
-
由 Jean-François Dagenais 提交于
Signed-off-by: NJean-François Dagenais <jeff.dagenais@gmail.com> Acked-by: NMichael Hennerich <michael.hennerich@analog.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 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>
-
- 24 4月, 2012 1 次提交
-
-
由 Jesper Juhl 提交于
I believe that "trying to access hardware" is more correct English than "trying access hardware". Signed-off-by: NJesper Juhl <jj@chaosbits.net> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 21 4月, 2012 4 次提交
-
-
由 Dmitry Torokhov 提交于
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: NWerner <w.landgraf@ru.ru> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
Instead of allocating and managing keymap separately from the keypad structure stick it at the end as a variable-length array. Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
SIMPLE_DEV_PM_OPS already defines constant dev_pm_ops. Also guard PM methods with CONFIG_PM_SLEEP and get rid of some unneeded #ifdefs. Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 11 4月, 2012 1 次提交
-
-
由 Dmitry Torokhov 提交于
Also use CONFIG_PM_SLEEP instead of CONFIG_PM to guard PM methods. Acked-by: NH Hartley Sweeten <hsweeten@visionengravers.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 05 4月, 2012 2 次提交
-
-
由 Axel Lin 提交于
This patch converts the drivers in drivers/input/* to use module_serio_driver() macro which makes the code smaller and a bit simpler. Signed-off-by: NAxel Lin <axel.lin@gmail.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Wolfram Sang 提交于
This driver adds support for the keypad part of the LM8333 and is prepared for possible GPIO/PWM drivers. Note that this is not a MFD because you cannot disable the keypad functionality which, thus, has to be handled by the core anyhow. Signed-off-by: NWolfram Sang <w.sang@pengutronix.de> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 27 3月, 2012 1 次提交
-
-
由 Viresh Kumar 提交于
Following commit broke DT support for tegra-kbc by removing pdata allocation completely: commit 023cea0e Author: Shridhar Rasal <srasal@nvidia.com> Date: Fri Feb 3 00:27:30 2012 -0800 Input: tegra-kbc - allow skipping setting up some of GPIO pins This patch restores it. Signed-off-by: NViresh Kumar <viresh.kumar@st.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 26 3月, 2012 1 次提交
-
-
由 Rob Herring 提交于
In preparation for sa11x0 sparse irq conversion, explicitly include mach/irqs.h as it will not be included for sparse irq. Signed-off-by: NRob Herring <rob.herring@calxeda.com> Signed-off-by: NRussell King <rmk+kernel@arm.linux.org.uk>
-
- 20 3月, 2012 4 次提交
-
-
由 Laxman Dewangan 提交于
Some of buttons, like power-on key or onkey, may only generate interrupts when pressed and not actually be mapped as gpio in the system. Allow setting gpio to invalid value and specify IRQ instead to support such keys. The debounce timer is used not to debounce but to ignore new IRQs coming while button is kept pressed. Signed-off-by: NLaxman Dewangan <ldewangan@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 David Jander 提交于
request_any_context_irq() should handle the case when using GPIO expanders that themselves use threaded IRQs, and so the premise of change 7e2ecdf4 is incorrect. Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
The platform data should not be altered and therefore should be accessed through const pointers. Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 17 3月, 2012 2 次提交
-
-
由 Axel Lin 提交于
This patch converts the drivers in drivers/input/* to use the module_i2c_driver() macro which makes the code smaller and a bit simpler. Signed-off-by: NAxel Lin <axel.lin@gmail.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Felipe Balbi 提交于
This patch allows us to drop the OMAP dependency from the OMAP4 keypad driver. Signed-off-by: NFelipe Balbi <balbi@ti.com> Signed-off-by: NSourav Poddar <sourav.poddar@ti.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 14 3月, 2012 2 次提交
-
-
由 Olof Johansson 提交于
This is an incremental patch updating to the revised bindings for matrix keyboards. This includes an optional "linux,fn-keymap" binding that is not yet implemented, that will be used to specify the Fn-key modifier layout if needed. Signed-off-by: NOlof Johansson <olof@lixom.net> Acked-by: NGrant Likely <grant.likely@secretlab.ca> Acked-by: NStephen Warren <swarren@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Olof Johansson 提交于
This adds a simple device tree binding for simple key matrix data and a helper to fill in the platform data. Signed-off-by: NOlof Johansson <olof@lixom.net> Acked-by: NStephen Warren <swarren@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 28 2月, 2012 2 次提交
-
-
由 Viresh Kumar 提交于
Thaw and poweroff routines are missing for spear-keyboard. They are required for: - Error case scenarios during freeze - Using test features, of hibernate. Signed-off-by: NViresh Kumar <viresh.kumar@st.com> Signed-off-by: NRajeev Kumar <rajeev-dlh.kumar@st.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Rajeev Kumar 提交于
Let platform pass mode information to keyboard driver according to which it configures itself. The mode can be - KEYPAD_9x9 0 - KEYPAD_6x6 1 - KEYPAD_2x2 2 Signed-off-by: NRajeev Kumar <rajeev-dlh.kumar@st.com> Signed-off-by: NViresh Kumar <viresh.kumar@st.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 03 2月, 2012 1 次提交
-
-
由 Shridhar Rasal 提交于
Allow marking some of GPIO pins as ignored to to avoid continuously generating KBC input events. Signed-off-by: NShridhar Rasal <srasal@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 02 2月, 2012 1 次提交
-
-
由 Felipe Contreras 提交于
And trivial whitespace fixes. Signed-off-by: NFelipe Contreras <felipe.contreras@gmail.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 23 1月, 2012 4 次提交
-
-
由 Rakesh Iyer 提交于
Enable keypress interrupt to support wakeup from low power state. Signed-off-by: NRakesh Iyer <riyer@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Mark Brown 提交于
We don't actually care if the device has been runtime suspended immediately so we can just drop the reference without waiting for any state change to be implemented. This may allow us to avoid some suspend/resume cycles and is a bit more friendly to the rest of the system. Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
Also proper guard for system suspend/resume methods is CONFIG_PM_SLEEP, not CONFIG_PM. Acked-by: NLinus Walleij <linus.walleij@linaro.org> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Dmitry Torokhov 提交于
Because we are using platform_device_probe() to register the driver we do not need to assign driver's probe method. We also can mark ske_keypad_probe(), together with ske_keypad_chip_init(), as __init instead of __devinit. Acked-by: NLinus Walleij <linus.walleij@linaro.org> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 11 1月, 2012 1 次提交
-
-
由 Dmitry Torokhov 提交于
Recent conversion to module_platform_driver() went a bit too far and converted not only drivers that used platform_driver_register() but also ones using platform_driver_probe(), breaking them in process. Reported-by: NGeert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 05 1月, 2012 1 次提交
-
-
由 Naga Radhesh 提交于
This adds two missing kerneldoc entries for the TC3589x keypad driver. Signed-off-by: NNaga Radhesh <naga.radheshy@stericsson.com> Reviewed-by: NSrinidhi Kasagar <srinidhi.kasagar@stericsson.com> Signed-off-by: NLinus Walleij <linus.walleij@linaro.org> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 30 12月, 2011 3 次提交
-
-
由 Mark Brown 提交于
When runtime power management is enabled put the Samsung keypad driver into suspend mode with wakeups disabled whenever the device is open but a key is not actually been pressed. As well as saving a trivial amount of power this will support the use of SoC wide idle modes which put the entire device into a retention mode and use explicit wakeup sources to exit. Since not all of the interrupt controllers used with the driver support set_irq_wake() (though they all do the right thing) and there's a nasty WARN() when we disable wake after failing to enable it keep track of the current wake status from runtime PM and only disable wake if we managed to enable it; I'm not entirely sure why this doesn't affect the existing uses of the API in the driver. System suspend is unaffected as the driver core will runtime resume any suspended devices prior to system suspend. Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru> Conflicts: drivers/input/keyboard/samsung-keypad.c
-
由 Rakesh Iyer 提交于
Tegra kbc cannot detect exact keypress causing wakeup in interrupt mode. Allow wakeup keypress to be reported for certain platforms. Signed-off-by: NRakesh Iyer <riyer@nvidia.com> Acked-by: NStephen Warren <swarren@nvidia.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
由 Olof Johansson 提交于
This adds a simple device tree binding to the tegra keyboard controller. Also, mark the default keymap as __devinitdata since it is not referenced after boot. Signed-off-by: NOlof Johansson <olof@lixom.net> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 23 12月, 2011 1 次提交
-
-
由 Thomas Abraham 提交于
Add device tree based discovery support for Samsung's keypad controller. Cc: Joonyoung Shim <jy0922.shim@samsung.com> Cc: Donghwa Lee <dh09.lee@samsung.com> Signed-off-by: NThomas Abraham <thomas.abraham@linaro.org> Acked-by: NGrant Likely <grant.likely@secretlab.ca> Signed-off-by: NKukjin Kim <kgene.kim@samsung.com>
-
- 12 12月, 2011 1 次提交
-
-
由 Axel Lin 提交于
These symbols are not used outside it's driver so no need to make the symbol global. Signed-off-by: NAxel Lin <axel.lin@gmail.com> Acked-by: NMichael Hennerich <michael.hennerich@analog.com> Acked-by: NLinus Walleij <linus.walleij@linaro.org> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 01 12月, 2011 1 次提交
-
-
由 JJ Ding 提交于
Commit 940ab889 introduced a new macro to save some platform_driver boilerplate code. Use it. Signed-off-by: NJJ Ding <dgdunix@gmail.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 29 11月, 2011 1 次提交
-
-
由 Axel Lin 提交于
MODULE_DEVICE_TABLE will setup the module alias for us, thus adding MODULE_ALIAS for an entry already in MODULE_DEVICE_TABLE is redundant. Signed-off-by: NAxel Lin <axel.lin@gmail.com> Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 16 11月, 2011 1 次提交
-
-
由 Dmitry Torokhov 提交于
There is nothing in keypad platform definitions that requires the driver be complied on Samsung platform only, so let's move them out of the platform subdirectory and relax the dependencies. Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-
- 10 11月, 2011 1 次提交
-
-
由 Dmitry Torokhov 提交于
Signed-off-by: NDmitry Torokhov <dtor@mail.ru>
-