]> git.hungrycats.org Git - linux/commitdiff
USB: add a lot more driverfs files for all usb devices.
authorGreg Kroah-Hartman <greg@kroah.com>
Mon, 30 Sep 2002 09:09:11 +0000 (02:09 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Mon, 30 Sep 2002 09:09:11 +0000 (02:09 -0700)
drivers/usb/core/Makefile
drivers/usb/core/driverfs.c [new file with mode: 0644]
drivers/usb/core/usb.c
drivers/usb/core/usb.h [new file with mode: 0644]

index 87c3989fc246b49e339b35fddaed32ef93103e85..a3be2618435abb6f7d5da673f8eb50d9f2c3cb60 100644 (file)
@@ -5,7 +5,7 @@
 export-objs    := usb.o hcd.o hcd-pci.o urb.o message.o file.o buffer.o
 
 usbcore-objs   := usb.o usb-debug.o hub.o hcd.o urb.o message.o \
-                       config.o file.o buffer.o
+                       config.o file.o buffer.o driverfs.o
 
 ifeq ($(CONFIG_PCI),y)
        usbcore-objs    += hcd-pci.o
diff --git a/drivers/usb/core/driverfs.c b/drivers/usb/core/driverfs.c
new file mode 100644 (file)
index 0000000..37cca33
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * drivers/usb/core/driverfs.c
+ *
+ * (C) Copyright 2002 David Brownell
+ * (C) Copyright 2002 Greg Kroah-Hartman
+ * (C) Copyright 2002 IBM Corp.
+ *
+ * All of the driverfs file attributes for usb devices and interfaces.
+ *
+ */
+
+
+#include <linux/config.h>
+#include <linux/kernel.h>
+
+#ifdef CONFIG_USB_DEBUG
+       #define DEBUG
+#else
+       #undef DEBUG
+#endif
+#include <linux/usb.h>
+
+#include "usb.h"
+
+/* Active configuration fields */
+#define usb_actconfig_attr(field, format_string)                       \
+static ssize_t                                                         \
+show_##field (struct device *dev, char *buf, size_t count, loff_t off) \
+{                                                                      \
+       struct usb_device *udev;                                        \
+                                                                       \
+       if (off)                                                        \
+               return 0;                                               \
+                                                                       \
+       udev = to_usb_device (dev);                                     \
+       return sprintf (buf, format_string, udev->actconfig->field);    \
+}                                                                      \
+static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
+
+usb_actconfig_attr (bNumInterfaces, "%2d\n")
+usb_actconfig_attr (bConfigurationValue, "%2d\n")
+usb_actconfig_attr (bmAttributes, "%2x\n")
+usb_actconfig_attr (MaxPower, "%3dmA\n")
+
+/* String fields */
+static ssize_t show_product (struct device *dev, char *buf, size_t count, loff_t off)
+{
+       struct usb_device *udev;
+       int len;
+
+       if (off)
+               return 0;
+       udev = to_usb_device (dev);
+
+       len = usb_string(udev, udev->descriptor.iProduct, buf, PAGE_SIZE);
+       if (len < 0)
+               return 0;
+       buf[len] = '\n';
+       buf[len+1] = 0;
+       return len+1;
+}
+static DEVICE_ATTR(product,S_IRUGO,show_product,NULL);
+
+static ssize_t
+show_manufacturer (struct device *dev, char *buf, size_t count, loff_t off)
+{
+       struct usb_device *udev;
+       int len;
+
+       if (off)
+               return 0;
+       udev = to_usb_device (dev);
+
+       len = usb_string(udev, udev->descriptor.iManufacturer, buf, PAGE_SIZE);
+       if (len < 0)
+               return 0;
+       buf[len] = '\n';
+       buf[len+1] = 0;
+       return len+1;
+}
+static DEVICE_ATTR(manufacturer,S_IRUGO,show_manufacturer,NULL);
+
+static ssize_t
+show_serial (struct device *dev, char *buf, size_t count, loff_t off)
+{
+       struct usb_device *udev;
+       int len;
+
+       if (off)
+               return 0;
+       udev = to_usb_device (dev);
+
+       len = usb_string(udev, udev->descriptor.iSerialNumber, buf, PAGE_SIZE);
+       if (len < 0)
+               return 0;
+       buf[len] = '\n';
+       buf[len+1] = 0;
+       return len+1;
+}
+static DEVICE_ATTR(serial,S_IRUGO,show_serial,NULL);
+
+/* Descriptor fields */
+#define usb_descriptor_attr(field, format_string)                      \
+static ssize_t                                                         \
+show_##field (struct device *dev, char *buf, size_t count, loff_t off) \
+{                                                                      \
+       struct usb_device *udev;                                        \
+                                                                       \
+       if (off)                                                        \
+               return 0;                                               \
+                                                                       \
+       udev = to_usb_device (dev);                                     \
+       return sprintf (buf, format_string, udev->descriptor.field);    \
+}                                                                      \
+static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
+
+usb_descriptor_attr (idVendor, "%04x\n")
+usb_descriptor_attr (idProduct, "%04x\n")
+usb_descriptor_attr (bcdDevice, "%04x\n")
+usb_descriptor_attr (bDeviceClass, "%02x\n")
+usb_descriptor_attr (bDeviceSubClass, "%02x\n")
+usb_descriptor_attr (bDeviceProtocol, "%02x\n")
+
+
+void usb_create_driverfs_dev_files (struct usb_device *udev)
+{
+       struct device *dev = &udev->dev;
+
+       device_create_file (dev, &dev_attr_bNumInterfaces);
+       device_create_file (dev, &dev_attr_bConfigurationValue);
+       device_create_file (dev, &dev_attr_bmAttributes);
+       device_create_file (dev, &dev_attr_MaxPower);
+       device_create_file (dev, &dev_attr_idVendor);
+       device_create_file (dev, &dev_attr_idProduct);
+       device_create_file (dev, &dev_attr_bcdDevice);
+       device_create_file (dev, &dev_attr_bDeviceClass);
+       device_create_file (dev, &dev_attr_bDeviceSubClass);
+       device_create_file (dev, &dev_attr_bDeviceProtocol);
+
+       if (udev->descriptor.iManufacturer)
+               device_create_file (dev, &dev_attr_manufacturer);
+       if (udev->descriptor.iProduct)
+               device_create_file (dev, &dev_attr_product);
+       if (udev->descriptor.iSerialNumber)
+               device_create_file (dev, &dev_attr_serial);
+}
+
+/* Interface fields */
+#define usb_intf_attr(field, format_string)                            \
+static ssize_t                                                         \
+show_##field (struct device *dev, char *buf, size_t count, loff_t off) \
+{                                                                      \
+       struct usb_interface *intf;                                     \
+       int alt;                                                        \
+                                                                       \
+       if (off)                                                        \
+               return 0;                                               \
+                                                                       \
+       intf = to_usb_interface (dev);                                  \
+       alt = intf->act_altsetting;                                     \
+                                                                       \
+       return sprintf (buf, format_string, intf->altsetting[alt].field);       \
+}                                                                      \
+static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
+
+usb_intf_attr (bAlternateSetting, "%2d\n")
+usb_intf_attr (bInterfaceClass, "%02x\n")
+usb_intf_attr (bInterfaceSubClass, "%02x\n")
+usb_intf_attr (bInterfaceProtocol, "%02x\n")
+
+void usb_create_driverfs_intf_files (struct usb_interface *intf)
+{
+       device_create_file (&intf->dev, &dev_attr_bAlternateSetting);
+       device_create_file (&intf->dev, &dev_attr_bInterfaceClass);
+       device_create_file (&intf->dev, &dev_attr_bInterfaceSubClass);
+       device_create_file (&intf->dev, &dev_attr_bInterfaceProtocol);
+}
index 57d6faaa621c99615fdff846201fe88053ae3bbd..87e7808469b9043bbeea9aa157b132ea8acea950 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/usb.h>
 
 #include "hcd.h"
+#include "usb.h"
 
 extern int  usb_hub_init(void);
 extern void usb_hub_cleanup(void);
@@ -629,98 +630,6 @@ static int usb_hotplug (struct device *dev, char **envp,
 
 #endif /* CONFIG_HOTPLUG */
 
-/* driverfs files */
-
-/* devices have one current configuration, with one
- * or more interfaces that are used concurrently 
- */
-static ssize_t
-show_config (struct device *dev, char *buf, size_t count, loff_t off)
-{
-       struct usb_device       *udev;
-
-       if (off)
-               return 0;
-       udev = to_usb_device (dev);
-       return sprintf (buf, "%u\n", udev->actconfig->bConfigurationValue);
-}
-
-static DEVICE_ATTR(configuration,S_IRUGO,show_config,NULL);
-
-/* interfaces have one current setting; alternates
- * can have different endpoints and class info.
- */
-static ssize_t
-show_altsetting (struct device *dev, char *buf, size_t count, loff_t off)
-{
-       struct usb_interface    *interface;
-
-       if (off)
-               return 0;
-       interface = to_usb_interface (dev);
-       return sprintf (buf, "%u\n", interface->altsetting->bAlternateSetting);
-}
-static DEVICE_ATTR(altsetting,S_IRUGO,show_altsetting,NULL);
-
-/* product driverfs file */
-static ssize_t show_product (struct device *dev, char *buf, size_t count, loff_t off)
-{
-       struct usb_device *udev;
-       int len;
-
-       if (off)
-               return 0;
-       udev = to_usb_device (dev);
-
-       len = usb_string(udev, udev->descriptor.iProduct, buf, PAGE_SIZE);
-       if (len < 0)
-               return 0;
-       buf[len] = '\n';
-       buf[len+1] = 0;
-       return len+1;
-}
-static DEVICE_ATTR(product,S_IRUGO,show_product,NULL);
-
-/* manufacturer driverfs file */
-static ssize_t
-show_manufacturer (struct device *dev, char *buf, size_t count, loff_t off)
-{
-       struct usb_device *udev;
-       int len;
-
-       if (off)
-               return 0;
-       udev = to_usb_device (dev);
-
-       len = usb_string(udev, udev->descriptor.iManufacturer, buf, PAGE_SIZE);
-       if (len < 0)
-               return 0;
-       buf[len] = '\n';
-       buf[len+1] = 0;
-       return len+1;
-}
-static DEVICE_ATTR(manufacturer,S_IRUGO,show_manufacturer,NULL);
-
-/* serial number driverfs file */
-static ssize_t
-show_serial (struct device *dev, char *buf, size_t count, loff_t off)
-{
-       struct usb_device *udev;
-       int len;
-
-       if (off)
-               return 0;
-       udev = to_usb_device (dev);
-
-       len = usb_string(udev, udev->descriptor.iSerialNumber, buf, PAGE_SIZE);
-       if (len < 0)
-               return 0;
-       buf[len] = '\n';
-       buf[len+1] = 0;
-       return len+1;
-}
-static DEVICE_ATTR(serial,S_IRUGO,show_serial,NULL);
-
 /**
  * usb_alloc_dev - allocate a usb device structure (usbcore-internal)
  * @parent: hub to which device is connected
@@ -1133,13 +1042,7 @@ int usb_new_device(struct usb_device *dev, struct device *parent)
                return err;
 
        /* add the USB device specific driverfs files */
-       device_create_file (&dev->dev, &dev_attr_configuration);
-       if (dev->descriptor.iManufacturer)
-               device_create_file (&dev->dev, &dev_attr_manufacturer);
-       if (dev->descriptor.iProduct)
-               device_create_file (&dev->dev, &dev_attr_product);
-       if (dev->descriptor.iSerialNumber)
-               device_create_file (&dev->dev, &dev_attr_serial);
+       usb_create_driverfs_dev_files (dev);
 
        /* Register all of the interfaces for this device with the driver core.
         * Remember, interfaces get bound to drivers, not devices. */
@@ -1169,7 +1072,7 @@ int usb_new_device(struct usb_device *dev, struct device *parent)
                }
                dbg ("%s - registering %s", __FUNCTION__, interface->dev.bus_id);
                device_register (&interface->dev);
-               device_create_file (&interface->dev, &dev_attr_altsetting);
+               usb_create_driverfs_intf_files (interface);
        }
 
        /* add a /proc/bus/usb entry */
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
new file mode 100644 (file)
index 0000000..09f459f
--- /dev/null
@@ -0,0 +1,5 @@
+/* Functions local to drivers/usb/core/ */
+
+extern void usb_create_driverfs_dev_files (struct usb_device *dev);
+extern void usb_create_driverfs_intf_files (struct usb_interface *intf);
+