]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Input: usbtouchscreen - use driver core to instantiate device attributes
authorDmitry Torokhov <dmitry.torokhov@gmail.com>
Fri, 12 Jul 2024 05:18:43 +0000 (22:18 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Tue, 16 Jul 2024 01:07:38 +0000 (18:07 -0700)
Instead of manually creating driver-specific device attributes
set struct usb_driver->dev_groups pointer to have the driver core
do it.

Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Link: https://lore.kernel.org/r/20240712051851.3463657-1-dmitry.torokhov@gmail.com
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
drivers/input/touchscreen/usbtouchscreen.c

index dd6b12c6dc5818039fd6cec414996e9e2083f6c6..8b3a6e7fd990bd45639b14225b5d554c7886317a 100644 (file)
@@ -240,6 +240,7 @@ static const struct usb_device_id usbtouch_devices[] = {
        {}
 };
 
+static struct usbtouch_device_info usbtouch_dev_info[];
 
 /*****************************************************************************
  * e2i Part
@@ -466,7 +467,19 @@ static struct attribute *mtouch_attrs[] = {
        NULL
 };
 
+static bool mtouch_group_visible(struct kobject *kobj)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       struct usb_interface *intf = to_usb_interface(dev);
+       struct usbtouch_usb *usbtouch = usb_get_intfdata(intf);
+
+       return usbtouch->type == &usbtouch_dev_info[DEVTYPE_3M];
+}
+
+DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(mtouch);
+
 static const struct attribute_group mtouch_attr_group = {
+       .is_visible = SYSFS_GROUP_VISIBLE(mtouch),
        .attrs = mtouch_attrs,
 };
 
@@ -506,21 +519,12 @@ free:
 static int mtouch_alloc(struct usbtouch_usb *usbtouch)
 {
        struct mtouch_priv *priv;
-       int ret;
 
        priv = kmalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
                return -ENOMEM;
 
        usbtouch->priv = priv;
-       ret = sysfs_create_group(&usbtouch->interface->dev.kobj,
-                                &mtouch_attr_group);
-       if (ret) {
-               kfree(usbtouch->priv);
-               usbtouch->priv = NULL;
-               return ret;
-       }
-
        return 0;
 }
 
@@ -571,7 +575,6 @@ static void mtouch_exit(struct usbtouch_usb *usbtouch)
 {
        struct mtouch_priv *priv = usbtouch->priv;
 
-       sysfs_remove_group(&usbtouch->interface->dev.kobj, &mtouch_attr_group);
        kfree(priv);
 }
 #endif
@@ -1842,6 +1845,13 @@ static void usbtouch_disconnect(struct usb_interface *intf)
        kfree(usbtouch);
 }
 
+static const struct attribute_group *usbtouch_groups[] = {
+#ifdef CONFIG_TOUCHSCREEN_USB_3M
+       &mtouch_attr_group,
+#endif
+       NULL
+};
+
 MODULE_DEVICE_TABLE(usb, usbtouch_devices);
 
 static struct usb_driver usbtouch_driver = {
@@ -1852,6 +1862,7 @@ static struct usb_driver usbtouch_driver = {
        .resume         = usbtouch_resume,
        .reset_resume   = usbtouch_reset_resume,
        .id_table       = usbtouch_devices,
+       .dev_groups     = usbtouch_groups,
        .supports_autosuspend = 1,
 };