Re: [PATCH v1] input: make use of the input_set_capability helper

From: Olliver Schinagl
Date: Wed Jan 07 2015 - 04:41:38 EST


HEy Dmitry,

On 07-01-15 09:26, Dmitry Torokhov wrote:
On Wed, Jan 07, 2015 at 09:19:28AM +0100, Olliver Schinagl wrote:
Hey Dmitry,

On 07-01-15 08:57, Dmitry Torokhov wrote:
Hi Olliver,

On Wed, Jan 07, 2015 at 08:31:06AM +0100, Olliver Schinagl wrote:
From: Olliver Schinagl <oliver@xxxxxxxxxxx>

Almost all of the speaker drivers under input manipulate the ev bits
directly, which is not needed, as there is a helper available.

This patch makes use of the helper for the speaker drivers.

Signed-off-by: Olliver Schinagl <oliver@xxxxxxxxxxx>
---
drivers/input/misc/cm109.c | 4 ++--
drivers/input/misc/ixp4xx-beeper.c | 5 ++---
drivers/input/misc/m68kspkr.c | 5 ++---
drivers/input/misc/pcspkr.c | 5 ++---
drivers/input/misc/pwm-beeper.c | 5 +----
drivers/input/misc/sparcspkr.c | 6 ++----
6 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c
index 9365535..8e41070 100644
--- a/drivers/input/misc/cm109.c
+++ b/drivers/input/misc/cm109.c
@@ -767,10 +767,10 @@ static int cm109_usb_probe(struct usb_interface *intf,
input_dev->keycodesize = sizeof(unsigned char);
input_dev->keycodemax = ARRAY_SIZE(dev->keymap);
- input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_SND);
- input_dev->sndbit[0] = BIT_MASK(SND_BELL) | BIT_MASK(SND_TONE);
+ input_set_capability(input_dev, EV_SND, SND_BELL | SND_TONE);
No, input_set_capability() takes single event code, not bitmask. The
fact that it works for these 2 values of SND events is pure coincidence
(the old code wasn't much better though).
Ah, not, it does not work at all. Instead of setting bits 1 and 2 your
code sets bit 3 in dev->sndbit.

What do you suggest we should do then? Fix input_set_capability to
take bit masks? or multiline events?
I'm not sure why __set_bits() wouldn't work for bitmasks, could you
educate me?
Call it once per event:

input_set_capability(input_dev, EV_SND, SND_BELL);
input_set_capability(input_dev, EV_SND, SND_TONE);
roger, done

/* register available key events */
+ input_dev->evbit[0] = BIT_MASK(EV_KEY);
Would prefer __set_bit(EV_KEY, input_dev->evbit); here instead.
I only moved the EV_KEY bit from above to its appropiate place here.
The original code was setting combination of bits; here we set single
one and __set_bit() is cleaner IMO.
The documentation contradicts this actually, it says to use set_bit() first, but favors the direct writing as above as it is 'shorter in some cases'.

Furthermore, I'm a little confused as what the purpose of input_set_capability() is, if we use set_bits (or __set_bits) here. It appears we use set_bits here because it is manipulating several entries in the array (well atleast index 0) and set_input_capability() doesn't handle arrays? But when I look at struct input_dev, all those entries are arrays, including sndbit. So we only use set_input_capabilities when manipulating index 0 when its the only one? Feels a little strange to me, but probably is my lack of knowledge herin, so appologies for that.

Olliver

I can change this one (and others) to use __set_bit() for now for
v2?
Yes, please.

Thanks.


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/