]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
Merge branch 'for-4.14/wacom' into for-linus
authorJiri Kosina <jkosina@suse.cz>
Tue, 5 Sep 2017 09:14:10 +0000 (11:14 +0200)
committerJiri Kosina <jkosina@suse.cz>
Tue, 5 Sep 2017 09:14:10 +0000 (11:14 +0200)
- name generation improvement for Wacom devices from Jason Gerecke
- Kconfig dependency fix for Wacom driver from Arnd Bergmann

drivers/hid/Kconfig
drivers/hid/i2c-hid/i2c-hid.c
drivers/hid/uhid.c
drivers/hid/usbhid/hid-core.c
drivers/hid/wacom_sys.c
include/linux/hid.h
net/bluetooth/hidp/core.c

index 3cd60f460b61201abcacb87a32f4c414ab9be4e8..0a3117cc29e70c54b3f9b269889d9b4ccf2fb56c 100644 (file)
@@ -924,7 +924,7 @@ config HID_UDRAW_PS3
 
 config HID_WACOM
        tristate "Wacom Intuos/Graphire tablet support (USB)"
-       depends on HID
+       depends on USB_HID
        select POWER_SUPPLY
        select NEW_LEDS
        select LEDS_CLASS
index 046f692fd0a2675ceb98f800b3e73f76e8da286b..77396145d2d093af60e44c825ffaabd25f9b68a1 100644 (file)
@@ -780,7 +780,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl)
        return 0;
 }
 
-static struct hid_ll_driver i2c_hid_ll_driver = {
+struct hid_ll_driver i2c_hid_ll_driver = {
        .parse = i2c_hid_parse,
        .start = i2c_hid_start,
        .stop = i2c_hid_stop,
@@ -790,6 +790,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = {
        .output_report = i2c_hid_output_report,
        .raw_request = i2c_hid_raw_request,
 };
+EXPORT_SYMBOL_GPL(i2c_hid_ll_driver);
 
 static int i2c_hid_init_irq(struct i2c_client *client)
 {
index 7f8ff39ed44bd7900f006956b001e57f93c22143..6f819f144cb4f063a4962a202dc8b472c921a235 100644 (file)
@@ -369,7 +369,7 @@ static int uhid_hid_output_report(struct hid_device *hid, __u8 *buf,
        return uhid_hid_output_raw(hid, buf, count, HID_OUTPUT_REPORT);
 }
 
-static struct hid_ll_driver uhid_hid_driver = {
+struct hid_ll_driver uhid_hid_driver = {
        .start = uhid_hid_start,
        .stop = uhid_hid_stop,
        .open = uhid_hid_open,
@@ -378,6 +378,7 @@ static struct hid_ll_driver uhid_hid_driver = {
        .raw_request = uhid_hid_raw_request,
        .output_report = uhid_hid_output_report,
 };
+EXPORT_SYMBOL_GPL(uhid_hid_driver);
 
 #ifdef CONFIG_COMPAT
 
index c008847e0b20a2accb00451b10fb1c648f67925b..089bad8a9a21d6b35742df8819fabb4da5036730 100644 (file)
@@ -1265,7 +1265,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle,
        return hid_set_idle(dev, ifnum, report, idle);
 }
 
-static struct hid_ll_driver usb_hid_driver = {
+struct hid_ll_driver usb_hid_driver = {
        .parse = usbhid_parse,
        .start = usbhid_start,
        .stop = usbhid_stop,
@@ -1278,6 +1278,7 @@ static struct hid_ll_driver usb_hid_driver = {
        .output_report = usbhid_output_report,
        .idle = usbhid_idle,
 };
+EXPORT_SYMBOL_GPL(usb_hid_driver);
 
 static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
index 838c1ebfffa9779d6f95128361249bb14deb0f7c..e82a696a1d07ca97df04371c00dc5dc95fbafec9 100644 (file)
@@ -1671,10 +1671,7 @@ static ssize_t wacom_show_remote_mode(struct kobject *kobj,
        u8 mode;
 
        mode = wacom->led.groups[index].select;
-       if (mode >= 0 && mode < 3)
-               return snprintf(buf, PAGE_SIZE, "%d\n", mode);
-       else
-               return snprintf(buf, PAGE_SIZE, "%d\n", -1);
+       return sprintf(buf, "%d\n", mode < 3 ? mode : -1);
 }
 
 #define DEVICE_EKR_ATTR_GROUP(SET_ID)                                  \
@@ -2028,41 +2025,37 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
 
        /* Generic devices name unspecified */
        if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
-               if (strstr(wacom->hdev->name, "Wacom") ||
-                   strstr(wacom->hdev->name, "wacom") ||
-                   strstr(wacom->hdev->name, "WACOM")) {
-                       /* name is in HID descriptor, use it */
-                       strlcpy(name, wacom->hdev->name, sizeof(name));
-
-                       /* strip out excess whitespaces */
-                       while (1) {
-                               char *gap = strstr(name, "  ");
-                               if (gap == NULL)
-                                       break;
-                               /* shift everything including the terminator */
-                               memmove(gap, gap+1, strlen(gap));
-                       }
+               char *product_name = wacom->hdev->name;
 
-                       /* strip off excessive prefixing */
-                       if (strstr(name, "Wacom Co.,Ltd. Wacom ") == name) {
-                               int n = strlen(name);
-                               int x = strlen("Wacom Co.,Ltd. ");
-                               memmove(name, name+x, n-x+1);
-                       }
-                       if (strstr(name, "Wacom Co., Ltd. Wacom ") == name) {
-                               int n = strlen(name);
-                               int x = strlen("Wacom Co., Ltd. ");
-                               memmove(name, name+x, n-x+1);
-                       }
+               if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) {
+                       struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);
+                       struct usb_device *dev = interface_to_usbdev(intf);
+                       product_name = dev->product;
+               }
 
-                       /* get rid of trailing whitespace */
-                       if (name[strlen(name)-1] == ' ')
-                               name[strlen(name)-1] = '\0';
+               if (wacom->hdev->bus == BUS_I2C) {
+                       snprintf(name, sizeof(name), "%s %X",
+                                features->name, wacom->hdev->product);
+               } else if (strstr(product_name, "Wacom") ||
+                          strstr(product_name, "wacom") ||
+                          strstr(product_name, "WACOM")) {
+                       strlcpy(name, product_name, sizeof(name));
                } else {
-                       /* no meaningful name retrieved. use product ID */
-                       snprintf(name, sizeof(name),
-                                "%s %X", features->name, wacom->hdev->product);
+                       snprintf(name, sizeof(name), "Wacom %s", product_name);
                }
+
+               /* strip out excess whitespaces */
+               while (1) {
+                       char *gap = strstr(name, "  ");
+                       if (gap == NULL)
+                               break;
+                       /* shift everything including the terminator */
+                       memmove(gap, gap+1, strlen(gap));
+               }
+
+               /* get rid of trailing whitespace */
+               if (name[strlen(name)-1] == ' ')
+                       name[strlen(name)-1] = '\0';
        } else {
                strlcpy(name, features->name, sizeof(name));
        }
index 26759920aa8ff95828ec0e75c5df7265c7635153..08ab9864d81e1c2e8bb252eeeae6d19493b62ae5 100644 (file)
@@ -780,6 +780,17 @@ struct hid_ll_driver {
        int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype);
 };
 
+extern struct hid_ll_driver i2c_hid_ll_driver;
+extern struct hid_ll_driver hidp_hid_driver;
+extern struct hid_ll_driver uhid_hid_driver;
+extern struct hid_ll_driver usb_hid_driver;
+
+static inline bool hid_is_using_ll_driver(struct hid_device *hdev,
+               struct hid_ll_driver *driver)
+{
+       return hdev->ll_driver == driver;
+}
+
 #define        PM_HINT_FULLON  1<<5
 #define PM_HINT_NORMAL 1<<1
 
index 002743ea509c2035f78212097bb00af2b0392d1c..8112893037bdc0afee1247dad7ac6433ac0168bb 100644 (file)
@@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid)
        hid->claimed = 0;
 }
 
-static struct hid_ll_driver hidp_hid_driver = {
+struct hid_ll_driver hidp_hid_driver = {
        .parse = hidp_parse,
        .start = hidp_start,
        .stop = hidp_stop,
@@ -743,6 +743,7 @@ static struct hid_ll_driver hidp_hid_driver = {
        .raw_request = hidp_raw_request,
        .output_report = hidp_output_report,
 };
+EXPORT_SYMBOL_GPL(hidp_hid_driver);
 
 /* This function sets up the hid device. It does not add it
    to the HID system. That is done in hidp_add_connection(). */