diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2008-08-20 13:35:13 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-08-20 13:35:13 -0700 |
| commit | c797690141696d65fc4d701a84bfd050ca861952 (patch) | |
| tree | f654acf31ef9423aea6b74fbcbb3f5367cc6fd13 /usb.current | |
| parent | 0fadf3ad444c16aae5fd9256d4bd3f285f89c297 (diff) | |
| download | patches-c797690141696d65fc4d701a84bfd050ca861952.tar.gz | |
usb patch fun
Diffstat (limited to 'usb.current')
| -rw-r--r-- | usb.current/usb-musb-get-rid-of-musb_loglevel-and-use-parameter.patch | 118 | ||||
| -rw-r--r-- | usb.current/usb-musb-get-rid-of-procfs-entry.patch | 952 |
2 files changed, 1070 insertions, 0 deletions
diff --git a/usb.current/usb-musb-get-rid-of-musb_loglevel-and-use-parameter.patch b/usb.current/usb-musb-get-rid-of-musb_loglevel-and-use-parameter.patch new file mode 100644 index 00000000000000..086868794d3129 --- /dev/null +++ b/usb.current/usb-musb-get-rid-of-musb_loglevel-and-use-parameter.patch @@ -0,0 +1,118 @@ +From me@felipebalbi.com Wed Aug 20 13:30:38 2008 +From: Felipe Balbi <me@felipebalbi.com> +Date: Sun, 10 Aug 2008 21:22:35 +0300 +Subject: usb: musb: get rid of MUSB_LOGLEVEL and use parameter +To: linux-usb@vger.kernel.org +Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Anand Gadiyar <gadiyar@ti.com>, Bryan Wu <bryan.wu@analog.com>, David Brownell <david-b@pacbell.net> +Message-ID: <1218392555-708-3-git-send-email-me@felipebalbi.com> + + +From: Felipe Balbi <felipe.balbi@nokia.com> + +We can change debugging level on the fly via +/sys/module/musb_hdrc/parameters/debug. + +We can also get rid of the LOGLEVEL facility in Kconfig +and rely only in module parameter. + +Cc: Anand Gadiyar <gadiyar@ti.com> +Cc: Bryan Wu <bryan.wu@analog.com> +Cc: David Brownell <david-b@pacbell.net> +Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/usb/musb/Kconfig | 13 ++++++------- + drivers/usb/musb/Makefile | 16 ++-------------- + drivers/usb/musb/musb_core.c | 17 ++++------------- + drivers/usb/musb/musb_debug.h | 4 ---- + 4 files changed, 12 insertions(+), 38 deletions(-) + +--- a/drivers/usb/musb/Kconfig ++++ b/drivers/usb/musb/Kconfig +@@ -165,12 +165,11 @@ config USB_TUSB_OMAP_DMA + help + Enable DMA transfers on TUSB 6010 when OMAP DMA is available. + +-config USB_MUSB_LOGLEVEL ++config USB_MUSB_DEBUG + depends on USB_MUSB_HDRC +- int 'Logging Level (0 - none / 3 - annoying / ... )' +- default 0 ++ bool "Enable debugging messages" ++ default n + help +- Set the logging level. 0 disables the debugging altogether, +- although when USB_DEBUG is set the value is at least 1. +- Starting at level 3, per-transfer (urb, usb_request, packet, +- or dma transfer) tracing may kick in. ++ This enables musb debugging. To set the logging level use the debug ++ module parameter. Starting at level 3, per-transfer (urb, usb_request, ++ packet, or dma transfer) tracing may kick in. +--- a/drivers/usb/musb/Makefile ++++ b/drivers/usb/musb/Makefile +@@ -64,18 +64,6 @@ endif + + # Debugging + +-MUSB_DEBUG:=$(CONFIG_USB_MUSB_LOGLEVEL) +- +-ifeq ("$(strip $(MUSB_DEBUG))","") +- ifdef CONFIG_USB_DEBUG +- MUSB_DEBUG:=1 +- else +- MUSB_DEBUG:=0 +- endif +-endif +- +-ifneq ($(MUSB_DEBUG),0) +- EXTRA_CFLAGS += -DDEBUG ++ifeq ($(CONFIG_USB_MUSB_DEBUG),y) ++ EXTRA_CFLAGS += -DDEBUG + endif +- +-EXTRA_CFLAGS += -DMUSB_DEBUG=$(MUSB_DEBUG) +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -114,23 +114,14 @@ + + + +-#if MUSB_DEBUG > 0 +-unsigned debug = MUSB_DEBUG; +-module_param(debug, uint, 0); +-MODULE_PARM_DESC(debug, "initial debug message level"); +- +-#define MUSB_VERSION_SUFFIX "/dbg" +-#endif ++unsigned debug = 0; ++module_param(debug, uint, S_IRUGO | S_IWUSR); ++MODULE_PARM_DESC(debug, "Debug message level. Default = 0"); + + #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" + #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver" + +-#define MUSB_VERSION_BASE "6.0" +- +-#ifndef MUSB_VERSION_SUFFIX +-#define MUSB_VERSION_SUFFIX "" +-#endif +-#define MUSB_VERSION MUSB_VERSION_BASE MUSB_VERSION_SUFFIX ++#define MUSB_VERSION "6.0" + + #define DRIVER_INFO DRIVER_DESC ", v" MUSB_VERSION + +--- a/drivers/usb/musb/musb_debug.h ++++ b/drivers/usb/musb/musb_debug.h +@@ -48,11 +48,7 @@ + __func__, __LINE__ , ## args); \ + } } while (0) + +-#if MUSB_DEBUG > 0 + extern unsigned debug; +-#else +-#define debug 0 +-#endif + + static inline int _dbg_level(unsigned l) + { diff --git a/usb.current/usb-musb-get-rid-of-procfs-entry.patch b/usb.current/usb-musb-get-rid-of-procfs-entry.patch new file mode 100644 index 00000000000000..743736ebe445fe --- /dev/null +++ b/usb.current/usb-musb-get-rid-of-procfs-entry.patch @@ -0,0 +1,952 @@ +From me@felipebalbi.com Wed Aug 20 13:29:41 2008 +From: Felipe Balbi <me@felipebalbi.com> +Date: Sun, 10 Aug 2008 21:22:34 +0300 +Subject: usb: musb: get rid of procfs entry +To: linux-usb@vger.kernel.org +Cc: Greg KH <gregkh@suse.de>, Felipe Balbi <felipe.balbi@nokia.com>, Anand Gadiyar <gadiyar@ti.com>, Bryan Wu <bryan.wu@analog.com>, David Brownell <david-b@pacbell.net> +Message-ID: <1218392555-708-2-git-send-email-me@felipebalbi.com> + + +From: Felipe Balbi <felipe.balbi@nokia.com> + +Drivers should not add procfs. The functionality in the old +procfs file will be moved to debugfs. + +Cc: Anand Gadiyar <gadiyar@ti.com> +Cc: Bryan Wu <bryan.wu@analog.com> +Cc: David Brownell <david-b@pacbell.net> +Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/usb/musb/Makefile | 5 + drivers/usb/musb/musb_core.c | 21 - + drivers/usb/musb/musb_core.h | 19 + drivers/usb/musb/musb_procfs.c | 830 ----------------------------------------- + 4 files changed, 11 insertions(+), 864 deletions(-) + +--- a/drivers/usb/musb/Makefile ++++ b/drivers/usb/musb/Makefile +@@ -76,11 +76,6 @@ endif + + ifneq ($(MUSB_DEBUG),0) + EXTRA_CFLAGS += -DDEBUG +- +- ifeq ($(CONFIG_PROC_FS),y) +- musb_hdrc-objs += musb_procfs.o +- endif +- + endif + + EXTRA_CFLAGS += -DMUSB_DEBUG=$(MUSB_DEBUG) +--- a/drivers/usb/musb/musb_core.c ++++ b/drivers/usb/musb/musb_core.c +@@ -2037,6 +2037,8 @@ bad_config: + musb->xceiv.state = OTG_STATE_A_IDLE; + + status = usb_add_hcd(musb_to_hcd(musb), -1, 0); ++ if (status) ++ goto fail; + + DBG(1, "%s mode, status %d, devctl %02x %c\n", + "HOST", status, +@@ -2051,6 +2053,8 @@ bad_config: + musb->xceiv.state = OTG_STATE_B_IDLE; + + status = musb_gadget_setup(musb); ++ if (status) ++ goto fail; + + DBG(1, "%s mode, status %d, dev%02x\n", + is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", +@@ -2059,16 +2063,14 @@ bad_config: + + } + +- if (status == 0) +- musb_debug_create("driver/musb_hdrc", musb); +- else { ++ return 0; ++ + fail: +- if (musb->clock) +- clk_put(musb->clock); +- device_init_wakeup(dev, 0); +- musb_free(musb); +- return status; +- } ++ if (musb->clock) ++ clk_put(musb->clock); ++ device_init_wakeup(dev, 0); ++ musb_free(musb); ++ return status; + + #ifdef CONFIG_SYSFS + status = device_create_file(dev, &dev_attr_mode); +@@ -2131,7 +2133,6 @@ static int __devexit musb_remove(struct + * - OTG mode: both roles are deactivated (or never-activated) + */ + musb_shutdown(pdev); +- musb_debug_delete("driver/musb_hdrc", musb); + #ifdef CONFIG_USB_MUSB_HDRC_HCD + if (musb->board_mode == MUSB_HOST) + usb_remove_hcd(musb_to_hcd(musb)); +--- a/drivers/usb/musb/musb_core.h ++++ b/drivers/usb/musb/musb_core.h +@@ -485,23 +485,4 @@ extern int musb_platform_get_vbus_status + extern int __init musb_platform_init(struct musb *musb); + extern int musb_platform_exit(struct musb *musb); + +-/*-------------------------- ProcFS definitions ---------------------*/ +- +-struct proc_dir_entry; +- +-#if (MUSB_DEBUG > 0) && defined(MUSB_CONFIG_PROC_FS) +-extern struct proc_dir_entry *musb_debug_create(char *name, struct musb *data); +-extern void musb_debug_delete(char *name, struct musb *data); +- +-#else +-static inline struct proc_dir_entry * +-musb_debug_create(char *name, struct musb *data) +-{ +- return NULL; +-} +-static inline void musb_debug_delete(char *name, struct musb *data) +-{ +-} +-#endif +- + #endif /* __MUSB_CORE_H__ */ +--- a/drivers/usb/musb/musb_procfs.c ++++ /dev/null +@@ -1,830 +0,0 @@ +-/* +- * MUSB OTG driver debug support +- * +- * Copyright 2005 Mentor Graphics Corporation +- * Copyright (C) 2005-2006 by Texas Instruments +- * Copyright (C) 2006-2007 Nokia Corporation +- * +- * This program is free software; you can redistribute it and/or +- * modify it under the terms of the GNU General Public License +- * version 2 as published by the Free Software Foundation. +- * +- * This program is distributed in the hope that it will be useful, but +- * WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- * General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program; if not, write to the Free Software +- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +- * 02110-1301 USA +- * +- * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN +- * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, +- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +- * +- */ +- +-#include <linux/kernel.h> +-#include <linux/proc_fs.h> +-#include <linux/seq_file.h> +-#include <linux/uaccess.h> /* FIXME remove procfs writes */ +-#include <asm/arch/hardware.h> +- +-#include "musb_core.h" +- +-#include "davinci.h" +- +-#ifdef CONFIG_USB_MUSB_HDRC_HCD +- +-static int dump_qh(struct musb_qh *qh, char *buf, unsigned max) +-{ +- int count; +- int tmp; +- struct usb_host_endpoint *hep = qh->hep; +- struct urb *urb; +- +- count = snprintf(buf, max, " qh %p dev%d ep%d%s max%d\n", +- qh, qh->dev->devnum, qh->epnum, +- ({ char *s; switch (qh->type) { +- case USB_ENDPOINT_XFER_BULK: +- s = "-bulk"; break; +- case USB_ENDPOINT_XFER_INT: +- s = "-int"; break; +- case USB_ENDPOINT_XFER_CONTROL: +- s = ""; break; +- default: +- s = "iso"; break; +- }; s; }), +- qh->maxpacket); +- if (count <= 0) +- return 0; +- buf += count; +- max -= count; +- +- list_for_each_entry(urb, &hep->urb_list, urb_list) { +- tmp = snprintf(buf, max, "\t%s urb %p %d/%d\n", +- usb_pipein(urb->pipe) ? "in" : "out", +- urb, urb->actual_length, +- urb->transfer_buffer_length); +- if (tmp <= 0) +- break; +- tmp = min(tmp, (int)max); +- count += tmp; +- buf += tmp; +- max -= tmp; +- } +- return count; +-} +- +-static int +-dump_queue(struct list_head *q, char *buf, unsigned max) +-{ +- int count = 0; +- struct musb_qh *qh; +- +- list_for_each_entry(qh, q, ring) { +- int tmp; +- +- tmp = dump_qh(qh, buf, max); +- if (tmp <= 0) +- break; +- tmp = min(tmp, (int)max); +- count += tmp; +- buf += tmp; +- max -= tmp; +- } +- return count; +-} +- +-#endif /* HCD */ +- +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +-static int dump_ep(struct musb_ep *ep, char *buffer, unsigned max) +-{ +- char *buf = buffer; +- int code = 0; +- void __iomem *regs = ep->hw_ep->regs; +- char *mode = "1buf"; +- +- if (ep->is_in) { +- if (ep->hw_ep->tx_double_buffered) +- mode = "2buf"; +- } else { +- if (ep->hw_ep->rx_double_buffered) +- mode = "2buf"; +- } +- +- do { +- struct usb_request *req; +- +- code = snprintf(buf, max, +- "\n%s (hw%d): %s%s, csr %04x maxp %04x\n", +- ep->name, ep->current_epnum, +- mode, ep->dma ? " dma" : "", +- musb_readw(regs, +- (ep->is_in || !ep->current_epnum) +- ? MUSB_TXCSR +- : MUSB_RXCSR), +- musb_readw(regs, ep->is_in +- ? MUSB_TXMAXP +- : MUSB_RXMAXP) +- ); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- +- if (is_cppi_enabled() && ep->current_epnum) { +- unsigned cppi = ep->current_epnum - 1; +- void __iomem *base = ep->musb->ctrl_base; +- unsigned off1 = cppi << 2; +- void __iomem *ram = base; +- char tmp[16]; +- +- if (ep->is_in) { +- ram += DAVINCI_TXCPPI_STATERAM_OFFSET(cppi); +- tmp[0] = 0; +- } else { +- ram += DAVINCI_RXCPPI_STATERAM_OFFSET(cppi); +- snprintf(tmp, sizeof tmp, "%d left, ", +- musb_readl(base, +- DAVINCI_RXCPPI_BUFCNT0_REG + off1)); +- } +- +- code = snprintf(buf, max, "%cX DMA%d: %s" +- "%08x %08x, %08x %08x; " +- "%08x %08x %08x .. %08x\n", +- ep->is_in ? 'T' : 'R', +- ep->current_epnum - 1, tmp, +- musb_readl(ram, 0 * 4), +- musb_readl(ram, 1 * 4), +- musb_readl(ram, 2 * 4), +- musb_readl(ram, 3 * 4), +- musb_readl(ram, 4 * 4), +- musb_readl(ram, 5 * 4), +- musb_readl(ram, 6 * 4), +- musb_readl(ram, 7 * 4)); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- +- if (list_empty(&ep->req_list)) { +- code = snprintf(buf, max, "\t(queue empty)\n"); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- break; +- } +- list_for_each_entry(req, &ep->req_list, list) { +- code = snprintf(buf, max, "\treq %p, %s%s%d/%d\n", +- req, +- req->zero ? "zero, " : "", +- req->short_not_ok ? "!short, " : "", +- req->actual, req->length); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- } while (0); +- return buf - buffer; +-} +-#endif +- +-static int +-dump_end_info(struct musb *musb, u8 epnum, char *aBuffer, unsigned max) +-{ +- int code = 0; +- char *buf = aBuffer; +- struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; +- +- do { +- musb_ep_select(musb->mregs, epnum); +-#ifdef CONFIG_USB_MUSB_HDRC_HCD +- if (is_host_active(musb)) { +- int dump_rx, dump_tx; +- void __iomem *regs = hw_ep->regs; +- +- /* TEMPORARY (!) until we have a real periodic +- * schedule tree ... +- */ +- if (!epnum) { +- /* control is shared, uses RX queue +- * but (mostly) shadowed tx registers +- */ +- dump_tx = !list_empty(&musb->control); +- dump_rx = 0; +- } else if (hw_ep == musb->bulk_ep) { +- dump_tx = !list_empty(&musb->out_bulk); +- dump_rx = !list_empty(&musb->in_bulk); +- } else if (musb->periodic[epnum]) { +- struct usb_host_endpoint *hep; +- +- hep = musb->periodic[epnum]->hep; +- dump_rx = hep->desc.bEndpointAddress +- & USB_ENDPOINT_DIR_MASK; +- dump_tx = !dump_rx; +- } else +- break; +- /* END TEMPORARY */ +- +- +- if (dump_rx) { +- code = snprintf(buf, max, +- "\nRX%d: %s rxcsr %04x interval %02x " +- "max %04x type %02x; " +- "dev %d hub %d port %d" +- "\n", +- epnum, +- hw_ep->rx_double_buffered +- ? "2buf" : "1buf", +- musb_readw(regs, MUSB_RXCSR), +- musb_readb(regs, MUSB_RXINTERVAL), +- musb_readw(regs, MUSB_RXMAXP), +- musb_readb(regs, MUSB_RXTYPE), +- /* FIXME: assumes multipoint */ +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_RXFUNCADDR)), +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_RXHUBADDR)), +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_RXHUBPORT)) +- ); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- +- if (is_cppi_enabled() +- && epnum +- && hw_ep->rx_channel) { +- unsigned cppi = epnum - 1; +- unsigned off1 = cppi << 2; +- void __iomem *base; +- void __iomem *ram; +- char tmp[16]; +- +- base = musb->ctrl_base; +- ram = DAVINCI_RXCPPI_STATERAM_OFFSET( +- cppi) + base; +- snprintf(tmp, sizeof tmp, "%d left, ", +- musb_readl(base, +- DAVINCI_RXCPPI_BUFCNT0_REG +- + off1)); +- +- code = snprintf(buf, max, +- " rx dma%d: %s" +- "%08x %08x, %08x %08x; " +- "%08x %08x %08x .. %08x\n", +- cppi, tmp, +- musb_readl(ram, 0 * 4), +- musb_readl(ram, 1 * 4), +- musb_readl(ram, 2 * 4), +- musb_readl(ram, 3 * 4), +- musb_readl(ram, 4 * 4), +- musb_readl(ram, 5 * 4), +- musb_readl(ram, 6 * 4), +- musb_readl(ram, 7 * 4)); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- +- if (hw_ep == musb->bulk_ep +- && !list_empty( +- &musb->in_bulk)) { +- code = dump_queue(&musb->in_bulk, +- buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } else if (musb->periodic[epnum]) { +- code = dump_qh(musb->periodic[epnum], +- buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- } +- +- if (dump_tx) { +- code = snprintf(buf, max, +- "\nTX%d: %s txcsr %04x interval %02x " +- "max %04x type %02x; " +- "dev %d hub %d port %d" +- "\n", +- epnum, +- hw_ep->tx_double_buffered +- ? "2buf" : "1buf", +- musb_readw(regs, MUSB_TXCSR), +- musb_readb(regs, MUSB_TXINTERVAL), +- musb_readw(regs, MUSB_TXMAXP), +- musb_readb(regs, MUSB_TXTYPE), +- /* FIXME: assumes multipoint */ +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_TXFUNCADDR)), +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_TXHUBADDR)), +- musb_readb(musb->mregs, +- MUSB_BUSCTL_OFFSET(epnum, +- MUSB_TXHUBPORT)) +- ); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- +- if (is_cppi_enabled() +- && epnum +- && hw_ep->tx_channel) { +- unsigned cppi = epnum - 1; +- void __iomem *base; +- void __iomem *ram; +- +- base = musb->ctrl_base; +- ram = DAVINCI_RXCPPI_STATERAM_OFFSET( +- cppi) + base; +- code = snprintf(buf, max, +- " tx dma%d: " +- "%08x %08x, %08x %08x; " +- "%08x %08x %08x .. %08x\n", +- cppi, +- musb_readl(ram, 0 * 4), +- musb_readl(ram, 1 * 4), +- musb_readl(ram, 2 * 4), +- musb_readl(ram, 3 * 4), +- musb_readl(ram, 4 * 4), +- musb_readl(ram, 5 * 4), +- musb_readl(ram, 6 * 4), +- musb_readl(ram, 7 * 4)); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- +- if (hw_ep == musb->control_ep +- && !list_empty( +- &musb->control)) { +- code = dump_queue(&musb->control, +- buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } else if (hw_ep == musb->bulk_ep +- && !list_empty( +- &musb->out_bulk)) { +- code = dump_queue(&musb->out_bulk, +- buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } else if (musb->periodic[epnum]) { +- code = dump_qh(musb->periodic[epnum], +- buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- } +- } +-#endif +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +- if (is_peripheral_active(musb)) { +- code = 0; +- +- if (hw_ep->ep_in.desc || !epnum) { +- code = dump_ep(&hw_ep->ep_in, buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- if (hw_ep->ep_out.desc) { +- code = dump_ep(&hw_ep->ep_out, buf, max); +- if (code <= 0) +- break; +- code = min(code, (int) max); +- buf += code; +- max -= code; +- } +- } +-#endif +- } while (0); +- +- return buf - aBuffer; +-} +- +-/* Dump the current status and compile options. +- * @param musb the device driver instance +- * @param buffer where to dump the status; it must be big enough to hold the +- * result otherwise "BAD THINGS HAPPENS(TM)". +- */ +-static int dump_header_stats(struct musb *musb, char *buffer) +-{ +- int code, count = 0; +- const void __iomem *mbase = musb->mregs; +- +- *buffer = 0; +- count = sprintf(buffer, "Status: %sHDRC, Mode=%s " +- "(Power=%02x, DevCtl=%02x)\n", +- (musb->is_multipoint ? "M" : ""), MUSB_MODE(musb), +- musb_readb(mbase, MUSB_POWER), +- musb_readb(mbase, MUSB_DEVCTL)); +- if (count <= 0) +- return 0; +- buffer += count; +- +- code = sprintf(buffer, "OTG state: %s; %sactive\n", +- otg_state_string(musb), +- musb->is_active ? "" : "in"); +- if (code <= 0) +- goto done; +- buffer += code; +- count += code; +- +- code = sprintf(buffer, +- "Options: " +-#ifdef CONFIG_MUSB_PIO_ONLY +- "pio" +-#elif defined(CONFIG_USB_TI_CPPI_DMA) +- "cppi-dma" +-#elif defined(CONFIG_USB_INVENTRA_DMA) +- "musb-dma" +-#elif defined(CONFIG_USB_TUSB_OMAP_DMA) +- "tusb-omap-dma" +-#else +- "?dma?" +-#endif +- ", " +-#ifdef CONFIG_USB_MUSB_OTG +- "otg (peripheral+host)" +-#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) +- "peripheral" +-#elif defined(CONFIG_USB_MUSB_HDRC_HCD) +- "host" +-#endif +- ", debug=%d [eps=%d]\n", +- debug, +- musb->nr_endpoints); +- if (code <= 0) +- goto done; +- count += code; +- buffer += code; +- +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +- code = sprintf(buffer, "Peripheral address: %02x\n", +- musb_readb(musb->ctrl_base, MUSB_FADDR)); +- if (code <= 0) +- goto done; +- buffer += code; +- count += code; +-#endif +- +-#ifdef CONFIG_USB_MUSB_HDRC_HCD +- code = sprintf(buffer, "Root port status: %08x\n", +- musb->port1_status); +- if (code <= 0) +- goto done; +- buffer += code; +- count += code; +-#endif +- +-#ifdef CONFIG_ARCH_DAVINCI +- code = sprintf(buffer, +- "DaVinci: ctrl=%02x stat=%1x phy=%03x\n" +- "\trndis=%05x auto=%04x intsrc=%08x intmsk=%08x" +- "\n", +- musb_readl(musb->ctrl_base, DAVINCI_USB_CTRL_REG), +- musb_readl(musb->ctrl_base, DAVINCI_USB_STAT_REG), +- __raw_readl((void __force __iomem *) +- IO_ADDRESS(USBPHY_CTL_PADDR)), +- musb_readl(musb->ctrl_base, DAVINCI_RNDIS_REG), +- musb_readl(musb->ctrl_base, DAVINCI_AUTOREQ_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_USB_INT_SOURCE_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_USB_INT_MASK_REG)); +- if (code <= 0) +- goto done; +- count += code; +- buffer += code; +-#endif /* DAVINCI */ +- +-#ifdef CONFIG_USB_TUSB6010 +- code = sprintf(buffer, +- "TUSB6010: devconf %08x, phy enable %08x drive %08x" +- "\n\totg %03x timer %08x" +- "\n\tprcm conf %08x mgmt %08x; int src %08x mask %08x" +- "\n", +- musb_readl(musb->ctrl_base, TUSB_DEV_CONF), +- musb_readl(musb->ctrl_base, TUSB_PHY_OTG_CTRL_ENABLE), +- musb_readl(musb->ctrl_base, TUSB_PHY_OTG_CTRL), +- musb_readl(musb->ctrl_base, TUSB_DEV_OTG_STAT), +- musb_readl(musb->ctrl_base, TUSB_DEV_OTG_TIMER), +- musb_readl(musb->ctrl_base, TUSB_PRCM_CONF), +- musb_readl(musb->ctrl_base, TUSB_PRCM_MNGMT), +- musb_readl(musb->ctrl_base, TUSB_INT_SRC), +- musb_readl(musb->ctrl_base, TUSB_INT_MASK)); +- if (code <= 0) +- goto done; +- count += code; +- buffer += code; +-#endif /* DAVINCI */ +- +- if (is_cppi_enabled() && musb->dma_controller) { +- code = sprintf(buffer, +- "CPPI: txcr=%d txsrc=%01x txena=%01x; " +- "rxcr=%d rxsrc=%01x rxena=%01x " +- "\n", +- musb_readl(musb->ctrl_base, +- DAVINCI_TXCPPI_CTRL_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_TXCPPI_RAW_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_TXCPPI_INTENAB_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_RXCPPI_CTRL_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_RXCPPI_RAW_REG), +- musb_readl(musb->ctrl_base, +- DAVINCI_RXCPPI_INTENAB_REG)); +- if (code <= 0) +- goto done; +- count += code; +- buffer += code; +- } +- +-#ifdef CONFIG_USB_GADGET_MUSB_HDRC +- if (is_peripheral_enabled(musb)) { +- code = sprintf(buffer, "Gadget driver: %s\n", +- musb->gadget_driver +- ? musb->gadget_driver->driver.name +- : "(none)"); +- if (code <= 0) +- goto done; +- count += code; +- buffer += code; +- } +-#endif +- +-done: +- return count; +-} +- +-/* Write to ProcFS +- * +- * C soft-connect +- * c soft-disconnect +- * I enable HS +- * i disable HS +- * s stop session +- * F force session (OTG-unfriendly) +- * E rElinquish bus (OTG) +- * H request host mode +- * h cancel host request +- * T start sending TEST_PACKET +- * D<num> set/query the debug level +- */ +-static int musb_proc_write(struct file *file, const char __user *buffer, +- unsigned long count, void *data) +-{ +- char cmd; +- u8 reg; +- struct musb *musb = (struct musb *)data; +- void __iomem *mbase = musb->mregs; +- +- /* MOD_INC_USE_COUNT; */ +- +- if (unlikely(copy_from_user(&cmd, buffer, 1))) +- return -EFAULT; +- +- switch (cmd) { +- case 'C': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_POWER) +- | MUSB_POWER_SOFTCONN; +- musb_writeb(mbase, MUSB_POWER, reg); +- } +- break; +- +- case 'c': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_POWER) +- & ~MUSB_POWER_SOFTCONN; +- musb_writeb(mbase, MUSB_POWER, reg); +- } +- break; +- +- case 'I': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_POWER) +- | MUSB_POWER_HSENAB; +- musb_writeb(mbase, MUSB_POWER, reg); +- } +- break; +- +- case 'i': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_POWER) +- & ~MUSB_POWER_HSENAB; +- musb_writeb(mbase, MUSB_POWER, reg); +- } +- break; +- +- case 'F': +- reg = musb_readb(mbase, MUSB_DEVCTL); +- reg |= MUSB_DEVCTL_SESSION; +- musb_writeb(mbase, MUSB_DEVCTL, reg); +- break; +- +- case 'H': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_DEVCTL); +- reg |= MUSB_DEVCTL_HR; +- musb_writeb(mbase, MUSB_DEVCTL, reg); +- /* MUSB_HST_MODE( ((struct musb*)data) ); */ +- /* WARNING("Host Mode\n"); */ +- } +- break; +- +- case 'h': +- if (mbase) { +- reg = musb_readb(mbase, MUSB_DEVCTL); +- reg &= ~MUSB_DEVCTL_HR; +- musb_writeb(mbase, MUSB_DEVCTL, reg); +- } +- break; +- +- case 'T': +- if (mbase) { +- musb_load_testpacket(musb); +- musb_writeb(mbase, MUSB_TESTMODE, +- MUSB_TEST_PACKET); +- } +- break; +- +-#if (MUSB_DEBUG > 0) +- /* set/read debug level */ +- case 'D':{ +- if (count > 1) { +- char digits[8], *p = digits; +- int i = 0, level = 0, sign = 1; +- int len = min(count - 1, (unsigned long)8); +- +- if (copy_from_user(&digits, &buffer[1], len)) +- return -EFAULT; +- +- /* optional sign */ +- if (*p == '-') { +- len -= 1; +- sign = -sign; +- p++; +- } +- +- /* read it */ +- while (i++ < len && *p > '0' && *p < '9') { +- level = level * 10 + (*p - '0'); +- p++; +- } +- +- level *= sign; +- DBG(1, "debug level %d\n", level); +- debug = level; +- } +- } +- break; +- +- +- case '?': +- INFO("?: you are seeing it\n"); +- INFO("C/c: soft connect enable/disable\n"); +- INFO("I/i: hispeed enable/disable\n"); +- INFO("F: force session start\n"); +- INFO("H: host mode\n"); +- INFO("T: start sending TEST_PACKET\n"); +- INFO("D: set/read dbug level\n"); +- break; +-#endif +- +- default: +- ERR("Command %c not implemented\n", cmd); +- break; +- } +- +- musb_platform_try_idle(musb, 0); +- +- return count; +-} +- +-static int musb_proc_read(char *page, char **start, +- off_t off, int count, int *eof, void *data) +-{ +- char *buffer = page; +- int code = 0; +- unsigned long flags; +- struct musb *musb = data; +- unsigned epnum; +- +- count -= off; +- count -= 1; /* for NUL at end */ +- if (count <= 0) +- return -EINVAL; +- +- spin_lock_irqsave(&musb->lock, flags); +- +- code = dump_header_stats(musb, buffer); +- if (code > 0) { +- buffer += code; +- count -= code; +- } +- +- /* generate the report for the end points */ +- /* REVISIT ... not unless something's connected! */ +- for (epnum = 0; count >= 0 && epnum < musb->nr_endpoints; +- epnum++) { +- code = dump_end_info(musb, epnum, buffer, count); +- if (code > 0) { +- buffer += code; +- count -= code; +- } +- } +- +- musb_platform_try_idle(musb, 0); +- +- spin_unlock_irqrestore(&musb->lock, flags); +- *eof = 1; +- +- return buffer - page; +-} +- +-void __devexit musb_debug_delete(char *name, struct musb *musb) +-{ +- if (musb->proc_entry) +- remove_proc_entry(name, NULL); +-} +- +-struct proc_dir_entry *__init +-musb_debug_create(char *name, struct musb *data) +-{ +- struct proc_dir_entry *pde; +- +- /* FIXME convert everything to seq_file; then later, debugfs */ +- +- if (!name) +- return NULL; +- +- pde = create_proc_entry(name, S_IFREG | S_IRUGO | S_IWUSR, NULL); +- data->proc_entry = pde; +- if (pde) { +- pde->data = data; +- /* pde->owner = THIS_MODULE; */ +- +- pde->read_proc = musb_proc_read; +- pde->write_proc = musb_proc_write; +- +- pde->size = 0; +- +- pr_debug("Registered /proc/%s\n", name); +- } else { +- pr_debug("Cannot create a valid proc file entry"); +- } +- +- return pde; +-} |
