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

Commit 598f22e1 authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Greg Kroah-Hartman
Browse files

USB: m66592-udc: fixes some problems



This patch incorporates some updates from the review of the
Renesas m66592-udc driver.  Updates include:

 - Fix some locking bugs; and add a few sparse annotations
 - Don't #define __iomem !
 - Lots of whitespace fixes (most of the patch by volume)
 - Some #include file trimmage
 - Other checkpatch.pl and sparse updates
 - Alphabetized and slightly-more-informative Kconfig
 - Don't use the ID which was assigned to the amd5536udc driver.
 - Remove pointless suspend/resume methods updating obsolete field.
 - Some section fixups
 - Fix some leak bugs
 - Fix byteswapping

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarYoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent d8fbba2f
Loading
Loading
Loading
Loading
+18 −18
Original line number Diff line number Diff line
@@ -177,6 +177,24 @@ config USB_PXA2XX_SMALL
	default y if USB_ETH
	default y if USB_G_SERIAL

config USB_GADGET_M66592
	boolean "Renesas M66592 USB Peripheral Controller"
	select USB_GADGET_DUALSPEED
	help
	   M66592 is a discrete USB peripheral controller chip that
	   supports both full and high speed USB 2.0 data transfers.
	   It has seven configurable endpoints, and endpoint zero.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "m66592_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_M66592
	tristate
	depends on USB_GADGET_M66592
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_GOKU
	boolean "Toshiba TC86C001 'Goku-S'"
	depends on PCI
@@ -282,24 +300,6 @@ config USB_AT91
	depends on USB_GADGET_AT91
	default USB_GADGET

config USB_GADGET_M66592
	boolean "M66592 driver"
	select USB_GADGET_DUALSPEED
	help
	   M66592 is a USB 2.0 peripheral controller.

	   It has seven configurable endpoints, and endpoint zero.

	   Say "y" to link the driver statically, or "m" to build a
	   dynamically linked module called "m66592_udc" and force all
	   gadget drivers to also be dynamically linked.

config USB_M66592
	tristate
	depends on USB_GADGET_M66592
	default USB_GADGET
	select USB_GADGET_SELECTED

config USB_GADGET_DUMMY_HCD
	boolean "Dummy HCD (DEVELOPMENT)"
	depends on (USB=y || (USB=m && USB_GADGET=m)) && EXPERIMENTAL
+1 −1
Original line number Diff line number Diff line
@@ -211,6 +211,6 @@ static inline int usb_gadget_controller_number(struct usb_gadget *gadget)
	else if (gadget_is_amd5536udc(gadget))
		return 0x20;
	else if (gadget_is_m66592(gadget))
		return 0x20;
		return 0x21;
	return -ENOENT;
}
+127 −128
Original line number Diff line number Diff line
@@ -21,26 +21,18 @@
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/smp_lock.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/delay.h>
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/io.h>
#include <linux/platform_device.h>

#include <linux/usb/ch9.h>
#include <linux/usb_gadget.h>

#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>

#include "m66592-udc.h"

MODULE_DESCRIPTION("M66592 USB gadget driiver");

MODULE_DESCRIPTION("M66592 USB gadget driver");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Yoshihiro Shimoda");

@@ -49,16 +41,21 @@ MODULE_AUTHOR("Yoshihiro Shimoda");
/* module parameters */
static unsigned short clock = M66592_XTAL24;
module_param(clock, ushort, 0644);
MODULE_PARM_DESC(clock, "input clock: 48MHz=32768, 24MHz=16384, 12MHz=0(default=16384)");
MODULE_PARM_DESC(clock, "input clock: 48MHz=32768, 24MHz=16384, 12MHz=0 "
		"(default=16384)");

static unsigned short vif = M66592_LDRV;
module_param(vif, ushort, 0644);
MODULE_PARM_DESC(vif, "input VIF: 3.3V=32768, 1.5V=0 (default=32768)");
static unsigned short endian = 0;

static unsigned short endian;
module_param(endian, ushort, 0644);
MODULE_PARM_DESC(endian, "data endian: big=256, little=0 (default=0)");

static unsigned short irq_sense = M66592_INTL;
module_param(irq_sense, ushort, 0644);
MODULE_PARM_DESC(irq_sense, "IRQ sense: low level=2, falling edge=0(default=2)");
MODULE_PARM_DESC(irq_sense, "IRQ sense: low level=2, falling edge=0 "
		"(default=2)");

static const char udc_name[] = "m66592_udc";
static const char *m66592_ep_name[] = {
@@ -72,8 +69,8 @@ static int m66592_queue(struct usb_ep *_ep, struct usb_request *_req,
			gfp_t gfp_flags);

static void transfer_complete(struct m66592_ep *ep,
			      struct m66592_request *req,
			      int status);
		struct m66592_request *req, int status);

/*-------------------------------------------------------------------------*/
static inline u16 get_usb_speed(struct m66592 *m66592)
{
@@ -115,6 +112,8 @@ static void m66592_usb_connect(struct m66592 *m66592)
}

static void m66592_usb_disconnect(struct m66592 *m66592)
__releases(m66592->lock)
__acquires(m66592->lock)
{
	m66592_bclr(m66592, M66592_CTRE, M66592_INTENB0);
	m66592_bclr(m66592, M66592_WDST | M66592_RDST | M66592_CMPL,
@@ -385,7 +384,7 @@ static void m66592_ep_setting(struct m66592 *m66592, struct m66592_ep *ep,

	ep->pipectr = get_pipectr_addr(pipenum);
	ep->pipenum = pipenum;
	ep->ep.maxpacket = desc->wMaxPacketSize;
	ep->ep.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
	m66592->pipenum2ep[pipenum] = ep;
	m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep;
	INIT_LIST_HEAD(&ep->queue);
@@ -426,8 +425,8 @@ static int alloc_pipe_config(struct m66592_ep *ep,
				printk(KERN_ERR "bulk pipe is insufficient\n");
				return -ENODEV;
			} else {
				info.pipe = M66592_BASE_PIPENUM_ISOC +
					    m66592->isochronous;
				info.pipe = M66592_BASE_PIPENUM_ISOC
						+ m66592->isochronous;
				counter = &m66592->isochronous;
			}
		} else {
@@ -462,7 +461,7 @@ static int alloc_pipe_config(struct m66592_ep *ep,
	ep->type = info.type;

	info.epnum = desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
	info.maxpacket = desc->wMaxPacketSize;
	info.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
	info.interval = desc->bInterval;
	if (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
		info.dir_in = 1;
@@ -572,8 +571,9 @@ static void start_packet_read(struct m66592_ep *ep, struct m66592_request *req)
			pipe_change(m66592, pipenum);
			m66592_bset(m66592, M66592_TRENB, ep->fifosel);
			m66592_write(m66592,
				     (req->req.length + ep->ep.maxpacket - 1) /
				     ep->ep.maxpacket, ep->fifotrn);
				(req->req.length + ep->ep.maxpacket - 1)
					/ ep->ep.maxpacket,
				ep->fifotrn);
		}
		pipe_start(m66592, pipenum);	/* trigger once */
		pipe_irq_enable(m66592, pipenum);
@@ -659,8 +659,9 @@ static void m66592_start_xclock(struct m66592 *m66592)

/*-------------------------------------------------------------------------*/
static void transfer_complete(struct m66592_ep *ep,
			      struct m66592_request *req,
			      int status)
		struct m66592_request *req, int status)
__releases(m66592->lock)
__acquires(m66592->lock)
{
	int restart = 0;

@@ -680,8 +681,9 @@ static void transfer_complete(struct m66592_ep *ep,
	if (!list_empty(&ep->queue))
		restart = 1;

	if (likely(req->req.complete))
	spin_unlock(&ep->m66592->lock);
	req->req.complete(&ep->ep, &req->req);
	spin_lock(&ep->m66592->lock);

	if (restart) {
		req = list_entry(ep->queue.next, struct m66592_request, queue);
@@ -693,7 +695,7 @@ static void transfer_complete(struct m66592_ep *ep,
static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req)
{
	int i;
	volatile u16 tmp;
	u16 tmp;
	unsigned bufsize;
	size_t size;
	void *buf;
@@ -731,8 +733,9 @@ static void irq_ep0_write(struct m66592_ep *ep, struct m66592_request *req)
	req->req.actual += size;

	/* check transfer finish */
	if ((!req->req.zero && (req->req.actual == req->req.length)) ||
	    (size % ep->ep.maxpacket) || (size == 0)) {
	if ((!req->req.zero && (req->req.actual == req->req.length))
			|| (size % ep->ep.maxpacket)
			|| (size == 0)) {
		disable_irq_ready(m66592, pipenum);
		disable_irq_empty(m66592, pipenum);
	} else {
@@ -768,16 +771,19 @@ static void irq_packet_write(struct m66592_ep *ep, struct m66592_request *req)
	/* write fifo */
	if (req->req.buf) {
		m66592_write_fifo(m66592, ep->fifoaddr, buf, size);
		if ((size == 0) || ((size % ep->ep.maxpacket) != 0) ||
		    ((bufsize != ep->ep.maxpacket) && (bufsize > size)))
		if ((size == 0)
				|| ((size % ep->ep.maxpacket) != 0)
				|| ((bufsize != ep->ep.maxpacket)
					&& (bufsize > size)))
			m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
	}

	/* update parameters */
	req->req.actual += size;
	/* check transfer finish */
	if ((!req->req.zero && (req->req.actual == req->req.length)) ||
	    (size % ep->ep.maxpacket) || (size == 0)) {
	if ((!req->req.zero && (req->req.actual == req->req.length))
			|| (size % ep->ep.maxpacket)
			|| (size == 0)) {
		disable_irq_ready(m66592, pipenum);
		enable_irq_empty(m66592, pipenum);
	} else {
@@ -821,8 +827,9 @@ static void irq_packet_read(struct m66592_ep *ep, struct m66592_request *req)
	req->req.actual += size;

	/* check transfer finish */
	if ((!req->req.zero && (req->req.actual == req->req.length)) ||
	    (size % ep->ep.maxpacket) || (size == 0)) {
	if ((!req->req.zero && (req->req.actual == req->req.length))
			|| (size % ep->ep.maxpacket)
			|| (size == 0)) {
		pipe_stop(m66592, pipenum);
		pipe_irq_disable(m66592, pipenum);
		finish = 1;
@@ -909,23 +916,26 @@ static void irq_pipe_empty(struct m66592 *m66592, u16 status, u16 enb)
}

static void get_status(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
__releases(m66592->lock)
__acquires(m66592->lock)
{
	struct m66592_ep *ep;
	u16 pid;
	u16 status = 0;
	u16 w_index = le16_to_cpu(ctrl->wIndex);

	switch (ctrl->bRequestType & USB_RECIP_MASK) {
	case USB_RECIP_DEVICE:
		status = 1;	/* selfpower */
		status = 1 << USB_DEVICE_SELF_POWERED;
		break;
	case USB_RECIP_INTERFACE:
		status = 0;
		break;
	case USB_RECIP_ENDPOINT:
		ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
		ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
		pid = control_reg_get_pid(m66592, ep->pipenum);
		if (pid == M66592_PID_STALL)
			status = 1;
			status = 1 << USB_ENDPOINT_HALT;
		else
			status = 0;
		break;
@@ -934,11 +944,13 @@ static void get_status(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
		return;		/* exit */
	}

	*m66592->ep0_buf = status;
	m66592->ep0_req->buf = m66592->ep0_buf;
	m66592->ep0_data = cpu_to_le16(status);
	m66592->ep0_req->buf = &m66592->ep0_data;
	m66592->ep0_req->length = 2;
	/* AV: what happens if we get called again before that gets through? */
	spin_unlock(&m66592->lock);
	m66592_queue(m66592->gadget.ep0, m66592->ep0_req, GFP_KERNEL);
	spin_lock(&m66592->lock);
}

static void clear_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
@@ -953,8 +965,9 @@ static void clear_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
	case USB_RECIP_ENDPOINT: {
		struct m66592_ep *ep;
		struct m66592_request *req;
		u16 w_index = le16_to_cpu(ctrl->wIndex);

		ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
		ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
		pipe_stop(m66592, ep->pipenum);
		control_reg_sqclr(m66592, ep->pipenum);

@@ -989,8 +1002,9 @@ static void set_feature(struct m66592 *m66592, struct usb_ctrlrequest *ctrl)
		break;
	case USB_RECIP_ENDPOINT: {
		struct m66592_ep *ep;
		u16 w_index = le16_to_cpu(ctrl->wIndex);

		ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
		ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
		pipe_stall(m66592, ep->pipenum);

		control_end(m66592, 1);
@@ -1066,14 +1080,16 @@ static void irq_device_state(struct m66592 *m66592)
	}
	if (m66592->old_dvsq == M66592_DS_CNFG && dvsq != M66592_DS_CNFG)
		m66592_update_usb_speed(m66592);
	if ((dvsq == M66592_DS_CNFG || dvsq == M66592_DS_ADDS) &&
	    m66592->gadget.speed == USB_SPEED_UNKNOWN)
	if ((dvsq == M66592_DS_CNFG || dvsq == M66592_DS_ADDS)
			&& m66592->gadget.speed == USB_SPEED_UNKNOWN)
		m66592_update_usb_speed(m66592);

	m66592->old_dvsq = dvsq;
}

static void irq_control_stage(struct m66592 *m66592)
__releases(m66592->lock)
__acquires(m66592->lock)
{
	struct usb_ctrlrequest ctrl;
	u16 ctsq;
@@ -1095,8 +1111,10 @@ static void irq_control_stage(struct m66592 *m66592)
	case M66592_CS_WRDS:
	case M66592_CS_WRND:
		if (setup_packet(m66592, &ctrl)) {
			spin_unlock(&m66592->lock);
			if (m66592->driver->setup(&m66592->gadget, &ctrl) < 0)
				pipe_stall(m66592, 0);
			spin_lock(&m66592->lock);
		}
		break;
	case M66592_CS_RDSS:
@@ -1119,6 +1137,8 @@ static irqreturn_t m66592_irq(int irq, void *_m66592)
	u16 savepipe;
	u16 mask0;

	spin_lock(&m66592->lock);

	intsts0 = m66592_read(m66592, M66592_INTSTS0);
	intenb0 = m66592_read(m66592, M66592_INTENB0);

@@ -1134,7 +1154,7 @@ static irqreturn_t m66592_irq(int irq, void *_m66592)
		bempenb = m66592_read(m66592, M66592_BEMPENB);

		if (mask0 & M66592_VBINT) {
			m66592_write(m66592, (u16)~M66592_VBINT,
			m66592_write(m66592,  0xffff & ~M66592_VBINT,
					M66592_INTSTS0);
			m66592_start_xclock(m66592);

@@ -1149,12 +1169,12 @@ static irqreturn_t m66592_irq(int irq, void *_m66592)
		if (intsts0 & M66592_DVSQ)
			irq_device_state(m66592);

		if ((intsts0 & M66592_BRDY) && (intenb0 & M66592_BRDYE) &&
		    (brdysts & brdyenb)) {
		if ((intsts0 & M66592_BRDY) && (intenb0 & M66592_BRDYE)
				&& (brdysts & brdyenb)) {
			irq_pipe_ready(m66592, brdysts, brdyenb);
		}
		if ((intsts0 & M66592_BEMP) && (intenb0 & M66592_BEMPE) &&
		    (bempsts & bempenb)) {
		if ((intsts0 & M66592_BEMP) && (intenb0 & M66592_BEMPE)
				&& (bempsts & bempenb)) {
			irq_pipe_empty(m66592, bempsts, bempenb);
		}

@@ -1164,6 +1184,7 @@ static irqreturn_t m66592_irq(int irq, void *_m66592)

	m66592_write(m66592, savepipe, M66592_CFIFOSEL);

	spin_unlock(&m66592->lock);
	return IRQ_HANDLED;
}

@@ -1335,11 +1356,6 @@ static int m66592_set_halt(struct usb_ep *_ep, int value)
	return ret;
}

static int m66592_fifo_status(struct usb_ep *_ep)
{
	return -EOPNOTSUPP;
}

static void m66592_fifo_flush(struct usb_ep *_ep)
{
	struct m66592_ep *ep;
@@ -1365,7 +1381,6 @@ static struct usb_ep_ops m66592_ep_ops = {
	.dequeue	= m66592_dequeue,

	.set_halt	= m66592_set_halt,
	.fifo_status	= m66592_fifo_status,
	.fifo_flush	= m66592_fifo_flush,
};

@@ -1377,11 +1392,10 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
	struct m66592 *m66592 = the_controller;
	int retval;

	if (!driver ||
	    driver->speed != USB_SPEED_HIGH ||
	    !driver->bind ||
	    !driver->unbind ||
	    !driver->setup)
	if (!driver
			|| driver->speed != USB_SPEED_HIGH
			|| !driver->bind
			|| !driver->setup)
		return -EINVAL;
	if (!m66592)
		return -ENODEV;
@@ -1413,8 +1427,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
		m66592->old_vbus = m66592_read(m66592,
					 M66592_INTSTS0) & M66592_VBSTS;
		m66592->scount = M66592_MAX_SAMPLING;
		mod_timer(&m66592->timer,
			  jiffies + msecs_to_jiffies(50));
		mod_timer(&m66592->timer, jiffies + msecs_to_jiffies(50));
	}

	return 0;
@@ -1432,6 +1445,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
	struct m66592 *m66592 = the_controller;
	unsigned long flags;

	if (driver != m66592->driver || !driver->unbind)
		return -EINVAL;

	spin_lock_irqsave(&m66592->lock, flags);
	if (m66592->gadget.speed != USB_SPEED_UNKNOWN)
		m66592_usb_disconnect(m66592);
@@ -1461,39 +1477,28 @@ static struct usb_gadget_ops m66592_gadget_ops = {
	.get_frame		= m66592_get_frame,
};

#if defined(CONFIG_PM)
static int m66592_suspend(struct platform_device *pdev, pm_message_t state)
{
	pdev->dev.power.power_state = state;
	return 0;
}

static int m66592_resume(struct platform_device *pdev)
{
	pdev->dev.power.power_state = PMSG_ON;
	return 0;
}
#else	/* if defined(CONFIG_PM) */
#define m66592_suspend		NULL
#define m66592_resume		NULL
#endif

static int __init_or_module m66592_remove(struct platform_device *pdev)
static int __exit m66592_remove(struct platform_device *pdev)
{
	struct m66592		*m66592 = dev_get_drvdata(&pdev->dev);

	del_timer_sync(&m66592->timer);
	iounmap(m66592->reg);
	free_irq(platform_get_irq(pdev, 0), m66592);
	m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
	kfree(m66592);
	return 0;
}

static void nop_completion(struct usb_ep *ep, struct usb_request *r)
{
}

#define resource_len(r) (((r)->end - (r)->start) + 1)

static int __init m66592_probe(struct platform_device *pdev)
{
	struct resource *res = NULL;
	int irq = -1;
	struct resource *res;
	int irq;
	void __iomem *reg = NULL;
	struct m66592 *m66592 = NULL;
	int ret = 0;
@@ -1583,20 +1588,18 @@ static int __init m66592_probe(struct platform_device *pdev)

	the_controller = m66592;

	/* AV: leaks */
	m66592->ep0_req = m66592_alloc_request(&m66592->ep[0].ep, GFP_KERNEL);
	if (m66592->ep0_req == NULL)
		goto clean_up;
	/* AV: leaks, and do we really need it separately allocated? */
	m66592->ep0_buf = kzalloc(2, GFP_KERNEL);
	if (m66592->ep0_buf == NULL)
		goto clean_up;
		goto clean_up2;
	m66592->ep0_req->complete = nop_completion;

	init_controller(m66592);

	printk("driver %s, %s\n", udc_name, DRIVER_VERSION);
	dev_info(&pdev->dev, "version %s\n", DRIVER_VERSION);
	return 0;

clean_up2:
	free_irq(irq, m66592);
clean_up:
	if (m66592) {
		if (m66592->ep0_req)
@@ -1611,10 +1614,7 @@ static int __init m66592_probe(struct platform_device *pdev)

/*-------------------------------------------------------------------------*/
static struct platform_driver m66592_driver = {
	.probe =	m66592_probe,
	.remove =	m66592_remove,
	.suspend =	m66592_suspend,
	.resume =	m66592_resume,
	.remove =	__exit_p(m66592_remove),
	.driver		= {
		.name =	(char *) udc_name,
	},
@@ -1622,7 +1622,7 @@ static struct platform_driver m66592_driver = {

static int __init m66592_udc_init(void)
{
	return platform_driver_register(&m66592_driver);
	return platform_driver_probe(&m66592_driver, m66592_probe);
}
module_init(m66592_udc_init);

@@ -1631,4 +1631,3 @@ static void __exit m66592_udc_cleanup(void)
	platform_driver_unregister(&m66592_driver);
}
module_exit(m66592_udc_cleanup);
+304 −306
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@
#define M66592_RCKE		0x1000	/* b12: Register clock enable */
#define M66592_PLLC		0x0800	/* b11: PLL control */
#define M66592_SCKE		0x0400	/* b10: USB clock enable */
#define	M66592_ATCKM		0x0100	/* b8: Automatic supply functional enable */
#define M66592_ATCKM		0x0100	/* b8: Automatic clock supply */
#define M66592_HSE		0x0080	/* b7: Hi-speed enable */
#define M66592_DCFM		0x0040	/* b6: Controller function select  */
#define M66592_DMRPD		0x0020	/* b5: D- pull down control */
@@ -103,12 +103,12 @@
#define M66592_REW		0x4000	/* b14: Buffer rewind */
#define M66592_DCLRM		0x2000	/* b13: DMA buffer clear mode */
#define M66592_DREQE		0x1000	/* b12: DREQ output enable */
#define	M66592_MBW		0x0400	/* b10: Maximum bit width for FIFO access */
#define M66592_MBW		0x0400	/* b10: Maximum bit width for FIFO */
#define   M66592_MBW_8		 0x0000   /*  8bit */
#define   M66592_MBW_16		 0x0400   /* 16bit */
#define M66592_TRENB		0x0200	/* b9: Transaction counter enable */
#define M66592_TRCLR		0x0100	/* b8: Transaction counter clear */
#define	M66592_DEZPM		0x0080	/* b7: Zero-length packet additional mode */
#define M66592_DEZPM		0x0080	/* b7: Zero-length packet mode */
#define M66592_ISEL		0x0020	/* b5: DCP FIFO port direction select */
#define M66592_CURPIPE		0x0007	/* b2-0: PIPE select */

@@ -134,7 +134,7 @@
#define M66592_RSME	0x4000	/* b14: Resume interrupt */
#define M66592_SOFE	0x2000	/* b13: Frame update interrupt */
#define M66592_DVSE	0x1000	/* b12: Device state transition interrupt */
#define	M66592_CTRE	0x0800	/* b11: Control transfer stage transition interrupt */
#define M66592_CTRE	0x0800	/* b11: Control transfer stage transition irq */
#define M66592_BEMPE	0x0400	/* b10: Buffer empty interrupt */
#define M66592_NRDYE	0x0200	/* b9: Buffer not ready interrupt */
#define M66592_BRDYE	0x0100	/* b8: Buffer ready interrupt */
@@ -142,8 +142,8 @@
#define M66592_SADR	0x0040	/* b6: Set address executed interrupt */
#define M66592_SCFG	0x0020	/* b5: Set configuration executed interrupt */
#define M66592_SUSP	0x0010	/* b4: Suspend detected interrupt */
#define	M66592_WDST	0x0008	/* b3: Control write data stage completed interrupt */
#define	M66592_RDST	0x0004	/* b2: Control read data stage completed interrupt */
#define M66592_WDST	0x0008	/* b3: Control write data stage completed irq */
#define M66592_RDST	0x0004	/* b2: Control read data stage completed irq */
#define M66592_CMPL	0x0002	/* b1: Control transfer complete interrupt */
#define M66592_SERR	0x0001	/* b0: Sequence error interrupt */

@@ -199,8 +199,8 @@
#define M66592_VBINT		0x8000	/* b15: VBUS interrupt */
#define M66592_RESM		0x4000	/* b14: Resume interrupt */
#define M66592_SOFR		0x2000	/* b13: SOF frame update interrupt */
#define	M66592_DVST		0x1000	/* b12: Device state transition interrupt */
#define	M66592_CTRT		0x0800	/* b11: Control transfer stage transition interrupt */
#define M66592_DVST		0x1000	/* b12: Device state transition */
#define M66592_CTRT		0x0800	/* b11: Control stage transition */
#define M66592_BEMP		0x0400	/* b10: Buffer empty interrupt */
#define M66592_NRDY		0x0200	/* b9: Buffer not ready interrupt */
#define M66592_BRDY		0x0100	/* b8: Buffer ready interrupt */
@@ -219,7 +219,7 @@
#define M66592_VALID		0x0008	/* b3: Setup packet detected flag */
#define M66592_CTSQ		0x0007	/* b2-0: Control transfer stage */
#define   M66592_CS_SQER	 0x0006	  /* Sequence error */
#define	  M66592_CS_WRND	 0x0005		  /* Control write nodata status stage */
#define   M66592_CS_WRND	 0x0005	  /* Control write nodata status */
#define   M66592_CS_WRSS	 0x0004	  /* Control write status stage */
#define   M66592_CS_WRDS	 0x0003	  /* Control write data stage */
#define   M66592_CS_RDSS	 0x0002	  /* Control read status stage */
@@ -265,7 +265,7 @@
#define   M66592_SET_INTERFACE		 0x0B00
#define   M66592_SYNCH_FRAME		 0x0C00
#define M66592_bmRequestType		0x00FF	/* b7-0: bmRequestType */
#define	M66592_bmRequestTypeDir		0x0080	/* b7  : Data transfer direction */
#define M66592_bmRequestTypeDir		0x0080	/* b7  : Data direction */
#define   M66592_HOST_TO_DEVICE		 0x0000
#define   M66592_DEVICE_TO_HOST		 0x0080
#define M66592_bmRequestTypeType	0x0060	/* b6-5: Type */
@@ -300,7 +300,7 @@

#define M66592_USBINDEX			0x58
#define M66592_wIndex			0xFFFF	/* b15-0: wIndex */
#define	M66592_TEST_SELECT		0xFF00	/* b15-b8: Test Mode Selectors */
#define M66592_TEST_SELECT		0xFF00	/* b15-b8: Test Mode */
#define   M66592_TEST_J			 0x0100	  /* Test_J */
#define   M66592_TEST_K			 0x0200	  /* Test_K */
#define   M66592_TEST_SE0_NAK		 0x0300	  /* Test_SE0_NAK */
@@ -308,7 +308,7 @@
#define   M66592_TEST_FORCE_ENABLE	 0x0500	  /* Test_Force_Enable */
#define   M66592_TEST_STSelectors	 0x0600	  /* Standard test selectors */
#define   M66592_TEST_Reserved		 0x4000	  /* Reserved */
#define	  M66592_TEST_VSTModes		 0xC000		  /* Vendor-specific test modes */
#define   M66592_TEST_VSTModes		 0xC000	  /* Vendor-specific tests */
#define M66592_EP_DIR			0x0080	/* b7: Endpoint Direction */
#define   M66592_EP_DIR_IN		 0x0080
#define   M66592_EP_DIR_OUT		 0x0000
@@ -317,7 +317,7 @@
#define M66592_wLength		0xFFFF	/* b15-0: wLength */

#define M66592_DCPCFG		0x5C
#define	M66592_CNTMD		0x0100	/* b8: Continuous transfer mode select */
#define M66592_CNTMD		0x0100	/* b8: Continuous transfer mode */
#define M66592_DIR		0x0010	/* b4: Control transfer DIR select */

#define M66592_DCPMAXP		0x5E
@@ -326,7 +326,7 @@
#define   M66592_DEVICE_1	 0x4000		  /* Device address 1 */
#define   M66592_DEVICE_2	 0x8000		  /* Device address 2 */
#define   M66592_DEVICE_3	 0xC000		  /* Device address 3 */
#define	M66592_MAXP		0x007F	/* b6-0: Maxpacket size of default control pipe */
#define M66592_MAXP		0x007F	/* b6-0: Maxpacket size of ep0 */

#define M66592_DCPCTR		0x60
#define M66592_BSTS		0x8000	/* b15: Buffer status */
@@ -334,7 +334,7 @@
#define M66592_SQCLR		0x0100	/* b8: Sequence toggle bit clear */
#define M66592_SQSET		0x0080	/* b7: Sequence toggle bit set */
#define M66592_SQMON		0x0040	/* b6: Sequence toggle bit monitor */
#define	M66592_CCPL		0x0004	/* b2: Enable control transfer complete */
#define M66592_CCPL		0x0004	/* b2: control transfer complete */
#define M66592_PID		0x0003	/* b1-0: Response PID */
#define   M66592_PID_STALL	 0x0002		  /* STALL */
#define   M66592_PID_BUF	 0x0001		  /* BUF */
@@ -356,9 +356,9 @@
#define   M66592_ISO		 0xC000		  /* Isochronous */
#define   M66592_INT		 0x8000		  /* Interrupt */
#define   M66592_BULK		 0x4000		  /* Bulk */
#define	M66592_BFRE		0x0400	/* b10: Buffer ready interrupt mode select */
#define M66592_BFRE		0x0400	/* b10: Buffer ready interrupt mode */
#define M66592_DBLB		0x0200	/* b9: Double buffer mode select */
#define	M66592_CNTMD		0x0100	/* b8: Continuous transfer mode select */
#define M66592_CNTMD		0x0100	/* b8: Continuous transfer mode */
#define M66592_SHTNAK		0x0080	/* b7: Transfer end NAK */
#define M66592_DIR		0x0010	/* b4: Transfer direction select */
#define   M66592_DIR_H_OUT	 0x0010		  /* HOST OUT */
@@ -391,8 +391,8 @@
#define M66592_MXPS		0x07FF	/* b10-0: Maxpacket size */

#define M66592_PIPEPERI		0x6C
#define	M66592_IFIS		0x1000	/* b12: Isochronous in-buffer flush mode select */
#define	M66592_IITV		0x0007	/* b2-0: Isochronous interval */
#define M66592_IFIS		0x1000	/* b12: ISO in-buffer flush mode */
#define M66592_IITV		0x0007	/* b2-0: ISO interval */

#define M66592_PIPE1CTR		0x70
#define M66592_PIPE2CTR		0x72
@@ -402,7 +402,7 @@
#define M66592_PIPE6CTR		0x7A
#define M66592_PIPE7CTR		0x7C
#define M66592_BSTS		0x8000	/* b15: Buffer status */
#define	M66592_INBUFM		0x4000	/* b14: IN buffer monitor (Only for PIPE1 to 5) */
#define M66592_INBUFM		0x4000	/* b14: IN buffer monitor (PIPE 1-5) */
#define M66592_ACLRM		0x0200	/* b9: Out buffer auto clear mode */
#define M66592_SQCLR		0x0100	/* b8: Sequence toggle bit clear */
#define M66592_SQSET		0x0080	/* b7: Sequence toggle bit set */
@@ -412,8 +412,6 @@
#define M66592_INVALID_REG	0x7E


#define __iomem

#define get_pipectr_addr(pipenum)	(M66592_PIPE1CTR + (pipenum - 1) * 2)

#define M66592_MAX_SAMPLING	10
@@ -477,7 +475,7 @@ struct m66592 {
	struct m66592_ep	*epaddr2ep[16];

	struct usb_request	*ep0_req;	/* for internal request */
	u16			*ep0_buf;	/* for internal request */
	u16			ep0_data;	/* for internal request */

	struct timer_list	timer;