diff mbox series

[v2] input: add 2 kind of switch

Message ID 20201029132747epcms1p8fae559dff47bf0eebdcc9f94efd9a1bf@epcms1p8
State New
Headers show
Series [v2] input: add 2 kind of switch | expand

Commit Message

HyungJae Im Oct. 29, 2020, 1:27 p.m. UTC
From: "hj2.im" <hj2.im@samsung.com>
Date: Thu, 29 Oct 2020 22:11:24 +0900
Subject: [PATCH v2] input: add 2 kind of switch

We need support to various accessories on the device,
some switch does not exist in switch list.
So added switch for the following purpose.

SW_COVER_ATTACHED is for the checking the cover
attached or not on the device. SW_EXT_PEN_ATTACHED is for the
checking the external pen attached or not on the device

Signed-off-by: Hyungjae Im <hj2.im@samsung.com>
---
 drivers/input/Kconfig                  |  20 ++
 drivers/input/Makefile                 |   3 +
 drivers/input/cover_detect.c           | 242 ++++++++++++++++++++++++
 drivers/input/ext_pen_detect.c         | 243 +++++++++++++++++++++++++
 include/linux/mod_devicetable.h        |   2 +-
 include/uapi/linux/input-event-codes.h |   4 +-
 6 files changed, 512 insertions(+), 2 deletions(-)
 create mode 100644 drivers/input/cover_detect.c
 create mode 100644 drivers/input/ext_pen_detect.c

Comments

Barnabás Pőcze Oct. 29, 2020, 1:41 p.m. UTC | #1
Hi

> [...]
> diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
> index 5b08a473cdba..897f5a3e7721 100644
> --- a/include/linux/mod_devicetable.h
> +++ b/include/linux/mod_devicetable.h
> @@ -320,7 +320,7 @@ struct pcmcia_device_id {
>  #define INPUT_DEVICE_ID_LED_MAX		0x0f
>  #define INPUT_DEVICE_ID_SND_MAX		0x07
>  #define INPUT_DEVICE_ID_FF_MAX		0x7f
> -#define INPUT_DEVICE_ID_SW_MAX		0x10
> +#define INPUT_DEVICE_ID_SW_MAX		0x12
>  #define INPUT_DEVICE_ID_PROP_MAX	0x1f
>
>  #define INPUT_DEVICE_ID_MATCH_BUS	1
> diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
> index 0c2e27d28e0a..8ca2acee1f92 100644
> --- a/include/uapi/linux/input-event-codes.h
> +++ b/include/uapi/linux/input-event-codes.h
> @@ -889,7 +889,9 @@
>  #define SW_MUTE_DEVICE		0x0e  /* set = device disabled */
>  #define SW_PEN_INSERTED		0x0f  /* set = pen inserted */
>  #define SW_MACHINE_COVER	0x10  /* set = cover closed */
> -#define SW_MAX			0x10
> +#define SW_COVER_ATTACHED	0x11  /* set = cover attached */
> +#define SW_EXT_PEN_ATTACHED	0x12  /* set = external pen attached */
> +#define SW_MAX			0x12
>  #define SW_CNT			(SW_MAX+1)
> [...]

This part of the patch conflicts with another one:
https://lore.kernel.org/linux-input/20201026144512.621479-1-markpearson@lenovo.com/


Regards,
Barnabás Pőcze
Greg KH Oct. 29, 2020, 1:54 p.m. UTC | #2
On Thu, Oct 29, 2020 at 01:41:57PM +0000, Barnabás Pőcze wrote:
> Hi
> 
> > [...]
> > diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
> > index 5b08a473cdba..897f5a3e7721 100644
> > --- a/include/linux/mod_devicetable.h
> > +++ b/include/linux/mod_devicetable.h
> > @@ -320,7 +320,7 @@ struct pcmcia_device_id {
> >  #define INPUT_DEVICE_ID_LED_MAX		0x0f
> >  #define INPUT_DEVICE_ID_SND_MAX		0x07
> >  #define INPUT_DEVICE_ID_FF_MAX		0x7f
> > -#define INPUT_DEVICE_ID_SW_MAX		0x10
> > +#define INPUT_DEVICE_ID_SW_MAX		0x12
> >  #define INPUT_DEVICE_ID_PROP_MAX	0x1f
> >
> >  #define INPUT_DEVICE_ID_MATCH_BUS	1
> > diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
> > index 0c2e27d28e0a..8ca2acee1f92 100644
> > --- a/include/uapi/linux/input-event-codes.h
> > +++ b/include/uapi/linux/input-event-codes.h
> > @@ -889,7 +889,9 @@
> >  #define SW_MUTE_DEVICE		0x0e  /* set = device disabled */
> >  #define SW_PEN_INSERTED		0x0f  /* set = pen inserted */
> >  #define SW_MACHINE_COVER	0x10  /* set = cover closed */
> > -#define SW_MAX			0x10
> > +#define SW_COVER_ATTACHED	0x11  /* set = cover attached */
> > +#define SW_EXT_PEN_ATTACHED	0x12  /* set = external pen attached */
> > +#define SW_MAX			0x12
> >  #define SW_CNT			(SW_MAX+1)
> > [...]
> 
> This part of the patch conflicts with another one:
> https://lore.kernel.org/linux-input/20201026144512.621479-1-markpearson@lenovo.com/

Is that merged?  If not, it's fine as-is until then, and someone has to
pick to go first :)

But, most importantly, the questions asked last time about this patch
have not been addressed at all :(

thanks,

greg k-h
Greg KH Oct. 29, 2020, 1:57 p.m. UTC | #3
On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> From: "hj2.im" <hj2.im@samsung.com>
> Date: Thu, 29 Oct 2020 22:11:24 +0900
> Subject: [PATCH v2] input: add 2 kind of switch

Why is this in the body of that patch?

> 
> We need support to various accessories on the device,
> some switch does not exist in switch list.
> So added switch for the following purpose.
> 
> SW_COVER_ATTACHED is for the checking the cover
> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> checking the external pen attached or not on the device

You didn't answer the previous question as to why the existing values do
not work for you instead of having to create new ones?


> 
> Signed-off-by: Hyungjae Im <hj2.im@samsung.com>
> ---
>  drivers/input/Kconfig                  |  20 ++
>  drivers/input/Makefile                 |   3 +
>  drivers/input/cover_detect.c           | 242 ++++++++++++++++++++++++
>  drivers/input/ext_pen_detect.c         | 243 +++++++++++++++++++++++++
>  include/linux/mod_devicetable.h        |   2 +-
>  include/uapi/linux/input-event-codes.h |   4 +-
>  6 files changed, 512 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/input/cover_detect.c
>  create mode 100644 drivers/input/ext_pen_detect.c

If this is v2, what changed from v1?

And this is 2 different drivers, it should be 2 different patches at the
least, right?>

> 
> diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
> index 1efd3154b68d..df902f4a549e 100644
> --- a/drivers/input/Kconfig
> +++ b/drivers/input/Kconfig
> @@ -185,6 +185,26 @@ config INPUT_APMPOWER
>  	  To compile this driver as a module, choose M here: the
>  	  module will be called apm-power.
>  
> +config COVER_DETECT

INPUT_COVER_DETECT?

> +	tristate "Enable cover attach detection"
> +	default n

"default n" is always the default, no need for this here.

> +	help
> +	  Say Y here to enable cover attach detection
> +	  and send a event when cover is attached/detached.
> +	  Active gpio state is low and active event value is 0.
> +
> +	  If unsure, say N.

What is the module name?

> +
> +config EXT_PEN_DETECT

INPUT_EXT_PEN_DETECT?

> +	tristate "Enable external pen attach detection"
> +	default n

No default n.

> +	help
> +	  Say Y here to enable external pen attach detection
> +	  and send a event when external pen is attached/detached.
> +	  Active gpio state is low and active event value is 0.
> +
> +	  If unsure, say N.

What is the module name?

> +
>  comment "Input Device Drivers"
>  
>  source "drivers/input/keyboard/Kconfig"
> diff --git a/drivers/input/Makefile b/drivers/input/Makefile
> index e35650930371..31ee1f2d2e21 100644
> --- a/drivers/input/Makefile
> +++ b/drivers/input/Makefile
> @@ -29,3 +29,6 @@ obj-$(CONFIG_INPUT_MISC)	+= misc/
>  obj-$(CONFIG_INPUT_APMPOWER)	+= apm-power.o
>  
>  obj-$(CONFIG_RMI4_CORE)		+= rmi4/
> +
> +obj-$(CONFIG_COVER_DETECT)	+= cover_detect.o
> +obj-$(CONFIG_EXT_PEN_DETECT)	+= ext_pen_detect.o
> diff --git a/drivers/input/cover_detect.c b/drivers/input/cover_detect.c
> new file mode 100644
> index 000000000000..4d3d68c616ec
> --- /dev/null
> +++ b/drivers/input/cover_detect.c
> @@ -0,0 +1,242 @@
> +/*
> + * Copyright (C) 2015 Samsung Electronics Co. Ltd. All Rights Reserved.

Please use a SPDX line, and no need for this:

> + *
> + * This software is licensed under the terms of the GNU General Public
> + * License version 2, as published by the Free Software Foundation, and
> + * may be copied, distributed, and modified under those terms.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.

That can be removed.

Also your copyright line is wrong, unless you really have not touched
this file in 5 years.

Same comments on the other file.

thanks,

greg k-h
Barnabás Pőcze Oct. 29, 2020, 2:36 p.m. UTC | #4
Hi

> [...]
> > > diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
> > > index 5b08a473cdba..897f5a3e7721 100644
> > > --- a/include/linux/mod_devicetable.h
> > > +++ b/include/linux/mod_devicetable.h
> > > @@ -320,7 +320,7 @@ struct pcmcia_device_id {
> > >  #define INPUT_DEVICE_ID_LED_MAX		0x0f
> > >  #define INPUT_DEVICE_ID_SND_MAX		0x07
> > >  #define INPUT_DEVICE_ID_FF_MAX		0x7f
> > > -#define INPUT_DEVICE_ID_SW_MAX		0x10
> > > +#define INPUT_DEVICE_ID_SW_MAX		0x12
> > >  #define INPUT_DEVICE_ID_PROP_MAX	0x1f
> > >
> > >  #define INPUT_DEVICE_ID_MATCH_BUS	1
> > > diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
> > > index 0c2e27d28e0a..8ca2acee1f92 100644
> > > --- a/include/uapi/linux/input-event-codes.h
> > > +++ b/include/uapi/linux/input-event-codes.h
> > > @@ -889,7 +889,9 @@
> > >  #define SW_MUTE_DEVICE		0x0e  /* set = device disabled */
> > >  #define SW_PEN_INSERTED		0x0f  /* set = pen inserted */
> > >  #define SW_MACHINE_COVER	0x10  /* set = cover closed */
> > > -#define SW_MAX			0x10
> > > +#define SW_COVER_ATTACHED	0x11  /* set = cover attached */
> > > +#define SW_EXT_PEN_ATTACHED	0x12  /* set = external pen attached */
> > > +#define SW_MAX			0x12
> > >  #define SW_CNT			(SW_MAX+1)
> > > [...]
> >
> > This part of the patch conflicts with another one:
> > https://lore.kernel.org/linux-input/20201026144512.621479-1-markpearson@lenovo.com/
>
> Is that merged?  If not, it's fine as-is until then, and someone has to
> pick to go first :)

It is not, to my knowledge. Nonetheless I figured the information may be relevant.


Regards,
Barnabás Pőcze
Dmitry Torokhov Oct. 29, 2020, 5:45 p.m. UTC | #5
On Thu, Oct 29, 2020 at 02:57:15PM +0100, gregkh@linuxfoundation.org wrote:
> On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> > From: "hj2.im" <hj2.im@samsung.com>
> > Date: Thu, 29 Oct 2020 22:11:24 +0900
> > Subject: [PATCH v2] input: add 2 kind of switch
> 
> Why is this in the body of that patch?
> 
> > 
> > We need support to various accessories on the device,
> > some switch does not exist in switch list.
> > So added switch for the following purpose.
> > 
> > SW_COVER_ATTACHED is for the checking the cover
> > attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> > checking the external pen attached or not on the device
> 
> You didn't answer the previous question as to why the existing values do
> not work for you instead of having to create new ones?
> 
> 
> > 
> > Signed-off-by: Hyungjae Im <hj2.im@samsung.com>
> > ---
> >  drivers/input/Kconfig                  |  20 ++
> >  drivers/input/Makefile                 |   3 +
> >  drivers/input/cover_detect.c           | 242 ++++++++++++++++++++++++
> >  drivers/input/ext_pen_detect.c         | 243 +++++++++++++++++++++++++
> >  include/linux/mod_devicetable.h        |   2 +-
> >  include/uapi/linux/input-event-codes.h |   4 +-
> >  6 files changed, 512 insertions(+), 2 deletions(-)
> >  create mode 100644 drivers/input/cover_detect.c
> >  create mode 100644 drivers/input/ext_pen_detect.c
> 
> If this is v2, what changed from v1?
> 
> And this is 2 different drivers, it should be 2 different patches at the
> least, right?>

Actually the should simply use gpio-keys.c for this and dispense with
the custom drivers.

Thanks.
HyungJae Im Oct. 30, 2020, 4:39 a.m. UTC | #6
Hello, This is Hyungjae Im from Samsung Electronics.
Let me answer your questions inline.

>On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
>> From: "hj2.im" <hj2.im@samsung.com>
>> Date: Thu, 29 Oct 2020 22:11:24 +0900
>> Subject: [PATCH v2] input: add 2 kind of switch

>Why is this in the body of that patch?

I read "how to send your first kernel patch", but still making so many mistakes.
I will be cautious with this.
 
>> 
>> We need support to various accessories on the device,
>> some switch does not exist in switch list.
>> So added switch for the following purpose.
>> 
>> SW_COVER_ATTACHED is for the checking the cover
>> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
>> checking the external pen attached or not on the device

>You didn't answer the previous question as to why the existing values do
>not work for you instead of having to create new ones?

 I think I should clarify this part the most for this review.
 As you know, new added events both has similar existing events,
 but it has to operate separately.

 First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
 We need two events for our cover interaction.
 One is to detect if flip cover is open/closed(covers screen or not),
 and one is for detecting if cover is attached(detect if device is put into cover).
 With the second event, we send event for attachment and start authentication
 distinguishing if it was Samsung made cover.

 Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
 It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
 SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
 while pen is attached/detached.

 
>> 
>> Signed-off-by: Hyungjae Im <hj2.im@samsung.com>
>> ---
>>  drivers/input/Kconfig                  |  20 ++
>>  drivers/input/Makefile                 |   3 +
>>  drivers/input/cover_detect.c           | 242 ++++++++++++++++++++++++
>>  drivers/input/ext_pen_detect.c         | 243 +++++++++++++++++++++++++
>>  include/linux/mod_devicetable.h        |   2 +-
>>  include/uapi/linux/input-event-codes.h |   4 +-
>>  6 files changed, 512 insertions(+), 2 deletions(-)
>>  create mode 100644 drivers/input/cover_detect.c
>>  create mode 100644 drivers/input/ext_pen_detect.c
 
>If this is v2, what changed from v1?

>And this is 2 different drivers, it should be 2 different patches at the
>least, right?>

V2 has additional submit for drivers using SW events.
I will separate these two drivers and submit it separately.
 
>> 
>> diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
>> index 1efd3154b68d..df902f4a549e 100644
>> --- a/drivers/input/Kconfig
>> +++ b/drivers/input/Kconfig
>> @@ -185,6 +185,26 @@ config INPUT_APMPOWER
>>            To compile this driver as a module, choose M here: the
>>            module will be called apm-power.
>>  
>> +config COVER_DETECT
 
>INPUT_COVER_DETECT?

 Will change feature name to INPUT_COVER_DETECT.
 
>> +        tristate "Enable cover attach detection"
>> +        default n
 
>"default n" is always the default, no need for this here.

 Thanks for comment. I will erase it.
 
>> +        help
>> +          Say Y here to enable cover attach detection
>> +          and send a event when cover is attached/detached.
>> +          Active gpio state is low and active event value is 0.
>> +
>> +          If unsure, say N.
 
>What is the module name?

 I will add additional explanation for module name
 
>> +
>> +config EXT_PEN_DETECT
 
>INPUT_EXT_PEN_DETECT?
 
> +        tristate "Enable external pen attach detection"
> +        default n
 
>No default n.
 
>> +        help
>> +          Say Y here to enable external pen attach detection
>> +          and send a event when external pen is attached/detached.
>> +          Active gpio state is low and active event value is 0.
>> +
>> +          If unsure, say N.
 
>What is the module name?
 
>> +
>>  comment "Input Device Drivers"
>>  
>>  source "drivers/input/keyboard/Kconfig"
>> diff --git a/drivers/input/Makefile b/drivers/input/Makefile
>> index e35650930371..31ee1f2d2e21 100644
>> --- a/drivers/input/Makefile
>> +++ b/drivers/input/Makefile
>> @@ -29,3 +29,6 @@ obj-$(CONFIG_INPUT_MISC)        += misc/
>>  obj-$(CONFIG_INPUT_APMPOWER)        += apm-power.o
>>  
>>  obj-$(CONFIG_RMI4_CORE)                += rmi4/
>> +
>> +obj-$(CONFIG_COVER_DETECT)        += cover_detect.o
>> +obj-$(CONFIG_EXT_PEN_DETECT)        += ext_pen_detect.o
>> diff --git a/drivers/input/cover_detect.c b/drivers/input/cover_detect.c
>> new file mode 100644
>> index 000000000000..4d3d68c616ec
>> --- /dev/null
>> +++ b/drivers/input/cover_detect.c
>> @@ -0,0 +1,242 @@
>> +/*
>> + * Copyright (C) 2015 Samsung Electronics Co. Ltd. All Rights Reserved.
 
>Please use a SPDX line, and no need for this:
 
>> + *
>> + * This software is licensed under the terms of the GNU General Public
>> + * License version 2, as published by the Free Software Foundation, and
>> + * may be copied, distributed, and modified under those terms.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
 
>That can be removed.
 
>Also your copyright line is wrong, unless you really have not touched
>this file in 5 years.
 
>Same comments on the other file.
 
>thanks,
 
>greg k-h
 
 I will change it. Thanks

best regard,
HJ
Greg KH Oct. 30, 2020, 10:46 a.m. UTC | #7
On Fri, Oct 30, 2020 at 01:39:16PM +0900, HyungJae Im wrote:
> Hello, This is Hyungjae Im from Samsung Electronics.
> Let me answer your questions inline.
> 
> >On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> >> From: "hj2.im" <hj2.im@samsung.com>
> >> Date: Thu, 29 Oct 2020 22:11:24 +0900
> >> Subject: [PATCH v2] input: add 2 kind of switch
> > 
> >Why is this in the body of that patch?
> 
> I read "how to send your first kernel patch", but still making so many mistakes.
> I will be cautious with this.
>  
> >> 
> >> We need support to various accessories on the device,
> >> some switch does not exist in switch list.
> >> So added switch for the following purpose.
> >> 
> >> SW_COVER_ATTACHED is for the checking the cover
> >> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> >> checking the external pen attached or not on the device
> > 
> >You didn't answer the previous question as to why the existing values do
> >not work for you instead of having to create new ones?
> 
>  I think I should clarify this part the most for this review.
>  As you know, new added events both has similar existing events,
>  but it has to operate separately.
> 
>  First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
>  We need two events for our cover interaction.
>  One is to detect if flip cover is open/closed(covers screen or not),
>  and one is for detecting if cover is attached(detect if device is put into cover).
>  With the second event, we send event for attachment and start authentication
>  distinguishing if it was Samsung made cover.
> 
>  Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
>  It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
>  SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
>  while pen is attached/detached.

All of that needs to go in the changelog text for the individual patches
when you submit them.

But as Dmitry pointed out, it doesn't look like either of these drivers
are needed at all, just use the gpio-keys driver instead.

thanks,

greg k-h
Jungrae Kim Oct. 30, 2020, 11:28 a.m. UTC | #8
> On Fri, Oct 30, 2020 at 01:39:16PM +0900, HyungJae Im wrote:
> > Hello, This is Hyungjae Im from Samsung Electronics.
> > Let me answer your questions inline.
> > 
> > >On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> > >> From: "hj2.im" <hj2.im@samsung.com>
> > >> Date: Thu, 29 Oct 2020 22:11:24 +0900
> > >> Subject: [PATCH v2] input: add 2 kind of switch
> > > 
> > >Why is this in the body of that patch?
> > 
> > I read "how to send your first kernel patch", but still making so many mistakes.
> > I will be cautious with this.
> >  
> > >> 
> > >> We need support to various accessories on the device,
> > >> some switch does not exist in switch list.
> > >> So added switch for the following purpose.
> > >> 
> > >> SW_COVER_ATTACHED is for the checking the cover
> > >> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> > >> checking the external pen attached or not on the device
> > > 
> > >You didn't answer the previous question as to why the existing values do
> > >not work for you instead of having to create new ones?
> > 
> >  I think I should clarify this part the most for this review.
> >  As you know, new added events both has similar existing events,
> >  but it has to operate separately.
> > 
> >  First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
> >  We need two events for our cover interaction.
> >  One is to detect if flip cover is open/closed(covers screen or not),
> >  and one is for detecting if cover is attached(detect if device is put into cover).
> >  With the second event, we send event for attachment and start authentication
> >  distinguishing if it was Samsung made cover.
> > 
> >  Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
> >  It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
> >  SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
> >  while pen is attached/detached.

> All of that needs to go in the changelog text for the individual patches
> when you submit them.

> But as Dmitry pointed out, it doesn't look like either of these drivers
> are needed at all, just use the gpio-keys driver instead.

> thanks,

> greg k-h
 
Can you accept V1 patch? or need to add a change of device tree?
Please let me know what do I do now.
Greg KH Oct. 30, 2020, 11:41 a.m. UTC | #9
On Fri, Oct 30, 2020 at 08:28:12PM +0900, Jungrae Kim wrote:
> > On Fri, Oct 30, 2020 at 01:39:16PM +0900, HyungJae Im wrote:
> > > Hello, This is Hyungjae Im from Samsung Electronics.
> > > Let me answer your questions inline.
> > > 
> > > >On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> > > >> From: "hj2.im" <hj2.im@samsung.com>
> > > >> Date: Thu, 29 Oct 2020 22:11:24 +0900
> > > >> Subject: [PATCH v2] input: add 2 kind of switch
> > > > 
> > > >Why is this in the body of that patch?
> > > 
> > > I read "how to send your first kernel patch", but still making so many mistakes.
> > > I will be cautious with this.
> > >  
> > > >> 
> > > >> We need support to various accessories on the device,
> > > >> some switch does not exist in switch list.
> > > >> So added switch for the following purpose.
> > > >> 
> > > >> SW_COVER_ATTACHED is for the checking the cover
> > > >> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> > > >> checking the external pen attached or not on the device
> > > > 
> > > >You didn't answer the previous question as to why the existing values do
> > > >not work for you instead of having to create new ones?
> > > 
> > >  I think I should clarify this part the most for this review.
> > >  As you know, new added events both has similar existing events,
> > >  but it has to operate separately.
> > > 
> > >  First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
> > >  We need two events for our cover interaction.
> > >  One is to detect if flip cover is open/closed(covers screen or not),
> > >  and one is for detecting if cover is attached(detect if device is put into cover).
> > >  With the second event, we send event for attachment and start authentication
> > >  distinguishing if it was Samsung made cover.
> > > 
> > >  Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
> > >  It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
> > >  SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
> > >  while pen is attached/detached.
> >  
> > All of that needs to go in the changelog text for the individual patches
> > when you submit them.
> >  
> > But as Dmitry pointed out, it doesn't look like either of these drivers
> > are needed at all, just use the gpio-keys driver instead.
> >  
> > thanks,
> >  
> > greg k-h
>  
> Can you accept V1 patch? or need to add a change of device tree?

What is "v1" patch?  Do you have a pointer to it on lore.kernel.org?

> Please let me know what do I do now. 

What is wrong with just using a device tree entry for the gpio-keys
driver instead?

thanks,

greg k-h
Jungrae Kim Oct. 30, 2020, 11:59 a.m. UTC | #10
> On Fri, Oct 30, 2020 at 08:28:12PM +0900, Jungrae Kim wrote:
> > > On Fri, Oct 30, 2020 at 01:39:16PM +0900, HyungJae Im wrote:
> > > > Hello, This is Hyungjae Im from Samsung Electronics.
> > > > Let me answer your questions inline.
> > > > 
> > > > >On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> > > > >> From: "hj2.im" <hj2.im@samsung.com>
> > > > >> Date: Thu, 29 Oct 2020 22:11:24 +0900
> > > > >> Subject: [PATCH v2] input: add 2 kind of switch
> > > > > 
> > > > >Why is this in the body of that patch?
> > > > 
> > > > I read "how to send your first kernel patch", but still making so many mistakes.
> > > > I will be cautious with this.
> > > >  
> > > > >> 
> > > > >> We need support to various accessories on the device,
> > > > >> some switch does not exist in switch list.
> > > > >> So added switch for the following purpose.
> > > > >> 
> > > > >> SW_COVER_ATTACHED is for the checking the cover
> > > > >> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> > > > >> checking the external pen attached or not on the device
> > > > > 
> > > > >You didn't answer the previous question as to why the existing values do
> > > > >not work for you instead of having to create new ones?
> > > > 
> > > >  I think I should clarify this part the most for this review.
> > > >  As you know, new added events both has similar existing events,
> > > >  but it has to operate separately.
> > > > 
> > > >  First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
> > > >  We need two events for our cover interaction.
> > > >  One is to detect if flip cover is open/closed(covers screen or not),
> > > >  and one is for detecting if cover is attached(detect if device is put into cover).
> > > >  With the second event, we send event for attachment and start authentication
> > > >  distinguishing if it was Samsung made cover.
> > > > 
> > > >  Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
> > > >  It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
> > > >  SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
> > > >  while pen is attached/detached.
> > >  
> > > All of that needs to go in the changelog text for the individual patches
> > > when you submit them.
> > >  
> > > But as Dmitry pointed out, it doesn't look like either of these drivers
> > > are needed at all, just use the gpio-keys driver instead.
> > >  
> > > thanks,
> > >  
> > > greg k-h
> >  
> > Can you accept V1 patch? or need to add a change of device tree?
> 
> What is "v1" patch?  Do you have a pointer to it on lore.kernel.org?
> 
> > Please let me know what do I do now. 
> 
> What is wrong with just using a device tree entry for the gpio-keys
> driver instead?
> 
> thanks,
> 
> greg k-h

V1 Patch : https://lore.kernel.org/lkml/20201021031216epcms1p556d8d7d5d763ec47f67cd8cbe3972935@epcms1p5/

I think do not need modify gpio_keys. And I`m not sure device tree need to added to patch.

Please let me know if you think need more fix than Patch v1.

Thanks
Jungrae Kim
Greg KH Oct. 30, 2020, 12:19 p.m. UTC | #11
On Fri, Oct 30, 2020 at 08:59:18PM +0900, Jungrae Kim wrote:
> > On Fri, Oct 30, 2020 at 08:28:12PM +0900, Jungrae Kim wrote:
> > > > On Fri, Oct 30, 2020 at 01:39:16PM +0900, HyungJae Im wrote:
> > > > > Hello, This is Hyungjae Im from Samsung Electronics.
> > > > > Let me answer your questions inline.
> > > > > 
> > > > > >On Thu, Oct 29, 2020 at 10:27:47PM +0900, HyungJae Im wrote:
> > > > > >> From: "hj2.im" <hj2.im@samsung.com>
> > > > > >> Date: Thu, 29 Oct 2020 22:11:24 +0900
> > > > > >> Subject: [PATCH v2] input: add 2 kind of switch
> > > > > > 
> > > > > >Why is this in the body of that patch?
> > > > > 
> > > > > I read "how to send your first kernel patch", but still making so many mistakes.
> > > > > I will be cautious with this.
> > > > >  
> > > > > >> 
> > > > > >> We need support to various accessories on the device,
> > > > > >> some switch does not exist in switch list.
> > > > > >> So added switch for the following purpose.
> > > > > >> 
> > > > > >> SW_COVER_ATTACHED is for the checking the cover
> > > > > >> attached or not on the device. SW_EXT_PEN_ATTACHED is for the
> > > > > >> checking the external pen attached or not on the device
> > > > > > 
> > > > > >You didn't answer the previous question as to why the existing values do
> > > > > >not work for you instead of having to create new ones?
> > > > > 
> > > > >  I think I should clarify this part the most for this review.
> > > > >  As you know, new added events both has similar existing events,
> > > > >  but it has to operate separately.
> > > > > 
> > > > >  First, SW_COVER_ATTACHED is similar with SW_MACHINE_COVER.
> > > > >  We need two events for our cover interaction.
> > > > >  One is to detect if flip cover is open/closed(covers screen or not),
> > > > >  and one is for detecting if cover is attached(detect if device is put into cover).
> > > > >  With the second event, we send event for attachment and start authentication
> > > > >  distinguishing if it was Samsung made cover.
> > > > > 
> > > > >  Second, SW_EXT_PEN_ATTACHED detects if pen is attached externally on tablet models.
> > > > >  It is different with SW_PEN_INSERTED since this is detecting pens like our NOTE series.
> > > > >  SW_EXT_PEN_ATTACHED has an unique role to set wacom tuning table differently
> > > > >  while pen is attached/detached.
> > > >  
> > > > All of that needs to go in the changelog text for the individual patches
> > > > when you submit them.
> > > >  
> > > > But as Dmitry pointed out, it doesn't look like either of these drivers
> > > > are needed at all, just use the gpio-keys driver instead.
> > > >  
> > > > thanks,
> > > >  
> > > > greg k-h
> > >  
> > > Can you accept V1 patch? or need to add a change of device tree?
> > 
> > What is "v1" patch?  Do you have a pointer to it on lore.kernel.org?
> > 
> > > Please let me know what do I do now. 
> > 
> > What is wrong with just using a device tree entry for the gpio-keys
> > driver instead?
> > 
> > thanks,
> > 
> > greg k-h
> 
> V1 Patch : https://lore.kernel.org/lkml/20201021031216epcms1p556d8d7d5d763ec47f67cd8cbe3972935@epcms1p5/

As I said there, that patch is not acceptable for style reasons alone,
nothing we can do with that unless it is fixed, right?

> I think do not need modify gpio_keys. And I`m not sure device tree need to added to patch.

No, you don't need to modify it, just use it.

So what exactly is the issue anymore?  Just use the gpio-keys driver and
all should be fine, right?

thanks,

greg k-h
kernel test robot Nov. 2, 2020, 12:35 p.m. UTC | #12
Hi HyungJae,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on input/next]
[also build test ERROR on linus/master linux/master v5.10-rc2 next-20201102]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/HyungJae-Im/input-add-2-kind-of-switch/20201029-213108
base:   https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
config: riscv-randconfig-r036-20201030 (attached as .config)
compiler: riscv64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/bf61e9f978d895850b5a30fe6a7308acb2f245d7
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review HyungJae-Im/input-add-2-kind-of-switch/20201029-213108
        git checkout bf61e9f978d895850b5a30fe6a7308acb2f245d7
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

>> drivers/input/ext_pen_detect.c:23:10: fatal error: linux/wakelock.h: No such file or directory
      23 | #include <linux/wakelock.h>
         |          ^~~~~~~~~~~~~~~~~~
   compilation terminated.

vim +23 drivers/input/ext_pen_detect.c

  > 23	#include <linux/wakelock.h>
    24	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/input/Kconfig b/drivers/input/Kconfig
index 1efd3154b68d..df902f4a549e 100644
--- a/drivers/input/Kconfig
+++ b/drivers/input/Kconfig
@@ -185,6 +185,26 @@  config INPUT_APMPOWER
 	  To compile this driver as a module, choose M here: the
 	  module will be called apm-power.
 
+config COVER_DETECT
+	tristate "Enable cover attach detection"
+	default n
+	help
+	  Say Y here to enable cover attach detection
+	  and send a event when cover is attached/detached.
+	  Active gpio state is low and active event value is 0.
+
+	  If unsure, say N.
+
+config EXT_PEN_DETECT
+	tristate "Enable external pen attach detection"
+	default n
+	help
+	  Say Y here to enable external pen attach detection
+	  and send a event when external pen is attached/detached.
+	  Active gpio state is low and active event value is 0.
+
+	  If unsure, say N.
+
 comment "Input Device Drivers"
 
 source "drivers/input/keyboard/Kconfig"
diff --git a/drivers/input/Makefile b/drivers/input/Makefile
index e35650930371..31ee1f2d2e21 100644
--- a/drivers/input/Makefile
+++ b/drivers/input/Makefile
@@ -29,3 +29,6 @@  obj-$(CONFIG_INPUT_MISC)	+= misc/
 obj-$(CONFIG_INPUT_APMPOWER)	+= apm-power.o
 
 obj-$(CONFIG_RMI4_CORE)		+= rmi4/
+
+obj-$(CONFIG_COVER_DETECT)	+= cover_detect.o
+obj-$(CONFIG_EXT_PEN_DETECT)	+= ext_pen_detect.o
diff --git a/drivers/input/cover_detect.c b/drivers/input/cover_detect.c
new file mode 100644
index 000000000000..4d3d68c616ec
--- /dev/null
+++ b/drivers/input/cover_detect.c
@@ -0,0 +1,242 @@ 
+/*
+ * Copyright (C) 2015 Samsung Electronics Co. Ltd. All Rights Reserved.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/pm.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/wakelock.h>
+
+struct cover_detect_drvdata {
+	struct input_dev *input;
+	struct delayed_work cover_detect_dwork;
+	struct wakeup_source *ws;
+	int gpio_cover_detect;
+	int irq_cover_detect;
+};
+
+static void cover_detect_work(struct work_struct *work)
+{
+	struct cover_detect_drvdata *ddata =
+		container_of(work, struct cover_detect_drvdata,
+				cover_detect_dwork.work);
+	bool cover_status;
+
+	cover_status = gpio_get_value(ddata->gpio_cover_detect);
+
+	input_report_switch(ddata->input,
+			SW_COVER_ATTACHED, cover_status);
+	input_sync(ddata->input);
+}
+
+static void __cover_detect(struct cover_detect_drvdata *ddata,
+				 bool cover_status)
+{
+	cancel_delayed_work_sync(&ddata->cover_detect_dwork);
+	if (cover_status) {
+		__pm_wakeup_event(ddata->ws, jiffies_to_msecs(HZ / 20));
+		schedule_delayed_work(&ddata->cover_detect_dwork, HZ * 1 / 100);
+	} else {
+		__pm_relax(ddata->ws);
+		schedule_delayed_work(&ddata->cover_detect_dwork, 0);
+	}
+}
+
+static irqreturn_t cover_detect_irq(int irq, void *dev_id)
+{
+	bool cover_status;
+	struct cover_detect_drvdata *ddata = dev_id;
+
+	cover_status = gpio_get_value(ddata->gpio_cover_detect);
+
+	__cover_detect(ddata, cover_status);
+
+	return IRQ_HANDLED;
+}
+
+static int cover_detect_open(struct input_dev *input)
+{
+	struct cover_detect_drvdata *ddata = input_get_drvdata(input);
+	/* update the current status */
+	schedule_delayed_work(&ddata->cover_detect_dwork, HZ / 2);
+	/* Report current state of buttons that are connected to GPIOs */
+	input_sync(input);
+
+	return 0;
+}
+
+static void cover_detect_close(struct input_dev *input)
+{
+}
+
+static void init_cover_detect_irq(struct input_dev *input)
+{
+	struct cover_detect_drvdata *ddata = input_get_drvdata(input);
+
+	int ret = 0;
+	int irq = ddata->irq_cover_detect;
+
+	ret =	request_threaded_irq(
+		irq, NULL,
+		cover_detect_irq,
+		IRQF_TRIGGER_RISING |
+		IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+		"cover_detect", ddata);
+	if (ret < 0)
+		pr_err("keys: failed to request cover detect irq %d gpio %d\n",
+			irq, ddata->gpio_cover_detect);
+}
+
+#ifdef CONFIG_OF
+static int of_cover_detect_data_parsing_dt(struct device *dev,
+					struct cover_detect_drvdata *ddata)
+{
+	struct device_node *np = dev->of_node;
+	int gpio;
+	enum of_gpio_flags flags;
+
+	gpio = of_get_named_gpio_flags(np, "gpio_cover_detect", 0, &flags);
+	ddata->gpio_cover_detect = gpio;
+
+	ddata->irq_cover_detect = gpio_to_irq(gpio);
+
+	return 0;
+}
+#endif
+
+static int cover_detect_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct cover_detect_drvdata *ddata;
+	struct input_dev *input;
+	int error;
+	int wakeup = 0;
+
+	ddata = kzalloc(sizeof(struct cover_detect_drvdata), GFP_KERNEL);
+	if (!ddata)
+		return -ENOMEM;
+
+#ifdef CONFIG_OF
+	if (dev->of_node) {
+		error = of_cover_detect_data_parsing_dt(dev, ddata);
+		if (error < 0) {
+			dev_err(dev, "fail to get the devicetree, error: %d\n",
+					error);
+			goto fail1;
+		}
+	}
+#endif
+
+	input = input_allocate_device();
+	if (!input) {
+		dev_err(dev, "failed to allocate state\n");
+		error = -ENOMEM;
+		goto fail1;
+	}
+
+	ddata->input = input;
+
+	ddata->ws = wakeup_source_register(NULL, "cover_detect");
+
+	platform_set_drvdata(pdev, ddata);
+	input_set_drvdata(input, ddata);
+
+	input->name = "cover_detect";
+	input->phys = "cover_detect";
+	input->dev.parent = &pdev->dev;
+
+	input->evbit[0] |= BIT_MASK(EV_SW);
+	input_set_capability(input, EV_SW, SW_COVER_ATTACHED);
+
+	input->open = cover_detect_open;
+	input->close = cover_detect_close;
+
+	/* Enable auto repeat feature of Linux input subsystem */
+	__set_bit(EV_REP, input->evbit);
+
+	INIT_DELAYED_WORK(&ddata->cover_detect_dwork, cover_detect_work);
+
+	init_cover_detect_irq(input);
+
+	if (ddata->gpio_cover_detect != 0) {
+		error = input_register_device(input);
+		if (error) {
+			dev_err(dev, "Unable to register input device, error: %d\n",
+				error);
+			goto fail1;
+		}
+	}
+
+	device_init_wakeup(&pdev->dev, wakeup);
+
+	return 0;
+
+ fail1:
+	kfree(ddata);
+
+	return error;
+}
+
+static int cover_detect_remove(struct platform_device *pdev)
+{
+	struct cover_detect_drvdata *ddata = platform_get_drvdata(pdev);
+	struct input_dev *input = ddata->input;
+
+	device_init_wakeup(&pdev->dev, 0);
+
+	input_unregister_device(input);
+
+	wakeup_source_unregister(ddata->ws);
+
+	kfree(ddata);
+
+	return 0;
+}
+
+#if defined(CONFIG_OF)
+static const struct of_device_id cover_detect_dt_ids[] = {
+	{ .compatible = "cover_detect" },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, cover_detect_dt_ids);
+#endif /* CONFIG_OF */
+
+static struct platform_driver cover_detect_device_driver = {
+	.probe		= cover_detect_probe,
+	.remove		= cover_detect_remove,
+	.driver		= {
+		.name	= "cover_detect",
+		.owner	= THIS_MODULE,
+#if defined(CONFIG_OF)
+		.of_match_table	= cover_detect_dt_ids,
+#endif /* CONFIG_OF */
+	}
+};
+
+static int __init cover_detect_init(void)
+{
+	return platform_driver_register(&cover_detect_device_driver);
+}
+
+static void __exit cover_detect_exit(void)
+{
+	platform_driver_unregister(&cover_detect_device_driver);
+}
+
+module_init(cover_detect_init);
+module_exit(cover_detect_exit);
diff --git a/drivers/input/ext_pen_detect.c b/drivers/input/ext_pen_detect.c
new file mode 100644
index 000000000000..3595b967718b
--- /dev/null
+++ b/drivers/input/ext_pen_detect.c
@@ -0,0 +1,243 @@ 
+/*
+ * Copyright (C) 2015 Samsung Electronics Co. Ltd. All Rights Reserved.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/pm.h>
+#include <linux/slab.h>
+#include <linux/platform_device.h>
+#include <linux/input.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/wakelock.h>
+
+struct ext_pen_detect_drvdata {
+	struct input_dev *input;
+	struct delayed_work ext_pen_detect_dwork;
+	struct wakeup_source *ws;
+	int gpio_ext_pen_detect;
+	int irq_ext_pen_detect;
+};
+
+static void ext_pen_detect_work(struct work_struct *work)
+{
+	struct ext_pen_detect_drvdata *ddata =
+		container_of(work, struct ext_pen_detect_drvdata,
+				ext_pen_detect_dwork.work);
+	bool ext_pen_status;
+
+	ext_pen_status = gpio_get_value(ddata->gpio_ext_pen_detect);
+
+	input_report_switch(ddata->input,
+			SW_EXT_PEN_ATTACHED, ext_pen_status);
+	input_sync(ddata->input);
+}
+
+static void __ext_pen_detect(struct ext_pen_detect_drvdata *ddata,
+				bool ext_pen_status)
+{
+	cancel_delayed_work_sync(&ddata->ext_pen_detect_dwork);
+	if (ext_pen_status) {
+		__pm_wakeup_event(ddata->ws, jiffies_to_msecs(HZ / 20));
+		schedule_delayed_work(&ddata->ext_pen_detect_dwork,
+					HZ * 1 / 100);
+	} else {
+		__pm_relax(ddata->ws);
+		schedule_delayed_work(&ddata->ext_pen_detect_dwork, 0);
+	}
+}
+
+static irqreturn_t ext_pen_detect_irq(int irq, void *dev_id)
+{
+	bool ext_pen_status;
+	struct ext_pen_detect_drvdata *ddata = dev_id;
+
+	ext_pen_status = gpio_get_value(ddata->gpio_ext_pen_detect);
+
+	__ext_pen_detect(ddata, ext_pen_status);
+
+	return IRQ_HANDLED;
+}
+
+static int ext_pen_detect_open(struct input_dev *input)
+{
+	struct ext_pen_detect_drvdata *ddata = input_get_drvdata(input);
+	/* update the current status */
+	schedule_delayed_work(&ddata->ext_pen_detect_dwork, HZ / 2);
+	/* Report current state of buttons that are connected to GPIOs */
+	input_sync(input);
+
+	return 0;
+}
+
+static void ext_pen_detect_close(struct input_dev *input)
+{
+}
+
+static void init_ext_pen_detect_irq(struct input_dev *input)
+{
+	struct ext_pen_detect_drvdata *ddata = input_get_drvdata(input);
+
+	int ret = 0;
+	int irq = ddata->irq_ext_pen_detect;
+
+	ret =	request_threaded_irq(
+		irq, NULL,
+		ext_pen_detect_irq,
+		IRQF_TRIGGER_RISING |
+		IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+		"ext_pen_detect", ddata);
+	if (ret < 0)
+		pr_err("keys: failed to request ext_pen detect irq %d gpio %d\n",
+				irq, ddata->gpio_ext_pen_detect);
+}
+
+#ifdef CONFIG_OF
+static int of_ext_pen_detect_data_parsing_dt(struct device *dev,
+					struct ext_pen_detect_drvdata *ddata)
+{
+	struct device_node *np = dev->of_node;
+	int gpio;
+	enum of_gpio_flags flags;
+
+	gpio = of_get_named_gpio_flags(np, "gpio_ext_pen_detect", 0, &flags);
+	ddata->gpio_ext_pen_detect = gpio;
+
+	ddata->irq_ext_pen_detect = gpio_to_irq(gpio);
+
+	return 0;
+}
+#endif
+
+static int ext_pen_detect_probe(struct platform_device *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct ext_pen_detect_drvdata *ddata;
+	struct input_dev *input;
+	int error;
+	int wakeup = 0;
+
+	ddata = kzalloc(sizeof(struct ext_pen_detect_drvdata), GFP_KERNEL);
+	if (!ddata)
+		return -ENOMEM;
+
+#ifdef CONFIG_OF
+	if (dev->of_node) {
+		error = of_ext_pen_detect_data_parsing_dt(dev, ddata);
+		if (error < 0) {
+			dev_err(dev, "fail to get the devicetree, error: %d\n",
+					error);
+			goto fail1;
+		}
+	}
+#endif
+
+	input = input_allocate_device();
+	if (!input) {
+		dev_err(dev, "failed to allocate state\n");
+		error = -ENOMEM;
+		goto fail1;
+	}
+
+	ddata->input = input;
+
+	ddata->ws = wakeup_source_register(NULL, "ext_pen_detect");
+
+	platform_set_drvdata(pdev, ddata);
+	input_set_drvdata(input, ddata);
+
+	input->name = "ext_pen_detect";
+	input->phys = "ext_pen_detect";
+	input->dev.parent = &pdev->dev;
+
+	input->evbit[0] |= BIT_MASK(EV_SW);
+	input_set_capability(input, EV_SW, SW_EXT_PEN_ATTACHED);
+
+	input->open = ext_pen_detect_open;
+	input->close = ext_pen_detect_close;
+
+	/* Enable auto repeat feature of Linux input subsystem */
+	__set_bit(EV_REP, input->evbit);
+
+	INIT_DELAYED_WORK(&ddata->ext_pen_detect_dwork, ext_pen_detect_work);
+
+	init_ext_pen_detect_irq(input);
+
+	if (ddata->gpio_ext_pen_detect != 0) {
+		error = input_register_device(input);
+		if (error) {
+			dev_err(dev, "Unable to register input device, error: %d\n",
+				error);
+			goto fail1;
+		}
+	}
+
+	device_init_wakeup(&pdev->dev, wakeup);
+
+	return 0;
+
+ fail1:
+	kfree(ddata);
+
+	return error;
+}
+
+static int ext_pen_detect_remove(struct platform_device *pdev)
+{
+	struct ext_pen_detect_drvdata *ddata = platform_get_drvdata(pdev);
+	struct input_dev *input = ddata->input;
+
+	device_init_wakeup(&pdev->dev, 0);
+
+	input_unregister_device(input);
+
+	wakeup_source_unregister(ddata->ws);
+
+	kfree(ddata);
+
+	return 0;
+}
+
+#if defined(CONFIG_OF)
+static const struct of_device_id ext_pen_detect_dt_ids[] = {
+	{ .compatible = "ext_pen_detect" },
+	{ },
+};
+MODULE_DEVICE_TABLE(of, ext_pen_detect_dt_ids);
+#endif /* CONFIG_OF */
+
+static struct platform_driver ext_pen_detect_device_driver = {
+	.probe		= ext_pen_detect_probe,
+	.remove		= ext_pen_detect_remove,
+	.driver		= {
+		.name	= "ext_pen_detect",
+		.owner	= THIS_MODULE,
+#if defined(CONFIG_OF)
+		.of_match_table	= ext_pen_detect_dt_ids,
+#endif /* CONFIG_OF */
+	}
+};
+
+static int __init ext_pen_detect_init(void)
+{
+	return platform_driver_register(&ext_pen_detect_device_driver);
+}
+
+static void __exit ext_pen_detect_exit(void)
+{
+	platform_driver_unregister(&ext_pen_detect_device_driver);
+}
+
+module_init(ext_pen_detect_init);
+module_exit(ext_pen_detect_exit);
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index 5b08a473cdba..897f5a3e7721 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -320,7 +320,7 @@  struct pcmcia_device_id {
 #define INPUT_DEVICE_ID_LED_MAX		0x0f
 #define INPUT_DEVICE_ID_SND_MAX		0x07
 #define INPUT_DEVICE_ID_FF_MAX		0x7f
-#define INPUT_DEVICE_ID_SW_MAX		0x10
+#define INPUT_DEVICE_ID_SW_MAX		0x12
 #define INPUT_DEVICE_ID_PROP_MAX	0x1f
 
 #define INPUT_DEVICE_ID_MATCH_BUS	1
diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
index 0c2e27d28e0a..8ca2acee1f92 100644
--- a/include/uapi/linux/input-event-codes.h
+++ b/include/uapi/linux/input-event-codes.h
@@ -889,7 +889,9 @@ 
 #define SW_MUTE_DEVICE		0x0e  /* set = device disabled */
 #define SW_PEN_INSERTED		0x0f  /* set = pen inserted */
 #define SW_MACHINE_COVER	0x10  /* set = cover closed */
-#define SW_MAX			0x10
+#define SW_COVER_ATTACHED	0x11  /* set = cover attached */
+#define SW_EXT_PEN_ATTACHED	0x12  /* set = external pen attached */
+#define SW_MAX			0x12
 #define SW_CNT			(SW_MAX+1)
 
 /*