diff options
Diffstat (limited to 'drivers/input/joystick/spaceball.c')
| -rw-r--r-- | drivers/input/joystick/spaceball.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index 429411c6c0a8..a85a4f33aea8 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c @@ -19,6 +19,7 @@  #include <linux/module.h>  #include <linux/input.h>  #include <linux/serio.h> +#include <asm/unaligned.h>  #define DRIVER_DESC	"SpaceTec SpaceBall 2003/3003/4000 FLX driver" @@ -75,9 +76,15 @@ static void spaceball_process_packet(struct spaceball* spaceball)  		case 'D':					/* Ball data */  			if (spaceball->idx != 15) return; -			for (i = 0; i < 6; i++) +			/* +			 * Skip first three bytes; read six axes worth of data. +			 * Axis values are signed 16-bit big-endian. +			 */ +			data += 3; +			for (i = 0; i < ARRAY_SIZE(spaceball_axes); i++) {  				input_report_abs(dev, spaceball_axes[i], -					(__s16)((data[2 * i + 3] << 8) | data[2 * i + 2])); +					(__s16)get_unaligned_be16(&data[i * 2])); +			}  			break;  		case 'K':					/* Button data */ |