Commit 1a8861f1 authored by Daniel M. Lambea's avatar Daniel M. Lambea Committed by Jiri Kosina

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: default avatarDaniel M. Lambea <dmlambea@gmail.com>
Reviewed-by: default avatarBenjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 092150a2
...@@ -1939,6 +1939,29 @@ static int hid_bus_match(struct device *dev, struct device_driver *drv) ...@@ -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 { ...@@ -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, ...@@ -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) ...@@ -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, ...@@ -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);
......
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