Commit 49a78b05 authored by Yajun Deng's avatar Yajun Deng Committed by Greg Kroah-Hartman
Browse files

USB: core: Use device_driver directly in struct usb_driver and usb_device_driver



There is usbdrv_wrap in struct usb_driver and usb_device_driver, it
contains device_driver and for_devices. for_devices is used to
distinguish between device drivers and interface drivers.

Like the is_usb_device(), it tests the type of the device. We can test
that if the probe of device_driver is equal to usb_probe_device in
is_usb_device_driver(), and then the struct usbdrv_wrap is no longer
needed.

Clean up struct usbdrv_wrap, use device_driver directly in struct
usb_driver and usb_device_driver. This makes the code cleaner.

Signed-off-by: default avatarYajun Deng <yajun.deng@linux.dev>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/20240104032822.1896596-1-yajun.deng@linux.dev


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33d4137d
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -4790,11 +4790,9 @@ static struct usb_driver btusb_driver = {
	.disable_hub_initiated_lpm = 1,

#ifdef CONFIG_DEV_COREDUMP
	.drvwrap = {
	.driver = {
		.coredump = btusb_coredump,
	},
	},
#endif
};

+1 −1
Original line number Diff line number Diff line
@@ -1143,7 +1143,7 @@ static void __exit peak_usb_exit(void)
	int err;

	/* last chance do send any synchronous commands here */
	err = driver_for_each_device(&peak_usb_driver.drvwrap.driver, NULL,
	err = driver_for_each_device(&peak_usb_driver.driver, NULL,
				     NULL, peak_usb_do_device_exit);
	if (err)
		pr_err("%s: failed to stop all can devices (err %d)\n",
+1 −1
Original line number Diff line number Diff line
@@ -1581,7 +1581,7 @@ static int brcmf_usb_reset_device(struct device *dev, void *notused)

void brcmf_usb_exit(void)
{
	struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
	struct device_driver *drv = &brcmf_usbdrvr.driver;
	int ret;

	brcmf_dbg(USB, "Enter\n");
+1 −1
Original line number Diff line number Diff line
@@ -687,7 +687,7 @@ static struct usb_driver mwifiex_usb_driver = {
	.suspend = mwifiex_usb_suspend,
	.resume = mwifiex_usb_resume,
	.soft_unbind = 1,
	.drvwrap.driver = {
	.driver = {
		.coredump = mwifiex_usb_coredump,
	},
};
+31 −28
Original line number Diff line number Diff line
@@ -189,13 +189,13 @@ static int usb_create_newid_files(struct usb_driver *usb_drv)
		goto exit;

	if (usb_drv->probe != NULL) {
		error = driver_create_file(&usb_drv->drvwrap.driver,
		error = driver_create_file(&usb_drv->driver,
					   &driver_attr_new_id);
		if (error == 0) {
			error = driver_create_file(&usb_drv->drvwrap.driver,
			error = driver_create_file(&usb_drv->driver,
					&driver_attr_remove_id);
			if (error)
				driver_remove_file(&usb_drv->drvwrap.driver,
				driver_remove_file(&usb_drv->driver,
						&driver_attr_new_id);
		}
	}
@@ -209,9 +209,9 @@ static void usb_remove_newid_files(struct usb_driver *usb_drv)
		return;

	if (usb_drv->probe != NULL) {
		driver_remove_file(&usb_drv->drvwrap.driver,
		driver_remove_file(&usb_drv->driver,
				&driver_attr_remove_id);
		driver_remove_file(&usb_drv->drvwrap.driver,
		driver_remove_file(&usb_drv->driver,
				   &driver_attr_new_id);
	}
}
@@ -552,7 +552,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
	if (!iface->authorized)
		return -ENODEV;

	dev->driver = &driver->drvwrap.driver;
	dev->driver = &driver->driver;
	usb_set_intfdata(iface, data);
	iface->needs_binding = 0;

@@ -615,7 +615,7 @@ void usb_driver_release_interface(struct usb_driver *driver,
	struct device *dev = &iface->dev;

	/* this should never happen, don't release something that's not ours */
	if (!dev->driver || dev->driver != &driver->drvwrap.driver)
	if (!dev->driver || dev->driver != &driver->driver)
		return;

	/* don't release from within disconnect() */
@@ -950,7 +950,7 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
	int ret;

	/* Don't reprobe if current driver isn't usb_generic_driver */
	if (dev->driver != &usb_generic_driver.drvwrap.driver)
	if (dev->driver != &usb_generic_driver.driver)
		return 0;

	udev = to_usb_device(dev);
@@ -964,6 +964,11 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
	return 0;
}

bool is_usb_device_driver(const struct device_driver *drv)
{
	return drv->probe == usb_probe_device;
}

/**
 * usb_register_device_driver - register a USB device (not interface) driver
 * @new_udriver: USB operations for the device driver
@@ -983,15 +988,14 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver,
	if (usb_disabled())
		return -ENODEV;

	new_udriver->drvwrap.for_devices = 1;
	new_udriver->drvwrap.driver.name = new_udriver->name;
	new_udriver->drvwrap.driver.bus = &usb_bus_type;
	new_udriver->drvwrap.driver.probe = usb_probe_device;
	new_udriver->drvwrap.driver.remove = usb_unbind_device;
	new_udriver->drvwrap.driver.owner = owner;
	new_udriver->drvwrap.driver.dev_groups = new_udriver->dev_groups;
	new_udriver->driver.name = new_udriver->name;
	new_udriver->driver.bus = &usb_bus_type;
	new_udriver->driver.probe = usb_probe_device;
	new_udriver->driver.remove = usb_unbind_device;
	new_udriver->driver.owner = owner;
	new_udriver->driver.dev_groups = new_udriver->dev_groups;

	retval = driver_register(&new_udriver->drvwrap.driver);
	retval = driver_register(&new_udriver->driver);

	if (!retval) {
		pr_info("%s: registered new device driver %s\n",
@@ -1023,7 +1027,7 @@ void usb_deregister_device_driver(struct usb_device_driver *udriver)
	pr_info("%s: deregistering device driver %s\n",
			usbcore_name, udriver->name);

	driver_unregister(&udriver->drvwrap.driver);
	driver_unregister(&udriver->driver);
}
EXPORT_SYMBOL_GPL(usb_deregister_device_driver);

@@ -1051,18 +1055,17 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
	if (usb_disabled())
		return -ENODEV;

	new_driver->drvwrap.for_devices = 0;
	new_driver->drvwrap.driver.name = new_driver->name;
	new_driver->drvwrap.driver.bus = &usb_bus_type;
	new_driver->drvwrap.driver.probe = usb_probe_interface;
	new_driver->drvwrap.driver.remove = usb_unbind_interface;
	new_driver->drvwrap.driver.owner = owner;
	new_driver->drvwrap.driver.mod_name = mod_name;
	new_driver->drvwrap.driver.dev_groups = new_driver->dev_groups;
	new_driver->driver.name = new_driver->name;
	new_driver->driver.bus = &usb_bus_type;
	new_driver->driver.probe = usb_probe_interface;
	new_driver->driver.remove = usb_unbind_interface;
	new_driver->driver.owner = owner;
	new_driver->driver.mod_name = mod_name;
	new_driver->driver.dev_groups = new_driver->dev_groups;
	spin_lock_init(&new_driver->dynids.lock);
	INIT_LIST_HEAD(&new_driver->dynids.list);

	retval = driver_register(&new_driver->drvwrap.driver);
	retval = driver_register(&new_driver->driver);
	if (retval)
		goto out;

@@ -1077,7 +1080,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
	return retval;

out_newid:
	driver_unregister(&new_driver->drvwrap.driver);
	driver_unregister(&new_driver->driver);

	pr_err("%s: error %d registering interface driver %s\n",
		usbcore_name, retval, new_driver->name);
@@ -1102,7 +1105,7 @@ void usb_deregister(struct usb_driver *driver)
			usbcore_name, driver->name);

	usb_remove_newid_files(driver);
	driver_unregister(&driver->drvwrap.driver);
	driver_unregister(&driver->driver);
	usb_free_dynids(driver);
}
EXPORT_SYMBOL_GPL(usb_deregister);
Loading