HID: wacom: Unify speed setting
authorPrzemo Firszt <przemo@firszt.eu>
Tue, 15 May 2012 18:32:28 +0000 (19:32 +0100)
committerJiri Kosina <jkosina@suse.cz>
Wed, 16 May 2012 19:42:16 +0000 (21:42 +0200)
This patch unifies speed setting for both supported tablets. Functionality
of "wacom_poke" (used only by Graphire) is now in "wacom_set_features".
Reporting speed for both tablets can be changed by somethinkg like:

echo 1 > /sys/class/bluetooth/hci0/hci0:1/{device No}/speed

Accepted values:
0 - low speed,
1 - high speed.

The way of changing reporting speed is the same for Graphire and Intuos4 WL.

Signed-off-by: Przemo Firszt <przemo@firszt.eu>
Acked-by: Ping Cheng <pingc@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/hid-wacom.c

index 5f6ce70..fe23a1e 100644 (file)
@@ -231,45 +231,12 @@ static int wacom_ac_get_property(struct power_supply *psy,
 static void wacom_set_features(struct hid_device *hdev, u8 speed)
 {
        struct wacom_data *wdata = hid_get_drvdata(hdev);
-       int ret;
-       __u8 rep_data[2];
-
-       if (speed == 1)
-               wdata->features &= ~0x20;
-       else
-               wdata->features |= 0x20;
-
-       rep_data[0] = 0x03;
-       rep_data[1] = wdata->features;
-
-       ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
-                               HID_FEATURE_REPORT);
-       if (ret >= 0)
-               wdata->high_speed = speed;
-
-       return;
-}
-
-static void wacom_poke(struct hid_device *hdev, u8 speed)
-{
-       struct wacom_data *wdata = hid_get_drvdata(hdev);
        int limit, ret;
-       char rep_data[2];
-
-       rep_data[0] = 0x03 ; rep_data[1] = 0x00;
-       limit = 3;
-       do {
-               ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
-                               HID_FEATURE_REPORT);
-       } while (ret < 0 && limit-- > 0);
-
-       if (ret >= 0) {
-               if (speed == 0)
-                       rep_data[0] = 0x05;
-               else
-                       rep_data[0] = 0x06;
+       __u8 rep_data[2];
 
-               rep_data[1] = 0x00;
+       switch (hdev->product) {
+       case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH:
+               rep_data[0] = 0x03 ; rep_data[1] = 0x00;
                limit = 3;
                do {
                        ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
@@ -277,17 +244,47 @@ static void wacom_poke(struct hid_device *hdev, u8 speed)
                } while (ret < 0 && limit-- > 0);
 
                if (ret >= 0) {
-                       wdata->high_speed = speed;
-                       return;
+                       if (speed == 0)
+                               rep_data[0] = 0x05;
+                       else
+                               rep_data[0] = 0x06;
+
+                       rep_data[1] = 0x00;
+                       limit = 3;
+                       do {
+                               ret = hdev->hid_output_raw_report(hdev,
+                                       rep_data, 2, HID_FEATURE_REPORT);
+                       } while (ret < 0 && limit-- > 0);
+
+                       if (ret >= 0) {
+                               wdata->high_speed = speed;
+                               return;
+                       }
                }
+
+               /*
+                * Note that if the raw queries fail, it's not a hard failure
+                * and it is safe to continue
+                */
+               hid_warn(hdev, "failed to poke device, command %d, err %d\n",
+                        rep_data[0], ret);
+               break;
+       case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH:
+               if (speed == 1)
+                       wdata->features &= ~0x20;
+               else
+                       wdata->features |= 0x20;
+
+               rep_data[0] = 0x03;
+               rep_data[1] = wdata->features;
+
+               ret = hdev->hid_output_raw_report(hdev, rep_data, 2,
+                                       HID_FEATURE_REPORT);
+               if (ret >= 0)
+                       wdata->high_speed = speed;
+               break;
        }
 
-       /*
-        * Note that if the raw queries fail, it's not a hard failure and it
-        * is safe to continue
-        */
-       hid_warn(hdev, "failed to poke device, command %d, err %d\n",
-                rep_data[0], ret);
        return;
 }
 
@@ -311,7 +308,7 @@ static ssize_t wacom_store_speed(struct device *dev,
                return -EINVAL;
 
        if (new_speed == 0 || new_speed == 1) {
-               wacom_poke(hdev, new_speed);
+               wacom_set_features(hdev, new_speed);
                return strnlen(buf, PAGE_SIZE);
        } else
                return -EINVAL;
@@ -720,22 +717,17 @@ static int wacom_probe(struct hid_device *hdev,
                hid_warn(hdev,
                         "can't create sysfs speed attribute err: %d\n", ret);
 
-       switch (hdev->product) {
-       case USB_DEVICE_ID_WACOM_GRAPHIRE_BLUETOOTH:
-               /* Set Wacom mode 2 with high reporting speed */
-               wacom_poke(hdev, 1);
-               break;
-       case USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH:
+       wdata->features = 0;
+       wacom_set_features(hdev, 1);
+
+       if (hdev->product == USB_DEVICE_ID_WACOM_INTUOS4_BLUETOOTH) {
                sprintf(hdev->name, "%s", "Wacom Intuos4 WL");
-               wdata->features = 0;
-               wacom_set_features(hdev, 1);
                ret = wacom_initialize_leds(hdev);
                if (ret) {
                        hid_warn(hdev,
                                 "can't create led attribute, err: %d\n", ret);
                        goto destroy_leds;
                }
-               break;
        }
 
        wdata->battery.properties = wacom_battery_props;