USB: pxa2xx_udc: use debugfs not procfs
authorDmitry Baryshkov <dbaryshkov@gmail.com>
Sun, 30 Dec 2007 19:56:27 +0000 (11:56 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 1 Feb 2008 22:35:01 +0000 (14:35 -0800)
Use debugfs instead of /proc/driver/udc

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/pxa2xx_udc.h

index 8bd9ce26bd957f78b9ff628d5bc91cefddd7cf65..4402d6f042d971bd42d6a1453bb3c0bef85172ee 100644 (file)
@@ -24,7 +24,7 @@
  *
  */
 
-// #define     VERBOSE DBG_VERBOSE
+/* #define VERBOSE_DEBUG */
 
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/timer.h>
 #include <linux/list.h>
 #include <linux/interrupt.h>
-#include <linux/proc_fs.h>
 #include <linux/mm.h>
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/irq.h>
 #include <linux/clk.h>
 #include <linux/err.h>
+#include <linux/seq_file.h>
+#include <linux/debugfs.h>
 
 #include <asm/byteorder.h>
 #include <asm/dma.h>
@@ -679,7 +680,7 @@ pxa2xx_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
 
        /* kickstart this i/o queue? */
        if (list_empty(&ep->queue) && !ep->stopped) {
-               if (ep->desc == /* ep0 */) {
+               if (ep->desc == NULL/* ep0 */) {
                        unsigned        length = _req->length;
 
                        switch (dev->ep0state) {
@@ -733,7 +734,7 @@ pxa2xx_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
        }
 
        /* pio or dma irq handler advances the queue. */
-       if (likely (req != 0))
+       if (likely(req != NULL))
                list_add_tail(&req->queue, &ep->queue);
        local_irq_restore(flags);
 
@@ -993,45 +994,32 @@ static const struct usb_gadget_ops pxa2xx_udc_ops = {
 
 /*-------------------------------------------------------------------------*/
 
-#ifdef CONFIG_USB_GADGET_DEBUG_FILES
-
-static const char proc_node_name [] = "driver/udc";
+#ifdef CONFIG_USB_GADGET_DEBUG_FS
 
 static int
-udc_proc_read(char *page, char **start, off_t off, int count,
-               int *eof, void *_dev)
+udc_seq_show(struct seq_file *m, void *d)
 {
-       char                    *buf = page;
-       struct pxa2xx_udc       *dev = _dev;
-       char                    *next = buf;
-       unsigned                size = count;
+       struct pxa2xx_udc       *dev = m->private;
        unsigned long           flags;
-       int                     i, t;
+       int                     i;
        u32                     tmp;
 
-       if (off != 0)
-               return 0;
-
        local_irq_save(flags);
 
        /* basic device status */
-       t = scnprintf(next, size, DRIVER_DESC "\n"
+       seq_printf(m, DRIVER_DESC "\n"
                "%s version: %s\nGadget driver: %s\nHost %s\n\n",
                driver_name, DRIVER_VERSION SIZE_STR "(pio)",
                dev->driver ? dev->driver->driver.name : "(none)",
                is_vbus_present() ? "full speed" : "disconnected");
-       size -= t;
-       next += t;
 
        /* registers for device and ep0 */
-       t = scnprintf(next, size,
+       seq_printf(m,
                "uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X\n",
                UICR1, UICR0, USIR1, USIR0, UFNRH, UFNRL);
-       size -= t;
-       next += t;
 
        tmp = UDCCR;
-       t = scnprintf(next, size,
+       seq_printf(m,
                "udccr %02X =%s%s%s%s%s%s%s%s\n", tmp,
                (tmp & UDCCR_REM) ? " rem" : "",
                (tmp & UDCCR_RSTIR) ? " rstir" : "",
@@ -1041,11 +1029,9 @@ udc_proc_read(char *page, char **start, off_t off, int count,
                (tmp & UDCCR_RSM) ? " rsm" : "",
                (tmp & UDCCR_UDA) ? " uda" : "",
                (tmp & UDCCR_UDE) ? " ude" : "");
-       size -= t;
-       next += t;
 
        tmp = UDCCS0;
-       t = scnprintf(next, size,
+       seq_printf(m,
                "udccs0 %02X =%s%s%s%s%s%s%s%s\n", tmp,
                (tmp & UDCCS0_SA) ? " sa" : "",
                (tmp & UDCCS0_RNE) ? " rne" : "",
@@ -1055,28 +1041,22 @@ udc_proc_read(char *page, char **start, off_t off, int count,
                (tmp & UDCCS0_FTF) ? " ftf" : "",
                (tmp & UDCCS0_IPR) ? " ipr" : "",
                (tmp & UDCCS0_OPR) ? " opr" : "");
-       size -= t;
-       next += t;
 
        if (dev->has_cfr) {
                tmp = UDCCFR;
-               t = scnprintf(next, size,
+               seq_printf(m,
                        "udccfr %02X =%s%s\n", tmp,
                        (tmp & UDCCFR_AREN) ? " aren" : "",
                        (tmp & UDCCFR_ACM) ? " acm" : "");
-               size -= t;
-               next += t;
        }
 
        if (!is_vbus_present() || !dev->driver)
                goto done;
 
-       t = scnprintf(next, size, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n",
+       seq_printf(m, "ep0 IN %lu/%lu, OUT %lu/%lu\nirqs %lu\n\n",
                dev->stats.write.bytes, dev->stats.write.ops,
                dev->stats.read.bytes, dev->stats.read.ops,
                dev->stats.irqs);
-       size -= t;
-       next += t;
 
        /* dump endpoint queues */
        for (i = 0; i < PXA_UDC_NUM_ENDPOINTS; i++) {
@@ -1084,61 +1064,68 @@ udc_proc_read(char *page, char **start, off_t off, int count,
                struct pxa2xx_request   *req;
 
                if (i != 0) {
-                       const struct usb_endpoint_descriptor    *d;
+                       const struct usb_endpoint_descriptor    *desc;
 
-                       d = ep->desc;
-                       if (!d)
+                       desc = ep->desc;
+                       if (!desc)
                                continue;
                        tmp = *dev->ep [i].reg_udccs;
-                       t = scnprintf(next, size,
+                       seq_printf(m,
                                "%s max %d %s udccs %02x irqs %lu\n",
-                               ep->ep.name, le16_to_cpu (d->wMaxPacketSize),
+                               ep->ep.name, le16_to_cpu(desc->wMaxPacketSize),
                                "pio", tmp, ep->pio_irqs);
                        /* TODO translate all five groups of udccs bits! */
 
                } else /* ep0 should only have one transfer queued */
-                       t = scnprintf(next, size, "ep0 max 16 pio irqs %lu\n",
+                       seq_printf(m, "ep0 max 16 pio irqs %lu\n",
                                ep->pio_irqs);
-               if (t <= 0 || t > size)
-                       goto done;
-               size -= t;
-               next += t;
 
                if (list_empty(&ep->queue)) {
-                       t = scnprintf(next, size, "\t(nothing queued)\n");
-                       if (t <= 0 || t > size)
-                               goto done;
-                       size -= t;
-                       next += t;
+                       seq_printf(m, "\t(nothing queued)\n");
                        continue;
                }
                list_for_each_entry(req, &ep->queue, queue) {
-                       t = scnprintf(next, size,
+                       seq_printf(m,
                                        "\treq %p len %d/%d buf %p\n",
                                        &req->req, req->req.actual,
                                        req->req.length, req->req.buf);
-                       if (t <= 0 || t > size)
-                               goto done;
-                       size -= t;
-                       next += t;
                }
        }
 
 done:
        local_irq_restore(flags);
-       *eof = 1;
-       return count - size;
+       return 0;
 }
 
-#define create_proc_files() \
-       create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev)
-#define remove_proc_files() \
-       remove_proc_entry(proc_node_name, NULL)
+static int
+udc_debugfs_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, udc_seq_show, inode->i_private);
+}
+
+static const struct file_operations debug_fops = {
+       .open           = udc_debugfs_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+       .owner          = THIS_MODULE,
+};
+
+#define create_debug_files(dev) \
+       do { \
+               dev->debugfs_udc = debugfs_create_file(dev->gadget.name, \
+                       S_IRUGO, NULL, dev, &debug_fops); \
+       } while (0)
+#define remove_debug_files(dev) \
+       do { \
+               if (dev->debugfs_udc) \
+                       debugfs_remove(dev->debugfs_udc); \
+       } while (0)
 
 #else  /* !CONFIG_USB_GADGET_DEBUG_FILES */
 
-#define create_proc_files() do {} while (0)
-#define remove_proc_files() do {} while (0)
+#define create_debug_files(dev) do {} while (0)
+#define remove_debug_files(dev) do {} while (0)
 
 #endif /* CONFIG_USB_GADGET_DEBUG_FILES */
 
@@ -2246,7 +2233,7 @@ lubbock_fail0:
                        goto err_vbus_irq;
                }
        }
-       create_proc_files();
+       create_debug_files(dev);
 
        return 0;
 
@@ -2283,7 +2270,7 @@ static int __exit pxa2xx_udc_remove(struct platform_device *pdev)
                return -EBUSY;
 
        udc_disable(dev);
-       remove_proc_files();
+       remove_debug_files(dev);
 
        if (dev->got_irq) {
                free_irq(platform_get_irq(pdev, 0), dev);
index 97a8c45ccd8168843a7a22a9734053994b021665..b67e3ff5e4eb5baf648b0fcceb457e7e3456af69 100644 (file)
@@ -129,6 +129,10 @@ struct pxa2xx_udc {
        struct pxa2xx_udc_mach_info             *mach;
        u64                                     dma_mask;
        struct pxa2xx_ep                        ep [PXA_UDC_NUM_ENDPOINTS];
+
+#ifdef CONFIG_USB_GADGET_DEBUG_FS
+       struct dentry                           *debugfs_udc;
+#endif
 };
 
 /*-------------------------------------------------------------------------*/
@@ -155,13 +159,15 @@ static struct pxa2xx_udc *the_controller;
 
 #ifdef DEBUG
 
+static int is_vbus_present(void);
+
 static const char *state_name[] = {
        "EP0_IDLE",
        "EP0_IN_DATA_PHASE", "EP0_OUT_DATA_PHASE",
        "EP0_END_XFER", "EP0_STALL"
 };
 
-#ifdef VERBOSE
+#ifdef VERBOSE_DEBUG
 #    define UDC_DEBUG DBG_VERBOSE
 #else
 #    define UDC_DEBUG DBG_NORMAL
@@ -207,7 +213,7 @@ dump_state(struct pxa2xx_udc *dev)
        unsigned        i;
 
        DMSG("%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X\n",
-               is_usb_connected() ? "host " : "disconnected",
+               is_vbus_present() ? "host " : "disconnected",
                state_name[dev->ep0state],
                UICR1, UICR0, USIR1, USIR0, UFNRH, UFNRL);
        dump_udccr("udccr");
@@ -224,7 +230,7 @@ dump_state(struct pxa2xx_udc *dev)
        } else
                DMSG("ep0 driver '%s'\n", dev->driver->driver.name);
 
-       if (!is_usb_connected())
+       if (!is_vbus_present())
                return;
 
        dump_udccs0 ("udccs0");
@@ -233,7 +239,7 @@ dump_state(struct pxa2xx_udc *dev)
                dev->stats.read.bytes, dev->stats.read.ops);
 
        for (i = 1; i < PXA_UDC_NUM_ENDPOINTS; i++) {
-               if (dev->ep [i].desc == 0)
+               if (dev->ep [i].desc == NULL)
                        continue;
                DMSG ("udccs%d = %02x\n", i, *dev->ep->reg_udccs);
        }