Merge branches 'for-4.13/multitouch', 'for-4.13/retrode', 'for-4.13/transport-open-close-consolidation', 'for-4.13/upstream' and 'for-4.13/wacom' into for-linus
This commit is contained in:
@@ -1070,7 +1070,7 @@ static s32 snto32(__u32 value, unsigned n)
|
||||
case 16: return ((__s16)value);
|
||||
case 32: return ((__s32)value);
|
||||
}
|
||||
return value & (1 << (n - 1)) ? value | (-1 << n) : value;
|
||||
return value & (1 << (n - 1)) ? value | (~0U << n) : value;
|
||||
}
|
||||
|
||||
s32 hid_snto32(__u32 value, unsigned n)
|
||||
@@ -1774,6 +1774,94 @@ void hid_disconnect(struct hid_device *hdev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_disconnect);
|
||||
|
||||
/**
|
||||
* hid_hw_start - start underlying HW
|
||||
* @hdev: hid device
|
||||
* @connect_mask: which outputs to connect, see HID_CONNECT_*
|
||||
*
|
||||
* Call this in probe function *after* hid_parse. This will setup HW
|
||||
* buffers and start the device (if not defeirred to device open).
|
||||
* hid_hw_stop must be called if this was successful.
|
||||
*/
|
||||
int hid_hw_start(struct hid_device *hdev, unsigned int connect_mask)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = hdev->ll_driver->start(hdev);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
if (connect_mask) {
|
||||
error = hid_connect(hdev, connect_mask);
|
||||
if (error) {
|
||||
hdev->ll_driver->stop(hdev);
|
||||
return error;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_hw_start);
|
||||
|
||||
/**
|
||||
* hid_hw_stop - stop underlying HW
|
||||
* @hdev: hid device
|
||||
*
|
||||
* This is usually called from remove function or from probe when something
|
||||
* failed and hid_hw_start was called already.
|
||||
*/
|
||||
void hid_hw_stop(struct hid_device *hdev)
|
||||
{
|
||||
hid_disconnect(hdev);
|
||||
hdev->ll_driver->stop(hdev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_hw_stop);
|
||||
|
||||
/**
|
||||
* hid_hw_open - signal underlying HW to start delivering events
|
||||
* @hdev: hid device
|
||||
*
|
||||
* Tell underlying HW to start delivering events from the device.
|
||||
* This function should be called sometime after successful call
|
||||
* to hid_hiw_start().
|
||||
*/
|
||||
int hid_hw_open(struct hid_device *hdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mutex_lock_killable(&hdev->ll_open_lock);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!hdev->ll_open_count++) {
|
||||
ret = hdev->ll_driver->open(hdev);
|
||||
if (ret)
|
||||
hdev->ll_open_count--;
|
||||
}
|
||||
|
||||
mutex_unlock(&hdev->ll_open_lock);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_hw_open);
|
||||
|
||||
/**
|
||||
* hid_hw_close - signal underlaying HW to stop delivering events
|
||||
*
|
||||
* @hdev: hid device
|
||||
*
|
||||
* This function indicates that we are not interested in the events
|
||||
* from this device anymore. Delivery of events may or may not stop,
|
||||
* depending on the number of users still outstanding.
|
||||
*/
|
||||
void hid_hw_close(struct hid_device *hdev)
|
||||
{
|
||||
mutex_lock(&hdev->ll_open_lock);
|
||||
if (!--hdev->ll_open_count)
|
||||
hdev->ll_driver->close(hdev);
|
||||
mutex_unlock(&hdev->ll_open_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hid_hw_close);
|
||||
|
||||
/*
|
||||
* A list of devices for which there is a specialized driver on HID bus.
|
||||
*
|
||||
@@ -2155,6 +2243,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
#if IS_ENABLED(CONFIG_HID_PRODIKEYS)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_RETRODE)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_FUTURE_TECHNOLOGY, USB_DEVICE_ID_RETRODE2) },
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_HID_RMI)
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_COVER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_RAZER, USB_DEVICE_ID_RAZER_BLADE_14) },
|
||||
@@ -2911,6 +3002,7 @@ struct hid_device *hid_allocate_device(void)
|
||||
spin_lock_init(&hdev->debug_list_lock);
|
||||
sema_init(&hdev->driver_lock, 1);
|
||||
sema_init(&hdev->driver_input_lock, 1);
|
||||
mutex_init(&hdev->ll_open_lock);
|
||||
|
||||
return hdev;
|
||||
}
|
||||
|
Reference in New Issue
Block a user