mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-19 21:21:09 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
Pull HID fixes from Jiri Kosina: - resume timing fix for intel-ish driver (Ye Xiang) - fix for using incorrect MMIO register in amd_sfh driver (Dylan MacKenzie) - Cintiq 24HDT / 27QHDT regression fix and touch processing fix for Wacom driver (Jason Gerecke) - device removal bugfix for ft260 driver (Michael Zaidman) - other small assorted fixes * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid: HID: ft260: fix device removal due to USB disconnect HID: wacom: Skip processing of touches with negative slot values HID: wacom: Re-enable touch by default for Cintiq 24HDT / 27QHDT HID: Kconfig: Fix spelling mistake "Uninterruptable" -> "Uninterruptible" HID: apple: Add support for Keychron K1 wireless keyboard HID: fix typo in Kconfig HID: ft260: fix format type warning in ft260_word_show() HID: amd_sfh: Use correct MMIO register for DMA address HID: asus: Remove check for same LED brightness on set HID: intel-ish-hid: use async resume function
This commit is contained in:
commit
8723bc8fb3
11 changed files with 57 additions and 33 deletions
|
@ -576,7 +576,7 @@ config HID_LOGITECH_HIDPP
|
||||||
depends on HID_LOGITECH
|
depends on HID_LOGITECH
|
||||||
select POWER_SUPPLY
|
select POWER_SUPPLY
|
||||||
help
|
help
|
||||||
Support for Logitech devices relyingon the HID++ Logitech specification
|
Support for Logitech devices relying on the HID++ Logitech specification
|
||||||
|
|
||||||
Say Y if you want support for Logitech devices relying on the HID++
|
Say Y if you want support for Logitech devices relying on the HID++
|
||||||
specification. Such devices are the various Logitech Touchpads (T650,
|
specification. Such devices are the various Logitech Touchpads (T650,
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void amd_stop_sensor_v2(struct amd_mp2_dev *privdata, u16 sensor_idx)
|
||||||
cmd_base.cmd_v2.sensor_id = sensor_idx;
|
cmd_base.cmd_v2.sensor_id = sensor_idx;
|
||||||
cmd_base.cmd_v2.length = 16;
|
cmd_base.cmd_v2.length = 16;
|
||||||
|
|
||||||
writeq(0x0, privdata->mmio + AMD_C2P_MSG2);
|
writeq(0x0, privdata->mmio + AMD_C2P_MSG1);
|
||||||
writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
|
writel(cmd_base.ul, privdata->mmio + AMD_C2P_MSG0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -501,6 +501,8 @@ static const struct hid_device_id apple_devices[] = {
|
||||||
APPLE_RDESC_JIS },
|
APPLE_RDESC_JIS },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI),
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI),
|
||||||
.driver_data = APPLE_HAS_FN },
|
.driver_data = APPLE_HAS_FN },
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ANSI),
|
||||||
|
.driver_data = APPLE_HAS_FN },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
|
{ HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
|
||||||
.driver_data = APPLE_HAS_FN },
|
.driver_data = APPLE_HAS_FN },
|
||||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_REVB_ISO),
|
||||||
|
|
|
@ -485,9 +485,6 @@ static void asus_kbd_backlight_set(struct led_classdev *led_cdev,
|
||||||
{
|
{
|
||||||
struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds,
|
struct asus_kbd_leds *led = container_of(led_cdev, struct asus_kbd_leds,
|
||||||
cdev);
|
cdev);
|
||||||
if (led->brightness == brightness)
|
|
||||||
return;
|
|
||||||
|
|
||||||
led->brightness = brightness;
|
led->brightness = brightness;
|
||||||
schedule_work(&led->work);
|
schedule_work(&led->work);
|
||||||
}
|
}
|
||||||
|
|
|
@ -742,7 +742,7 @@ static int ft260_is_interface_enabled(struct hid_device *hdev)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = ft260_get_system_config(hdev, &cfg);
|
ret = ft260_get_system_config(hdev, &cfg);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ft260_dbg("interface: 0x%02x\n", interface);
|
ft260_dbg("interface: 0x%02x\n", interface);
|
||||||
|
@ -754,23 +754,16 @@ static int ft260_is_interface_enabled(struct hid_device *hdev)
|
||||||
switch (cfg.chip_mode) {
|
switch (cfg.chip_mode) {
|
||||||
case FT260_MODE_ALL:
|
case FT260_MODE_ALL:
|
||||||
case FT260_MODE_BOTH:
|
case FT260_MODE_BOTH:
|
||||||
if (interface == 1) {
|
if (interface == 1)
|
||||||
hid_info(hdev, "uart interface is not supported\n");
|
hid_info(hdev, "uart interface is not supported\n");
|
||||||
return 0;
|
else
|
||||||
}
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
break;
|
break;
|
||||||
case FT260_MODE_UART:
|
case FT260_MODE_UART:
|
||||||
if (interface == 0) {
|
hid_info(hdev, "uart interface is not supported\n");
|
||||||
hid_info(hdev, "uart is unsupported on interface 0\n");
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case FT260_MODE_I2C:
|
case FT260_MODE_I2C:
|
||||||
if (interface == 1) {
|
ret = 1;
|
||||||
hid_info(hdev, "i2c is unsupported on interface 1\n");
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -785,7 +778,7 @@ static int ft260_byte_show(struct hid_device *hdev, int id, u8 *cfg, int len,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return scnprintf(buf, PAGE_SIZE, "%hi\n", *field);
|
return scnprintf(buf, PAGE_SIZE, "%d\n", *field);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ft260_word_show(struct hid_device *hdev, int id, u8 *cfg, int len,
|
static int ft260_word_show(struct hid_device *hdev, int id, u8 *cfg, int len,
|
||||||
|
@ -797,7 +790,7 @@ static int ft260_word_show(struct hid_device *hdev, int id, u8 *cfg, int len,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
return scnprintf(buf, PAGE_SIZE, "%hi\n", le16_to_cpu(*field));
|
return scnprintf(buf, PAGE_SIZE, "%d\n", le16_to_cpu(*field));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FT260_ATTR_SHOW(name, reptype, id, type, func) \
|
#define FT260_ATTR_SHOW(name, reptype, id, type, func) \
|
||||||
|
@ -1004,11 +997,9 @@ err_hid_stop:
|
||||||
|
|
||||||
static void ft260_remove(struct hid_device *hdev)
|
static void ft260_remove(struct hid_device *hdev)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
struct ft260_device *dev = hid_get_drvdata(hdev);
|
struct ft260_device *dev = hid_get_drvdata(hdev);
|
||||||
|
|
||||||
ret = ft260_is_interface_enabled(hdev);
|
if (!dev)
|
||||||
if (ret <= 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sysfs_remove_group(&hdev->dev.kobj, &ft260_attr_group);
|
sysfs_remove_group(&hdev->dev.kobj, &ft260_attr_group);
|
||||||
|
|
|
@ -784,6 +784,17 @@ static void hid_ishtp_cl_reset_handler(struct work_struct *work)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hid_ishtp_cl_resume_handler(struct work_struct *work)
|
||||||
|
{
|
||||||
|
struct ishtp_cl_data *client_data = container_of(work, struct ishtp_cl_data, resume_work);
|
||||||
|
struct ishtp_cl *hid_ishtp_cl = client_data->hid_ishtp_cl;
|
||||||
|
|
||||||
|
if (ishtp_wait_resume(ishtp_get_ishtp_device(hid_ishtp_cl))) {
|
||||||
|
client_data->suspended = false;
|
||||||
|
wake_up_interruptible(&client_data->ishtp_resume_wait);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ishtp_print_log ishtp_hid_print_trace;
|
ishtp_print_log ishtp_hid_print_trace;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -822,6 +833,8 @@ static int hid_ishtp_cl_probe(struct ishtp_cl_device *cl_device)
|
||||||
init_waitqueue_head(&client_data->ishtp_resume_wait);
|
init_waitqueue_head(&client_data->ishtp_resume_wait);
|
||||||
|
|
||||||
INIT_WORK(&client_data->work, hid_ishtp_cl_reset_handler);
|
INIT_WORK(&client_data->work, hid_ishtp_cl_reset_handler);
|
||||||
|
INIT_WORK(&client_data->resume_work, hid_ishtp_cl_resume_handler);
|
||||||
|
|
||||||
|
|
||||||
ishtp_hid_print_trace = ishtp_trace_callback(cl_device);
|
ishtp_hid_print_trace = ishtp_trace_callback(cl_device);
|
||||||
|
|
||||||
|
@ -921,7 +934,7 @@ static int hid_ishtp_cl_resume(struct device *device)
|
||||||
|
|
||||||
hid_ishtp_trace(client_data, "%s hid_ishtp_cl %p\n", __func__,
|
hid_ishtp_trace(client_data, "%s hid_ishtp_cl %p\n", __func__,
|
||||||
hid_ishtp_cl);
|
hid_ishtp_cl);
|
||||||
client_data->suspended = false;
|
schedule_work(&client_data->resume_work);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,7 @@ struct ishtp_cl_data {
|
||||||
int multi_packet_cnt;
|
int multi_packet_cnt;
|
||||||
|
|
||||||
struct work_struct work;
|
struct work_struct work;
|
||||||
|
struct work_struct resume_work;
|
||||||
struct ishtp_cl_device *cl_device;
|
struct ishtp_cl_device *cl_device;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -314,13 +314,6 @@ static int ishtp_cl_device_resume(struct device *dev)
|
||||||
if (!device)
|
if (!device)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
|
||||||
* When ISH needs hard reset, it is done asynchrnously, hence bus
|
|
||||||
* resume will be called before full ISH resume
|
|
||||||
*/
|
|
||||||
if (device->ishtp_dev->resume_flag)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
driver = to_ishtp_cl_driver(dev->driver);
|
driver = to_ishtp_cl_driver(dev->driver);
|
||||||
if (driver && driver->driver.pm) {
|
if (driver && driver->driver.pm) {
|
||||||
if (driver->driver.pm->resume)
|
if (driver->driver.pm->resume)
|
||||||
|
@ -849,6 +842,28 @@ struct device *ishtp_device(struct ishtp_cl_device *device)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ishtp_device);
|
EXPORT_SYMBOL(ishtp_device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ishtp_wait_resume() - Wait for IPC resume
|
||||||
|
*
|
||||||
|
* Wait for IPC resume
|
||||||
|
*
|
||||||
|
* Return: resume complete or not
|
||||||
|
*/
|
||||||
|
bool ishtp_wait_resume(struct ishtp_device *dev)
|
||||||
|
{
|
||||||
|
/* 50ms to get resume response */
|
||||||
|
#define WAIT_FOR_RESUME_ACK_MS 50
|
||||||
|
|
||||||
|
/* Waiting to get resume response */
|
||||||
|
if (dev->resume_flag)
|
||||||
|
wait_event_interruptible_timeout(dev->resume_wait,
|
||||||
|
!dev->resume_flag,
|
||||||
|
msecs_to_jiffies(WAIT_FOR_RESUME_ACK_MS));
|
||||||
|
|
||||||
|
return (!dev->resume_flag);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ishtp_wait_resume);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ishtp_get_pci_device() - Return PCI device dev pointer
|
* ishtp_get_pci_device() - Return PCI device dev pointer
|
||||||
* This interface is used to return PCI device pointer
|
* This interface is used to return PCI device pointer
|
||||||
|
|
|
@ -38,7 +38,7 @@ config USB_HIDDEV
|
||||||
help
|
help
|
||||||
Say Y here if you want to support HID devices (from the USB
|
Say Y here if you want to support HID devices (from the USB
|
||||||
specification standpoint) that aren't strictly user interface
|
specification standpoint) that aren't strictly user interface
|
||||||
devices, like monitor controls and Uninterruptable Power Supplies.
|
devices, like monitor controls and Uninterruptible Power Supplies.
|
||||||
|
|
||||||
This module supports these devices separately using a separate
|
This module supports these devices separately using a separate
|
||||||
event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
|
event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
|
||||||
|
|
|
@ -2548,6 +2548,9 @@ static void wacom_wac_finger_slot(struct wacom_wac *wacom_wac,
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
slot = input_mt_get_slot_by_key(input, hid_data->id);
|
slot = input_mt_get_slot_by_key(input, hid_data->id);
|
||||||
|
if (slot < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
input_mt_slot(input, slot);
|
input_mt_slot(input, slot);
|
||||||
input_mt_report_slot_state(input, MT_TOOL_FINGER, prox);
|
input_mt_report_slot_state(input, MT_TOOL_FINGER, prox);
|
||||||
}
|
}
|
||||||
|
@ -3831,7 +3834,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev,
|
||||||
wacom_wac->shared->touch->product == 0xF6) {
|
wacom_wac->shared->touch->product == 0xF6) {
|
||||||
input_dev->evbit[0] |= BIT_MASK(EV_SW);
|
input_dev->evbit[0] |= BIT_MASK(EV_SW);
|
||||||
__set_bit(SW_MUTE_DEVICE, input_dev->swbit);
|
__set_bit(SW_MUTE_DEVICE, input_dev->swbit);
|
||||||
wacom_wac->shared->has_mute_touch_switch = true;
|
wacom_wac->has_mute_touch_switch = true;
|
||||||
}
|
}
|
||||||
fallthrough;
|
fallthrough;
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,8 @@ int ishtp_register_event_cb(struct ishtp_cl_device *device,
|
||||||
|
|
||||||
/* Get the device * from ishtp device instance */
|
/* Get the device * from ishtp device instance */
|
||||||
struct device *ishtp_device(struct ishtp_cl_device *cl_device);
|
struct device *ishtp_device(struct ishtp_cl_device *cl_device);
|
||||||
|
/* wait for IPC resume */
|
||||||
|
bool ishtp_wait_resume(struct ishtp_device *dev);
|
||||||
/* Trace interface for clients */
|
/* Trace interface for clients */
|
||||||
ishtp_print_log ishtp_trace_callback(struct ishtp_cl_device *cl_device);
|
ishtp_print_log ishtp_trace_callback(struct ishtp_cl_device *cl_device);
|
||||||
/* Get device pointer of PCI device for DMA acces */
|
/* Get device pointer of PCI device for DMA acces */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue