Commit de6c5070 authored by Jiri Kosina's avatar Jiri Kosina

Merge branch 'for-4.14/wacom' into for-linus

- name generation improvement for Wacom devices from Jason Gerecke
- Kconfig dependency fix for Wacom driver from Arnd Bergmann
parents 5c891d5e 9d14201c
...@@ -924,7 +924,7 @@ config HID_UDRAW_PS3 ...@@ -924,7 +924,7 @@ config HID_UDRAW_PS3
config HID_WACOM config HID_WACOM
tristate "Wacom Intuos/Graphire tablet support (USB)" tristate "Wacom Intuos/Graphire tablet support (USB)"
depends on HID depends on USB_HID
select POWER_SUPPLY select POWER_SUPPLY
select NEW_LEDS select NEW_LEDS
select LEDS_CLASS select LEDS_CLASS
......
...@@ -780,7 +780,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl) ...@@ -780,7 +780,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl)
return 0; return 0;
} }
static struct hid_ll_driver i2c_hid_ll_driver = { struct hid_ll_driver i2c_hid_ll_driver = {
.parse = i2c_hid_parse, .parse = i2c_hid_parse,
.start = i2c_hid_start, .start = i2c_hid_start,
.stop = i2c_hid_stop, .stop = i2c_hid_stop,
...@@ -790,6 +790,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = { ...@@ -790,6 +790,7 @@ static struct hid_ll_driver i2c_hid_ll_driver = {
.output_report = i2c_hid_output_report, .output_report = i2c_hid_output_report,
.raw_request = i2c_hid_raw_request, .raw_request = i2c_hid_raw_request,
}; };
EXPORT_SYMBOL_GPL(i2c_hid_ll_driver);
static int i2c_hid_init_irq(struct i2c_client *client) static int i2c_hid_init_irq(struct i2c_client *client)
{ {
......
...@@ -369,7 +369,7 @@ static int uhid_hid_output_report(struct hid_device *hid, __u8 *buf, ...@@ -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); 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, .start = uhid_hid_start,
.stop = uhid_hid_stop, .stop = uhid_hid_stop,
.open = uhid_hid_open, .open = uhid_hid_open,
...@@ -378,6 +378,7 @@ static struct hid_ll_driver uhid_hid_driver = { ...@@ -378,6 +378,7 @@ static struct hid_ll_driver uhid_hid_driver = {
.raw_request = uhid_hid_raw_request, .raw_request = uhid_hid_raw_request,
.output_report = uhid_hid_output_report, .output_report = uhid_hid_output_report,
}; };
EXPORT_SYMBOL_GPL(uhid_hid_driver);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
......
...@@ -1265,7 +1265,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle, ...@@ -1265,7 +1265,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle,
return hid_set_idle(dev, ifnum, report, 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, .parse = usbhid_parse,
.start = usbhid_start, .start = usbhid_start,
.stop = usbhid_stop, .stop = usbhid_stop,
...@@ -1278,6 +1278,7 @@ static struct hid_ll_driver usb_hid_driver = { ...@@ -1278,6 +1278,7 @@ static struct hid_ll_driver usb_hid_driver = {
.output_report = usbhid_output_report, .output_report = usbhid_output_report,
.idle = usbhid_idle, .idle = usbhid_idle,
}; };
EXPORT_SYMBOL_GPL(usb_hid_driver);
static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id) static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
{ {
......
...@@ -1671,10 +1671,7 @@ static ssize_t wacom_show_remote_mode(struct kobject *kobj, ...@@ -1671,10 +1671,7 @@ static ssize_t wacom_show_remote_mode(struct kobject *kobj,
u8 mode; u8 mode;
mode = wacom->led.groups[index].select; mode = wacom->led.groups[index].select;
if (mode >= 0 && mode < 3) return sprintf(buf, "%d\n", mode < 3 ? mode : -1);
return snprintf(buf, PAGE_SIZE, "%d\n", mode);
else
return snprintf(buf, PAGE_SIZE, "%d\n", -1);
} }
#define DEVICE_EKR_ATTR_GROUP(SET_ID) \ #define DEVICE_EKR_ATTR_GROUP(SET_ID) \
...@@ -2028,41 +2025,37 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix) ...@@ -2028,41 +2025,37 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
/* Generic devices name unspecified */ /* Generic devices name unspecified */
if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) { if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
if (strstr(wacom->hdev->name, "Wacom") || char *product_name = wacom->hdev->name;
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));
}
/* strip off excessive prefixing */ if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) {
if (strstr(name, "Wacom Co.,Ltd. Wacom ") == name) { struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);
int n = strlen(name); struct usb_device *dev = interface_to_usbdev(intf);
int x = strlen("Wacom Co.,Ltd. "); product_name = dev->product;
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);
}
/* get rid of trailing whitespace */ if (wacom->hdev->bus == BUS_I2C) {
if (name[strlen(name)-1] == ' ') snprintf(name, sizeof(name), "%s %X",
name[strlen(name)-1] = '\0'; 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 { } else {
/* no meaningful name retrieved. use product ID */ snprintf(name, sizeof(name), "Wacom %s", product_name);
snprintf(name, sizeof(name),
"%s %X", features->name, wacom->hdev->product);
} }
/* 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 { } else {
strlcpy(name, features->name, sizeof(name)); strlcpy(name, features->name, sizeof(name));
} }
......
...@@ -780,6 +780,17 @@ struct hid_ll_driver { ...@@ -780,6 +780,17 @@ struct hid_ll_driver {
int (*idle)(struct hid_device *hdev, int report, int idle, int reqtype); 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_FULLON 1<<5
#define PM_HINT_NORMAL 1<<1 #define PM_HINT_NORMAL 1<<1
......
...@@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid) ...@@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid)
hid->claimed = 0; hid->claimed = 0;
} }
static struct hid_ll_driver hidp_hid_driver = { struct hid_ll_driver hidp_hid_driver = {
.parse = hidp_parse, .parse = hidp_parse,
.start = hidp_start, .start = hidp_start,
.stop = hidp_stop, .stop = hidp_stop,
...@@ -743,6 +743,7 @@ static struct hid_ll_driver hidp_hid_driver = { ...@@ -743,6 +743,7 @@ static struct hid_ll_driver hidp_hid_driver = {
.raw_request = hidp_raw_request, .raw_request = hidp_raw_request,
.output_report = hidp_output_report, .output_report = hidp_output_report,
}; };
EXPORT_SYMBOL_GPL(hidp_hid_driver);
/* This function sets up the hid device. It does not add it /* This function sets up the hid device. It does not add it
to the HID system. That is done in hidp_add_connection(). */ to the HID system. That is done in hidp_add_connection(). */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment