[PATCH v4 07/13] Input: joystick - Replace open-coded parity calculation with parity_odd()

From: Kuan-Wei Chiu
Date: Wed Apr 09 2025 - 11:50:51 EST


Refactor parity calculations to use the standard parity_odd() helper.
This change eliminates redundant implementations.

Co-developed-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx>
Signed-off-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx>
Signed-off-by: Kuan-Wei Chiu <visitorckw@xxxxxxxxx>
---
drivers/input/joystick/grip_mp.c | 17 ++---------------
drivers/input/joystick/sidewinder.c | 25 +++++--------------------
2 files changed, 7 insertions(+), 35 deletions(-)

diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c
index 5eadb5a3ca37..e7f60a83a89b 100644
--- a/drivers/input/joystick/grip_mp.c
+++ b/drivers/input/joystick/grip_mp.c
@@ -18,6 +18,7 @@
#include <linux/delay.h>
#include <linux/proc_fs.h>
#include <linux/jiffies.h>
+#include <linux/bitops.h>

#define DRIVER_DESC "Gravis Grip Multiport driver"

@@ -112,20 +113,6 @@ static const int axis_map[] = { 5, 9, 1, 5, 6, 10, 2, 6, 4, 8, 0, 4, 5, 9, 1, 5

static int register_slot(int i, struct grip_mp *grip);

-/*
- * Returns whether an odd or even number of bits are on in pkt.
- */
-
-static int bit_parity(u32 pkt)
-{
- int x = pkt ^ (pkt >> 16);
- x ^= x >> 8;
- x ^= x >> 4;
- x ^= x >> 2;
- x ^= x >> 1;
- return x & 1;
-}
-
/*
* Poll gameport; return true if all bits set in 'onbits' are on and
* all bits set in 'offbits' are off.
@@ -236,7 +223,7 @@ static int mp_io(struct gameport* gameport, int sendflags, int sendcode, u32 *pa
pkt = (pkt >> 2) | 0xf0000000;
}

- if (bit_parity(pkt) == 1)
+ if (parity_odd(pkt))
return IO_RESET;

/* Acknowledge packet receipt */
diff --git a/drivers/input/joystick/sidewinder.c b/drivers/input/joystick/sidewinder.c
index 3a5873e5fcb3..fb6f7004a485 100644
--- a/drivers/input/joystick/sidewinder.c
+++ b/drivers/input/joystick/sidewinder.c
@@ -7,6 +7,7 @@
* Microsoft SideWinder joystick family driver for Linux
*/

+#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <linux/module.h>
@@ -240,22 +241,6 @@ static void sw_init_digital(struct gameport *gameport)
local_irq_restore(flags);
}

-/*
- * sw_parity() computes parity of __u64
- */
-
-static int sw_parity(__u64 t)
-{
- int x = t ^ (t >> 32);
-
- x ^= x >> 16;
- x ^= x >> 8;
- x ^= x >> 4;
- x ^= x >> 2;
- x ^= x >> 1;
- return x & 1;
-}
-
/*
* sw_ccheck() checks synchronization bits and computes checksum of nibbles.
*/
@@ -316,7 +301,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)

for (i = 0; i < sw->number; i ++) {

- if (sw_parity(GB(i*15,15)))
+ if (parity_odd(GB(i*15,15)))
return -1;

input_report_abs(sw->dev[i], ABS_X, GB(i*15+3,1) - GB(i*15+2,1));
@@ -333,7 +318,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)
case SW_ID_PP:
case SW_ID_FFP:

- if (!sw_parity(GB(0,48)) || (hat = GB(42,4)) > 8)
+ if (!parity_odd(GB(0,48)) || (hat = GB(42,4)) > 8)
return -1;

dev = sw->dev[0];
@@ -354,7 +339,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)

case SW_ID_FSP:

- if (!sw_parity(GB(0,43)) || (hat = GB(28,4)) > 8)
+ if (!parity_odd(GB(0,43)) || (hat = GB(28,4)) > 8)
return -1;

dev = sw->dev[0];
@@ -379,7 +364,7 @@ static int sw_parse(unsigned char *buf, struct sw *sw)

case SW_ID_FFW:

- if (!sw_parity(GB(0,33)))
+ if (!parity_odd(GB(0,33)))
return -1;

dev = sw->dev[0];
--
2.34.1