Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7a386c5 authored by Kay Sievers's avatar Kay Sievers Committed by Greg Kroah-Hartman
Browse files

Driver Core: usb: add nodename support for usb drivers.



This adds support for USB drivers to report their requested nodename to
userspace.  It also updates a number of USB drivers to provide the
needed subdirectory and device name to be used for them.

Signed-off-by: default avatarKay Sievers <kay.sievers@vrfy.org>
Signed-off-by: default avatarJan Blunck <jblunck@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent d4056405
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -850,8 +850,14 @@ static const struct file_operations hiddev_fops = {
#endif
};

static char *hiddev_nodename(struct device *dev)
{
	return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}

static struct usb_class_driver hiddev_class = {
	.name =		"hiddev%d",
	.nodename =	hiddev_nodename,
	.fops =		&hiddev_fops,
	.minor_base =	HIDDEV_MINOR_BASE,
};
@@ -955,7 +961,6 @@ static int hiddev_usbd_probe(struct usb_interface *intf,
	return -ENODEV;
}


static /* const */ struct usb_driver hiddev_driver = {
	.name =		"hiddev",
	.probe =	hiddev_usbd_probe,
+6 −0
Original line number Diff line number Diff line
@@ -747,8 +747,14 @@ static const struct file_operations dabusb_fops =
	.release =	dabusb_release,
};

static char *dabusb_nodename(struct device *dev)
{
	return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}

static struct usb_class_driver dabusb_class = {
	.name =		"dabusb%d",
	.nodename =	dabusb_nodename,
	.fops =		&dabusb_fops,
	.minor_base =	DABUSB_MINOR,
};
+6 −0
Original line number Diff line number Diff line
@@ -1057,8 +1057,14 @@ static const struct file_operations usblp_fops = {
	.release =	usblp_release,
};

static char *usblp_nodename(struct device *dev)
{
	return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
}

static struct usb_class_driver usblp_class = {
	.name =		"lp%d",
	.nodename =	usblp_nodename,
	.fops =		&usblp_fops,
	.minor_base =	USBLP_MINOR_BASE,
};
+12 −1
Original line number Diff line number Diff line
@@ -67,6 +67,16 @@ static struct usb_class {
	struct class *class;
} *usb_class;

static char *usb_nodename(struct device *dev)
{
	struct usb_class_driver *drv;

	drv = dev_get_drvdata(dev);
	if (!drv || !drv->nodename)
		return NULL;
	return drv->nodename(dev);
}

static int init_usb_class(void)
{
	int result = 0;
@@ -90,6 +100,7 @@ static int init_usb_class(void)
		kfree(usb_class);
		usb_class = NULL;
	}
	usb_class->class->nodename = usb_nodename;

exit:
	return result;
@@ -198,7 +209,7 @@ int usb_register_dev(struct usb_interface *intf,
	else
		temp = name;
	intf->usb_dev = device_create(usb_class->class, &intf->dev,
				      MKDEV(USB_MAJOR, minor), NULL,
				      MKDEV(USB_MAJOR, minor), class_driver,
				      "%s", temp);
	if (IS_ERR(intf->usb_dev)) {
		down_write(&minor_rwsem);
+11 −0
Original line number Diff line number Diff line
@@ -305,10 +305,21 @@ static struct dev_pm_ops usb_device_pm_ops = {

#endif	/* CONFIG_PM */


static char *usb_nodename(struct device *dev)
{
	struct usb_device *usb_dev;

	usb_dev = to_usb_device(dev);
	return kasprintf(GFP_KERNEL, "bus/usb/%03d/%03d",
			 usb_dev->bus->busnum, usb_dev->devnum);
}

struct device_type usb_device_type = {
	.name =		"usb_device",
	.release =	usb_release_dev,
	.uevent =	usb_dev_uevent,
	.nodename = 	usb_nodename,
	.pm =		&usb_device_pm_ops,
};

Loading