/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
	this list of conditions and the following disclaimer.

    *   Redistributions in binary form must reproduce the above copyright
	notice, this list of conditions and the following disclaimer in the
	documentation and/or other materials provided with the distribution.

    *   Neither the name of Marvell nor the names of its contributors may be
	used to endorse or promote products derived from this software without
	specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*******************************************************************************/

#include "mvCommon.h"
#include "mvOs.h"
#include "ctrlEnv/mvCtrlEnvSpec.h"
#include "mvSysUsbConfig.h"
#include "usb/mvUsbRegs.h"
#include "usb/mvUsb.h"
#ifdef MV_USB_VOLTAGE_FIX
#include "boardEnv/mvBoardEnvLib.h"
#include "gpp/mvGpp.h"
#include "gpp/mvGppRegs.h"
#endif
static MV_USB_HAL_DATA usbHalData;

MV_U32 mvUsbGetCapRegAddr(int devNo)
{
	return (INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(devNo));
}

#ifdef MV_USB_VOLTAGE_FIX

/* GPIO Settings for Back voltage problem workaround */
MV_U8 mvUsbGppInit(int dev)
{
	MV_U32 regVal;
	MV_U8 gppNo = (MV_U8) mvBoardUSBVbusGpioPinGet(dev);
	MV_U8 gppVbusEnNo = (MV_U8) mvBoardUSBVbusEnGpioPinGet(dev);

	/* DDR1 => gpp5, DDR2 => gpp1 */
	if (gppNo != (MV_U8) N_A) {
		/*mvOsPrintf("mvUsbGppInit: gppNo=%d\n", gppNo); */

		/* MPP Control Register - set to GPP */
		regVal = MV_REG_READ(mvCtrlMppRegGet((unsigned int)(gppNo / 8)));
		regVal &= ~(0xf << ((gppNo % 8) * 4));
		MV_REG_WRITE(mvCtrlMppRegGet((unsigned int)(gppNo / 8)), regVal);

		if (gppNo < 32) {
			/* GPIO Data Out Enable Control Register - set to input */
			mvGppTypeSet(0, (1 << gppNo), MV_GPP_IN & (1 << gppNo));
			/* GPIO Data In Polarity Register */
			mvGppPolaritySet(0, (1 << gppNo), (0 << gppNo));
		} else {
			/* GPIO Data Out Enable Control Register - set to input */
			mvGppTypeSet(1, (1 << (gppNo - 32)), MV_GPP_IN & (1 << (gppNo - 32)));
			/* GPIO Data In Polarity Register */
			mvGppPolaritySet(1, (1 << (gppNo - 32)), (0 << (gppNo - 32)));
		}

		/* GPIO Data In Polarity Register */
		/* mvGppPolaritySet(mppGrp, (1<<gppNo), (0<<gppNo) ); */

		regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));
		regVal &= ~(7 << 24);
		MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);
	}

	/* for device - reset vbus enable gpp, for host - set by default */
	if (gppVbusEnNo != (MV_U8) N_A) {
		/*mvOsPrintf("mvUsbGppInit: gppVbusEnNo = %d \n", gppVbusEnNo); */

		regVal = MV_REG_READ(GPP_DATA_OUT_REG((gppVbusEnNo / 32)));
		if (gppVbusEnNo < 32)
			MV_REG_WRITE(GPP_DATA_OUT_REG(0), (regVal & ~(1 << gppVbusEnNo)));
		else
			MV_REG_WRITE(GPP_DATA_OUT_REG(1), (regVal & ~(1 << (gppVbusEnNo - 32))));
	}

	return gppNo;
}

int mvUsbBackVoltageUpdate(int dev, MV_U8 gppNo)
{
	int vbusChange = 0;
	MV_U32 gppData, regVal, gppInv;

	if (gppNo < 32) {
		gppInv = mvGppPolarityGet(0, (1 << gppNo));
		gppData = mvGppValueGet(0, (1 << gppNo));
	} else {
		gppInv = mvGppPolarityGet(1, (1 << (gppNo - 32)));
		gppData = mvGppValueGet(1, (1 << (gppNo - 32)));
	}
	regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));

	if ((gppInv == 0) && (gppData != 0)) {
		/* VBUS appear */
		regVal |= (7 << 24);

		if (gppNo < 32)
			gppInv |= (1 << gppNo);
		else
			gppInv |= (1 << (gppNo - 32));

		/*mvOsPrintf("VBUS appear: dev=%d, gpp=%d\n", dev, gppNo); */
		vbusChange = 1;
	} else if ((gppInv != 0) && (gppData != 0)) {
		/* VBUS disappear */
		regVal &= ~(7 << 24);

		if (gppNo < 32)
			gppInv &= ~(1 << gppNo);
		else
			gppInv &= ~(1 << (gppNo - 32));

		/*mvOsPrintf("VBUS disappear: dev=%d, gpp=%d\n", dev, gppNo); */
		vbusChange = 2;
	} else {
		/* No changes */
		return vbusChange;
	}
	MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);

	if (gppNo < 32)
		mvGppPolaritySet(0, (1 << gppNo), gppInv);
	else
		mvGppPolaritySet(1, (1 << (gppNo - 32)), gppInv);

	return vbusChange;
}
#endif /* MV_USB_VOLTAGE_FIX */

/* USB Phy init (change from defaults) specific for 65nm (78100 78200 A0 and later) */
static void mvUsbPhy65nmNewInit(int dev)
{
	MV_U32 regVal;

	if ((usbHalData.ctrlModel == MV_6281_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6280_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6282_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6192_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6190_DEV_ID) || (usbHalData.ctrlModel == MV_6180_DEV_ID)) {
	/******* USB PHY ANA Grp Config reg 0x1007c *******/
		regVal = MV_REG_READ(0x1007c);
		/* bit[4:3]     should be '01' */
		regVal &= ~(0x3 << 3);
		regVal |= (0x1 << 3);
		MV_REG_WRITE(0x1007c, regVal);
	}

    /******* USB PHY PLL Control Register 0x410 *******/
	regVal = MV_REG_READ(MV_USB_PHY_PLL_CTRL_REG(dev));

	/* bit[21]  (VCOCAL_ START) */
	regVal |= (0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);

	/* Wait 100 usec */
	mvOsUDelay(100);

	regVal &= ~(0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY Tx Control Register Register 0x420 *******/
	regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

	/* Force impedance auto calibrate */
	/* bit[12]      (REG_RCAL_START) = 1 */
	regVal |= (0x1 << 12);
	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);

	/* Wait 100 usec */
	mvOsUDelay(100);

	/* bit[12]  (REG_RCAL_START) = 0 */
	regVal &= ~(0x1 << 12);
	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);

	/* bit[16:14]       (IMPCAL_VTH) = 101 */
	if (usbHalData.ctrlModel == MV_6280_DEV_ID) {
		regVal &= ~(0x7 << 14);
		regVal |= (0x5 << 14);
	}

	/* bits[2:0] (TX_AMP) = 0x4 */
	regVal &= ~(0x7 << 0);
	if ((usbHalData.ctrlModel == MV_78100_DEV_ID ||
	     usbHalData.ctrlModel == MV_78200_DEV_ID ||
	     usbHalData.ctrlModel == MV_76100_DEV_ID ||
	     usbHalData.ctrlModel == MV_6321_DEV_ID ||
	     usbHalData.ctrlModel == MV_6322_DEV_ID ||
	     usbHalData.ctrlModel == MV_6323_DEV_ID) && usbHalData.ctrlRev == MV_78XX0_A0_REV)
		regVal |= (0x4 << 0);
	else
		regVal |= (0x3 << 0);

	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY Rx Control Register 0x430 *******/
	regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

	/* bits[3:2]        LPF_COEF        = 0x1 */
	regVal &= ~(0x3 << 2);
	regVal |= (0x1 << 2);

	/* bits[7:4]        SQ_THRESH       = 0x8 */
	regVal &= ~(0xf << 4);

	if (usbHalData.ctrlModel == MV_6282_DEV_ID)
		regVal |= (0xc << 4);
	else
		regVal |= (0x8 << 4);

	MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY IVREF Control Register 0x440 *******/
	regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

	/* bits[9:8]        TxVdd */
	regVal &= ~(0x3 << 8);

	if ((usbHalData.ctrlModel == MV_6281_DEV_ID) || (usbHalData.ctrlModel == MV_6280_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6282_DEV_ID) || (usbHalData.ctrlModel == MV_6192_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6190_DEV_ID) || (usbHalData.ctrlModel == MV_6180_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6510_DEV_ID) || (usbHalData.ctrlModel == MV_6530_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6550_DEV_ID) || (usbHalData.ctrlModel == MV_6560_DEV_ID))
		regVal |= (0x3 << 8);
	else
		regVal |= (0x1 << 8);

	MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);

    /*-------------------------------------------------*/
    /***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/

	/* Nothing to change */
}

/* USB Phy init (change from defaults) specific for 55nm (6500-Z1 device) */
#if 0
static void mvUsbPhyKW6500Init(int dev)
{
	MV_U32 regVal;
	/******* USB PHY PLL Control Register 0x410 *******/
	regVal = MV_REG_READ(MV_USB_PHY_PLL_CTRL_REG(dev));

	/* VCO recalibrate */
	regVal |= (0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
	/* wait 500 usec */
	mvOsUDelay(500);
	regVal &= ~(0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
	/*-------------------------------------------------*/

	/******* USB PHY Tx Control Register Register 0x420 *******/
	regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

	/* bit[11]      (LOWVDD_EN)     = 1 */
	regVal |= (0x1 << 11);

	/* bit[12]      (REG_RCAL_START) = 1 */
	regVal |= (0x1 << 12);

	/* bits[16:14]  (IMPCAL_VTH[2:0] = 101) */
	regVal &= ~(0x7 << 14);
	regVal |= (0x5 << 14);

	/* bit[21]      (TX_BLOCK_EN)   = 0 */
	regVal &= ~(0x1 << 21);

	/* bit[31]  (HS_STRESS_CTRL) = 0 */
	regVal &= ~(0x1 << 31);

	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);

	/* wait 500 usec */
	mvOsUDelay(500);

	/* Force impedance auto calibrate */
	/* bit[12]      (REG_RCAL_START) = 0 */
	regVal &= ~(0x1 << 12);
	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);

	/*-------------------------------------------------*/

	/******* USB PHY Rx Control Register 0x430 *******/
	regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

	/* bits[3:2]    LPL_COEF        = 0x1 (1/8) */
	regVal &= ~(0x3 << 2);
	regVal |= (0x1 << 2);

	/* bits[7:4]    SQ_THRESH       = 0xC */
	regVal &= ~(0xf << 4);
	regVal |= (0xC << 4);

	/* bits[16:15]  REG_SQ_LENGTH   = 0x1 */
	regVal &= ~(0x3 << 15);
	regVal |= (0x1 << 15);

	/* bit[21]      CDR_FASTLOCK_EN = 0x0 */
	regVal &= ~(0x1 << 21);

	/* bits[27:26]  EDGE_DET        = 0x0 (1 Tran) */
	regVal &= ~(0x3 << 26);

	MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);
	/*-------------------------------------------------*/

	/******* USB PHY IVREF Control Register 0x440 *******/
	regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

	/* bits[9:8]    TXVDD12 = 0x3 */
	regVal &= ~(0x3 << 8);
	regVal |= (0x3 << 8);

	MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);
	/*-------------------------------------------------*/

	/***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/
	regVal = MV_REG_READ(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev));

	/* bit[15]      REG_FIFO_SQ_RST = 0x0 */
	regVal &= ~(0x1 << 15);

	MV_REG_WRITE(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev), regVal);
	/*-------------------------------------------------*/

	return;
}
#endif

/* USB Phy init (change from defaults) specific for 65nm (78XX0 and 6281) */
static void mvUsbPhy65nmInit(int dev)
{
	MV_U32 regVal;

    /******* USB PHY PLL Control Register 0x410 *******/
	regVal = MV_REG_READ(MV_USB_PHY_PLL_CTRL_REG(dev));

	/* bit[14:12]       (ICP) = 6 */
	regVal &= ~(0x7 << 12);
	regVal |= (0x6 << 12);

	/* bit[12]  (KVCO_EXT) = 1 */
	regVal |= (0x1 << 22);

	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY Tx Control Register Register 0x420 *******/
	regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

	/* bit[11]  (LOWVDD_EN)     = 1 */
	regVal |= (0x1 << 11);

	/* bit[12]  (REG_RCAL_START) = 1 */
	regVal |= (0x1 << 12);

	/* bit[21]  (TX_BLOCK_EN)   = 0 */
	regVal &= ~(0x1 << 21);

	/* bit[31]  (HS_STRESS_CTRL) = 0 */
	regVal &= ~(0x1 << 31);

	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);
	/* Force impedance auto calibrate */
	/* bit[12]  (REG_RCAL_START) = 0 */
	regVal &= ~(0x1 << 12);
	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY Rx Control Register 0x430 *******/
	regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

	/* bits[3:2]        LPL_COEF        = 0x0 (1/8) */
	regVal &= ~(0x3 << 2);

	/* bits[7:4]        SQ_THRESH       = 0x7 */
	regVal &= ~(0xf << 4);
	regVal |= (0x7 << 4);

	/* bits[16:15]      REG_SQ_LENGTH   = 0x1 */
	regVal &= ~(0x3 << 15);
	regVal |= (0x1 << 15);

	/* bit[21]  CDR_FASTLOCK_EN = 0x0 */
	regVal &= ~(0x1 << 21);

	/* bits[27:26]      EDGE_DET        = 0x0 (1 Tran) */
	regVal &= ~(0x3 << 26);

	MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

	/******* USB PHY IVREF Control Register 0x440 *******/
	regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

	/* bits[9:8]    TXVDD12 = 0x3 */
	regVal &= ~(0x3 << 8);
	regVal |= (0x3 << 8);

	MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/
	regVal = MV_REG_READ(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev));

	/* bit[15]  REG_FIFO_SQ_RST = 0x0 */
	regVal &= ~(0x1 << 15);

	MV_REG_WRITE(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev), regVal);
    /*-------------------------------------------------*/
}

/* USB Phy init (change from defaults) specific for 90nm (6183 and later) */
static void mvUsbPhy90nmInit(int dev)
{
	MV_U32 regVal;

    /******* USB 2.0 Power Control Register 0x400 *******/
	regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));

	/* Bits 7:6 (BG_VSEL) = 0x0 */
	regVal &= ~(0x3 << 6);

	MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY PLL Control Register 0x410 *******/
	regVal = MV_REG_READ(MV_USB_PHY_PLL_CTRL_REG(dev));

	/* bit[21]  (VCOCAL_ START) */
	regVal |= (0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);

	/* Wait 500 usec */
	mvOsUDelay(500);

	regVal &= ~(0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /******* USB PHY Tx Control Register Register 0x420 *******/
	regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

	/* bit[21]  (TX_BLK_EN) = 0 for B0 only */
	if ((usbHalData.ctrlModel == MV_6183_DEV_ID))
		regVal &= ~(0x1 << 21);

	/* Force Auto calibration */
	/* Bit[13] = 0x1, (REG_EXT_RCAL_EN = 0x1) */
	regVal |= (0x1 << 13);

	/* bit[11]  (LOWVDD_EN)     = 1 */
	regVal |= (0x1 << 11);

	/* Bit[6:3] (IMP_CAL) = 0x8 for A0 and B0 */
	/* Bit[6:3] (IMP_CAL) = 0xf for A1 */
	regVal &= ~(0xf << 3);
	regVal |= (0x8 << 3);

	if ((usbHalData.ctrlModel == MV_6183_DEV_ID)) {
		regVal &= ~(0x7);
		regVal |= (0x4);
	}

	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);
	/* Wait 500 usec */
	mvOsUDelay(500);
    /*-------------------------------------------------*/

    /******* USB PHY Rx Control Register 0x430 *******/
	regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

	/* bits[3:2]        LPF_COEF        = 0x0 */
	regVal &= ~(0x3 << 2);

	/* bits[7:4]        SQ_THRESH       = 0x0 */
	/* bits[7:4]        SQ_THRESH = 0x3 for A1 and above */
	regVal &= ~(0xf << 4);

	/* bits[16:15]      REG_SQ_LENGTH   = 0x1 */
	regVal &= ~(0x3 << 15);
	regVal |= (0x1 << 15);

	/* bit[21]  CDR_FASTLOCK_EN = 0x0 */
	regVal &= ~(0x1 << 21);

	/* bits[27:26]      EDGE_DET_SEL    = 0x0 */
	regVal &= ~(0x3 << 26);

	MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);
	/*-------------------------------------------------*/

    /******* USB PHY IVREF Control Register 0x440 *******/
	regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

	/* bits[7:6]        RXVDD18             = 0x0 */
	regVal &= ~(0x3 << 6);

	/* bits[11] SQ_CM_SEL = 0x1 for 6183 B0 only */
	if ((usbHalData.ctrlModel == MV_6183_DEV_ID))
		regVal |= (0x1 << 11);

	/* bit[24]      REG_TEST_SUSPENDM   = 0x1 */
	regVal |= (0x1 << 24);

	MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

    /***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/
	regVal = MV_REG_READ(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev));

	/* bit[15]  REG_FIFO_SQ_RST = 0x0 */
	regVal &= ~(0x1 << 15);

	MV_REG_WRITE(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev), regVal);
    /*-------------------------------------------------*/
}

/* USB Phy init (change from defaults) for 150nm chips:
 *  - 645xx, 646xx
 *  - 51xx, 52xx
 *  - 6082
 */
static void mvUsbPhyInit(int dev)
{
	MV_U32 regVal;

	/* GL# USB-9 */
	/******* USB 2.0 Power Control Register 0x400 *******/
	regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));

	/* Bits 7:6 (BG_VSEL) = 0x1 */
	regVal &= ~(0x3 << 6);
	regVal |= (0x1 << 6);

	MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);

	/******* USB PHY PLL Control Register 0x410 *******/
	regVal = MV_REG_READ(MV_USB_PHY_PLL_CTRL_REG(dev));

	/* bit[21]  (VCOCAL_ START) */
	regVal |= (0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);

	/* Wait 500 usec */
	mvOsUDelay(500);

	regVal &= ~(0x1 << 21);
	MV_REG_WRITE(MV_USB_PHY_PLL_CTRL_REG(dev), regVal);
    /*-------------------------------------------------*/

	/* GL# USB-1 */
    /******* USB PHY Tx Control Register Register 0x420 *******/
	regVal = MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev));

	if ((usbHalData.ctrlModel == MV_5181_DEV_ID) && (usbHalData.ctrlRev <= MV_5181_A1_REV)) {
		/* For OrionI A1/A0 rev:  Bit[21] = 0 (TXDATA_BLOCK_EN  = 0). */
		regVal &= ~(1 << 21);
	} else {
		regVal |= (1 << 21);
	}

	/* Force Auto calibration */

	/* Bit[13] = 0x1, (REG_EXT_RCAL_EN = 0x1) */
	regVal |= (1 << 13);

	/* Bits[2:0] (TxAmp)
	 *      64560, 64660, 6082, 5181, 5182, etc = 0x4
	 *      5281                                = 0x3
	 */
	if (usbHalData.ctrlModel == MV_5281_DEV_ID) {
		regVal &= ~(0x7 << 0);
		regVal |= (0x3 << 0);
	} else {
		regVal &= ~(0x7 << 0);
		regVal |= (0x4 << 0);
	}

	/* Bit[6:3] (IMP_CAL)
	 *      64560, 64660 = 0xA
	 *      Others       = 0x8
	 *
	 */
	regVal &= ~(0xf << 3);
	if ((usbHalData.ctrlModel == MV64560_DEV_ID) || (usbHalData.ctrlModel == MV64660_DEV_ID))
		regVal |= (0xA << 3);
	else
		regVal |= (0x8 << 3);

	MV_REG_WRITE(MV_USB_PHY_TX_CTRL_REG(dev), regVal);
	mvOsUDelay(500);

	/* GL# USB-3 GL# USB-9 */
	/******* USB PHY Rx Control Register 0x430 *******/
	regVal = MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev));

	/* bit[8:9] - (DISCON_THRESHOLD ). */
	/* 88F5181-A0/A1/B0 = 11, 88F5281-A0 = 10, all other 00 */
	/* 64660-A0 = 10 */
	regVal &= ~(0x3 << 8);
	if ((usbHalData.ctrlModel == MV_5181_DEV_ID) && (usbHalData.ctrlRev <= MV_5181_B0_REV))
		regVal |= (0x3 << 8);
	else if (usbHalData.ctrlModel == MV64660_DEV_ID)
		regVal |= (0x2 << 8);

	/* bit[21] = 0 (CDR_FASTLOCK_EN = 0). */
	regVal &= ~(1 << 21);

	/* bit[27:26] = 00 ( EDGE_DET_SEL = 00). */
	regVal &= ~(0x3 << 26);

	/* Bits[31:30] = RXDATA_BLOCK_LENGHT = 0x3 */
	regVal |= (0x3 << 30);

	/* Bits 7:4 (SQ_THRESH)
	 *      64560, 64660                = 0x1
	 *      5181, 5182, 5281, 6082, etc = 0x0
	 */
	regVal &= ~(0xf << 4);
	if ((usbHalData.ctrlModel == MV64560_DEV_ID) || (usbHalData.ctrlModel == MV64660_DEV_ID))
		regVal |= (0x1 << 4);
	else
		regVal |= (0x3 << 4);

	MV_REG_WRITE(MV_USB_PHY_RX_CTRL_REG(dev), regVal);

	/* GL# USB-3 GL# USB-9 */
    /******* USB PHY IVREF Control Register 0x440 *******/
	regVal = MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev));

	/*Bits[1:0] = 0x2 (PLLVDD12 = 0x2) */
	regVal &= ~(0x3 << 0);
	regVal |= (0x2 << 0);

	/* Bits 5:4 (RXVDD) = 0x3; */
	regVal &= ~(0x3 << 4);
	regVal |= (0x3 << 4);

	/* <VPLLCAL> bits[17:16] = 0x1 */
	if ((usbHalData.ctrlModel == MV64560_DEV_ID) || (usbHalData.ctrlModel == MV64660_DEV_ID)) {
		regVal &= ~(0x3 << 16);
		regVal |= (0x1 << 16);
	}

	/* <ISAMPLE_SEL> bits[19:18] = 0x2 */
	regVal &= ~(0x3 << 18);
	regVal |= (0x2 << 18);

	/* <SAMPLER_CTRL> bit[20] = 0x0 */
	regVal &= ~(0x1 << 20);

	/* <ICHGPBUF_SEL> bit[21] = 0x1 */
	regVal |= (0x1 << 21);

	MV_REG_WRITE(MV_USB_PHY_IVREF_CTRL_REG(dev), regVal);

	/***** USB PHY TEST GROUP CONTROL Register: 0x450 *****/
	regVal = MV_REG_READ(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev));

	/* bit[15] = 0 (REG_FIFO_SQ_RST = 0). */
	regVal &= ~(1 << 15);

	/* <REG_FIFO_OVUF_SEL> bit[17] = 0x1 */
	if ((usbHalData.ctrlModel == MV64560_DEV_ID) || (usbHalData.ctrlModel == MV64660_DEV_ID))
		regVal |= (1 << 17);

	MV_REG_WRITE(MV_USB_PHY_TEST_GROUP_CTRL_REG_0(dev), regVal);
}

/*******************************************************************************
* mvUsbHalInit - Initialize USB engine
*
* DESCRIPTION:
*       This function initialize USB unit. It set the default address decode
*       windows of the unit.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       MV_ERROR if setting fail.
*******************************************************************************/
MV_STATUS mvUsbHalInit(int dev, MV_BOOL isHost, MV_USB_HAL_DATA *halData)
{
	MV_U32 regVal;

	mvOsMemcpy(&usbHalData, halData, sizeof(MV_USB_HAL_DATA));

	/* Wait 100 usec */
	mvOsUDelay(100);

	/* Clear Interrupt Cause and Mask registers */
	MV_REG_WRITE(MV_USB_BRIDGE_INTR_CAUSE_REG(dev), 0);
	MV_REG_WRITE(MV_USB_BRIDGE_INTR_MASK_REG(dev), 0);

	/* Reset controller */
	regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal | MV_USB_CORE_CMD_RESET_MASK);
	while (MV_REG_READ(MV_USB_CORE_CMD_REG(dev)) & MV_USB_CORE_CMD_RESET_MASK)
		;

	/* Clear bit 4 in USB bridge control register for enableing core byte swap */
	if ((usbHalData.ctrlModel == MV64560_DEV_ID) || (usbHalData.ctrlModel == MV64660_DEV_ID)) {
		MV_REG_WRITE(MV_USB_BRIDGE_CTRL_REG(dev), (MV_REG_READ(MV_USB_BRIDGE_CTRL_REG(dev))
							   & ~MV_USB_BRIDGE_CORE_BYTE_SWAP_MASK));
	}

	/* GL# USB-10 */
	/* The new register 0x360 USB 2.0 IPG Metal Fix Register
	 * dont' exists in the following chip revisions:
	 * OrionN B1 (id=0x5180, rev 3)
	 * Orion1 B1 (id=0x5181, rev=3) and before
	 * Orion1-VoIP A0 (id=0x5181, rev=8)
	 * Orion1-NAS A1 (id=0x5182, rev=1) and before
	 * Orion2 B0 (id=0x5281, rev=1) and before
	 */
	if (((usbHalData.ctrlModel == MV_5181_DEV_ID) &&
	     ((usbHalData.ctrlRev <= MV_5181_B1_REV) || (usbHalData.ctrlRev == MV_5181L_A0_REV))) ||
	    ((usbHalData.ctrlModel == MV_5182_DEV_ID) &&
	     (usbHalData.ctrlRev <= MV_5182_A1_REV)) ||
	    ((usbHalData.ctrlModel == MV_5180_DEV_ID) && (usbHalData.ctrlRev <= MV_5180N_B1_REV))) {
		/* Do nothing */
	} else if ((usbHalData.ctrlModel == MV_6510_DEV_ID) ||
		   (usbHalData.ctrlModel == MV_6530_DEV_ID) ||
		   (usbHalData.ctrlModel == MV_6550_DEV_ID) || (usbHalData.ctrlModel == MV_6560_DEV_ID)) {
		/* Change value of new register 0x360 */
		regVal = MV_REG_READ(MV_USB_BRIDGE_IPG_REG(dev));
#if 0
		/*  Change bits31 & bit30 from 1 to 0 */
		regVal &= ~(0x3 << 30);
#endif
		/*  Change bits[14:8] - IPG for non Start of Frame Packets
		 *  from 0x9(default) to 0xD
		 */
		regVal &= ~(0x7F << 8);
		regVal |= (0xD << 8);

		MV_REG_WRITE(MV_USB_BRIDGE_IPG_REG(dev), regVal);
	} else {
		/* Change value of new register 0x360 */
		regVal = MV_REG_READ(MV_USB_BRIDGE_IPG_REG(dev));

		/*  Change bits[14:8] - IPG for non Start of Frame Packets
		 *  from 0x9(default) to 0xD
		 */
		regVal &= ~(0x7F << 8);
		regVal |= (0xD << 8);

		MV_REG_WRITE(MV_USB_BRIDGE_IPG_REG(dev), regVal);
	}
#ifndef MV_USB_PHY_DONT_OVERRIDE

    /********* Update USB PHY configuration **********/
	if ((usbHalData.ctrlModel == MV_78100_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_78200_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_76100_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6281_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6282_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6280_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6192_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6190_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6180_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6321_DEV_ID) ||
	    (usbHalData.ctrlModel == MV_6322_DEV_ID) || (usbHalData.ctrlModel == MV_6323_DEV_ID)) {
		mvUsbPhy65nmNewInit(dev);
	} else if ((usbHalData.ctrlModel == MV_78XX0_DEV_ID)) {
		mvUsbPhy65nmInit(dev);
	} else if (usbHalData.ctrlModel == MV_6183_DEV_ID) {
		mvUsbPhy90nmInit(dev);
	} else if ((usbHalData.ctrlModel == MV_6510_DEV_ID) ||
		   (usbHalData.ctrlModel == MV_6530_DEV_ID) ||
		   (usbHalData.ctrlModel == MV_6550_DEV_ID) || (usbHalData.ctrlModel == MV_6560_DEV_ID)) {
		mvUsbPhy65nmNewInit(dev);
/* 	mvUsbPhyKW6500Init(dev); */
	} else {
		mvUsbPhyInit(dev);
	}
#endif
	/* Set Mode register (Stop and Reset USB Core before) */
	/* Stop the controller */
	regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	regVal &= ~MV_USB_CORE_CMD_RUN_MASK;
	MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);

	/* Reset the controller to get default values */
	regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	regVal |= MV_USB_CORE_CMD_RESET_MASK;
	MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);

	/* Wait for the controller reset to complete */
	do {
		regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	} while (regVal & MV_USB_CORE_CMD_RESET_MASK);

	/* Set USB_MODE register */
	if (isHost)
		regVal = MV_USB_CORE_MODE_HOST;
	else
		regVal = MV_USB_CORE_MODE_DEVICE | MV_USB_CORE_SETUP_LOCK_DISABLE_MASK;

#if (MV_USB_VERSION == 0)
	regVal |= MV_USB_CORE_STREAM_DISABLE_MASK;
#endif

	MV_REG_WRITE(MV_USB_CORE_MODE_REG(dev), regVal);

	return MV_OK;
}

void mvUsbPowerDown(int dev)
{
	MV_U32 regVal;

	/* Stop USB Controller core */
	regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	if (regVal & MV_USB_CORE_CMD_RUN_MASK) {
		mvOsPrintf("USB #%d:  Warning USB core was not disabled\n", dev);
		regVal &= ~MV_USB_CORE_CMD_RUN_MASK;
		MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);
	}

	/* Power Down USB PHY */
	regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));
	regVal &= ~(MV_USB_PHY_POWER_UP_MASK | MV_USB_PHY_PLL_POWER_UP_MASK);

	MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);
}

void mvUsbPowerUp(int dev)
{
	MV_U32 regVal;

	/* Power Up USB PHY */
	regVal = MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev));
	regVal |= (MV_USB_PHY_POWER_UP_MASK | MV_USB_PHY_PLL_POWER_UP_MASK);

	MV_REG_WRITE(MV_USB_PHY_POWER_CTRL_REG(dev), regVal);

	/* Start USB core */
	regVal = MV_REG_READ(MV_USB_CORE_CMD_REG(dev));
	if (regVal & MV_USB_CORE_CMD_RUN_MASK) {
		mvOsPrintf("USB #%d:  Warning USB core is enabled\n", dev);
	} else {
		regVal |= MV_USB_CORE_CMD_RUN_MASK;
		MV_REG_WRITE(MV_USB_CORE_CMD_REG(dev), regVal);
	}
}

void mvUsbRegs(int dev)
{
	mvOsPrintf("\n\tUSB-%d Bridge Registers\n\n", dev);

	mvOsPrintf("MV_USB_BRIDGE_CTRL_REG          : 0x%X = 0x%08x\n",
		   MV_USB_BRIDGE_CTRL_REG(dev), MV_REG_READ(MV_USB_BRIDGE_CTRL_REG(dev)));

	mvOsPrintf("MV_USB_BRIDGE_INTR_MASK_REG     : 0x%X = 0x%08x\n",
		   MV_USB_BRIDGE_INTR_MASK_REG(dev), MV_REG_READ(MV_USB_BRIDGE_INTR_MASK_REG(dev)));

	mvOsPrintf("MV_USB_BRIDGE_INTR_CAUSE_REG    : 0x%X = 0x%08x\n",
		   MV_USB_BRIDGE_INTR_CAUSE_REG(dev), MV_REG_READ(MV_USB_BRIDGE_INTR_CAUSE_REG(dev)));

	mvOsPrintf("MV_USB_BRIDGE_ERROR_ADDR_REG    : 0x%X = 0x%08x\n",
		   MV_USB_BRIDGE_ERROR_ADDR_REG(dev), MV_REG_READ(MV_USB_BRIDGE_ERROR_ADDR_REG(dev)));

	mvOsPrintf("\n\tUSB-%d PHY Registers\n\n", dev);

	mvOsPrintf("MV_USB_PHY_POWER_CTRL_REG       : 0x%X = 0x%08x\n",
		   MV_USB_PHY_POWER_CTRL_REG(dev), MV_REG_READ(MV_USB_PHY_POWER_CTRL_REG(dev)));

	mvOsPrintf("MV_USB_PHY_TX_CTRL_REG          : 0x%X = 0x%08x\n",
		   MV_USB_PHY_TX_CTRL_REG(dev), MV_REG_READ(MV_USB_PHY_TX_CTRL_REG(dev)));
	mvOsPrintf("MV_USB_PHY_RX_CTRL_REG          : 0x%X = 0x%08x\n",
		   MV_USB_PHY_RX_CTRL_REG(dev), MV_REG_READ(MV_USB_PHY_RX_CTRL_REG(dev)));
	mvOsPrintf("MV_USB_PHY_IVREF_CTRL_REG       : 0x%X = 0x%08x\n",
		   MV_USB_PHY_IVREF_CTRL_REG(dev), MV_REG_READ(MV_USB_PHY_IVREF_CTRL_REG(dev)));

	mvOsPrintf("\n");

}

void mvUsbCoreRegs(int dev, MV_BOOL isHost)
{
	mvOsPrintf("\n\t USB-%d Core %s Registers\n\n", dev, isHost ? "HOST" : "DEVICE");

	mvOsPrintf("MV_USB_CORE_ID_REG                  : 0x%X = 0x%08x\n",
		   MV_USB_CORE_ID_REG(dev), MV_REG_READ(MV_USB_CORE_ID_REG(dev)));

	mvOsPrintf("MV_USB_CORE_GENERAL_REG             : 0x%X = 0x%08x\n",
		   MV_USB_CORE_GENERAL_REG(dev), MV_REG_READ(MV_USB_CORE_GENERAL_REG(dev)));

	if (isHost) {
		mvOsPrintf("MV_USB_CORE_HOST_REG                : 0x%X = 0x%08x\n",
			   MV_USB_CORE_HOST_REG(dev), MV_REG_READ(MV_USB_CORE_HOST_REG(dev)));

		mvOsPrintf("MV_USB_CORE_TTTX_BUF_REG            : 0x%X = 0x%08x\n",
			   MV_USB_CORE_TTTX_BUF_REG(dev), MV_REG_READ(MV_USB_CORE_TTTX_BUF_REG(dev)));

		mvOsPrintf("MV_USB_CORE_TTRX_BUF_REG            : 0x%X = 0x%08x\n",
			   MV_USB_CORE_TTRX_BUF_REG(dev), MV_REG_READ(MV_USB_CORE_TTRX_BUF_REG(dev)));
	} else {
		mvOsPrintf("MV_USB_CORE_DEVICE_REG              : 0x%X = 0x%08x\n",
			   MV_USB_CORE_DEVICE_REG(dev), MV_REG_READ(MV_USB_CORE_DEVICE_REG(dev)));
	}

	mvOsPrintf("MV_USB_CORE_TX_BUF_REG              : 0x%X = 0x%08x\n",
		   MV_USB_CORE_TX_BUF_REG(dev), MV_REG_READ(MV_USB_CORE_TX_BUF_REG(dev)));

	mvOsPrintf("MV_USB_CORE_RX_BUF_REG              : 0x%X = 0x%08x\n",
		   MV_USB_CORE_RX_BUF_REG(dev), MV_REG_READ(MV_USB_CORE_RX_BUF_REG(dev)));

	mvOsPrintf("MV_USB_CORE_CAP_LENGTH_REG          : 0x%X = 0x%08x\n",
		   MV_USB_CORE_CAP_LENGTH_REG(dev), MV_REG_READ(MV_USB_CORE_CAP_LENGTH_REG(dev)));

	if (isHost) {
		mvOsPrintf("MV_USB_CORE_CAP_HCS_PARAMS_REG      : 0x%X = 0x%08x\n",
			   MV_USB_CORE_CAP_HCS_PARAMS_REG(dev), MV_REG_READ(MV_USB_CORE_CAP_HCS_PARAMS_REG(dev)));

		mvOsPrintf("MV_USB_CORE_CAP_HCC_PARAMS_REG      : 0x%X = 0x%08x\n",
			   MV_USB_CORE_CAP_HCC_PARAMS_REG(dev), MV_REG_READ(MV_USB_CORE_CAP_HCC_PARAMS_REG(dev)));
	} else {
		mvOsPrintf("MV_USB_CORE_CAP_DCI_VERSION_REG     : 0x%X = 0x%08x\n",
			   MV_USB_CORE_CAP_DCI_VERSION_REG(dev), MV_REG_READ(MV_USB_CORE_CAP_DCI_VERSION_REG(dev)));

		mvOsPrintf("MV_USB_CORE_CAP_DCC_PARAMS_REG      : 0x%X = 0x%08x\n",
			   MV_USB_CORE_CAP_DCC_PARAMS_REG(dev), MV_REG_READ(MV_USB_CORE_CAP_DCC_PARAMS_REG(dev)));
	}

	mvOsPrintf("MV_USB_CORE_CMD_REG                 : 0x%X = 0x%08x\n",
		   MV_USB_CORE_CMD_REG(dev), MV_REG_READ(MV_USB_CORE_CMD_REG(dev)));

	mvOsPrintf("MV_USB_CORE_STATUS_REG              : 0x%X = 0x%08x\n",
		   MV_USB_CORE_STATUS_REG(dev), MV_REG_READ(MV_USB_CORE_STATUS_REG(dev)));

	mvOsPrintf("MV_USB_CORE_INTR_REG                : 0x%X = 0x%08x\n",
		   MV_USB_CORE_INTR_REG(dev), MV_REG_READ(MV_USB_CORE_INTR_REG(dev)));

	mvOsPrintf("MV_USB_CORE_FRAME_INDEX_REG         : 0x%X = 0x%08x\n",
		   MV_USB_CORE_FRAME_INDEX_REG(dev), MV_REG_READ(MV_USB_CORE_FRAME_INDEX_REG(dev)));

	mvOsPrintf("MV_USB_CORE_MODE_REG                : 0x%X = 0x%08x\n",
		   MV_USB_CORE_MODE_REG(dev), MV_REG_READ(MV_USB_CORE_MODE_REG(dev)));

	if (isHost) {
		mvOsPrintf("MV_USB_CORE_PERIODIC_LIST_BASE_REG  : 0x%X = 0x%08x\n",
			   MV_USB_CORE_PERIODIC_LIST_BASE_REG(dev),
			   MV_REG_READ(MV_USB_CORE_PERIODIC_LIST_BASE_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ASYNC_LIST_ADDR_REG     : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ASYNC_LIST_ADDR_REG(dev), MV_REG_READ(MV_USB_CORE_ASYNC_LIST_ADDR_REG(dev)));

		mvOsPrintf("MV_USB_CORE_CONFIG_FLAG_REG         : 0x%X = 0x%08x\n",
			   MV_USB_CORE_CONFIG_FLAG_REG(dev), MV_REG_READ(MV_USB_CORE_CONFIG_FLAG_REG(dev)));
	} else {
		int numEp, ep;
		MV_U32 epCtrlVal;

		mvOsPrintf("MV_USB_CORE_DEV_ADDR_REG            : 0x%X = 0x%08x\n",
			   MV_USB_CORE_DEV_ADDR_REG(dev), MV_REG_READ(MV_USB_CORE_DEV_ADDR_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPOINT_LIST_ADDR_REG  : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPOINT_LIST_ADDR_REG(dev),
			   MV_REG_READ(MV_USB_CORE_ENDPOINT_LIST_ADDR_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPT_SETUP_STAT_REG    : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPT_SETUP_STAT_REG(dev), MV_REG_READ(MV_USB_CORE_ENDPT_SETUP_STAT_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPT_PRIME_REG         : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPT_PRIME_REG(dev), MV_REG_READ(MV_USB_CORE_ENDPT_PRIME_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPT_FLUSH_REG         : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPT_FLUSH_REG(dev), MV_REG_READ(MV_USB_CORE_ENDPT_FLUSH_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPT_STATUS_REG        : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPT_STATUS_REG(dev), MV_REG_READ(MV_USB_CORE_ENDPT_STATUS_REG(dev)));

		mvOsPrintf("MV_USB_CORE_ENDPT_COMPLETE_REG      : 0x%X = 0x%08x\n",
			   MV_USB_CORE_ENDPT_COMPLETE_REG(dev), MV_REG_READ(MV_USB_CORE_ENDPT_COMPLETE_REG(dev)));

		numEp = MV_REG_READ(MV_USB_CORE_CAP_DCC_PARAMS_REG(dev)) & 0x1F;

		for (ep = 0; ep < numEp; ep++) {
			epCtrlVal = MV_REG_READ(MV_USB_CORE_ENDPT_CTRL_REG(dev, ep));
			if (epCtrlVal == 0)
				continue;

			mvOsPrintf("MV_USB_CORE_ENDPT_CTRL_REG[%02d]      : 0x%X = 0x%08x\n",
				   ep, MV_USB_CORE_ENDPT_CTRL_REG(dev, ep), epCtrlVal);
		}
	}

	mvOsPrintf("MV_USB_CORE_PORTSC_REG              : 0x%X = 0x%08x\n",
		   MV_USB_CORE_PORTSC_REG(dev), MV_REG_READ(MV_USB_CORE_PORTSC_REG(dev)));
}
