All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Gerecke <killertofu@gmail.com>
To: linux-input@vger.kernel.org, Jiri Kosina <jikos@kernel.org>,
	Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com>,
	Ping Cheng <pinglinux@gmail.com>,
	Jason Gerecke <killertofu@gmail.com>,
	Jason Gerecke <jason.gerecke@wacom.com>
Subject: [PATCH] HID: Use per-transport helpers instead of hid_is_using_ll_driver
Date: Tue,  1 Aug 2017 14:45:46 -0700	[thread overview]
Message-ID: <20170801214546.12258-1-killertofu@gmail.com> (raw)

Users of the hid_is_using_ll_driver function introduced in fc2237a724 gain
a dependency on whatever transport(s) they need to check against, which can
lead to build errors if those dependencies are not properly dealt with. To
make this process less error-prone, replace the generic function with per-
transport helpers that transparently handle the dependencies.

Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
---
Jiri: Commit 9d14201c74 can be reverted if this proposal is acceptable.

 drivers/hid/i2c-hid/i2c-hid.c | 10 ++++++++--
 drivers/hid/uhid.c            |  9 +++++++--
 drivers/hid/usbhid/hid-core.c |  9 +++++++--
 drivers/hid/wacom_sys.c       |  2 +-
 include/linux/hid.h           | 40 +++++++++++++++++++++++++++++++++-------
 net/bluetooth/hidp/core.c     |  9 +++++++--
 6 files changed, 63 insertions(+), 16 deletions(-)

diff --git a/drivers/hid/i2c-hid/i2c-hid.c b/drivers/hid/i2c-hid/i2c-hid.c
index 77396145d2d0..e81aabd5b019 100644
--- a/drivers/hid/i2c-hid/i2c-hid.c
+++ b/drivers/hid/i2c-hid/i2c-hid.c
@@ -780,7 +780,7 @@ static int i2c_hid_power(struct hid_device *hid, int lvl)
 	return 0;
 }
 
-struct hid_ll_driver i2c_hid_ll_driver = {
+static struct hid_ll_driver i2c_hid_ll_driver = {
 	.parse = i2c_hid_parse,
 	.start = i2c_hid_start,
 	.stop = i2c_hid_stop,
@@ -790,7 +790,13 @@ struct hid_ll_driver i2c_hid_ll_driver = {
 	.output_report = i2c_hid_output_report,
 	.raw_request = i2c_hid_raw_request,
 };
-EXPORT_SYMBOL_GPL(i2c_hid_ll_driver);
+
+bool hid_is_using_i2c_driver(struct hid_device *hdev)
+{
+	return hdev->ll_driver == &i2c_hid_ll_driver;
+}
+EXPORT_SYMBOL_GPL(hid_is_using_i2c_driver);
+
 
 static int i2c_hid_init_irq(struct i2c_client *client)
 {
diff --git a/drivers/hid/uhid.c b/drivers/hid/uhid.c
index 6f819f144cb4..983b574f7f7b 100644
--- a/drivers/hid/uhid.c
+++ b/drivers/hid/uhid.c
@@ -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);
 }
 
-struct hid_ll_driver uhid_hid_driver = {
+static struct hid_ll_driver uhid_hid_driver = {
 	.start = uhid_hid_start,
 	.stop = uhid_hid_stop,
 	.open = uhid_hid_open,
@@ -378,7 +378,12 @@ struct hid_ll_driver uhid_hid_driver = {
 	.raw_request = uhid_hid_raw_request,
 	.output_report = uhid_hid_output_report,
 };
-EXPORT_SYMBOL_GPL(uhid_hid_driver);
+
+bool hid_is_using_uhid_driver(struct hid_device *hdev)
+{
+	return hdev->ll_driver == &uhid_hid_driver;
+}
+EXPORT_SYMBOL_GPL(hid_is_using_uhid_driver);
 
 #ifdef CONFIG_COMPAT
 
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index e1047ad0d59b..1a33d3db6658 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -1261,7 +1261,7 @@ static int usbhid_idle(struct hid_device *hid, int report, int idle,
 	return hid_set_idle(dev, ifnum, report, idle);
 }
 
-struct hid_ll_driver usb_hid_driver = {
+static struct hid_ll_driver usb_hid_driver = {
 	.parse = usbhid_parse,
 	.start = usbhid_start,
 	.stop = usbhid_stop,
@@ -1274,7 +1274,12 @@ struct hid_ll_driver usb_hid_driver = {
 	.output_report = usbhid_output_report,
 	.idle = usbhid_idle,
 };
-EXPORT_SYMBOL_GPL(usb_hid_driver);
+
+bool hid_is_using_usb_driver(struct hid_device *hdev)
+{
+	return hdev->ll_driver == &usb_hid_driver;
+}
+EXPORT_SYMBOL_GPL(hid_is_using_usb_driver);
 
 static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index e82a696a1d07..87f50bbfcb2f 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -2027,7 +2027,7 @@ static void wacom_update_name(struct wacom *wacom, const char *suffix)
 	if ((features->type == HID_GENERIC) && !strcmp("Wacom HID", features->name)) {
 		char *product_name = wacom->hdev->name;
 
-		if (hid_is_using_ll_driver(wacom->hdev, &usb_hid_driver)) {
+		if (hid_is_using_usb_driver(wacom->hdev)) {
 			struct usb_interface *intf = to_usb_interface(wacom->hdev->dev.parent);
 			struct usb_device *dev = interface_to_usbdev(intf);
 			product_name = dev->product;
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 3853408daf7f..178983df1096 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -777,16 +777,42 @@ struct hid_ll_driver {
 	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;
+#if IS_ENABLED(CONFIG_I2C_HID)
+extern bool hid_is_using_i2c_driver(struct hid_device *hdev);
+#else
+static inline bool hid_is_using_i2c_driver(struct hid_device *hdev)
+{
+	return false;
+}
+#endif
 
-static inline bool hid_is_using_ll_driver(struct hid_device *hdev,
-		struct hid_ll_driver *driver)
+#if IS_ENABLED(CONFIG_BT_HIDP)
+extern bool hid_is_using_hidp_driver(struct hid_device *hdev);
+#else
+static inline bool hid_is_using_hidp_driver(struct hid_device *hdev)
 {
-	return hdev->ll_driver == driver;
+	return false;
 }
+#endif
+
+#if IS_ENABLED(CONFIG_UHID)
+extern bool hid_is_using_uhid_driver(struct hid_device *hdev);
+#else
+static inline bool hid_is_using_uhid_driver(struct hid_device *hdev)
+{
+	return false;
+}
+#endif
+
+#if IS_ENABLED(CONFIG_USB_HID)
+extern bool hid_is_using_usb_driver(struct hid_device *hdev);
+#else
+static inline bool hid_is_using_usb_driver(struct hid_device *hdev)
+{
+	return false;
+}
+#endif
+
 
 #define	PM_HINT_FULLON	1<<5
 #define PM_HINT_NORMAL	1<<1
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
index 8112893037bd..c18e4b835ce9 100644
--- a/net/bluetooth/hidp/core.c
+++ b/net/bluetooth/hidp/core.c
@@ -734,7 +734,7 @@ static void hidp_stop(struct hid_device *hid)
 	hid->claimed = 0;
 }
 
-struct hid_ll_driver hidp_hid_driver = {
+static struct hid_ll_driver hidp_hid_driver = {
 	.parse = hidp_parse,
 	.start = hidp_start,
 	.stop = hidp_stop,
@@ -743,7 +743,12 @@ struct hid_ll_driver hidp_hid_driver = {
 	.raw_request = hidp_raw_request,
 	.output_report = hidp_output_report,
 };
-EXPORT_SYMBOL_GPL(hidp_hid_driver);
+
+bool hid_is_using_hidp_driver(struct hid_device *hdev)
+{
+	return hdev->ll_driver == &hidp_hid_driver;
+}
+EXPORT_SYMBOL_GPL(hid_is_using_hidp_driver);
 
 /* This function sets up the hid device. It does not add it
    to the HID system. That is done in hidp_add_connection(). */
-- 
2.13.3


                 reply	other threads:[~2017-08-01 21:47 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170801214546.12258-1-killertofu@gmail.com \
    --to=killertofu@gmail.com \
    --cc=arnd@arndb.de \
    --cc=benjamin.tissoires@redhat.com \
    --cc=jason.gerecke@wacom.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=pinglinux@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.