summaryrefslogtreecommitdiff
path: root/drivers/usb/hid-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/hid-input.c')
-rw-r--r--drivers/usb/hid-input.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/usb/hid-input.c b/drivers/usb/hid-input.c
index 1747095edc56..2533c3e031d8 100644
--- a/drivers/usb/hid-input.c
+++ b/drivers/usb/hid-input.c
@@ -131,7 +131,8 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
if (usage->hid == HID_GD_HATSWITCH) {
usage->code = ABS_HAT0X;
- usage->hat = 1 + (field->logical_maximum == 4);
+ usage->hat_min = field->logical_minimum;
+ usage->hat_max = field->logical_maximum;
}
break;
@@ -285,7 +286,7 @@ static void hidinput_configure_usage(struct hid_device *device, struct hid_field
input->absflat[usage->code] = (b - a) >> 4;
}
- if (usage->hat) {
+ if (usage->hat_min != usage->hat_max) {
int i;
for (i = usage->code; i < usage->code + 2 && i <= max; i++) {
input->absmax[i] = 1;
@@ -302,9 +303,9 @@ void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct
struct input_dev *input = &hid->input;
int *quirks = &hid->quirks;
- if (usage->hat) {
- if (usage->hat == 2) value = value * 2;
- if (value > 8) value = 8;
+ if (usage->hat_min != usage->hat_max) {
+ value = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1;
+ if (value < 0 || value > 8) value = 0;
input_event(input, usage->type, usage->code , hid_hat_to_axis[value].x);
input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[value].y);
return;