HID: cougar: make compare_device_paths reusable
The function compare_device_paths from wacom_sys.c is generic and useful for other drivers. Move the function to hid-core and rename it as hid_compare_device_paths. Signed-off-by: Daniel M. Lambea <dmlambea@gmail.com> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
092150a25c
commit
1a8861f117
@ -1939,6 +1939,29 @@ static int hid_bus_match(struct device *dev, struct device_driver *drv)
|
|||||||
return hid_match_device(hdev, hdrv) != NULL;
|
return hid_match_device(hdev, hdrv) != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hid_compare_device_paths - check if both devices share the same path
|
||||||
|
* @hdev_a: hid device
|
||||||
|
* @hdev_b: hid device
|
||||||
|
* @separator: char to use as separator
|
||||||
|
*
|
||||||
|
* Check if two devices share the same path up to the last occurrence of
|
||||||
|
* the separator char. Both paths must exist (i.e., zero-length paths
|
||||||
|
* don't match).
|
||||||
|
*/
|
||||||
|
bool hid_compare_device_paths(struct hid_device *hdev_a,
|
||||||
|
struct hid_device *hdev_b, char separator)
|
||||||
|
{
|
||||||
|
int n1 = strrchr(hdev_a->phys, separator) - hdev_a->phys;
|
||||||
|
int n2 = strrchr(hdev_b->phys, separator) - hdev_b->phys;
|
||||||
|
|
||||||
|
if (n1 != n2 || n1 <= 0 || n2 <= 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !strncmp(hdev_a->phys, hdev_b->phys, n1);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(hid_compare_device_paths);
|
||||||
|
|
||||||
static int hid_device_probe(struct device *dev)
|
static int hid_device_probe(struct device *dev)
|
||||||
{
|
{
|
||||||
struct hid_driver *hdrv = to_hid_driver(dev->driver);
|
struct hid_driver *hdrv = to_hid_driver(dev->driver);
|
||||||
|
@ -703,18 +703,6 @@ struct wacom_hdev_data {
|
|||||||
static LIST_HEAD(wacom_udev_list);
|
static LIST_HEAD(wacom_udev_list);
|
||||||
static DEFINE_MUTEX(wacom_udev_list_lock);
|
static DEFINE_MUTEX(wacom_udev_list_lock);
|
||||||
|
|
||||||
static bool compare_device_paths(struct hid_device *hdev_a,
|
|
||||||
struct hid_device *hdev_b, char separator)
|
|
||||||
{
|
|
||||||
int n1 = strrchr(hdev_a->phys, separator) - hdev_a->phys;
|
|
||||||
int n2 = strrchr(hdev_b->phys, separator) - hdev_b->phys;
|
|
||||||
|
|
||||||
if (n1 != n2 || n1 <= 0 || n2 <= 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return !strncmp(hdev_a->phys, hdev_b->phys, n1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wacom_are_sibling(struct hid_device *hdev,
|
static bool wacom_are_sibling(struct hid_device *hdev,
|
||||||
struct hid_device *sibling)
|
struct hid_device *sibling)
|
||||||
{
|
{
|
||||||
@ -737,10 +725,10 @@ static bool wacom_are_sibling(struct hid_device *hdev,
|
|||||||
* the same physical parent device path.
|
* the same physical parent device path.
|
||||||
*/
|
*/
|
||||||
if (hdev->vendor == sibling->vendor && hdev->product == sibling->product) {
|
if (hdev->vendor == sibling->vendor && hdev->product == sibling->product) {
|
||||||
if (!compare_device_paths(hdev, sibling, '/'))
|
if (!hid_compare_device_paths(hdev, sibling, '/'))
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
if (!compare_device_paths(hdev, sibling, '.'))
|
if (!hid_compare_device_paths(hdev, sibling, '.'))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -787,7 +775,7 @@ static struct wacom_hdev_data *wacom_get_hdev_data(struct hid_device *hdev)
|
|||||||
|
|
||||||
/* Try to find an already-probed interface from the same device */
|
/* Try to find an already-probed interface from the same device */
|
||||||
list_for_each_entry(data, &wacom_udev_list, list) {
|
list_for_each_entry(data, &wacom_udev_list, list) {
|
||||||
if (compare_device_paths(hdev, data->dev, '/')) {
|
if (hid_compare_device_paths(hdev, data->dev, '/')) {
|
||||||
kref_get(&data->kref);
|
kref_get(&data->kref);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -894,6 +894,8 @@ const struct hid_device_id *hid_match_id(const struct hid_device *hdev,
|
|||||||
const struct hid_device_id *id);
|
const struct hid_device_id *id);
|
||||||
const struct hid_device_id *hid_match_device(struct hid_device *hdev,
|
const struct hid_device_id *hid_match_device(struct hid_device *hdev,
|
||||||
struct hid_driver *hdrv);
|
struct hid_driver *hdrv);
|
||||||
|
bool hid_compare_device_paths(struct hid_device *hdev_a,
|
||||||
|
struct hid_device *hdev_b, char separator);
|
||||||
s32 hid_snto32(__u32 value, unsigned n);
|
s32 hid_snto32(__u32 value, unsigned n);
|
||||||
__u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
|
__u32 hid_field_extract(const struct hid_device *hid, __u8 *report,
|
||||||
unsigned offset, unsigned n);
|
unsigned offset, unsigned n);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user