cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mv_u3d_core.c (51128B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
      4 */
      5
      6#include <linux/module.h>
      7#include <linux/dma-mapping.h>
      8#include <linux/dmapool.h>
      9#include <linux/kernel.h>
     10#include <linux/delay.h>
     11#include <linux/ioport.h>
     12#include <linux/sched.h>
     13#include <linux/slab.h>
     14#include <linux/errno.h>
     15#include <linux/timer.h>
     16#include <linux/list.h>
     17#include <linux/notifier.h>
     18#include <linux/interrupt.h>
     19#include <linux/moduleparam.h>
     20#include <linux/device.h>
     21#include <linux/usb/ch9.h>
     22#include <linux/usb/gadget.h>
     23#include <linux/pm.h>
     24#include <linux/io.h>
     25#include <linux/irq.h>
     26#include <linux/platform_device.h>
     27#include <linux/platform_data/mv_usb.h>
     28#include <linux/clk.h>
     29
     30#include "mv_u3d.h"
     31
     32#define DRIVER_DESC		"Marvell PXA USB3.0 Device Controller driver"
     33
     34static const char driver_name[] = "mv_u3d";
     35
     36static void mv_u3d_nuke(struct mv_u3d_ep *ep, int status);
     37static void mv_u3d_stop_activity(struct mv_u3d *u3d,
     38			struct usb_gadget_driver *driver);
     39
     40/* for endpoint 0 operations */
     41static const struct usb_endpoint_descriptor mv_u3d_ep0_desc = {
     42	.bLength =		USB_DT_ENDPOINT_SIZE,
     43	.bDescriptorType =	USB_DT_ENDPOINT,
     44	.bEndpointAddress =	0,
     45	.bmAttributes =		USB_ENDPOINT_XFER_CONTROL,
     46	.wMaxPacketSize =	MV_U3D_EP0_MAX_PKT_SIZE,
     47};
     48
     49static void mv_u3d_ep0_reset(struct mv_u3d *u3d)
     50{
     51	struct mv_u3d_ep *ep;
     52	u32 epxcr;
     53	int i;
     54
     55	for (i = 0; i < 2; i++) {
     56		ep = &u3d->eps[i];
     57		ep->u3d = u3d;
     58
     59		/* ep0 ep context, ep0 in and out share the same ep context */
     60		ep->ep_context = &u3d->ep_context[1];
     61	}
     62
     63	/* reset ep state machine */
     64	/* reset ep0 out */
     65	epxcr = ioread32(&u3d->vuc_regs->epcr[0].epxoutcr0);
     66	epxcr |= MV_U3D_EPXCR_EP_INIT;
     67	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxoutcr0);
     68	udelay(5);
     69	epxcr &= ~MV_U3D_EPXCR_EP_INIT;
     70	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxoutcr0);
     71
     72	epxcr = ((MV_U3D_EP0_MAX_PKT_SIZE
     73		<< MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT)
     74		| (1 << MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT)
     75		| (1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
     76		| MV_U3D_EPXCR_EP_TYPE_CONTROL);
     77	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxoutcr1);
     78
     79	/* reset ep0 in */
     80	epxcr = ioread32(&u3d->vuc_regs->epcr[0].epxincr0);
     81	epxcr |= MV_U3D_EPXCR_EP_INIT;
     82	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxincr0);
     83	udelay(5);
     84	epxcr &= ~MV_U3D_EPXCR_EP_INIT;
     85	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxincr0);
     86
     87	epxcr = ((MV_U3D_EP0_MAX_PKT_SIZE
     88		<< MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT)
     89		| (1 << MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT)
     90		| (1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
     91		| MV_U3D_EPXCR_EP_TYPE_CONTROL);
     92	iowrite32(epxcr, &u3d->vuc_regs->epcr[0].epxincr1);
     93}
     94
     95static void mv_u3d_ep0_stall(struct mv_u3d *u3d)
     96{
     97	u32 tmp;
     98	dev_dbg(u3d->dev, "%s\n", __func__);
     99
    100	/* set TX and RX to stall */
    101	tmp = ioread32(&u3d->vuc_regs->epcr[0].epxoutcr0);
    102	tmp |= MV_U3D_EPXCR_EP_HALT;
    103	iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxoutcr0);
    104
    105	tmp = ioread32(&u3d->vuc_regs->epcr[0].epxincr0);
    106	tmp |= MV_U3D_EPXCR_EP_HALT;
    107	iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxincr0);
    108
    109	/* update ep0 state */
    110	u3d->ep0_state = MV_U3D_WAIT_FOR_SETUP;
    111	u3d->ep0_dir = MV_U3D_EP_DIR_OUT;
    112}
    113
    114static int mv_u3d_process_ep_req(struct mv_u3d *u3d, int index,
    115	struct mv_u3d_req *curr_req)
    116{
    117	struct mv_u3d_trb	*curr_trb;
    118	int actual, remaining_length = 0;
    119	int direction, ep_num;
    120	int retval = 0;
    121	u32 tmp, status, length;
    122
    123	direction = index % 2;
    124	ep_num = index / 2;
    125
    126	actual = curr_req->req.length;
    127
    128	while (!list_empty(&curr_req->trb_list)) {
    129		curr_trb = list_entry(curr_req->trb_list.next,
    130					struct mv_u3d_trb, trb_list);
    131		if (!curr_trb->trb_hw->ctrl.own) {
    132			dev_err(u3d->dev, "%s, TRB own error!\n",
    133				u3d->eps[index].name);
    134			return 1;
    135		}
    136
    137		curr_trb->trb_hw->ctrl.own = 0;
    138		if (direction == MV_U3D_EP_DIR_OUT)
    139			tmp = ioread32(&u3d->vuc_regs->rxst[ep_num].statuslo);
    140		else
    141			tmp = ioread32(&u3d->vuc_regs->txst[ep_num].statuslo);
    142
    143		status = tmp >> MV_U3D_XFERSTATUS_COMPLETE_SHIFT;
    144		length = tmp & MV_U3D_XFERSTATUS_TRB_LENGTH_MASK;
    145
    146		if (status == MV_U3D_COMPLETE_SUCCESS ||
    147			(status == MV_U3D_COMPLETE_SHORT_PACKET &&
    148			direction == MV_U3D_EP_DIR_OUT)) {
    149			remaining_length += length;
    150			actual -= remaining_length;
    151		} else {
    152			dev_err(u3d->dev,
    153				"complete_tr error: ep=%d %s: error = 0x%x\n",
    154				index >> 1, direction ? "SEND" : "RECV",
    155				status);
    156			retval = -EPROTO;
    157		}
    158
    159		list_del_init(&curr_trb->trb_list);
    160	}
    161	if (retval)
    162		return retval;
    163
    164	curr_req->req.actual = actual;
    165	return 0;
    166}
    167
    168/*
    169 * mv_u3d_done() - retire a request; caller blocked irqs
    170 * @status : request status to be set, only works when
    171 * request is still in progress.
    172 */
    173static
    174void mv_u3d_done(struct mv_u3d_ep *ep, struct mv_u3d_req *req, int status)
    175	__releases(&ep->udc->lock)
    176	__acquires(&ep->udc->lock)
    177{
    178	struct mv_u3d *u3d = (struct mv_u3d *)ep->u3d;
    179
    180	dev_dbg(u3d->dev, "mv_u3d_done: remove req->queue\n");
    181	/* Removed the req from ep queue */
    182	list_del_init(&req->queue);
    183
    184	/* req.status should be set as -EINPROGRESS in ep_queue() */
    185	if (req->req.status == -EINPROGRESS)
    186		req->req.status = status;
    187	else
    188		status = req->req.status;
    189
    190	/* Free trb for the request */
    191	if (!req->chain)
    192		dma_pool_free(u3d->trb_pool,
    193			req->trb_head->trb_hw, req->trb_head->trb_dma);
    194	else {
    195		dma_unmap_single(ep->u3d->gadget.dev.parent,
    196			(dma_addr_t)req->trb_head->trb_dma,
    197			req->trb_count * sizeof(struct mv_u3d_trb_hw),
    198			DMA_BIDIRECTIONAL);
    199		kfree(req->trb_head->trb_hw);
    200	}
    201	kfree(req->trb_head);
    202
    203	usb_gadget_unmap_request(&u3d->gadget, &req->req, mv_u3d_ep_dir(ep));
    204
    205	if (status && (status != -ESHUTDOWN)) {
    206		dev_dbg(u3d->dev, "complete %s req %p stat %d len %u/%u",
    207			ep->ep.name, &req->req, status,
    208			req->req.actual, req->req.length);
    209	}
    210
    211	spin_unlock(&ep->u3d->lock);
    212
    213	usb_gadget_giveback_request(&ep->ep, &req->req);
    214
    215	spin_lock(&ep->u3d->lock);
    216}
    217
    218static int mv_u3d_queue_trb(struct mv_u3d_ep *ep, struct mv_u3d_req *req)
    219{
    220	u32 tmp, direction;
    221	struct mv_u3d *u3d;
    222	struct mv_u3d_ep_context *ep_context;
    223	int retval = 0;
    224
    225	u3d = ep->u3d;
    226	direction = mv_u3d_ep_dir(ep);
    227
    228	/* ep0 in and out share the same ep context slot 1*/
    229	if (ep->ep_num == 0)
    230		ep_context = &(u3d->ep_context[1]);
    231	else
    232		ep_context = &(u3d->ep_context[ep->ep_num * 2 + direction]);
    233
    234	/* check if the pipe is empty or not */
    235	if (!list_empty(&ep->queue)) {
    236		dev_err(u3d->dev, "add trb to non-empty queue!\n");
    237		retval = -ENOMEM;
    238		WARN_ON(1);
    239	} else {
    240		ep_context->rsvd0 = cpu_to_le32(1);
    241		ep_context->rsvd1 = 0;
    242
    243		/* Configure the trb address and set the DCS bit.
    244		 * Both DCS bit and own bit in trb should be set.
    245		 */
    246		ep_context->trb_addr_lo =
    247			cpu_to_le32(req->trb_head->trb_dma | DCS_ENABLE);
    248		ep_context->trb_addr_hi = 0;
    249
    250		/* Ensure that updates to the EP Context will
    251		 * occure before Ring Bell.
    252		 */
    253		wmb();
    254
    255		/* ring bell the ep */
    256		if (ep->ep_num == 0)
    257			tmp = 0x1;
    258		else
    259			tmp = ep->ep_num * 2
    260				+ ((direction == MV_U3D_EP_DIR_OUT) ? 0 : 1);
    261
    262		iowrite32(tmp, &u3d->op_regs->doorbell);
    263	}
    264	return retval;
    265}
    266
    267static struct mv_u3d_trb *mv_u3d_build_trb_one(struct mv_u3d_req *req,
    268				unsigned *length, dma_addr_t *dma)
    269{
    270	u32 temp;
    271	unsigned int direction;
    272	struct mv_u3d_trb *trb;
    273	struct mv_u3d_trb_hw *trb_hw;
    274	struct mv_u3d *u3d;
    275
    276	/* how big will this transfer be? */
    277	*length = req->req.length - req->req.actual;
    278	BUG_ON(*length > (unsigned)MV_U3D_EP_MAX_LENGTH_TRANSFER);
    279
    280	u3d = req->ep->u3d;
    281
    282	trb = kzalloc(sizeof(*trb), GFP_ATOMIC);
    283	if (!trb)
    284		return NULL;
    285
    286	/*
    287	 * Be careful that no _GFP_HIGHMEM is set,
    288	 * or we can not use dma_to_virt
    289	 * cannot use GFP_KERNEL in spin lock
    290	 */
    291	trb_hw = dma_pool_alloc(u3d->trb_pool, GFP_ATOMIC, dma);
    292	if (!trb_hw) {
    293		kfree(trb);
    294		dev_err(u3d->dev,
    295			"%s, dma_pool_alloc fail\n", __func__);
    296		return NULL;
    297	}
    298	trb->trb_dma = *dma;
    299	trb->trb_hw = trb_hw;
    300
    301	/* initialize buffer page pointers */
    302	temp = (u32)(req->req.dma + req->req.actual);
    303
    304	trb_hw->buf_addr_lo = cpu_to_le32(temp);
    305	trb_hw->buf_addr_hi = 0;
    306	trb_hw->trb_len = cpu_to_le32(*length);
    307	trb_hw->ctrl.own = 1;
    308
    309	if (req->ep->ep_num == 0)
    310		trb_hw->ctrl.type = TYPE_DATA;
    311	else
    312		trb_hw->ctrl.type = TYPE_NORMAL;
    313
    314	req->req.actual += *length;
    315
    316	direction = mv_u3d_ep_dir(req->ep);
    317	if (direction == MV_U3D_EP_DIR_IN)
    318		trb_hw->ctrl.dir = 1;
    319	else
    320		trb_hw->ctrl.dir = 0;
    321
    322	/* Enable interrupt for the last trb of a request */
    323	if (!req->req.no_interrupt)
    324		trb_hw->ctrl.ioc = 1;
    325
    326	trb_hw->ctrl.chain = 0;
    327
    328	wmb();
    329	return trb;
    330}
    331
    332static int mv_u3d_build_trb_chain(struct mv_u3d_req *req, unsigned *length,
    333		struct mv_u3d_trb *trb, int *is_last)
    334{
    335	u32 temp;
    336	unsigned int direction;
    337	struct mv_u3d *u3d;
    338
    339	/* how big will this transfer be? */
    340	*length = min(req->req.length - req->req.actual,
    341			(unsigned)MV_U3D_EP_MAX_LENGTH_TRANSFER);
    342
    343	u3d = req->ep->u3d;
    344
    345	trb->trb_dma = 0;
    346
    347	/* initialize buffer page pointers */
    348	temp = (u32)(req->req.dma + req->req.actual);
    349
    350	trb->trb_hw->buf_addr_lo = cpu_to_le32(temp);
    351	trb->trb_hw->buf_addr_hi = 0;
    352	trb->trb_hw->trb_len = cpu_to_le32(*length);
    353	trb->trb_hw->ctrl.own = 1;
    354
    355	if (req->ep->ep_num == 0)
    356		trb->trb_hw->ctrl.type = TYPE_DATA;
    357	else
    358		trb->trb_hw->ctrl.type = TYPE_NORMAL;
    359
    360	req->req.actual += *length;
    361
    362	direction = mv_u3d_ep_dir(req->ep);
    363	if (direction == MV_U3D_EP_DIR_IN)
    364		trb->trb_hw->ctrl.dir = 1;
    365	else
    366		trb->trb_hw->ctrl.dir = 0;
    367
    368	/* zlp is needed if req->req.zero is set */
    369	if (req->req.zero) {
    370		if (*length == 0 || (*length % req->ep->ep.maxpacket) != 0)
    371			*is_last = 1;
    372		else
    373			*is_last = 0;
    374	} else if (req->req.length == req->req.actual)
    375		*is_last = 1;
    376	else
    377		*is_last = 0;
    378
    379	/* Enable interrupt for the last trb of a request */
    380	if (*is_last && !req->req.no_interrupt)
    381		trb->trb_hw->ctrl.ioc = 1;
    382
    383	if (*is_last)
    384		trb->trb_hw->ctrl.chain = 0;
    385	else {
    386		trb->trb_hw->ctrl.chain = 1;
    387		dev_dbg(u3d->dev, "chain trb\n");
    388	}
    389
    390	wmb();
    391
    392	return 0;
    393}
    394
    395/* generate TRB linked list for a request
    396 * usb controller only supports continous trb chain,
    397 * that trb structure physical address should be continous.
    398 */
    399static int mv_u3d_req_to_trb(struct mv_u3d_req *req)
    400{
    401	unsigned count;
    402	int is_last;
    403	struct mv_u3d_trb *trb;
    404	struct mv_u3d_trb_hw *trb_hw;
    405	struct mv_u3d *u3d;
    406	dma_addr_t dma;
    407	unsigned length;
    408	unsigned trb_num;
    409
    410	u3d = req->ep->u3d;
    411
    412	INIT_LIST_HEAD(&req->trb_list);
    413
    414	length = req->req.length - req->req.actual;
    415	/* normally the request transfer length is less than 16KB.
    416	 * we use buil_trb_one() to optimize it.
    417	 */
    418	if (length <= (unsigned)MV_U3D_EP_MAX_LENGTH_TRANSFER) {
    419		trb = mv_u3d_build_trb_one(req, &count, &dma);
    420		list_add_tail(&trb->trb_list, &req->trb_list);
    421		req->trb_head = trb;
    422		req->trb_count = 1;
    423		req->chain = 0;
    424	} else {
    425		trb_num = length / MV_U3D_EP_MAX_LENGTH_TRANSFER;
    426		if (length % MV_U3D_EP_MAX_LENGTH_TRANSFER)
    427			trb_num++;
    428
    429		trb = kcalloc(trb_num, sizeof(*trb), GFP_ATOMIC);
    430		if (!trb)
    431			return -ENOMEM;
    432
    433		trb_hw = kcalloc(trb_num, sizeof(*trb_hw), GFP_ATOMIC);
    434		if (!trb_hw) {
    435			kfree(trb);
    436			return -ENOMEM;
    437		}
    438
    439		do {
    440			trb->trb_hw = trb_hw;
    441			if (mv_u3d_build_trb_chain(req, &count,
    442						trb, &is_last)) {
    443				dev_err(u3d->dev,
    444					"%s, mv_u3d_build_trb_chain fail\n",
    445					__func__);
    446				return -EIO;
    447			}
    448
    449			list_add_tail(&trb->trb_list, &req->trb_list);
    450			req->trb_count++;
    451			trb++;
    452			trb_hw++;
    453		} while (!is_last);
    454
    455		req->trb_head = list_entry(req->trb_list.next,
    456					struct mv_u3d_trb, trb_list);
    457		req->trb_head->trb_dma = dma_map_single(u3d->gadget.dev.parent,
    458					req->trb_head->trb_hw,
    459					trb_num * sizeof(*trb_hw),
    460					DMA_BIDIRECTIONAL);
    461		if (dma_mapping_error(u3d->gadget.dev.parent,
    462					req->trb_head->trb_dma)) {
    463			kfree(req->trb_head->trb_hw);
    464			kfree(req->trb_head);
    465			return -EFAULT;
    466		}
    467
    468		req->chain = 1;
    469	}
    470
    471	return 0;
    472}
    473
    474static int
    475mv_u3d_start_queue(struct mv_u3d_ep *ep)
    476{
    477	struct mv_u3d *u3d = ep->u3d;
    478	struct mv_u3d_req *req;
    479	int ret;
    480
    481	if (!list_empty(&ep->req_list) && !ep->processing)
    482		req = list_entry(ep->req_list.next, struct mv_u3d_req, list);
    483	else
    484		return 0;
    485
    486	ep->processing = 1;
    487
    488	/* set up dma mapping */
    489	ret = usb_gadget_map_request(&u3d->gadget, &req->req,
    490					mv_u3d_ep_dir(ep));
    491	if (ret)
    492		goto break_processing;
    493
    494	req->req.status = -EINPROGRESS;
    495	req->req.actual = 0;
    496	req->trb_count = 0;
    497
    498	/* build trbs */
    499	ret = mv_u3d_req_to_trb(req);
    500	if (ret) {
    501		dev_err(u3d->dev, "%s, mv_u3d_req_to_trb fail\n", __func__);
    502		goto break_processing;
    503	}
    504
    505	/* and push them to device queue */
    506	ret = mv_u3d_queue_trb(ep, req);
    507	if (ret)
    508		goto break_processing;
    509
    510	/* irq handler advances the queue */
    511	list_add_tail(&req->queue, &ep->queue);
    512
    513	return 0;
    514
    515break_processing:
    516	ep->processing = 0;
    517	return ret;
    518}
    519
    520static int mv_u3d_ep_enable(struct usb_ep *_ep,
    521		const struct usb_endpoint_descriptor *desc)
    522{
    523	struct mv_u3d *u3d;
    524	struct mv_u3d_ep *ep;
    525	u16 max = 0;
    526	unsigned maxburst = 0;
    527	u32 epxcr, direction;
    528
    529	if (!_ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT)
    530		return -EINVAL;
    531
    532	ep = container_of(_ep, struct mv_u3d_ep, ep);
    533	u3d = ep->u3d;
    534
    535	if (!u3d->driver || u3d->gadget.speed == USB_SPEED_UNKNOWN)
    536		return -ESHUTDOWN;
    537
    538	direction = mv_u3d_ep_dir(ep);
    539	max = le16_to_cpu(desc->wMaxPacketSize);
    540
    541	if (!_ep->maxburst)
    542		_ep->maxburst = 1;
    543	maxburst = _ep->maxburst;
    544
    545	/* Set the max burst size */
    546	switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
    547	case USB_ENDPOINT_XFER_BULK:
    548		if (maxburst > 16) {
    549			dev_dbg(u3d->dev,
    550				"max burst should not be greater "
    551				"than 16 on bulk ep\n");
    552			maxburst = 1;
    553			_ep->maxburst = maxburst;
    554		}
    555		dev_dbg(u3d->dev,
    556			"maxburst: %d on bulk %s\n", maxburst, ep->name);
    557		break;
    558	case USB_ENDPOINT_XFER_CONTROL:
    559		/* control transfer only supports maxburst as one */
    560		maxburst = 1;
    561		_ep->maxburst = maxburst;
    562		break;
    563	case USB_ENDPOINT_XFER_INT:
    564		if (maxburst != 1) {
    565			dev_dbg(u3d->dev,
    566				"max burst should be 1 on int ep "
    567				"if transfer size is not 1024\n");
    568			maxburst = 1;
    569			_ep->maxburst = maxburst;
    570		}
    571		break;
    572	case USB_ENDPOINT_XFER_ISOC:
    573		if (maxburst != 1) {
    574			dev_dbg(u3d->dev,
    575				"max burst should be 1 on isoc ep "
    576				"if transfer size is not 1024\n");
    577			maxburst = 1;
    578			_ep->maxburst = maxburst;
    579		}
    580		break;
    581	default:
    582		goto en_done;
    583	}
    584
    585	ep->ep.maxpacket = max;
    586	ep->ep.desc = desc;
    587	ep->enabled = 1;
    588
    589	/* Enable the endpoint for Rx or Tx and set the endpoint type */
    590	if (direction == MV_U3D_EP_DIR_OUT) {
    591		epxcr = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    592		epxcr |= MV_U3D_EPXCR_EP_INIT;
    593		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    594		udelay(5);
    595		epxcr &= ~MV_U3D_EPXCR_EP_INIT;
    596		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    597
    598		epxcr = ((max << MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT)
    599		      | ((maxburst - 1) << MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT)
    600		      | (1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
    601		      | (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK));
    602		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr1);
    603	} else {
    604		epxcr = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    605		epxcr |= MV_U3D_EPXCR_EP_INIT;
    606		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    607		udelay(5);
    608		epxcr &= ~MV_U3D_EPXCR_EP_INIT;
    609		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    610
    611		epxcr = ((max << MV_U3D_EPXCR_MAX_PACKET_SIZE_SHIFT)
    612		      | ((maxburst - 1) << MV_U3D_EPXCR_MAX_BURST_SIZE_SHIFT)
    613		      | (1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
    614		      | (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK));
    615		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxincr1);
    616	}
    617
    618	return 0;
    619en_done:
    620	return -EINVAL;
    621}
    622
    623static int  mv_u3d_ep_disable(struct usb_ep *_ep)
    624{
    625	struct mv_u3d *u3d;
    626	struct mv_u3d_ep *ep;
    627	u32 epxcr, direction;
    628	unsigned long flags;
    629
    630	if (!_ep)
    631		return -EINVAL;
    632
    633	ep = container_of(_ep, struct mv_u3d_ep, ep);
    634	if (!ep->ep.desc)
    635		return -EINVAL;
    636
    637	u3d = ep->u3d;
    638
    639	direction = mv_u3d_ep_dir(ep);
    640
    641	/* nuke all pending requests (does flush) */
    642	spin_lock_irqsave(&u3d->lock, flags);
    643	mv_u3d_nuke(ep, -ESHUTDOWN);
    644	spin_unlock_irqrestore(&u3d->lock, flags);
    645
    646	/* Disable the endpoint for Rx or Tx and reset the endpoint type */
    647	if (direction == MV_U3D_EP_DIR_OUT) {
    648		epxcr = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxoutcr1);
    649		epxcr &= ~((1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
    650		      | USB_ENDPOINT_XFERTYPE_MASK);
    651		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr1);
    652	} else {
    653		epxcr = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxincr1);
    654		epxcr &= ~((1 << MV_U3D_EPXCR_EP_ENABLE_SHIFT)
    655		      | USB_ENDPOINT_XFERTYPE_MASK);
    656		iowrite32(epxcr, &u3d->vuc_regs->epcr[ep->ep_num].epxincr1);
    657	}
    658
    659	ep->enabled = 0;
    660
    661	ep->ep.desc = NULL;
    662	return 0;
    663}
    664
    665static struct usb_request *
    666mv_u3d_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags)
    667{
    668	struct mv_u3d_req *req = NULL;
    669
    670	req = kzalloc(sizeof *req, gfp_flags);
    671	if (!req)
    672		return NULL;
    673
    674	INIT_LIST_HEAD(&req->queue);
    675
    676	return &req->req;
    677}
    678
    679static void mv_u3d_free_request(struct usb_ep *_ep, struct usb_request *_req)
    680{
    681	struct mv_u3d_req *req = container_of(_req, struct mv_u3d_req, req);
    682
    683	kfree(req);
    684}
    685
    686static void mv_u3d_ep_fifo_flush(struct usb_ep *_ep)
    687{
    688	struct mv_u3d *u3d;
    689	u32 direction;
    690	struct mv_u3d_ep *ep = container_of(_ep, struct mv_u3d_ep, ep);
    691	unsigned int loops;
    692	u32 tmp;
    693
    694	/* if endpoint is not enabled, cannot flush endpoint */
    695	if (!ep->enabled)
    696		return;
    697
    698	u3d = ep->u3d;
    699	direction = mv_u3d_ep_dir(ep);
    700
    701	/* ep0 need clear bit after flushing fifo. */
    702	if (!ep->ep_num) {
    703		if (direction == MV_U3D_EP_DIR_OUT) {
    704			tmp = ioread32(&u3d->vuc_regs->epcr[0].epxoutcr0);
    705			tmp |= MV_U3D_EPXCR_EP_FLUSH;
    706			iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxoutcr0);
    707			udelay(10);
    708			tmp &= ~MV_U3D_EPXCR_EP_FLUSH;
    709			iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxoutcr0);
    710		} else {
    711			tmp = ioread32(&u3d->vuc_regs->epcr[0].epxincr0);
    712			tmp |= MV_U3D_EPXCR_EP_FLUSH;
    713			iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxincr0);
    714			udelay(10);
    715			tmp &= ~MV_U3D_EPXCR_EP_FLUSH;
    716			iowrite32(tmp, &u3d->vuc_regs->epcr[0].epxincr0);
    717		}
    718		return;
    719	}
    720
    721	if (direction == MV_U3D_EP_DIR_OUT) {
    722		tmp = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    723		tmp |= MV_U3D_EPXCR_EP_FLUSH;
    724		iowrite32(tmp, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    725
    726		/* Wait until flushing completed */
    727		loops = LOOPS(MV_U3D_FLUSH_TIMEOUT);
    728		while (ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0) &
    729			MV_U3D_EPXCR_EP_FLUSH) {
    730			/*
    731			 * EP_FLUSH bit should be cleared to indicate this
    732			 * operation is complete
    733			 */
    734			if (loops == 0) {
    735				dev_dbg(u3d->dev,
    736				    "EP FLUSH TIMEOUT for ep%d%s\n", ep->ep_num,
    737				    direction ? "in" : "out");
    738				return;
    739			}
    740			loops--;
    741			udelay(LOOPS_USEC);
    742		}
    743	} else {	/* EP_DIR_IN */
    744		tmp = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    745		tmp |= MV_U3D_EPXCR_EP_FLUSH;
    746		iowrite32(tmp, &u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    747
    748		/* Wait until flushing completed */
    749		loops = LOOPS(MV_U3D_FLUSH_TIMEOUT);
    750		while (ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxincr0) &
    751			MV_U3D_EPXCR_EP_FLUSH) {
    752			/*
    753			* EP_FLUSH bit should be cleared to indicate this
    754			* operation is complete
    755			*/
    756			if (loops == 0) {
    757				dev_dbg(u3d->dev,
    758				    "EP FLUSH TIMEOUT for ep%d%s\n", ep->ep_num,
    759				    direction ? "in" : "out");
    760				return;
    761			}
    762			loops--;
    763			udelay(LOOPS_USEC);
    764		}
    765	}
    766}
    767
    768/* queues (submits) an I/O request to an endpoint */
    769static int
    770mv_u3d_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags)
    771{
    772	struct mv_u3d_ep *ep;
    773	struct mv_u3d_req *req;
    774	struct mv_u3d *u3d;
    775	unsigned long flags;
    776	int is_first_req = 0;
    777
    778	if (unlikely(!_ep || !_req))
    779		return -EINVAL;
    780
    781	ep = container_of(_ep, struct mv_u3d_ep, ep);
    782	u3d = ep->u3d;
    783
    784	req = container_of(_req, struct mv_u3d_req, req);
    785
    786	if (!ep->ep_num
    787		&& u3d->ep0_state == MV_U3D_STATUS_STAGE
    788		&& !_req->length) {
    789		dev_dbg(u3d->dev, "ep0 status stage\n");
    790		u3d->ep0_state = MV_U3D_WAIT_FOR_SETUP;
    791		return 0;
    792	}
    793
    794	dev_dbg(u3d->dev, "%s: %s, req: 0x%p\n",
    795			__func__, _ep->name, req);
    796
    797	/* catch various bogus parameters */
    798	if (!req->req.complete || !req->req.buf
    799			|| !list_empty(&req->queue)) {
    800		dev_err(u3d->dev,
    801			"%s, bad params, _req: 0x%p,"
    802			"req->req.complete: 0x%p, req->req.buf: 0x%p,"
    803			"list_empty: 0x%x\n",
    804			__func__, _req,
    805			req->req.complete, req->req.buf,
    806			list_empty(&req->queue));
    807		return -EINVAL;
    808	}
    809	if (unlikely(!ep->ep.desc)) {
    810		dev_err(u3d->dev, "%s, bad ep\n", __func__);
    811		return -EINVAL;
    812	}
    813	if (ep->ep.desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
    814		if (req->req.length > ep->ep.maxpacket)
    815			return -EMSGSIZE;
    816	}
    817
    818	if (!u3d->driver || u3d->gadget.speed == USB_SPEED_UNKNOWN) {
    819		dev_err(u3d->dev,
    820			"bad params of driver/speed\n");
    821		return -ESHUTDOWN;
    822	}
    823
    824	req->ep = ep;
    825
    826	/* Software list handles usb request. */
    827	spin_lock_irqsave(&ep->req_lock, flags);
    828	is_first_req = list_empty(&ep->req_list);
    829	list_add_tail(&req->list, &ep->req_list);
    830	spin_unlock_irqrestore(&ep->req_lock, flags);
    831	if (!is_first_req) {
    832		dev_dbg(u3d->dev, "list is not empty\n");
    833		return 0;
    834	}
    835
    836	dev_dbg(u3d->dev, "call mv_u3d_start_queue from usb_ep_queue\n");
    837	spin_lock_irqsave(&u3d->lock, flags);
    838	mv_u3d_start_queue(ep);
    839	spin_unlock_irqrestore(&u3d->lock, flags);
    840	return 0;
    841}
    842
    843/* dequeues (cancels, unlinks) an I/O request from an endpoint */
    844static int mv_u3d_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
    845{
    846	struct mv_u3d_ep *ep;
    847	struct mv_u3d_req *req = NULL, *iter;
    848	struct mv_u3d *u3d;
    849	struct mv_u3d_ep_context *ep_context;
    850	struct mv_u3d_req *next_req;
    851
    852	unsigned long flags;
    853	int ret = 0;
    854
    855	if (!_ep || !_req)
    856		return -EINVAL;
    857
    858	ep = container_of(_ep, struct mv_u3d_ep, ep);
    859	u3d = ep->u3d;
    860
    861	spin_lock_irqsave(&ep->u3d->lock, flags);
    862
    863	/* make sure it's actually queued on this endpoint */
    864	list_for_each_entry(iter, &ep->queue, queue) {
    865		if (&iter->req != _req)
    866			continue;
    867		req = iter;
    868		break;
    869	}
    870	if (!req) {
    871		ret = -EINVAL;
    872		goto out;
    873	}
    874
    875	/* The request is in progress, or completed but not dequeued */
    876	if (ep->queue.next == &req->queue) {
    877		_req->status = -ECONNRESET;
    878		mv_u3d_ep_fifo_flush(_ep);
    879
    880		/* The request isn't the last request in this ep queue */
    881		if (req->queue.next != &ep->queue) {
    882			dev_dbg(u3d->dev,
    883				"it is the last request in this ep queue\n");
    884			ep_context = ep->ep_context;
    885			next_req = list_entry(req->queue.next,
    886					struct mv_u3d_req, queue);
    887
    888			/* Point first TRB of next request to the EP context. */
    889			iowrite32((unsigned long) next_req->trb_head,
    890					&ep_context->trb_addr_lo);
    891		} else {
    892			struct mv_u3d_ep_context *ep_context;
    893			ep_context = ep->ep_context;
    894			ep_context->trb_addr_lo = 0;
    895			ep_context->trb_addr_hi = 0;
    896		}
    897
    898	} else
    899		WARN_ON(1);
    900
    901	mv_u3d_done(ep, req, -ECONNRESET);
    902
    903	/* remove the req from the ep req list */
    904	if (!list_empty(&ep->req_list)) {
    905		struct mv_u3d_req *curr_req;
    906		curr_req = list_entry(ep->req_list.next,
    907					struct mv_u3d_req, list);
    908		if (curr_req == req) {
    909			list_del_init(&req->list);
    910			ep->processing = 0;
    911		}
    912	}
    913
    914out:
    915	spin_unlock_irqrestore(&ep->u3d->lock, flags);
    916	return ret;
    917}
    918
    919static void
    920mv_u3d_ep_set_stall(struct mv_u3d *u3d, u8 ep_num, u8 direction, int stall)
    921{
    922	u32 tmp;
    923	struct mv_u3d_ep *ep = u3d->eps;
    924
    925	dev_dbg(u3d->dev, "%s\n", __func__);
    926	if (direction == MV_U3D_EP_DIR_OUT) {
    927		tmp = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    928		if (stall)
    929			tmp |= MV_U3D_EPXCR_EP_HALT;
    930		else
    931			tmp &= ~MV_U3D_EPXCR_EP_HALT;
    932		iowrite32(tmp, &u3d->vuc_regs->epcr[ep->ep_num].epxoutcr0);
    933	} else {
    934		tmp = ioread32(&u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    935		if (stall)
    936			tmp |= MV_U3D_EPXCR_EP_HALT;
    937		else
    938			tmp &= ~MV_U3D_EPXCR_EP_HALT;
    939		iowrite32(tmp, &u3d->vuc_regs->epcr[ep->ep_num].epxincr0);
    940	}
    941}
    942
    943static int mv_u3d_ep_set_halt_wedge(struct usb_ep *_ep, int halt, int wedge)
    944{
    945	struct mv_u3d_ep *ep;
    946	unsigned long flags;
    947	int status = 0;
    948	struct mv_u3d *u3d;
    949
    950	ep = container_of(_ep, struct mv_u3d_ep, ep);
    951	u3d = ep->u3d;
    952	if (!ep->ep.desc) {
    953		status = -EINVAL;
    954		goto out;
    955	}
    956
    957	if (ep->ep.desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
    958		status = -EOPNOTSUPP;
    959		goto out;
    960	}
    961
    962	/*
    963	 * Attempt to halt IN ep will fail if any transfer requests
    964	 * are still queue
    965	 */
    966	if (halt && (mv_u3d_ep_dir(ep) == MV_U3D_EP_DIR_IN)
    967			&& !list_empty(&ep->queue)) {
    968		status = -EAGAIN;
    969		goto out;
    970	}
    971
    972	spin_lock_irqsave(&ep->u3d->lock, flags);
    973	mv_u3d_ep_set_stall(u3d, ep->ep_num, mv_u3d_ep_dir(ep), halt);
    974	if (halt && wedge)
    975		ep->wedge = 1;
    976	else if (!halt)
    977		ep->wedge = 0;
    978	spin_unlock_irqrestore(&ep->u3d->lock, flags);
    979
    980	if (ep->ep_num == 0)
    981		u3d->ep0_dir = MV_U3D_EP_DIR_OUT;
    982out:
    983	return status;
    984}
    985
    986static int mv_u3d_ep_set_halt(struct usb_ep *_ep, int halt)
    987{
    988	return mv_u3d_ep_set_halt_wedge(_ep, halt, 0);
    989}
    990
    991static int mv_u3d_ep_set_wedge(struct usb_ep *_ep)
    992{
    993	return mv_u3d_ep_set_halt_wedge(_ep, 1, 1);
    994}
    995
    996static const struct usb_ep_ops mv_u3d_ep_ops = {
    997	.enable		= mv_u3d_ep_enable,
    998	.disable	= mv_u3d_ep_disable,
    999
   1000	.alloc_request	= mv_u3d_alloc_request,
   1001	.free_request	= mv_u3d_free_request,
   1002
   1003	.queue		= mv_u3d_ep_queue,
   1004	.dequeue	= mv_u3d_ep_dequeue,
   1005
   1006	.set_wedge	= mv_u3d_ep_set_wedge,
   1007	.set_halt	= mv_u3d_ep_set_halt,
   1008	.fifo_flush	= mv_u3d_ep_fifo_flush,
   1009};
   1010
   1011static void mv_u3d_controller_stop(struct mv_u3d *u3d)
   1012{
   1013	u32 tmp;
   1014
   1015	if (!u3d->clock_gating && u3d->vbus_valid_detect)
   1016		iowrite32(MV_U3D_INTR_ENABLE_VBUS_VALID,
   1017				&u3d->vuc_regs->intrenable);
   1018	else
   1019		iowrite32(0, &u3d->vuc_regs->intrenable);
   1020	iowrite32(~0x0, &u3d->vuc_regs->endcomplete);
   1021	iowrite32(~0x0, &u3d->vuc_regs->trbunderrun);
   1022	iowrite32(~0x0, &u3d->vuc_regs->trbcomplete);
   1023	iowrite32(~0x0, &u3d->vuc_regs->linkchange);
   1024	iowrite32(0x1, &u3d->vuc_regs->setuplock);
   1025
   1026	/* Reset the RUN bit in the command register to stop USB */
   1027	tmp = ioread32(&u3d->op_regs->usbcmd);
   1028	tmp &= ~MV_U3D_CMD_RUN_STOP;
   1029	iowrite32(tmp, &u3d->op_regs->usbcmd);
   1030	dev_dbg(u3d->dev, "after u3d_stop, USBCMD 0x%x\n",
   1031		ioread32(&u3d->op_regs->usbcmd));
   1032}
   1033
   1034static void mv_u3d_controller_start(struct mv_u3d *u3d)
   1035{
   1036	u32 usbintr;
   1037	u32 temp;
   1038
   1039	/* enable link LTSSM state machine */
   1040	temp = ioread32(&u3d->vuc_regs->ltssm);
   1041	temp |= MV_U3D_LTSSM_PHY_INIT_DONE;
   1042	iowrite32(temp, &u3d->vuc_regs->ltssm);
   1043
   1044	/* Enable interrupts */
   1045	usbintr = MV_U3D_INTR_ENABLE_LINK_CHG | MV_U3D_INTR_ENABLE_TXDESC_ERR |
   1046		MV_U3D_INTR_ENABLE_RXDESC_ERR | MV_U3D_INTR_ENABLE_TX_COMPLETE |
   1047		MV_U3D_INTR_ENABLE_RX_COMPLETE | MV_U3D_INTR_ENABLE_SETUP |
   1048		(u3d->vbus_valid_detect ? MV_U3D_INTR_ENABLE_VBUS_VALID : 0);
   1049	iowrite32(usbintr, &u3d->vuc_regs->intrenable);
   1050
   1051	/* Enable ctrl ep */
   1052	iowrite32(0x1, &u3d->vuc_regs->ctrlepenable);
   1053
   1054	/* Set the Run bit in the command register */
   1055	iowrite32(MV_U3D_CMD_RUN_STOP, &u3d->op_regs->usbcmd);
   1056	dev_dbg(u3d->dev, "after u3d_start, USBCMD 0x%x\n",
   1057		ioread32(&u3d->op_regs->usbcmd));
   1058}
   1059
   1060static int mv_u3d_controller_reset(struct mv_u3d *u3d)
   1061{
   1062	unsigned int loops;
   1063	u32 tmp;
   1064
   1065	/* Stop the controller */
   1066	tmp = ioread32(&u3d->op_regs->usbcmd);
   1067	tmp &= ~MV_U3D_CMD_RUN_STOP;
   1068	iowrite32(tmp, &u3d->op_regs->usbcmd);
   1069
   1070	/* Reset the controller to get default values */
   1071	iowrite32(MV_U3D_CMD_CTRL_RESET, &u3d->op_regs->usbcmd);
   1072
   1073	/* wait for reset to complete */
   1074	loops = LOOPS(MV_U3D_RESET_TIMEOUT);
   1075	while (ioread32(&u3d->op_regs->usbcmd) & MV_U3D_CMD_CTRL_RESET) {
   1076		if (loops == 0) {
   1077			dev_err(u3d->dev,
   1078				"Wait for RESET completed TIMEOUT\n");
   1079			return -ETIMEDOUT;
   1080		}
   1081		loops--;
   1082		udelay(LOOPS_USEC);
   1083	}
   1084
   1085	/* Configure the Endpoint Context Address */
   1086	iowrite32(u3d->ep_context_dma, &u3d->op_regs->dcbaapl);
   1087	iowrite32(0, &u3d->op_regs->dcbaaph);
   1088
   1089	return 0;
   1090}
   1091
   1092static int mv_u3d_enable(struct mv_u3d *u3d)
   1093{
   1094	struct mv_usb_platform_data *pdata = dev_get_platdata(u3d->dev);
   1095	int retval;
   1096
   1097	if (u3d->active)
   1098		return 0;
   1099
   1100	if (!u3d->clock_gating) {
   1101		u3d->active = 1;
   1102		return 0;
   1103	}
   1104
   1105	dev_dbg(u3d->dev, "enable u3d\n");
   1106	clk_enable(u3d->clk);
   1107	if (pdata->phy_init) {
   1108		retval = pdata->phy_init(u3d->phy_regs);
   1109		if (retval) {
   1110			dev_err(u3d->dev,
   1111				"init phy error %d\n", retval);
   1112			clk_disable(u3d->clk);
   1113			return retval;
   1114		}
   1115	}
   1116	u3d->active = 1;
   1117
   1118	return 0;
   1119}
   1120
   1121static void mv_u3d_disable(struct mv_u3d *u3d)
   1122{
   1123	struct mv_usb_platform_data *pdata = dev_get_platdata(u3d->dev);
   1124	if (u3d->clock_gating && u3d->active) {
   1125		dev_dbg(u3d->dev, "disable u3d\n");
   1126		if (pdata->phy_deinit)
   1127			pdata->phy_deinit(u3d->phy_regs);
   1128		clk_disable(u3d->clk);
   1129		u3d->active = 0;
   1130	}
   1131}
   1132
   1133static int mv_u3d_vbus_session(struct usb_gadget *gadget, int is_active)
   1134{
   1135	struct mv_u3d *u3d;
   1136	unsigned long flags;
   1137	int retval = 0;
   1138
   1139	u3d = container_of(gadget, struct mv_u3d, gadget);
   1140
   1141	spin_lock_irqsave(&u3d->lock, flags);
   1142
   1143	u3d->vbus_active = (is_active != 0);
   1144	dev_dbg(u3d->dev, "%s: softconnect %d, vbus_active %d\n",
   1145		__func__, u3d->softconnect, u3d->vbus_active);
   1146	/*
   1147	 * 1. external VBUS detect: we can disable/enable clock on demand.
   1148	 * 2. UDC VBUS detect: we have to enable clock all the time.
   1149	 * 3. No VBUS detect: we have to enable clock all the time.
   1150	 */
   1151	if (u3d->driver && u3d->softconnect && u3d->vbus_active) {
   1152		retval = mv_u3d_enable(u3d);
   1153		if (retval == 0) {
   1154			/*
   1155			 * after clock is disabled, we lost all the register
   1156			 *  context. We have to re-init registers
   1157			 */
   1158			mv_u3d_controller_reset(u3d);
   1159			mv_u3d_ep0_reset(u3d);
   1160			mv_u3d_controller_start(u3d);
   1161		}
   1162	} else if (u3d->driver && u3d->softconnect) {
   1163		if (!u3d->active)
   1164			goto out;
   1165
   1166		/* stop all the transfer in queue*/
   1167		mv_u3d_stop_activity(u3d, u3d->driver);
   1168		mv_u3d_controller_stop(u3d);
   1169		mv_u3d_disable(u3d);
   1170	}
   1171
   1172out:
   1173	spin_unlock_irqrestore(&u3d->lock, flags);
   1174	return retval;
   1175}
   1176
   1177/* constrain controller's VBUS power usage
   1178 * This call is used by gadget drivers during SET_CONFIGURATION calls,
   1179 * reporting how much power the device may consume.  For example, this
   1180 * could affect how quickly batteries are recharged.
   1181 *
   1182 * Returns zero on success, else negative errno.
   1183 */
   1184static int mv_u3d_vbus_draw(struct usb_gadget *gadget, unsigned mA)
   1185{
   1186	struct mv_u3d *u3d = container_of(gadget, struct mv_u3d, gadget);
   1187
   1188	u3d->power = mA;
   1189
   1190	return 0;
   1191}
   1192
   1193static int mv_u3d_pullup(struct usb_gadget *gadget, int is_on)
   1194{
   1195	struct mv_u3d *u3d = container_of(gadget, struct mv_u3d, gadget);
   1196	unsigned long flags;
   1197	int retval = 0;
   1198
   1199	spin_lock_irqsave(&u3d->lock, flags);
   1200
   1201	dev_dbg(u3d->dev, "%s: softconnect %d, vbus_active %d\n",
   1202		__func__, u3d->softconnect, u3d->vbus_active);
   1203	u3d->softconnect = (is_on != 0);
   1204	if (u3d->driver && u3d->softconnect && u3d->vbus_active) {
   1205		retval = mv_u3d_enable(u3d);
   1206		if (retval == 0) {
   1207			/*
   1208			 * after clock is disabled, we lost all the register
   1209			 *  context. We have to re-init registers
   1210			 */
   1211			mv_u3d_controller_reset(u3d);
   1212			mv_u3d_ep0_reset(u3d);
   1213			mv_u3d_controller_start(u3d);
   1214		}
   1215	} else if (u3d->driver && u3d->vbus_active) {
   1216		/* stop all the transfer in queue*/
   1217		mv_u3d_stop_activity(u3d, u3d->driver);
   1218		mv_u3d_controller_stop(u3d);
   1219		mv_u3d_disable(u3d);
   1220	}
   1221
   1222	spin_unlock_irqrestore(&u3d->lock, flags);
   1223
   1224	return retval;
   1225}
   1226
   1227static int mv_u3d_start(struct usb_gadget *g,
   1228		struct usb_gadget_driver *driver)
   1229{
   1230	struct mv_u3d *u3d = container_of(g, struct mv_u3d, gadget);
   1231	struct mv_usb_platform_data *pdata = dev_get_platdata(u3d->dev);
   1232	unsigned long flags;
   1233
   1234	if (u3d->driver)
   1235		return -EBUSY;
   1236
   1237	spin_lock_irqsave(&u3d->lock, flags);
   1238
   1239	if (!u3d->clock_gating) {
   1240		clk_enable(u3d->clk);
   1241		if (pdata->phy_init)
   1242			pdata->phy_init(u3d->phy_regs);
   1243	}
   1244
   1245	/* hook up the driver ... */
   1246	driver->driver.bus = NULL;
   1247	u3d->driver = driver;
   1248
   1249	u3d->ep0_dir = USB_DIR_OUT;
   1250
   1251	spin_unlock_irqrestore(&u3d->lock, flags);
   1252
   1253	u3d->vbus_valid_detect = 1;
   1254
   1255	return 0;
   1256}
   1257
   1258static int mv_u3d_stop(struct usb_gadget *g)
   1259{
   1260	struct mv_u3d *u3d = container_of(g, struct mv_u3d, gadget);
   1261	struct mv_usb_platform_data *pdata = dev_get_platdata(u3d->dev);
   1262	unsigned long flags;
   1263
   1264	u3d->vbus_valid_detect = 0;
   1265	spin_lock_irqsave(&u3d->lock, flags);
   1266
   1267	/* enable clock to access controller register */
   1268	clk_enable(u3d->clk);
   1269	if (pdata->phy_init)
   1270		pdata->phy_init(u3d->phy_regs);
   1271
   1272	mv_u3d_controller_stop(u3d);
   1273	/* stop all usb activities */
   1274	u3d->gadget.speed = USB_SPEED_UNKNOWN;
   1275	mv_u3d_stop_activity(u3d, NULL);
   1276	mv_u3d_disable(u3d);
   1277
   1278	if (pdata->phy_deinit)
   1279		pdata->phy_deinit(u3d->phy_regs);
   1280	clk_disable(u3d->clk);
   1281
   1282	spin_unlock_irqrestore(&u3d->lock, flags);
   1283
   1284	u3d->driver = NULL;
   1285
   1286	return 0;
   1287}
   1288
   1289/* device controller usb_gadget_ops structure */
   1290static const struct usb_gadget_ops mv_u3d_ops = {
   1291	/* notify controller that VBUS is powered or not */
   1292	.vbus_session	= mv_u3d_vbus_session,
   1293
   1294	/* constrain controller's VBUS power usage */
   1295	.vbus_draw	= mv_u3d_vbus_draw,
   1296
   1297	.pullup		= mv_u3d_pullup,
   1298	.udc_start	= mv_u3d_start,
   1299	.udc_stop	= mv_u3d_stop,
   1300};
   1301
   1302static int mv_u3d_eps_init(struct mv_u3d *u3d)
   1303{
   1304	struct mv_u3d_ep	*ep;
   1305	char name[14];
   1306	int i;
   1307
   1308	/* initialize ep0, ep0 in/out use eps[1] */
   1309	ep = &u3d->eps[1];
   1310	ep->u3d = u3d;
   1311	strncpy(ep->name, "ep0", sizeof(ep->name));
   1312	ep->ep.name = ep->name;
   1313	ep->ep.ops = &mv_u3d_ep_ops;
   1314	ep->wedge = 0;
   1315	usb_ep_set_maxpacket_limit(&ep->ep, MV_U3D_EP0_MAX_PKT_SIZE);
   1316	ep->ep.caps.type_control = true;
   1317	ep->ep.caps.dir_in = true;
   1318	ep->ep.caps.dir_out = true;
   1319	ep->ep_num = 0;
   1320	ep->ep.desc = &mv_u3d_ep0_desc;
   1321	INIT_LIST_HEAD(&ep->queue);
   1322	INIT_LIST_HEAD(&ep->req_list);
   1323	ep->ep_type = USB_ENDPOINT_XFER_CONTROL;
   1324
   1325	/* add ep0 ep_context */
   1326	ep->ep_context = &u3d->ep_context[1];
   1327
   1328	/* initialize other endpoints */
   1329	for (i = 2; i < u3d->max_eps * 2; i++) {
   1330		ep = &u3d->eps[i];
   1331		if (i & 1) {
   1332			snprintf(name, sizeof(name), "ep%din", i >> 1);
   1333			ep->direction = MV_U3D_EP_DIR_IN;
   1334			ep->ep.caps.dir_in = true;
   1335		} else {
   1336			snprintf(name, sizeof(name), "ep%dout", i >> 1);
   1337			ep->direction = MV_U3D_EP_DIR_OUT;
   1338			ep->ep.caps.dir_out = true;
   1339		}
   1340		ep->u3d = u3d;
   1341		strncpy(ep->name, name, sizeof(ep->name));
   1342		ep->ep.name = ep->name;
   1343
   1344		ep->ep.caps.type_iso = true;
   1345		ep->ep.caps.type_bulk = true;
   1346		ep->ep.caps.type_int = true;
   1347
   1348		ep->ep.ops = &mv_u3d_ep_ops;
   1349		usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
   1350		ep->ep_num = i / 2;
   1351
   1352		INIT_LIST_HEAD(&ep->queue);
   1353		list_add_tail(&ep->ep.ep_list, &u3d->gadget.ep_list);
   1354
   1355		INIT_LIST_HEAD(&ep->req_list);
   1356		spin_lock_init(&ep->req_lock);
   1357		ep->ep_context = &u3d->ep_context[i];
   1358	}
   1359
   1360	return 0;
   1361}
   1362
   1363/* delete all endpoint requests, called with spinlock held */
   1364static void mv_u3d_nuke(struct mv_u3d_ep *ep, int status)
   1365{
   1366	/* endpoint fifo flush */
   1367	mv_u3d_ep_fifo_flush(&ep->ep);
   1368
   1369	while (!list_empty(&ep->queue)) {
   1370		struct mv_u3d_req *req = NULL;
   1371		req = list_entry(ep->queue.next, struct mv_u3d_req, queue);
   1372		mv_u3d_done(ep, req, status);
   1373	}
   1374}
   1375
   1376/* stop all USB activities */
   1377static
   1378void mv_u3d_stop_activity(struct mv_u3d *u3d, struct usb_gadget_driver *driver)
   1379{
   1380	struct mv_u3d_ep	*ep;
   1381
   1382	mv_u3d_nuke(&u3d->eps[1], -ESHUTDOWN);
   1383
   1384	list_for_each_entry(ep, &u3d->gadget.ep_list, ep.ep_list) {
   1385		mv_u3d_nuke(ep, -ESHUTDOWN);
   1386	}
   1387
   1388	/* report disconnect; the driver is already quiesced */
   1389	if (driver) {
   1390		spin_unlock(&u3d->lock);
   1391		driver->disconnect(&u3d->gadget);
   1392		spin_lock(&u3d->lock);
   1393	}
   1394}
   1395
   1396static void mv_u3d_irq_process_error(struct mv_u3d *u3d)
   1397{
   1398	/* Increment the error count */
   1399	u3d->errors++;
   1400	dev_err(u3d->dev, "%s\n", __func__);
   1401}
   1402
   1403static void mv_u3d_irq_process_link_change(struct mv_u3d *u3d)
   1404{
   1405	u32 linkchange;
   1406
   1407	linkchange = ioread32(&u3d->vuc_regs->linkchange);
   1408	iowrite32(linkchange, &u3d->vuc_regs->linkchange);
   1409
   1410	dev_dbg(u3d->dev, "linkchange: 0x%x\n", linkchange);
   1411
   1412	if (linkchange & MV_U3D_LINK_CHANGE_LINK_UP) {
   1413		dev_dbg(u3d->dev, "link up: ltssm state: 0x%x\n",
   1414			ioread32(&u3d->vuc_regs->ltssmstate));
   1415
   1416		u3d->usb_state = USB_STATE_DEFAULT;
   1417		u3d->ep0_dir = MV_U3D_EP_DIR_OUT;
   1418		u3d->ep0_state = MV_U3D_WAIT_FOR_SETUP;
   1419
   1420		/* set speed */
   1421		u3d->gadget.speed = USB_SPEED_SUPER;
   1422	}
   1423
   1424	if (linkchange & MV_U3D_LINK_CHANGE_SUSPEND) {
   1425		dev_dbg(u3d->dev, "link suspend\n");
   1426		u3d->resume_state = u3d->usb_state;
   1427		u3d->usb_state = USB_STATE_SUSPENDED;
   1428	}
   1429
   1430	if (linkchange & MV_U3D_LINK_CHANGE_RESUME) {
   1431		dev_dbg(u3d->dev, "link resume\n");
   1432		u3d->usb_state = u3d->resume_state;
   1433		u3d->resume_state = 0;
   1434	}
   1435
   1436	if (linkchange & MV_U3D_LINK_CHANGE_WRESET) {
   1437		dev_dbg(u3d->dev, "warm reset\n");
   1438		u3d->usb_state = USB_STATE_POWERED;
   1439	}
   1440
   1441	if (linkchange & MV_U3D_LINK_CHANGE_HRESET) {
   1442		dev_dbg(u3d->dev, "hot reset\n");
   1443		u3d->usb_state = USB_STATE_DEFAULT;
   1444	}
   1445
   1446	if (linkchange & MV_U3D_LINK_CHANGE_INACT)
   1447		dev_dbg(u3d->dev, "inactive\n");
   1448
   1449	if (linkchange & MV_U3D_LINK_CHANGE_DISABLE_AFTER_U0)
   1450		dev_dbg(u3d->dev, "ss.disabled\n");
   1451
   1452	if (linkchange & MV_U3D_LINK_CHANGE_VBUS_INVALID) {
   1453		dev_dbg(u3d->dev, "vbus invalid\n");
   1454		u3d->usb_state = USB_STATE_ATTACHED;
   1455		u3d->vbus_valid_detect = 1;
   1456		/* if external vbus detect is not supported,
   1457		 * we handle it here.
   1458		 */
   1459		if (!u3d->vbus) {
   1460			spin_unlock(&u3d->lock);
   1461			mv_u3d_vbus_session(&u3d->gadget, 0);
   1462			spin_lock(&u3d->lock);
   1463		}
   1464	}
   1465}
   1466
   1467static void mv_u3d_ch9setaddress(struct mv_u3d *u3d,
   1468				struct usb_ctrlrequest *setup)
   1469{
   1470	u32 tmp;
   1471
   1472	if (u3d->usb_state != USB_STATE_DEFAULT) {
   1473		dev_err(u3d->dev,
   1474			"%s, cannot setaddr in this state (%d)\n",
   1475			__func__, u3d->usb_state);
   1476		goto err;
   1477	}
   1478
   1479	u3d->dev_addr = (u8)setup->wValue;
   1480
   1481	dev_dbg(u3d->dev, "%s: 0x%x\n", __func__, u3d->dev_addr);
   1482
   1483	if (u3d->dev_addr > 127) {
   1484		dev_err(u3d->dev,
   1485			"%s, u3d address is wrong (out of range)\n", __func__);
   1486		u3d->dev_addr = 0;
   1487		goto err;
   1488	}
   1489
   1490	/* update usb state */
   1491	u3d->usb_state = USB_STATE_ADDRESS;
   1492
   1493	/* set the new address */
   1494	tmp = ioread32(&u3d->vuc_regs->devaddrtiebrkr);
   1495	tmp &= ~0x7F;
   1496	tmp |= (u32)u3d->dev_addr;
   1497	iowrite32(tmp, &u3d->vuc_regs->devaddrtiebrkr);
   1498
   1499	return;
   1500err:
   1501	mv_u3d_ep0_stall(u3d);
   1502}
   1503
   1504static int mv_u3d_is_set_configuration(struct usb_ctrlrequest *setup)
   1505{
   1506	if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD)
   1507		if (setup->bRequest == USB_REQ_SET_CONFIGURATION)
   1508			return 1;
   1509
   1510	return 0;
   1511}
   1512
   1513static void mv_u3d_handle_setup_packet(struct mv_u3d *u3d, u8 ep_num,
   1514	struct usb_ctrlrequest *setup)
   1515	__releases(&u3c->lock)
   1516	__acquires(&u3c->lock)
   1517{
   1518	bool delegate = false;
   1519
   1520	mv_u3d_nuke(&u3d->eps[ep_num * 2 + MV_U3D_EP_DIR_IN], -ESHUTDOWN);
   1521
   1522	dev_dbg(u3d->dev, "SETUP %02x.%02x v%04x i%04x l%04x\n",
   1523			setup->bRequestType, setup->bRequest,
   1524			setup->wValue, setup->wIndex, setup->wLength);
   1525
   1526	/* We process some stardard setup requests here */
   1527	if ((setup->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
   1528		switch (setup->bRequest) {
   1529		case USB_REQ_GET_STATUS:
   1530			delegate = true;
   1531			break;
   1532
   1533		case USB_REQ_SET_ADDRESS:
   1534			mv_u3d_ch9setaddress(u3d, setup);
   1535			break;
   1536
   1537		case USB_REQ_CLEAR_FEATURE:
   1538			delegate = true;
   1539			break;
   1540
   1541		case USB_REQ_SET_FEATURE:
   1542			delegate = true;
   1543			break;
   1544
   1545		default:
   1546			delegate = true;
   1547		}
   1548	} else
   1549		delegate = true;
   1550
   1551	/* delegate USB standard requests to the gadget driver */
   1552	if (delegate) {
   1553		/* USB requests handled by gadget */
   1554		if (setup->wLength) {
   1555			/* DATA phase from gadget, STATUS phase from u3d */
   1556			u3d->ep0_dir = (setup->bRequestType & USB_DIR_IN)
   1557					? MV_U3D_EP_DIR_IN : MV_U3D_EP_DIR_OUT;
   1558			spin_unlock(&u3d->lock);
   1559			if (u3d->driver->setup(&u3d->gadget,
   1560				&u3d->local_setup_buff) < 0) {
   1561				dev_err(u3d->dev, "setup error!\n");
   1562				mv_u3d_ep0_stall(u3d);
   1563			}
   1564			spin_lock(&u3d->lock);
   1565		} else {
   1566			/* no DATA phase, STATUS phase from gadget */
   1567			u3d->ep0_dir = MV_U3D_EP_DIR_IN;
   1568			u3d->ep0_state = MV_U3D_STATUS_STAGE;
   1569			spin_unlock(&u3d->lock);
   1570			if (u3d->driver->setup(&u3d->gadget,
   1571				&u3d->local_setup_buff) < 0)
   1572				mv_u3d_ep0_stall(u3d);
   1573			spin_lock(&u3d->lock);
   1574		}
   1575
   1576		if (mv_u3d_is_set_configuration(setup)) {
   1577			dev_dbg(u3d->dev, "u3d configured\n");
   1578			u3d->usb_state = USB_STATE_CONFIGURED;
   1579		}
   1580	}
   1581}
   1582
   1583static void mv_u3d_get_setup_data(struct mv_u3d *u3d, u8 ep_num, u8 *buffer_ptr)
   1584{
   1585	struct mv_u3d_ep_context *epcontext;
   1586
   1587	epcontext = &u3d->ep_context[ep_num * 2 + MV_U3D_EP_DIR_IN];
   1588
   1589	/* Copy the setup packet to local buffer */
   1590	memcpy(buffer_ptr, (u8 *) &epcontext->setup_buffer, 8);
   1591}
   1592
   1593static void mv_u3d_irq_process_setup(struct mv_u3d *u3d)
   1594{
   1595	u32 tmp, i;
   1596	/* Process all Setup packet received interrupts */
   1597	tmp = ioread32(&u3d->vuc_regs->setuplock);
   1598	if (tmp) {
   1599		for (i = 0; i < u3d->max_eps; i++) {
   1600			if (tmp & (1 << i)) {
   1601				mv_u3d_get_setup_data(u3d, i,
   1602					(u8 *)(&u3d->local_setup_buff));
   1603				mv_u3d_handle_setup_packet(u3d, i,
   1604					&u3d->local_setup_buff);
   1605			}
   1606		}
   1607	}
   1608
   1609	iowrite32(tmp, &u3d->vuc_regs->setuplock);
   1610}
   1611
   1612static void mv_u3d_irq_process_tr_complete(struct mv_u3d *u3d)
   1613{
   1614	u32 tmp, bit_pos;
   1615	int i, ep_num = 0, direction = 0;
   1616	struct mv_u3d_ep	*curr_ep;
   1617	struct mv_u3d_req *curr_req, *temp_req;
   1618	int status;
   1619
   1620	tmp = ioread32(&u3d->vuc_regs->endcomplete);
   1621
   1622	dev_dbg(u3d->dev, "tr_complete: ep: 0x%x\n", tmp);
   1623	if (!tmp)
   1624		return;
   1625	iowrite32(tmp, &u3d->vuc_regs->endcomplete);
   1626
   1627	for (i = 0; i < u3d->max_eps * 2; i++) {
   1628		ep_num = i >> 1;
   1629		direction = i % 2;
   1630
   1631		bit_pos = 1 << (ep_num + 16 * direction);
   1632
   1633		if (!(bit_pos & tmp))
   1634			continue;
   1635
   1636		if (i == 0)
   1637			curr_ep = &u3d->eps[1];
   1638		else
   1639			curr_ep = &u3d->eps[i];
   1640
   1641		/* remove req out of ep request list after completion */
   1642		dev_dbg(u3d->dev, "tr comp: check req_list\n");
   1643		spin_lock(&curr_ep->req_lock);
   1644		if (!list_empty(&curr_ep->req_list)) {
   1645			struct mv_u3d_req *req;
   1646			req = list_entry(curr_ep->req_list.next,
   1647						struct mv_u3d_req, list);
   1648			list_del_init(&req->list);
   1649			curr_ep->processing = 0;
   1650		}
   1651		spin_unlock(&curr_ep->req_lock);
   1652
   1653		/* process the req queue until an uncomplete request */
   1654		list_for_each_entry_safe(curr_req, temp_req,
   1655			&curr_ep->queue, queue) {
   1656			status = mv_u3d_process_ep_req(u3d, i, curr_req);
   1657			if (status)
   1658				break;
   1659			/* write back status to req */
   1660			curr_req->req.status = status;
   1661
   1662			/* ep0 request completion */
   1663			if (ep_num == 0) {
   1664				mv_u3d_done(curr_ep, curr_req, 0);
   1665				break;
   1666			} else {
   1667				mv_u3d_done(curr_ep, curr_req, status);
   1668			}
   1669		}
   1670
   1671		dev_dbg(u3d->dev, "call mv_u3d_start_queue from ep complete\n");
   1672		mv_u3d_start_queue(curr_ep);
   1673	}
   1674}
   1675
   1676static irqreturn_t mv_u3d_irq(int irq, void *dev)
   1677{
   1678	struct mv_u3d *u3d = (struct mv_u3d *)dev;
   1679	u32 status, intr;
   1680	u32 bridgesetting;
   1681	u32 trbunderrun;
   1682
   1683	spin_lock(&u3d->lock);
   1684
   1685	status = ioread32(&u3d->vuc_regs->intrcause);
   1686	intr = ioread32(&u3d->vuc_regs->intrenable);
   1687	status &= intr;
   1688
   1689	if (status == 0) {
   1690		spin_unlock(&u3d->lock);
   1691		dev_err(u3d->dev, "irq error!\n");
   1692		return IRQ_NONE;
   1693	}
   1694
   1695	if (status & MV_U3D_USBINT_VBUS_VALID) {
   1696		bridgesetting = ioread32(&u3d->vuc_regs->bridgesetting);
   1697		if (bridgesetting & MV_U3D_BRIDGE_SETTING_VBUS_VALID) {
   1698			/* write vbus valid bit of bridge setting to clear */
   1699			bridgesetting = MV_U3D_BRIDGE_SETTING_VBUS_VALID;
   1700			iowrite32(bridgesetting, &u3d->vuc_regs->bridgesetting);
   1701			dev_dbg(u3d->dev, "vbus valid\n");
   1702
   1703			u3d->usb_state = USB_STATE_POWERED;
   1704			u3d->vbus_valid_detect = 0;
   1705			/* if external vbus detect is not supported,
   1706			 * we handle it here.
   1707			 */
   1708			if (!u3d->vbus) {
   1709				spin_unlock(&u3d->lock);
   1710				mv_u3d_vbus_session(&u3d->gadget, 1);
   1711				spin_lock(&u3d->lock);
   1712			}
   1713		} else
   1714			dev_err(u3d->dev, "vbus bit is not set\n");
   1715	}
   1716
   1717	/* RX data is already in the 16KB FIFO.*/
   1718	if (status & MV_U3D_USBINT_UNDER_RUN) {
   1719		trbunderrun = ioread32(&u3d->vuc_regs->trbunderrun);
   1720		dev_err(u3d->dev, "under run, ep%d\n", trbunderrun);
   1721		iowrite32(trbunderrun, &u3d->vuc_regs->trbunderrun);
   1722		mv_u3d_irq_process_error(u3d);
   1723	}
   1724
   1725	if (status & (MV_U3D_USBINT_RXDESC_ERR | MV_U3D_USBINT_TXDESC_ERR)) {
   1726		/* write one to clear */
   1727		iowrite32(status & (MV_U3D_USBINT_RXDESC_ERR
   1728			| MV_U3D_USBINT_TXDESC_ERR),
   1729			&u3d->vuc_regs->intrcause);
   1730		dev_err(u3d->dev, "desc err 0x%x\n", status);
   1731		mv_u3d_irq_process_error(u3d);
   1732	}
   1733
   1734	if (status & MV_U3D_USBINT_LINK_CHG)
   1735		mv_u3d_irq_process_link_change(u3d);
   1736
   1737	if (status & MV_U3D_USBINT_TX_COMPLETE)
   1738		mv_u3d_irq_process_tr_complete(u3d);
   1739
   1740	if (status & MV_U3D_USBINT_RX_COMPLETE)
   1741		mv_u3d_irq_process_tr_complete(u3d);
   1742
   1743	if (status & MV_U3D_USBINT_SETUP)
   1744		mv_u3d_irq_process_setup(u3d);
   1745
   1746	spin_unlock(&u3d->lock);
   1747	return IRQ_HANDLED;
   1748}
   1749
   1750static int mv_u3d_remove(struct platform_device *dev)
   1751{
   1752	struct mv_u3d *u3d = platform_get_drvdata(dev);
   1753
   1754	BUG_ON(u3d == NULL);
   1755
   1756	usb_del_gadget_udc(&u3d->gadget);
   1757
   1758	/* free memory allocated in probe */
   1759	dma_pool_destroy(u3d->trb_pool);
   1760
   1761	if (u3d->ep_context)
   1762		dma_free_coherent(&dev->dev, u3d->ep_context_size,
   1763			u3d->ep_context, u3d->ep_context_dma);
   1764
   1765	kfree(u3d->eps);
   1766
   1767	if (u3d->irq)
   1768		free_irq(u3d->irq, u3d);
   1769
   1770	if (u3d->cap_regs)
   1771		iounmap(u3d->cap_regs);
   1772	u3d->cap_regs = NULL;
   1773
   1774	kfree(u3d->status_req);
   1775
   1776	clk_put(u3d->clk);
   1777
   1778	kfree(u3d);
   1779
   1780	return 0;
   1781}
   1782
   1783static int mv_u3d_probe(struct platform_device *dev)
   1784{
   1785	struct mv_u3d *u3d = NULL;
   1786	struct mv_usb_platform_data *pdata = dev_get_platdata(&dev->dev);
   1787	int retval = 0;
   1788	struct resource *r;
   1789	size_t size;
   1790
   1791	if (!dev_get_platdata(&dev->dev)) {
   1792		dev_err(&dev->dev, "missing platform_data\n");
   1793		retval = -ENODEV;
   1794		goto err_pdata;
   1795	}
   1796
   1797	u3d = kzalloc(sizeof(*u3d), GFP_KERNEL);
   1798	if (!u3d) {
   1799		retval = -ENOMEM;
   1800		goto err_alloc_private;
   1801	}
   1802
   1803	spin_lock_init(&u3d->lock);
   1804
   1805	platform_set_drvdata(dev, u3d);
   1806
   1807	u3d->dev = &dev->dev;
   1808	u3d->vbus = pdata->vbus;
   1809
   1810	u3d->clk = clk_get(&dev->dev, NULL);
   1811	if (IS_ERR(u3d->clk)) {
   1812		retval = PTR_ERR(u3d->clk);
   1813		goto err_get_clk;
   1814	}
   1815
   1816	r = platform_get_resource_byname(dev, IORESOURCE_MEM, "capregs");
   1817	if (!r) {
   1818		dev_err(&dev->dev, "no I/O memory resource defined\n");
   1819		retval = -ENODEV;
   1820		goto err_get_cap_regs;
   1821	}
   1822
   1823	u3d->cap_regs = (struct mv_u3d_cap_regs __iomem *)
   1824		ioremap(r->start, resource_size(r));
   1825	if (!u3d->cap_regs) {
   1826		dev_err(&dev->dev, "failed to map I/O memory\n");
   1827		retval = -EBUSY;
   1828		goto err_map_cap_regs;
   1829	} else {
   1830		dev_dbg(&dev->dev, "cap_regs address: 0x%lx/0x%lx\n",
   1831			(unsigned long) r->start,
   1832			(unsigned long) u3d->cap_regs);
   1833	}
   1834
   1835	/* we will access controller register, so enable the u3d controller */
   1836	retval = clk_enable(u3d->clk);
   1837	if (retval) {
   1838		dev_err(&dev->dev, "clk_enable error %d\n", retval);
   1839		goto err_u3d_enable;
   1840	}
   1841
   1842	if (pdata->phy_init) {
   1843		retval = pdata->phy_init(u3d->phy_regs);
   1844		if (retval) {
   1845			dev_err(&dev->dev, "init phy error %d\n", retval);
   1846			clk_disable(u3d->clk);
   1847			goto err_phy_init;
   1848		}
   1849	}
   1850
   1851	u3d->op_regs = (struct mv_u3d_op_regs __iomem *)(u3d->cap_regs
   1852		+ MV_U3D_USB3_OP_REGS_OFFSET);
   1853
   1854	u3d->vuc_regs = (struct mv_u3d_vuc_regs __iomem *)(u3d->cap_regs
   1855		+ ioread32(&u3d->cap_regs->vuoff));
   1856
   1857	u3d->max_eps = 16;
   1858
   1859	/*
   1860	 * some platform will use usb to download image, it may not disconnect
   1861	 * usb gadget before loading kernel. So first stop u3d here.
   1862	 */
   1863	mv_u3d_controller_stop(u3d);
   1864	iowrite32(0xFFFFFFFF, &u3d->vuc_regs->intrcause);
   1865
   1866	if (pdata->phy_deinit)
   1867		pdata->phy_deinit(u3d->phy_regs);
   1868	clk_disable(u3d->clk);
   1869
   1870	size = u3d->max_eps * sizeof(struct mv_u3d_ep_context) * 2;
   1871	size = (size + MV_U3D_EP_CONTEXT_ALIGNMENT - 1)
   1872		& ~(MV_U3D_EP_CONTEXT_ALIGNMENT - 1);
   1873	u3d->ep_context = dma_alloc_coherent(&dev->dev, size,
   1874					&u3d->ep_context_dma, GFP_KERNEL);
   1875	if (!u3d->ep_context) {
   1876		dev_err(&dev->dev, "allocate ep context memory failed\n");
   1877		retval = -ENOMEM;
   1878		goto err_alloc_ep_context;
   1879	}
   1880	u3d->ep_context_size = size;
   1881
   1882	/* create TRB dma_pool resource */
   1883	u3d->trb_pool = dma_pool_create("u3d_trb",
   1884			&dev->dev,
   1885			sizeof(struct mv_u3d_trb_hw),
   1886			MV_U3D_TRB_ALIGNMENT,
   1887			MV_U3D_DMA_BOUNDARY);
   1888
   1889	if (!u3d->trb_pool) {
   1890		retval = -ENOMEM;
   1891		goto err_alloc_trb_pool;
   1892	}
   1893
   1894	size = u3d->max_eps * sizeof(struct mv_u3d_ep) * 2;
   1895	u3d->eps = kzalloc(size, GFP_KERNEL);
   1896	if (!u3d->eps) {
   1897		retval = -ENOMEM;
   1898		goto err_alloc_eps;
   1899	}
   1900
   1901	/* initialize ep0 status request structure */
   1902	u3d->status_req = kzalloc(sizeof(struct mv_u3d_req) + 8, GFP_KERNEL);
   1903	if (!u3d->status_req) {
   1904		retval = -ENOMEM;
   1905		goto err_alloc_status_req;
   1906	}
   1907	INIT_LIST_HEAD(&u3d->status_req->queue);
   1908
   1909	/* allocate a small amount of memory to get valid address */
   1910	u3d->status_req->req.buf = (char *)u3d->status_req
   1911					+ sizeof(struct mv_u3d_req);
   1912	u3d->status_req->req.dma = virt_to_phys(u3d->status_req->req.buf);
   1913
   1914	u3d->resume_state = USB_STATE_NOTATTACHED;
   1915	u3d->usb_state = USB_STATE_ATTACHED;
   1916	u3d->ep0_dir = MV_U3D_EP_DIR_OUT;
   1917	u3d->remote_wakeup = 0;
   1918
   1919	r = platform_get_resource(dev, IORESOURCE_IRQ, 0);
   1920	if (!r) {
   1921		dev_err(&dev->dev, "no IRQ resource defined\n");
   1922		retval = -ENODEV;
   1923		goto err_get_irq;
   1924	}
   1925	u3d->irq = r->start;
   1926
   1927	/* initialize gadget structure */
   1928	u3d->gadget.ops = &mv_u3d_ops;	/* usb_gadget_ops */
   1929	u3d->gadget.ep0 = &u3d->eps[1].ep;	/* gadget ep0 */
   1930	INIT_LIST_HEAD(&u3d->gadget.ep_list);	/* ep_list */
   1931	u3d->gadget.speed = USB_SPEED_UNKNOWN;	/* speed */
   1932
   1933	/* the "gadget" abstracts/virtualizes the controller */
   1934	u3d->gadget.name = driver_name;		/* gadget name */
   1935
   1936	mv_u3d_eps_init(u3d);
   1937
   1938	if (request_irq(u3d->irq, mv_u3d_irq,
   1939		IRQF_SHARED, driver_name, u3d)) {
   1940		u3d->irq = 0;
   1941		dev_err(&dev->dev, "Request irq %d for u3d failed\n",
   1942			u3d->irq);
   1943		retval = -ENODEV;
   1944		goto err_request_irq;
   1945	}
   1946
   1947	/* external vbus detection */
   1948	if (u3d->vbus) {
   1949		u3d->clock_gating = 1;
   1950		dev_err(&dev->dev, "external vbus detection\n");
   1951	}
   1952
   1953	if (!u3d->clock_gating)
   1954		u3d->vbus_active = 1;
   1955
   1956	/* enable usb3 controller vbus detection */
   1957	u3d->vbus_valid_detect = 1;
   1958
   1959	retval = usb_add_gadget_udc(&dev->dev, &u3d->gadget);
   1960	if (retval)
   1961		goto err_unregister;
   1962
   1963	dev_dbg(&dev->dev, "successful probe usb3 device %s clock gating.\n",
   1964		u3d->clock_gating ? "with" : "without");
   1965
   1966	return 0;
   1967
   1968err_unregister:
   1969	free_irq(u3d->irq, u3d);
   1970err_get_irq:
   1971err_request_irq:
   1972	kfree(u3d->status_req);
   1973err_alloc_status_req:
   1974	kfree(u3d->eps);
   1975err_alloc_eps:
   1976	dma_pool_destroy(u3d->trb_pool);
   1977err_alloc_trb_pool:
   1978	dma_free_coherent(&dev->dev, u3d->ep_context_size,
   1979		u3d->ep_context, u3d->ep_context_dma);
   1980err_alloc_ep_context:
   1981err_phy_init:
   1982err_u3d_enable:
   1983	iounmap(u3d->cap_regs);
   1984err_map_cap_regs:
   1985err_get_cap_regs:
   1986	clk_put(u3d->clk);
   1987err_get_clk:
   1988	kfree(u3d);
   1989err_alloc_private:
   1990err_pdata:
   1991	return retval;
   1992}
   1993
   1994#ifdef CONFIG_PM_SLEEP
   1995static int mv_u3d_suspend(struct device *dev)
   1996{
   1997	struct mv_u3d *u3d = dev_get_drvdata(dev);
   1998
   1999	/*
   2000	 * only cable is unplugged, usb can suspend.
   2001	 * So do not care about clock_gating == 1, it is handled by
   2002	 * vbus session.
   2003	 */
   2004	if (!u3d->clock_gating) {
   2005		mv_u3d_controller_stop(u3d);
   2006
   2007		spin_lock_irq(&u3d->lock);
   2008		/* stop all usb activities */
   2009		mv_u3d_stop_activity(u3d, u3d->driver);
   2010		spin_unlock_irq(&u3d->lock);
   2011
   2012		mv_u3d_disable(u3d);
   2013	}
   2014
   2015	return 0;
   2016}
   2017
   2018static int mv_u3d_resume(struct device *dev)
   2019{
   2020	struct mv_u3d *u3d = dev_get_drvdata(dev);
   2021	int retval;
   2022
   2023	if (!u3d->clock_gating) {
   2024		retval = mv_u3d_enable(u3d);
   2025		if (retval)
   2026			return retval;
   2027
   2028		if (u3d->driver && u3d->softconnect) {
   2029			mv_u3d_controller_reset(u3d);
   2030			mv_u3d_ep0_reset(u3d);
   2031			mv_u3d_controller_start(u3d);
   2032		}
   2033	}
   2034
   2035	return 0;
   2036}
   2037#endif
   2038
   2039static SIMPLE_DEV_PM_OPS(mv_u3d_pm_ops, mv_u3d_suspend, mv_u3d_resume);
   2040
   2041static void mv_u3d_shutdown(struct platform_device *dev)
   2042{
   2043	struct mv_u3d *u3d = platform_get_drvdata(dev);
   2044	u32 tmp;
   2045
   2046	tmp = ioread32(&u3d->op_regs->usbcmd);
   2047	tmp &= ~MV_U3D_CMD_RUN_STOP;
   2048	iowrite32(tmp, &u3d->op_regs->usbcmd);
   2049}
   2050
   2051static struct platform_driver mv_u3d_driver = {
   2052	.probe		= mv_u3d_probe,
   2053	.remove		= mv_u3d_remove,
   2054	.shutdown	= mv_u3d_shutdown,
   2055	.driver		= {
   2056		.name	= "mv-u3d",
   2057		.pm	= &mv_u3d_pm_ops,
   2058	},
   2059};
   2060
   2061module_platform_driver(mv_u3d_driver);
   2062MODULE_ALIAS("platform:mv-u3d");
   2063MODULE_DESCRIPTION(DRIVER_DESC);
   2064MODULE_AUTHOR("Yu Xu <yuxu@marvell.com>");
   2065MODULE_LICENSE("GPL");