linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] gpio_keys ev_sw support
@ 2007-04-10 16:53 Roman Moravcik
  2007-04-10 18:20 ` Dmitry Torokhov
  0 siblings, 1 reply; 5+ messages in thread
From: Roman Moravcik @ 2007-04-10 16:53 UTC (permalink / raw)
  To: linux-input; +Cc: kernel-discuss

This patch adds software event support to gpio_keys driver.

Signed-off-by: Roman Moravcik <roman.moravcik@gmail.com>

diff -Naur a/drivers/input/keyboard/gpio_keys.c 
b/drivers/input/keyboard/gpio_keys.c
--- a/drivers/input/keyboard/gpio_keys.c    2007-02-25 
19:50:43.000000000 +0100
+++ b/drivers/input/keyboard/gpio_keys.c    2007-04-05 
22:53:02.000000000 +0200
@@ -39,7 +39,10 @@
         if (irq == gpio_to_irq(gpio)) {
             int state = (gpio_get_value(gpio) ? 1 : 0) ^ 
(pdata->buttons[i].active_low);
 
-            input_report_key(input, pdata->buttons[i].keycode, state);
+            if (pdata->buttons[i].type == EV_SW)
+                input_report_switch(input, pdata->buttons[i].keycode, 
state);
+            else
+                input_report_key(input, pdata->buttons[i].keycode, state);
             input_sync(input);
         }
     }
@@ -59,7 +62,7 @@
 
     platform_set_drvdata(pdev, input);
 
-    input->evbit[0] = BIT(EV_KEY);
+    input->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
 
     input->name = pdev->name;
     input->phys = "gpio-keys/input0";
@@ -84,7 +87,10 @@
                 irq, error);
             goto fail;
         }
-        set_bit(code, input->keybit);
+        if (pdata->buttons[i].type == EV_SW)
+            set_bit(code, input->swbit);
+        else
+            set_bit(code, input->keybit);
     }
 
     error = input_register_device(input);
diff -Naur a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
--- a/include/linux/gpio_keys.h    2007-02-25 16:21:52.000000000 +0100
+++ b/include/linux/gpio_keys.h    2007-04-05 20:23:31.000000000 +0200
@@ -6,6 +6,7 @@
     int gpio;
     int active_low;
     char *desc;
+    int type;
 };
 
 struct gpio_keys_platform_data {

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpio_keys ev_sw support
  2007-04-10 16:53 [PATCH] gpio_keys ev_sw support Roman Moravcik
@ 2007-04-10 18:20 ` Dmitry Torokhov
  2007-04-11  8:06   ` Roman Moravcik
  0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Torokhov @ 2007-04-10 18:20 UTC (permalink / raw)
  To: Roman Moravcik; +Cc: linux-input, kernel-discuss

Hi Roman,

On 4/10/07, Roman Moravcik <roman.moravcik@gmail.com> wrote:
> This patch adds software event support to gpio_keys driver.
>

Just for the record EV_SW is not software event but switch event.
Switch, as opposed to a key that returns to "off" state when released,
keeps it's state until toggled again.

> Signed-off-by: Roman Moravcik <roman.moravcik@gmail.com>
>
> diff -Naur a/drivers/input/keyboard/gpio_keys.c
> b/drivers/input/keyboard/gpio_keys.c
> --- a/drivers/input/keyboard/gpio_keys.c    2007-02-25
> 19:50:43.000000000 +0100
> +++ b/drivers/input/keyboard/gpio_keys.c    2007-04-05
> 22:53:02.000000000 +0200
> @@ -39,7 +39,10 @@
>         if (irq == gpio_to_irq(gpio)) {
>             int state = (gpio_get_value(gpio) ? 1 : 0) ^
> (pdata->buttons[i].active_low);
>
> -            input_report_key(input, pdata->buttons[i].keycode, state);
> +            if (pdata->buttons[i].type == EV_SW)
> +                input_report_switch(input, pdata->buttons[i].keycode,
> state);
> +            else
> +                input_report_key(input, pdata->buttons[i].keycode, state);
>             input_sync(input);
>         }
>     }
> @@ -59,7 +62,7 @@
>
>     platform_set_drvdata(pdev, input);
>
> -    input->evbit[0] = BIT(EV_KEY);
> +    input->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
>

You should not set these bits unconditionally but rather scan supplied
keymap and set appropriately.

>     input->name = pdev->name;
>     input->phys = "gpio-keys/input0";
> @@ -84,7 +87,10 @@
>                 irq, error);
>             goto fail;
>         }
> -        set_bit(code, input->keybit);
> +        if (pdata->buttons[i].type == EV_SW)
> +            set_bit(code, input->swbit);
> +        else
> +            set_bit(code, input->keybit);
>     }
>
>     error = input_register_device(input);
> diff -Naur a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
> --- a/include/linux/gpio_keys.h    2007-02-25 16:21:52.000000000 +0100
> +++ b/include/linux/gpio_keys.h    2007-04-05 20:23:31.000000000 +0200
> @@ -6,6 +6,7 @@
>     int gpio;
>     int active_low;
>     char *desc;
> +    int type;

Would not it make sense to keep type close to keycode element?

-- 
Dmitry

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpio_keys ev_sw support
  2007-04-10 18:20 ` Dmitry Torokhov
@ 2007-04-11  8:06   ` Roman Moravcik
  2007-04-13 21:13     ` Paul Sokolovsky
  0 siblings, 1 reply; 5+ messages in thread
From: Roman Moravcik @ 2007-04-11  8:06 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, kernel-discuss

Hi Dmitry,

Dmitry Torokhov  wrote / napísal(a):
>> This patch adds software event support to gpio_keys driver.
>>
>
> Just for the record EV_SW is not software event but switch event.
> Switch, as opposed to a key that returns to "off" state when released,
> keeps it's state until toggled again.

Ops, sorry. Yes, EV_SW is switch event not software event.
I don't why i wrote software.
>>
>> -    input->evbit[0] = BIT(EV_KEY);
>> +    input->evbit[0] = BIT(EV_KEY) | BIT(EV_SW);
>>
>
> You should not set these bits unconditionally but rather scan supplied
> keymap and set appropriately.
>
Ok, EV_SW bit is set conditionally now.

>> --- a/include/linux/gpio_keys.h    2007-02-25 16:21:52.000000000 +0100
>> +++ b/include/linux/gpio_keys.h    2007-04-05 20:23:31.000000000 +0200
>> @@ -6,6 +6,7 @@
>>     int gpio;
>>     int active_low;
>>     char *desc;
>> +    int type;
>
> Would not it make sense to keep type close to keycode element?
>
Moved behind the keycode.

Roman

This patch adds switch event support to gpio_keys driver.

Signed-off-by: Roman Moravcik <roman.moravcik@gmail.com>

diff -Naur a/drivers/input/keyboard/gpio_keys.c 
b/drivers/input/keyboard/gpio_keys.c
--- a/drivers/input/keyboard/gpio_keys.c    2007-02-25 
19:50:43.000000000 +0100
+++ b/drivers/input/keyboard/gpio_keys.c    2007-04-10 
20:42:31.000000000 +0200
@@ -39,7 +39,10 @@
         if (irq == gpio_to_irq(gpio)) {
             int state = (gpio_get_value(gpio) ? 1 : 0) ^ 
(pdata->buttons[i].active_low);
 
-            input_report_key(input, pdata->buttons[i].keycode, state);
+            if (pdata->buttons[i].type == EV_SW)
+                input_report_switch(input, pdata->buttons[i].keycode, 
state);
+            else
+                input_report_key(input, pdata->buttons[i].keycode, state);
             input_sync(input);
         }
     }
@@ -84,7 +87,12 @@
                 irq, error);
             goto fail;
         }
-        set_bit(code, input->keybit);
+        if (pdata->buttons[i].type == EV_SW) {
+            input->evbit[0] |= BIT(EV_SW);
+            set_bit(code, input->swbit);
+        } else {
+            set_bit(code, input->keybit);
+        }
     }
 
     error = input_register_device(input);
diff -Naur a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
--- a/include/linux/gpio_keys.h    2007-02-25 16:21:52.000000000 +0100
+++ b/include/linux/gpio_keys.h    2007-04-10 20:31:25.000000000 +0200
@@ -3,6 +3,7 @@
 struct gpio_keys_button {
     /* Configuration parameters */
     int keycode;
+    int type;
     int gpio;
     int active_low;
     char *desc;

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpio_keys ev_sw support
  2007-04-11  8:06   ` Roman Moravcik
@ 2007-04-13 21:13     ` Paul Sokolovsky
  2007-04-13 21:24       ` Dmitry Torokhov
  0 siblings, 1 reply; 5+ messages in thread
From: Paul Sokolovsky @ 2007-04-13 21:13 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Roman Moravcik, linux-input, kernel-discuss

Hello Dmitry,

	I wonder if you're satisfied with Roman patch now. I guess it could just fall to the bottom of your queue due to bad formatting. So, here's resend, hopefully correct. One change is that we had to put "type" member to the end of struct gpio_keys_button, the reason is backwards compatibility. As you see, we'd like EV_KEY to be still default, and nay other type to be used only if explicitly specified. And as structure is already big, and there're usually several keys to define, we use positional initialization to save space:

	{ KEY_ENTER,	GPIO_NR_H4000_ACTION_BUTTON_N,	1, "Action button"	},

So, putting type after keycode will break this, and moreover compiler issues only warning, so that may go unnoticed.


Thanks,
Paul


-------------
This patch adds switch event support to gpio_keys driver.

Signed-off-by: Roman Moravcik <roman.moravcik@gmail.com>
Signed-off-by: Paul Sokolovsky <pmiscml@gmail.com>


Index: include/linux/gpio_keys.h
===================================================================
RCS file: /cvs/linux/kernel26/include/linux/gpio_keys.h,v
retrieving revision 1.1
diff -u -p -r1.1 gpio_keys.h
--- include/linux/gpio_keys.h	25 Feb 2007 15:21:52 -0000	1.1
+++ include/linux/gpio_keys.h	13 Apr 2007 21:07:03 -0000
@@ -6,6 +6,7 @@ struct gpio_keys_button {
 	int gpio;
 	int active_low;
 	char *desc;
+	int type;
 };
 
 struct gpio_keys_platform_data {
Index: drivers/input/keyboard/gpio_keys.c
===================================================================
RCS file: /cvs/linux/kernel26/drivers/input/keyboard/gpio_keys.c,v
retrieving revision 1.15
diff -u -p -r1.15 gpio_keys.c
--- drivers/input/keyboard/gpio_keys.c	25 Feb 2007 15:26:10 -0000	1.15
+++ drivers/input/keyboard/gpio_keys.c	13 Apr 2007 21:07:03 -0000
@@ -39,7 +39,10 @@ static irqreturn_t gpio_keys_isr(int irq
 		if (irq == gpio_to_irq(gpio)) {
 			int state = (gpio_get_value(gpio) ? 1 : 0) ^ (pdata->buttons[i].active_low);
 
-			input_report_key(input, pdata->buttons[i].keycode, state);
+			if (pdata->buttons[i].type == EV_SW)
+				input_report_switch(input, pdata->buttons[i].keycode, state);
+			else
+				input_report_key(input, pdata->buttons[i].keycode, state);
 			input_sync(input);
 		}
 	}
@@ -84,7 +87,12 @@ static int __devinit gpio_keys_probe(str
 				irq, error);
 			goto fail;
 		}
-		set_bit(code, input->keybit);
+		if (pdata->buttons[i].type == EV_SW) {
+			input->evbit[0] |= BIT(EV_SW);
+			set_bit(code, input->swbit);
+		} else {
+			set_bit(code, input->keybit);
+		}
 	}
 
 	error = input_register_device(input);





Wednesday, April 11, 2007, 11:06:17 AM, you wrote:

> Hi Dmitry,

> Dmitry Torokhov  wrote / napísal(a):

[]

-- 
Best regards,
 Paul                            mailto:pmiscml@gmail.com

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] gpio_keys ev_sw support
  2007-04-13 21:13     ` Paul Sokolovsky
@ 2007-04-13 21:24       ` Dmitry Torokhov
  0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Torokhov @ 2007-04-13 21:24 UTC (permalink / raw)
  To: Paul Sokolovsky; +Cc: Roman Moravcik, linux-input, kernel-discuss

Hi Paul,

On 4/13/07, Paul Sokolovsky <pmiscml@gmail.com> wrote:
> Hello Dmitry,
>
>        I wonder if you're satisfied with Roman patch now. I guess it could just fall to the bottom of your queue due to bad formatting. So, here's resend, hopefully correct. One change is that we had to put "type" member to the end of struct gpio_keys_button, the reason is backwards compatibility. As you see, we'd like EV_KEY to be still default, and nay other type to be used only if explicitly specified. And as structure is already big, and there're usually several keys to define, we use positional initialization to save space:
>
>        { KEY_ENTER,    GPIO_NR_H4000_ACTION_BUTTON_N,  1, "Action button"      },
>
> So, putting type after keycode will break this, and moreover compiler issues only warning, so that may go unnoticed.
>

OK.

>
> Thanks,
> Paul
>
>
> -------------
> This patch adds switch event support to gpio_keys driver.
>
> Signed-off-by: Roman Moravcik <roman.moravcik@gmail.com>
> Signed-off-by: Paul Sokolovsky <pmiscml@gmail.com>
>
>
> Index: include/linux/gpio_keys.h
> ===================================================================
> RCS file: /cvs/linux/kernel26/include/linux/gpio_keys.h,v
> retrieving revision 1.1
> diff -u -p -r1.1 gpio_keys.h
> --- include/linux/gpio_keys.h   25 Feb 2007 15:21:52 -0000      1.1
> +++ include/linux/gpio_keys.h   13 Apr 2007 21:07:03 -0000
> @@ -6,6 +6,7 @@ struct gpio_keys_button {
>        int gpio;
>        int active_low;
>        char *desc;
> +       int type;
>  };
>
>  struct gpio_keys_platform_data {
> Index: drivers/input/keyboard/gpio_keys.c
> ===================================================================
> RCS file: /cvs/linux/kernel26/drivers/input/keyboard/gpio_keys.c,v
> retrieving revision 1.15
> diff -u -p -r1.15 gpio_keys.c
> --- drivers/input/keyboard/gpio_keys.c  25 Feb 2007 15:26:10 -0000      1.15
> +++ drivers/input/keyboard/gpio_keys.c  13 Apr 2007 21:07:03 -0000
> @@ -39,7 +39,10 @@ static irqreturn_t gpio_keys_isr(int irq
>                if (irq == gpio_to_irq(gpio)) {
>                        int state = (gpio_get_value(gpio) ? 1 : 0) ^ (pdata->buttons[i].active_low);
>
> -                       input_report_key(input, pdata->buttons[i].keycode, state);
> +                       if (pdata->buttons[i].type == EV_SW)
> +                               input_report_switch(input, pdata->buttons[i].keycode, state);
> +                       else
> +                               input_report_key(input, pdata->buttons[i].keycode, state);
>                        input_sync(input);
>                }
>        }
> @@ -84,7 +87,12 @@ static int __devinit gpio_keys_probe(str
>                                irq, error);
>                        goto fail;
>                }
> -               set_bit(code, input->keybit);
> +               if (pdata->buttons[i].type == EV_SW) {
> +                       input->evbit[0] |= BIT(EV_SW);
> +                       set_bit(code, input->swbit);
> +               } else {
> +                       set_bit(code, input->keybit);
> +               }
>        }

One thing that I was just going to write Roman about is that we need
to set EV_KEY in the same fashion we set EV_SW - conditionally, on a
slim chance there is a keymap with switches only. I will fix it up,
you don't need to resend.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2007-04-13 21:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-10 16:53 [PATCH] gpio_keys ev_sw support Roman Moravcik
2007-04-10 18:20 ` Dmitry Torokhov
2007-04-11  8:06   ` Roman Moravcik
2007-04-13 21:13     ` Paul Sokolovsky
2007-04-13 21:24       ` Dmitry Torokhov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).