1/* ==========================================================================
2 * $File: //dwh/usb_iip/dev/software/otg/linux/drivers/dwc_otg_cil.c $
3 * $Revision: 1.7 $
4 * $Date: 2008-12-22 11:43:05 $
5 * $Change: 1117667 $
6 *
7 * Synopsys HS OTG Linux Software Driver and documentation (hereinafter,
8 * "Software") is an Unsupported proprietary work of Synopsys, Inc. unless
9 * otherwise expressly agreed to in writing between Synopsys and you.
10 *
11 * The Software IS NOT an item of Licensed Software or Licensed Product under
12 * any End User Software License Agreement or Agreement for Licensed Product
13 * with Synopsys or any supplement thereto. You are permitted to use and
14 * redistribute this Software in source and binary forms, with or without
15 * modification, provided that redistributions of source code must retain this
16 * notice. You may not view, use, disclose, copy or distribute this file or
17 * any information contained herein except pursuant to this license grant from
18 * Synopsys. If you do not agree with this notice, including the disclaimer
19 * below, then you are not authorized to use the Software.
20 *
21 * THIS SOFTWARE IS BEING DISTRIBUTED BY SYNOPSYS SOLELY ON AN "AS IS" BASIS
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE HEREBY DISCLAIMED. IN NO EVENT SHALL SYNOPSYS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
31 * DAMAGE.
32 * ========================================================================== */
33
34/** @file
35 *
36 * The Core Interface Layer provides basic services for accessing and
37 * managing the DWC_otg hardware. These services are used by both the
38 * Host Controller Driver and the Peripheral Controller Driver.
39 *
40 * The CIL manages the memory map for the core so that the HCD and PCD
41 * don't have to do this separately. It also handles basic tasks like
42 * reading/writing the registers and data FIFOs in the controller.
43 * Some of the data access functions provide encapsulation of several
44 * operations required to perform a task, such as writing multiple
45 * registers to start a transfer. Finally, the CIL performs basic
46 * services that are not specific to either the host or device modes
47 * of operation. These services include management of the OTG Host
48 * Negotiation Protocol (HNP) and Session Request Protocol (SRP). A
49 * Diagnostic API is also provided to allow testing of the controller
50 * hardware.
51 *
52 * The Core Interface Layer has the following requirements:
53 * - Provides basic controller operations.
54 * - Minimal use of OS services.
55 * - The OS services used will be abstracted by using inline functions
56 *	 or macros.
57 *
58 */
59#include <asm/unaligned.h>
60#include <linux/dma-mapping.h>
61#ifdef DEBUG
62#include <linux/jiffies.h>
63#endif
64
65#include "linux/dwc_otg_plat.h"
66#include "dwc_otg_regs.h"
67#include "dwc_otg_cil.h"
68
69/* Included only to access hc->qh for non-dword buffer handling
70 * TODO: account it
71 */
72#include "dwc_otg_hcd.h"
73
74/**
75 * This function is called to initialize the DWC_otg CSR data
76 * structures.	The register addresses in the device and host
77 * structures are initialized from the base address supplied by the
78 * caller.	The calling function must make the OS calls to get the
79 * base address of the DWC_otg controller registers.  The core_params
80 * argument holds the parameters that specify how the core should be
81 * configured.
82 *
83 * @param[in] reg_base_addr Base address of DWC_otg core registers
84 * @param[in] core_params Pointer to the core configuration parameters
85 *
86 */
87dwc_otg_core_if_t *dwc_otg_cil_init(const uint32_t *reg_base_addr,
88					dwc_otg_core_params_t *core_params)
89{
90	dwc_otg_core_if_t *core_if = 0;
91	dwc_otg_dev_if_t *dev_if = 0;
92	dwc_otg_host_if_t *host_if = 0;
93	uint8_t *reg_base = (uint8_t *)reg_base_addr;
94	int i = 0;
95
96	DWC_DEBUGPL(DBG_CILV, "%s(%p,%p)\n", __func__, reg_base_addr, core_params);
97
98	core_if = kmalloc(sizeof(dwc_otg_core_if_t), GFP_KERNEL);
99
100	if (core_if == 0) {
101		DWC_DEBUGPL(DBG_CIL, "Allocation of dwc_otg_core_if_t failed\n");
102		return 0;
103	}
104
105	memset(core_if, 0, sizeof(dwc_otg_core_if_t));
106
107	core_if->core_params = core_params;
108	core_if->core_global_regs = (dwc_otg_core_global_regs_t *)reg_base;
109
110	/*
111	 * Allocate the Device Mode structures.
112	 */
113	dev_if = kmalloc(sizeof(dwc_otg_dev_if_t), GFP_KERNEL);
114
115	if (dev_if == 0) {
116		DWC_DEBUGPL(DBG_CIL, "Allocation of dwc_otg_dev_if_t failed\n");
117		kfree(core_if);
118		return 0;
119	}
120
121	dev_if->dev_global_regs =
122			(dwc_otg_device_global_regs_t *)(reg_base + DWC_DEV_GLOBAL_REG_OFFSET);
123
124	for (i=0; i<MAX_EPS_CHANNELS; i++)
125	{
126		dev_if->in_ep_regs[i] = (dwc_otg_dev_in_ep_regs_t *)
127				(reg_base + DWC_DEV_IN_EP_REG_OFFSET +
128				 (i * DWC_EP_REG_OFFSET));
129
130		dev_if->out_ep_regs[i] = (dwc_otg_dev_out_ep_regs_t *)
131				(reg_base + DWC_DEV_OUT_EP_REG_OFFSET +
132				 (i * DWC_EP_REG_OFFSET));
133		DWC_DEBUGPL(DBG_CILV, "in_ep_regs[%d]->diepctl=%p\n",
134					i, &dev_if->in_ep_regs[i]->diepctl);
135		DWC_DEBUGPL(DBG_CILV, "out_ep_regs[%d]->doepctl=%p\n",
136					i, &dev_if->out_ep_regs[i]->doepctl);
137	}
138
139	dev_if->speed = 0; // unknown
140
141	core_if->dev_if = dev_if;
142
143	/*
144	 * Allocate the Host Mode structures.
145	 */
146	host_if = kmalloc(sizeof(dwc_otg_host_if_t), GFP_KERNEL);
147
148	if (host_if == 0) {
149		DWC_DEBUGPL(DBG_CIL, "Allocation of dwc_otg_host_if_t failed\n");
150		kfree(dev_if);
151		kfree(core_if);
152		return 0;
153	}
154
155	host_if->host_global_regs = (dwc_otg_host_global_regs_t *)
156			(reg_base + DWC_OTG_HOST_GLOBAL_REG_OFFSET);
157
158	host_if->hprt0 = (uint32_t*)(reg_base + DWC_OTG_HOST_PORT_REGS_OFFSET);
159
160	for (i=0; i<MAX_EPS_CHANNELS; i++)
161	{
162		host_if->hc_regs[i] = (dwc_otg_hc_regs_t *)
163				(reg_base + DWC_OTG_HOST_CHAN_REGS_OFFSET +
164				 (i * DWC_OTG_CHAN_REGS_OFFSET));
165		DWC_DEBUGPL(DBG_CILV, "hc_reg[%d]->hcchar=%p\n",
166					i, &host_if->hc_regs[i]->hcchar);
167	}
168
169	host_if->num_host_channels = MAX_EPS_CHANNELS;
170	core_if->host_if = host_if;
171
172	for (i=0; i<MAX_EPS_CHANNELS; i++)
173	{
174		core_if->data_fifo[i] =
175				(uint32_t *)(reg_base + DWC_OTG_DATA_FIFO_OFFSET +
176							 (i * DWC_OTG_DATA_FIFO_SIZE));
177		DWC_DEBUGPL(DBG_CILV, "data_fifo[%d]=0x%08x\n",
178					i, (unsigned)core_if->data_fifo[i]);
179	}
180
181	core_if->pcgcctl = (uint32_t*)(reg_base + DWC_OTG_PCGCCTL_OFFSET);
182
183	/*
184	 * Store the contents of the hardware configuration registers here for
185	 * easy access later.
186	 */
187	core_if->hwcfg1.d32 = dwc_read_reg32(&core_if->core_global_regs->ghwcfg1);
188	core_if->hwcfg2.d32 = dwc_read_reg32(&core_if->core_global_regs->ghwcfg2);
189	core_if->hwcfg3.d32 = dwc_read_reg32(&core_if->core_global_regs->ghwcfg3);
190	core_if->hwcfg4.d32 = dwc_read_reg32(&core_if->core_global_regs->ghwcfg4);
191
192	DWC_DEBUGPL(DBG_CILV,"hwcfg1=%08x\n",core_if->hwcfg1.d32);
193	DWC_DEBUGPL(DBG_CILV,"hwcfg2=%08x\n",core_if->hwcfg2.d32);
194	DWC_DEBUGPL(DBG_CILV,"hwcfg3=%08x\n",core_if->hwcfg3.d32);
195	DWC_DEBUGPL(DBG_CILV,"hwcfg4=%08x\n",core_if->hwcfg4.d32);
196
197	core_if->hcfg.d32 = dwc_read_reg32(&core_if->host_if->host_global_regs->hcfg);
198	core_if->dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg);
199
200	DWC_DEBUGPL(DBG_CILV,"hcfg=%08x\n",core_if->hcfg.d32);
201	DWC_DEBUGPL(DBG_CILV,"dcfg=%08x\n",core_if->dcfg.d32);
202
203	DWC_DEBUGPL(DBG_CILV,"op_mode=%0x\n",core_if->hwcfg2.b.op_mode);
204	DWC_DEBUGPL(DBG_CILV,"arch=%0x\n",core_if->hwcfg2.b.architecture);
205	DWC_DEBUGPL(DBG_CILV,"num_dev_ep=%d\n",core_if->hwcfg2.b.num_dev_ep);
206	DWC_DEBUGPL(DBG_CILV,"num_host_chan=%d\n",core_if->hwcfg2.b.num_host_chan);
207	DWC_DEBUGPL(DBG_CILV,"nonperio_tx_q_depth=0x%0x\n",core_if->hwcfg2.b.nonperio_tx_q_depth);
208	DWC_DEBUGPL(DBG_CILV,"host_perio_tx_q_depth=0x%0x\n",core_if->hwcfg2.b.host_perio_tx_q_depth);
209	DWC_DEBUGPL(DBG_CILV,"dev_token_q_depth=0x%0x\n",core_if->hwcfg2.b.dev_token_q_depth);
210
211	DWC_DEBUGPL(DBG_CILV,"Total FIFO SZ=%d\n", core_if->hwcfg3.b.dfifo_depth);
212	DWC_DEBUGPL(DBG_CILV,"xfer_size_cntr_width=%0x\n", core_if->hwcfg3.b.xfer_size_cntr_width);
213
214	/*
215	 * Set the SRP sucess bit for FS-I2c
216	 */
217	core_if->srp_success = 0;
218	core_if->srp_timer_started = 0;
219
220
221	/*
222	 * Create new workqueue and init works
223	 */
224	core_if->wq_otg = create_singlethread_workqueue("dwc_otg");
225	if(core_if->wq_otg == 0) {
226		DWC_DEBUGPL(DBG_CIL, "Creation of wq_otg failed\n");
227		kfree(host_if);
228		kfree(dev_if);
229		kfree(core_if);
230		return 0 * HZ;
231	}
232
233
234
235#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
236
237	INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change, core_if);
238	INIT_WORK(&core_if->w_wkp, w_wakeup_detected, core_if);
239
240#else
241
242	INIT_WORK(&core_if->w_conn_id, w_conn_id_status_change);
243	INIT_DELAYED_WORK(&core_if->w_wkp, w_wakeup_detected);
244
245#endif
246	return core_if;
247}
248
249/**
250 * This function frees the structures allocated by dwc_otg_cil_init().
251 *
252 * @param[in] core_if The core interface pointer returned from
253 * dwc_otg_cil_init().
254 *
255 */
256void dwc_otg_cil_remove(dwc_otg_core_if_t *core_if)
257{
258	/* Disable all interrupts */
259	dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, 1, 0);
260	dwc_write_reg32(&core_if->core_global_regs->gintmsk, 0);
261
262	if (core_if->wq_otg) {
263		destroy_workqueue(core_if->wq_otg);
264	}
265	if (core_if->dev_if) {
266		kfree(core_if->dev_if);
267	}
268	if (core_if->host_if) {
269		kfree(core_if->host_if);
270	}
271	kfree(core_if);
272}
273
274/**
275 * This function enables the controller's Global Interrupt in the AHB Config
276 * register.
277 *
278 * @param[in] core_if Programming view of DWC_otg controller.
279 */
280void dwc_otg_enable_global_interrupts(dwc_otg_core_if_t *core_if)
281{
282	gahbcfg_data_t ahbcfg = { .d32 = 0};
283	ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
284	dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, 0, ahbcfg.d32);
285}
286
287/**
288 * This function disables the controller's Global Interrupt in the AHB Config
289 * register.
290 *
291 * @param[in] core_if Programming view of DWC_otg controller.
292 */
293void dwc_otg_disable_global_interrupts(dwc_otg_core_if_t *core_if)
294{
295	gahbcfg_data_t ahbcfg = { .d32 = 0};
296	ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */
297	dwc_modify_reg32(&core_if->core_global_regs->gahbcfg, ahbcfg.d32, 0);
298}
299
300/**
301 * This function initializes the commmon interrupts, used in both
302 * device and host modes.
303 *
304 * @param[in] core_if Programming view of the DWC_otg controller
305 *
306 */
307static void dwc_otg_enable_common_interrupts(dwc_otg_core_if_t *core_if)
308{
309	dwc_otg_core_global_regs_t *global_regs =
310			core_if->core_global_regs;
311	gintmsk_data_t intr_mask = { .d32 = 0};
312
313	/* Clear any pending OTG Interrupts */
314	dwc_write_reg32(&global_regs->gotgint, 0xFFFFFFFF);
315
316	/* Clear any pending interrupts */
317	dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF);
318
319	/*
320	 * Enable the interrupts in the GINTMSK.
321	 */
322	intr_mask.b.modemismatch = 1;
323	intr_mask.b.otgintr = 1;
324
325	if (!core_if->dma_enable) {
326		intr_mask.b.rxstsqlvl = 1;
327	}
328
329	intr_mask.b.conidstschng = 1;
330	intr_mask.b.wkupintr = 1;
331	intr_mask.b.disconnect = 1;
332	intr_mask.b.usbsuspend = 1;
333	intr_mask.b.sessreqintr = 1;
334	dwc_write_reg32(&global_regs->gintmsk, intr_mask.d32);
335}
336
337/**
338 * Initializes the FSLSPClkSel field of the HCFG register depending on the PHY
339 * type.
340 */
341static void init_fslspclksel(dwc_otg_core_if_t *core_if)
342{
343	uint32_t	val;
344	hcfg_data_t		hcfg;
345
346	if (((core_if->hwcfg2.b.hs_phy_type == 2) &&
347		 (core_if->hwcfg2.b.fs_phy_type == 1) &&
348		 (core_if->core_params->ulpi_fs_ls)) ||
349		(core_if->core_params->phy_type == DWC_PHY_TYPE_PARAM_FS)) {
350		/* Full speed PHY */
351		val = DWC_HCFG_48_MHZ;
352	}
353	else {
354		/* High speed PHY running at full speed or high speed */
355		val = DWC_HCFG_30_60_MHZ;
356	}
357
358	DWC_DEBUGPL(DBG_CIL, "Initializing HCFG.FSLSPClkSel to 0x%1x\n", val);
359	hcfg.d32 = dwc_read_reg32(&core_if->host_if->host_global_regs->hcfg);
360	hcfg.b.fslspclksel = val;
361	dwc_write_reg32(&core_if->host_if->host_global_regs->hcfg, hcfg.d32);
362}
363
364/**
365 * Initializes the DevSpd field of the DCFG register depending on the PHY type
366 * and the enumeration speed of the device.
367 */
368static void init_devspd(dwc_otg_core_if_t *core_if)
369{
370	uint32_t	val;
371	dcfg_data_t		dcfg;
372
373	if (((core_if->hwcfg2.b.hs_phy_type == 2) &&
374		 (core_if->hwcfg2.b.fs_phy_type == 1) &&
375		 (core_if->core_params->ulpi_fs_ls)) ||
376		(core_if->core_params->phy_type == DWC_PHY_TYPE_PARAM_FS)) {
377		/* Full speed PHY */
378		val = 0x3;
379	}
380	else if (core_if->core_params->speed == DWC_SPEED_PARAM_FULL) {
381		/* High speed PHY running at full speed */
382		val = 0x1;
383	}
384	else {
385		/* High speed PHY running at high speed */
386		val = 0x0;
387	}
388
389	DWC_DEBUGPL(DBG_CIL, "Initializing DCFG.DevSpd to 0x%1x\n", val);
390
391	dcfg.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dcfg);
392	dcfg.b.devspd = val;
393	dwc_write_reg32(&core_if->dev_if->dev_global_regs->dcfg, dcfg.d32);
394}
395
396/**
397 * This function calculates the number of IN EPS
398 * using GHWCFG1 and GHWCFG2 registers values
399 *
400 * @param core_if Programming view of the DWC_otg controller
401 */
402static uint32_t calc_num_in_eps(dwc_otg_core_if_t *core_if)
403{
404	uint32_t num_in_eps = 0;
405	uint32_t num_eps = core_if->hwcfg2.b.num_dev_ep;
406	uint32_t hwcfg1 = core_if->hwcfg1.d32 >> 3;
407	uint32_t num_tx_fifos = core_if->hwcfg4.b.num_in_eps;
408	int i;
409
410
411	for(i = 0; i < num_eps; ++i)
412	{
413		if(!(hwcfg1 & 0x1))
414			num_in_eps++;
415
416		hwcfg1 >>= 2;
417	}
418
419	if(core_if->hwcfg4.b.ded_fifo_en) {
420		num_in_eps = (num_in_eps > num_tx_fifos) ? num_tx_fifos : num_in_eps;
421	}
422
423	return num_in_eps;
424}
425
426
427/**
428 * This function calculates the number of OUT EPS
429 * using GHWCFG1 and GHWCFG2 registers values
430 *
431 * @param core_if Programming view of the DWC_otg controller
432 */
433static uint32_t calc_num_out_eps(dwc_otg_core_if_t *core_if)
434{
435	uint32_t num_out_eps = 0;
436	uint32_t num_eps = core_if->hwcfg2.b.num_dev_ep;
437	uint32_t hwcfg1 = core_if->hwcfg1.d32 >> 2;
438	int i;
439
440	for(i = 0; i < num_eps; ++i)
441	{
442		if(!(hwcfg1 & 0x2))
443			num_out_eps++;
444
445		hwcfg1 >>= 2;
446	}
447	return num_out_eps;
448}
449/**
450 * This function initializes the DWC_otg controller registers and
451 * prepares the core for device mode or host mode operation.
452 *
453 * @param core_if Programming view of the DWC_otg controller
454 *
455 */
456void dwc_otg_core_init(dwc_otg_core_if_t *core_if)
457{
458	int i = 0;
459	dwc_otg_core_global_regs_t *global_regs =
460			core_if->core_global_regs;
461	dwc_otg_dev_if_t *dev_if = core_if->dev_if;
462	gahbcfg_data_t ahbcfg = { .d32 = 0 };
463	gusbcfg_data_t usbcfg = { .d32 = 0 };
464	gi2cctl_data_t i2cctl = { .d32 = 0 };
465
466	DWC_DEBUGPL(DBG_CILV, "dwc_otg_core_init(%p)\n", core_if);
467
468	/* Common Initialization */
469
470	usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
471
472//	usbcfg.b.tx_end_delay = 1;
473	/* Program the ULPI External VBUS bit if needed */
474	usbcfg.b.ulpi_ext_vbus_drv =
475		(core_if->core_params->phy_ulpi_ext_vbus == DWC_PHY_ULPI_EXTERNAL_VBUS) ? 1 : 0;
476
477	/* Set external TS Dline pulsing */
478	usbcfg.b.term_sel_dl_pulse = (core_if->core_params->ts_dline == 1) ? 1 : 0;
479	dwc_write_reg32 (&global_regs->gusbcfg, usbcfg.d32);
480
481
482	/* Reset the Controller */
483	dwc_otg_core_reset(core_if);
484
485	/* Initialize parameters from Hardware configuration registers. */
486	dev_if->num_in_eps = calc_num_in_eps(core_if);
487	dev_if->num_out_eps = calc_num_out_eps(core_if);
488
489
490	DWC_DEBUGPL(DBG_CIL, "num_dev_perio_in_ep=%d\n", core_if->hwcfg4.b.num_dev_perio_in_ep);
491
492	for (i=0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
493	{
494		dev_if->perio_tx_fifo_size[i] =
495			dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]) >> 16;
496		DWC_DEBUGPL(DBG_CIL, "Periodic Tx FIFO SZ #%d=0x%0x\n",
497				i, dev_if->perio_tx_fifo_size[i]);
498	}
499
500	for (i=0; i < core_if->hwcfg4.b.num_in_eps; i++)
501	{
502		dev_if->tx_fifo_size[i] =
503			dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]) >> 16;
504		DWC_DEBUGPL(DBG_CIL, "Tx FIFO SZ #%d=0x%0x\n",
505			i, dev_if->perio_tx_fifo_size[i]);
506	}
507
508	core_if->total_fifo_size = core_if->hwcfg3.b.dfifo_depth;
509	core_if->rx_fifo_size =
510			dwc_read_reg32(&global_regs->grxfsiz);
511	core_if->nperio_tx_fifo_size =
512			dwc_read_reg32(&global_regs->gnptxfsiz) >> 16;
513
514	DWC_DEBUGPL(DBG_CIL, "Total FIFO SZ=%d\n", core_if->total_fifo_size);
515	DWC_DEBUGPL(DBG_CIL, "Rx FIFO SZ=%d\n", core_if->rx_fifo_size);
516	DWC_DEBUGPL(DBG_CIL, "NP Tx FIFO SZ=%d\n", core_if->nperio_tx_fifo_size);
517
518	/* This programming sequence needs to happen in FS mode before any other
519	 * programming occurs */
520	if ((core_if->core_params->speed == DWC_SPEED_PARAM_FULL) &&
521		(core_if->core_params->phy_type == DWC_PHY_TYPE_PARAM_FS)) {
522			/* If FS mode with FS PHY */
523
524			/* core_init() is now called on every switch so only call the
525			 * following for the first time through. */
526			if (!core_if->phy_init_done) {
527				core_if->phy_init_done = 1;
528				DWC_DEBUGPL(DBG_CIL, "FS_PHY detected\n");
529				usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
530				usbcfg.b.physel = 1;
531				dwc_write_reg32 (&global_regs->gusbcfg, usbcfg.d32);
532
533				/* Reset after a PHY select */
534				dwc_otg_core_reset(core_if);
535			}
536
537			/* Program DCFG.DevSpd or HCFG.FSLSPclkSel to 48Mhz in FS.	Also
538			 * do this on HNP Dev/Host mode switches (done in dev_init and
539			 * host_init). */
540			if (dwc_otg_is_host_mode(core_if)) {
541				init_fslspclksel(core_if);
542			}
543			else {
544				init_devspd(core_if);
545			}
546
547			if (core_if->core_params->i2c_enable) {
548				DWC_DEBUGPL(DBG_CIL, "FS_PHY Enabling I2c\n");
549				/* Program GUSBCFG.OtgUtmifsSel to I2C */
550				usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
551				usbcfg.b.otgutmifssel = 1;
552				dwc_write_reg32 (&global_regs->gusbcfg, usbcfg.d32);
553
554				/* Program GI2CCTL.I2CEn */
555				i2cctl.d32 = dwc_read_reg32(&global_regs->gi2cctl);
556				i2cctl.b.i2cdevaddr = 1;
557				i2cctl.b.i2cen = 0;
558				dwc_write_reg32 (&global_regs->gi2cctl, i2cctl.d32);
559				i2cctl.b.i2cen = 1;
560				dwc_write_reg32 (&global_regs->gi2cctl, i2cctl.d32);
561			}
562
563		} /* endif speed == DWC_SPEED_PARAM_FULL */
564
565		else {
566			/* High speed PHY. */
567			if (!core_if->phy_init_done) {
568				core_if->phy_init_done = 1;
569				/* HS PHY parameters.  These parameters are preserved
570				 * during soft reset so only program the first time.  Do
571				 * a soft reset immediately after setting phyif.  */
572				usbcfg.b.ulpi_utmi_sel = core_if->core_params->phy_type;
573				if (usbcfg.b.ulpi_utmi_sel == 1) {
574					/* ULPI interface */
575					usbcfg.b.phyif = 0;
576					usbcfg.b.ddrsel = core_if->core_params->phy_ulpi_ddr;
577				}
578				else {
579					/* UTMI+ interface */
580					if (core_if->core_params->phy_utmi_width == 16) {
581						usbcfg.b.phyif = 1;
582				}
583				else {
584					usbcfg.b.phyif = 0;
585				}
586			}
587
588			dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32);
589
590			/* Reset after setting the PHY parameters */
591			dwc_otg_core_reset(core_if);
592		}
593	}
594
595	if ((core_if->hwcfg2.b.hs_phy_type == 2) &&
596		(core_if->hwcfg2.b.fs_phy_type == 1) &&
597		(core_if->core_params->ulpi_fs_ls)) {
598		DWC_DEBUGPL(DBG_CIL, "Setting ULPI FSLS\n");
599		usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
600		usbcfg.b.ulpi_fsls = 1;
601		usbcfg.b.ulpi_clk_sus_m = 1;
602		dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32);
603	}
604	else {
605		usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
606		usbcfg.b.ulpi_fsls = 0;
607		usbcfg.b.ulpi_clk_sus_m = 0;
608		dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32);
609	}
610
611	/* Program the GAHBCFG Register.*/
612	switch (core_if->hwcfg2.b.architecture) {
613
614	case DWC_SLAVE_ONLY_ARCH:
615		DWC_DEBUGPL(DBG_CIL, "Slave Only Mode\n");
616		ahbcfg.b.nptxfemplvl_txfemplvl = DWC_GAHBCFG_TXFEMPTYLVL_HALFEMPTY;
617		ahbcfg.b.ptxfemplvl = DWC_GAHBCFG_TXFEMPTYLVL_HALFEMPTY;
618		core_if->dma_enable = 0;
619		core_if->dma_desc_enable = 0;
620		break;
621
622	case DWC_EXT_DMA_ARCH:
623		DWC_DEBUGPL(DBG_CIL, "External DMA Mode\n");
624		ahbcfg.b.hburstlen = core_if->core_params->dma_burst_size;
625		core_if->dma_enable = (core_if->core_params->dma_enable != 0);
626		core_if->dma_desc_enable = (core_if->core_params->dma_desc_enable != 0);
627		break;
628
629	case DWC_INT_DMA_ARCH:
630		DWC_DEBUGPL(DBG_CIL, "Internal DMA Mode\n");
631		ahbcfg.b.hburstlen = DWC_GAHBCFG_INT_DMA_BURST_INCR;
632		core_if->dma_enable = (core_if->core_params->dma_enable != 0);
633		core_if->dma_desc_enable = (core_if->core_params->dma_desc_enable != 0);
634		break;
635
636	}
637	ahbcfg.b.dmaenable = core_if->dma_enable;
638	dwc_write_reg32(&global_regs->gahbcfg, ahbcfg.d32);
639
640	core_if->en_multiple_tx_fifo = core_if->hwcfg4.b.ded_fifo_en;
641
642	core_if->pti_enh_enable = core_if->core_params->pti_enable != 0;
643	core_if->multiproc_int_enable = core_if->core_params->mpi_enable;
644	DWC_PRINT("Periodic Transfer Interrupt Enhancement - %s\n", ((core_if->pti_enh_enable) ? "enabled": "disabled"));
645	DWC_PRINT("Multiprocessor Interrupt Enhancement - %s\n", ((core_if->multiproc_int_enable) ? "enabled": "disabled"));
646
647	/*
648	 * Program the GUSBCFG register.
649	 */
650	usbcfg.d32 = dwc_read_reg32(&global_regs->gusbcfg);
651
652	switch (core_if->hwcfg2.b.op_mode) {
653	case DWC_MODE_HNP_SRP_CAPABLE:
654		usbcfg.b.hnpcap = (core_if->core_params->otg_cap ==
655		   DWC_OTG_CAP_PARAM_HNP_SRP_CAPABLE);
656		usbcfg.b.srpcap = (core_if->core_params->otg_cap !=
657		   DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE);
658		break;
659
660	case DWC_MODE_SRP_ONLY_CAPABLE:
661		usbcfg.b.hnpcap = 0;
662		usbcfg.b.srpcap = (core_if->core_params->otg_cap !=
663		   DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE);
664		break;
665
666	case DWC_MODE_NO_HNP_SRP_CAPABLE:
667		usbcfg.b.hnpcap = 0;
668		usbcfg.b.srpcap = 0;
669		break;
670
671	case DWC_MODE_SRP_CAPABLE_DEVICE:
672		usbcfg.b.hnpcap = 0;
673		usbcfg.b.srpcap = (core_if->core_params->otg_cap !=
674		DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE);
675		break;
676
677	case DWC_MODE_NO_SRP_CAPABLE_DEVICE:
678		usbcfg.b.hnpcap = 0;
679		usbcfg.b.srpcap = 0;
680		break;
681
682	case DWC_MODE_SRP_CAPABLE_HOST:
683		usbcfg.b.hnpcap = 0;
684		usbcfg.b.srpcap = (core_if->core_params->otg_cap !=
685		DWC_OTG_CAP_PARAM_NO_HNP_SRP_CAPABLE);
686		break;
687
688	case DWC_MODE_NO_SRP_CAPABLE_HOST:
689		usbcfg.b.hnpcap = 0;
690		usbcfg.b.srpcap = 0;
691		break;
692	}
693
694	dwc_write_reg32(&global_regs->gusbcfg, usbcfg.d32);
695
696	/* Enable common interrupts */
697	dwc_otg_enable_common_interrupts(core_if);
698
699	/* Do device or host intialization based on mode during PCD
700	 * and HCD initialization  */
701	if (dwc_otg_is_host_mode(core_if)) {
702		DWC_DEBUGPL(DBG_ANY, "Host Mode\n");
703		core_if->op_state = A_HOST;
704	}
705	else {
706		DWC_DEBUGPL(DBG_ANY, "Device Mode\n");
707		core_if->op_state = B_PERIPHERAL;
708#ifdef DWC_DEVICE_ONLY
709		dwc_otg_core_dev_init(core_if);
710#endif
711	}
712}
713
714
715/**
716 * This function enables the Device mode interrupts.
717 *
718 * @param core_if Programming view of DWC_otg controller
719 */
720void dwc_otg_enable_device_interrupts(dwc_otg_core_if_t *core_if)
721{
722	gintmsk_data_t intr_mask = { .d32 = 0};
723	dwc_otg_core_global_regs_t *global_regs =
724		core_if->core_global_regs;
725
726	DWC_DEBUGPL(DBG_CIL, "%s()\n", __func__);
727
728	/* Disable all interrupts. */
729	dwc_write_reg32(&global_regs->gintmsk, 0);
730
731	/* Clear any pending interrupts */
732	dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF);
733
734	/* Enable the common interrupts */
735	dwc_otg_enable_common_interrupts(core_if);
736
737	/* Enable interrupts */
738	intr_mask.b.usbreset = 1;
739	intr_mask.b.enumdone = 1;
740
741	if(!core_if->multiproc_int_enable) {
742		intr_mask.b.inepintr = 1;
743		intr_mask.b.outepintr = 1;
744	}
745
746	intr_mask.b.erlysuspend = 1;
747
748	if(core_if->en_multiple_tx_fifo == 0) {
749		intr_mask.b.epmismatch = 1;
750	}
751
752
753#ifdef DWC_EN_ISOC
754	if(core_if->dma_enable) {
755		if(core_if->dma_desc_enable == 0) {
756			if(core_if->pti_enh_enable) {
757				dctl_data_t dctl = { .d32 = 0 };
758				dctl.b.ifrmnum = 1;
759				dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dctl, 0, dctl.d32);
760			} else {
761				intr_mask.b.incomplisoin = 1;
762				intr_mask.b.incomplisoout = 1;
763			}
764		}
765	} else {
766		intr_mask.b.incomplisoin = 1;
767		intr_mask.b.incomplisoout = 1;
768	}
769#endif // DWC_EN_ISOC
770
771/** @todo NGS: Should this be a module parameter? */
772#ifdef USE_PERIODIC_EP
773	intr_mask.b.isooutdrop = 1;
774	intr_mask.b.eopframe = 1;
775	intr_mask.b.incomplisoin = 1;
776	intr_mask.b.incomplisoout = 1;
777#endif
778
779	dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32);
780
781	DWC_DEBUGPL(DBG_CIL, "%s() gintmsk=%0x\n", __func__,
782		dwc_read_reg32(&global_regs->gintmsk));
783}
784
785/**
786 * This function initializes the DWC_otg controller registers for
787 * device mode.
788 *
789 * @param core_if Programming view of DWC_otg controller
790 *
791 */
792void dwc_otg_core_dev_init(dwc_otg_core_if_t *core_if)
793{
794	int i;
795	dwc_otg_core_global_regs_t *global_regs =
796		core_if->core_global_regs;
797	dwc_otg_dev_if_t *dev_if = core_if->dev_if;
798	dwc_otg_core_params_t *params = core_if->core_params;
799	dcfg_data_t dcfg = { .d32 = 0};
800	grstctl_t resetctl = { .d32 = 0 };
801	uint32_t rx_fifo_size;
802	fifosize_data_t nptxfifosize;
803	fifosize_data_t txfifosize;
804	dthrctl_data_t dthrctl;
805	fifosize_data_t ptxfifosize;
806
807	/* Restart the Phy Clock */
808	dwc_write_reg32(core_if->pcgcctl, 0);
809
810	/* Device configuration register */
811	init_devspd(core_if);
812	dcfg.d32 = dwc_read_reg32(&dev_if->dev_global_regs->dcfg);
813	dcfg.b.descdma = (core_if->dma_desc_enable) ? 1 : 0;
814	dcfg.b.perfrint = DWC_DCFG_FRAME_INTERVAL_80;
815
816	dwc_write_reg32(&dev_if->dev_global_regs->dcfg, dcfg.d32);
817
818	/* Configure data FIFO sizes */
819	if (core_if->hwcfg2.b.dynamic_fifo && params->enable_dynamic_fifo) {
820		DWC_DEBUGPL(DBG_CIL, "Total FIFO Size=%d\n", core_if->total_fifo_size);
821		DWC_DEBUGPL(DBG_CIL, "Rx FIFO Size=%d\n", params->dev_rx_fifo_size);
822		DWC_DEBUGPL(DBG_CIL, "NP Tx FIFO Size=%d\n", params->dev_nperio_tx_fifo_size);
823
824		/* Rx FIFO */
825		DWC_DEBUGPL(DBG_CIL, "initial grxfsiz=%08x\n",
826						dwc_read_reg32(&global_regs->grxfsiz));
827
828		rx_fifo_size = params->dev_rx_fifo_size;
829		dwc_write_reg32(&global_regs->grxfsiz, rx_fifo_size);
830
831		DWC_DEBUGPL(DBG_CIL, "new grxfsiz=%08x\n",
832			dwc_read_reg32(&global_regs->grxfsiz));
833
834		/** Set Periodic Tx FIFO Mask all bits 0 */
835		core_if->p_tx_msk = 0;
836
837		/** Set Tx FIFO Mask all bits 0 */
838		core_if->tx_msk = 0;
839
840		if(core_if->en_multiple_tx_fifo == 0) {
841			/* Non-periodic Tx FIFO */
842			DWC_DEBUGPL(DBG_CIL, "initial gnptxfsiz=%08x\n",
843						   dwc_read_reg32(&global_regs->gnptxfsiz));
844
845			nptxfifosize.b.depth  = params->dev_nperio_tx_fifo_size;
846			nptxfifosize.b.startaddr = params->dev_rx_fifo_size;
847
848			dwc_write_reg32(&global_regs->gnptxfsiz, nptxfifosize.d32);
849
850			DWC_DEBUGPL(DBG_CIL, "new gnptxfsiz=%08x\n",
851						   dwc_read_reg32(&global_regs->gnptxfsiz));
852
853			/**@todo NGS: Fix Periodic FIFO Sizing! */
854			/*
855			 * Periodic Tx FIFOs These FIFOs are numbered from 1 to 15.
856			 * Indexes of the FIFO size module parameters in the
857			 * dev_perio_tx_fifo_size array and the FIFO size registers in
858			 * the dptxfsiz array run from 0 to 14.
859			 */
860			/** @todo Finish debug of this */
861			ptxfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;
862			for (i=0; i < core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
863			{
864				ptxfifosize.b.depth = params->dev_perio_tx_fifo_size[i];
865				DWC_DEBUGPL(DBG_CIL, "initial dptxfsiz_dieptxf[%d]=%08x\n", i,
866							dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]));
867				dwc_write_reg32(&global_regs->dptxfsiz_dieptxf[i],
868								 ptxfifosize.d32);
869				DWC_DEBUGPL(DBG_CIL, "new dptxfsiz_dieptxf[%d]=%08x\n", i,
870							dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]));
871				ptxfifosize.b.startaddr += ptxfifosize.b.depth;
872			}
873		}
874		else {
875			/*
876			 * Tx FIFOs These FIFOs are numbered from 1 to 15.
877			 * Indexes of the FIFO size module parameters in the
878			 * dev_tx_fifo_size array and the FIFO size registers in
879			 * the dptxfsiz_dieptxf array run from 0 to 14.
880			 */
881
882
883			/* Non-periodic Tx FIFO */
884			DWC_DEBUGPL(DBG_CIL, "initial gnptxfsiz=%08x\n",
885							dwc_read_reg32(&global_regs->gnptxfsiz));
886
887			nptxfifosize.b.depth  = params->dev_nperio_tx_fifo_size;
888			nptxfifosize.b.startaddr = params->dev_rx_fifo_size;
889
890			dwc_write_reg32(&global_regs->gnptxfsiz, nptxfifosize.d32);
891
892			DWC_DEBUGPL(DBG_CIL, "new gnptxfsiz=%08x\n",
893							dwc_read_reg32(&global_regs->gnptxfsiz));
894
895			txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;
896			/*
897			     Modify by kaiker ,for RT3052 device mode config
898
899			     In RT3052,Since the _core_if->hwcfg4.b.num_dev_perio_in_ep is
900			     configed to 0 so these TX_FIF0 not config.IN EP will can't
901			     more than 1 if not modify it.
902
903			*/
904#if 1
905			for (i=1 ; i <= dev_if->num_in_eps; i++)
906#else
907			for (i=1; i < _core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
908#endif
909			{
910
911				txfifosize.b.depth = params->dev_tx_fifo_size[i];
912
913				DWC_DEBUGPL(DBG_CIL, "initial dptxfsiz_dieptxf[%d]=%08x\n", i,
914					dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i]));
915
916				dwc_write_reg32(&global_regs->dptxfsiz_dieptxf[i-1],
917					txfifosize.d32);
918
919				DWC_DEBUGPL(DBG_CIL, "new dptxfsiz_dieptxf[%d]=%08x\n", i,
920					dwc_read_reg32(&global_regs->dptxfsiz_dieptxf[i-1]));
921
922				txfifosize.b.startaddr += txfifosize.b.depth;
923			}
924		}
925	}
926	/* Flush the FIFOs */
927	dwc_otg_flush_tx_fifo(core_if, 0x10); /* all Tx FIFOs */
928	dwc_otg_flush_rx_fifo(core_if);
929
930	/* Flush the Learning Queue. */
931	resetctl.b.intknqflsh = 1;
932	dwc_write_reg32(&core_if->core_global_regs->grstctl, resetctl.d32);
933
934	/* Clear all pending Device Interrupts */
935
936	if(core_if->multiproc_int_enable) {
937	}
938
939	/** @todo - if the condition needed to be checked
940	 *  or in any case all pending interrutps should be cleared?
941         */
942	if(core_if->multiproc_int_enable) {
943		for(i = 0; i < core_if->dev_if->num_in_eps; ++i) {
944		        dwc_write_reg32(&dev_if->dev_global_regs->diepeachintmsk[i], 0);
945		}
946
947		for(i = 0; i < core_if->dev_if->num_out_eps; ++i) {
948		        dwc_write_reg32(&dev_if->dev_global_regs->doepeachintmsk[i], 0);
949		}
950
951		dwc_write_reg32(&dev_if->dev_global_regs->deachint, 0xFFFFFFFF);
952		dwc_write_reg32(&dev_if->dev_global_regs->deachintmsk, 0);
953	} else {
954                dwc_write_reg32(&dev_if->dev_global_regs->diepmsk, 0);
955                dwc_write_reg32(&dev_if->dev_global_regs->doepmsk, 0);
956                dwc_write_reg32(&dev_if->dev_global_regs->daint, 0xFFFFFFFF);
957                dwc_write_reg32(&dev_if->dev_global_regs->daintmsk, 0);
958	}
959
960	for (i=0; i <= dev_if->num_in_eps; i++)
961	{
962		depctl_data_t depctl;
963		depctl.d32 = dwc_read_reg32(&dev_if->in_ep_regs[i]->diepctl);
964		if (depctl.b.epena) {
965			depctl.d32 = 0;
966			depctl.b.epdis = 1;
967			depctl.b.snak = 1;
968		}
969		else {
970			depctl.d32 = 0;
971		}
972
973		dwc_write_reg32(&dev_if->in_ep_regs[i]->diepctl, depctl.d32);
974
975
976		dwc_write_reg32(&dev_if->in_ep_regs[i]->dieptsiz, 0);
977		dwc_write_reg32(&dev_if->in_ep_regs[i]->diepdma, 0);
978		dwc_write_reg32(&dev_if->in_ep_regs[i]->diepint, 0xFF);
979	}
980
981	for (i=0; i <= dev_if->num_out_eps; i++)
982	{
983		depctl_data_t depctl;
984		depctl.d32 = dwc_read_reg32(&dev_if->out_ep_regs[i]->doepctl);
985		if (depctl.b.epena) {
986			depctl.d32 = 0;
987			depctl.b.epdis = 1;
988			depctl.b.snak = 1;
989		}
990		else {
991			depctl.d32 = 0;
992		}
993
994		dwc_write_reg32(&dev_if->out_ep_regs[i]->doepctl, depctl.d32);
995
996		dwc_write_reg32(&dev_if->out_ep_regs[i]->doeptsiz, 0);
997		dwc_write_reg32(&dev_if->out_ep_regs[i]->doepdma, 0);
998		dwc_write_reg32(&dev_if->out_ep_regs[i]->doepint, 0xFF);
999	}
1000
1001	if(core_if->en_multiple_tx_fifo && core_if->dma_enable) {
1002		dev_if->non_iso_tx_thr_en = params->thr_ctl & 0x1;
1003		dev_if->iso_tx_thr_en = (params->thr_ctl >> 1) & 0x1;
1004		dev_if->rx_thr_en = (params->thr_ctl >> 2) & 0x1;
1005
1006		dev_if->rx_thr_length = params->rx_thr_length;
1007		dev_if->tx_thr_length = params->tx_thr_length;
1008
1009		dev_if->setup_desc_index = 0;
1010
1011		dthrctl.d32 = 0;
1012		dthrctl.b.non_iso_thr_en = dev_if->non_iso_tx_thr_en;
1013		dthrctl.b.iso_thr_en = dev_if->iso_tx_thr_en;
1014		dthrctl.b.tx_thr_len = dev_if->tx_thr_length;
1015		dthrctl.b.rx_thr_en = dev_if->rx_thr_en;
1016		dthrctl.b.rx_thr_len = dev_if->rx_thr_length;
1017
1018		dwc_write_reg32(&dev_if->dev_global_regs->dtknqr3_dthrctl, dthrctl.d32);
1019
1020		DWC_DEBUGPL(DBG_CIL, "Non ISO Tx Thr - %d\nISO Tx Thr - %d\nRx Thr - %d\nTx Thr Len - %d\nRx Thr Len - %d\n",
1021			dthrctl.b.non_iso_thr_en, dthrctl.b.iso_thr_en, dthrctl.b.rx_thr_en, dthrctl.b.tx_thr_len, dthrctl.b.rx_thr_len);
1022
1023	}
1024
1025	dwc_otg_enable_device_interrupts(core_if);
1026
1027	{
1028		diepmsk_data_t msk = { .d32 = 0 };
1029		msk.b.txfifoundrn = 1;
1030	        if(core_if->multiproc_int_enable) {
1031			dwc_modify_reg32(&dev_if->dev_global_regs->diepeachintmsk[0], msk.d32, msk.d32);
1032	        } else {
1033			dwc_modify_reg32(&dev_if->dev_global_regs->diepmsk, msk.d32, msk.d32);
1034	        }
1035	}
1036
1037
1038	if(core_if->multiproc_int_enable) {
1039		/* Set NAK on Babble */
1040		dctl_data_t dctl = { .d32 = 0};
1041		dctl.b.nakonbble = 1;
1042		dwc_modify_reg32(&dev_if->dev_global_regs->dctl, 0, dctl.d32);
1043	}
1044}
1045
1046/**
1047 * This function enables the Host mode interrupts.
1048 *
1049 * @param core_if Programming view of DWC_otg controller
1050 */
1051void dwc_otg_enable_host_interrupts(dwc_otg_core_if_t *core_if)
1052{
1053	dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs;
1054	gintmsk_data_t intr_mask = { .d32 = 0 };
1055
1056	DWC_DEBUGPL(DBG_CIL, "%s()\n", __func__);
1057
1058	/* Disable all interrupts. */
1059	dwc_write_reg32(&global_regs->gintmsk, 0);
1060
1061	/* Clear any pending interrupts. */
1062	dwc_write_reg32(&global_regs->gintsts, 0xFFFFFFFF);
1063
1064	/* Enable the common interrupts */
1065	dwc_otg_enable_common_interrupts(core_if);
1066
1067	/*
1068	 * Enable host mode interrupts without disturbing common
1069	 * interrupts.
1070	 */
1071	intr_mask.b.sofintr = 1;
1072	intr_mask.b.portintr = 1;
1073	intr_mask.b.hcintr = 1;
1074
1075	dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, intr_mask.d32);
1076}
1077
1078/**
1079 * This function disables the Host Mode interrupts.
1080 *
1081 * @param core_if Programming view of DWC_otg controller
1082 */
1083void dwc_otg_disable_host_interrupts(dwc_otg_core_if_t *core_if)
1084{
1085	dwc_otg_core_global_regs_t *global_regs =
1086	core_if->core_global_regs;
1087	gintmsk_data_t intr_mask = { .d32 = 0 };
1088
1089	DWC_DEBUGPL(DBG_CILV, "%s()\n", __func__);
1090
1091	/*
1092	 * Disable host mode interrupts without disturbing common
1093	 * interrupts.
1094	 */
1095	intr_mask.b.sofintr = 1;
1096	intr_mask.b.portintr = 1;
1097	intr_mask.b.hcintr = 1;
1098	intr_mask.b.ptxfempty = 1;
1099	intr_mask.b.nptxfempty = 1;
1100
1101	dwc_modify_reg32(&global_regs->gintmsk, intr_mask.d32, 0);
1102}
1103
1104/**
1105 * This function initializes the DWC_otg controller registers for
1106 * host mode.
1107 *
1108 * This function flushes the Tx and Rx FIFOs and it flushes any entries in the
1109 * request queues. Host channels are reset to ensure that they are ready for
1110 * performing transfers.
1111 *
1112 * @param core_if Programming view of DWC_otg controller
1113 *
1114 */
1115void dwc_otg_core_host_init(dwc_otg_core_if_t *core_if)
1116{
1117	dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs;
1118	dwc_otg_host_if_t	*host_if = core_if->host_if;
1119	dwc_otg_core_params_t	*params = core_if->core_params;
1120	hprt0_data_t		hprt0 = { .d32 = 0 };
1121	fifosize_data_t		nptxfifosize;
1122	fifosize_data_t		ptxfifosize;
1123	int			i;
1124	hcchar_data_t		hcchar;
1125	hcfg_data_t		hcfg;
1126	dwc_otg_hc_regs_t	*hc_regs;
1127	int			num_channels;
1128	gotgctl_data_t	gotgctl = { .d32 = 0 };
1129
1130	DWC_DEBUGPL(DBG_CILV,"%s(%p)\n", __func__, core_if);
1131
1132	/* Restart the Phy Clock */
1133	dwc_write_reg32(core_if->pcgcctl, 0);
1134
1135	/* Initialize Host Configuration Register */
1136	init_fslspclksel(core_if);
1137	if (core_if->core_params->speed == DWC_SPEED_PARAM_FULL)
1138	{
1139		hcfg.d32 = dwc_read_reg32(&host_if->host_global_regs->hcfg);
1140		hcfg.b.fslssupp = 1;
1141		dwc_write_reg32(&host_if->host_global_regs->hcfg, hcfg.d32);
1142	}
1143
1144	/* Configure data FIFO sizes */
1145	if (core_if->hwcfg2.b.dynamic_fifo && params->enable_dynamic_fifo) {
1146		DWC_DEBUGPL(DBG_CIL,"Total FIFO Size=%d\n", core_if->total_fifo_size);
1147		DWC_DEBUGPL(DBG_CIL,"Rx FIFO Size=%d\n", params->host_rx_fifo_size);
1148		DWC_DEBUGPL(DBG_CIL,"NP Tx FIFO Size=%d\n", params->host_nperio_tx_fifo_size);
1149		DWC_DEBUGPL(DBG_CIL,"P Tx FIFO Size=%d\n", params->host_perio_tx_fifo_size);
1150
1151		/* Rx FIFO */
1152		DWC_DEBUGPL(DBG_CIL,"initial grxfsiz=%08x\n", dwc_read_reg32(&global_regs->grxfsiz));
1153		dwc_write_reg32(&global_regs->grxfsiz, params->host_rx_fifo_size);
1154		DWC_DEBUGPL(DBG_CIL,"new grxfsiz=%08x\n", dwc_read_reg32(&global_regs->grxfsiz));
1155
1156		/* Non-periodic Tx FIFO */
1157		DWC_DEBUGPL(DBG_CIL,"initial gnptxfsiz=%08x\n", dwc_read_reg32(&global_regs->gnptxfsiz));
1158		nptxfifosize.b.depth  = params->host_nperio_tx_fifo_size;
1159		nptxfifosize.b.startaddr = params->host_rx_fifo_size;
1160		dwc_write_reg32(&global_regs->gnptxfsiz, nptxfifosize.d32);
1161		DWC_DEBUGPL(DBG_CIL,"new gnptxfsiz=%08x\n", dwc_read_reg32(&global_regs->gnptxfsiz));
1162
1163		/* Periodic Tx FIFO */
1164		DWC_DEBUGPL(DBG_CIL,"initial hptxfsiz=%08x\n", dwc_read_reg32(&global_regs->hptxfsiz));
1165		ptxfifosize.b.depth	 = params->host_perio_tx_fifo_size;
1166		ptxfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth;
1167		dwc_write_reg32(&global_regs->hptxfsiz, ptxfifosize.d32);
1168		DWC_DEBUGPL(DBG_CIL,"new hptxfsiz=%08x\n", dwc_read_reg32(&global_regs->hptxfsiz));
1169	}
1170
1171	/* Clear Host Set HNP Enable in the OTG Control Register */
1172	gotgctl.b.hstsethnpen = 1;
1173	dwc_modify_reg32(&global_regs->gotgctl, gotgctl.d32, 0);
1174
1175	/* Make sure the FIFOs are flushed. */
1176	dwc_otg_flush_tx_fifo(core_if, 0x10 /* all Tx FIFOs */);
1177	dwc_otg_flush_rx_fifo(core_if);
1178
1179	/* Flush out any leftover queued requests. */
1180	num_channels = core_if->core_params->host_channels;
1181	for (i = 0; i < num_channels; i++)
1182	{
1183		hc_regs = core_if->host_if->hc_regs[i];
1184		hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1185		hcchar.b.chen = 0;
1186		hcchar.b.chdis = 1;
1187		hcchar.b.epdir = 0;
1188		dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1189	}
1190
1191	/* Halt all channels to put them into a known state. */
1192	for (i = 0; i < num_channels; i++)
1193	{
1194		int count = 0;
1195		hc_regs = core_if->host_if->hc_regs[i];
1196		hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1197		hcchar.b.chen = 1;
1198		hcchar.b.chdis = 1;
1199		hcchar.b.epdir = 0;
1200		dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1201		DWC_DEBUGPL(DBG_HCDV, "%s: Halt channel %d\n", __func__, i);
1202		do {
1203			hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1204			if (++count > 1000)
1205			{
1206				DWC_ERROR("%s: Unable to clear halt on channel %d\n",
1207					  __func__, i);
1208				break;
1209			}
1210		}
1211		while (hcchar.b.chen);
1212	}
1213
1214	/* Turn on the vbus power. */
1215	DWC_PRINT("Init: Port Power? op_state=%d\n", core_if->op_state);
1216	if (core_if->op_state == A_HOST) {
1217		hprt0.d32 = dwc_otg_read_hprt0(core_if);
1218		DWC_PRINT("Init: Power Port (%d)\n", hprt0.b.prtpwr);
1219		if (hprt0.b.prtpwr == 0) {
1220			hprt0.b.prtpwr = 1;
1221			dwc_write_reg32(host_if->hprt0, hprt0.d32);
1222		}
1223	}
1224
1225	dwc_otg_enable_host_interrupts(core_if);
1226}
1227
1228/**
1229 * Prepares a host channel for transferring packets to/from a specific
1230 * endpoint. The HCCHARn register is set up with the characteristics specified
1231 * in _hc. Host channel interrupts that may need to be serviced while this
1232 * transfer is in progress are enabled.
1233 *
1234 * @param core_if Programming view of DWC_otg controller
1235 * @param hc Information needed to initialize the host channel
1236 */
1237void dwc_otg_hc_init(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1238{
1239	uint32_t intr_enable;
1240	hcintmsk_data_t hc_intr_mask;
1241	gintmsk_data_t gintmsk = { .d32 = 0 };
1242	hcchar_data_t hcchar;
1243	hcsplt_data_t hcsplt;
1244
1245	uint8_t hc_num = hc->hc_num;
1246	dwc_otg_host_if_t *host_if = core_if->host_if;
1247	dwc_otg_hc_regs_t *hc_regs = host_if->hc_regs[hc_num];
1248
1249	/* Clear old interrupt conditions for this host channel. */
1250	hc_intr_mask.d32 = 0xFFFFFFFF;
1251	hc_intr_mask.b.reserved = 0;
1252	dwc_write_reg32(&hc_regs->hcint, hc_intr_mask.d32);
1253
1254	/* Enable channel interrupts required for this transfer. */
1255	hc_intr_mask.d32 = 0;
1256	hc_intr_mask.b.chhltd = 1;
1257	if (core_if->dma_enable) {
1258		hc_intr_mask.b.ahberr = 1;
1259		if (hc->error_state && !hc->do_split &&
1260			hc->ep_type != DWC_OTG_EP_TYPE_ISOC) {
1261			hc_intr_mask.b.ack = 1;
1262			if (hc->ep_is_in) {
1263				hc_intr_mask.b.datatglerr = 1;
1264				if (hc->ep_type != DWC_OTG_EP_TYPE_INTR) {
1265					hc_intr_mask.b.nak = 1;
1266				}
1267			}
1268		}
1269	}
1270	else {
1271		switch (hc->ep_type) {
1272		case DWC_OTG_EP_TYPE_CONTROL:
1273		case DWC_OTG_EP_TYPE_BULK:
1274			hc_intr_mask.b.xfercompl = 1;
1275			hc_intr_mask.b.stall = 1;
1276			hc_intr_mask.b.xacterr = 1;
1277			hc_intr_mask.b.datatglerr = 1;
1278			if (hc->ep_is_in) {
1279				hc_intr_mask.b.bblerr = 1;
1280			}
1281			else {
1282				hc_intr_mask.b.nak = 1;
1283				hc_intr_mask.b.nyet = 1;
1284				if (hc->do_ping) {
1285					hc_intr_mask.b.ack = 1;
1286				}
1287			}
1288
1289			if (hc->do_split) {
1290				hc_intr_mask.b.nak = 1;
1291				if (hc->complete_split) {
1292					hc_intr_mask.b.nyet = 1;
1293				}
1294				else {
1295					hc_intr_mask.b.ack = 1;
1296				}
1297			}
1298
1299			if (hc->error_state) {
1300				hc_intr_mask.b.ack = 1;
1301			}
1302			break;
1303		case DWC_OTG_EP_TYPE_INTR:
1304			hc_intr_mask.b.xfercompl = 1;
1305			hc_intr_mask.b.nak = 1;
1306			hc_intr_mask.b.stall = 1;
1307			hc_intr_mask.b.xacterr = 1;
1308			hc_intr_mask.b.datatglerr = 1;
1309			hc_intr_mask.b.frmovrun = 1;
1310
1311			if (hc->ep_is_in) {
1312				hc_intr_mask.b.bblerr = 1;
1313			}
1314			if (hc->error_state) {
1315				hc_intr_mask.b.ack = 1;
1316			}
1317			if (hc->do_split) {
1318				if (hc->complete_split) {
1319					hc_intr_mask.b.nyet = 1;
1320				}
1321				else {
1322					hc_intr_mask.b.ack = 1;
1323				}
1324			}
1325			break;
1326		case DWC_OTG_EP_TYPE_ISOC:
1327			hc_intr_mask.b.xfercompl = 1;
1328			hc_intr_mask.b.frmovrun = 1;
1329			hc_intr_mask.b.ack = 1;
1330
1331			if (hc->ep_is_in) {
1332				hc_intr_mask.b.xacterr = 1;
1333				hc_intr_mask.b.bblerr = 1;
1334			}
1335			break;
1336		}
1337	}
1338	dwc_write_reg32(&hc_regs->hcintmsk, hc_intr_mask.d32);
1339
1340//	if(hc->ep_type == DWC_OTG_EP_TYPE_BULK && !hc->ep_is_in)
1341//			hc->max_packet = 512;
1342	/* Enable the top level host channel interrupt. */
1343	intr_enable = (1 << hc_num);
1344	dwc_modify_reg32(&host_if->host_global_regs->haintmsk, 0, intr_enable);
1345
1346	/* Make sure host channel interrupts are enabled. */
1347	gintmsk.b.hcintr = 1;
1348	dwc_modify_reg32(&core_if->core_global_regs->gintmsk, 0, gintmsk.d32);
1349
1350	/*
1351	 * Program the HCCHARn register with the endpoint characteristics for
1352	 * the current transfer.
1353	 */
1354	hcchar.d32 = 0;
1355	hcchar.b.devaddr = hc->dev_addr;
1356	hcchar.b.epnum = hc->ep_num;
1357	hcchar.b.epdir = hc->ep_is_in;
1358	hcchar.b.lspddev = (hc->speed == DWC_OTG_EP_SPEED_LOW);
1359	hcchar.b.eptype = hc->ep_type;
1360	hcchar.b.mps = hc->max_packet;
1361
1362	dwc_write_reg32(&host_if->hc_regs[hc_num]->hcchar, hcchar.d32);
1363
1364	DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num);
1365	DWC_DEBUGPL(DBG_HCDV, "	 Dev Addr: %d\n", hcchar.b.devaddr);
1366	DWC_DEBUGPL(DBG_HCDV, "	 Ep Num: %d\n", hcchar.b.epnum);
1367	DWC_DEBUGPL(DBG_HCDV, "	 Is In: %d\n", hcchar.b.epdir);
1368	DWC_DEBUGPL(DBG_HCDV, "	 Is Low Speed: %d\n", hcchar.b.lspddev);
1369	DWC_DEBUGPL(DBG_HCDV, "	 Ep Type: %d\n", hcchar.b.eptype);
1370	DWC_DEBUGPL(DBG_HCDV, "	 Max Pkt: %d\n", hcchar.b.mps);
1371	DWC_DEBUGPL(DBG_HCDV, "	 Multi Cnt: %d\n", hcchar.b.multicnt);
1372
1373	/*
1374	 * Program the HCSPLIT register for SPLITs
1375	 */
1376	hcsplt.d32 = 0;
1377	if (hc->do_split) {
1378		DWC_DEBUGPL(DBG_HCDV, "Programming HC %d with split --> %s\n", hc->hc_num,
1379			   hc->complete_split ? "CSPLIT" : "SSPLIT");
1380		hcsplt.b.compsplt = hc->complete_split;
1381		hcsplt.b.xactpos = hc->xact_pos;
1382		hcsplt.b.hubaddr = hc->hub_addr;
1383		hcsplt.b.prtaddr = hc->port_addr;
1384		DWC_DEBUGPL(DBG_HCDV, "	  comp split %d\n", hc->complete_split);
1385		DWC_DEBUGPL(DBG_HCDV, "	  xact pos %d\n", hc->xact_pos);
1386		DWC_DEBUGPL(DBG_HCDV, "	  hub addr %d\n", hc->hub_addr);
1387		DWC_DEBUGPL(DBG_HCDV, "	  port addr %d\n", hc->port_addr);
1388		DWC_DEBUGPL(DBG_HCDV, "	  is_in %d\n", hc->ep_is_in);
1389		DWC_DEBUGPL(DBG_HCDV, "	  Max Pkt: %d\n", hcchar.b.mps);
1390		DWC_DEBUGPL(DBG_HCDV, "	  xferlen: %d\n", hc->xfer_len);
1391	}
1392	dwc_write_reg32(&host_if->hc_regs[hc_num]->hcsplt, hcsplt.d32);
1393
1394}
1395
1396/**
1397 * Attempts to halt a host channel. This function should only be called in
1398 * Slave mode or to abort a transfer in either Slave mode or DMA mode. Under
1399 * normal circumstances in DMA mode, the controller halts the channel when the
1400 * transfer is complete or a condition occurs that requires application
1401 * intervention.
1402 *
1403 * In slave mode, checks for a free request queue entry, then sets the Channel
1404 * Enable and Channel Disable bits of the Host Channel Characteristics
1405 * register of the specified channel to intiate the halt. If there is no free
1406 * request queue entry, sets only the Channel Disable bit of the HCCHARn
1407 * register to flush requests for this channel. In the latter case, sets a
1408 * flag to indicate that the host channel needs to be halted when a request
1409 * queue slot is open.
1410 *
1411 * In DMA mode, always sets the Channel Enable and Channel Disable bits of the
1412 * HCCHARn register. The controller ensures there is space in the request
1413 * queue before submitting the halt request.
1414 *
1415 * Some time may elapse before the core flushes any posted requests for this
1416 * host channel and halts. The Channel Halted interrupt handler completes the
1417 * deactivation of the host channel.
1418 *
1419 * @param core_if Controller register interface.
1420 * @param hc Host channel to halt.
1421 * @param halt_status Reason for halting the channel.
1422 */
1423void dwc_otg_hc_halt(dwc_otg_core_if_t *core_if,
1424			 dwc_hc_t *hc,
1425			 dwc_otg_halt_status_e halt_status)
1426{
1427	gnptxsts_data_t			nptxsts;
1428	hptxsts_data_t			hptxsts;
1429	hcchar_data_t			hcchar;
1430	dwc_otg_hc_regs_t		*hc_regs;
1431	dwc_otg_core_global_regs_t	*global_regs;
1432	dwc_otg_host_global_regs_t	*host_global_regs;
1433
1434	hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1435	global_regs = core_if->core_global_regs;
1436	host_global_regs = core_if->host_if->host_global_regs;
1437
1438	WARN_ON(halt_status == DWC_OTG_HC_XFER_NO_HALT_STATUS);
1439
1440	if (halt_status == DWC_OTG_HC_XFER_URB_DEQUEUE ||
1441		halt_status == DWC_OTG_HC_XFER_AHB_ERR) {
1442		/*
1443		 * Disable all channel interrupts except Ch Halted. The QTD
1444		 * and QH state associated with this transfer has been cleared
1445		 * (in the case of URB_DEQUEUE), so the channel needs to be
1446		 * shut down carefully to prevent crashes.
1447		 */
1448		hcintmsk_data_t hcintmsk;
1449		hcintmsk.d32 = 0;
1450		hcintmsk.b.chhltd = 1;
1451		dwc_write_reg32(&hc_regs->hcintmsk, hcintmsk.d32);
1452
1453		/*
1454		 * Make sure no other interrupts besides halt are currently
1455		 * pending. Handling another interrupt could cause a crash due
1456		 * to the QTD and QH state.
1457		 */
1458		dwc_write_reg32(&hc_regs->hcint, ~hcintmsk.d32);
1459
1460		/*
1461		 * Make sure the halt status is set to URB_DEQUEUE or AHB_ERR
1462		 * even if the channel was already halted for some other
1463		 * reason.
1464		 */
1465		hc->halt_status = halt_status;
1466
1467		hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1468		if (hcchar.b.chen == 0) {
1469			/*
1470			 * The channel is either already halted or it hasn't
1471			 * started yet. In DMA mode, the transfer may halt if
1472			 * it finishes normally or a condition occurs that
1473			 * requires driver intervention. Don't want to halt
1474			 * the channel again. In either Slave or DMA mode,
1475			 * it's possible that the transfer has been assigned
1476			 * to a channel, but not started yet when an URB is
1477			 * dequeued. Don't want to halt a channel that hasn't
1478			 * started yet.
1479			 */
1480			return;
1481		}
1482	}
1483
1484	if (hc->halt_pending) {
1485		/*
1486		 * A halt has already been issued for this channel. This might
1487		 * happen when a transfer is aborted by a higher level in
1488		 * the stack.
1489		 */
1490#ifdef DEBUG
1491		DWC_PRINT("*** %s: Channel %d, _hc->halt_pending already set ***\n",
1492			  __func__, hc->hc_num);
1493
1494/*		dwc_otg_dump_global_registers(core_if); */
1495/*		dwc_otg_dump_host_registers(core_if); */
1496#endif
1497		return;
1498	}
1499
1500	hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1501	hcchar.b.chen = 1;
1502	hcchar.b.chdis = 1;
1503
1504	if (!core_if->dma_enable) {
1505		/* Check for space in the request queue to issue the halt. */
1506		if (hc->ep_type == DWC_OTG_EP_TYPE_CONTROL ||
1507			hc->ep_type == DWC_OTG_EP_TYPE_BULK) {
1508			nptxsts.d32 = dwc_read_reg32(&global_regs->gnptxsts);
1509			if (nptxsts.b.nptxqspcavail == 0) {
1510				hcchar.b.chen = 0;
1511			}
1512		}
1513		else {
1514			hptxsts.d32 = dwc_read_reg32(&host_global_regs->hptxsts);
1515			if ((hptxsts.b.ptxqspcavail == 0) || (core_if->queuing_high_bandwidth)) {
1516				hcchar.b.chen = 0;
1517			}
1518		}
1519	}
1520
1521	dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1522
1523	hc->halt_status = halt_status;
1524
1525	if (hcchar.b.chen) {
1526		hc->halt_pending = 1;
1527		hc->halt_on_queue = 0;
1528	}
1529	else {
1530		hc->halt_on_queue = 1;
1531	}
1532
1533	DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num);
1534	DWC_DEBUGPL(DBG_HCDV, "	 hcchar: 0x%08x\n", hcchar.d32);
1535	DWC_DEBUGPL(DBG_HCDV, "	 halt_pending: %d\n", hc->halt_pending);
1536	DWC_DEBUGPL(DBG_HCDV, "	 halt_on_queue: %d\n", hc->halt_on_queue);
1537	DWC_DEBUGPL(DBG_HCDV, "	 halt_status: %d\n", hc->halt_status);
1538
1539	return;
1540}
1541
1542/**
1543 * Clears the transfer state for a host channel. This function is normally
1544 * called after a transfer is done and the host channel is being released.
1545 *
1546 * @param core_if Programming view of DWC_otg controller.
1547 * @param hc Identifies the host channel to clean up.
1548 */
1549void dwc_otg_hc_cleanup(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1550{
1551	dwc_otg_hc_regs_t *hc_regs;
1552
1553	hc->xfer_started = 0;
1554
1555	/*
1556	 * Clear channel interrupt enables and any unhandled channel interrupt
1557	 * conditions.
1558	 */
1559	hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1560	dwc_write_reg32(&hc_regs->hcintmsk, 0);
1561	dwc_write_reg32(&hc_regs->hcint, 0xFFFFFFFF);
1562
1563#ifdef DEBUG
1564	del_timer(&core_if->hc_xfer_timer[hc->hc_num]);
1565	{
1566		hcchar_data_t hcchar;
1567		hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1568		if (hcchar.b.chdis) {
1569			DWC_WARN("%s: chdis set, channel %d, hcchar 0x%08x\n",
1570				 __func__, hc->hc_num, hcchar.d32);
1571		}
1572	}
1573#endif
1574}
1575
1576/**
1577 * Sets the channel property that indicates in which frame a periodic transfer
1578 * should occur. This is always set to the _next_ frame. This function has no
1579 * effect on non-periodic transfers.
1580 *
1581 * @param core_if Programming view of DWC_otg controller.
1582 * @param hc Identifies the host channel to set up and its properties.
1583 * @param hcchar Current value of the HCCHAR register for the specified host
1584 * channel.
1585 */
1586static inline void hc_set_even_odd_frame(dwc_otg_core_if_t *core_if,
1587					 dwc_hc_t *hc,
1588					 hcchar_data_t *hcchar)
1589{
1590	if (hc->ep_type == DWC_OTG_EP_TYPE_INTR ||
1591		hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
1592		hfnum_data_t	hfnum;
1593		hfnum.d32 = dwc_read_reg32(&core_if->host_if->host_global_regs->hfnum);
1594
1595		/* 1 if _next_ frame is odd, 0 if it's even */
1596		hcchar->b.oddfrm = (hfnum.b.frnum & 0x1) ? 0 : 1;
1597#ifdef DEBUG
1598		if (hc->ep_type == DWC_OTG_EP_TYPE_INTR && hc->do_split && !hc->complete_split) {
1599			switch (hfnum.b.frnum & 0x7) {
1600			case 7:
1601				core_if->hfnum_7_samples++;
1602				core_if->hfnum_7_frrem_accum += hfnum.b.frrem;
1603				break;
1604			case 0:
1605				core_if->hfnum_0_samples++;
1606				core_if->hfnum_0_frrem_accum += hfnum.b.frrem;
1607				break;
1608			default:
1609				core_if->hfnum_other_samples++;
1610				core_if->hfnum_other_frrem_accum += hfnum.b.frrem;
1611				break;
1612			}
1613		}
1614#endif
1615	}
1616}
1617
1618#ifdef DEBUG
1619static void hc_xfer_timeout(unsigned long ptr)
1620{
1621	hc_xfer_info_t *xfer_info = (hc_xfer_info_t *)ptr;
1622	int hc_num = xfer_info->hc->hc_num;
1623	DWC_WARN("%s: timeout on channel %d\n", __func__, hc_num);
1624	DWC_WARN("	start_hcchar_val 0x%08x\n", xfer_info->core_if->start_hcchar_val[hc_num]);
1625}
1626#endif
1627
1628/*
1629 * This function does the setup for a data transfer for a host channel and
1630 * starts the transfer. May be called in either Slave mode or DMA mode. In
1631 * Slave mode, the caller must ensure that there is sufficient space in the
1632 * request queue and Tx Data FIFO.
1633 *
1634 * For an OUT transfer in Slave mode, it loads a data packet into the
1635 * appropriate FIFO. If necessary, additional data packets will be loaded in
1636 * the Host ISR.
1637 *
1638 * For an IN transfer in Slave mode, a data packet is requested. The data
1639 * packets are unloaded from the Rx FIFO in the Host ISR. If necessary,
1640 * additional data packets are requested in the Host ISR.
1641 *
1642 * For a PING transfer in Slave mode, the Do Ping bit is set in the egards,
1643 *
1644 * Steven
1645 *
1646 * register along with a packet count of 1 and the channel is enabled. This
1647 * causes a single PING transaction to occur. Other fields in HCTSIZ are
1648 * simply set to 0 since no data transfer occurs in this case.
1649 *
1650 * For a PING transfer in DMA mode, the HCTSIZ register is initialized with
1651 * all the information required to perform the subsequent data transfer. In
1652 * addition, the Do Ping bit is set in the HCTSIZ register. In this case, the
1653 * controller performs the entire PING protocol, then starts the data
1654 * transfer.
1655 *
1656 * @param core_if Programming view of DWC_otg controller.
1657 * @param hc Information needed to initialize the host channel. The xfer_len
1658 * value may be reduced to accommodate the max widths of the XferSize and
1659 * PktCnt fields in the HCTSIZn register. The multi_count value may be changed
1660 * to reflect the final xfer_len value.
1661 */
1662void dwc_otg_hc_start_transfer(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1663{
1664	hcchar_data_t hcchar;
1665	hctsiz_data_t hctsiz;
1666	uint16_t num_packets;
1667	uint32_t max_hc_xfer_size = core_if->core_params->max_transfer_size;
1668	uint16_t max_hc_pkt_count = core_if->core_params->max_packet_count;
1669	dwc_otg_hc_regs_t *hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1670
1671	hctsiz.d32 = 0;
1672
1673	if (hc->do_ping) {
1674		if (!core_if->dma_enable) {
1675			dwc_otg_hc_do_ping(core_if, hc);
1676			hc->xfer_started = 1;
1677			return;
1678		}
1679		else {
1680			hctsiz.b.dopng = 1;
1681		}
1682	}
1683
1684	if (hc->do_split) {
1685		num_packets = 1;
1686
1687		if (hc->complete_split && !hc->ep_is_in) {
1688			/* For CSPLIT OUT Transfer, set the size to 0 so the
1689			 * core doesn't expect any data written to the FIFO */
1690			hc->xfer_len = 0;
1691		}
1692		else if (hc->ep_is_in || (hc->xfer_len > hc->max_packet)) {
1693			hc->xfer_len = hc->max_packet;
1694		}
1695		else if (!hc->ep_is_in && (hc->xfer_len > 188)) {
1696			hc->xfer_len = 188;
1697		}
1698
1699		hctsiz.b.xfersize = hc->xfer_len;
1700	}
1701	else {
1702		/*
1703		 * Ensure that the transfer length and packet count will fit
1704		 * in the widths allocated for them in the HCTSIZn register.
1705		 */
1706		if (hc->ep_type == DWC_OTG_EP_TYPE_INTR ||
1707			hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
1708			/*
1709			 * Make sure the transfer size is no larger than one
1710			 * (micro)frame's worth of data. (A check was done
1711			 * when the periodic transfer was accepted to ensure
1712			 * that a (micro)frame's worth of data can be
1713			 * programmed into a channel.)
1714			 */
1715			uint32_t max_periodic_len = hc->multi_count * hc->max_packet;
1716			if (hc->xfer_len > max_periodic_len) {
1717				hc->xfer_len = max_periodic_len;
1718			}
1719			else {
1720			}
1721
1722		}
1723		else if (hc->xfer_len > max_hc_xfer_size) {
1724			/* Make sure that xfer_len is a multiple of max packet size. */
1725			hc->xfer_len = max_hc_xfer_size - hc->max_packet + 1;
1726		}
1727
1728		if (hc->xfer_len > 0) {
1729			num_packets = (hc->xfer_len + hc->max_packet - 1) / hc->max_packet;
1730			if (num_packets > max_hc_pkt_count) {
1731				num_packets = max_hc_pkt_count;
1732				hc->xfer_len = num_packets * hc->max_packet;
1733			}
1734		}
1735		else {
1736			/* Need 1 packet for transfer length of 0. */
1737			num_packets = 1;
1738		}
1739
1740		if (hc->ep_is_in) {
1741			/* Always program an integral # of max packets for IN transfers. */
1742			hc->xfer_len = num_packets * hc->max_packet;
1743		}
1744
1745		if (hc->ep_type == DWC_OTG_EP_TYPE_INTR ||
1746			hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
1747			/*
1748			 * Make sure that the multi_count field matches the
1749			 * actual transfer length.
1750			 */
1751			hc->multi_count = num_packets;
1752		}
1753
1754		if (hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
1755			/* Set up the initial PID for the transfer. */
1756			if (hc->speed == DWC_OTG_EP_SPEED_HIGH) {
1757				if (hc->ep_is_in) {
1758					if (hc->multi_count == 1) {
1759						hc->data_pid_start = DWC_OTG_HC_PID_DATA0;
1760					}
1761					else if (hc->multi_count == 2) {
1762						hc->data_pid_start = DWC_OTG_HC_PID_DATA1;
1763					}
1764					else {
1765						hc->data_pid_start = DWC_OTG_HC_PID_DATA2;
1766					}
1767				}
1768				else {
1769					if (hc->multi_count == 1) {
1770						hc->data_pid_start = DWC_OTG_HC_PID_DATA0;
1771					}
1772					else {
1773						hc->data_pid_start = DWC_OTG_HC_PID_MDATA;
1774					}
1775				}
1776			}
1777			else {
1778				hc->data_pid_start = DWC_OTG_HC_PID_DATA0;
1779			}
1780		}
1781
1782		hctsiz.b.xfersize = hc->xfer_len;
1783	}
1784
1785	hc->start_pkt_count = num_packets;
1786	hctsiz.b.pktcnt = num_packets;
1787	hctsiz.b.pid = hc->data_pid_start;
1788	dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32);
1789
1790	DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num);
1791	DWC_DEBUGPL(DBG_HCDV, "	 Xfer Size: %d\n", hctsiz.b.xfersize);
1792	DWC_DEBUGPL(DBG_HCDV, "	 Num Pkts: %d\n", hctsiz.b.pktcnt);
1793	DWC_DEBUGPL(DBG_HCDV, "	 Start PID: %d\n", hctsiz.b.pid);
1794
1795	if (core_if->dma_enable) {
1796#if defined (CONFIG_DWC_OTG_HOST_ONLY)
1797		if ((uint32_t)hc->xfer_buff & 0x3) {
1798			/* non DWORD-aligned buffer case*/
1799			if(!hc->qh->dw_align_buf) {
1800				hc->qh->dw_align_buf =
1801					dma_alloc_coherent(NULL,
1802					   		   core_if->core_params->max_transfer_size,
1803					   		   &hc->qh->dw_align_buf_dma,
1804					   		   GFP_ATOMIC | GFP_DMA);
1805				if (!hc->qh->dw_align_buf) {
1806
1807					DWC_ERROR("%s: Failed to allocate memory to handle "
1808						  "non-dword aligned buffer case\n", __func__);
1809					return;
1810				}
1811
1812			}
1813			if (!hc->ep_is_in) {
1814			    memcpy(hc->qh->dw_align_buf, phys_to_virt((uint32_t)hc->xfer_buff), hc->xfer_len);
1815			}
1816
1817			dwc_write_reg32(&hc_regs->hcdma, hc->qh->dw_align_buf_dma);
1818		}
1819		else
1820#endif
1821		    dwc_write_reg32(&hc_regs->hcdma, (uint32_t)hc->xfer_buff);
1822	}
1823
1824	/* Start the split */
1825	if (hc->do_split) {
1826		hcsplt_data_t hcsplt;
1827		hcsplt.d32 = dwc_read_reg32 (&hc_regs->hcsplt);
1828		hcsplt.b.spltena = 1;
1829		dwc_write_reg32(&hc_regs->hcsplt, hcsplt.d32);
1830	}
1831
1832	hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1833	hcchar.b.multicnt = hc->multi_count;
1834	hc_set_even_odd_frame(core_if, hc, &hcchar);
1835#ifdef DEBUG
1836	core_if->start_hcchar_val[hc->hc_num] = hcchar.d32;
1837	if (hcchar.b.chdis) {
1838		DWC_WARN("%s: chdis set, channel %d, hcchar 0x%08x\n",
1839			 __func__, hc->hc_num, hcchar.d32);
1840	}
1841#endif
1842
1843	/* Set host channel enable after all other setup is complete. */
1844	hcchar.b.chen = 1;
1845	hcchar.b.chdis = 0;
1846	dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1847
1848	hc->xfer_started = 1;
1849	hc->requests++;
1850
1851	if (!core_if->dma_enable &&
1852		!hc->ep_is_in && hc->xfer_len > 0) {
1853		/* Load OUT packet into the appropriate Tx FIFO. */
1854		dwc_otg_hc_write_packet(core_if, hc);
1855	}
1856
1857#ifdef DEBUG
1858	/* Start a timer for this transfer. */
1859	core_if->hc_xfer_timer[hc->hc_num].function = hc_xfer_timeout;
1860	core_if->hc_xfer_info[hc->hc_num].core_if = core_if;
1861	core_if->hc_xfer_info[hc->hc_num].hc = hc;
1862	core_if->hc_xfer_timer[hc->hc_num].data = (unsigned long)(&core_if->hc_xfer_info[hc->hc_num]);
1863	core_if->hc_xfer_timer[hc->hc_num].expires = jiffies + (HZ*10);
1864	add_timer(&core_if->hc_xfer_timer[hc->hc_num]);
1865#endif
1866}
1867
1868/**
1869 * This function continues a data transfer that was started by previous call
1870 * to <code>dwc_otg_hc_start_transfer</code>. The caller must ensure there is
1871 * sufficient space in the request queue and Tx Data FIFO. This function
1872 * should only be called in Slave mode. In DMA mode, the controller acts
1873 * autonomously to complete transfers programmed to a host channel.
1874 *
1875 * For an OUT transfer, a new data packet is loaded into the appropriate FIFO
1876 * if there is any data remaining to be queued. For an IN transfer, another
1877 * data packet is always requested. For the SETUP phase of a control transfer,
1878 * this function does nothing.
1879 *
1880 * @return 1 if a new request is queued, 0 if no more requests are required
1881 * for this transfer.
1882 */
1883int dwc_otg_hc_continue_transfer(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1884{
1885	DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num);
1886
1887	if (hc->do_split) {
1888		/* SPLITs always queue just once per channel */
1889		return 0;
1890	}
1891	else if (hc->data_pid_start == DWC_OTG_HC_PID_SETUP) {
1892		/* SETUPs are queued only once since they can't be NAKed. */
1893		return 0;
1894	}
1895	else if (hc->ep_is_in) {
1896		/*
1897		 * Always queue another request for other IN transfers. If
1898		 * back-to-back INs are issued and NAKs are received for both,
1899		 * the driver may still be processing the first NAK when the
1900		 * second NAK is received. When the interrupt handler clears
1901		 * the NAK interrupt for the first NAK, the second NAK will
1902		 * not be seen. So we can't depend on the NAK interrupt
1903		 * handler to requeue a NAKed request. Instead, IN requests
1904		 * are issued each time this function is called. When the
1905		 * transfer completes, the extra requests for the channel will
1906		 * be flushed.
1907		 */
1908		hcchar_data_t hcchar;
1909		dwc_otg_hc_regs_t *hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1910
1911		hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1912		hc_set_even_odd_frame(core_if, hc, &hcchar);
1913		hcchar.b.chen = 1;
1914		hcchar.b.chdis = 0;
1915		DWC_DEBUGPL(DBG_HCDV, "	 IN xfer: hcchar = 0x%08x\n", hcchar.d32);
1916		dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1917		hc->requests++;
1918		return 1;
1919	}
1920	else {
1921		/* OUT transfers. */
1922		if (hc->xfer_count < hc->xfer_len) {
1923			if (hc->ep_type == DWC_OTG_EP_TYPE_INTR ||
1924				hc->ep_type == DWC_OTG_EP_TYPE_ISOC) {
1925				hcchar_data_t hcchar;
1926				dwc_otg_hc_regs_t *hc_regs;
1927				hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1928				hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1929				hc_set_even_odd_frame(core_if, hc, &hcchar);
1930			}
1931
1932			/* Load OUT packet into the appropriate Tx FIFO. */
1933			dwc_otg_hc_write_packet(core_if, hc);
1934			hc->requests++;
1935			return 1;
1936		}
1937		else {
1938			return 0;
1939		}
1940	}
1941}
1942
1943/**
1944 * Starts a PING transfer. This function should only be called in Slave mode.
1945 * The Do Ping bit is set in the HCTSIZ register, then the channel is enabled.
1946 */
1947void dwc_otg_hc_do_ping(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1948{
1949	hcchar_data_t hcchar;
1950	hctsiz_data_t hctsiz;
1951	dwc_otg_hc_regs_t *hc_regs = core_if->host_if->hc_regs[hc->hc_num];
1952
1953	DWC_DEBUGPL(DBG_HCDV, "%s: Channel %d\n", __func__, hc->hc_num);
1954
1955	hctsiz.d32 = 0;
1956	hctsiz.b.dopng = 1;
1957	hctsiz.b.pktcnt = 1;
1958	dwc_write_reg32(&hc_regs->hctsiz, hctsiz.d32);
1959
1960	hcchar.d32 = dwc_read_reg32(&hc_regs->hcchar);
1961	hcchar.b.chen = 1;
1962	hcchar.b.chdis = 0;
1963	dwc_write_reg32(&hc_regs->hcchar, hcchar.d32);
1964}
1965
1966/*
1967 * This function writes a packet into the Tx FIFO associated with the Host
1968 * Channel. For a channel associated with a non-periodic EP, the non-periodic
1969 * Tx FIFO is written. For a channel associated with a periodic EP, the
1970 * periodic Tx FIFO is written. This function should only be called in Slave
1971 * mode.
1972 *
1973 * Upon return the xfer_buff and xfer_count fields in _hc are incremented by
1974 * then number of bytes written to the Tx FIFO.
1975 */
1976void dwc_otg_hc_write_packet(dwc_otg_core_if_t *core_if, dwc_hc_t *hc)
1977{
1978	uint32_t i;
1979	uint32_t remaining_count;
1980	uint32_t byte_count;
1981	uint32_t dword_count;
1982
1983	uint32_t *data_buff = (uint32_t *)(hc->xfer_buff);
1984	uint32_t *data_fifo = core_if->data_fifo[hc->hc_num];
1985
1986	remaining_count = hc->xfer_len - hc->xfer_count;
1987	if (remaining_count > hc->max_packet) {
1988		byte_count = hc->max_packet;
1989	}
1990	else {
1991		byte_count = remaining_count;
1992	}
1993
1994	dword_count = (byte_count + 3) / 4;
1995
1996	if ((((unsigned long)data_buff) & 0x3) == 0) {
1997		/* xfer_buff is DWORD aligned. */
1998		for (i = 0; i < dword_count; i++, data_buff++)
1999		{
2000			dwc_write_reg32(data_fifo, *data_buff);
2001		}
2002	}
2003	else {
2004		/* xfer_buff is not DWORD aligned. */
2005		for (i = 0; i < dword_count; i++, data_buff++)
2006		{
2007			dwc_write_reg32(data_fifo, get_unaligned(data_buff));
2008		}
2009	}
2010
2011	hc->xfer_count += byte_count;
2012	hc->xfer_buff += byte_count;
2013}
2014
2015/**
2016 * Gets the current USB frame number. This is the frame number from the last
2017 * SOF packet.
2018 */
2019uint32_t dwc_otg_get_frame_number(dwc_otg_core_if_t *core_if)
2020{
2021	dsts_data_t dsts;
2022	dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts);
2023
2024	/* read current frame/microframe number from DSTS register */
2025	return dsts.b.soffn;
2026}
2027
2028/**
2029 * This function reads a setup packet from the Rx FIFO into the destination
2030 * buffer.	This function is called from the Rx Status Queue Level (RxStsQLvl)
2031 * Interrupt routine when a SETUP packet has been received in Slave mode.
2032 *
2033 * @param core_if Programming view of DWC_otg controller.
2034 * @param dest Destination buffer for packet data.
2035 */
2036void dwc_otg_read_setup_packet(dwc_otg_core_if_t *core_if, uint32_t *dest)
2037{
2038	/* Get the 8 bytes of a setup transaction data */
2039
2040	/* Pop 2 DWORDS off the receive data FIFO into memory */
2041	dest[0] = dwc_read_reg32(core_if->data_fifo[0]);
2042	dest[1] = dwc_read_reg32(core_if->data_fifo[0]);
2043}
2044
2045
2046/**
2047 * This function enables EP0 OUT to receive SETUP packets and configures EP0
2048 * IN for transmitting packets.	 It is normally called when the
2049 * "Enumeration Done" interrupt occurs.
2050 *
2051 * @param core_if Programming view of DWC_otg controller.
2052 * @param ep The EP0 data.
2053 */
2054void dwc_otg_ep0_activate(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2055{
2056	dwc_otg_dev_if_t *dev_if = core_if->dev_if;
2057	dsts_data_t dsts;
2058	depctl_data_t diepctl;
2059	depctl_data_t doepctl;
2060	dctl_data_t dctl = { .d32 = 0 };
2061
2062	/* Read the Device Status and Endpoint 0 Control registers */
2063	dsts.d32 = dwc_read_reg32(&dev_if->dev_global_regs->dsts);
2064	diepctl.d32 = dwc_read_reg32(&dev_if->in_ep_regs[0]->diepctl);
2065	doepctl.d32 = dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl);
2066
2067	/* Set the MPS of the IN EP based on the enumeration speed */
2068	switch (dsts.b.enumspd) {
2069	case DWC_DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ:
2070	case DWC_DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ:
2071	case DWC_DSTS_ENUMSPD_FS_PHY_48MHZ:
2072		diepctl.b.mps = DWC_DEP0CTL_MPS_64;
2073		break;
2074	case DWC_DSTS_ENUMSPD_LS_PHY_6MHZ:
2075		diepctl.b.mps = DWC_DEP0CTL_MPS_8;
2076		break;
2077	}
2078
2079	dwc_write_reg32(&dev_if->in_ep_regs[0]->diepctl, diepctl.d32);
2080
2081	/* Enable OUT EP for receive */
2082	doepctl.b.epena = 1;
2083	dwc_write_reg32(&dev_if->out_ep_regs[0]->doepctl, doepctl.d32);
2084
2085#ifdef VERBOSE
2086	DWC_DEBUGPL(DBG_PCDV,"doepctl0=%0x\n",
2087		dwc_read_reg32(&dev_if->out_ep_regs[0]->doepctl));
2088	DWC_DEBUGPL(DBG_PCDV,"diepctl0=%0x\n",
2089		dwc_read_reg32(&dev_if->in_ep_regs[0]->diepctl));
2090#endif
2091	dctl.b.cgnpinnak = 1;
2092
2093	dwc_modify_reg32(&dev_if->dev_global_regs->dctl, dctl.d32, dctl.d32);
2094	DWC_DEBUGPL(DBG_PCDV,"dctl=%0x\n",
2095		dwc_read_reg32(&dev_if->dev_global_regs->dctl));
2096}
2097
2098/**
2099 * This function activates an EP.  The Device EP control register for
2100 * the EP is configured as defined in the ep structure.	 Note: This
2101 * function is not used for EP0.
2102 *
2103 * @param core_if Programming view of DWC_otg controller.
2104 * @param ep The EP to activate.
2105 */
2106void dwc_otg_ep_activate(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2107{
2108	dwc_otg_dev_if_t *dev_if = core_if->dev_if;
2109	depctl_data_t depctl;
2110	volatile uint32_t *addr;
2111	daint_data_t daintmsk = { .d32 = 0 };
2112
2113	DWC_DEBUGPL(DBG_PCDV, "%s() EP%d-%s\n", __func__, ep->num,
2114		(ep->is_in?"IN":"OUT"));
2115
2116	/* Read DEPCTLn register */
2117	if (ep->is_in == 1) {
2118		addr = &dev_if->in_ep_regs[ep->num]->diepctl;
2119		daintmsk.ep.in = 1<<ep->num;
2120	}
2121	else {
2122		addr = &dev_if->out_ep_regs[ep->num]->doepctl;
2123		daintmsk.ep.out = 1<<ep->num;
2124	}
2125
2126	/* If the EP is already active don't change the EP Control
2127	 * register. */
2128	depctl.d32 = dwc_read_reg32(addr);
2129	if (!depctl.b.usbactep) {
2130		depctl.b.mps = ep->maxpacket;
2131		depctl.b.eptype = ep->type;
2132		depctl.b.txfnum = ep->tx_fifo_num;
2133
2134		if (ep->type == DWC_OTG_EP_TYPE_ISOC) {
2135			depctl.b.setd0pid = 1; // ???
2136		}
2137		else {
2138			depctl.b.setd0pid = 1;
2139		}
2140		depctl.b.usbactep = 1;
2141
2142		dwc_write_reg32(addr, depctl.d32);
2143		DWC_DEBUGPL(DBG_PCDV,"DEPCTL=%08x\n", dwc_read_reg32(addr));
2144	}
2145
2146	/* Enable the Interrupt for this EP */
2147	if(core_if->multiproc_int_enable) {
2148		if (ep->is_in == 1) {
2149			diepmsk_data_t diepmsk = { .d32 = 0};
2150			diepmsk.b.xfercompl = 1;
2151			diepmsk.b.timeout = 1;
2152			diepmsk.b.epdisabled = 1;
2153			diepmsk.b.ahberr = 1;
2154			diepmsk.b.intknepmis = 1;
2155			diepmsk.b.txfifoundrn = 1; //?????
2156
2157
2158			if(core_if->dma_desc_enable) {
2159				diepmsk.b.bna = 1;
2160			}
2161/*
2162			if(core_if->dma_enable) {
2163				doepmsk.b.nak = 1;
2164			}
2165*/
2166			dwc_write_reg32(&dev_if->dev_global_regs->diepeachintmsk[ep->num], diepmsk.d32);
2167
2168		} else {
2169			doepmsk_data_t doepmsk = { .d32 = 0};
2170			doepmsk.b.xfercompl = 1;
2171			doepmsk.b.ahberr = 1;
2172			doepmsk.b.epdisabled = 1;
2173
2174
2175			if(core_if->dma_desc_enable) {
2176				doepmsk.b.bna = 1;
2177			}
2178/*
2179			doepmsk.b.babble = 1;
2180			doepmsk.b.nyet = 1;
2181			doepmsk.b.nak = 1;
2182*/
2183			dwc_write_reg32(&dev_if->dev_global_regs->doepeachintmsk[ep->num], doepmsk.d32);
2184		}
2185		dwc_modify_reg32(&dev_if->dev_global_regs->deachintmsk,
2186			 0, daintmsk.d32);
2187	} else {
2188		dwc_modify_reg32(&dev_if->dev_global_regs->daintmsk,
2189				 0, daintmsk.d32);
2190	}
2191
2192	DWC_DEBUGPL(DBG_PCDV,"DAINTMSK=%0x\n",
2193		dwc_read_reg32(&dev_if->dev_global_regs->daintmsk));
2194
2195	ep->stall_clear_flag = 0;
2196	return;
2197}
2198
2199/**
2200 * This function deactivates an EP. This is done by clearing the USB Active
2201 * EP bit in the Device EP control register. Note: This function is not used
2202 * for EP0. EP0 cannot be deactivated.
2203 *
2204 * @param core_if Programming view of DWC_otg controller.
2205 * @param ep The EP to deactivate.
2206 */
2207void dwc_otg_ep_deactivate(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2208{
2209	depctl_data_t depctl = { .d32 = 0 };
2210	volatile uint32_t *addr;
2211	daint_data_t daintmsk = { .d32 = 0};
2212
2213	/* Read DEPCTLn register */
2214	if (ep->is_in == 1) {
2215		addr = &core_if->dev_if->in_ep_regs[ep->num]->diepctl;
2216		daintmsk.ep.in = 1<<ep->num;
2217	}
2218	else {
2219		addr = &core_if->dev_if->out_ep_regs[ep->num]->doepctl;
2220		daintmsk.ep.out = 1<<ep->num;
2221	}
2222
2223	depctl.b.usbactep = 0;
2224
2225	if(core_if->dma_desc_enable)
2226		depctl.b.epdis = 1;
2227
2228	dwc_write_reg32(addr, depctl.d32);
2229
2230	/* Disable the Interrupt for this EP */
2231	if(core_if->multiproc_int_enable) {
2232		dwc_modify_reg32(&core_if->dev_if->dev_global_regs->deachintmsk,
2233				 daintmsk.d32, 0);
2234
2235		if (ep->is_in == 1) {
2236			dwc_write_reg32(&core_if->dev_if->dev_global_regs->diepeachintmsk[ep->num], 0);
2237		} else {
2238			dwc_write_reg32(&core_if->dev_if->dev_global_regs->doepeachintmsk[ep->num], 0);
2239		}
2240	} else {
2241		dwc_modify_reg32(&core_if->dev_if->dev_global_regs->daintmsk,
2242					 daintmsk.d32, 0);
2243	}
2244}
2245
2246/**
2247 * This function does the setup for a data transfer for an EP and
2248 * starts the transfer.	 For an IN transfer, the packets will be
2249 * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers,
2250 * the packets are unloaded from the Rx FIFO in the ISR.  the ISR.
2251 *
2252 * @param core_if Programming view of DWC_otg controller.
2253 * @param ep The EP to start the transfer on.
2254 */
2255static void init_dma_desc_chain(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2256{
2257	dwc_otg_dma_desc_t* dma_desc;
2258	uint32_t offset;
2259	uint32_t xfer_est;
2260	int i;
2261
2262	ep->desc_cnt = ( ep->total_len / ep->maxxfer)  +
2263		((ep->total_len % ep->maxxfer) ? 1 : 0);
2264	if(!ep->desc_cnt)
2265		ep->desc_cnt = 1;
2266
2267	dma_desc = ep->desc_addr;
2268	xfer_est = ep->total_len;
2269	offset = 0;
2270	for( i = 0; i < ep->desc_cnt; ++i) {
2271		/** DMA Descriptor Setup */
2272		if(xfer_est > ep->maxxfer) {
2273			dma_desc->status.b.bs = BS_HOST_BUSY;
2274			dma_desc->status.b.l = 0;
2275			dma_desc->status.b.ioc = 0;
2276			dma_desc->status.b.sp = 0;
2277			dma_desc->status.b.bytes = ep->maxxfer;
2278			dma_desc->buf = ep->dma_addr + offset;
2279			dma_desc->status.b.bs = BS_HOST_READY;
2280
2281			xfer_est -= ep->maxxfer;
2282			offset += ep->maxxfer;
2283		} else {
2284			dma_desc->status.b.bs = BS_HOST_BUSY;
2285			dma_desc->status.b.l = 1;
2286			dma_desc->status.b.ioc = 1;
2287			if(ep->is_in) {
2288				dma_desc->status.b.sp = (xfer_est % ep->maxpacket) ?
2289					1 : ((ep->sent_zlp) ? 1 : 0);
2290				dma_desc->status.b.bytes = xfer_est;
2291			} else 	{
2292				dma_desc->status.b.bytes = xfer_est + ((4 - (xfer_est & 0x3)) & 0x3) ;
2293			}
2294
2295			dma_desc->buf = ep->dma_addr + offset;
2296			dma_desc->status.b.bs = BS_HOST_READY;
2297		}
2298		dma_desc ++;
2299	}
2300}
2301
2302/**
2303 * This function does the setup for a data transfer for an EP and
2304 * starts the transfer.	 For an IN transfer, the packets will be
2305 * loaded into the appropriate Tx FIFO in the ISR. For OUT transfers,
2306 * the packets are unloaded from the Rx FIFO in the ISR.  the ISR.
2307 *
2308 * @param core_if Programming view of DWC_otg controller.
2309 * @param ep The EP to start the transfer on.
2310 */
2311
2312void dwc_otg_ep_start_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2313{
2314	depctl_data_t 	depctl;
2315	deptsiz_data_t	deptsiz;
2316	gintmsk_data_t 	intr_mask = { .d32 = 0};
2317
2318	DWC_DEBUGPL((DBG_PCDV | DBG_CILV), "%s()\n", __func__);
2319
2320	DWC_DEBUGPL(DBG_PCD, "ep%d-%s xfer_len=%d xfer_cnt=%d "
2321		"xfer_buff=%p start_xfer_buff=%p\n",
2322		ep->num, (ep->is_in?"IN":"OUT"), ep->xfer_len,
2323		ep->xfer_count, ep->xfer_buff, ep->start_xfer_buff);
2324
2325	/* IN endpoint */
2326	if (ep->is_in == 1) {
2327		dwc_otg_dev_in_ep_regs_t *in_regs =
2328			core_if->dev_if->in_ep_regs[ep->num];
2329
2330		gnptxsts_data_t gtxstatus;
2331
2332		gtxstatus.d32 =
2333			dwc_read_reg32(&core_if->core_global_regs->gnptxsts);
2334
2335		if(core_if->en_multiple_tx_fifo == 0 && gtxstatus.b.nptxqspcavail == 0) {
2336#ifdef DEBUG
2337			DWC_PRINT("TX Queue Full (0x%0x)\n", gtxstatus.d32);
2338#endif
2339			return;
2340		}
2341
2342		depctl.d32 = dwc_read_reg32(&(in_regs->diepctl));
2343		deptsiz.d32 = dwc_read_reg32(&(in_regs->dieptsiz));
2344
2345		ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ?
2346				ep->maxxfer : (ep->total_len - ep->xfer_len);
2347
2348		/* Zero Length Packet? */
2349		if ((ep->xfer_len - ep->xfer_count) == 0) {
2350			deptsiz.b.xfersize = 0;
2351			deptsiz.b.pktcnt = 1;
2352		}
2353		else {
2354			/* Program the transfer size and packet count
2355			 *	as follows: xfersize = N * maxpacket +
2356			 *	short_packet pktcnt = N + (short_packet
2357			 *	exist ? 1 : 0)
2358			 */
2359			deptsiz.b.xfersize = ep->xfer_len - ep->xfer_count;
2360			deptsiz.b.pktcnt =
2361				(ep->xfer_len - ep->xfer_count - 1 + ep->maxpacket) /
2362				ep->maxpacket;
2363		}
2364
2365
2366		/* Write the DMA register */
2367		if (core_if->dma_enable) {
2368			if (core_if->dma_desc_enable == 0) {
2369				dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2370				dwc_write_reg32 (&(in_regs->diepdma),
2371						 (uint32_t)ep->dma_addr);
2372			}
2373			else {
2374				init_dma_desc_chain(core_if, ep);
2375				/** DIEPDMAn Register write */
2376				dwc_write_reg32(&in_regs->diepdma, ep->dma_desc_addr);
2377			}
2378		}
2379		else {
2380			dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2381			if(ep->type != DWC_OTG_EP_TYPE_ISOC) {
2382				/**
2383				 * Enable the Non-Periodic Tx FIFO empty interrupt,
2384				 * or the Tx FIFO epmty interrupt in dedicated Tx FIFO mode,
2385				 * the data will be written into the fifo by the ISR.
2386				 */
2387				if(core_if->en_multiple_tx_fifo == 0) {
2388					intr_mask.b.nptxfempty = 1;
2389					dwc_modify_reg32(&core_if->core_global_regs->gintmsk,
2390						intr_mask.d32, intr_mask.d32);
2391				}
2392				else {
2393					/* Enable the Tx FIFO Empty Interrupt for this EP */
2394					if(ep->xfer_len > 0) {
2395						uint32_t fifoemptymsk = 0;
2396						fifoemptymsk = 1 << ep->num;
2397						dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk,
2398						0, fifoemptymsk);
2399
2400					}
2401				}
2402			}
2403		}
2404
2405		/* EP enable, IN data in FIFO */
2406		depctl.b.cnak = 1;
2407		depctl.b.epena = 1;
2408		dwc_write_reg32(&in_regs->diepctl, depctl.d32);
2409
2410		depctl.d32 = dwc_read_reg32 (&core_if->dev_if->in_ep_regs[0]->diepctl);
2411		depctl.b.nextep = ep->num;
2412		dwc_write_reg32 (&core_if->dev_if->in_ep_regs[0]->diepctl, depctl.d32);
2413
2414	}
2415	else {
2416		/* OUT endpoint */
2417		dwc_otg_dev_out_ep_regs_t *out_regs =
2418		core_if->dev_if->out_ep_regs[ep->num];
2419
2420		depctl.d32 = dwc_read_reg32(&(out_regs->doepctl));
2421		deptsiz.d32 = dwc_read_reg32(&(out_regs->doeptsiz));
2422
2423		ep->xfer_len += (ep->maxxfer < (ep->total_len - ep->xfer_len)) ?
2424				ep->maxxfer : (ep->total_len - ep->xfer_len);
2425
2426		/* Program the transfer size and packet count as follows:
2427		 *
2428		 *	pktcnt = N
2429		 *	xfersize = N * maxpacket
2430		 */
2431		if ((ep->xfer_len - ep->xfer_count) == 0) {
2432			/* Zero Length Packet */
2433			deptsiz.b.xfersize = ep->maxpacket;
2434			deptsiz.b.pktcnt = 1;
2435		}
2436		else {
2437			deptsiz.b.pktcnt =
2438					(ep->xfer_len - ep->xfer_count + (ep->maxpacket - 1)) /
2439					ep->maxpacket;
2440			ep->xfer_len = deptsiz.b.pktcnt * ep->maxpacket + ep->xfer_count;
2441			deptsiz.b.xfersize = ep->xfer_len - ep->xfer_count;
2442		}
2443
2444		DWC_DEBUGPL(DBG_PCDV, "ep%d xfersize=%d pktcnt=%d\n",
2445			ep->num,
2446			deptsiz.b.xfersize, deptsiz.b.pktcnt);
2447
2448		if (core_if->dma_enable) {
2449			if (!core_if->dma_desc_enable) {
2450				dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2451
2452				dwc_write_reg32 (&(out_regs->doepdma),
2453					(uint32_t)ep->dma_addr);
2454			}
2455			else {
2456				init_dma_desc_chain(core_if, ep);
2457
2458				/** DOEPDMAn Register write */
2459				dwc_write_reg32(&out_regs->doepdma, ep->dma_desc_addr);
2460			}
2461		}
2462		else {
2463			dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2464		}
2465
2466		/* EP enable */
2467		depctl.b.cnak = 1;
2468		depctl.b.epena = 1;
2469
2470		dwc_write_reg32(&out_regs->doepctl, depctl.d32);
2471
2472		DWC_DEBUGPL(DBG_PCD, "DOEPCTL=%08x DOEPTSIZ=%08x\n",
2473			dwc_read_reg32(&out_regs->doepctl),
2474			dwc_read_reg32(&out_regs->doeptsiz));
2475		DWC_DEBUGPL(DBG_PCD, "DAINTMSK=%08x GINTMSK=%08x\n",
2476			dwc_read_reg32(&core_if->dev_if->dev_global_regs->daintmsk),
2477			dwc_read_reg32(&core_if->core_global_regs->gintmsk));
2478	}
2479}
2480
2481/**
2482 * This function setup a zero length transfer in Buffer DMA and
2483 * Slave modes for usb requests with zero field set
2484 *
2485 * @param core_if Programming view of DWC_otg controller.
2486 * @param ep The EP to start the transfer on.
2487 *
2488 */
2489void dwc_otg_ep_start_zl_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2490{
2491
2492 	depctl_data_t depctl;
2493	deptsiz_data_t deptsiz;
2494	gintmsk_data_t intr_mask = { .d32 = 0};
2495
2496	DWC_DEBUGPL((DBG_PCDV | DBG_CILV), "%s()\n", __func__);
2497
2498	/* IN endpoint */
2499	if (ep->is_in == 1) {
2500		dwc_otg_dev_in_ep_regs_t *in_regs =
2501			core_if->dev_if->in_ep_regs[ep->num];
2502
2503		depctl.d32 = dwc_read_reg32(&(in_regs->diepctl));
2504		deptsiz.d32 = dwc_read_reg32(&(in_regs->dieptsiz));
2505
2506		deptsiz.b.xfersize = 0;
2507		deptsiz.b.pktcnt = 1;
2508
2509
2510		/* Write the DMA register */
2511		if (core_if->dma_enable) {
2512			if (core_if->dma_desc_enable == 0) {
2513				dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2514				dwc_write_reg32 (&(in_regs->diepdma),
2515						 (uint32_t)ep->dma_addr);
2516			}
2517		}
2518		else {
2519			dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2520			/**
2521			 * Enable the Non-Periodic Tx FIFO empty interrupt,
2522			 * or the Tx FIFO epmty interrupt in dedicated Tx FIFO mode,
2523			 * the data will be written into the fifo by the ISR.
2524			 */
2525			if(core_if->en_multiple_tx_fifo == 0) {
2526				intr_mask.b.nptxfempty = 1;
2527				dwc_modify_reg32(&core_if->core_global_regs->gintmsk,
2528					intr_mask.d32, intr_mask.d32);
2529			}
2530			else {
2531				/* Enable the Tx FIFO Empty Interrupt for this EP */
2532				if(ep->xfer_len > 0) {
2533					uint32_t fifoemptymsk = 0;
2534					fifoemptymsk = 1 << ep->num;
2535					dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk,
2536					0, fifoemptymsk);
2537				}
2538			}
2539		}
2540
2541		/* EP enable, IN data in FIFO */
2542		depctl.b.cnak = 1;
2543		depctl.b.epena = 1;
2544		dwc_write_reg32(&in_regs->diepctl, depctl.d32);
2545
2546		depctl.d32 = dwc_read_reg32 (&core_if->dev_if->in_ep_regs[0]->diepctl);
2547		depctl.b.nextep = ep->num;
2548		dwc_write_reg32 (&core_if->dev_if->in_ep_regs[0]->diepctl, depctl.d32);
2549
2550	}
2551	else {
2552		/* OUT endpoint */
2553		dwc_otg_dev_out_ep_regs_t *out_regs =
2554		core_if->dev_if->out_ep_regs[ep->num];
2555
2556		depctl.d32 = dwc_read_reg32(&(out_regs->doepctl));
2557		deptsiz.d32 = dwc_read_reg32(&(out_regs->doeptsiz));
2558
2559		/* Zero Length Packet */
2560		deptsiz.b.xfersize = ep->maxpacket;
2561		deptsiz.b.pktcnt = 1;
2562
2563		if (core_if->dma_enable) {
2564			if (!core_if->dma_desc_enable) {
2565				dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2566
2567				dwc_write_reg32 (&(out_regs->doepdma),
2568					(uint32_t)ep->dma_addr);
2569			}
2570		}
2571		else {
2572			dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2573		}
2574
2575		/* EP enable */
2576		depctl.b.cnak = 1;
2577		depctl.b.epena = 1;
2578
2579		dwc_write_reg32(&out_regs->doepctl, depctl.d32);
2580
2581	}
2582}
2583
2584/**
2585 * This function does the setup for a data transfer for EP0 and starts
2586 * the transfer.  For an IN transfer, the packets will be loaded into
2587 * the appropriate Tx FIFO in the ISR. For OUT transfers, the packets are
2588 * unloaded from the Rx FIFO in the ISR.
2589 *
2590 * @param core_if Programming view of DWC_otg controller.
2591 * @param ep The EP0 data.
2592 */
2593void dwc_otg_ep0_start_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2594{
2595	depctl_data_t depctl;
2596	deptsiz0_data_t deptsiz;
2597	gintmsk_data_t intr_mask = { .d32 = 0};
2598	dwc_otg_dma_desc_t* dma_desc;
2599
2600	DWC_DEBUGPL(DBG_PCD, "ep%d-%s xfer_len=%d xfer_cnt=%d "
2601	"xfer_buff=%p start_xfer_buff=%p \n",
2602	ep->num, (ep->is_in?"IN":"OUT"), ep->xfer_len,
2603	ep->xfer_count, ep->xfer_buff, ep->start_xfer_buff);
2604
2605	ep->total_len = ep->xfer_len;
2606
2607	/* IN endpoint */
2608	if (ep->is_in == 1) {
2609		dwc_otg_dev_in_ep_regs_t *in_regs =
2610		core_if->dev_if->in_ep_regs[0];
2611
2612		gnptxsts_data_t gtxstatus;
2613
2614		gtxstatus.d32 =
2615			dwc_read_reg32(&core_if->core_global_regs->gnptxsts);
2616
2617		if(core_if->en_multiple_tx_fifo == 0 && gtxstatus.b.nptxqspcavail == 0) {
2618#ifdef DEBUG
2619			deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz);
2620			DWC_DEBUGPL(DBG_PCD,"DIEPCTL0=%0x\n",
2621				dwc_read_reg32(&in_regs->diepctl));
2622			DWC_DEBUGPL(DBG_PCD, "DIEPTSIZ0=%0x (sz=%d, pcnt=%d)\n",
2623				deptsiz.d32,
2624				deptsiz.b.xfersize, deptsiz.b.pktcnt);
2625			DWC_PRINT("TX Queue or FIFO Full (0x%0x)\n",
2626				  gtxstatus.d32);
2627#endif
2628			return;
2629		}
2630
2631
2632		depctl.d32 = dwc_read_reg32(&in_regs->diepctl);
2633		deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz);
2634
2635		/* Zero Length Packet? */
2636		if (ep->xfer_len == 0) {
2637			deptsiz.b.xfersize = 0;
2638			deptsiz.b.pktcnt = 1;
2639		}
2640		else {
2641			/* Program the transfer size and packet count
2642			 *	as follows: xfersize = N * maxpacket +
2643			 *	short_packet pktcnt = N + (short_packet
2644			 *	exist ? 1 : 0)
2645			 */
2646			if (ep->xfer_len > ep->maxpacket) {
2647				ep->xfer_len = ep->maxpacket;
2648				deptsiz.b.xfersize = ep->maxpacket;
2649			}
2650			else {
2651				deptsiz.b.xfersize = ep->xfer_len;
2652			}
2653			deptsiz.b.pktcnt = 1;
2654
2655		}
2656		DWC_DEBUGPL(DBG_PCDV, "IN len=%d  xfersize=%d pktcnt=%d [%08x]\n",
2657			ep->xfer_len,
2658			deptsiz.b.xfersize, deptsiz.b.pktcnt, deptsiz.d32);
2659
2660		/* Write the DMA register */
2661		if (core_if->dma_enable) {
2662			if(core_if->dma_desc_enable == 0) {
2663				dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2664
2665				dwc_write_reg32 (&(in_regs->diepdma),
2666				(uint32_t)ep->dma_addr);
2667			}
2668			else {
2669				dma_desc = core_if->dev_if->in_desc_addr;
2670
2671				/** DMA Descriptor Setup */
2672				dma_desc->status.b.bs = BS_HOST_BUSY;
2673				dma_desc->status.b.l = 1;
2674				dma_desc->status.b.ioc = 1;
2675				dma_desc->status.b.sp = (ep->xfer_len == ep->maxpacket) ? 0 : 1;
2676				dma_desc->status.b.bytes = ep->xfer_len;
2677				dma_desc->buf = ep->dma_addr;
2678				dma_desc->status.b.bs = BS_HOST_READY;
2679
2680				/** DIEPDMA0 Register write */
2681				dwc_write_reg32(&in_regs->diepdma, core_if->dev_if->dma_in_desc_addr);
2682			}
2683		}
2684		else {
2685			dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2686		}
2687
2688		/* EP enable, IN data in FIFO */
2689		depctl.b.cnak = 1;
2690		depctl.b.epena = 1;
2691		dwc_write_reg32(&in_regs->diepctl, depctl.d32);
2692
2693		/**
2694		 * Enable the Non-Periodic Tx FIFO empty interrupt, the
2695		 * data will be written into the fifo by the ISR.
2696		 */
2697		if (!core_if->dma_enable) {
2698			if(core_if->en_multiple_tx_fifo == 0) {
2699				intr_mask.b.nptxfempty = 1;
2700				dwc_modify_reg32(&core_if->core_global_regs->gintmsk,
2701					intr_mask.d32, intr_mask.d32);
2702			}
2703			else {
2704				/* Enable the Tx FIFO Empty Interrupt for this EP */
2705				if(ep->xfer_len > 0) {
2706					uint32_t fifoemptymsk = 0;
2707					fifoemptymsk |= 1 << ep->num;
2708					dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk,
2709						0, fifoemptymsk);
2710				}
2711			}
2712		}
2713	}
2714	else {
2715		/* OUT endpoint */
2716		dwc_otg_dev_out_ep_regs_t *out_regs =
2717			core_if->dev_if->out_ep_regs[0];
2718
2719		depctl.d32 = dwc_read_reg32(&out_regs->doepctl);
2720		deptsiz.d32 = dwc_read_reg32(&out_regs->doeptsiz);
2721
2722		/* Program the transfer size and packet count as follows:
2723		 *	xfersize = N * (maxpacket + 4 - (maxpacket % 4))
2724		 *	pktcnt = N											*/
2725		/* Zero Length Packet */
2726		deptsiz.b.xfersize = ep->maxpacket;
2727		deptsiz.b.pktcnt = 1;
2728
2729		DWC_DEBUGPL(DBG_PCDV, "len=%d  xfersize=%d pktcnt=%d\n",
2730			ep->xfer_len,
2731			deptsiz.b.xfersize, deptsiz.b.pktcnt);
2732
2733		if (core_if->dma_enable) {
2734			if(!core_if->dma_desc_enable) {
2735				dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2736
2737				dwc_write_reg32 (&(out_regs->doepdma),
2738				 (uint32_t)ep->dma_addr);
2739			}
2740			else {
2741				dma_desc = core_if->dev_if->out_desc_addr;
2742
2743				/** DMA Descriptor Setup */
2744				dma_desc->status.b.bs = BS_HOST_BUSY;
2745				dma_desc->status.b.l = 1;
2746				dma_desc->status.b.ioc = 1;
2747				dma_desc->status.b.bytes = ep->maxpacket;
2748				dma_desc->buf = ep->dma_addr;
2749				dma_desc->status.b.bs = BS_HOST_READY;
2750
2751				/** DOEPDMA0 Register write */
2752				dwc_write_reg32(&out_regs->doepdma, core_if->dev_if->dma_out_desc_addr);
2753			}
2754		}
2755		else {
2756			dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2757		}
2758
2759		/* EP enable */
2760		depctl.b.cnak = 1;
2761		depctl.b.epena = 1;
2762		dwc_write_reg32 (&(out_regs->doepctl), depctl.d32);
2763	}
2764}
2765
2766/**
2767 * This function continues control IN transfers started by
2768 * dwc_otg_ep0_start_transfer, when the transfer does not fit in a
2769 * single packet.  NOTE: The DIEPCTL0/DOEPCTL0 registers only have one
2770 * bit for the packet count.
2771 *
2772 * @param core_if Programming view of DWC_otg controller.
2773 * @param ep The EP0 data.
2774 */
2775void dwc_otg_ep0_continue_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
2776{
2777	depctl_data_t depctl;
2778	deptsiz0_data_t deptsiz;
2779	gintmsk_data_t intr_mask = { .d32 = 0};
2780	dwc_otg_dma_desc_t* dma_desc;
2781
2782	if (ep->is_in == 1) {
2783		dwc_otg_dev_in_ep_regs_t *in_regs =
2784			core_if->dev_if->in_ep_regs[0];
2785		gnptxsts_data_t tx_status = { .d32 = 0 };
2786
2787		tx_status.d32 = dwc_read_reg32(&core_if->core_global_regs->gnptxsts);
2788		/** @todo Should there be check for room in the Tx
2789		 * Status Queue.  If not remove the code above this comment. */
2790
2791		depctl.d32 = dwc_read_reg32(&in_regs->diepctl);
2792		deptsiz.d32 = dwc_read_reg32(&in_regs->dieptsiz);
2793
2794		/* Program the transfer size and packet count
2795		 *	as follows: xfersize = N * maxpacket +
2796		 *	short_packet pktcnt = N + (short_packet
2797		 *	exist ? 1 : 0)
2798		 */
2799
2800
2801		if(core_if->dma_desc_enable == 0) {
2802			deptsiz.b.xfersize = (ep->total_len - ep->xfer_count) > ep->maxpacket ? ep->maxpacket :
2803					(ep->total_len - ep->xfer_count);
2804			deptsiz.b.pktcnt = 1;
2805			if(core_if->dma_enable == 0) {
2806				ep->xfer_len += deptsiz.b.xfersize;
2807			} else {
2808				ep->xfer_len = deptsiz.b.xfersize;
2809			}
2810			dwc_write_reg32(&in_regs->dieptsiz, deptsiz.d32);
2811		}
2812		else {
2813			ep->xfer_len = (ep->total_len - ep->xfer_count) > ep->maxpacket ? ep->maxpacket :
2814				(ep->total_len - ep->xfer_count);
2815
2816			dma_desc = core_if->dev_if->in_desc_addr;
2817
2818			/** DMA Descriptor Setup */
2819			dma_desc->status.b.bs = BS_HOST_BUSY;
2820			dma_desc->status.b.l = 1;
2821			dma_desc->status.b.ioc = 1;
2822			dma_desc->status.b.sp = (ep->xfer_len == ep->maxpacket) ? 0 : 1;
2823			dma_desc->status.b.bytes = ep->xfer_len;
2824			dma_desc->buf = ep->dma_addr;
2825			dma_desc->status.b.bs = BS_HOST_READY;
2826
2827			/** DIEPDMA0 Register write */
2828			dwc_write_reg32(&in_regs->diepdma, core_if->dev_if->dma_in_desc_addr);
2829		}
2830
2831
2832		DWC_DEBUGPL(DBG_PCDV, "IN len=%d  xfersize=%d pktcnt=%d [%08x]\n",
2833			ep->xfer_len,
2834			deptsiz.b.xfersize, deptsiz.b.pktcnt, deptsiz.d32);
2835
2836		/* Write the DMA register */
2837		if (core_if->hwcfg2.b.architecture == DWC_INT_DMA_ARCH) {
2838			if(core_if->dma_desc_enable == 0)
2839				dwc_write_reg32 (&(in_regs->diepdma), (uint32_t)ep->dma_addr);
2840		}
2841
2842		/* EP enable, IN data in FIFO */
2843		depctl.b.cnak = 1;
2844		depctl.b.epena = 1;
2845		dwc_write_reg32(&in_regs->diepctl, depctl.d32);
2846
2847		/**
2848		 * Enable the Non-Periodic Tx FIFO empty interrupt, the
2849		 * data will be written into the fifo by the ISR.
2850		 */
2851		if (!core_if->dma_enable) {
2852			if(core_if->en_multiple_tx_fifo == 0) {
2853				/* First clear it from GINTSTS */
2854				intr_mask.b.nptxfempty = 1;
2855				dwc_modify_reg32(&core_if->core_global_regs->gintmsk,
2856					intr_mask.d32, intr_mask.d32);
2857
2858			}
2859			else {
2860				/* Enable the Tx FIFO Empty Interrupt for this EP */
2861				if(ep->xfer_len > 0) {
2862					uint32_t fifoemptymsk = 0;
2863					fifoemptymsk |= 1 << ep->num;
2864					dwc_modify_reg32(&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk,
2865						0, fifoemptymsk);
2866				}
2867			}
2868		}
2869	}
2870	else {
2871		dwc_otg_dev_out_ep_regs_t *out_regs =
2872			core_if->dev_if->out_ep_regs[0];
2873
2874
2875		depctl.d32 = dwc_read_reg32(&out_regs->doepctl);
2876		deptsiz.d32 = dwc_read_reg32(&out_regs->doeptsiz);
2877
2878		/* Program the transfer size and packet count
2879		 *	as follows: xfersize = N * maxpacket +
2880		 *	short_packet pktcnt = N + (short_packet
2881		 *	exist ? 1 : 0)
2882		 */
2883		deptsiz.b.xfersize = ep->maxpacket;
2884		deptsiz.b.pktcnt = 1;
2885
2886
2887		if(core_if->dma_desc_enable == 0) {
2888			dwc_write_reg32(&out_regs->doeptsiz, deptsiz.d32);
2889		}
2890		else {
2891			dma_desc = core_if->dev_if->out_desc_addr;
2892
2893			/** DMA Descriptor Setup */
2894			dma_desc->status.b.bs = BS_HOST_BUSY;
2895			dma_desc->status.b.l = 1;
2896			dma_desc->status.b.ioc = 1;
2897			dma_desc->status.b.bytes = ep->maxpacket;
2898			dma_desc->buf = ep->dma_addr;
2899			dma_desc->status.b.bs = BS_HOST_READY;
2900
2901			/** DOEPDMA0 Register write */
2902			dwc_write_reg32(&out_regs->doepdma, core_if->dev_if->dma_out_desc_addr);
2903		}
2904
2905
2906		DWC_DEBUGPL(DBG_PCDV, "IN len=%d  xfersize=%d pktcnt=%d [%08x]\n",
2907			ep->xfer_len,
2908			deptsiz.b.xfersize, deptsiz.b.pktcnt, deptsiz.d32);
2909
2910		/* Write the DMA register */
2911		if (core_if->hwcfg2.b.architecture == DWC_INT_DMA_ARCH) {
2912			if(core_if->dma_desc_enable == 0)
2913				dwc_write_reg32 (&(out_regs->doepdma), (uint32_t)ep->dma_addr);
2914		}
2915
2916		/* EP enable, IN data in FIFO */
2917		depctl.b.cnak = 1;
2918		depctl.b.epena = 1;
2919		dwc_write_reg32(&out_regs->doepctl, depctl.d32);
2920
2921	}
2922}
2923
2924#ifdef DEBUG
2925void dump_msg(const u8 *buf, unsigned int length)
2926{
2927	unsigned int	start, num, i;
2928	char		line[52], *p;
2929
2930	if (length >= 512)
2931		return;
2932	start = 0;
2933	while (length > 0) {
2934		num = min(length, 16u);
2935		p = line;
2936		for (i = 0; i < num; ++i)
2937		{
2938			if (i == 8)
2939				*p++ = ' ';
2940			sprintf(p, " %02x", buf[i]);
2941			p += 3;
2942		}
2943		*p = 0;
2944		DWC_PRINT("%6x: %s\n", start, line);
2945		buf += num;
2946		start += num;
2947		length -= num;
2948	}
2949}
2950#else
2951static inline void dump_msg(const u8 *buf, unsigned int length)
2952{
2953}
2954#endif
2955
2956/**
2957 * This function writes a packet into the Tx FIFO associated with the
2958 * EP.	For non-periodic EPs the non-periodic Tx FIFO is written.  For
2959 * periodic EPs the periodic Tx FIFO associated with the EP is written
2960 * with all packets for the next micro-frame.
2961 *
2962 * @param core_if Programming view of DWC_otg controller.
2963 * @param ep The EP to write packet for.
2964 * @param dma Indicates if DMA is being used.
2965 */
2966void dwc_otg_ep_write_packet(dwc_otg_core_if_t *core_if, dwc_ep_t *ep, int dma)
2967{
2968	/**
2969	 * The buffer is padded to DWORD on a per packet basis in
2970	 * slave/dma mode if the MPS is not DWORD aligned.	The last
2971	 * packet, if short, is also padded to a multiple of DWORD.
2972	 *
2973	 * ep->xfer_buff always starts DWORD aligned in memory and is a
2974	 * multiple of DWORD in length
2975	 *
2976	 * ep->xfer_len can be any number of bytes
2977	 *
2978	 * ep->xfer_count is a multiple of ep->maxpacket until the last
2979	 *	packet
2980	 *
2981	 * FIFO access is DWORD */
2982
2983	uint32_t i;
2984	uint32_t byte_count;
2985	uint32_t dword_count;
2986	uint32_t *fifo;
2987	uint32_t *data_buff = (uint32_t *)ep->xfer_buff;
2988
2989	DWC_DEBUGPL((DBG_PCDV | DBG_CILV), "%s(%p,%p)\n", __func__, core_if, ep);
2990	if (ep->xfer_count >= ep->xfer_len) {
2991			DWC_WARN("%s() No data for EP%d!!!\n", __func__, ep->num);
2992			return;
2993	}
2994
2995	/* Find the byte length of the packet either short packet or MPS */
2996	if ((ep->xfer_len - ep->xfer_count) < ep->maxpacket) {
2997		byte_count = ep->xfer_len - ep->xfer_count;
2998	}
2999	else {
3000		byte_count = ep->maxpacket;
3001	}
3002
3003	/* Find the DWORD length, padded by extra bytes as neccessary if MPS
3004	 * is not a multiple of DWORD */
3005	dword_count =  (byte_count + 3) / 4;
3006
3007#ifdef VERBOSE
3008	dump_msg(ep->xfer_buff, byte_count);
3009#endif
3010
3011	/**@todo NGS Where are the Periodic Tx FIFO addresses
3012	 * intialized?	What should this be? */
3013
3014	fifo = core_if->data_fifo[ep->num];
3015
3016
3017	DWC_DEBUGPL((DBG_PCDV|DBG_CILV), "fifo=%p buff=%p *p=%08x bc=%d\n", fifo, data_buff, *data_buff, byte_count);
3018
3019	if (!dma) {
3020		for (i=0; i<dword_count; i++, data_buff++) {
3021			dwc_write_reg32(fifo, *data_buff);
3022		}
3023	}
3024
3025	ep->xfer_count += byte_count;
3026	ep->xfer_buff += byte_count;
3027	ep->dma_addr += byte_count;
3028}
3029
3030/**
3031 * Set the EP STALL.
3032 *
3033 * @param core_if Programming view of DWC_otg controller.
3034 * @param ep The EP to set the stall on.
3035 */
3036void dwc_otg_ep_set_stall(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
3037{
3038	depctl_data_t depctl;
3039	volatile uint32_t *depctl_addr;
3040
3041	DWC_DEBUGPL(DBG_PCD, "%s ep%d-%s\n", __func__, ep->num,
3042		(ep->is_in?"IN":"OUT"));
3043
3044	DWC_PRINT("%s ep%d-%s\n", __func__, ep->num,
3045		(ep->is_in?"in":"out"));
3046
3047	if (ep->is_in == 1) {
3048		depctl_addr = &(core_if->dev_if->in_ep_regs[ep->num]->diepctl);
3049		depctl.d32 = dwc_read_reg32(depctl_addr);
3050
3051		/* set the disable and stall bits */
3052		if (depctl.b.epena) {
3053			depctl.b.epdis = 1;
3054		}
3055		depctl.b.stall = 1;
3056		dwc_write_reg32(depctl_addr, depctl.d32);
3057	}
3058	else {
3059		depctl_addr = &(core_if->dev_if->out_ep_regs[ep->num]->doepctl);
3060		depctl.d32 = dwc_read_reg32(depctl_addr);
3061
3062		/* set the stall bit */
3063		depctl.b.stall = 1;
3064		dwc_write_reg32(depctl_addr, depctl.d32);
3065	}
3066
3067	DWC_DEBUGPL(DBG_PCD,"DEPCTL=%0x\n",dwc_read_reg32(depctl_addr));
3068
3069	return;
3070}
3071
3072/**
3073 * Clear the EP STALL.
3074 *
3075 * @param core_if Programming view of DWC_otg controller.
3076 * @param ep The EP to clear stall from.
3077 */
3078void dwc_otg_ep_clear_stall(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
3079{
3080	depctl_data_t depctl;
3081	volatile uint32_t *depctl_addr;
3082
3083	DWC_DEBUGPL(DBG_PCD, "%s ep%d-%s\n", __func__, ep->num,
3084		(ep->is_in?"IN":"OUT"));
3085
3086	if (ep->is_in == 1) {
3087		depctl_addr = &(core_if->dev_if->in_ep_regs[ep->num]->diepctl);
3088	}
3089	else {
3090		depctl_addr = &(core_if->dev_if->out_ep_regs[ep->num]->doepctl);
3091	}
3092
3093	depctl.d32 = dwc_read_reg32(depctl_addr);
3094
3095	/* clear the stall bits */
3096	depctl.b.stall = 0;
3097
3098	/*
3099	 * USB Spec 9.4.5: For endpoints using data toggle, regardless
3100	 * of whether an endpoint has the Halt feature set, a
3101	 * ClearFeature(ENDPOINT_HALT) request always results in the
3102	 * data toggle being reinitialized to DATA0.
3103	 */
3104	if (ep->type == DWC_OTG_EP_TYPE_INTR ||
3105		ep->type == DWC_OTG_EP_TYPE_BULK) {
3106		depctl.b.setd0pid = 1; /* DATA0 */
3107	}
3108
3109	dwc_write_reg32(depctl_addr, depctl.d32);
3110	DWC_DEBUGPL(DBG_PCD,"DEPCTL=%0x\n",dwc_read_reg32(depctl_addr));
3111	return;
3112}
3113
3114/**
3115 * This function reads a packet from the Rx FIFO into the destination
3116 * buffer.	To read SETUP data use dwc_otg_read_setup_packet.
3117 *
3118 * @param core_if Programming view of DWC_otg controller.
3119 * @param dest	  Destination buffer for the packet.
3120 * @param bytes  Number of bytes to copy to the destination.
3121 */
3122void dwc_otg_read_packet(dwc_otg_core_if_t *core_if,
3123			 uint8_t *dest,
3124			 uint16_t bytes)
3125{
3126	int i;
3127	int word_count = (bytes + 3) / 4;
3128
3129	volatile uint32_t *fifo = core_if->data_fifo[0];
3130	uint32_t *data_buff = (uint32_t *)dest;
3131
3132	/**
3133	 * @todo Account for the case where _dest is not dword aligned. This
3134	 * requires reading data from the FIFO into a uint32_t temp buffer,
3135	 * then moving it into the data buffer.
3136	 */
3137
3138	DWC_DEBUGPL((DBG_PCDV | DBG_CILV), "%s(%p,%p,%d)\n", __func__,
3139					core_if, dest, bytes);
3140
3141	for (i=0; i<word_count; i++, data_buff++)
3142	{
3143		*data_buff = dwc_read_reg32(fifo);
3144	}
3145
3146	return;
3147}
3148
3149
3150
3151/**
3152 * This functions reads the device registers and prints them
3153 *
3154 * @param core_if Programming view of DWC_otg controller.
3155 */
3156void dwc_otg_dump_dev_registers(dwc_otg_core_if_t *core_if)
3157{
3158	int i;
3159	volatile uint32_t *addr;
3160
3161	DWC_PRINT("Device Global Registers\n");
3162	addr=&core_if->dev_if->dev_global_regs->dcfg;
3163	DWC_PRINT("DCFG		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3164	addr=&core_if->dev_if->dev_global_regs->dctl;
3165	DWC_PRINT("DCTL		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3166	addr=&core_if->dev_if->dev_global_regs->dsts;
3167	DWC_PRINT("DSTS		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3168	addr=&core_if->dev_if->dev_global_regs->diepmsk;
3169	DWC_PRINT("DIEPMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3170	addr=&core_if->dev_if->dev_global_regs->doepmsk;
3171	DWC_PRINT("DOEPMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3172	addr=&core_if->dev_if->dev_global_regs->daint;
3173	DWC_PRINT("DAINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3174	addr=&core_if->dev_if->dev_global_regs->daintmsk;
3175	DWC_PRINT("DAINTMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3176	addr=&core_if->dev_if->dev_global_regs->dtknqr1;
3177	DWC_PRINT("DTKNQR1	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3178	if (core_if->hwcfg2.b.dev_token_q_depth > 6) {
3179		addr=&core_if->dev_if->dev_global_regs->dtknqr2;
3180		DWC_PRINT("DTKNQR2	 @0x%08X : 0x%08X\n",
3181		  (uint32_t)addr,dwc_read_reg32(addr));
3182	}
3183
3184	addr=&core_if->dev_if->dev_global_regs->dvbusdis;
3185	DWC_PRINT("DVBUSID	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3186
3187	addr=&core_if->dev_if->dev_global_regs->dvbuspulse;
3188	DWC_PRINT("DVBUSPULSE	@0x%08X : 0x%08X\n",
3189				  (uint32_t)addr,dwc_read_reg32(addr));
3190
3191	if (core_if->hwcfg2.b.dev_token_q_depth > 14) {
3192		addr=&core_if->dev_if->dev_global_regs->dtknqr3_dthrctl;
3193		DWC_PRINT("DTKNQR3_DTHRCTL	 @0x%08X : 0x%08X\n",
3194		  (uint32_t)addr, dwc_read_reg32(addr));
3195	}
3196/*
3197	if (core_if->hwcfg2.b.dev_token_q_depth > 22) {
3198		addr=&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk;
3199		DWC_PRINT("DTKNQR4	 @0x%08X : 0x%08X\n",
3200				  (uint32_t)addr, dwc_read_reg32(addr));
3201	}
3202*/
3203	addr=&core_if->dev_if->dev_global_regs->dtknqr4_fifoemptymsk;
3204	DWC_PRINT("FIFOEMPMSK	 @0x%08X : 0x%08X\n", (uint32_t)addr, dwc_read_reg32(addr));
3205
3206	addr=&core_if->dev_if->dev_global_regs->deachint;
3207	DWC_PRINT("DEACHINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3208	addr=&core_if->dev_if->dev_global_regs->deachintmsk;
3209	DWC_PRINT("DEACHINTMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3210
3211	for (i=0; i<= core_if->dev_if->num_in_eps; i++) {
3212		addr=&core_if->dev_if->dev_global_regs->diepeachintmsk[i];
3213		DWC_PRINT("DIEPEACHINTMSK[%d]	 @0x%08X : 0x%08X\n", i, (uint32_t)addr, dwc_read_reg32(addr));
3214	}
3215
3216
3217	for (i=0; i<= core_if->dev_if->num_out_eps; i++) {
3218		addr=&core_if->dev_if->dev_global_regs->doepeachintmsk[i];
3219		DWC_PRINT("DOEPEACHINTMSK[%d]	 @0x%08X : 0x%08X\n", i, (uint32_t)addr, dwc_read_reg32(addr));
3220	}
3221
3222	for (i=0; i<= core_if->dev_if->num_in_eps; i++) {
3223		DWC_PRINT("Device IN EP %d Registers\n", i);
3224		addr=&core_if->dev_if->in_ep_regs[i]->diepctl;
3225		DWC_PRINT("DIEPCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3226		addr=&core_if->dev_if->in_ep_regs[i]->diepint;
3227		DWC_PRINT("DIEPINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3228		addr=&core_if->dev_if->in_ep_regs[i]->dieptsiz;
3229		DWC_PRINT("DIETSIZ	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3230		addr=&core_if->dev_if->in_ep_regs[i]->diepdma;
3231		DWC_PRINT("DIEPDMA	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3232		addr=&core_if->dev_if->in_ep_regs[i]->dtxfsts;
3233		DWC_PRINT("DTXFSTS	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3234		addr=&core_if->dev_if->in_ep_regs[i]->diepdmab;
3235		DWC_PRINT("DIEPDMAB	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3236	}
3237
3238
3239	for (i=0; i<= core_if->dev_if->num_out_eps; i++) {
3240		DWC_PRINT("Device OUT EP %d Registers\n", i);
3241		addr=&core_if->dev_if->out_ep_regs[i]->doepctl;
3242		DWC_PRINT("DOEPCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3243		addr=&core_if->dev_if->out_ep_regs[i]->doepfn;
3244		DWC_PRINT("DOEPFN	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3245		addr=&core_if->dev_if->out_ep_regs[i]->doepint;
3246		DWC_PRINT("DOEPINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3247		addr=&core_if->dev_if->out_ep_regs[i]->doeptsiz;
3248		DWC_PRINT("DOETSIZ	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3249		addr=&core_if->dev_if->out_ep_regs[i]->doepdma;
3250		DWC_PRINT("DOEPDMA	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3251		addr=&core_if->dev_if->out_ep_regs[i]->doepdmab;
3252		DWC_PRINT("DOEPDMAB	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3253
3254	}
3255
3256
3257
3258	return;
3259}
3260
3261/**
3262 * This functions reads the SPRAM and prints its content
3263 *
3264 * @param core_if Programming view of DWC_otg controller.
3265 */
3266void dwc_otg_dump_spram(dwc_otg_core_if_t *core_if)
3267{
3268	volatile uint8_t *addr, *start_addr, *end_addr;
3269
3270	DWC_PRINT("SPRAM Data:\n");
3271	start_addr = (void*)core_if->core_global_regs;
3272	DWC_PRINT("Base Address: 0x%8X\n", (uint32_t)start_addr);
3273	start_addr += 0x00028000;
3274	end_addr=(void*)core_if->core_global_regs;
3275	end_addr += 0x000280e0;
3276
3277	for(addr = start_addr; addr < end_addr; addr+=16)
3278	{
3279		DWC_PRINT("0x%8X:\t%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\n", (uint32_t)addr,
3280			addr[0],
3281			addr[1],
3282			addr[2],
3283			addr[3],
3284			addr[4],
3285			addr[5],
3286			addr[6],
3287			addr[7],
3288			addr[8],
3289			addr[9],
3290			addr[10],
3291			addr[11],
3292			addr[12],
3293			addr[13],
3294			addr[14],
3295			addr[15]
3296			);
3297	}
3298
3299	return;
3300}
3301/**
3302 * This function reads the host registers and prints them
3303 *
3304 * @param core_if Programming view of DWC_otg controller.
3305 */
3306void dwc_otg_dump_host_registers(dwc_otg_core_if_t *core_if)
3307{
3308	int i;
3309	volatile uint32_t *addr;
3310
3311	DWC_PRINT("Host Global Registers\n");
3312	addr=&core_if->host_if->host_global_regs->hcfg;
3313	DWC_PRINT("HCFG		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3314	addr=&core_if->host_if->host_global_regs->hfir;
3315	DWC_PRINT("HFIR		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3316	addr=&core_if->host_if->host_global_regs->hfnum;
3317	DWC_PRINT("HFNUM	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3318	addr=&core_if->host_if->host_global_regs->hptxsts;
3319	DWC_PRINT("HPTXSTS	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3320	addr=&core_if->host_if->host_global_regs->haint;
3321	DWC_PRINT("HAINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3322	addr=&core_if->host_if->host_global_regs->haintmsk;
3323	DWC_PRINT("HAINTMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3324	addr=core_if->host_if->hprt0;
3325	DWC_PRINT("HPRT0	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3326
3327	for (i=0; i<core_if->core_params->host_channels; i++)
3328	{
3329		DWC_PRINT("Host Channel %d Specific Registers\n", i);
3330		addr=&core_if->host_if->hc_regs[i]->hcchar;
3331		DWC_PRINT("HCCHAR	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3332		addr=&core_if->host_if->hc_regs[i]->hcsplt;
3333		DWC_PRINT("HCSPLT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3334		addr=&core_if->host_if->hc_regs[i]->hcint;
3335		DWC_PRINT("HCINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3336		addr=&core_if->host_if->hc_regs[i]->hcintmsk;
3337		DWC_PRINT("HCINTMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3338		addr=&core_if->host_if->hc_regs[i]->hctsiz;
3339		DWC_PRINT("HCTSIZ	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3340		addr=&core_if->host_if->hc_regs[i]->hcdma;
3341		DWC_PRINT("HCDMA	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3342	}
3343	return;
3344}
3345
3346/**
3347 * This function reads the core global registers and prints them
3348 *
3349 * @param core_if Programming view of DWC_otg controller.
3350 */
3351void dwc_otg_dump_global_registers(dwc_otg_core_if_t *core_if)
3352{
3353	int i;
3354	volatile uint32_t *addr;
3355
3356	DWC_PRINT("Core Global Registers\n");
3357	addr=&core_if->core_global_regs->gotgctl;
3358	DWC_PRINT("GOTGCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3359	addr=&core_if->core_global_regs->gotgint;
3360	DWC_PRINT("GOTGINT	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3361	addr=&core_if->core_global_regs->gahbcfg;
3362	DWC_PRINT("GAHBCFG	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3363	addr=&core_if->core_global_regs->gusbcfg;
3364	DWC_PRINT("GUSBCFG	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3365	addr=&core_if->core_global_regs->grstctl;
3366	DWC_PRINT("GRSTCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3367	addr=&core_if->core_global_regs->gintsts;
3368	DWC_PRINT("GINTSTS	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3369	addr=&core_if->core_global_regs->gintmsk;
3370	DWC_PRINT("GINTMSK	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3371	addr=&core_if->core_global_regs->grxstsr;
3372	DWC_PRINT("GRXSTSR	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3373	//addr=&core_if->core_global_regs->grxstsp;
3374	//DWC_PRINT("GRXSTSP   @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3375	addr=&core_if->core_global_regs->grxfsiz;
3376	DWC_PRINT("GRXFSIZ	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3377	addr=&core_if->core_global_regs->gnptxfsiz;
3378	DWC_PRINT("GNPTXFSIZ @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3379	addr=&core_if->core_global_regs->gnptxsts;
3380	DWC_PRINT("GNPTXSTS	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3381	addr=&core_if->core_global_regs->gi2cctl;
3382	DWC_PRINT("GI2CCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3383	addr=&core_if->core_global_regs->gpvndctl;
3384	DWC_PRINT("GPVNDCTL	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3385	addr=&core_if->core_global_regs->ggpio;
3386	DWC_PRINT("GGPIO	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3387	addr=&core_if->core_global_regs->guid;
3388	DWC_PRINT("GUID		 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3389	addr=&core_if->core_global_regs->gsnpsid;
3390	DWC_PRINT("GSNPSID	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3391	addr=&core_if->core_global_regs->ghwcfg1;
3392	DWC_PRINT("GHWCFG1	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3393	addr=&core_if->core_global_regs->ghwcfg2;
3394	DWC_PRINT("GHWCFG2	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3395	addr=&core_if->core_global_regs->ghwcfg3;
3396	DWC_PRINT("GHWCFG3	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3397	addr=&core_if->core_global_regs->ghwcfg4;
3398	DWC_PRINT("GHWCFG4	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3399	addr=&core_if->core_global_regs->hptxfsiz;
3400	DWC_PRINT("HPTXFSIZ	 @0x%08X : 0x%08X\n",(uint32_t)addr,dwc_read_reg32(addr));
3401
3402	for (i=0; i<core_if->hwcfg4.b.num_dev_perio_in_ep; i++)
3403	{
3404		addr=&core_if->core_global_regs->dptxfsiz_dieptxf[i];
3405		DWC_PRINT("DPTXFSIZ[%d] @0x%08X : 0x%08X\n",i,(uint32_t)addr,dwc_read_reg32(addr));
3406	}
3407}
3408
3409/**
3410 * Flush a Tx FIFO.
3411 *
3412 * @param core_if Programming view of DWC_otg controller.
3413 * @param num Tx FIFO to flush.
3414 */
3415void dwc_otg_flush_tx_fifo(dwc_otg_core_if_t *core_if,
3416					   const int num)
3417{
3418	dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs;
3419	volatile grstctl_t greset = { .d32 = 0};
3420	int count = 0;
3421
3422	DWC_DEBUGPL((DBG_CIL|DBG_PCDV), "Flush Tx FIFO %d\n", num);
3423
3424	greset.b.txfflsh = 1;
3425	greset.b.txfnum = num;
3426	dwc_write_reg32(&global_regs->grstctl, greset.d32);
3427
3428	do {
3429		greset.d32 = dwc_read_reg32(&global_regs->grstctl);
3430		if (++count > 10000) {
3431			DWC_WARN("%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n",
3432					  __func__, greset.d32,
3433			dwc_read_reg32(&global_regs->gnptxsts));
3434			break;
3435		}
3436	}
3437	while (greset.b.txfflsh == 1);
3438
3439	/* Wait for 3 PHY Clocks*/
3440	UDELAY(1);
3441}
3442
3443/**
3444 * Flush Rx FIFO.
3445 *
3446 * @param core_if Programming view of DWC_otg controller.
3447 */
3448void dwc_otg_flush_rx_fifo(dwc_otg_core_if_t *core_if)
3449{
3450	dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs;
3451	volatile grstctl_t greset = { .d32 = 0};
3452	int count = 0;
3453
3454	DWC_DEBUGPL((DBG_CIL|DBG_PCDV), "%s\n", __func__);
3455	/*
3456	 *
3457	 */
3458	greset.b.rxfflsh = 1;
3459	dwc_write_reg32(&global_regs->grstctl, greset.d32);
3460
3461	do {
3462		greset.d32 = dwc_read_reg32(&global_regs->grstctl);
3463		if (++count > 10000) {
3464			DWC_WARN("%s() HANG! GRSTCTL=%0x\n", __func__,
3465				greset.d32);
3466			break;
3467		}
3468	}
3469	while (greset.b.rxfflsh == 1);
3470
3471	/* Wait for 3 PHY Clocks*/
3472	UDELAY(1);
3473}
3474
3475/**
3476 * Do core a soft reset of the core.  Be careful with this because it
3477 * resets all the internal state machines of the core.
3478 */
3479void dwc_otg_core_reset(dwc_otg_core_if_t *core_if)
3480{
3481	dwc_otg_core_global_regs_t *global_regs = core_if->core_global_regs;
3482	volatile grstctl_t greset = { .d32 = 0};
3483	int count = 0;
3484
3485	DWC_DEBUGPL(DBG_CILV, "%s\n", __func__);
3486	/* Wait for AHB master IDLE state. */
3487	do {
3488		UDELAY(10);
3489		greset.d32 = dwc_read_reg32(&global_regs->grstctl);
3490		if (++count > 100000) {
3491			DWC_WARN("%s() HANG! AHB Idle GRSTCTL=%0x\n", __func__,
3492				greset.d32);
3493			return;
3494		}
3495	}
3496	while (greset.b.ahbidle == 0);
3497
3498	/* Core Soft Reset */
3499	count = 0;
3500	greset.b.csftrst = 1;
3501	dwc_write_reg32(&global_regs->grstctl, greset.d32);
3502	do {
3503		greset.d32 = dwc_read_reg32(&global_regs->grstctl);
3504		if (++count > 10000) {
3505			DWC_WARN("%s() HANG! Soft Reset GRSTCTL=%0x\n", __func__,
3506				greset.d32);
3507			break;
3508		}
3509	}
3510	while (greset.b.csftrst == 1);
3511
3512	/* Wait for 3 PHY Clocks*/
3513	MDELAY(100);
3514}
3515
3516
3517
3518/**
3519 * Register HCD callbacks.	The callbacks are used to start and stop
3520 * the HCD for interrupt processing.
3521 *
3522 * @param core_if Programming view of DWC_otg controller.
3523 * @param cb the HCD callback structure.
3524 * @param p pointer to be passed to callback function (usb_hcd*).
3525 */
3526void dwc_otg_cil_register_hcd_callbacks(dwc_otg_core_if_t *core_if,
3527						dwc_otg_cil_callbacks_t *cb,
3528						void *p)
3529{
3530	core_if->hcd_cb = cb;
3531	cb->p = p;
3532}
3533
3534/**
3535 * Register PCD callbacks.	The callbacks are used to start and stop
3536 * the PCD for interrupt processing.
3537 *
3538 * @param core_if Programming view of DWC_otg controller.
3539 * @param cb the PCD callback structure.
3540 * @param p pointer to be passed to callback function (pcd*).
3541 */
3542void dwc_otg_cil_register_pcd_callbacks(dwc_otg_core_if_t *core_if,
3543						dwc_otg_cil_callbacks_t *cb,
3544						void *p)
3545{
3546	core_if->pcd_cb = cb;
3547	cb->p = p;
3548}
3549
3550#ifdef DWC_EN_ISOC
3551
3552/**
3553 * This function writes isoc data per 1 (micro)frame into tx fifo
3554 *
3555 * @param core_if Programming view of DWC_otg controller.
3556 * @param ep The EP to start the transfer on.
3557 *
3558 */
3559void write_isoc_frame_data(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
3560{
3561	dwc_otg_dev_in_ep_regs_t *ep_regs;
3562	dtxfsts_data_t txstatus = {.d32 = 0};
3563	uint32_t len = 0;
3564	uint32_t dwords;
3565
3566	ep->xfer_len = ep->data_per_frame;
3567	ep->xfer_count = 0;
3568
3569	ep_regs = core_if->dev_if->in_ep_regs[ep->num];
3570
3571	len = ep->xfer_len - ep->xfer_count;
3572
3573	if (len > ep->maxpacket) {
3574		len = ep->maxpacket;
3575	}
3576
3577	dwords = (len + 3)/4;
3578
3579	/* While there is space in the queue and space in the FIFO and
3580	 * More data to tranfer, Write packets to the Tx FIFO */
3581	txstatus.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dtxfsts);
3582	DWC_DEBUGPL(DBG_PCDV, "b4 dtxfsts[%d]=0x%08x\n",ep->num,txstatus.d32);
3583
3584	while  (txstatus.b.txfspcavail > dwords &&
3585		ep->xfer_count < ep->xfer_len &&
3586		ep->xfer_len != 0) {
3587		/* Write the FIFO */
3588		dwc_otg_ep_write_packet(core_if, ep, 0);
3589
3590		len = ep->xfer_len - ep->xfer_count;
3591		if (len > ep->maxpacket) {
3592			len = ep->maxpacket;
3593		}
3594
3595		dwords = (len + 3)/4;
3596		txstatus.d32 = dwc_read_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dtxfsts);
3597		DWC_DEBUGPL(DBG_PCDV,"dtxfsts[%d]=0x%08x\n", ep->num, txstatus.d32);
3598	}
3599}
3600
3601
3602/**
3603 * This function initializes a descriptor chain for Isochronous transfer
3604 *
3605 * @param core_if Programming view of DWC_otg controller.
3606 * @param ep The EP to start the transfer on.
3607 *
3608 */
3609void dwc_otg_iso_ep_start_frm_transfer(dwc_otg_core_if_t *core_if, dwc_ep_t *ep)
3610{
3611	deptsiz_data_t		deptsiz = { .d32 = 0 };
3612	depctl_data_t 		depctl = { .d32 = 0 };
3613	dsts_data_t		dsts = { .d32 = 0 };
3614	volatile uint32_t 	*addr;
3615
3616	if(ep->is_in) {
3617		addr = &core_if->dev_if->in_ep_regs[ep->num]->diepctl;
3618	} else {
3619		addr = &core_if->dev_if->out_ep_regs[ep->num]->doepctl;
3620	}
3621
3622	ep->xfer_len = ep->data_per_frame;
3623	ep->xfer_count = 0;
3624	ep->xfer_buff = ep->cur_pkt_addr;
3625	ep->dma_addr = ep->cur_pkt_dma_addr;
3626
3627	if(ep->is_in) {
3628		/* Program the transfer size and packet count
3629		 *	as follows: xfersize = N * maxpacket +
3630		 *	short_packet pktcnt = N + (short_packet
3631		 *	exist ? 1 : 0)
3632		 */
3633		deptsiz.b.xfersize = ep->xfer_len;
3634		deptsiz.b.pktcnt =
3635			(ep->xfer_len - 1 + ep->maxpacket) /
3636			ep->maxpacket;
3637		deptsiz.b.mc = deptsiz.b.pktcnt;
3638		dwc_write_reg32(&core_if->dev_if->in_ep_regs[ep->num]->dieptsiz, deptsiz.d32);
3639
3640		/* Write the DMA register */
3641		if (core_if->dma_enable) {
3642			dwc_write_reg32 (&(core_if->dev_if->in_ep_regs[ep->num]->diepdma), (uint32_t)ep->dma_addr);
3643		}
3644	} else {
3645		deptsiz.b.pktcnt =
3646				(ep->xfer_len + (ep->maxpacket - 1)) /
3647				ep->maxpacket;
3648		deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket;
3649
3650		dwc_write_reg32(&core_if->dev_if->out_ep_regs[ep->num]->doeptsiz, deptsiz.d32);
3651
3652		if (core_if->dma_enable) {
3653				dwc_write_reg32 (&(core_if->dev_if->out_ep_regs[ep->num]->doepdma),
3654					(uint32_t)ep->dma_addr);
3655		}
3656	}
3657
3658
3659	/** Enable endpoint, clear nak  */
3660
3661	depctl.d32 = 0;
3662	if(ep->bInterval == 1) {
3663		dsts.d32 = dwc_read_reg32(&core_if->dev_if->dev_global_regs->dsts);
3664		ep->next_frame = dsts.b.soffn + ep->bInterval;
3665
3666		if(ep->next_frame & 0x1) {
3667			depctl.b.setd1pid = 1;
3668		} else {
3669			depctl.b.setd0pid = 1;
3670		}
3671	} else {
3672		ep->next_frame += ep->bInterval;
3673
3674		if(ep->next_frame & 0x1) {
3675			depctl.b.setd1pid = 1;
3676		} else {
3677			depctl.b.setd0pid = 1;
3678		}
3679	}
3680	depctl.b.epena = 1;
3681	depctl.b.cnak = 1;
3682
3683	dwc_modify_reg32(addr, 0, depctl.d32);
3684	depctl.d32 = dwc_read_reg32(addr);
3685
3686	if(ep->is_in && core_if->dma_enable == 0) {
3687		write_isoc_frame_data(core_if, ep);
3688	}
3689
3690}
3691
3692#endif //DWC_EN_ISOC
3693