1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi
79*53ee8cc1Swenshuai.xi //#include <MsCommon.h> // NUSED
80*53ee8cc1Swenshuai.xi #include "drvUSBHwCtl.h"
81*53ee8cc1Swenshuai.xi #include "drvEHCI.h"
82*53ee8cc1Swenshuai.xi //#include "drvUSB.h" // NUSED
83*53ee8cc1Swenshuai.xi /* applying drvUSB.h (inside drvUSBHwCtl.h) */
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi #ifdef _USB_ENABLE_BDMA_PATCH
86*53ee8cc1Swenshuai.xi #include <drvBDMA.h>
87*53ee8cc1Swenshuai.xi #endif
88*53ee8cc1Swenshuai.xi
ms_XBYTE_OR(MS_U32 Addr,MS_U8 offset,MS_U8 val)89*53ee8cc1Swenshuai.xi void ms_XBYTE_OR(MS_U32 Addr, MS_U8 offset, MS_U8 val)
90*53ee8cc1Swenshuai.xi {
91*53ee8cc1Swenshuai.xi MS_U16 temp;
92*53ee8cc1Swenshuai.xi
93*53ee8cc1Swenshuai.xi if (offset & 1)
94*53ee8cc1Swenshuai.xi {
95*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+(offset-1)*2);
96*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+(offset-1)*2)=(((MS_U16)val)<<8) | (temp );
97*53ee8cc1Swenshuai.xi }
98*53ee8cc1Swenshuai.xi else
99*53ee8cc1Swenshuai.xi {
100*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+offset*2);
101*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+offset*2)=(temp )|val;
102*53ee8cc1Swenshuai.xi }
103*53ee8cc1Swenshuai.xi }
104*53ee8cc1Swenshuai.xi
ms_XBYTE_AND(MS_U32 Addr,MS_U8 offset,MS_U8 val)105*53ee8cc1Swenshuai.xi void ms_XBYTE_AND(MS_U32 Addr, MS_U8 offset,MS_U8 val)
106*53ee8cc1Swenshuai.xi {
107*53ee8cc1Swenshuai.xi MS_U16 temp;
108*53ee8cc1Swenshuai.xi
109*53ee8cc1Swenshuai.xi if (offset &1)
110*53ee8cc1Swenshuai.xi {
111*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+(offset-1)*2);
112*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+(offset-1)*2)=((((MS_U16)val)<<8)|0xff) & (temp );
113*53ee8cc1Swenshuai.xi }
114*53ee8cc1Swenshuai.xi else
115*53ee8cc1Swenshuai.xi {
116*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+offset*2);
117*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+offset*2)=(temp & (0xff00|val) );
118*53ee8cc1Swenshuai.xi
119*53ee8cc1Swenshuai.xi }
120*53ee8cc1Swenshuai.xi }
121*53ee8cc1Swenshuai.xi
ms_XBYTE_SET(MS_U32 Addr,MS_U8 offset,MS_U8 val)122*53ee8cc1Swenshuai.xi void ms_XBYTE_SET(MS_U32 Addr, MS_U8 offset,MS_U8 val)
123*53ee8cc1Swenshuai.xi {
124*53ee8cc1Swenshuai.xi MS_U16 temp;
125*53ee8cc1Swenshuai.xi
126*53ee8cc1Swenshuai.xi if (offset &1)
127*53ee8cc1Swenshuai.xi {
128*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+(offset-1)*2);
129*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+(offset-1)*2)=((temp & 0x00ff) | (((MS_U16)val)<<8));
130*53ee8cc1Swenshuai.xi }
131*53ee8cc1Swenshuai.xi else
132*53ee8cc1Swenshuai.xi {
133*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+offset*2);
134*53ee8cc1Swenshuai.xi *(MS_U16 volatile *)(Addr+offset*2)=((temp & 0xff00) |val );
135*53ee8cc1Swenshuai.xi }
136*53ee8cc1Swenshuai.xi }
137*53ee8cc1Swenshuai.xi
ms_XBYTE_READ(MS_U32 Addr,MS_U8 offset)138*53ee8cc1Swenshuai.xi MS_U8 ms_XBYTE_READ(MS_U32 Addr, MS_U8 offset)
139*53ee8cc1Swenshuai.xi {
140*53ee8cc1Swenshuai.xi MS_U16 temp;
141*53ee8cc1Swenshuai.xi MS_U8 uRetVal = 0;
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi if (offset &1)
144*53ee8cc1Swenshuai.xi {
145*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+(offset-1)*2);
146*53ee8cc1Swenshuai.xi uRetVal = (MS_U8) (temp >> 8);
147*53ee8cc1Swenshuai.xi }
148*53ee8cc1Swenshuai.xi else
149*53ee8cc1Swenshuai.xi {
150*53ee8cc1Swenshuai.xi temp=*(MS_U16 volatile *)(Addr+offset*2);
151*53ee8cc1Swenshuai.xi uRetVal = (MS_U8) temp;
152*53ee8cc1Swenshuai.xi }
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi //diag_printf("XBYTE_READ: Addr: %X, offset: %X, uRetVal: %X\n", Addr, offset, uRetVal);
155*53ee8cc1Swenshuai.xi return uRetVal;
156*53ee8cc1Swenshuai.xi }
157*53ee8cc1Swenshuai.xi // ------------------------------------------------------------------------
ms_RH_force_FSmode(struct usb_hcd * hcd,int enable)158*53ee8cc1Swenshuai.xi void ms_RH_force_FSmode(struct usb_hcd *hcd, int enable)
159*53ee8cc1Swenshuai.xi {
160*53ee8cc1Swenshuai.xi U32 temp;
161*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
162*53ee8cc1Swenshuai.xi
163*53ee8cc1Swenshuai.xi temp = hcd_reg_readl((U32)&ehci->op_regs->bus_control);
164*53ee8cc1Swenshuai.xi if (enable) {
165*53ee8cc1Swenshuai.xi hcd->isFSmode = 1;
166*53ee8cc1Swenshuai.xi temp |= 0x80; //force enter FSmode
167*53ee8cc1Swenshuai.xi diag_printf("[USB] force enter FSmode!\n");
168*53ee8cc1Swenshuai.xi }
169*53ee8cc1Swenshuai.xi else {
170*53ee8cc1Swenshuai.xi hcd->isFSmode = 0;
171*53ee8cc1Swenshuai.xi temp &= ~0x80;
172*53ee8cc1Swenshuai.xi diag_printf("[USB] leave FSmode!\n");
173*53ee8cc1Swenshuai.xi }
174*53ee8cc1Swenshuai.xi hcd_reg_writel(temp, (U32)&ehci->op_regs->bus_control);
175*53ee8cc1Swenshuai.xi }
176*53ee8cc1Swenshuai.xi
177*53ee8cc1Swenshuai.xi extern void ms_ehci_softrst(struct ehci_hcd *);
ms_ResetMstarUsb(struct usb_hcd * hcd)178*53ee8cc1Swenshuai.xi void ms_ResetMstarUsb(struct usb_hcd *hcd)
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi /* disable force enter FSmode, 20130220 place here */
181*53ee8cc1Swenshuai.xi if (hcd->isFSmode)
182*53ee8cc1Swenshuai.xi ms_RH_force_FSmode(hcd, 0);
183*53ee8cc1Swenshuai.xi ms_ehci_softrst(hcd_to_ehci(hcd));
184*53ee8cc1Swenshuai.xi }
185*53ee8cc1Swenshuai.xi
ms_RoothubPortConnected(struct usb_hcd * hcd)186*53ee8cc1Swenshuai.xi inline BOOL ms_RoothubPortConnected(struct usb_hcd *hcd)
187*53ee8cc1Swenshuai.xi {
188*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
189*53ee8cc1Swenshuai.xi U32 regv;
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi regv = hcd_reg_readw((U32)&ehci->op_regs->portsc[0]);
192*53ee8cc1Swenshuai.xi return (regv & PORTSC_CONNECT) ? TRUE : FALSE;
193*53ee8cc1Swenshuai.xi }
194*53ee8cc1Swenshuai.xi
ms_RoothubPortConnectChg(struct usb_hcd * hcd)195*53ee8cc1Swenshuai.xi inline BOOL ms_RoothubPortConnectChg(struct usb_hcd *hcd)
196*53ee8cc1Swenshuai.xi {
197*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
198*53ee8cc1Swenshuai.xi U32 regv;
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi regv = hcd_reg_readw((U32)&ehci->op_regs->portsc[0]);
201*53ee8cc1Swenshuai.xi return (regv & PORTSC_CSC) ? TRUE : FALSE;
202*53ee8cc1Swenshuai.xi }
203*53ee8cc1Swenshuai.xi
ms_RoothubPortEnabled(struct usb_hcd * hcd)204*53ee8cc1Swenshuai.xi inline BOOL ms_RoothubPortEnabled(struct usb_hcd *hcd)
205*53ee8cc1Swenshuai.xi {
206*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
207*53ee8cc1Swenshuai.xi U32 regv;
208*53ee8cc1Swenshuai.xi
209*53ee8cc1Swenshuai.xi regv = hcd_reg_readw((U32)&ehci->op_regs->portsc[0]);
210*53ee8cc1Swenshuai.xi return (regv & PORTSC_PE) ? TRUE : FALSE;
211*53ee8cc1Swenshuai.xi }
212*53ee8cc1Swenshuai.xi
ms_isHcdRunning(struct usb_hcd * hcd)213*53ee8cc1Swenshuai.xi inline BOOL ms_isHcdRunning(struct usb_hcd *hcd)
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
216*53ee8cc1Swenshuai.xi U32 regv;
217*53ee8cc1Swenshuai.xi
218*53ee8cc1Swenshuai.xi regv = hcd_reg_readw((U32)&ehci->op_regs->usbcmd);
219*53ee8cc1Swenshuai.xi return (regv & USBCMD_RUN) ? TRUE : FALSE;
220*53ee8cc1Swenshuai.xi }
221*53ee8cc1Swenshuai.xi
ms_forceHcdRun(struct usb_hcd * hcd)222*53ee8cc1Swenshuai.xi inline void ms_forceHcdRun(struct usb_hcd *hcd)
223*53ee8cc1Swenshuai.xi {
224*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
225*53ee8cc1Swenshuai.xi U32 regv;
226*53ee8cc1Swenshuai.xi
227*53ee8cc1Swenshuai.xi regv = hcd_reg_readw((U32)&ehci->op_regs->usbsts);
228*53ee8cc1Swenshuai.xi if (regv & USBSTS_HALT)
229*53ee8cc1Swenshuai.xi {
230*53ee8cc1Swenshuai.xi //diag_printf("[UM-disconnect] force RUN!!!\n");
231*53ee8cc1Swenshuai.xi hcd_reg_writel(USBCMD_RUN | hcd_reg_readl((U32)&ehci->op_regs->usbcmd),
232*53ee8cc1Swenshuai.xi (U32)&ehci->op_regs->usbcmd);
233*53ee8cc1Swenshuai.xi }
234*53ee8cc1Swenshuai.xi }
235*53ee8cc1Swenshuai.xi
236*53ee8cc1Swenshuai.xi #ifdef DEBUG
ms_dumpHcdRegister(struct usb_hcd * hcd)237*53ee8cc1Swenshuai.xi inline void ms_dumpHcdRegister(struct usb_hcd *hcd)
238*53ee8cc1Swenshuai.xi {
239*53ee8cc1Swenshuai.xi struct ehci_hcd *ehci = hcd_to_ehci(hcd);
240*53ee8cc1Swenshuai.xi
241*53ee8cc1Swenshuai.xi diag_printf("[UM] usbcmd = %x\n", hcd_reg_readl((U32)&ehci->op_regs->usbcmd));
242*53ee8cc1Swenshuai.xi diag_printf("[UM] status = %x\n", hcd_reg_readl((U32)&ehci->op_regs->usbsts));
243*53ee8cc1Swenshuai.xi diag_printf("[UM] portsc = %x\n", hcd_reg_readl((U32)&ehci->op_regs->portsc[0]));
244*53ee8cc1Swenshuai.xi }
245*53ee8cc1Swenshuai.xi #endif
246*53ee8cc1Swenshuai.xi
247*53ee8cc1Swenshuai.xi // ------------------------------------------------------------------------
248*53ee8cc1Swenshuai.xi
ms_UTMI_ORXBYTE_EX(MS_U8 offset,MS_U8 val,MS_U32 base)249*53ee8cc1Swenshuai.xi void ms_UTMI_ORXBYTE_EX(MS_U8 offset,MS_U8 val, MS_U32 base)
250*53ee8cc1Swenshuai.xi {
251*53ee8cc1Swenshuai.xi ms_XBYTE_OR(base, offset, val);
252*53ee8cc1Swenshuai.xi }
253*53ee8cc1Swenshuai.xi
ms_UTMI_ANDXBYTE_EX(MS_U8 offset,MS_U8 val,MS_U32 base)254*53ee8cc1Swenshuai.xi void ms_UTMI_ANDXBYTE_EX(MS_U8 offset,MS_U8 val, MS_U32 base)
255*53ee8cc1Swenshuai.xi {
256*53ee8cc1Swenshuai.xi ms_XBYTE_AND(base, offset, val);
257*53ee8cc1Swenshuai.xi }
258*53ee8cc1Swenshuai.xi
ms_UTMI_SETXBYTE_EX(MS_U8 offset,MS_U8 val,MS_U32 base)259*53ee8cc1Swenshuai.xi void ms_UTMI_SETXBYTE_EX(MS_U8 offset,MS_U8 val, MS_U32 base)
260*53ee8cc1Swenshuai.xi {
261*53ee8cc1Swenshuai.xi ms_XBYTE_SET(base, offset, val);
262*53ee8cc1Swenshuai.xi }
263*53ee8cc1Swenshuai.xi
ms_UTMI_READXBYTE_EX(MS_U8 offset,MS_U32 base)264*53ee8cc1Swenshuai.xi MS_U8 ms_UTMI_READXBYTE_EX(MS_U8 offset, MS_U32 base)
265*53ee8cc1Swenshuai.xi {
266*53ee8cc1Swenshuai.xi return ms_XBYTE_READ(base, offset);
267*53ee8cc1Swenshuai.xi }
268*53ee8cc1Swenshuai.xi
ms_ehci_interrupt_enable(struct usb_hcd * hcd,int str_on)269*53ee8cc1Swenshuai.xi void ms_ehci_interrupt_enable (struct usb_hcd *hcd, int str_on)
270*53ee8cc1Swenshuai.xi {
271*53ee8cc1Swenshuai.xi struct ehci_hcd *pEhci = hcd_to_ehci (hcd);
272*53ee8cc1Swenshuai.xi U32 u32Reg_t;
273*53ee8cc1Swenshuai.xi
274*53ee8cc1Swenshuai.xi u32Reg_t = (HOST20_USBINTR_IntOnAsyncAdvance |
275*53ee8cc1Swenshuai.xi HOST20_USBINTR_SystemError |
276*53ee8cc1Swenshuai.xi HOST20_USBINTR_PortChangeDetect |
277*53ee8cc1Swenshuai.xi HOST20_USBINTR_USBError |
278*53ee8cc1Swenshuai.xi HOST20_USBINTR_CompletionOfTransaction);
279*53ee8cc1Swenshuai.xi hcd_reg_writel (u32Reg_t, (U32)&pEhci->op_regs->usbintr);
280*53ee8cc1Swenshuai.xi
281*53ee8cc1Swenshuai.xi if (!str_on)
282*53ee8cc1Swenshuai.xi return;
283*53ee8cc1Swenshuai.xi
284*53ee8cc1Swenshuai.xi u32Reg_t = hcd_reg_readl((U32)&pEhci->op_regs->usbsts);
285*53ee8cc1Swenshuai.xi hcd_reg_writel (u32Reg_t, (U32)&pEhci->op_regs->usbsts); //clear all pending interrupt
286*53ee8cc1Swenshuai.xi
287*53ee8cc1Swenshuai.xi u32Reg_t = hcd_reg_readl((U32)&pEhci->op_regs->bus_control);
288*53ee8cc1Swenshuai.xi u32Reg_t|= INT_POLAR;
289*53ee8cc1Swenshuai.xi hcd_reg_writel (u32Reg_t, (U32)&pEhci->op_regs->bus_control); // set interrupt polarity high
290*53ee8cc1Swenshuai.xi }
291*53ee8cc1Swenshuai.xi
ms_ehci_interrupt_disable(struct usb_hcd * hcd)292*53ee8cc1Swenshuai.xi void ms_ehci_interrupt_disable (struct usb_hcd *hcd)
293*53ee8cc1Swenshuai.xi {
294*53ee8cc1Swenshuai.xi struct ehci_hcd *pEhci = hcd_to_ehci (hcd);
295*53ee8cc1Swenshuai.xi U32 u32Reg_t;
296*53ee8cc1Swenshuai.xi hcd_reg_writel (0, (U32)&pEhci->op_regs->usbintr);
297*53ee8cc1Swenshuai.xi
298*53ee8cc1Swenshuai.xi u32Reg_t = hcd_reg_readl((U32)&pEhci->op_regs->usbsts);
299*53ee8cc1Swenshuai.xi hcd_reg_writel (u32Reg_t, (U32)&pEhci->op_regs->usbsts); //clear all pending interrupt
300*53ee8cc1Swenshuai.xi }
301*53ee8cc1Swenshuai.xi
302*53ee8cc1Swenshuai.xi /*
303*53ee8cc1Swenshuai.xi * @brief ehci controller reset
304*53ee8cc1Swenshuai.xi *
305*53ee8cc1Swenshuai.xi * @param struct usb_hcd *pHcd
306*53ee8cc1Swenshuai.xi *
307*53ee8cc1Swenshuai.xi * @return none
308*53ee8cc1Swenshuai.xi */
309*53ee8cc1Swenshuai.xi extern void ms_qh_ehci_reinit(struct usb_hcd *, int);
ms_roothub_disconn_reinit(struct usb_hcd * pHcd)310*53ee8cc1Swenshuai.xi void ms_roothub_disconn_reinit(struct usb_hcd *pHcd)
311*53ee8cc1Swenshuai.xi {
312*53ee8cc1Swenshuai.xi struct ehci_hcd *pEhci = hcd_to_ehci (pHcd);
313*53ee8cc1Swenshuai.xi U32 t_portsc, t_uhcsts;
314*53ee8cc1Swenshuai.xi
315*53ee8cc1Swenshuai.xi //diag_printf("root hub reinitial [usbdis]\n");
316*53ee8cc1Swenshuai.xi t_portsc = hcd_reg_readl ((U32)&pEhci->op_regs->portsc [0]);
317*53ee8cc1Swenshuai.xi t_uhcsts = hcd_reg_readl(((U32)&pEhci->op_regs->usbcmd)+0x76);
318*53ee8cc1Swenshuai.xi //ms_qh_ehci_reinit(pHcd, 0); // deleted 20150505
319*53ee8cc1Swenshuai.xi ms_qh_ehci_reinit(pHcd, 1); // check again
320*53ee8cc1Swenshuai.xi /* check if HC falls into abnormal state, if yes, do HC reset */
321*53ee8cc1Swenshuai.xi if ((t_portsc == 0x8) && ((t_uhcsts & 0xc00) == 0xc00)) {
322*53ee8cc1Swenshuai.xi /* to simulate MStar linux patch
323*53ee8cc1Swenshuai.xi * ms_ehci_end(pHcd);
324*53ee8cc1Swenshuai.xi * ms_ehci_init(pHcd);
325*53ee8cc1Swenshuai.xi * ms_ehci_begin(pHcd);
326*53ee8cc1Swenshuai.xi */
327*53ee8cc1Swenshuai.xi ms_ResetMstarUsb(pHcd); // reset ehci
328*53ee8cc1Swenshuai.xi diag_printf("IN-NAK reset UHC\n");
329*53ee8cc1Swenshuai.xi }
330*53ee8cc1Swenshuai.xi }
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi #ifdef _USB_ENABLE_BDMA_PATCH
m_BDMA_write(unsigned int s,unsigned int t)333*53ee8cc1Swenshuai.xi void m_BDMA_write(unsigned int s, unsigned int t)
334*53ee8cc1Swenshuai.xi #if 1 // BDMA API
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi BDMA_Result ret;
337*53ee8cc1Swenshuai.xi
338*53ee8cc1Swenshuai.xi ret = MDrv_BDMA_MemCopy(s, t, 4);
339*53ee8cc1Swenshuai.xi if (ret != E_BDMA_OK) {
340*53ee8cc1Swenshuai.xi diag_printf("[BDMA] write retuen fail (%d)!\n", ret);
341*53ee8cc1Swenshuai.xi }
342*53ee8cc1Swenshuai.xi }
343*53ee8cc1Swenshuai.xi #else
344*53ee8cc1Swenshuai.xi {
345*53ee8cc1Swenshuai.xi //#define BDMA_RIU_BASE (MSTAR_PM_BASE+0x100900*2) // CH0
346*53ee8cc1Swenshuai.xi #define BDMA_RIU_BASE (_MSTAR_PM_BASE+0x100920*2) // CH1
347*53ee8cc1Swenshuai.xi #define MIU1_PHY_BASE_ADDR (0x40000000)
348*53ee8cc1Swenshuai.xi int s_miu1, t_miu1, t_off2;
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi //diag_printf("[USB] s %x, t %x\n", s, t);
351*53ee8cc1Swenshuai.xi while (readw((void*)(BDMA_RIU_BASE+0x2*2)) & 0x1) {
352*53ee8cc1Swenshuai.xi /* do nothing when last BDMA event not done */
353*53ee8cc1Swenshuai.xi }
354*53ee8cc1Swenshuai.xi /* decide which miu and calculate physical address */
355*53ee8cc1Swenshuai.xi s_miu1 = (s >= MIU1_PHY_BASE_ADDR) ? 1 : 0;
356*53ee8cc1Swenshuai.xi t_miu1 = (t >= MIU1_PHY_BASE_ADDR) ? 1 : 0;
357*53ee8cc1Swenshuai.xi t_off2 = 0x4040 | s_miu1 | (t_miu1 << 8);
358*53ee8cc1Swenshuai.xi s = s_miu1 ? (s - MIU1_PHY_BASE_ADDR) : s;
359*53ee8cc1Swenshuai.xi t = t_miu1 ? (t - MIU1_PHY_BASE_ADDR) : t;
360*53ee8cc1Swenshuai.xi writew(t_off2, (void*)(BDMA_RIU_BASE+0x4*2));
361*53ee8cc1Swenshuai.xi /* source address */
362*53ee8cc1Swenshuai.xi writew(s & 0xffff, (void*)(BDMA_RIU_BASE+0x8*2));
363*53ee8cc1Swenshuai.xi writew((s>>16) & 0xffff, (void*)(BDMA_RIU_BASE+0xA*2));
364*53ee8cc1Swenshuai.xi /* destination address */
365*53ee8cc1Swenshuai.xi writew(t & 0xffff, (void*)(BDMA_RIU_BASE+0xC*2));
366*53ee8cc1Swenshuai.xi writew((t>>16) & 0xffff, (void*)(BDMA_RIU_BASE+0xE*2));
367*53ee8cc1Swenshuai.xi /* transfer size by byte */
368*53ee8cc1Swenshuai.xi writew(0x4, (void*)(BDMA_RIU_BASE+0x10*2));
369*53ee8cc1Swenshuai.xi
370*53ee8cc1Swenshuai.xi /* clear status */
371*53ee8cc1Swenshuai.xi writeb(readb((void*)(BDMA_RIU_BASE+0x2*2)) | 0x1c, (void*)(BDMA_RIU_BASE+0x2*2));
372*53ee8cc1Swenshuai.xi
373*53ee8cc1Swenshuai.xi /* fire once */
374*53ee8cc1Swenshuai.xi writew(readw((void*)(BDMA_RIU_BASE)) | 0x1, (void*)(BDMA_RIU_BASE));
375*53ee8cc1Swenshuai.xi while (1) {
376*53ee8cc1Swenshuai.xi if ((readw((void*)(BDMA_RIU_BASE+0x2*2)) & 0x8) == 0x8)
377*53ee8cc1Swenshuai.xi break;
378*53ee8cc1Swenshuai.xi }
379*53ee8cc1Swenshuai.xi }
380*53ee8cc1Swenshuai.xi #endif
381*53ee8cc1Swenshuai.xi
382*53ee8cc1Swenshuai.xi static int en_64bit_OBF_cipher;
set_64bit_OBF_cipher(void)383*53ee8cc1Swenshuai.xi void set_64bit_OBF_cipher(void)
384*53ee8cc1Swenshuai.xi {
385*53ee8cc1Swenshuai.xi int retv = 0;
386*53ee8cc1Swenshuai.xi unsigned int tmp_t, tmp1_t;
387*53ee8cc1Swenshuai.xi
388*53ee8cc1Swenshuai.xi tmp_t = readl((void*)(MIU0_RIU_BASE+MIU_DRAMOBF_READY_OFFSET));
389*53ee8cc1Swenshuai.xi tmp1_t = readl((void*)(MIU0_RIU_BASE+MIU_64BIT_CIPHER_OFFSET));
390*53ee8cc1Swenshuai.xi //diag_printf("[MIU0] offset(2A) = %x\n", tmp_t);
391*53ee8cc1Swenshuai.xi //diag_printf("[MIU0] offset(D8) = %x\n", tmp1_t);
392*53ee8cc1Swenshuai.xi if ((tmp_t & MIU_DRAMOBF_READY_BIT) != 0 &&
393*53ee8cc1Swenshuai.xi (tmp1_t & MIU_64BIT_CIPHER_BIT) != 0)
394*53ee8cc1Swenshuai.xi retv = 1;
395*53ee8cc1Swenshuai.xi else
396*53ee8cc1Swenshuai.xi retv = 0;
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi #if defined(EHCI_CHECK_MIU1) && (EHCI_CHECK_MIU1 == 1)
399*53ee8cc1Swenshuai.xi tmp_t = readl((void*)(MIU1_RIU_BASE+MIU_DRAMOBF_READY_OFFSET));
400*53ee8cc1Swenshuai.xi tmp1_t = readl((void*)(MIU1_RIU_BASE+MIU_64BIT_CIPHER_OFFSET));
401*53ee8cc1Swenshuai.xi //diag_printf("[MIU1] offset(2A) = %x\n", tmp_t);
402*53ee8cc1Swenshuai.xi //diag_printf("[MIU1] offset(D8) = %x\n", tmp1_t);
403*53ee8cc1Swenshuai.xi if ((tmp_t & MIU_DRAMOBF_READY_BIT) != 0 &&
404*53ee8cc1Swenshuai.xi (tmp1_t & MIU_64BIT_CIPHER_BIT) != 0)
405*53ee8cc1Swenshuai.xi retv = retv ? 1 : 0;
406*53ee8cc1Swenshuai.xi else
407*53ee8cc1Swenshuai.xi retv = 0;
408*53ee8cc1Swenshuai.xi #endif
409*53ee8cc1Swenshuai.xi
410*53ee8cc1Swenshuai.xi en_64bit_OBF_cipher = retv;
411*53ee8cc1Swenshuai.xi diag_printf("[MIU] 64-bit OBF cipher enabled!\n");
412*53ee8cc1Swenshuai.xi
413*53ee8cc1Swenshuai.xi #if defined(EHCI_CHECK_ECO_VER) && (EHCI_CHECK_ECO_VER == 1)
414*53ee8cc1Swenshuai.xi tmp_t = readl((void*)(CHIP_VER_TOP+CHIP_VER_OFFSET));
415*53ee8cc1Swenshuai.xi tmp_t = (tmp_t >> CHIP_VER_SHIFT) & CHIP_VER_MASK;
416*53ee8cc1Swenshuai.xi USB_ASSERT(tmp_t >= CHIP_BDMA_ECO_VER,
417*53ee8cc1Swenshuai.xi "[BDMA] Chip ECO version %d NOT correct!\n");
418*53ee8cc1Swenshuai.xi #endif
419*53ee8cc1Swenshuai.xi }
420*53ee8cc1Swenshuai.xi
get_64bit_OBF_cipher(void)421*53ee8cc1Swenshuai.xi int get_64bit_OBF_cipher(void)
422*53ee8cc1Swenshuai.xi {
423*53ee8cc1Swenshuai.xi return en_64bit_OBF_cipher;
424*53ee8cc1Swenshuai.xi }
425*53ee8cc1Swenshuai.xi #endif
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi #if USBC_IP_SUPPORT // USBC control
ms_usbc_irq(MS_U32 regUTMI,MS_U32 regUSBC,struct s_UsbcInfo * pUsbc)428*53ee8cc1Swenshuai.xi void ms_usbc_irq(MS_U32 regUTMI, MS_U32 regUSBC, struct s_UsbcInfo *pUsbc)
429*53ee8cc1Swenshuai.xi {
430*53ee8cc1Swenshuai.xi U16 status, vbus_t;
431*53ee8cc1Swenshuai.xi
432*53ee8cc1Swenshuai.xi pUsbc->intSts = status = usb_readw((void*)(regUSBC+0x6*2));
433*53ee8cc1Swenshuai.xi vbus_t = usb_readw((void*)(regUTMI+0x30*2)) & 0x20; // bit[5]
434*53ee8cc1Swenshuai.xi pUsbc->eventType = vbus_t ? 1 : 0;
435*53ee8cc1Swenshuai.xi diag_printf("<usbc_irq> status change(%x) vbus(%x)\n", status, vbus_t);
436*53ee8cc1Swenshuai.xi status &= pUsbc->intEn;
437*53ee8cc1Swenshuai.xi usb_writew(status, (void*)(regUSBC+0x6*2)); // write 1 clear status
438*53ee8cc1Swenshuai.xi if (status)
439*53ee8cc1Swenshuai.xi pUsbc->eventFlag = 1;
440*53ee8cc1Swenshuai.xi }
441*53ee8cc1Swenshuai.xi
442*53ee8cc1Swenshuai.xi extern struct s_ChipUsbHostDef *pCurrentChip;
ms_usbc_on_intr(InterruptNum eIntNum)443*53ee8cc1Swenshuai.xi void ms_usbc_on_intr(InterruptNum eIntNum)
444*53ee8cc1Swenshuai.xi {
445*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
446*53ee8cc1Swenshuai.xi MS_U8 p;
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi if (pChip == NULL)
449*53ee8cc1Swenshuai.xi return;
450*53ee8cc1Swenshuai.xi MsOS_DisableInterrupt(eIntNum);
451*53ee8cc1Swenshuai.xi for (p = 0; p < pChip->nRootHub; p++)
452*53ee8cc1Swenshuai.xi {
453*53ee8cc1Swenshuai.xi if (eIntNum == pChip->reg[p].usbcIRQ)
454*53ee8cc1Swenshuai.xi break;
455*53ee8cc1Swenshuai.xi }
456*53ee8cc1Swenshuai.xi ms_usbc_irq(pChip->reg[p].baseUTMI, pChip->reg[p].baseUSBC, &pChip->usbc_ip[p]);
457*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(eIntNum);
458*53ee8cc1Swenshuai.xi
459*53ee8cc1Swenshuai.xi }
ms_init_usbc_intr(MS_U8 p)460*53ee8cc1Swenshuai.xi void ms_init_usbc_intr(MS_U8 p)
461*53ee8cc1Swenshuai.xi {
462*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
463*53ee8cc1Swenshuai.xi struct s_UsbcInfo *pUsbc = &pChip->usbc_ip[p];
464*53ee8cc1Swenshuai.xi InterruptNum intNum = pChip->reg[p].usbcIRQ;
465*53ee8cc1Swenshuai.xi MS_U32 regUSBC = pChip->reg[p].baseUSBC;
466*53ee8cc1Swenshuai.xi
467*53ee8cc1Swenshuai.xi pUsbc->portNum = p;
468*53ee8cc1Swenshuai.xi pUsbc->eventFlag = 0;
469*53ee8cc1Swenshuai.xi pUsbc->intEn = USBCINTR_VBusValidChange;
470*53ee8cc1Swenshuai.xi //pUsbc->intEn = USBCINTR_AValidChange; // for testing
471*53ee8cc1Swenshuai.xi pUsbc->int_pol = 1;
472*53ee8cc1Swenshuai.xi
473*53ee8cc1Swenshuai.xi diag_printf("<init_usbc_intr> port: %d, enable %x\n", p, pUsbc->intEn);
474*53ee8cc1Swenshuai.xi //usb_writeb((pUsbc->int_pol << 2) || usb_readb((void*)(regUSBC+0x2*2)), (void*)(regUSBC+0x2*2)); // set interrupt polarity
475*53ee8cc1Swenshuai.xi usb_writew(pUsbc->intEn, (void*)(regUSBC+0x6*2)); // clear interrupt status
476*53ee8cc1Swenshuai.xi usb_writew(pUsbc->intEn, (void*)(regUSBC+0x4*2)); // set interrupt enable
477*53ee8cc1Swenshuai.xi MsOS_AttachInterrupt(intNum, ms_usbc_on_intr);
478*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(intNum);
479*53ee8cc1Swenshuai.xi }
480*53ee8cc1Swenshuai.xi #endif
481*53ee8cc1Swenshuai.xi
482*53ee8cc1Swenshuai.xi #ifdef ENABLE_XHC_COMPANION
483*53ee8cc1Swenshuai.xi //------- xHCI --------
xhci_ppc(struct xhc_comp * xhci,int bOn)484*53ee8cc1Swenshuai.xi void xhci_ppc(struct xhc_comp *xhci, int bOn)
485*53ee8cc1Swenshuai.xi {
486*53ee8cc1Swenshuai.xi MS_U16 addr_w, bit_num;
487*53ee8cc1Swenshuai.xi MS_U32 addr, gpio_addr;
488*53ee8cc1Swenshuai.xi MS_U8 value, low_active;
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi
491*53ee8cc1Swenshuai.xi switch (xhci->port_index) {
492*53ee8cc1Swenshuai.xi case 0:
493*53ee8cc1Swenshuai.xi addr_w = usb_readw((void*)(xhci->u3top_base+0xFC*2));
494*53ee8cc1Swenshuai.xi addr = (MS_U32)addr_w << 8;
495*53ee8cc1Swenshuai.xi addr_w = usb_readw((void*)(xhci->u3top_base+0xFE*2));
496*53ee8cc1Swenshuai.xi addr |= addr_w & 0xFF;
497*53ee8cc1Swenshuai.xi bit_num = (addr_w >> 8) & 0x7;
498*53ee8cc1Swenshuai.xi low_active = (MS_U8)((addr_w >> 11) & 0x1);
499*53ee8cc1Swenshuai.xi break;
500*53ee8cc1Swenshuai.xi case 1:
501*53ee8cc1Swenshuai.xi addr_w = usb_readw((void*)(xhci->u3top_base+0xE6*2));
502*53ee8cc1Swenshuai.xi addr = (MS_U32)addr_w << 8;
503*53ee8cc1Swenshuai.xi addr_w = usb_readw((void*)(xhci->u3top_base+0xE8*2));
504*53ee8cc1Swenshuai.xi addr |= addr_w & 0xFF;
505*53ee8cc1Swenshuai.xi bit_num = (addr_w >> 8) & 0x7;
506*53ee8cc1Swenshuai.xi low_active = (MS_U8)((addr_w >> 11) & 0x1);
507*53ee8cc1Swenshuai.xi break;
508*53ee8cc1Swenshuai.xi default: /* "can't happen" */
509*53ee8cc1Swenshuai.xi return;
510*53ee8cc1Swenshuai.xi }
511*53ee8cc1Swenshuai.xi
512*53ee8cc1Swenshuai.xi if (addr)
513*53ee8cc1Swenshuai.xi {
514*53ee8cc1Swenshuai.xi diag_printf("xhci_ppc: turn %s USB3.0 port %d power \n", (bOn) ? "on" : "off", xhci->port_index);
515*53ee8cc1Swenshuai.xi diag_printf("Addr: 0x%x bit_num: %d low_active:%d\n", addr, bit_num, low_active);
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi value = (MS_U8)(1 << bit_num);
518*53ee8cc1Swenshuai.xi if (addr & 0x1)
519*53ee8cc1Swenshuai.xi gpio_addr = _MSTAR_PM_BASE+addr*2-1;
520*53ee8cc1Swenshuai.xi else
521*53ee8cc1Swenshuai.xi gpio_addr = _MSTAR_PM_BASE+addr*2;
522*53ee8cc1Swenshuai.xi
523*53ee8cc1Swenshuai.xi if (low_active^bOn)
524*53ee8cc1Swenshuai.xi {
525*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)gpio_addr) | value, (void*)gpio_addr);
526*53ee8cc1Swenshuai.xi }
527*53ee8cc1Swenshuai.xi else
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)gpio_addr) & (MS_U8)(~value), (void*)gpio_addr);
530*53ee8cc1Swenshuai.xi }
531*53ee8cc1Swenshuai.xi }
532*53ee8cc1Swenshuai.xi else {
533*53ee8cc1Swenshuai.xi diag_printf("\n\n!!!! ERROR : xhci: no GPIO information for vbus port power control !!!! \n\n");
534*53ee8cc1Swenshuai.xi return;
535*53ee8cc1Swenshuai.xi }
536*53ee8cc1Swenshuai.xi }
537*53ee8cc1Swenshuai.xi
U3phy_MS28_init(struct xhc_comp * xhci)538*53ee8cc1Swenshuai.xi void U3phy_MS28_init(struct xhc_comp *xhci)
539*53ee8cc1Swenshuai.xi {
540*53ee8cc1Swenshuai.xi #ifdef XHCI_SINGLE_PORT_ENABLE_MAC
541*53ee8cc1Swenshuai.xi writeb(readb((void*)(xhci->u3phy_D_base+0x84*2))|0x40, (void*)(xhci->u3phy_D_base+0x84*2)); // open XHCI MAC clock
542*53ee8cc1Swenshuai.xi #endif
543*53ee8cc1Swenshuai.xi
544*53ee8cc1Swenshuai.xi //-- 28 hpm mstar only---
545*53ee8cc1Swenshuai.xi writew(0x0104, (void*) (xhci->u3phy_A_base+0x6*2)); // for Enable 1G clock pass to UTMI //[2] reg_pd_usb3_purt [7:6] reg_gcr_hpd_vsel
546*53ee8cc1Swenshuai.xi
547*53ee8cc1Swenshuai.xi //U3phy initial sequence
548*53ee8cc1Swenshuai.xi writew(0x0, (void*) (xhci->u3phy_A_base)); // power on rx atop
549*53ee8cc1Swenshuai.xi writew(0x0, (void*) (xhci->u3phy_A_base+0x2*2)); // power on tx atop
550*53ee8cc1Swenshuai.xi //writew(0x0910, (void*) (U3PHY_D_base+0x4*2)); // the same as default
551*53ee8cc1Swenshuai.xi writew(0x0, (void*) (xhci->u3phy_A_base+0x3A*2)); // overwrite power on rx/tx atop
552*53ee8cc1Swenshuai.xi writew(0x0160, (void*) (xhci->u3phy_D_base+0x18*2));
553*53ee8cc1Swenshuai.xi writew(0x0, (void*) (xhci->u3phy_D_base+0x20*2)); // power on u3_phy clockgen
554*53ee8cc1Swenshuai.xi writew(0x0, (void*) (xhci->u3phy_D_base+0x22*2)); // power on u3_phy clockgen
555*53ee8cc1Swenshuai.xi
556*53ee8cc1Swenshuai.xi #ifdef XHCI_ENABLE_PD_OVERRIDE
557*53ee8cc1Swenshuai.xi writew(0x308, (void*) (xhci->u3phy_A_base+0x3A*2)); // [9,8,3] PD_TXCLK_USB3TXPLL, PD_USB3_IBIAS, PD_USB3TXPLL override enable
558*53ee8cc1Swenshuai.xi writeb(readb((void*)(xhci->u3phy_A_base+0x3*2-1)) & 0xbb, (void*)(xhci->u3phy_A_base+0x3*2-1)); // override value 0
559*53ee8cc1Swenshuai.xi #endif
560*53ee8cc1Swenshuai.xi writeb(0xF4, (void*) (xhci->u3phy_D_base+0x12*2)); //TX lock threshold
561*53ee8cc1Swenshuai.xi }
562*53ee8cc1Swenshuai.xi
xhci_enable_clock(void)563*53ee8cc1Swenshuai.xi void xhci_enable_clock(void)
564*53ee8cc1Swenshuai.xi {
565*53ee8cc1Swenshuai.xi static int clock_enable = 0;
566*53ee8cc1Swenshuai.xi #ifdef XHCI_PORT0_ADDR
567*53ee8cc1Swenshuai.xi struct xhc_comp xc = XHC_COMP_PORT0;
568*53ee8cc1Swenshuai.xi #endif
569*53ee8cc1Swenshuai.xi #ifdef XHCI_PORT1_ADDR
570*53ee8cc1Swenshuai.xi struct xhc_comp xc1 = XHC_COMP_PORT1;
571*53ee8cc1Swenshuai.xi #endif
572*53ee8cc1Swenshuai.xi
573*53ee8cc1Swenshuai.xi if (clock_enable)
574*53ee8cc1Swenshuai.xi return;
575*53ee8cc1Swenshuai.xi
576*53ee8cc1Swenshuai.xi #ifdef XHCI_PORT0_ADDR
577*53ee8cc1Swenshuai.xi diag_printf("xhci_enable_clock\n");
578*53ee8cc1Swenshuai.xi U3phy_MS28_init(&xc);
579*53ee8cc1Swenshuai.xi clock_enable = 1;
580*53ee8cc1Swenshuai.xi #endif
581*53ee8cc1Swenshuai.xi #ifdef XHCI_PORT1_ADDR
582*53ee8cc1Swenshuai.xi #ifdef XHCI_2PORTS
583*53ee8cc1Swenshuai.xi U3phy_MS28_init(&xc1);
584*53ee8cc1Swenshuai.xi #endif
585*53ee8cc1Swenshuai.xi #endif
586*53ee8cc1Swenshuai.xi }
587*53ee8cc1Swenshuai.xi
xhci_port_state_to_neutral(MS_U32 state)588*53ee8cc1Swenshuai.xi MS_U32 xhci_port_state_to_neutral(MS_U32 state)
589*53ee8cc1Swenshuai.xi {
590*53ee8cc1Swenshuai.xi /* Save read-only status and port state */
591*53ee8cc1Swenshuai.xi return (state & XHCI_PORT_RO) | (state & XHCI_PORT_RWS);
592*53ee8cc1Swenshuai.xi }
593*53ee8cc1Swenshuai.xi
xhci_ssport_set_state(struct xhc_comp * xhci,int bOn)594*53ee8cc1Swenshuai.xi void xhci_ssport_set_state(struct xhc_comp *xhci, int bOn)
595*53ee8cc1Swenshuai.xi {
596*53ee8cc1Swenshuai.xi MS_U32 temp;
597*53ee8cc1Swenshuai.xi
598*53ee8cc1Swenshuai.xi temp = readl((void*)(xhci->xhci_port_addr));
599*53ee8cc1Swenshuai.xi diag_printf("port status 0x%lx: 0x%lx\n", xhci->xhci_port_addr, temp);
600*53ee8cc1Swenshuai.xi if (bOn) {
601*53ee8cc1Swenshuai.xi if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_SS_DISABLED) {
602*53ee8cc1Swenshuai.xi
603*53ee8cc1Swenshuai.xi temp = xhci_port_state_to_neutral(temp);
604*53ee8cc1Swenshuai.xi temp &= ~PORT_PLS_MASK;
605*53ee8cc1Swenshuai.xi temp |= PORT_LINK_STROBE | USB_SS_PORT_LS_RX_DETECT;
606*53ee8cc1Swenshuai.xi
607*53ee8cc1Swenshuai.xi writel(temp, (void*)(xhci->xhci_port_addr));
608*53ee8cc1Swenshuai.xi
609*53ee8cc1Swenshuai.xi wait_ms(10);
610*53ee8cc1Swenshuai.xi temp = readl((void*)(xhci->xhci_port_addr));
611*53ee8cc1Swenshuai.xi diag_printf("port status: 0x%lx\n", temp);
612*53ee8cc1Swenshuai.xi }
613*53ee8cc1Swenshuai.xi } else {
614*53ee8cc1Swenshuai.xi if ((temp & PORT_PLS_MASK) != USB_SS_PORT_LS_SS_DISABLED) {
615*53ee8cc1Swenshuai.xi
616*53ee8cc1Swenshuai.xi temp = xhci_port_state_to_neutral(temp);
617*53ee8cc1Swenshuai.xi writel(temp | PORT_PE, (void*)(xhci->xhci_port_addr));
618*53ee8cc1Swenshuai.xi
619*53ee8cc1Swenshuai.xi wait_ms(10);
620*53ee8cc1Swenshuai.xi temp = readl((void*)(xhci->xhci_port_addr));
621*53ee8cc1Swenshuai.xi diag_printf("port status: 0x%lx\n", temp);
622*53ee8cc1Swenshuai.xi }
623*53ee8cc1Swenshuai.xi }
624*53ee8cc1Swenshuai.xi }
625*53ee8cc1Swenshuai.xi //--------------------
626*53ee8cc1Swenshuai.xi #endif
627