ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / drivers / usb / dwc2 / core.c
1 /*
2  * core.c - DesignWare HS OTG Controller common routines
3  *
4  * Copyright (C) 2004-2013 Synopsys, Inc.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions, and the following disclaimer,
11  *    without modification.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The names of the above-listed copyright holders may not be used
16  *    to endorse or promote products derived from this software without
17  *    specific prior written permission.
18  *
19  * ALTERNATIVELY, this software may be distributed under the terms of the
20  * GNU General Public License ("GPL") as published by the Free Software
21  * Foundation; either version 2 of the License, or (at your option) any
22  * later version.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
26  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35  */
36
37 /*
38  * The Core code provides basic services for accessing and managing the
39  * DWC_otg hardware. These services are used by both the Host Controller
40  * Driver and the Peripheral Controller Driver.
41  */
42 #include <linux/kernel.h>
43 #include <linux/module.h>
44 #include <linux/moduleparam.h>
45 #include <linux/spinlock.h>
46 #include <linux/interrupt.h>
47 #include <linux/dma-mapping.h>
48 #include <linux/delay.h>
49 #include <linux/io.h>
50 #include <linux/slab.h>
51 #include <linux/usb.h>
52
53 #include <linux/usb/hcd.h>
54 #include <linux/usb/ch11.h>
55
56 #include "core.h"
57 #include "hcd.h"
58
59 /**
60  * dwc2_backup_global_registers() - Backup global controller registers.
61  * When suspending usb bus, registers needs to be backuped
62  * if controller power is disabled once suspended.
63  *
64  * @hsotg: Programming view of the DWC_otg controller
65  */
66 static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg)
67 {
68         struct dwc2_gregs_backup *gr;
69         int i;
70
71         /* Backup global regs */
72         gr = &hsotg->gr_backup;
73
74         gr->gotgctl = dwc2_readl(hsotg->regs + GOTGCTL);
75         gr->gintmsk = dwc2_readl(hsotg->regs + GINTMSK);
76         gr->gahbcfg = dwc2_readl(hsotg->regs + GAHBCFG);
77         gr->gusbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
78         gr->grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ);
79         gr->gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
80         gr->hptxfsiz = dwc2_readl(hsotg->regs + HPTXFSIZ);
81         gr->gdfifocfg = dwc2_readl(hsotg->regs + GDFIFOCFG);
82         for (i = 0; i < MAX_EPS_CHANNELS; i++)
83                 gr->dtxfsiz[i] = dwc2_readl(hsotg->regs + DPTXFSIZN(i));
84
85         gr->valid = true;
86         return 0;
87 }
88
89 /**
90  * dwc2_restore_global_registers() - Restore controller global registers.
91  * When resuming usb bus, device registers needs to be restored
92  * if controller power were disabled.
93  *
94  * @hsotg: Programming view of the DWC_otg controller
95  */
96 static int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg)
97 {
98         struct dwc2_gregs_backup *gr;
99         int i;
100
101         dev_dbg(hsotg->dev, "%s\n", __func__);
102
103         /* Restore global regs */
104         gr = &hsotg->gr_backup;
105         if (!gr->valid) {
106                 dev_err(hsotg->dev, "%s: no global registers to restore\n",
107                                 __func__);
108                 return -EINVAL;
109         }
110         gr->valid = false;
111
112         dwc2_writel(0xffffffff, hsotg->regs + GINTSTS);
113         dwc2_writel(gr->gotgctl, hsotg->regs + GOTGCTL);
114         dwc2_writel(gr->gintmsk, hsotg->regs + GINTMSK);
115         dwc2_writel(gr->gusbcfg, hsotg->regs + GUSBCFG);
116         dwc2_writel(gr->gahbcfg, hsotg->regs + GAHBCFG);
117         dwc2_writel(gr->grxfsiz, hsotg->regs + GRXFSIZ);
118         dwc2_writel(gr->gnptxfsiz, hsotg->regs + GNPTXFSIZ);
119         dwc2_writel(gr->hptxfsiz, hsotg->regs + HPTXFSIZ);
120         dwc2_writel(gr->gdfifocfg, hsotg->regs + GDFIFOCFG);
121         for (i = 0; i < MAX_EPS_CHANNELS; i++)
122                 dwc2_writel(gr->dtxfsiz[i], hsotg->regs + DPTXFSIZN(i));
123
124         return 0;
125 }
126
127 /**
128  * dwc2_exit_hibernation() - Exit controller from Partial Power Down.
129  *
130  * @hsotg: Programming view of the DWC_otg controller
131  * @restore: Controller registers need to be restored
132  */
133 int dwc2_exit_hibernation(struct dwc2_hsotg *hsotg, bool restore)
134 {
135         u32 pcgcctl;
136         int ret = 0;
137
138         if (!hsotg->core_params->hibernation)
139                 return -ENOTSUPP;
140
141         pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
142         pcgcctl &= ~PCGCTL_STOPPCLK;
143         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
144
145         pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
146         pcgcctl &= ~PCGCTL_PWRCLMP;
147         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
148
149         pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
150         pcgcctl &= ~PCGCTL_RSTPDWNMODULE;
151         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
152
153         udelay(100);
154         if (restore) {
155                 ret = dwc2_restore_global_registers(hsotg);
156                 if (ret) {
157                         dev_err(hsotg->dev, "%s: failed to restore registers\n",
158                                         __func__);
159                         return ret;
160                 }
161                 if (dwc2_is_host_mode(hsotg)) {
162                         ret = dwc2_restore_host_registers(hsotg);
163                         if (ret) {
164                                 dev_err(hsotg->dev, "%s: failed to restore host registers\n",
165                                                 __func__);
166                                 return ret;
167                         }
168                 } else {
169                         ret = dwc2_restore_device_registers(hsotg);
170                         if (ret) {
171                                 dev_err(hsotg->dev, "%s: failed to restore device registers\n",
172                                                 __func__);
173                                 return ret;
174                         }
175                 }
176         }
177
178         return ret;
179 }
180
181 /**
182  * dwc2_enter_hibernation() - Put controller in Partial Power Down.
183  *
184  * @hsotg: Programming view of the DWC_otg controller
185  */
186 int dwc2_enter_hibernation(struct dwc2_hsotg *hsotg)
187 {
188         u32 pcgcctl;
189         int ret = 0;
190
191         if (!hsotg->core_params->hibernation)
192                 return -ENOTSUPP;
193
194         /* Backup all registers */
195         ret = dwc2_backup_global_registers(hsotg);
196         if (ret) {
197                 dev_err(hsotg->dev, "%s: failed to backup global registers\n",
198                                 __func__);
199                 return ret;
200         }
201
202         if (dwc2_is_host_mode(hsotg)) {
203                 ret = dwc2_backup_host_registers(hsotg);
204                 if (ret) {
205                         dev_err(hsotg->dev, "%s: failed to backup host registers\n",
206                                         __func__);
207                         return ret;
208                 }
209         } else {
210                 ret = dwc2_backup_device_registers(hsotg);
211                 if (ret) {
212                         dev_err(hsotg->dev, "%s: failed to backup device registers\n",
213                                         __func__);
214                         return ret;
215                 }
216         }
217
218         /*
219          * Clear any pending interrupts since dwc2 will not be able to
220          * clear them after entering hibernation.
221          */
222         dwc2_writel(0xffffffff, hsotg->regs + GINTSTS);
223
224         /* Put the controller in low power state */
225         pcgcctl = dwc2_readl(hsotg->regs + PCGCTL);
226
227         pcgcctl |= PCGCTL_PWRCLMP;
228         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
229         ndelay(20);
230
231         pcgcctl |= PCGCTL_RSTPDWNMODULE;
232         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
233         ndelay(20);
234
235         pcgcctl |= PCGCTL_STOPPCLK;
236         dwc2_writel(pcgcctl, hsotg->regs + PCGCTL);
237
238         return ret;
239 }
240
241 /*
242  * Do core a soft reset of the core.  Be careful with this because it
243  * resets all the internal state machines of the core.
244  */
245 int dwc2_core_reset(struct dwc2_hsotg *hsotg)
246 {
247         u32 greset;
248         int count = 0;
249
250         dev_vdbg(hsotg->dev, "%s()\n", __func__);
251
252         /* Core Soft Reset */
253         greset = dwc2_readl(hsotg->regs + GRSTCTL);
254         greset |= GRSTCTL_CSFTRST;
255         dwc2_writel(greset, hsotg->regs + GRSTCTL);
256         do {
257                 udelay(1);
258                 greset = dwc2_readl(hsotg->regs + GRSTCTL);
259                 if (++count > 50) {
260                         dev_warn(hsotg->dev,
261                                  "%s() HANG! Soft Reset GRSTCTL=%0x\n",
262                                  __func__, greset);
263                         return -EBUSY;
264                 }
265         } while (greset & GRSTCTL_CSFTRST);
266
267         /* Wait for AHB master IDLE state */
268         count = 0;
269         do {
270                 udelay(1);
271                 greset = dwc2_readl(hsotg->regs + GRSTCTL);
272                 if (++count > 50) {
273                         dev_warn(hsotg->dev,
274                                  "%s() HANG! AHB Idle GRSTCTL=%0x\n",
275                                  __func__, greset);
276                         return -EBUSY;
277                 }
278         } while (!(greset & GRSTCTL_AHBIDLE));
279
280         return 0;
281 }
282
283 /*
284  * Force the mode of the controller.
285  *
286  * Forcing the mode is needed for two cases:
287  *
288  * 1) If the dr_mode is set to either HOST or PERIPHERAL we force the
289  * controller to stay in a particular mode regardless of ID pin
290  * changes. We do this usually after a core reset.
291  *
292  * 2) During probe we want to read reset values of the hw
293  * configuration registers that are only available in either host or
294  * device mode. We may need to force the mode if the current mode does
295  * not allow us to access the register in the mode that we want.
296  *
297  * In either case it only makes sense to force the mode if the
298  * controller hardware is OTG capable.
299  *
300  * Checks are done in this function to determine whether doing a force
301  * would be valid or not.
302  *
303  * If a force is done, it requires a 25ms delay to take effect.
304  *
305  * Returns true if the mode was forced.
306  */
307 static bool dwc2_force_mode(struct dwc2_hsotg *hsotg, bool host)
308 {
309         u32 gusbcfg;
310         u32 set;
311         u32 clear;
312
313         dev_dbg(hsotg->dev, "Forcing mode to %s\n", host ? "host" : "device");
314
315         /*
316          * Force mode has no effect if the hardware is not OTG.
317          */
318         if (!dwc2_hw_is_otg(hsotg))
319                 return false;
320
321         /*
322          * If dr_mode is either peripheral or host only, there is no
323          * need to ever force the mode to the opposite mode.
324          */
325         if (WARN_ON(host && hsotg->dr_mode == USB_DR_MODE_PERIPHERAL))
326                 return false;
327
328         if (WARN_ON(!host && hsotg->dr_mode == USB_DR_MODE_HOST))
329                 return false;
330
331         gusbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
332
333         set = host ? GUSBCFG_FORCEHOSTMODE : GUSBCFG_FORCEDEVMODE;
334         clear = host ? GUSBCFG_FORCEDEVMODE : GUSBCFG_FORCEHOSTMODE;
335
336         gusbcfg &= ~clear;
337         gusbcfg |= set;
338         dwc2_writel(gusbcfg, hsotg->regs + GUSBCFG);
339
340         msleep(25);
341         return true;
342 }
343
344 /*
345  * Clears the force mode bits.
346  */
347 static void dwc2_clear_force_mode(struct dwc2_hsotg *hsotg)
348 {
349         u32 gusbcfg;
350
351         gusbcfg = dwc2_readl(hsotg->regs + GUSBCFG);
352         gusbcfg &= ~GUSBCFG_FORCEHOSTMODE;
353         gusbcfg &= ~GUSBCFG_FORCEDEVMODE;
354         dwc2_writel(gusbcfg, hsotg->regs + GUSBCFG);
355
356         /*
357          * NOTE: This long sleep is _very_ important, otherwise the core will
358          * not stay in host mode after a connector ID change!
359          */
360         msleep(25);
361 }
362
363 /*
364  * Sets or clears force mode based on the dr_mode parameter.
365  */
366 void dwc2_force_dr_mode(struct dwc2_hsotg *hsotg)
367 {
368         switch (hsotg->dr_mode) {
369         case USB_DR_MODE_HOST:
370                 dwc2_force_mode(hsotg, true);
371                 break;
372         case USB_DR_MODE_PERIPHERAL:
373                 dwc2_force_mode(hsotg, false);
374                 break;
375         case USB_DR_MODE_OTG:
376                 dwc2_clear_force_mode(hsotg);
377                 break;
378         default:
379                 dev_warn(hsotg->dev, "%s() Invalid dr_mode=%d\n",
380                          __func__, hsotg->dr_mode);
381                 break;
382         }
383
384         /*
385          * NOTE: This is required for some rockchip soc based
386          * platforms.
387          */
388         msleep(50);
389 }
390
391 /*
392  * Do core a soft reset of the core.  Be careful with this because it
393  * resets all the internal state machines of the core.
394  *
395  * Additionally this will apply force mode as per the hsotg->dr_mode
396  * parameter.
397  */
398 int dwc2_core_reset_and_force_dr_mode(struct dwc2_hsotg *hsotg)
399 {
400         int retval;
401
402         retval = dwc2_core_reset(hsotg);
403         if (retval)
404                 return retval;
405
406         dwc2_force_dr_mode(hsotg);
407         return 0;
408 }
409
410 /**
411  * dwc2_dump_host_registers() - Prints the host registers
412  *
413  * @hsotg: Programming view of DWC_otg controller
414  *
415  * NOTE: This function will be removed once the peripheral controller code
416  * is integrated and the driver is stable
417  */
418 void dwc2_dump_host_registers(struct dwc2_hsotg *hsotg)
419 {
420 #ifdef DEBUG
421         u32 __iomem *addr;
422         int i;
423
424         dev_dbg(hsotg->dev, "Host Global Registers\n");
425         addr = hsotg->regs + HCFG;
426         dev_dbg(hsotg->dev, "HCFG        @0x%08lX : 0x%08X\n",
427                 (unsigned long)addr, dwc2_readl(addr));
428         addr = hsotg->regs + HFIR;
429         dev_dbg(hsotg->dev, "HFIR        @0x%08lX : 0x%08X\n",
430                 (unsigned long)addr, dwc2_readl(addr));
431         addr = hsotg->regs + HFNUM;
432         dev_dbg(hsotg->dev, "HFNUM       @0x%08lX : 0x%08X\n",
433                 (unsigned long)addr, dwc2_readl(addr));
434         addr = hsotg->regs + HPTXSTS;
435         dev_dbg(hsotg->dev, "HPTXSTS     @0x%08lX : 0x%08X\n",
436                 (unsigned long)addr, dwc2_readl(addr));
437         addr = hsotg->regs + HAINT;
438         dev_dbg(hsotg->dev, "HAINT       @0x%08lX : 0x%08X\n",
439                 (unsigned long)addr, dwc2_readl(addr));
440         addr = hsotg->regs + HAINTMSK;
441         dev_dbg(hsotg->dev, "HAINTMSK    @0x%08lX : 0x%08X\n",
442                 (unsigned long)addr, dwc2_readl(addr));
443         if (hsotg->core_params->dma_desc_enable > 0) {
444                 addr = hsotg->regs + HFLBADDR;
445                 dev_dbg(hsotg->dev, "HFLBADDR @0x%08lX : 0x%08X\n",
446                         (unsigned long)addr, dwc2_readl(addr));
447         }
448
449         addr = hsotg->regs + HPRT0;
450         dev_dbg(hsotg->dev, "HPRT0       @0x%08lX : 0x%08X\n",
451                 (unsigned long)addr, dwc2_readl(addr));
452
453         for (i = 0; i < hsotg->core_params->host_channels; i++) {
454                 dev_dbg(hsotg->dev, "Host Channel %d Specific Registers\n", i);
455                 addr = hsotg->regs + HCCHAR(i);
456                 dev_dbg(hsotg->dev, "HCCHAR      @0x%08lX : 0x%08X\n",
457                         (unsigned long)addr, dwc2_readl(addr));
458                 addr = hsotg->regs + HCSPLT(i);
459                 dev_dbg(hsotg->dev, "HCSPLT      @0x%08lX : 0x%08X\n",
460                         (unsigned long)addr, dwc2_readl(addr));
461                 addr = hsotg->regs + HCINT(i);
462                 dev_dbg(hsotg->dev, "HCINT       @0x%08lX : 0x%08X\n",
463                         (unsigned long)addr, dwc2_readl(addr));
464                 addr = hsotg->regs + HCINTMSK(i);
465                 dev_dbg(hsotg->dev, "HCINTMSK    @0x%08lX : 0x%08X\n",
466                         (unsigned long)addr, dwc2_readl(addr));
467                 addr = hsotg->regs + HCTSIZ(i);
468                 dev_dbg(hsotg->dev, "HCTSIZ      @0x%08lX : 0x%08X\n",
469                         (unsigned long)addr, dwc2_readl(addr));
470                 addr = hsotg->regs + HCDMA(i);
471                 dev_dbg(hsotg->dev, "HCDMA       @0x%08lX : 0x%08X\n",
472                         (unsigned long)addr, dwc2_readl(addr));
473                 if (hsotg->core_params->dma_desc_enable > 0) {
474                         addr = hsotg->regs + HCDMAB(i);
475                         dev_dbg(hsotg->dev, "HCDMAB      @0x%08lX : 0x%08X\n",
476                                 (unsigned long)addr, dwc2_readl(addr));
477                 }
478         }
479 #endif
480 }
481
482 /**
483  * dwc2_dump_global_registers() - Prints the core global registers
484  *
485  * @hsotg: Programming view of DWC_otg controller
486  *
487  * NOTE: This function will be removed once the peripheral controller code
488  * is integrated and the driver is stable
489  */
490 void dwc2_dump_global_registers(struct dwc2_hsotg *hsotg)
491 {
492 #ifdef DEBUG
493         u32 __iomem *addr;
494
495         dev_dbg(hsotg->dev, "Core Global Registers\n");
496         addr = hsotg->regs + GOTGCTL;
497         dev_dbg(hsotg->dev, "GOTGCTL     @0x%08lX : 0x%08X\n",
498                 (unsigned long)addr, dwc2_readl(addr));
499         addr = hsotg->regs + GOTGINT;
500         dev_dbg(hsotg->dev, "GOTGINT     @0x%08lX : 0x%08X\n",
501                 (unsigned long)addr, dwc2_readl(addr));
502         addr = hsotg->regs + GAHBCFG;
503         dev_dbg(hsotg->dev, "GAHBCFG     @0x%08lX : 0x%08X\n",
504                 (unsigned long)addr, dwc2_readl(addr));
505         addr = hsotg->regs + GUSBCFG;
506         dev_dbg(hsotg->dev, "GUSBCFG     @0x%08lX : 0x%08X\n",
507                 (unsigned long)addr, dwc2_readl(addr));
508         addr = hsotg->regs + GRSTCTL;
509         dev_dbg(hsotg->dev, "GRSTCTL     @0x%08lX : 0x%08X\n",
510                 (unsigned long)addr, dwc2_readl(addr));
511         addr = hsotg->regs + GINTSTS;
512         dev_dbg(hsotg->dev, "GINTSTS     @0x%08lX : 0x%08X\n",
513                 (unsigned long)addr, dwc2_readl(addr));
514         addr = hsotg->regs + GINTMSK;
515         dev_dbg(hsotg->dev, "GINTMSK     @0x%08lX : 0x%08X\n",
516                 (unsigned long)addr, dwc2_readl(addr));
517         addr = hsotg->regs + GRXSTSR;
518         dev_dbg(hsotg->dev, "GRXSTSR     @0x%08lX : 0x%08X\n",
519                 (unsigned long)addr, dwc2_readl(addr));
520         addr = hsotg->regs + GRXFSIZ;
521         dev_dbg(hsotg->dev, "GRXFSIZ     @0x%08lX : 0x%08X\n",
522                 (unsigned long)addr, dwc2_readl(addr));
523         addr = hsotg->regs + GNPTXFSIZ;
524         dev_dbg(hsotg->dev, "GNPTXFSIZ   @0x%08lX : 0x%08X\n",
525                 (unsigned long)addr, dwc2_readl(addr));
526         addr = hsotg->regs + GNPTXSTS;
527         dev_dbg(hsotg->dev, "GNPTXSTS    @0x%08lX : 0x%08X\n",
528                 (unsigned long)addr, dwc2_readl(addr));
529         addr = hsotg->regs + GI2CCTL;
530         dev_dbg(hsotg->dev, "GI2CCTL     @0x%08lX : 0x%08X\n",
531                 (unsigned long)addr, dwc2_readl(addr));
532         addr = hsotg->regs + GPVNDCTL;
533         dev_dbg(hsotg->dev, "GPVNDCTL    @0x%08lX : 0x%08X\n",
534                 (unsigned long)addr, dwc2_readl(addr));
535         addr = hsotg->regs + GGPIO;
536         dev_dbg(hsotg->dev, "GGPIO       @0x%08lX : 0x%08X\n",
537                 (unsigned long)addr, dwc2_readl(addr));
538         addr = hsotg->regs + GUID;
539         dev_dbg(hsotg->dev, "GUID        @0x%08lX : 0x%08X\n",
540                 (unsigned long)addr, dwc2_readl(addr));
541         addr = hsotg->regs + GSNPSID;
542         dev_dbg(hsotg->dev, "GSNPSID     @0x%08lX : 0x%08X\n",
543                 (unsigned long)addr, dwc2_readl(addr));
544         addr = hsotg->regs + GHWCFG1;
545         dev_dbg(hsotg->dev, "GHWCFG1     @0x%08lX : 0x%08X\n",
546                 (unsigned long)addr, dwc2_readl(addr));
547         addr = hsotg->regs + GHWCFG2;
548         dev_dbg(hsotg->dev, "GHWCFG2     @0x%08lX : 0x%08X\n",
549                 (unsigned long)addr, dwc2_readl(addr));
550         addr = hsotg->regs + GHWCFG3;
551         dev_dbg(hsotg->dev, "GHWCFG3     @0x%08lX : 0x%08X\n",
552                 (unsigned long)addr, dwc2_readl(addr));
553         addr = hsotg->regs + GHWCFG4;
554         dev_dbg(hsotg->dev, "GHWCFG4     @0x%08lX : 0x%08X\n",
555                 (unsigned long)addr, dwc2_readl(addr));
556         addr = hsotg->regs + GLPMCFG;
557         dev_dbg(hsotg->dev, "GLPMCFG     @0x%08lX : 0x%08X\n",
558                 (unsigned long)addr, dwc2_readl(addr));
559         addr = hsotg->regs + GPWRDN;
560         dev_dbg(hsotg->dev, "GPWRDN      @0x%08lX : 0x%08X\n",
561                 (unsigned long)addr, dwc2_readl(addr));
562         addr = hsotg->regs + GDFIFOCFG;
563         dev_dbg(hsotg->dev, "GDFIFOCFG   @0x%08lX : 0x%08X\n",
564                 (unsigned long)addr, dwc2_readl(addr));
565         addr = hsotg->regs + HPTXFSIZ;
566         dev_dbg(hsotg->dev, "HPTXFSIZ    @0x%08lX : 0x%08X\n",
567                 (unsigned long)addr, dwc2_readl(addr));
568
569         addr = hsotg->regs + PCGCTL;
570         dev_dbg(hsotg->dev, "PCGCTL      @0x%08lX : 0x%08X\n",
571                 (unsigned long)addr, dwc2_readl(addr));
572 #endif
573 }
574
575 /**
576  * dwc2_flush_tx_fifo() - Flushes a Tx FIFO
577  *
578  * @hsotg: Programming view of DWC_otg controller
579  * @num:   Tx FIFO to flush
580  */
581 void dwc2_flush_tx_fifo(struct dwc2_hsotg *hsotg, const int num)
582 {
583         u32 greset;
584         int count = 0;
585
586         dev_vdbg(hsotg->dev, "Flush Tx FIFO %d\n", num);
587
588         greset = GRSTCTL_TXFFLSH;
589         greset |= num << GRSTCTL_TXFNUM_SHIFT & GRSTCTL_TXFNUM_MASK;
590         dwc2_writel(greset, hsotg->regs + GRSTCTL);
591
592         do {
593                 greset = dwc2_readl(hsotg->regs + GRSTCTL);
594                 if (++count > 10000) {
595                         dev_warn(hsotg->dev,
596                                  "%s() HANG! GRSTCTL=%0x GNPTXSTS=0x%08x\n",
597                                  __func__, greset,
598                                  dwc2_readl(hsotg->regs + GNPTXSTS));
599                         break;
600                 }
601                 udelay(1);
602         } while (greset & GRSTCTL_TXFFLSH);
603
604         /* Wait for at least 3 PHY Clocks */
605         udelay(1);
606 }
607
608 /**
609  * dwc2_flush_rx_fifo() - Flushes the Rx FIFO
610  *
611  * @hsotg: Programming view of DWC_otg controller
612  */
613 void dwc2_flush_rx_fifo(struct dwc2_hsotg *hsotg)
614 {
615         u32 greset;
616         int count = 0;
617
618         dev_vdbg(hsotg->dev, "%s()\n", __func__);
619
620         greset = GRSTCTL_RXFFLSH;
621         dwc2_writel(greset, hsotg->regs + GRSTCTL);
622
623         do {
624                 greset = dwc2_readl(hsotg->regs + GRSTCTL);
625                 if (++count > 10000) {
626                         dev_warn(hsotg->dev, "%s() HANG! GRSTCTL=%0x\n",
627                                  __func__, greset);
628                         break;
629                 }
630                 udelay(1);
631         } while (greset & GRSTCTL_RXFFLSH);
632
633         /* Wait for at least 3 PHY Clocks */
634         udelay(1);
635 }
636
637 #define DWC2_OUT_OF_BOUNDS(a, b, c)     ((a) < (b) || (a) > (c))
638
639 /* Parameter access functions */
640 void dwc2_set_param_otg_cap(struct dwc2_hsotg *hsotg, int val)
641 {
642         int valid = 1;
643
644         switch (val) {
645         case DWC2_CAP_PARAM_HNP_SRP_CAPABLE:
646                 if (hsotg->hw_params.op_mode != GHWCFG2_OP_MODE_HNP_SRP_CAPABLE)
647                         valid = 0;
648                 break;
649         case DWC2_CAP_PARAM_SRP_ONLY_CAPABLE:
650                 switch (hsotg->hw_params.op_mode) {
651                 case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
652                 case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
653                 case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
654                 case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
655                         break;
656                 default:
657                         valid = 0;
658                         break;
659                 }
660                 break;
661         case DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE:
662                 /* always valid */
663                 break;
664         default:
665                 valid = 0;
666                 break;
667         }
668
669         if (!valid) {
670                 if (val >= 0)
671                         dev_err(hsotg->dev,
672                                 "%d invalid for otg_cap parameter. Check HW configuration.\n",
673                                 val);
674                 switch (hsotg->hw_params.op_mode) {
675                 case GHWCFG2_OP_MODE_HNP_SRP_CAPABLE:
676                         val = DWC2_CAP_PARAM_HNP_SRP_CAPABLE;
677                         break;
678                 case GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE:
679                 case GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE:
680                 case GHWCFG2_OP_MODE_SRP_CAPABLE_HOST:
681                         val = DWC2_CAP_PARAM_SRP_ONLY_CAPABLE;
682                         break;
683                 default:
684                         val = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
685                         break;
686                 }
687                 dev_dbg(hsotg->dev, "Setting otg_cap to %d\n", val);
688         }
689
690         hsotg->core_params->otg_cap = val;
691 }
692
693 void dwc2_set_param_dma_enable(struct dwc2_hsotg *hsotg, int val)
694 {
695         int valid = 1;
696
697         if (val > 0 && hsotg->hw_params.arch == GHWCFG2_SLAVE_ONLY_ARCH)
698                 valid = 0;
699         if (val < 0)
700                 valid = 0;
701
702         if (!valid) {
703                 if (val >= 0)
704                         dev_err(hsotg->dev,
705                                 "%d invalid for dma_enable parameter. Check HW configuration.\n",
706                                 val);
707                 val = hsotg->hw_params.arch != GHWCFG2_SLAVE_ONLY_ARCH;
708                 dev_dbg(hsotg->dev, "Setting dma_enable to %d\n", val);
709         }
710
711         hsotg->core_params->dma_enable = val;
712 }
713
714 void dwc2_set_param_dma_desc_enable(struct dwc2_hsotg *hsotg, int val)
715 {
716         int valid = 1;
717
718         if (val > 0 && (hsotg->core_params->dma_enable <= 0 ||
719                         !hsotg->hw_params.dma_desc_enable))
720                 valid = 0;
721         if (val < 0)
722                 valid = 0;
723
724         if (!valid) {
725                 if (val >= 0)
726                         dev_err(hsotg->dev,
727                                 "%d invalid for dma_desc_enable parameter. Check HW configuration.\n",
728                                 val);
729                 val = (hsotg->core_params->dma_enable > 0 &&
730                         hsotg->hw_params.dma_desc_enable);
731                 dev_dbg(hsotg->dev, "Setting dma_desc_enable to %d\n", val);
732         }
733
734         hsotg->core_params->dma_desc_enable = val;
735 }
736
737 void dwc2_set_param_dma_desc_fs_enable(struct dwc2_hsotg *hsotg, int val)
738 {
739         int valid = 1;
740
741         if (val > 0 && (hsotg->core_params->dma_enable <= 0 ||
742                         !hsotg->hw_params.dma_desc_enable))
743                 valid = 0;
744         if (val < 0)
745                 valid = 0;
746
747         if (!valid) {
748                 if (val >= 0)
749                         dev_err(hsotg->dev,
750                                 "%d invalid for dma_desc_fs_enable parameter. Check HW configuration.\n",
751                                 val);
752                 val = (hsotg->core_params->dma_enable > 0 &&
753                         hsotg->hw_params.dma_desc_enable);
754         }
755
756         hsotg->core_params->dma_desc_fs_enable = val;
757         dev_dbg(hsotg->dev, "Setting dma_desc_fs_enable to %d\n", val);
758 }
759
760 void dwc2_set_param_host_support_fs_ls_low_power(struct dwc2_hsotg *hsotg,
761                                                  int val)
762 {
763         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
764                 if (val >= 0) {
765                         dev_err(hsotg->dev,
766                                 "Wrong value for host_support_fs_low_power\n");
767                         dev_err(hsotg->dev,
768                                 "host_support_fs_low_power must be 0 or 1\n");
769                 }
770                 val = 0;
771                 dev_dbg(hsotg->dev,
772                         "Setting host_support_fs_low_power to %d\n", val);
773         }
774
775         hsotg->core_params->host_support_fs_ls_low_power = val;
776 }
777
778 void dwc2_set_param_enable_dynamic_fifo(struct dwc2_hsotg *hsotg, int val)
779 {
780         int valid = 1;
781
782         if (val > 0 && !hsotg->hw_params.enable_dynamic_fifo)
783                 valid = 0;
784         if (val < 0)
785                 valid = 0;
786
787         if (!valid) {
788                 if (val >= 0)
789                         dev_err(hsotg->dev,
790                                 "%d invalid for enable_dynamic_fifo parameter. Check HW configuration.\n",
791                                 val);
792                 val = hsotg->hw_params.enable_dynamic_fifo;
793                 dev_dbg(hsotg->dev, "Setting enable_dynamic_fifo to %d\n", val);
794         }
795
796         hsotg->core_params->enable_dynamic_fifo = val;
797 }
798
799 void dwc2_set_param_host_rx_fifo_size(struct dwc2_hsotg *hsotg, int val)
800 {
801         int valid = 1;
802
803         if (val < 16 || val > hsotg->hw_params.host_rx_fifo_size)
804                 valid = 0;
805
806         if (!valid) {
807                 if (val >= 0)
808                         dev_err(hsotg->dev,
809                                 "%d invalid for host_rx_fifo_size. Check HW configuration.\n",
810                                 val);
811                 val = hsotg->hw_params.host_rx_fifo_size;
812                 dev_dbg(hsotg->dev, "Setting host_rx_fifo_size to %d\n", val);
813         }
814
815         hsotg->core_params->host_rx_fifo_size = val;
816 }
817
818 void dwc2_set_param_host_nperio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
819 {
820         int valid = 1;
821
822         if (val < 16 || val > hsotg->hw_params.host_nperio_tx_fifo_size)
823                 valid = 0;
824
825         if (!valid) {
826                 if (val >= 0)
827                         dev_err(hsotg->dev,
828                                 "%d invalid for host_nperio_tx_fifo_size. Check HW configuration.\n",
829                                 val);
830                 val = hsotg->hw_params.host_nperio_tx_fifo_size;
831                 dev_dbg(hsotg->dev, "Setting host_nperio_tx_fifo_size to %d\n",
832                         val);
833         }
834
835         hsotg->core_params->host_nperio_tx_fifo_size = val;
836 }
837
838 void dwc2_set_param_host_perio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
839 {
840         int valid = 1;
841
842         if (val < 16 || val > hsotg->hw_params.host_perio_tx_fifo_size)
843                 valid = 0;
844
845         if (!valid) {
846                 if (val >= 0)
847                         dev_err(hsotg->dev,
848                                 "%d invalid for host_perio_tx_fifo_size. Check HW configuration.\n",
849                                 val);
850                 val = hsotg->hw_params.host_perio_tx_fifo_size;
851                 dev_dbg(hsotg->dev, "Setting host_perio_tx_fifo_size to %d\n",
852                         val);
853         }
854
855         hsotg->core_params->host_perio_tx_fifo_size = val;
856 }
857
858 void dwc2_set_param_max_transfer_size(struct dwc2_hsotg *hsotg, int val)
859 {
860         int valid = 1;
861
862         if (val < 2047 || val > hsotg->hw_params.max_transfer_size)
863                 valid = 0;
864
865         if (!valid) {
866                 if (val >= 0)
867                         dev_err(hsotg->dev,
868                                 "%d invalid for max_transfer_size. Check HW configuration.\n",
869                                 val);
870                 val = hsotg->hw_params.max_transfer_size;
871                 dev_dbg(hsotg->dev, "Setting max_transfer_size to %d\n", val);
872         }
873
874         hsotg->core_params->max_transfer_size = val;
875 }
876
877 void dwc2_set_param_max_packet_count(struct dwc2_hsotg *hsotg, int val)
878 {
879         int valid = 1;
880
881         if (val < 15 || val > hsotg->hw_params.max_packet_count)
882                 valid = 0;
883
884         if (!valid) {
885                 if (val >= 0)
886                         dev_err(hsotg->dev,
887                                 "%d invalid for max_packet_count. Check HW configuration.\n",
888                                 val);
889                 val = hsotg->hw_params.max_packet_count;
890                 dev_dbg(hsotg->dev, "Setting max_packet_count to %d\n", val);
891         }
892
893         hsotg->core_params->max_packet_count = val;
894 }
895
896 void dwc2_set_param_host_channels(struct dwc2_hsotg *hsotg, int val)
897 {
898         int valid = 1;
899
900         if (val < 1 || val > hsotg->hw_params.host_channels)
901                 valid = 0;
902
903         if (!valid) {
904                 if (val >= 0)
905                         dev_err(hsotg->dev,
906                                 "%d invalid for host_channels. Check HW configuration.\n",
907                                 val);
908                 val = hsotg->hw_params.host_channels;
909                 dev_dbg(hsotg->dev, "Setting host_channels to %d\n", val);
910         }
911
912         hsotg->core_params->host_channels = val;
913 }
914
915 void dwc2_set_param_phy_type(struct dwc2_hsotg *hsotg, int val)
916 {
917         int valid = 0;
918         u32 hs_phy_type, fs_phy_type;
919
920         if (DWC2_OUT_OF_BOUNDS(val, DWC2_PHY_TYPE_PARAM_FS,
921                                DWC2_PHY_TYPE_PARAM_ULPI)) {
922                 if (val >= 0) {
923                         dev_err(hsotg->dev, "Wrong value for phy_type\n");
924                         dev_err(hsotg->dev, "phy_type must be 0, 1 or 2\n");
925                 }
926
927                 valid = 0;
928         }
929
930         hs_phy_type = hsotg->hw_params.hs_phy_type;
931         fs_phy_type = hsotg->hw_params.fs_phy_type;
932         if (val == DWC2_PHY_TYPE_PARAM_UTMI &&
933             (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
934              hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
935                 valid = 1;
936         else if (val == DWC2_PHY_TYPE_PARAM_ULPI &&
937                  (hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI ||
938                   hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI))
939                 valid = 1;
940         else if (val == DWC2_PHY_TYPE_PARAM_FS &&
941                  fs_phy_type == GHWCFG2_FS_PHY_TYPE_DEDICATED)
942                 valid = 1;
943
944         if (!valid) {
945                 if (val >= 0)
946                         dev_err(hsotg->dev,
947                                 "%d invalid for phy_type. Check HW configuration.\n",
948                                 val);
949                 val = DWC2_PHY_TYPE_PARAM_FS;
950                 if (hs_phy_type != GHWCFG2_HS_PHY_TYPE_NOT_SUPPORTED) {
951                         if (hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI ||
952                             hs_phy_type == GHWCFG2_HS_PHY_TYPE_UTMI_ULPI)
953                                 val = DWC2_PHY_TYPE_PARAM_UTMI;
954                         else
955                                 val = DWC2_PHY_TYPE_PARAM_ULPI;
956                 }
957                 dev_dbg(hsotg->dev, "Setting phy_type to %d\n", val);
958         }
959
960         hsotg->core_params->phy_type = val;
961 }
962
963 static int dwc2_get_param_phy_type(struct dwc2_hsotg *hsotg)
964 {
965         return hsotg->core_params->phy_type;
966 }
967
968 void dwc2_set_param_speed(struct dwc2_hsotg *hsotg, int val)
969 {
970         int valid = 1;
971
972         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
973                 if (val >= 0) {
974                         dev_err(hsotg->dev, "Wrong value for speed parameter\n");
975                         dev_err(hsotg->dev, "max_speed parameter must be 0 or 1\n");
976                 }
977                 valid = 0;
978         }
979
980         if (val == DWC2_SPEED_PARAM_HIGH &&
981             dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
982                 valid = 0;
983
984         if (!valid) {
985                 if (val >= 0)
986                         dev_err(hsotg->dev,
987                                 "%d invalid for speed parameter. Check HW configuration.\n",
988                                 val);
989                 val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS ?
990                                 DWC2_SPEED_PARAM_FULL : DWC2_SPEED_PARAM_HIGH;
991                 dev_dbg(hsotg->dev, "Setting speed to %d\n", val);
992         }
993
994         hsotg->core_params->speed = val;
995 }
996
997 void dwc2_set_param_host_ls_low_power_phy_clk(struct dwc2_hsotg *hsotg, int val)
998 {
999         int valid = 1;
1000
1001         if (DWC2_OUT_OF_BOUNDS(val, DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ,
1002                                DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ)) {
1003                 if (val >= 0) {
1004                         dev_err(hsotg->dev,
1005                                 "Wrong value for host_ls_low_power_phy_clk parameter\n");
1006                         dev_err(hsotg->dev,
1007                                 "host_ls_low_power_phy_clk must be 0 or 1\n");
1008                 }
1009                 valid = 0;
1010         }
1011
1012         if (val == DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ &&
1013             dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS)
1014                 valid = 0;
1015
1016         if (!valid) {
1017                 if (val >= 0)
1018                         dev_err(hsotg->dev,
1019                                 "%d invalid for host_ls_low_power_phy_clk. Check HW configuration.\n",
1020                                 val);
1021                 val = dwc2_get_param_phy_type(hsotg) == DWC2_PHY_TYPE_PARAM_FS
1022                         ? DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_6MHZ
1023                         : DWC2_HOST_LS_LOW_POWER_PHY_CLK_PARAM_48MHZ;
1024                 dev_dbg(hsotg->dev, "Setting host_ls_low_power_phy_clk to %d\n",
1025                         val);
1026         }
1027
1028         hsotg->core_params->host_ls_low_power_phy_clk = val;
1029 }
1030
1031 void dwc2_set_param_phy_ulpi_ddr(struct dwc2_hsotg *hsotg, int val)
1032 {
1033         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1034                 if (val >= 0) {
1035                         dev_err(hsotg->dev, "Wrong value for phy_ulpi_ddr\n");
1036                         dev_err(hsotg->dev, "phy_upli_ddr must be 0 or 1\n");
1037                 }
1038                 val = 0;
1039                 dev_dbg(hsotg->dev, "Setting phy_upli_ddr to %d\n", val);
1040         }
1041
1042         hsotg->core_params->phy_ulpi_ddr = val;
1043 }
1044
1045 void dwc2_set_param_phy_ulpi_ext_vbus(struct dwc2_hsotg *hsotg, int val)
1046 {
1047         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1048                 if (val >= 0) {
1049                         dev_err(hsotg->dev,
1050                                 "Wrong value for phy_ulpi_ext_vbus\n");
1051                         dev_err(hsotg->dev,
1052                                 "phy_ulpi_ext_vbus must be 0 or 1\n");
1053                 }
1054                 val = 0;
1055                 dev_dbg(hsotg->dev, "Setting phy_ulpi_ext_vbus to %d\n", val);
1056         }
1057
1058         hsotg->core_params->phy_ulpi_ext_vbus = val;
1059 }
1060
1061 void dwc2_set_param_phy_utmi_width(struct dwc2_hsotg *hsotg, int val)
1062 {
1063         int valid = 0;
1064
1065         switch (hsotg->hw_params.utmi_phy_data_width) {
1066         case GHWCFG4_UTMI_PHY_DATA_WIDTH_8:
1067                 valid = (val == 8);
1068                 break;
1069         case GHWCFG4_UTMI_PHY_DATA_WIDTH_16:
1070                 valid = (val == 16);
1071                 break;
1072         case GHWCFG4_UTMI_PHY_DATA_WIDTH_8_OR_16:
1073                 valid = (val == 8 || val == 16);
1074                 break;
1075         }
1076
1077         if (!valid) {
1078                 if (val >= 0) {
1079                         dev_err(hsotg->dev,
1080                                 "%d invalid for phy_utmi_width. Check HW configuration.\n",
1081                                 val);
1082                 }
1083                 val = (hsotg->hw_params.utmi_phy_data_width ==
1084                        GHWCFG4_UTMI_PHY_DATA_WIDTH_8) ? 8 : 16;
1085                 dev_dbg(hsotg->dev, "Setting phy_utmi_width to %d\n", val);
1086         }
1087
1088         hsotg->core_params->phy_utmi_width = val;
1089 }
1090
1091 void dwc2_set_param_ulpi_fs_ls(struct dwc2_hsotg *hsotg, int val)
1092 {
1093         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1094                 if (val >= 0) {
1095                         dev_err(hsotg->dev, "Wrong value for ulpi_fs_ls\n");
1096                         dev_err(hsotg->dev, "ulpi_fs_ls must be 0 or 1\n");
1097                 }
1098                 val = 0;
1099                 dev_dbg(hsotg->dev, "Setting ulpi_fs_ls to %d\n", val);
1100         }
1101
1102         hsotg->core_params->ulpi_fs_ls = val;
1103 }
1104
1105 void dwc2_set_param_ts_dline(struct dwc2_hsotg *hsotg, int val)
1106 {
1107         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1108                 if (val >= 0) {
1109                         dev_err(hsotg->dev, "Wrong value for ts_dline\n");
1110                         dev_err(hsotg->dev, "ts_dline must be 0 or 1\n");
1111                 }
1112                 val = 0;
1113                 dev_dbg(hsotg->dev, "Setting ts_dline to %d\n", val);
1114         }
1115
1116         hsotg->core_params->ts_dline = val;
1117 }
1118
1119 void dwc2_set_param_i2c_enable(struct dwc2_hsotg *hsotg, int val)
1120 {
1121         int valid = 1;
1122
1123         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1124                 if (val >= 0) {
1125                         dev_err(hsotg->dev, "Wrong value for i2c_enable\n");
1126                         dev_err(hsotg->dev, "i2c_enable must be 0 or 1\n");
1127                 }
1128
1129                 valid = 0;
1130         }
1131
1132         if (val == 1 && !(hsotg->hw_params.i2c_enable))
1133                 valid = 0;
1134
1135         if (!valid) {
1136                 if (val >= 0)
1137                         dev_err(hsotg->dev,
1138                                 "%d invalid for i2c_enable. Check HW configuration.\n",
1139                                 val);
1140                 val = hsotg->hw_params.i2c_enable;
1141                 dev_dbg(hsotg->dev, "Setting i2c_enable to %d\n", val);
1142         }
1143
1144         hsotg->core_params->i2c_enable = val;
1145 }
1146
1147 void dwc2_set_param_en_multiple_tx_fifo(struct dwc2_hsotg *hsotg, int val)
1148 {
1149         int valid = 1;
1150
1151         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1152                 if (val >= 0) {
1153                         dev_err(hsotg->dev,
1154                                 "Wrong value for en_multiple_tx_fifo,\n");
1155                         dev_err(hsotg->dev,
1156                                 "en_multiple_tx_fifo must be 0 or 1\n");
1157                 }
1158                 valid = 0;
1159         }
1160
1161         if (val == 1 && !hsotg->hw_params.en_multiple_tx_fifo)
1162                 valid = 0;
1163
1164         if (!valid) {
1165                 if (val >= 0)
1166                         dev_err(hsotg->dev,
1167                                 "%d invalid for parameter en_multiple_tx_fifo. Check HW configuration.\n",
1168                                 val);
1169                 val = hsotg->hw_params.en_multiple_tx_fifo;
1170                 dev_dbg(hsotg->dev, "Setting en_multiple_tx_fifo to %d\n", val);
1171         }
1172
1173         hsotg->core_params->en_multiple_tx_fifo = val;
1174 }
1175
1176 void dwc2_set_param_reload_ctl(struct dwc2_hsotg *hsotg, int val)
1177 {
1178         int valid = 1;
1179
1180         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1181                 if (val >= 0) {
1182                         dev_err(hsotg->dev,
1183                                 "'%d' invalid for parameter reload_ctl\n", val);
1184                         dev_err(hsotg->dev, "reload_ctl must be 0 or 1\n");
1185                 }
1186                 valid = 0;
1187         }
1188
1189         if (val == 1 && hsotg->hw_params.snpsid < DWC2_CORE_REV_2_92a)
1190                 valid = 0;
1191
1192         if (!valid) {
1193                 if (val >= 0)
1194                         dev_err(hsotg->dev,
1195                                 "%d invalid for parameter reload_ctl. Check HW configuration.\n",
1196                                 val);
1197                 val = hsotg->hw_params.snpsid >= DWC2_CORE_REV_2_92a;
1198                 dev_dbg(hsotg->dev, "Setting reload_ctl to %d\n", val);
1199         }
1200
1201         hsotg->core_params->reload_ctl = val;
1202 }
1203
1204 void dwc2_set_param_ahbcfg(struct dwc2_hsotg *hsotg, int val)
1205 {
1206         if (val != -1)
1207                 hsotg->core_params->ahbcfg = val;
1208         else
1209                 hsotg->core_params->ahbcfg = GAHBCFG_HBSTLEN_INCR4 <<
1210                                                 GAHBCFG_HBSTLEN_SHIFT;
1211 }
1212
1213 void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val)
1214 {
1215         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1216                 if (val >= 0) {
1217                         dev_err(hsotg->dev,
1218                                 "'%d' invalid for parameter otg_ver\n", val);
1219                         dev_err(hsotg->dev,
1220                                 "otg_ver must be 0 (for OTG 1.3 support) or 1 (for OTG 2.0 support)\n");
1221                 }
1222                 val = 0;
1223                 dev_dbg(hsotg->dev, "Setting otg_ver to %d\n", val);
1224         }
1225
1226         hsotg->core_params->otg_ver = val;
1227 }
1228
1229 static void dwc2_set_param_uframe_sched(struct dwc2_hsotg *hsotg, int val)
1230 {
1231         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1232                 if (val >= 0) {
1233                         dev_err(hsotg->dev,
1234                                 "'%d' invalid for parameter uframe_sched\n",
1235                                 val);
1236                         dev_err(hsotg->dev, "uframe_sched must be 0 or 1\n");
1237                 }
1238                 val = 1;
1239                 dev_dbg(hsotg->dev, "Setting uframe_sched to %d\n", val);
1240         }
1241
1242         hsotg->core_params->uframe_sched = val;
1243 }
1244
1245 static void dwc2_set_param_external_id_pin_ctl(struct dwc2_hsotg *hsotg,
1246                 int val)
1247 {
1248         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1249                 if (val >= 0) {
1250                         dev_err(hsotg->dev,
1251                                 "'%d' invalid for parameter external_id_pin_ctl\n",
1252                                 val);
1253                         dev_err(hsotg->dev, "external_id_pin_ctl must be 0 or 1\n");
1254                 }
1255                 val = 0;
1256                 dev_dbg(hsotg->dev, "Setting external_id_pin_ctl to %d\n", val);
1257         }
1258
1259         hsotg->core_params->external_id_pin_ctl = val;
1260 }
1261
1262 static void dwc2_set_param_hibernation(struct dwc2_hsotg *hsotg,
1263                 int val)
1264 {
1265         if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
1266                 if (val >= 0) {
1267                         dev_err(hsotg->dev,
1268                                 "'%d' invalid for parameter hibernation\n",
1269                                 val);
1270                         dev_err(hsotg->dev, "hibernation must be 0 or 1\n");
1271                 }
1272                 val = 0;
1273                 dev_dbg(hsotg->dev, "Setting hibernation to %d\n", val);
1274         }
1275
1276         hsotg->core_params->hibernation = val;
1277 }
1278
1279 /*
1280  * This function is called during module intialization to pass module parameters
1281  * for the DWC_otg core.
1282  */
1283 void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
1284                          const struct dwc2_core_params *params)
1285 {
1286         dev_dbg(hsotg->dev, "%s()\n", __func__);
1287
1288         dwc2_set_param_otg_cap(hsotg, params->otg_cap);
1289         dwc2_set_param_dma_enable(hsotg, params->dma_enable);
1290         dwc2_set_param_dma_desc_enable(hsotg, params->dma_desc_enable);
1291         dwc2_set_param_dma_desc_fs_enable(hsotg, params->dma_desc_fs_enable);
1292         dwc2_set_param_host_support_fs_ls_low_power(hsotg,
1293                         params->host_support_fs_ls_low_power);
1294         dwc2_set_param_enable_dynamic_fifo(hsotg,
1295                         params->enable_dynamic_fifo);
1296         dwc2_set_param_host_rx_fifo_size(hsotg,
1297                         params->host_rx_fifo_size);
1298         dwc2_set_param_host_nperio_tx_fifo_size(hsotg,
1299                         params->host_nperio_tx_fifo_size);
1300         dwc2_set_param_host_perio_tx_fifo_size(hsotg,
1301                         params->host_perio_tx_fifo_size);
1302         dwc2_set_param_max_transfer_size(hsotg,
1303                         params->max_transfer_size);
1304         dwc2_set_param_max_packet_count(hsotg,
1305                         params->max_packet_count);
1306         dwc2_set_param_host_channels(hsotg, params->host_channels);
1307         dwc2_set_param_phy_type(hsotg, params->phy_type);
1308         dwc2_set_param_speed(hsotg, params->speed);
1309         dwc2_set_param_host_ls_low_power_phy_clk(hsotg,
1310                         params->host_ls_low_power_phy_clk);
1311         dwc2_set_param_phy_ulpi_ddr(hsotg, params->phy_ulpi_ddr);
1312         dwc2_set_param_phy_ulpi_ext_vbus(hsotg,
1313                         params->phy_ulpi_ext_vbus);
1314         dwc2_set_param_phy_utmi_width(hsotg, params->phy_utmi_width);
1315         dwc2_set_param_ulpi_fs_ls(hsotg, params->ulpi_fs_ls);
1316         dwc2_set_param_ts_dline(hsotg, params->ts_dline);
1317         dwc2_set_param_i2c_enable(hsotg, params->i2c_enable);
1318         dwc2_set_param_en_multiple_tx_fifo(hsotg,
1319                         params->en_multiple_tx_fifo);
1320         dwc2_set_param_reload_ctl(hsotg, params->reload_ctl);
1321         dwc2_set_param_ahbcfg(hsotg, params->ahbcfg);
1322         dwc2_set_param_otg_ver(hsotg, params->otg_ver);
1323         dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
1324         dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
1325         dwc2_set_param_hibernation(hsotg, params->hibernation);
1326 }
1327
1328 /*
1329  * Forces either host or device mode if the controller is not
1330  * currently in that mode.
1331  *
1332  * Returns true if the mode was forced.
1333  */
1334 static bool dwc2_force_mode_if_needed(struct dwc2_hsotg *hsotg, bool host)
1335 {
1336         if (host && dwc2_is_host_mode(hsotg))
1337                 return false;
1338         else if (!host && dwc2_is_device_mode(hsotg))
1339                 return false;
1340
1341         return dwc2_force_mode(hsotg, host);
1342 }
1343
1344 /*
1345  * Gets host hardware parameters. Forces host mode if not currently in
1346  * host mode. Should be called immediately after a core soft reset in
1347  * order to get the reset values.
1348  */
1349 static void dwc2_get_host_hwparams(struct dwc2_hsotg *hsotg)
1350 {
1351         struct dwc2_hw_params *hw = &hsotg->hw_params;
1352         u32 gnptxfsiz;
1353         u32 hptxfsiz;
1354         bool forced;
1355
1356         if (hsotg->dr_mode == USB_DR_MODE_PERIPHERAL)
1357                 return;
1358
1359         forced = dwc2_force_mode_if_needed(hsotg, true);
1360
1361         gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
1362         hptxfsiz = dwc2_readl(hsotg->regs + HPTXFSIZ);
1363         dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
1364         dev_dbg(hsotg->dev, "hptxfsiz=%08x\n", hptxfsiz);
1365
1366         if (forced)
1367                 dwc2_clear_force_mode(hsotg);
1368
1369         hw->host_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
1370                                        FIFOSIZE_DEPTH_SHIFT;
1371         hw->host_perio_tx_fifo_size = (hptxfsiz & FIFOSIZE_DEPTH_MASK) >>
1372                                       FIFOSIZE_DEPTH_SHIFT;
1373 }
1374
1375 /*
1376  * Gets device hardware parameters. Forces device mode if not
1377  * currently in device mode. Should be called immediately after a core
1378  * soft reset in order to get the reset values.
1379  */
1380 static void dwc2_get_dev_hwparams(struct dwc2_hsotg *hsotg)
1381 {
1382         struct dwc2_hw_params *hw = &hsotg->hw_params;
1383         bool forced;
1384         u32 gnptxfsiz;
1385
1386         if (hsotg->dr_mode == USB_DR_MODE_HOST)
1387                 return;
1388
1389         forced = dwc2_force_mode_if_needed(hsotg, false);
1390
1391         gnptxfsiz = dwc2_readl(hsotg->regs + GNPTXFSIZ);
1392         dev_dbg(hsotg->dev, "gnptxfsiz=%08x\n", gnptxfsiz);
1393
1394         if (forced)
1395                 dwc2_clear_force_mode(hsotg);
1396
1397         hw->dev_nperio_tx_fifo_size = (gnptxfsiz & FIFOSIZE_DEPTH_MASK) >>
1398                                        FIFOSIZE_DEPTH_SHIFT;
1399 }
1400
1401 /**
1402  * During device initialization, read various hardware configuration
1403  * registers and interpret the contents.
1404  */
1405 int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)
1406 {
1407         struct dwc2_hw_params *hw = &hsotg->hw_params;
1408         unsigned width;
1409         u32 hwcfg1, hwcfg2, hwcfg3, hwcfg4;
1410         u32 grxfsiz;
1411
1412         /*
1413          * Attempt to ensure this device is really a DWC_otg Controller.
1414          * Read and verify the GSNPSID register contents. The value should be
1415          * 0x45f42xxx or 0x45f43xxx, which corresponds to either "OT2" or "OT3",
1416          * as in "OTG version 2.xx" or "OTG version 3.xx".
1417          */
1418         hw->snpsid = dwc2_readl(hsotg->regs + GSNPSID);
1419         if ((hw->snpsid & 0xfffff000) != 0x4f542000 &&
1420             (hw->snpsid & 0xfffff000) != 0x4f543000) {
1421                 dev_err(hsotg->dev, "Bad value for GSNPSID: 0x%08x\n",
1422                         hw->snpsid);
1423                 return -ENODEV;
1424         }
1425
1426         dev_dbg(hsotg->dev, "Core Release: %1x.%1x%1x%1x (snpsid=%x)\n",
1427                 hw->snpsid >> 12 & 0xf, hw->snpsid >> 8 & 0xf,
1428                 hw->snpsid >> 4 & 0xf, hw->snpsid & 0xf, hw->snpsid);
1429
1430         hwcfg1 = dwc2_readl(hsotg->regs + GHWCFG1);
1431         hwcfg2 = dwc2_readl(hsotg->regs + GHWCFG2);
1432         hwcfg3 = dwc2_readl(hsotg->regs + GHWCFG3);
1433         hwcfg4 = dwc2_readl(hsotg->regs + GHWCFG4);
1434         grxfsiz = dwc2_readl(hsotg->regs + GRXFSIZ);
1435
1436         dev_dbg(hsotg->dev, "hwcfg1=%08x\n", hwcfg1);
1437         dev_dbg(hsotg->dev, "hwcfg2=%08x\n", hwcfg2);
1438         dev_dbg(hsotg->dev, "hwcfg3=%08x\n", hwcfg3);
1439         dev_dbg(hsotg->dev, "hwcfg4=%08x\n", hwcfg4);
1440         dev_dbg(hsotg->dev, "grxfsiz=%08x\n", grxfsiz);
1441
1442         /*
1443          * Host specific hardware parameters. Reading these parameters
1444          * requires the controller to be in host mode. The mode will
1445          * be forced, if necessary, to read these values.
1446          */
1447         dwc2_get_host_hwparams(hsotg);
1448         dwc2_get_dev_hwparams(hsotg);
1449
1450         /* hwcfg1 */
1451         hw->dev_ep_dirs = hwcfg1;
1452
1453         /* hwcfg2 */
1454         hw->op_mode = (hwcfg2 & GHWCFG2_OP_MODE_MASK) >>
1455                       GHWCFG2_OP_MODE_SHIFT;
1456         hw->arch = (hwcfg2 & GHWCFG2_ARCHITECTURE_MASK) >>
1457                    GHWCFG2_ARCHITECTURE_SHIFT;
1458         hw->enable_dynamic_fifo = !!(hwcfg2 & GHWCFG2_DYNAMIC_FIFO);
1459         hw->host_channels = 1 + ((hwcfg2 & GHWCFG2_NUM_HOST_CHAN_MASK) >>
1460                                 GHWCFG2_NUM_HOST_CHAN_SHIFT);
1461         hw->hs_phy_type = (hwcfg2 & GHWCFG2_HS_PHY_TYPE_MASK) >>
1462                           GHWCFG2_HS_PHY_TYPE_SHIFT;
1463         hw->fs_phy_type = (hwcfg2 & GHWCFG2_FS_PHY_TYPE_MASK) >>
1464                           GHWCFG2_FS_PHY_TYPE_SHIFT;
1465         hw->num_dev_ep = (hwcfg2 & GHWCFG2_NUM_DEV_EP_MASK) >>
1466                          GHWCFG2_NUM_DEV_EP_SHIFT;
1467         hw->nperio_tx_q_depth =
1468                 (hwcfg2 & GHWCFG2_NONPERIO_TX_Q_DEPTH_MASK) >>
1469                 GHWCFG2_NONPERIO_TX_Q_DEPTH_SHIFT << 1;
1470         hw->host_perio_tx_q_depth =
1471                 (hwcfg2 & GHWCFG2_HOST_PERIO_TX_Q_DEPTH_MASK) >>
1472                 GHWCFG2_HOST_PERIO_TX_Q_DEPTH_SHIFT << 1;
1473         hw->dev_token_q_depth =
1474                 (hwcfg2 & GHWCFG2_DEV_TOKEN_Q_DEPTH_MASK) >>
1475                 GHWCFG2_DEV_TOKEN_Q_DEPTH_SHIFT;
1476
1477         /* hwcfg3 */
1478         width = (hwcfg3 & GHWCFG3_XFER_SIZE_CNTR_WIDTH_MASK) >>
1479                 GHWCFG3_XFER_SIZE_CNTR_WIDTH_SHIFT;
1480         hw->max_transfer_size = (1 << (width + 11)) - 1;
1481         width = (hwcfg3 & GHWCFG3_PACKET_SIZE_CNTR_WIDTH_MASK) >>
1482                 GHWCFG3_PACKET_SIZE_CNTR_WIDTH_SHIFT;
1483         hw->max_packet_count = (1 << (width + 4)) - 1;
1484         hw->i2c_enable = !!(hwcfg3 & GHWCFG3_I2C);
1485         hw->total_fifo_size = (hwcfg3 & GHWCFG3_DFIFO_DEPTH_MASK) >>
1486                               GHWCFG3_DFIFO_DEPTH_SHIFT;
1487
1488         /* hwcfg4 */
1489         hw->en_multiple_tx_fifo = !!(hwcfg4 & GHWCFG4_DED_FIFO_EN);
1490         hw->num_dev_perio_in_ep = (hwcfg4 & GHWCFG4_NUM_DEV_PERIO_IN_EP_MASK) >>
1491                                   GHWCFG4_NUM_DEV_PERIO_IN_EP_SHIFT;
1492         hw->dma_desc_enable = !!(hwcfg4 & GHWCFG4_DESC_DMA);
1493         hw->power_optimized = !!(hwcfg4 & GHWCFG4_POWER_OPTIMIZ);
1494         hw->utmi_phy_data_width = (hwcfg4 & GHWCFG4_UTMI_PHY_DATA_WIDTH_MASK) >>
1495                                   GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT;
1496
1497         /* fifo sizes */
1498         hw->host_rx_fifo_size = (grxfsiz & GRXFSIZ_DEPTH_MASK) >>
1499                                 GRXFSIZ_DEPTH_SHIFT;
1500
1501         dev_dbg(hsotg->dev, "Detected values from hardware:\n");
1502         dev_dbg(hsotg->dev, "  op_mode=%d\n",
1503                 hw->op_mode);
1504         dev_dbg(hsotg->dev, "  arch=%d\n",
1505                 hw->arch);
1506         dev_dbg(hsotg->dev, "  dma_desc_enable=%d\n",
1507                 hw->dma_desc_enable);
1508         dev_dbg(hsotg->dev, "  power_optimized=%d\n",
1509                 hw->power_optimized);
1510         dev_dbg(hsotg->dev, "  i2c_enable=%d\n",
1511                 hw->i2c_enable);
1512         dev_dbg(hsotg->dev, "  hs_phy_type=%d\n",
1513                 hw->hs_phy_type);
1514         dev_dbg(hsotg->dev, "  fs_phy_type=%d\n",
1515                 hw->fs_phy_type);
1516         dev_dbg(hsotg->dev, "  utmi_phy_data_width=%d\n",
1517                 hw->utmi_phy_data_width);
1518         dev_dbg(hsotg->dev, "  num_dev_ep=%d\n",
1519                 hw->num_dev_ep);
1520         dev_dbg(hsotg->dev, "  num_dev_perio_in_ep=%d\n",
1521                 hw->num_dev_perio_in_ep);
1522         dev_dbg(hsotg->dev, "  host_channels=%d\n",
1523                 hw->host_channels);
1524         dev_dbg(hsotg->dev, "  max_transfer_size=%d\n",
1525                 hw->max_transfer_size);
1526         dev_dbg(hsotg->dev, "  max_packet_count=%d\n",
1527                 hw->max_packet_count);
1528         dev_dbg(hsotg->dev, "  nperio_tx_q_depth=0x%0x\n",
1529                 hw->nperio_tx_q_depth);
1530         dev_dbg(hsotg->dev, "  host_perio_tx_q_depth=0x%0x\n",
1531                 hw->host_perio_tx_q_depth);
1532         dev_dbg(hsotg->dev, "  dev_token_q_depth=0x%0x\n",
1533                 hw->dev_token_q_depth);
1534         dev_dbg(hsotg->dev, "  enable_dynamic_fifo=%d\n",
1535                 hw->enable_dynamic_fifo);
1536         dev_dbg(hsotg->dev, "  en_multiple_tx_fifo=%d\n",
1537                 hw->en_multiple_tx_fifo);
1538         dev_dbg(hsotg->dev, "  total_fifo_size=%d\n",
1539                 hw->total_fifo_size);
1540         dev_dbg(hsotg->dev, "  host_rx_fifo_size=%d\n",
1541                 hw->host_rx_fifo_size);
1542         dev_dbg(hsotg->dev, "  host_nperio_tx_fifo_size=%d\n",
1543                 hw->host_nperio_tx_fifo_size);
1544         dev_dbg(hsotg->dev, "  host_perio_tx_fifo_size=%d\n",
1545                 hw->host_perio_tx_fifo_size);
1546         dev_dbg(hsotg->dev, "\n");
1547
1548         return 0;
1549 }
1550
1551 /*
1552  * Sets all parameters to the given value.
1553  *
1554  * Assumes that the dwc2_core_params struct contains only integers.
1555  */
1556 void dwc2_set_all_params(struct dwc2_core_params *params, int value)
1557 {
1558         int *p = (int *)params;
1559         size_t size = sizeof(*params) / sizeof(*p);
1560         int i;
1561
1562         for (i = 0; i < size; i++)
1563                 p[i] = value;
1564 }
1565
1566
1567 u16 dwc2_get_otg_version(struct dwc2_hsotg *hsotg)
1568 {
1569         return hsotg->core_params->otg_ver == 1 ? 0x0200 : 0x0103;
1570 }
1571
1572 bool dwc2_is_controller_alive(struct dwc2_hsotg *hsotg)
1573 {
1574         if (dwc2_readl(hsotg->regs + GSNPSID) == 0xffffffff)
1575                 return false;
1576         else
1577                 return true;
1578 }
1579
1580 /**
1581  * dwc2_enable_global_interrupts() - Enables the controller's Global
1582  * Interrupt in the AHB Config register
1583  *
1584  * @hsotg: Programming view of DWC_otg controller
1585  */
1586 void dwc2_enable_global_interrupts(struct dwc2_hsotg *hsotg)
1587 {
1588         u32 ahbcfg = dwc2_readl(hsotg->regs + GAHBCFG);
1589
1590         ahbcfg |= GAHBCFG_GLBL_INTR_EN;
1591         dwc2_writel(ahbcfg, hsotg->regs + GAHBCFG);
1592 }
1593
1594 /**
1595  * dwc2_disable_global_interrupts() - Disables the controller's Global
1596  * Interrupt in the AHB Config register
1597  *
1598  * @hsotg: Programming view of DWC_otg controller
1599  */
1600 void dwc2_disable_global_interrupts(struct dwc2_hsotg *hsotg)
1601 {
1602         u32 ahbcfg = dwc2_readl(hsotg->regs + GAHBCFG);
1603
1604         ahbcfg &= ~GAHBCFG_GLBL_INTR_EN;
1605         dwc2_writel(ahbcfg, hsotg->regs + GAHBCFG);
1606 }
1607
1608 /* Returns the controller's GHWCFG2.OTG_MODE. */
1609 unsigned dwc2_op_mode(struct dwc2_hsotg *hsotg)
1610 {
1611         u32 ghwcfg2 = dwc2_readl(hsotg->regs + GHWCFG2);
1612
1613         return (ghwcfg2 & GHWCFG2_OP_MODE_MASK) >>
1614                 GHWCFG2_OP_MODE_SHIFT;
1615 }
1616
1617 /* Returns true if the controller is capable of DRD. */
1618 bool dwc2_hw_is_otg(struct dwc2_hsotg *hsotg)
1619 {
1620         unsigned op_mode = dwc2_op_mode(hsotg);
1621
1622         return (op_mode == GHWCFG2_OP_MODE_HNP_SRP_CAPABLE) ||
1623                 (op_mode == GHWCFG2_OP_MODE_SRP_ONLY_CAPABLE) ||
1624                 (op_mode == GHWCFG2_OP_MODE_NO_HNP_SRP_CAPABLE);
1625 }
1626
1627 /* Returns true if the controller is host-only. */
1628 bool dwc2_hw_is_host(struct dwc2_hsotg *hsotg)
1629 {
1630         unsigned op_mode = dwc2_op_mode(hsotg);
1631
1632         return (op_mode == GHWCFG2_OP_MODE_SRP_CAPABLE_HOST) ||
1633                 (op_mode == GHWCFG2_OP_MODE_NO_SRP_CAPABLE_HOST);
1634 }
1635
1636 /* Returns true if the controller is device-only. */
1637 bool dwc2_hw_is_device(struct dwc2_hsotg *hsotg)
1638 {
1639         unsigned op_mode = dwc2_op_mode(hsotg);
1640
1641         return (op_mode == GHWCFG2_OP_MODE_SRP_CAPABLE_DEVICE) ||
1642                 (op_mode == GHWCFG2_OP_MODE_NO_SRP_CAPABLE_DEVICE);
1643 }
1644
1645 MODULE_DESCRIPTION("DESIGNWARE HS OTG Core");
1646 MODULE_AUTHOR("Synopsys, Inc.");
1647 MODULE_LICENSE("Dual BSD/GPL");