Message ID | CAGsJ_4z-CZShfCQ2JNgOKX1dtfGksX+Naj++4tugPCriiY=ESg@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Barry, On Wed, May 20, 2015 at 06:02:36PM +0800, Barry Song wrote: > sometimes we press a key to boot, and the boot stage need to get this > event. > the current codes use edge trigger, so we have no chance to report > the cold-touch event. > but our user sceneries like Linux navigator does need it. Input events that come before input device is opened (either by userspace or by a kernel consumer) are ignored by input core and we already call gpio_keys_report_state() from gpio_keys_open() so I do not think this patch has any effect. Thanks. > > Signed-off-by: Barry Song <Baohua.Song@csr.com> > --- > -RFC: for the moment, only an idea > > drivers/input/keyboard/gpio_keys.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/drivers/input/keyboard/gpio_keys.c > b/drivers/input/keyboard/gpio_keys.c > index ddf4045..77fe0dd 100644 > --- a/drivers/input/keyboard/gpio_keys.c > +++ b/drivers/input/keyboard/gpio_keys.c > @@ -766,6 +766,19 @@ static int gpio_keys_probe(struct platform_device *pdev) > > device_init_wakeup(&pdev->dev, wakeup); > > + /* if the key is pressed while system boot, force an interrupt */ > + for (i = 0; i < pdata->nbuttons; i++) { > + const struct gpio_keys_button *button = &pdata->buttons[i]; > + struct gpio_button_data *bdata = &ddata->data[i]; > + int state; > + > + if (gpio_is_valid(button->gpio)) { > + state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ > button->active_low; > + if (state) > + gpio_keys_gpio_isr(bdata->irq, bdata); > + } > + } > + > return 0; > > err_remove_group: > -- > 1.9.1
2015-05-21 0:37 GMT+08:00 Dmitry Torokhov <dmitry.torokhov@gmail.com>: > Hi Barry, > > On Wed, May 20, 2015 at 06:02:36PM +0800, Barry Song wrote: >> sometimes we press a key to boot, and the boot stage need to get this >> event. >> the current codes use edge trigger, so we have no chance to report >> the cold-touch event. >> but our user sceneries like Linux navigator does need it. > > Input events that come before input device is opened (either by > userspace or by a kernel consumer) are ignored by input core and we > already call gpio_keys_report_state() from gpio_keys_open() so I do not > think this patch has any effect. Dmitry, you are right. i missed gpio_keys_open() has done that once it is opened. 556 static int gpio_keys_open(struct input_dev *input) 557 { 558 struct gpio_keys_drvdata *ddata = input_get_drvdata(input); 559 const struct gpio_keys_platform_data *pdata = ddata->pdata; 560 int error; 561 562 if (pdata->enable) { 563 error = pdata->enable(input->dev.parent); 564 if (error) 565 return error; 566 } 567 568 /* Report current state of buttons that are connected to GPIOs */ 569 gpio_keys_report_state(ddata); 570 571 return 0; 572 } > > Thanks. > >> >> Signed-off-by: Barry Song <Baohua.Song@csr.com> >> --- >> -RFC: for the moment, only an idea >> >> drivers/input/keyboard/gpio_keys.c | 13 +++++++++++++ >> 1 file changed, 13 insertions(+) >> >> diff --git a/drivers/input/keyboard/gpio_keys.c >> b/drivers/input/keyboard/gpio_keys.c >> index ddf4045..77fe0dd 100644 >> --- a/drivers/input/keyboard/gpio_keys.c >> +++ b/drivers/input/keyboard/gpio_keys.c >> @@ -766,6 +766,19 @@ static int gpio_keys_probe(struct platform_device *pdev) >> >> device_init_wakeup(&pdev->dev, wakeup); >> >> + /* if the key is pressed while system boot, force an interrupt */ >> + for (i = 0; i < pdata->nbuttons; i++) { >> + const struct gpio_keys_button *button = &pdata->buttons[i]; >> + struct gpio_button_data *bdata = &ddata->data[i]; >> + int state; >> + >> + if (gpio_is_valid(button->gpio)) { >> + state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ >> button->active_low; >> + if (state) >> + gpio_keys_gpio_isr(bdata->irq, bdata); >> + } >> + } >> + >> return 0; >> >> err_remove_group: >> -- >> 1.9.1 > > -- > Dmitry -barry -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index ddf4045..77fe0dd 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -766,6 +766,19 @@ static int gpio_keys_probe(struct platform_device *pdev) device_init_wakeup(&pdev->dev, wakeup); + /* if the key is pressed while system boot, force an interrupt */ + for (i = 0; i < pdata->nbuttons; i++) { + const struct gpio_keys_button *button = &pdata->buttons[i]; + struct gpio_button_data *bdata = &ddata->data[i]; + int state; + + if (gpio_is_valid(button->gpio)) { + state = (gpio_get_value_cansleep(button->gpio) ? 1 : 0) ^ button->active_low; + if (state) + gpio_keys_gpio_isr(bdata->irq, bdata); + } + } + return 0;
sometimes we press a key to boot, and the boot stage need to get this event. the current codes use edge trigger, so we have no chance to report the cold-touch event. but our user sceneries like Linux navigator does need it. Signed-off-by: Barry Song <Baohua.Song@csr.com> --- -RFC: for the moment, only an idea drivers/input/keyboard/gpio_keys.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) err_remove_group: