diff mbox series

HID: uclogic: avoid linking common code into multiple modules

Message ID 20240529094816.1859073-1-arnd@kernel.org (mailing list archive)
State New
Delegated to: Jiri Kosina
Headers show
Series HID: uclogic: avoid linking common code into multiple modules | expand

Commit Message

Arnd Bergmann May 29, 2024, 9:48 a.m. UTC
From: Arnd Bergmann <arnd@arndb.de>

The hid-uclogic-params.o and hid-uclogic-rdesc.o files are linked
into both the driver module and the unit test, which triggers a
W=1 warning:

scripts/Makefile.build:236: drivers/hid/Makefile: hid-uclogic-rdesc.o is added to multiple modules: hid-uclogic hid-uclogic-test
scripts/Makefile.build:236: drivers/hid/Makefile: hid-uclogic-params.o is added to multiple modules: hid-uclogic hid-uclogic-test

Avoids this by moving these two files into a separate module
that is used by the driver and the unit test.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
I have made patches for all such warnings in the tree, this is one I'm not
sure about, maybe there is a better fix.
---
 drivers/hid/Makefile             | 12 ++----
 drivers/hid/hid-uclogic-params.c |  8 ++++
 drivers/hid/hid-uclogic-rdesc.c  | 72 ++++++++++++++++++++++++++++++++
 3 files changed, 84 insertions(+), 8 deletions(-)

Comments

José Expósito June 8, 2024, 6:28 p.m. UTC | #1
Hi Arnd,

On Wed, May 29, 2024 at 11:48:05AM +0200, Arnd Bergmann wrote:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The hid-uclogic-params.o and hid-uclogic-rdesc.o files are linked
> into both the driver module and the unit test, which triggers a
> W=1 warning:
> 
> scripts/Makefile.build:236: drivers/hid/Makefile: hid-uclogic-rdesc.o is added to multiple modules: hid-uclogic hid-uclogic-test
> scripts/Makefile.build:236: drivers/hid/Makefile: hid-uclogic-params.o is added to multiple modules: hid-uclogic hid-uclogic-test
> 
> Avoids this by moving these two files into a separate module
> that is used by the driver and the unit test.
> 
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> ---
> I have made patches for all such warnings in the tree, this is one I'm not
> sure about, maybe there is a better fix.
> ---
>  drivers/hid/Makefile             | 12 ++----
>  drivers/hid/hid-uclogic-params.c |  8 ++++
>  drivers/hid/hid-uclogic-rdesc.c  | 72 ++++++++++++++++++++++++++++++++
>  3 files changed, 84 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index ce71b53ea6c5..864dfbae8ace 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -133,10 +133,8 @@ obj-$(CONFIG_HID_TOPSEED)	+= hid-topseed.o
>  obj-$(CONFIG_HID_TOPRE)	+= hid-topre.o
>  obj-$(CONFIG_HID_TWINHAN)	+= hid-twinhan.o
>  obj-$(CONFIG_HID_U2FZERO)	+= hid-u2fzero.o
> -hid-uclogic-objs		:= hid-uclogic-core.o \
> -				   hid-uclogic-rdesc.o \
> -				   hid-uclogic-params.o
> -obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
> +hid-uclogic-objs		:= hid-uclogic-core.o
> +obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o hid-uclogic-rdesc.o hid-uclogic-params.o
>  obj-$(CONFIG_HID_UDRAW_PS3)	+= hid-udraw-ps3.o
>  obj-$(CONFIG_HID_LED)		+= hid-led.o
>  obj-$(CONFIG_HID_XIAOMI)	+= hid-xiaomi.o
> @@ -154,10 +152,8 @@ obj-$(CONFIG_HID_WINWING)	+= hid-winwing.o
>  obj-$(CONFIG_HID_SENSOR_HUB)	+= hid-sensor-hub.o
>  obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR)	+= hid-sensor-custom.o
>  
> -hid-uclogic-test-objs		:= hid-uclogic-rdesc.o \
> -				   hid-uclogic-params.o \
> -				   hid-uclogic-rdesc-test.o
> -obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o
> +hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
> +obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o hid-uclogic-params.o hid-uclogic-params.o
>  
>  obj-$(CONFIG_USB_HID)		+= usbhid/
>  obj-$(CONFIG_USB_MOUSE)		+= usbhid/

I tested your patch with:

	hid-uclogic-objs		:= hid-uclogic-core.o \
					   hid-uclogic-rdesc.o \
					   hid-uclogic-params.o
	obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
	[...]
	hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
	obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic.o hid-uclogic-test.o

And I think it is a bit more clear and it looks like it does the trick
removing the warning.

Also, with that change only "EXPORT_SYMBOL_GPL(uclogic_rdesc_template_apply);"
is required. The other EXPORT_SYMBOL_GPL can be removed.

However, I'm not sure about what are the best practices using EXPORT_SYMBOL_GPL
and if it should be used for each function/data in the .h file. Maybe that's
why you added them.

Best wishes,
Jose

> diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c
> index 5bab006ec165..97ae7e4f61e1 100644
> --- a/drivers/hid/hid-uclogic-params.c
> +++ b/drivers/hid/hid-uclogic-params.c
> @@ -133,6 +133,7 @@ void uclogic_params_hid_dbg(const struct hid_device *hdev,
>  	}
>  	hid_dbg(hdev, "}\n");
>  }
> +EXPORT_SYMBOL_GPL(uclogic_params_hid_dbg);
>  
>  /**
>   * uclogic_params_get_str_desc - retrieve a string descriptor from a HID
> @@ -660,6 +661,7 @@ void uclogic_params_cleanup(struct uclogic_params *params)
>  		memset(params, 0, sizeof(*params));
>  	}
>  }
> +EXPORT_SYMBOL_GPL(uclogic_params_cleanup);
>  
>  /**
>   * uclogic_params_get_desc() - Get a replacement report descriptor for a
> @@ -732,6 +734,7 @@ int uclogic_params_get_desc(const struct uclogic_params *params,
>  	kfree(desc);
>  	return rc;
>  }
> +EXPORT_SYMBOL_GPL(uclogic_params_get_desc);
>  
>  /**
>   * uclogic_params_init_invalid() - initialize tablet interface parameters,
> @@ -1859,7 +1862,12 @@ int uclogic_params_init(struct uclogic_params *params,
>  	uclogic_params_cleanup(&p);
>  	return rc;
>  }
> +EXPORT_SYMBOL_GPL(uclogic_params_init);
>  
>  #ifdef CONFIG_HID_KUNIT_TEST
>  #include "hid-uclogic-params-test.c"
>  #endif
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Nikolai Kondrashov");
> +MODULE_DESCRIPTION("HID driver for UC-Logic devices tablet initialization and parameter retrieval");
> diff --git a/drivers/hid/hid-uclogic-rdesc.c b/drivers/hid/hid-uclogic-rdesc.c
> index b6dfdf6356a6..d4f1ee79e0a1 100644
> --- a/drivers/hid/hid-uclogic-rdesc.c
> +++ b/drivers/hid/hid-uclogic-rdesc.c
> @@ -59,9 +59,11 @@ __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp4030u_fixed_arr);
>  
>  const size_t uclogic_rdesc_wp4030u_fixed_size =
>  			sizeof(uclogic_rdesc_wp4030u_fixed_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp4030u_fixed_size);
>  
>  /* Fixed WP5540U report descriptor */
>  __u8 uclogic_rdesc_wp5540u_fixed_arr[] = {
> @@ -136,9 +138,11 @@ __u8 uclogic_rdesc_wp5540u_fixed_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp5540u_fixed_arr);
>  
>  const size_t uclogic_rdesc_wp5540u_fixed_size =
>  			sizeof(uclogic_rdesc_wp5540u_fixed_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp5540u_fixed_size);
>  
>  /* Fixed WP8060U report descriptor */
>  __u8 uclogic_rdesc_wp8060u_fixed_arr[] = {
> @@ -213,9 +217,11 @@ __u8 uclogic_rdesc_wp8060u_fixed_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp8060u_fixed_arr);
>  
>  const size_t uclogic_rdesc_wp8060u_fixed_size =
>  			sizeof(uclogic_rdesc_wp8060u_fixed_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp8060u_fixed_size);
>  
>  /* Fixed WP1062 report descriptor */
>  __u8 uclogic_rdesc_wp1062_fixed_arr[] = {
> @@ -261,9 +267,11 @@ __u8 uclogic_rdesc_wp1062_fixed_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp1062_fixed_arr);
>  
>  const size_t uclogic_rdesc_wp1062_fixed_size =
>  			sizeof(uclogic_rdesc_wp1062_fixed_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_wp1062_fixed_size);
>  
>  /* Fixed PF1209 report descriptor */
>  __u8 uclogic_rdesc_pf1209_fixed_arr[] = {
> @@ -338,9 +346,11 @@ __u8 uclogic_rdesc_pf1209_fixed_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_pf1209_fixed_arr);
>  
>  const size_t uclogic_rdesc_pf1209_fixed_size =
>  			sizeof(uclogic_rdesc_pf1209_fixed_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_pf1209_fixed_size);
>  
>  /* Fixed PID 0522 tablet report descriptor, interface 0 (stylus) */
>  __u8 uclogic_rdesc_twhl850_fixed0_arr[] = {
> @@ -384,9 +394,11 @@ __u8 uclogic_rdesc_twhl850_fixed0_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed0_arr);
>  
>  const size_t uclogic_rdesc_twhl850_fixed0_size =
>  			sizeof(uclogic_rdesc_twhl850_fixed0_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed0_size);
>  
>  /* Fixed PID 0522 tablet report descriptor, interface 1 (mouse) */
>  __u8 uclogic_rdesc_twhl850_fixed1_arr[] = {
> @@ -424,9 +436,11 @@ __u8 uclogic_rdesc_twhl850_fixed1_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed1_arr);
>  
>  const size_t uclogic_rdesc_twhl850_fixed1_size =
>  			sizeof(uclogic_rdesc_twhl850_fixed1_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed1_size);
>  
>  /* Fixed PID 0522 tablet report descriptor, interface 2 (frame buttons) */
>  __u8 uclogic_rdesc_twhl850_fixed2_arr[] = {
> @@ -450,9 +464,11 @@ __u8 uclogic_rdesc_twhl850_fixed2_arr[] = {
>  	0x80,               /*      Input,                          */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed2_arr);
>  
>  const size_t uclogic_rdesc_twhl850_fixed2_size =
>  			sizeof(uclogic_rdesc_twhl850_fixed2_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed2_size);
>  
>  /* Fixed TWHA60 report descriptor, interface 0 (stylus) */
>  __u8 uclogic_rdesc_twha60_fixed0_arr[] = {
> @@ -499,9 +515,11 @@ __u8 uclogic_rdesc_twha60_fixed0_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed0_arr);
>  
>  const size_t uclogic_rdesc_twha60_fixed0_size =
>  			sizeof(uclogic_rdesc_twha60_fixed0_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed0_size);
>  
>  /* Fixed TWHA60 report descriptor, interface 1 (frame buttons) */
>  __u8 uclogic_rdesc_twha60_fixed1_arr[] = {
> @@ -527,9 +545,11 @@ __u8 uclogic_rdesc_twha60_fixed1_arr[] = {
>  	0x81, 0x01, /*      Input (Constant),       */
>  	0xC0        /*  End Collection              */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed1_arr);
>  
>  const size_t uclogic_rdesc_twha60_fixed1_size =
>  			sizeof(uclogic_rdesc_twha60_fixed1_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed1_size);
>  
>  /* Fixed report descriptor template for (tweaked) v1 pen reports */
>  const __u8 uclogic_rdesc_v1_pen_template_arr[] = {
> @@ -581,9 +601,11 @@ const __u8 uclogic_rdesc_v1_pen_template_arr[] = {
>  	0xC0,                   /*      End Collection,                     */
>  	0xC0                    /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_pen_template_arr);
>  
>  const size_t uclogic_rdesc_v1_pen_template_size =
>  			sizeof(uclogic_rdesc_v1_pen_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_pen_template_size);
>  
>  /* Fixed report descriptor template for (tweaked) v2 pen reports */
>  const __u8 uclogic_rdesc_v2_pen_template_arr[] = {
> @@ -647,9 +669,11 @@ const __u8 uclogic_rdesc_v2_pen_template_arr[] = {
>  	0xC0,                   /*      End Collection,                     */
>  	0xC0                    /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_pen_template_arr);
>  
>  const size_t uclogic_rdesc_v2_pen_template_size =
>  			sizeof(uclogic_rdesc_v2_pen_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_pen_template_size);
>  
>  /*
>   * Expand to the contents of a generic frame buttons report descriptor.
> @@ -702,16 +726,22 @@ const size_t uclogic_rdesc_v2_pen_template_size =
>  const __u8 uclogic_rdesc_v1_frame_arr[] = {
>  	UCLOGIC_RDESC_FRAME_BUTTONS_BYTES(UCLOGIC_RDESC_V1_FRAME_ID, 8)
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_frame_arr);
> +
>  const size_t uclogic_rdesc_v1_frame_size =
>  			sizeof(uclogic_rdesc_v1_frame_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_frame_size);
>  
>  /* Fixed report descriptor for (tweaked) v2 frame button reports */
>  const __u8 uclogic_rdesc_v2_frame_buttons_arr[] = {
>  	UCLOGIC_RDESC_FRAME_BUTTONS_BYTES(UCLOGIC_RDESC_V2_FRAME_BUTTONS_ID,
>  					  12)
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_buttons_arr);
> +
>  const size_t uclogic_rdesc_v2_frame_buttons_size =
>  			sizeof(uclogic_rdesc_v2_frame_buttons_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_buttons_size);
>  
>  /* Fixed report descriptor for (tweaked) v2 frame touch ring reports */
>  const __u8 uclogic_rdesc_v2_frame_touch_ring_arr[] = {
> @@ -758,8 +788,11 @@ const __u8 uclogic_rdesc_v2_frame_touch_ring_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_ring_arr);
> +
>  const size_t uclogic_rdesc_v2_frame_touch_ring_size =
>  			sizeof(uclogic_rdesc_v2_frame_touch_ring_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_ring_size);
>  
>  /* Fixed report descriptor for (tweaked) v2 frame touch strip reports */
>  const __u8 uclogic_rdesc_v2_frame_touch_strip_arr[] = {
> @@ -806,8 +839,11 @@ const __u8 uclogic_rdesc_v2_frame_touch_strip_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_strip_arr);
> +
>  const size_t uclogic_rdesc_v2_frame_touch_strip_size =
>  			sizeof(uclogic_rdesc_v2_frame_touch_strip_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_strip_size);
>  
>  /* Fixed report descriptor for (tweaked) v2 frame dial reports */
>  const __u8 uclogic_rdesc_v2_frame_dial_arr[] = {
> @@ -856,14 +892,22 @@ const __u8 uclogic_rdesc_v2_frame_dial_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_dial_arr);
> +
>  const size_t uclogic_rdesc_v2_frame_dial_size =
>  			sizeof(uclogic_rdesc_v2_frame_dial_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_dial_size);
>  
>  const __u8 uclogic_ugee_v2_probe_arr[] = {
>  	0x02, 0xb0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
>  };
> +EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_arr);
> +
>  const size_t uclogic_ugee_v2_probe_size = sizeof(uclogic_ugee_v2_probe_arr);
> +EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_size);
> +
>  const int uclogic_ugee_v2_probe_endpoint = 0x03;
> +EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_endpoint);
>  
>  /* Fixed report descriptor template for UGEE v2 pen reports */
>  const __u8 uclogic_rdesc_ugee_v2_pen_template_arr[] = {
> @@ -935,8 +979,11 @@ const __u8 uclogic_rdesc_ugee_v2_pen_template_arr[] = {
>  	0xc0,               /*      End Collection,                     */
>  	0xc0,               /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_pen_template_arr);
> +
>  const size_t uclogic_rdesc_ugee_v2_pen_template_size =
>  			sizeof(uclogic_rdesc_ugee_v2_pen_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_pen_template_size);
>  
>  /* Fixed report descriptor template for UGEE v2 frame reports (buttons only) */
>  const __u8 uclogic_rdesc_ugee_v2_frame_btn_template_arr[] = {
> @@ -964,8 +1011,11 @@ const __u8 uclogic_rdesc_ugee_v2_frame_btn_template_arr[] = {
>  	0xC0,               /*      End Collection,                     */
>  	0xC0                /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_btn_template_arr);
> +
>  const size_t uclogic_rdesc_ugee_v2_frame_btn_template_size =
>  			sizeof(uclogic_rdesc_ugee_v2_frame_btn_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_btn_template_size);
>  
>  /* Fixed report descriptor template for UGEE v2 frame reports (dial) */
>  const __u8 uclogic_rdesc_ugee_v2_frame_dial_template_arr[] = {
> @@ -1004,8 +1054,11 @@ const __u8 uclogic_rdesc_ugee_v2_frame_dial_template_arr[] = {
>  	0xC0,               /*      End Collection,                     */
>  	0xC0                /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_dial_template_arr);
> +
>  const size_t uclogic_rdesc_ugee_v2_frame_dial_template_size =
>  			sizeof(uclogic_rdesc_ugee_v2_frame_dial_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_dial_template_size);
>  
>  /* Fixed report descriptor template for UGEE v2 frame reports (mouse) */
>  const __u8 uclogic_rdesc_ugee_v2_frame_mouse_template_arr[] = {
> @@ -1038,8 +1091,11 @@ const __u8 uclogic_rdesc_ugee_v2_frame_mouse_template_arr[] = {
>  	0xC0,               /*      End Collection,                     */
>  	0xC0                /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_mouse_template_arr);
> +
>  const size_t uclogic_rdesc_ugee_v2_frame_mouse_template_size =
>  			sizeof(uclogic_rdesc_ugee_v2_frame_mouse_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_mouse_template_size);
>  
>  /* Fixed report descriptor template for UGEE v2 battery reports */
>  const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[] = {
> @@ -1072,8 +1128,11 @@ const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[] = {
>  	0x81, 0x01,         /*      Input (Constant),                   */
>  	0xC0                /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_battery_template_arr);
> +
>  const size_t uclogic_rdesc_ugee_v2_battery_template_size =
>  			sizeof(uclogic_rdesc_ugee_v2_battery_template_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_battery_template_size);
>  
>  /* Fixed report descriptor for Ugee EX07 frame */
>  const __u8 uclogic_rdesc_ugee_ex07_frame_arr[] = {
> @@ -1099,8 +1158,11 @@ const __u8 uclogic_rdesc_ugee_ex07_frame_arr[] = {
>  	0xC0,                   /*      End Collection,                     */
>  	0xC0                    /*  End Collection                          */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_ex07_frame_arr);
> +
>  const size_t uclogic_rdesc_ugee_ex07_frame_size =
>  			sizeof(uclogic_rdesc_ugee_ex07_frame_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_ex07_frame_size);
>  
>  /* Fixed report descriptor for Ugee G5 frame controls */
>  const __u8 uclogic_rdesc_ugee_g5_frame_arr[] = {
> @@ -1153,8 +1215,10 @@ const __u8 uclogic_rdesc_ugee_g5_frame_arr[] = {
>  	0xC0,               /*      End Collection,                 */
>  	0xC0                /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_g5_frame_arr);
>  const size_t uclogic_rdesc_ugee_g5_frame_size =
>  			sizeof(uclogic_rdesc_ugee_g5_frame_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_g5_frame_size);
>  
>  /* Fixed report descriptor for XP-Pen Deco 01 frame controls */
>  const __u8 uclogic_rdesc_xppen_deco01_frame_arr[] = {
> @@ -1187,9 +1251,11 @@ const __u8 uclogic_rdesc_xppen_deco01_frame_arr[] = {
>  	0xC0,       /*      End Collection,                 */
>  	0xC0        /*  End Collection                      */
>  };
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_xppen_deco01_frame_arr);
>  
>  const size_t uclogic_rdesc_xppen_deco01_frame_size =
>  			sizeof(uclogic_rdesc_xppen_deco01_frame_arr);
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_xppen_deco01_frame_size);
>  
>  /**
>   * uclogic_rdesc_template_apply() - apply report descriptor parameters to a
> @@ -1242,3 +1308,9 @@ __u8 *uclogic_rdesc_template_apply(const __u8 *template_ptr,
>  
>  	return rdesc_ptr;
>  }
> +EXPORT_SYMBOL_GPL(uclogic_rdesc_template_apply);
> +
> +MODULE_LICENSE("GPL");
> +MODULE_AUTHOR("Martin Rusko");
> +MODULE_AUTHOR("Nikolai Kondrashov");
> +MODULE_DESCRIPTION("HID driver for UC-Logic devices original and fixed report descriptors");
> -- 
> 2.39.2
>
Arnd Bergmann June 10, 2024, 6:24 a.m. UTC | #2
On Sat, Jun 8, 2024, at 20:28, José Expósito wrote:
> On Wed, May 29, 2024 at 11:48:05AM +0200, Arnd Bergmann wrote:

>> @@ -154,10 +152,8 @@ obj-$(CONFIG_HID_WINWING)	+= hid-winwing.o
>>  obj-$(CONFIG_HID_SENSOR_HUB)	+= hid-sensor-hub.o
>>  obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR)	+= hid-sensor-custom.o
>>  
>> -hid-uclogic-test-objs		:= hid-uclogic-rdesc.o \
>> -				   hid-uclogic-params.o \
>> -				   hid-uclogic-rdesc-test.o
>> -obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o
>> +hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
>> +obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o hid-uclogic-params.o hid-uclogic-params.o
>>  
>>  obj-$(CONFIG_USB_HID)		+= usbhid/
>>  obj-$(CONFIG_USB_MOUSE)		+= usbhid/
>
> I tested your patch with:
>
> 	hid-uclogic-objs		:= hid-uclogic-core.o \
> 					   hid-uclogic-rdesc.o \
> 					   hid-uclogic-params.o
> 	obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
> 	[...]
> 	hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
> 	obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic.o hid-uclogic-test.o
>
> And I think it is a bit more clear and it looks like it does the trick
> removing the warning.

Right, that seems fine.

> Also, with that change only "EXPORT_SYMBOL_GPL(uclogic_rdesc_template_apply);"
> is required. The other EXPORT_SYMBOL_GPL can be removed.
>
> However, I'm not sure about what are the best practices using EXPORT_SYMBOL_GPL
> and if it should be used for each function/data in the .h file. Maybe that's
> why you added them.

No, having only the single export is better here, you should
have as few of them as possible. I did picked the more complicated
approach as I wasn't sure if loading the entire driver from the
test module caused any problems. Let's use your simpler patch
then.

     Arnd
José Expósito June 10, 2024, 4:57 p.m. UTC | #3
On Mon, Jun 10, 2024 at 08:24:51AM +0200, Arnd Bergmann wrote:
> On Sat, Jun 8, 2024, at 20:28, José Expósito wrote:
> > On Wed, May 29, 2024 at 11:48:05AM +0200, Arnd Bergmann wrote:
> 
> >> @@ -154,10 +152,8 @@ obj-$(CONFIG_HID_WINWING)	+= hid-winwing.o
> >>  obj-$(CONFIG_HID_SENSOR_HUB)	+= hid-sensor-hub.o
> >>  obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR)	+= hid-sensor-custom.o
> >>  
> >> -hid-uclogic-test-objs		:= hid-uclogic-rdesc.o \
> >> -				   hid-uclogic-params.o \
> >> -				   hid-uclogic-rdesc-test.o
> >> -obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o
> >> +hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
> >> +obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o hid-uclogic-params.o hid-uclogic-params.o
> >>  
> >>  obj-$(CONFIG_USB_HID)		+= usbhid/
> >>  obj-$(CONFIG_USB_MOUSE)		+= usbhid/
> >
> > I tested your patch with:
> >
> > 	hid-uclogic-objs		:= hid-uclogic-core.o \
> > 					   hid-uclogic-rdesc.o \
> > 					   hid-uclogic-params.o
> > 	obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
> > 	[...]
> > 	hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
> > 	obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic.o hid-uclogic-test.o
> >
> > And I think it is a bit more clear and it looks like it does the trick
> > removing the warning.
> 
> Right, that seems fine.
> 
> > Also, with that change only "EXPORT_SYMBOL_GPL(uclogic_rdesc_template_apply);"
> > is required. The other EXPORT_SYMBOL_GPL can be removed.
> >
> > However, I'm not sure about what are the best practices using EXPORT_SYMBOL_GPL
> > and if it should be used for each function/data in the .h file. Maybe that's
> > why you added them.
> 
> No, having only the single export is better here, you should
> have as few of them as possible. I did picked the more complicated
> approach as I wasn't sure if loading the entire driver from the
> test module caused any problems. Let's use your simpler patch
> then.
> 
>      Arnd

Turns out that, since the last time I checked the KUnit docs,
we have "EXPORT_SYMBOL_IF_KUNIT" available now.

I think we can use it and your final patch, without the MODULE_*
changes, could look like:

diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index ce71b53ea6c5..e40f1ddebbb7 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -154,10 +154,8 @@ obj-$(CONFIG_HID_WINWING)  += hid-winwing.o
 obj-$(CONFIG_HID_SENSOR_HUB)   += hid-sensor-hub.o
 obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR) += hid-sensor-custom.o
 
-hid-uclogic-test-objs          := hid-uclogic-rdesc.o \
-                                  hid-uclogic-params.o \
-                                  hid-uclogic-rdesc-test.o
-obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic-test.o
+hid-uclogic-test-objs          := hid-uclogic-rdesc-test.o
+obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic.o hid-uclogic-test.o
 
 obj-$(CONFIG_USB_HID)          += usbhid/
 obj-$(CONFIG_USB_MOUSE)                += usbhid/
diff --git a/drivers/hid/hid-uclogic-rdesc.c b/drivers/hid/hid-uclogic-rdesc.c
index b6dfdf6356a6..6c7a90417569 100644
--- a/drivers/hid/hid-uclogic-rdesc.c
+++ b/drivers/hid/hid-uclogic-rdesc.c
@@ -17,6 +17,7 @@
 #include "hid-uclogic-rdesc.h"
 #include <linux/slab.h>
 #include <asm/unaligned.h>
+#include <kunit/visibility.h>
 
 /* Fixed WP4030U report descriptor */
 __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
@@ -1242,3 +1243,4 @@ __u8 *uclogic_rdesc_template_apply(const __u8 *template_ptr,
 
        return rdesc_ptr;
 }
+EXPORT_SYMBOL_IF_KUNIT(uclogic_rdesc_template_apply);

I hope that helps,
Jose
Arnd Bergmann June 10, 2024, 6:25 p.m. UTC | #4
On Mon, Jun 10, 2024, at 18:57, José Expósito wrote:
> On Mon, Jun 10, 2024 at 08:24:51AM +0200, Arnd Bergmann wrote:
>> On Sat, Jun 8, 2024, at 20:28, José Expósito wrote:
>
> Turns out that, since the last time I checked the KUnit docs,
> we have "EXPORT_SYMBOL_IF_KUNIT" available now.
>
> I think we can use it and your final patch, without the MODULE_*
> changes, could look like:

Looks good to me, can you send that with

Reported-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Arnd Bergmann <arnd@arndb.de>

?

Feel free to take my original changelog text if that helps

     Arnd

> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index ce71b53ea6c5..e40f1ddebbb7 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -154,10 +154,8 @@ obj-$(CONFIG_HID_WINWING)  += hid-winwing.o
>  obj-$(CONFIG_HID_SENSOR_HUB)   += hid-sensor-hub.o
>  obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR) += hid-sensor-custom.o
> 
> -hid-uclogic-test-objs          := hid-uclogic-rdesc.o \
> -                                  hid-uclogic-params.o \
> -                                  hid-uclogic-rdesc-test.o
> -obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic-test.o
> +hid-uclogic-test-objs          := hid-uclogic-rdesc-test.o
> +obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic.o hid-uclogic-test.o
> 
>  obj-$(CONFIG_USB_HID)          += usbhid/
>  obj-$(CONFIG_USB_MOUSE)                += usbhid/
> diff --git a/drivers/hid/hid-uclogic-rdesc.c b/drivers/hid/hid-uclogic-rdesc.c
> index b6dfdf6356a6..6c7a90417569 100644
> --- a/drivers/hid/hid-uclogic-rdesc.c
> +++ b/drivers/hid/hid-uclogic-rdesc.c
> @@ -17,6 +17,7 @@
>  #include "hid-uclogic-rdesc.h"
>  #include <linux/slab.h>
>  #include <asm/unaligned.h>
> +#include <kunit/visibility.h>
> 
>  /* Fixed WP4030U report descriptor */
>  __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
> @@ -1242,3 +1243,4 @@ __u8 *uclogic_rdesc_template_apply(const __u8 
> *template_ptr,
> 
>         return rdesc_ptr;
>  }
> +EXPORT_SYMBOL_IF_KUNIT(uclogic_rdesc_template_apply);
>
> I hope that helps,
> Jose
José Expósito June 14, 2024, 4:22 p.m. UTC | #5
On Mon, Jun 10, 2024 at 08:25:15PM +0200, Arnd Bergmann wrote:
> On Mon, Jun 10, 2024, at 18:57, José Expósito wrote:
> > On Mon, Jun 10, 2024 at 08:24:51AM +0200, Arnd Bergmann wrote:
> >> On Sat, Jun 8, 2024, at 20:28, José Expósito wrote:
> >
> > Turns out that, since the last time I checked the KUnit docs,
> > we have "EXPORT_SYMBOL_IF_KUNIT" available now.
> >
> > I think we can use it and your final patch, without the MODULE_*
> > changes, could look like:
> 
> Looks good to me, can you send that with
> 
> Reported-by: Arnd Bergmann <arnd@arndb.de>
> Acked-by: Arnd Bergmann <arnd@arndb.de>

I couldn't add the "Reported-by" tag because check-patch throws a
warning if it is used without a "Closes" tag.

Other than that, I sent v2:
https://lore.kernel.org/linux-input/20240614161935.230529-1-jose.exposito89@gmail.com/T/

Thanks a lot for looking into these warnings!

Jose

> ?
> 
> Feel free to take my original changelog text if that helps
> 
>      Arnd
> 
> > diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> > index ce71b53ea6c5..e40f1ddebbb7 100644
> > --- a/drivers/hid/Makefile
> > +++ b/drivers/hid/Makefile
> > @@ -154,10 +154,8 @@ obj-$(CONFIG_HID_WINWING)  += hid-winwing.o
> >  obj-$(CONFIG_HID_SENSOR_HUB)   += hid-sensor-hub.o
> >  obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR) += hid-sensor-custom.o
> > 
> > -hid-uclogic-test-objs          := hid-uclogic-rdesc.o \
> > -                                  hid-uclogic-params.o \
> > -                                  hid-uclogic-rdesc-test.o
> > -obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic-test.o
> > +hid-uclogic-test-objs          := hid-uclogic-rdesc-test.o
> > +obj-$(CONFIG_HID_KUNIT_TEST)   += hid-uclogic.o hid-uclogic-test.o
> > 
> >  obj-$(CONFIG_USB_HID)          += usbhid/
> >  obj-$(CONFIG_USB_MOUSE)                += usbhid/
> > diff --git a/drivers/hid/hid-uclogic-rdesc.c b/drivers/hid/hid-uclogic-rdesc.c
> > index b6dfdf6356a6..6c7a90417569 100644
> > --- a/drivers/hid/hid-uclogic-rdesc.c
> > +++ b/drivers/hid/hid-uclogic-rdesc.c
> > @@ -17,6 +17,7 @@
> >  #include "hid-uclogic-rdesc.h"
> >  #include <linux/slab.h>
> >  #include <asm/unaligned.h>
> > +#include <kunit/visibility.h>
> > 
> >  /* Fixed WP4030U report descriptor */
> >  __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
> > @@ -1242,3 +1243,4 @@ __u8 *uclogic_rdesc_template_apply(const __u8 
> > *template_ptr,
> > 
> >         return rdesc_ptr;
> >  }
> > +EXPORT_SYMBOL_IF_KUNIT(uclogic_rdesc_template_apply);
> >
> > I hope that helps,
> > Jose
Jiri Kosina June 19, 2024, 2:30 p.m. UTC | #6
On Fri, 14 Jun 2024, José Expósito wrote:

> > > Turns out that, since the last time I checked the KUnit docs,
> > > we have "EXPORT_SYMBOL_IF_KUNIT" available now.
> > >
> > > I think we can use it and your final patch, without the MODULE_*
> > > changes, could look like:
> > 
> > Looks good to me, can you send that with
> > 
> > Reported-by: Arnd Bergmann <arnd@arndb.de>
> > Acked-by: Arnd Bergmann <arnd@arndb.de>
> 
> I couldn't add the "Reported-by" tag because check-patch throws a
> warning if it is used without a "Closes" tag.

What?

Let's ignore (or even better fix) checkpatch, this is bad behavior.

> Other than that, I sent v2:
> https://lore.kernel.org/linux-input/20240614161935.230529-1-jose.exposito89@gmail.com/T/

I'll add Arnd's Reported-by: while applying that, credit must be given.

Thanks,
diff mbox series

Patch

diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
index ce71b53ea6c5..864dfbae8ace 100644
--- a/drivers/hid/Makefile
+++ b/drivers/hid/Makefile
@@ -133,10 +133,8 @@  obj-$(CONFIG_HID_TOPSEED)	+= hid-topseed.o
 obj-$(CONFIG_HID_TOPRE)	+= hid-topre.o
 obj-$(CONFIG_HID_TWINHAN)	+= hid-twinhan.o
 obj-$(CONFIG_HID_U2FZERO)	+= hid-u2fzero.o
-hid-uclogic-objs		:= hid-uclogic-core.o \
-				   hid-uclogic-rdesc.o \
-				   hid-uclogic-params.o
-obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o
+hid-uclogic-objs		:= hid-uclogic-core.o
+obj-$(CONFIG_HID_UCLOGIC)	+= hid-uclogic.o hid-uclogic-rdesc.o hid-uclogic-params.o
 obj-$(CONFIG_HID_UDRAW_PS3)	+= hid-udraw-ps3.o
 obj-$(CONFIG_HID_LED)		+= hid-led.o
 obj-$(CONFIG_HID_XIAOMI)	+= hid-xiaomi.o
@@ -154,10 +152,8 @@  obj-$(CONFIG_HID_WINWING)	+= hid-winwing.o
 obj-$(CONFIG_HID_SENSOR_HUB)	+= hid-sensor-hub.o
 obj-$(CONFIG_HID_SENSOR_CUSTOM_SENSOR)	+= hid-sensor-custom.o
 
-hid-uclogic-test-objs		:= hid-uclogic-rdesc.o \
-				   hid-uclogic-params.o \
-				   hid-uclogic-rdesc-test.o
-obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o
+hid-uclogic-test-objs		:= hid-uclogic-rdesc-test.o
+obj-$(CONFIG_HID_KUNIT_TEST)	+= hid-uclogic-test.o hid-uclogic-params.o hid-uclogic-params.o
 
 obj-$(CONFIG_USB_HID)		+= usbhid/
 obj-$(CONFIG_USB_MOUSE)		+= usbhid/
diff --git a/drivers/hid/hid-uclogic-params.c b/drivers/hid/hid-uclogic-params.c
index 5bab006ec165..97ae7e4f61e1 100644
--- a/drivers/hid/hid-uclogic-params.c
+++ b/drivers/hid/hid-uclogic-params.c
@@ -133,6 +133,7 @@  void uclogic_params_hid_dbg(const struct hid_device *hdev,
 	}
 	hid_dbg(hdev, "}\n");
 }
+EXPORT_SYMBOL_GPL(uclogic_params_hid_dbg);
 
 /**
  * uclogic_params_get_str_desc - retrieve a string descriptor from a HID
@@ -660,6 +661,7 @@  void uclogic_params_cleanup(struct uclogic_params *params)
 		memset(params, 0, sizeof(*params));
 	}
 }
+EXPORT_SYMBOL_GPL(uclogic_params_cleanup);
 
 /**
  * uclogic_params_get_desc() - Get a replacement report descriptor for a
@@ -732,6 +734,7 @@  int uclogic_params_get_desc(const struct uclogic_params *params,
 	kfree(desc);
 	return rc;
 }
+EXPORT_SYMBOL_GPL(uclogic_params_get_desc);
 
 /**
  * uclogic_params_init_invalid() - initialize tablet interface parameters,
@@ -1859,7 +1862,12 @@  int uclogic_params_init(struct uclogic_params *params,
 	uclogic_params_cleanup(&p);
 	return rc;
 }
+EXPORT_SYMBOL_GPL(uclogic_params_init);
 
 #ifdef CONFIG_HID_KUNIT_TEST
 #include "hid-uclogic-params-test.c"
 #endif
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Nikolai Kondrashov");
+MODULE_DESCRIPTION("HID driver for UC-Logic devices tablet initialization and parameter retrieval");
diff --git a/drivers/hid/hid-uclogic-rdesc.c b/drivers/hid/hid-uclogic-rdesc.c
index b6dfdf6356a6..d4f1ee79e0a1 100644
--- a/drivers/hid/hid-uclogic-rdesc.c
+++ b/drivers/hid/hid-uclogic-rdesc.c
@@ -59,9 +59,11 @@  __u8 uclogic_rdesc_wp4030u_fixed_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp4030u_fixed_arr);
 
 const size_t uclogic_rdesc_wp4030u_fixed_size =
 			sizeof(uclogic_rdesc_wp4030u_fixed_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp4030u_fixed_size);
 
 /* Fixed WP5540U report descriptor */
 __u8 uclogic_rdesc_wp5540u_fixed_arr[] = {
@@ -136,9 +138,11 @@  __u8 uclogic_rdesc_wp5540u_fixed_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp5540u_fixed_arr);
 
 const size_t uclogic_rdesc_wp5540u_fixed_size =
 			sizeof(uclogic_rdesc_wp5540u_fixed_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp5540u_fixed_size);
 
 /* Fixed WP8060U report descriptor */
 __u8 uclogic_rdesc_wp8060u_fixed_arr[] = {
@@ -213,9 +217,11 @@  __u8 uclogic_rdesc_wp8060u_fixed_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp8060u_fixed_arr);
 
 const size_t uclogic_rdesc_wp8060u_fixed_size =
 			sizeof(uclogic_rdesc_wp8060u_fixed_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp8060u_fixed_size);
 
 /* Fixed WP1062 report descriptor */
 __u8 uclogic_rdesc_wp1062_fixed_arr[] = {
@@ -261,9 +267,11 @@  __u8 uclogic_rdesc_wp1062_fixed_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp1062_fixed_arr);
 
 const size_t uclogic_rdesc_wp1062_fixed_size =
 			sizeof(uclogic_rdesc_wp1062_fixed_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_wp1062_fixed_size);
 
 /* Fixed PF1209 report descriptor */
 __u8 uclogic_rdesc_pf1209_fixed_arr[] = {
@@ -338,9 +346,11 @@  __u8 uclogic_rdesc_pf1209_fixed_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_pf1209_fixed_arr);
 
 const size_t uclogic_rdesc_pf1209_fixed_size =
 			sizeof(uclogic_rdesc_pf1209_fixed_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_pf1209_fixed_size);
 
 /* Fixed PID 0522 tablet report descriptor, interface 0 (stylus) */
 __u8 uclogic_rdesc_twhl850_fixed0_arr[] = {
@@ -384,9 +394,11 @@  __u8 uclogic_rdesc_twhl850_fixed0_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed0_arr);
 
 const size_t uclogic_rdesc_twhl850_fixed0_size =
 			sizeof(uclogic_rdesc_twhl850_fixed0_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed0_size);
 
 /* Fixed PID 0522 tablet report descriptor, interface 1 (mouse) */
 __u8 uclogic_rdesc_twhl850_fixed1_arr[] = {
@@ -424,9 +436,11 @@  __u8 uclogic_rdesc_twhl850_fixed1_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed1_arr);
 
 const size_t uclogic_rdesc_twhl850_fixed1_size =
 			sizeof(uclogic_rdesc_twhl850_fixed1_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed1_size);
 
 /* Fixed PID 0522 tablet report descriptor, interface 2 (frame buttons) */
 __u8 uclogic_rdesc_twhl850_fixed2_arr[] = {
@@ -450,9 +464,11 @@  __u8 uclogic_rdesc_twhl850_fixed2_arr[] = {
 	0x80,               /*      Input,                          */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed2_arr);
 
 const size_t uclogic_rdesc_twhl850_fixed2_size =
 			sizeof(uclogic_rdesc_twhl850_fixed2_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twhl850_fixed2_size);
 
 /* Fixed TWHA60 report descriptor, interface 0 (stylus) */
 __u8 uclogic_rdesc_twha60_fixed0_arr[] = {
@@ -499,9 +515,11 @@  __u8 uclogic_rdesc_twha60_fixed0_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed0_arr);
 
 const size_t uclogic_rdesc_twha60_fixed0_size =
 			sizeof(uclogic_rdesc_twha60_fixed0_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed0_size);
 
 /* Fixed TWHA60 report descriptor, interface 1 (frame buttons) */
 __u8 uclogic_rdesc_twha60_fixed1_arr[] = {
@@ -527,9 +545,11 @@  __u8 uclogic_rdesc_twha60_fixed1_arr[] = {
 	0x81, 0x01, /*      Input (Constant),       */
 	0xC0        /*  End Collection              */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed1_arr);
 
 const size_t uclogic_rdesc_twha60_fixed1_size =
 			sizeof(uclogic_rdesc_twha60_fixed1_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_twha60_fixed1_size);
 
 /* Fixed report descriptor template for (tweaked) v1 pen reports */
 const __u8 uclogic_rdesc_v1_pen_template_arr[] = {
@@ -581,9 +601,11 @@  const __u8 uclogic_rdesc_v1_pen_template_arr[] = {
 	0xC0,                   /*      End Collection,                     */
 	0xC0                    /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_pen_template_arr);
 
 const size_t uclogic_rdesc_v1_pen_template_size =
 			sizeof(uclogic_rdesc_v1_pen_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_pen_template_size);
 
 /* Fixed report descriptor template for (tweaked) v2 pen reports */
 const __u8 uclogic_rdesc_v2_pen_template_arr[] = {
@@ -647,9 +669,11 @@  const __u8 uclogic_rdesc_v2_pen_template_arr[] = {
 	0xC0,                   /*      End Collection,                     */
 	0xC0                    /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_pen_template_arr);
 
 const size_t uclogic_rdesc_v2_pen_template_size =
 			sizeof(uclogic_rdesc_v2_pen_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_pen_template_size);
 
 /*
  * Expand to the contents of a generic frame buttons report descriptor.
@@ -702,16 +726,22 @@  const size_t uclogic_rdesc_v2_pen_template_size =
 const __u8 uclogic_rdesc_v1_frame_arr[] = {
 	UCLOGIC_RDESC_FRAME_BUTTONS_BYTES(UCLOGIC_RDESC_V1_FRAME_ID, 8)
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_frame_arr);
+
 const size_t uclogic_rdesc_v1_frame_size =
 			sizeof(uclogic_rdesc_v1_frame_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v1_frame_size);
 
 /* Fixed report descriptor for (tweaked) v2 frame button reports */
 const __u8 uclogic_rdesc_v2_frame_buttons_arr[] = {
 	UCLOGIC_RDESC_FRAME_BUTTONS_BYTES(UCLOGIC_RDESC_V2_FRAME_BUTTONS_ID,
 					  12)
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_buttons_arr);
+
 const size_t uclogic_rdesc_v2_frame_buttons_size =
 			sizeof(uclogic_rdesc_v2_frame_buttons_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_buttons_size);
 
 /* Fixed report descriptor for (tweaked) v2 frame touch ring reports */
 const __u8 uclogic_rdesc_v2_frame_touch_ring_arr[] = {
@@ -758,8 +788,11 @@  const __u8 uclogic_rdesc_v2_frame_touch_ring_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_ring_arr);
+
 const size_t uclogic_rdesc_v2_frame_touch_ring_size =
 			sizeof(uclogic_rdesc_v2_frame_touch_ring_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_ring_size);
 
 /* Fixed report descriptor for (tweaked) v2 frame touch strip reports */
 const __u8 uclogic_rdesc_v2_frame_touch_strip_arr[] = {
@@ -806,8 +839,11 @@  const __u8 uclogic_rdesc_v2_frame_touch_strip_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_strip_arr);
+
 const size_t uclogic_rdesc_v2_frame_touch_strip_size =
 			sizeof(uclogic_rdesc_v2_frame_touch_strip_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_touch_strip_size);
 
 /* Fixed report descriptor for (tweaked) v2 frame dial reports */
 const __u8 uclogic_rdesc_v2_frame_dial_arr[] = {
@@ -856,14 +892,22 @@  const __u8 uclogic_rdesc_v2_frame_dial_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_dial_arr);
+
 const size_t uclogic_rdesc_v2_frame_dial_size =
 			sizeof(uclogic_rdesc_v2_frame_dial_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_v2_frame_dial_size);
 
 const __u8 uclogic_ugee_v2_probe_arr[] = {
 	0x02, 0xb0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 };
+EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_arr);
+
 const size_t uclogic_ugee_v2_probe_size = sizeof(uclogic_ugee_v2_probe_arr);
+EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_size);
+
 const int uclogic_ugee_v2_probe_endpoint = 0x03;
+EXPORT_SYMBOL_GPL(uclogic_ugee_v2_probe_endpoint);
 
 /* Fixed report descriptor template for UGEE v2 pen reports */
 const __u8 uclogic_rdesc_ugee_v2_pen_template_arr[] = {
@@ -935,8 +979,11 @@  const __u8 uclogic_rdesc_ugee_v2_pen_template_arr[] = {
 	0xc0,               /*      End Collection,                     */
 	0xc0,               /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_pen_template_arr);
+
 const size_t uclogic_rdesc_ugee_v2_pen_template_size =
 			sizeof(uclogic_rdesc_ugee_v2_pen_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_pen_template_size);
 
 /* Fixed report descriptor template for UGEE v2 frame reports (buttons only) */
 const __u8 uclogic_rdesc_ugee_v2_frame_btn_template_arr[] = {
@@ -964,8 +1011,11 @@  const __u8 uclogic_rdesc_ugee_v2_frame_btn_template_arr[] = {
 	0xC0,               /*      End Collection,                     */
 	0xC0                /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_btn_template_arr);
+
 const size_t uclogic_rdesc_ugee_v2_frame_btn_template_size =
 			sizeof(uclogic_rdesc_ugee_v2_frame_btn_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_btn_template_size);
 
 /* Fixed report descriptor template for UGEE v2 frame reports (dial) */
 const __u8 uclogic_rdesc_ugee_v2_frame_dial_template_arr[] = {
@@ -1004,8 +1054,11 @@  const __u8 uclogic_rdesc_ugee_v2_frame_dial_template_arr[] = {
 	0xC0,               /*      End Collection,                     */
 	0xC0                /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_dial_template_arr);
+
 const size_t uclogic_rdesc_ugee_v2_frame_dial_template_size =
 			sizeof(uclogic_rdesc_ugee_v2_frame_dial_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_dial_template_size);
 
 /* Fixed report descriptor template for UGEE v2 frame reports (mouse) */
 const __u8 uclogic_rdesc_ugee_v2_frame_mouse_template_arr[] = {
@@ -1038,8 +1091,11 @@  const __u8 uclogic_rdesc_ugee_v2_frame_mouse_template_arr[] = {
 	0xC0,               /*      End Collection,                     */
 	0xC0                /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_mouse_template_arr);
+
 const size_t uclogic_rdesc_ugee_v2_frame_mouse_template_size =
 			sizeof(uclogic_rdesc_ugee_v2_frame_mouse_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_frame_mouse_template_size);
 
 /* Fixed report descriptor template for UGEE v2 battery reports */
 const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[] = {
@@ -1072,8 +1128,11 @@  const __u8 uclogic_rdesc_ugee_v2_battery_template_arr[] = {
 	0x81, 0x01,         /*      Input (Constant),                   */
 	0xC0                /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_battery_template_arr);
+
 const size_t uclogic_rdesc_ugee_v2_battery_template_size =
 			sizeof(uclogic_rdesc_ugee_v2_battery_template_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_v2_battery_template_size);
 
 /* Fixed report descriptor for Ugee EX07 frame */
 const __u8 uclogic_rdesc_ugee_ex07_frame_arr[] = {
@@ -1099,8 +1158,11 @@  const __u8 uclogic_rdesc_ugee_ex07_frame_arr[] = {
 	0xC0,                   /*      End Collection,                     */
 	0xC0                    /*  End Collection                          */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_ex07_frame_arr);
+
 const size_t uclogic_rdesc_ugee_ex07_frame_size =
 			sizeof(uclogic_rdesc_ugee_ex07_frame_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_ex07_frame_size);
 
 /* Fixed report descriptor for Ugee G5 frame controls */
 const __u8 uclogic_rdesc_ugee_g5_frame_arr[] = {
@@ -1153,8 +1215,10 @@  const __u8 uclogic_rdesc_ugee_g5_frame_arr[] = {
 	0xC0,               /*      End Collection,                 */
 	0xC0                /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_g5_frame_arr);
 const size_t uclogic_rdesc_ugee_g5_frame_size =
 			sizeof(uclogic_rdesc_ugee_g5_frame_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_ugee_g5_frame_size);
 
 /* Fixed report descriptor for XP-Pen Deco 01 frame controls */
 const __u8 uclogic_rdesc_xppen_deco01_frame_arr[] = {
@@ -1187,9 +1251,11 @@  const __u8 uclogic_rdesc_xppen_deco01_frame_arr[] = {
 	0xC0,       /*      End Collection,                 */
 	0xC0        /*  End Collection                      */
 };
+EXPORT_SYMBOL_GPL(uclogic_rdesc_xppen_deco01_frame_arr);
 
 const size_t uclogic_rdesc_xppen_deco01_frame_size =
 			sizeof(uclogic_rdesc_xppen_deco01_frame_arr);
+EXPORT_SYMBOL_GPL(uclogic_rdesc_xppen_deco01_frame_size);
 
 /**
  * uclogic_rdesc_template_apply() - apply report descriptor parameters to a
@@ -1242,3 +1308,9 @@  __u8 *uclogic_rdesc_template_apply(const __u8 *template_ptr,
 
 	return rdesc_ptr;
 }
+EXPORT_SYMBOL_GPL(uclogic_rdesc_template_apply);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Martin Rusko");
+MODULE_AUTHOR("Nikolai Kondrashov");
+MODULE_DESCRIPTION("HID driver for UC-Logic devices original and fixed report descriptors");