diff options
Diffstat (limited to 'drivers/usb/gadget/amd5536udc.c')
| -rw-r--r-- | drivers/usb/gadget/amd5536udc.c | 308 | 
1 files changed, 102 insertions, 206 deletions
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 9034e034472..41b062eb4de 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -8,15 +8,6 @@   * it under the terms of the GNU General Public License as published by   * the Free Software Foundation; either version 2 of the License, or   * (at your option) any later version. - * - * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */  /* @@ -38,7 +29,7 @@  /* Driver strings */  #define UDC_MOD_DESCRIPTION		"AMD 5536 UDC - USB Device Controller" -#define UDC_DRIVER_VERSION_STRING	"01.00.0206 - $Revision: #3 $" +#define UDC_DRIVER_VERSION_STRING	"01.00.0206"  /* system */  #include <linux/module.h> @@ -49,7 +40,6 @@  #include <linux/sched.h>  #include <linux/slab.h>  #include <linux/errno.h> -#include <linux/init.h>  #include <linux/timer.h>  #include <linux/list.h>  #include <linux/interrupt.h> @@ -60,9 +50,9 @@  #include <linux/device.h>  #include <linux/io.h>  #include <linux/irq.h> +#include <linux/prefetch.h>  #include <asm/byteorder.h> -#include <asm/system.h>  #include <asm/unaligned.h>  /* gadget stack */ @@ -148,7 +138,7 @@ static DECLARE_TASKLET(disconnect_tasklet, udc_tasklet_disconnect,  /* endpoint names used for print */  static const char ep0_string[] = "ep0in"; -static const char *ep_string[] = { +static const char *const ep_string[] = {  	ep0_string,  	"ep1in-int", "ep2in-bulk", "ep3in-bulk", "ep4in-bulk", "ep5in-bulk",  	"ep6in-bulk", "ep7in-bulk", "ep8in-bulk", "ep9in-bulk", "ep10in-bulk", @@ -160,15 +150,15 @@ static const char *ep_string[] = {  };  /* DMA usage flag */ -static int use_dma = 1; +static bool use_dma = 1;  /* packet per buffer dma */ -static int use_dma_ppb = 1; +static bool use_dma_ppb = 1;  /* with per descr. update */ -static int use_dma_ppb_du; +static bool use_dma_ppb_du;  /* buffer fill mode */  static int use_dma_bufferfill_mode;  /* full speed only mode */ -static int use_fullspeed; +static bool use_fullspeed;  /* tx buffer size for high speed */  static unsigned long hs_tx_buf = UDC_EPIN_BUFF_SIZE; @@ -212,9 +202,8 @@ static void print_regs(struct udc *dev)  		DBG(dev, "DMA mode       = BF (buffer fill mode)\n");  		dev_info(&dev->pdev->dev, "DMA mode (%s)\n", "BF");  	} -	if (!use_dma) { +	if (!use_dma)  		dev_info(&dev->pdev->dev, "FIFO mode\n"); -	}  	DBG(dev, "-------------------------------------------------------\n");  } @@ -278,7 +267,7 @@ static int udc_enable_dev_setup_interrupts(struct udc *dev)  	return 0;  } -/* Calculates fifo start of endpoint based on preceeding endpoints */ +/* Calculates fifo start of endpoint based on preceding endpoints */  static int udc_set_txfifo_addr(struct udc_ep *ep)  {  	struct udc	*dev; @@ -343,7 +332,7 @@ udc_ep_enable(struct usb_ep *usbep, const struct usb_endpoint_descriptor *desc)  		return -ESHUTDOWN;  	spin_lock_irqsave(&dev->lock, iflags); -	ep->desc = desc; +	ep->ep.desc = desc;  	ep->halted = 0; @@ -353,7 +342,7 @@ udc_ep_enable(struct usb_ep *usbep, const struct usb_endpoint_descriptor *desc)  	writel(tmp, &dev->ep[ep->num].regs->ctl);  	/* set max packet size */ -	maxpacket = le16_to_cpu(desc->wMaxPacketSize); +	maxpacket = usb_endpoint_maxp(desc);  	tmp = readl(&dev->ep[ep->num].regs->bufout_maxpkt);  	tmp = AMD_ADDBITS(tmp, maxpacket, UDC_EP_MAX_PKT_SIZE);  	ep->ep.maxpacket = maxpacket; @@ -452,11 +441,11 @@ static void ep_init(struct udc_regs __iomem *regs, struct udc_ep *ep)  	u32		tmp;  	VDBG(ep->dev, "ep-%d reset\n", ep->num); -	ep->desc = NULL; +	ep->ep.desc = NULL;  	ep->ep.ops = &udc_ep_ops;  	INIT_LIST_HEAD(&ep->queue); -	ep->ep.maxpacket = (u16) ~0; +	usb_ep_set_maxpacket_limit(&ep->ep,(u16) ~0);  	/* set NAK */  	tmp = readl(&ep->regs->ctl);  	tmp |= AMD_BIT(UDC_EPCTL_SNAK); @@ -498,7 +487,7 @@ static int udc_ep_disable(struct usb_ep *usbep)  		return -EINVAL;  	ep = container_of(usbep, struct udc_ep, ep); -	if (usbep->name == ep0_string || !ep->desc) +	if (usbep->name == ep0_string || !ep->ep.desc)  		return -EINVAL;  	DBG(ep->dev, "Disable ep-%d\n", ep->num); @@ -577,9 +566,8 @@ udc_free_request(struct usb_ep *usbep, struct usb_request *usbreq)  		VDBG(ep->dev, "req->td_data=%p\n", req->td_data);  		/* free dma chain if created */ -		if (req->chain_len > 1) { +		if (req->chain_len > 1)  			udc_free_dma_chain(ep->dev, req); -		}  		pci_pool_free(ep->dev->data_requests, req->td_data,  							req->td_phys); @@ -647,9 +635,8 @@ udc_txfifo_write(struct udc_ep *ep, struct usb_request *req)  		bytes = remaining;  	/* dwords first */ -	for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) { +	for (i = 0; i < bytes / UDC_DWORD_BYTES; i++)  		writel(*(buf + i), ep->txfifo); -	}  	/* remaining bytes must be written by byte access */  	for (j = 0; j < bytes % UDC_DWORD_BYTES; j++) { @@ -668,9 +655,8 @@ static int udc_rxfifo_read_dwords(struct udc *dev, u32 *buf, int dwords)  	VDBG(dev, "udc_read_dwords(): %d dwords\n", dwords); -	for (i = 0; i < dwords; i++) { +	for (i = 0; i < dwords; i++)  		*(buf + i) = readl(dev->rxfifo); -	}  	return 0;  } @@ -683,9 +669,8 @@ static int udc_rxfifo_read_bytes(struct udc *dev, u8 *buf, int bytes)  	VDBG(dev, "udc_read_bytes(): %d bytes\n", bytes);  	/* dwords first */ -	for (i = 0; i < bytes / UDC_DWORD_BYTES; i++) { +	for (i = 0; i < bytes / UDC_DWORD_BYTES; i++)  		*((u32 *)(buf + (i<<2))) = readl(dev->rxfifo); -	}  	/* remaining bytes must be read by byte access */  	if (bytes % UDC_DWORD_BYTES) { @@ -839,20 +824,8 @@ __acquires(ep->dev->lock)  	dev = ep->dev;  	/* unmap DMA */ -	if (req->dma_mapping) { -		if (ep->in) -			pci_unmap_single(dev->pdev, -					req->req.dma, -					req->req.length, -					PCI_DMA_TODEVICE); -		else -			pci_unmap_single(dev->pdev, -					req->req.dma, -					req->req.length, -					PCI_DMA_FROMDEVICE); -		req->dma_mapping = 0; -		req->req.dma = DMA_DONT_USE; -	} +	if (ep->dma) +		usb_gadget_unmap_request(&dev->gadget, &req->req, ep->in);  	halted = ep->halted;  	ep->halted = 1; @@ -905,9 +878,8 @@ static struct udc_data_dma *udc_get_last_dma_desc(struct udc_request *req)  	struct udc_data_dma	*td;  	td = req->td_data; -	while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L))) { +	while (td && !(td->status & AMD_BIT(UDC_DMA_IN_STS_L)))  		td = phys_to_virt(td->next); -	}  	return td; @@ -957,21 +929,18 @@ static int udc_create_dma_chain(  	dma_addr = DMA_DONT_USE;  	/* unset L bit in first desc for OUT */ -	if (!ep->in) { +	if (!ep->in)  		req->td_data->status &= AMD_CLEAR_BIT(UDC_DMA_IN_STS_L); -	}  	/* alloc only new desc's if not already available */  	len = req->req.length / ep->ep.maxpacket; -	if (req->req.length % ep->ep.maxpacket) { +	if (req->req.length % ep->ep.maxpacket)  		len++; -	}  	if (len > req->chain_len) {  		/* shorter chain already allocated before */ -		if (req->chain_len > 1) { +		if (req->chain_len > 1)  			udc_free_dma_chain(ep->dev, req); -		}  		req->chain_len = len;  		create_new_chain = 1;  	} @@ -1014,11 +983,12 @@ static int udc_create_dma_chain(  		/* link td and assign tx bytes */  		if (i == buf_len) { -			if (create_new_chain) { +			if (create_new_chain)  				req->td_data->next = dma_addr; -			} else { -				/* req->td_data->next = virt_to_phys(td); */ -			} +			/* +			else +				req->td_data->next = virt_to_phys(td); +			*/  			/* write tx bytes */  			if (ep->in) {  				/* first desc */ @@ -1032,11 +1002,12 @@ static int udc_create_dma_chain(  							UDC_DMA_IN_STS_TXBYTES);  			}  		} else { -			if (create_new_chain) { +			if (create_new_chain)  				last->next = dma_addr; -			} else { -				/* last->next = virt_to_phys(td); */ -			} +			/* +			else +				last->next = virt_to_phys(td); +			*/  			if (ep->in) {  				/* write tx bytes */  				td->status = AMD_ADDBITS(td->status, @@ -1093,7 +1064,7 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)  		return -EINVAL;  	ep = container_of(usbep, struct udc_ep, ep); -	if (!ep->desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX)) +	if (!ep->ep.desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX))  		return -EINVAL;  	VDBG(ep->dev, "udc_queue(): ep%d-in=%d\n", ep->num, ep->in); @@ -1103,20 +1074,11 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)  		return -ESHUTDOWN;  	/* map dma (usually done before) */ -	if (ep->dma && usbreq->length != 0 -			&& (usbreq->dma == DMA_DONT_USE || usbreq->dma == 0)) { +	if (ep->dma) {  		VDBG(dev, "DMA map req %p\n", req); -		if (ep->in) -			usbreq->dma = pci_map_single(dev->pdev, -						usbreq->buf, -						usbreq->length, -						PCI_DMA_TODEVICE); -		else -			usbreq->dma = pci_map_single(dev->pdev, -						usbreq->buf, -						usbreq->length, -						PCI_DMA_FROMDEVICE); -		req->dma_mapping = 1; +		retval = usb_gadget_map_request(&udc->gadget, usbreq, ep->in); +		if (retval) +			return retval;  	}  	VDBG(dev, "%s queue req %p, len %d req->td_data=%p buf %p\n", @@ -1159,7 +1121,7 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)  			goto finished;  		}  		if (ep->dma) { -			retval = prep_dma(ep, req, gfp); +			retval = prep_dma(ep, req, GFP_ATOMIC);  			if (retval != 0)  				goto finished;  			/* write desc pointer to enable DMA */ @@ -1227,7 +1189,7 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp)  		 * for PPB modes, because of chain creation reasons  		 */  		if (ep->in) { -			retval = prep_dma(ep, req, gfp); +			retval = prep_dma(ep, req, GFP_ATOMIC);  			if (retval != 0)  				goto finished;  		} @@ -1293,7 +1255,7 @@ static int udc_dequeue(struct usb_ep *usbep, struct usb_request *usbreq)  	unsigned long		iflags;  	ep = container_of(usbep, struct udc_ep, ep); -	if (!usbep || !usbreq || (!ep->desc && (ep->num != 0 +	if (!usbep || !usbreq || (!ep->ep.desc && (ep->num != 0  				&& ep->num != UDC_EP0OUT_IX)))  		return -EINVAL; @@ -1353,7 +1315,7 @@ udc_set_halt(struct usb_ep *usbep, int halt)  	pr_debug("set_halt %s: halt=%d\n", usbep->name, halt);  	ep = container_of(usbep, struct udc_ep, ep); -	if (!ep->desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX)) +	if (!ep->ep.desc && (ep->num != 0 && ep->num != UDC_EP0OUT_IX))  		return -EINVAL;  	if (!ep->dev->driver || ep->dev->gadget.speed == USB_SPEED_UNKNOWN)  		return -ESHUTDOWN; @@ -1437,10 +1399,16 @@ static int udc_wakeup(struct usb_gadget *gadget)  	return 0;  } +static int amd5536_udc_start(struct usb_gadget *g, +		struct usb_gadget_driver *driver); +static int amd5536_udc_stop(struct usb_gadget *g, +		struct usb_gadget_driver *driver);  /* gadget operations */  static const struct usb_gadget_ops udc_ops = {  	.wakeup		= udc_wakeup,  	.get_frame	= udc_get_frame, +	.udc_start	= amd5536_udc_start, +	.udc_stop	= amd5536_udc_stop,  };  /* Setups endpoint parameters, adds endpoints to linked list */ @@ -1482,11 +1450,10 @@ static int startup_registers(struct udc *dev)  	/* program speed */  	tmp = readl(&dev->regs->cfg); -	if (use_fullspeed) { +	if (use_fullspeed)  		tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_FS, UDC_DEVCFG_SPD); -	} else { +	else  		tmp = AMD_ADDBITS(tmp, UDC_DEVCFG_SPD_HS, UDC_DEVCFG_SPD); -	}  	writel(tmp, &dev->regs->cfg);  	return 0; @@ -1507,9 +1474,8 @@ static void udc_basic_init(struct udc *dev)  		mod_timer(&udc_timer, jiffies - 1);  	}  	/* stop poll stall timer */ -	if (timer_pending(&udc_pollstall_timer)) { +	if (timer_pending(&udc_pollstall_timer))  		mod_timer(&udc_pollstall_timer, jiffies - 1); -	}  	/* disable DMA */  	tmp = readl(&dev->regs->ctl);  	tmp &= AMD_UNMASK_BIT(UDC_DEVCTL_RDE); @@ -1543,11 +1509,10 @@ static void udc_setup_endpoints(struct udc *dev)  	/* read enum speed */  	tmp = readl(&dev->regs->sts);  	tmp = AMD_GETBITS(tmp, UDC_DEVSTS_ENUM_SPEED); -	if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH) { +	if (tmp == UDC_DEVSTS_ENUM_SPEED_HIGH)  		dev->gadget.speed = USB_SPEED_HIGH; -	} else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL) { +	else if (tmp == UDC_DEVSTS_ENUM_SPEED_FULL)  		dev->gadget.speed = USB_SPEED_FULL; -	}  	/* set basic ep parameters */  	for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { @@ -1573,9 +1538,8 @@ static void udc_setup_endpoints(struct udc *dev)  		 * disabling ep interrupts when ENUM interrupt occurs but ep is  		 * not enabled by gadget driver  		 */ -		if (!ep->desc) { +		if (!ep->ep.desc)  			ep_init(dev->regs, ep); -		}  		if (use_dma) {  			/* @@ -1599,12 +1563,15 @@ static void udc_setup_endpoints(struct udc *dev)  	}  	/* EP0 max packet */  	if (dev->gadget.speed == USB_SPEED_FULL) { -		dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_FS_EP0IN_MAX_PKT_SIZE; -		dev->ep[UDC_EP0OUT_IX].ep.maxpacket = -						UDC_FS_EP0OUT_MAX_PKT_SIZE; +		usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep, +					   UDC_FS_EP0IN_MAX_PKT_SIZE); +		usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep, +					   UDC_FS_EP0OUT_MAX_PKT_SIZE);  	} else if (dev->gadget.speed == USB_SPEED_HIGH) { -		dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE; -		dev->ep[UDC_EP0OUT_IX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE; +		usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep, +					   UDC_EP0IN_MAX_PKT_SIZE); +		usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep, +					   UDC_EP0OUT_MAX_PKT_SIZE);  	}  	/* @@ -1673,9 +1640,8 @@ static void udc_tasklet_disconnect(unsigned long par)  		spin_lock(&dev->lock);  		/* empty queues */ -		for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { +		for (tmp = 0; tmp < UDC_EP_NUM; tmp++)  			empty_req_queue(&dev->ep[tmp]); -		}  	} @@ -1749,9 +1715,8 @@ static void udc_timer_function(unsigned long v)  			 * open the fifo  			 */  			udc_timer.expires = jiffies + HZ/UDC_RDE_TIMER_DIV; -			if (!stop_timer) { +			if (!stop_timer)  				add_timer(&udc_timer); -			}  		} else {  			/*  			 * fifo contains data now, setup timer for opening @@ -1763,9 +1728,8 @@ static void udc_timer_function(unsigned long v)  			set_rde++;  			/* debug: lhadmot_timer_start = 221070 */  			udc_timer.expires = jiffies + HZ*UDC_RDE_TIMER_SECONDS; -			if (!stop_timer) { +			if (!stop_timer)  				add_timer(&udc_timer); -			}  		}  	} else @@ -1910,19 +1874,17 @@ static void activate_control_endpoints(struct udc *dev)  			mod_timer(&udc_timer, jiffies - 1);  		}  		/* stop pollstall timer */ -		if (timer_pending(&udc_pollstall_timer)) { +		if (timer_pending(&udc_pollstall_timer))  			mod_timer(&udc_pollstall_timer, jiffies - 1); -		}  		/* enable DMA */  		tmp = readl(&dev->regs->ctl);  		tmp |= AMD_BIT(UDC_DEVCTL_MODE)  				| AMD_BIT(UDC_DEVCTL_RDE)  				| AMD_BIT(UDC_DEVCTL_TDE); -		if (use_dma_bufferfill_mode) { +		if (use_dma_bufferfill_mode)  			tmp |= AMD_BIT(UDC_DEVCTL_BF); -		} else if (use_dma_ppb_du) { +		else if (use_dma_ppb_du)  			tmp |= AMD_BIT(UDC_DEVCTL_DU); -		}  		writel(tmp, &dev->regs->ctl);  	} @@ -1954,26 +1916,14 @@ static int setup_ep0(struct udc *dev)  }  /* Called by gadget driver to register itself */ -int usb_gadget_probe_driver(struct usb_gadget_driver *driver, -		int (*bind)(struct usb_gadget *)) +static int amd5536_udc_start(struct usb_gadget *g, +		struct usb_gadget_driver *driver)  { -	struct udc		*dev = udc; -	int			retval; +	struct udc *dev = to_amd5536_udc(g);  	u32 tmp; -	if (!driver || !bind || !driver->setup -			|| driver->speed != USB_SPEED_HIGH) -		return -EINVAL; -	if (!dev) -		return -ENODEV; -	if (dev->driver) -		return -EBUSY; -  	driver->driver.bus = NULL;  	dev->driver = driver; -	dev->gadget.dev.driver = &driver->driver; - -	retval = bind(&dev->gadget);  	/* Some gadget drivers use both ep0 directions.  	 * NOTE: to gadget driver, ep0 is just one endpoint... @@ -1981,14 +1931,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,  	dev->ep[UDC_EP0OUT_IX].ep.driver_data =  		dev->ep[UDC_EP0IN_IX].ep.driver_data; -	if (retval) { -		DBG(dev, "binding to %s returning %d\n", -				driver->driver.name, retval); -		dev->driver = NULL; -		dev->gadget.dev.driver = NULL; -		return retval; -	} -  	/* get ready for ep0 traffic */  	setup_ep0(dev); @@ -2001,7 +1943,6 @@ int usb_gadget_probe_driver(struct usb_gadget_driver *driver,  	return 0;  } -EXPORT_SYMBOL(usb_gadget_probe_driver);  /* shutdown requests and disconnect from gadget */  static void @@ -2011,14 +1952,9 @@ __acquires(dev->lock)  {  	int tmp; -	if (dev->gadget.speed != USB_SPEED_UNKNOWN) { -		spin_unlock(&dev->lock); -		driver->disconnect(&dev->gadget); -		spin_lock(&dev->lock); -	} -  	/* empty queues and init hardware */  	udc_basic_init(dev); +  	for (tmp = 0; tmp < UDC_EP_NUM; tmp++)  		empty_req_queue(&dev->ep[tmp]); @@ -2026,24 +1962,18 @@ __acquires(dev->lock)  }  /* Called by gadget driver to unregister itself */ -int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) +static int amd5536_udc_stop(struct usb_gadget *g, +		struct usb_gadget_driver *driver)  { -	struct udc	*dev = udc; -	unsigned long	flags; +	struct udc *dev = to_amd5536_udc(g); +	unsigned long flags;  	u32 tmp; -	if (!dev) -		return -ENODEV; -	if (!driver || driver != dev->driver || !driver->unbind) -		return -EINVAL; -  	spin_lock_irqsave(&dev->lock, flags);  	udc_mask_unused_interrupts(dev);  	shutdown(dev, driver);  	spin_unlock_irqrestore(&dev->lock, flags); -	driver->unbind(&dev->gadget); -	dev->gadget.dev.driver = NULL;  	dev->driver = NULL;  	/* set SD */ @@ -2051,13 +1981,8 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)  	tmp |= AMD_BIT(UDC_DEVCTL_SD);  	writel(tmp, &dev->regs->ctl); - -	DBG(dev, "%s: unregistered\n", driver->driver.name); -  	return 0;  } -EXPORT_SYMBOL(usb_gadget_unregister_driver); -  /* Clear pending NAK bits */  static void udc_process_cnak_queue(struct udc *dev) @@ -2110,9 +2035,8 @@ static void udc_ep0_set_rde(struct udc *dev)  				udc_timer.expires =  					jiffies + HZ/UDC_RDE_TIMER_DIV;  				set_rde = 1; -				if (!stop_timer) { +				if (!stop_timer)  					add_timer(&udc_timer); -				}  			}  		}  	} @@ -2137,7 +2061,7 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)  	if (use_dma) {  		/* BNA event ? */  		if (tmp & AMD_BIT(UDC_EPSTS_BNA)) { -			DBG(dev, "BNA ep%dout occured - DESPTR = %x \n", +			DBG(dev, "BNA ep%dout occurred - DESPTR = %x\n",  					ep->num, readl(&ep->regs->desptr));  			/* clear BNA */  			writel(tmp | AMD_BIT(UDC_EPSTS_BNA), &ep->regs->sts); @@ -2151,7 +2075,7 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)  	}  	/* HE event ? */  	if (tmp & AMD_BIT(UDC_EPSTS_HE)) { -		dev_err(&dev->pdev->dev, "HE ep%dout occured\n", ep->num); +		dev_err(&dev->pdev->dev, "HE ep%dout occurred\n", ep->num);  		/* clear HE */  		writel(tmp | AMD_BIT(UDC_EPSTS_HE), &ep->regs->sts); @@ -2300,9 +2224,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)  						jiffies  						+ HZ*UDC_RDE_TIMER_SECONDS;  					set_rde = 1; -					if (!stop_timer) { +					if (!stop_timer)  						add_timer(&udc_timer); -					}  				}  				if (ep->num != UDC_EP0OUT_IX)  					dev->data_ep_queued = 0; @@ -2324,9 +2247,8 @@ static irqreturn_t udc_data_out_isr(struct udc *dev, int ep_ix)  	/* check pending CNAKS */  	if (cnak_pending) {  		/* CNAk processing when rxfifo empty only */ -		if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) { +		if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY))  			udc_process_cnak_queue(dev); -		}  	}  	/* clear OUT bits in ep status */ @@ -2354,7 +2276,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)  		/* BNA ? */  		if (epsts & AMD_BIT(UDC_EPSTS_BNA)) {  			dev_err(&dev->pdev->dev, -				"BNA ep%din occured - DESPTR = %08lx \n", +				"BNA ep%din occurred - DESPTR = %08lx\n",  				ep->num,  				(unsigned long) readl(&ep->regs->desptr)); @@ -2367,7 +2289,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)  	/* HE event ? */  	if (epsts & AMD_BIT(UDC_EPSTS_HE)) {  		dev_err(&dev->pdev->dev, -			"HE ep%dn occured - DESPTR = %08lx \n", +			"HE ep%dn occurred - DESPTR = %08lx\n",  			ep->num, (unsigned long) readl(&ep->regs->desptr));  		/* clear HE */ @@ -2384,7 +2306,7 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)  			req = list_entry(ep->queue.next,  					struct udc_request, queue);  			/* -			 * length bytes transfered +			 * length bytes transferred  			 * check dma done of last desc. in PPBDU mode  			 */  			if (use_dma_ppb_du) { @@ -2433,9 +2355,9 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)  				/* write fifo */  				udc_txfifo_write(ep, &req->req);  				len = req->req.length - req->req.actual; -						if (len > ep->ep.maxpacket) -							len = ep->ep.maxpacket; -						req->req.actual += len; +				if (len > ep->ep.maxpacket) +					len = ep->ep.maxpacket; +				req->req.actual += len;  				if (req->req.actual == req->req.length  					|| (len != ep->ep.maxpacket)) {  					/* complete req */ @@ -2587,9 +2509,8 @@ __acquires(dev->lock)  			if (!timer_pending(&udc_timer)) {  				udc_timer.expires = jiffies +  							HZ/UDC_RDE_TIMER_DIV; -				if (!stop_timer) { +				if (!stop_timer)  					add_timer(&udc_timer); -				}  			}  		} @@ -2703,9 +2624,8 @@ __acquires(dev->lock)  	/* check pending CNAKS */  	if (cnak_pending) {  		/* CNAk processing when rxfifo empty only */ -		if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY)) { +		if (readl(&dev->regs->sts) & AMD_BIT(UDC_DEVSTS_RXFIFO_EMPTY))  			udc_process_cnak_queue(dev); -		}  	}  finished: @@ -2729,7 +2649,7 @@ static irqreturn_t udc_control_in_isr(struct udc *dev)  	tmp = readl(&dev->ep[UDC_EP0IN_IX].regs->sts);  	/* DMA completion */  	if (tmp & AMD_BIT(UDC_EPSTS_TDC)) { -		VDBG(dev, "isr: TDC clear \n"); +		VDBG(dev, "isr: TDC clear\n");  		ret_val = IRQ_HANDLED;  		/* clear TDC bit */ @@ -2784,7 +2704,7 @@ static irqreturn_t udc_control_in_isr(struct udc *dev)  					/* write fifo */  					udc_txfifo_write(ep, &req->req); -					/* lengh bytes transfered */ +					/* lengh bytes transferred */  					len = req->req.length - req->req.actual;  					if (len > ep->ep.maxpacket)  						len = ep->ep.maxpacket; @@ -3011,13 +2931,8 @@ __acquires(dev->lock)  		/* link up all endpoints */  		udc_setup_endpoints(dev); -		if (dev->gadget.speed == USB_SPEED_HIGH) { -			dev_info(&dev->pdev->dev, "Connect: speed = %s\n", -				"high"); -		} else if (dev->gadget.speed == USB_SPEED_FULL) { -			dev_info(&dev->pdev->dev, "Connect: speed = %s\n", -				"full"); -		} +		dev_info(&dev->pdev->dev, "Connect: %s\n", +			 usb_speed_string(dev->gadget.speed));  		/* init ep 0 */  		activate_control_endpoints(dev); @@ -3133,6 +3048,7 @@ static void udc_pci_remove(struct pci_dev *pdev)  	dev = pci_get_drvdata(pdev); +	usb_del_gadget_udc(&udc->gadget);  	/* gadget driver must not be registered */  	BUG_ON(dev->driver != NULL); @@ -3164,9 +3080,6 @@ static void udc_pci_remove(struct pci_dev *pdev)  	if (dev->active)  		pci_disable_device(pdev); -	device_unregister(&dev->gadget.dev); -	pci_set_drvdata(pdev, NULL); -  	udc_remove(dev);  } @@ -3284,7 +3197,7 @@ static int udc_pci_probe(  	}  	if (!pdev->irq) { -		dev_err(&dev->pdev->dev, "irq not set\n"); +		dev_err(&pdev->dev, "irq not set\n");  		kfree(dev);  		dev = NULL;  		retval = -ENODEV; @@ -3303,7 +3216,7 @@ static int udc_pci_probe(  	dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR);  	if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { -		dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); +		dev_dbg(&pdev->dev, "request_irq(%d) fail\n", pdev->irq);  		kfree(dev);  		dev = NULL;  		retval = -EBUSY; @@ -3329,8 +3242,6 @@ static int udc_pci_probe(  	dev->phys_addr = resource;  	dev->irq = pdev->irq;  	dev->pdev = pdev; -	dev->gadget.dev.parent = &pdev->dev; -	dev->gadget.dev.dma_mask = pdev->dev.dma_mask;  	/* general probing */  	if (udc_probe(dev) == 0) @@ -3357,10 +3268,8 @@ static int udc_probe(struct udc *dev)  	dev->gadget.ops = &udc_ops;  	dev_set_name(&dev->gadget.dev, "gadget"); -	dev->gadget.dev.release = gadget_release; -	dev->gadget.name = name;  	dev->gadget.name = name; -	dev->gadget.is_dualspeed = 1; +	dev->gadget.max_speed = USB_SPEED_HIGH;  	/* init registers, interrupts, ... */  	startup_registers(dev); @@ -3382,11 +3291,10 @@ static int udc_probe(struct udc *dev)  		"driver version: %s(for Geode5536 B1)\n", tmp);  	udc = dev; -	retval = device_register(&dev->gadget.dev); -	if (retval) { -		put_device(&dev->gadget.dev); +	retval = usb_add_gadget_udc_release(&udc->pdev->dev, &dev->gadget, +			gadget_release); +	if (retval)  		goto finished; -	}  	/* timer init */  	init_timer(&udc_timer); @@ -3450,19 +3358,7 @@ static struct pci_driver udc_pci_driver = {  	.remove =	udc_pci_remove,  }; -/* Inits driver */ -static int __init init(void) -{ -	return pci_register_driver(&udc_pci_driver); -} -module_init(init); - -/* Cleans driver */ -static void __exit cleanup(void) -{ -	pci_unregister_driver(&udc_pci_driver); -} -module_exit(cleanup); +module_pci_driver(udc_pci_driver);  MODULE_DESCRIPTION(UDC_MOD_DESCRIPTION);  MODULE_AUTHOR("Thomas Dahlmann");  | 
