コード例 #1
0
ファイル: mv_usb.c プロジェクト: tigergao0113/uboot
/*
 * Create the appropriate control structures to manage
 * a new EHCI host controller.
 */
int ehci_hcd_init(void)
{
	char *env;
	int usbActive;

	env = getenv("usbActive");
	usbActive = simple_strtoul(env, NULL, 10);
	printf("Active port:\t");
	if (usbActive >= mvCtrlUsbMaxGet()) {
		printf("invalid port number %d, switching to port 0\n", usbActive);
		usbActive=0;
	} else {
		printf("%d\n", usbActive);
	}

	hccr = (struct ehci_hccr *)(INTER_REGS_BASE + MV_USB_REGS_OFFSET(usbActive) + 0x100);
	hcor = (struct ehci_hcor *)((uint32_t) hccr + HC_LENGTH(ehci_readl(&hccr->cr_capbase)));

	debug ("Marvell init hccr %x and hcor %x hc_length %d\n",
		(uint32_t)hccr, (uint32_t)hcor,
		(uint32_t)HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
	return 0;
}
コード例 #2
0
ファイル: usb.c プロジェクト: KevinCabana/xpenology
static int __init   mv_usb_init(void)
{
    int                     status, dev, num, isHost;
    char*                   name_ptr;
    struct platform_device* mv_usb_dev_ptr;

    num = mvCtrlUsbMaxGet(); 
    for(dev=0; dev<num; dev++)
    {

#if defined(CONFIG_MV78200) || defined(CONFIG_MV632X)
	if (MV_FALSE == mvSocUnitIsMappedToThisCpu(USB0+dev))
	{
		    printk(KERN_INFO"USB %d is not mapped to this CPU\n", dev);
		    continue;
	}		
#endif

	if (MV_FALSE == mvCtrlPwrClckGet(USB_UNIT_ID, dev))
	{
		printk("\nWarning Integrated USB %d is Powered Off\n",dev);
		continue;
			
	}

	isHost = mvIsUsbHost & (1 << dev);

        if(isHost)
        {        
            name_ptr = usb_host_name;
        }
        else
        {
            name_ptr = usb_dev_name;
        }

        status = mvUsbInit(dev, isHost);

        mv_usb_dev_ptr = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
        if(mv_usb_dev_ptr == NULL)
        {
            printk("Can't allocate platform_device structure - %d bytes\n",
                    sizeof(struct platform_device) );
            return 1;
        }
        memset(mv_usb_dev_ptr, 0, sizeof(struct platform_device) );

        mv_usb_dev_ptr->name               = name_ptr;
        mv_usb_dev_ptr->id                 = PCI_VENDOR_ID_MARVELL | (MV_USB_VERSION << 16) | (dev << 24);

        mv_usb_dev_ptr->num_resources  = 2;

        mv_usb_dev_ptr->resource = (struct resource*)kmalloc(2*sizeof(struct resource), GFP_KERNEL);
        if(mv_usb_dev_ptr->resource == NULL)
        {
            printk("Can't allocate 2 resource structure - %d bytes\n",
                    2*sizeof(struct resource) );
            return 1;
        }
        memset(mv_usb_dev_ptr->resource, 0, 2*sizeof(struct resource));

        mv_usb_dev_ptr->resource[0].start = 
                        ( INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev));
        mv_usb_dev_ptr->resource[0].end   = 
                        ((INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev)) + 4096);
        mv_usb_dev_ptr->resource[0].flags = IORESOURCE_DMA;

        mv_usb_dev_ptr->resource[1].start = IRQ_USB_CTRL(dev);
        mv_usb_dev_ptr->resource[1].flags = IORESOURCE_IRQ;

        mv_usb_dev_ptr->dev.dma_mask           = kmalloc(sizeof(u64), GFP_KERNEL);
        *mv_usb_dev_ptr->dev.dma_mask          = MV_USB_DMA_MASK;

        mv_usb_dev_ptr->dev.coherent_dma_mask  = ~0;
        mv_usb_dev_ptr->dev.release            = mv_usb_release;
        strncpy(mv_usb_dev_ptr->dev.bus_id, usb_bus_name, BUS_ID_SIZE);

        printk("Marvell USB EHCI %s controller #%d: %p\n", 
                isHost ? "Host" : "Gadget", dev, mv_usb_dev_ptr); 
        
        status = platform_device_register(mv_usb_dev_ptr);
        if (status)
        {
            printk("Can't register Marvell USB EHCI controller #%d, status=%d\n", 
                        dev, status);
            return status;
        }
    }    
    return 0;
}
コード例 #3
0
int do_active_units(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	MV_U32  cpuNum, egigaNum, pexNum;
	MV_U32  i;

	printf("Active: ");

	/*   CPU	*/
	cpuNum = mvCtrlGetCpuNum();
	for (i = 0; i <= cpuNum; i++) {
		if (i)
			printf(", ");
		printf("cpu%d", i);
	}

	/*   PEX	*/
	pexNum = mvCtrlPexActiveUnitNumGet();
	for (i = 0; i < pexNum; i++)
		printf(", pex%d", i);

	/*   EGIGA	*/
	egigaNum = mvCtrlEthMaxPortGet();
	for (i = 0; i < egigaNum; i++) {
		if (mvBoardIsEthActive(i) == MV_TRUE)
			printf(", egiga%d", i);
	}

#ifdef MV_USB
	/*   USB	*/
	MV_U32 usbNum = mvCtrlUsbMaxGet() + mvCtrlUsb3MaxGet();
	for (i = 0; i < usbNum; i++)
		printf(", usb%d", i);
#endif

	/*   SDIO	*/
#ifdef CONFIG_MRVL_MMC
	if (mvCtrlSdioSupport() == MV_TRUE)
		printf(", mmc0");
#endif

	/*   SATA	*/
#if defined(MV_INCLUDE_INTEG_SATA)
	MV_U32 sataNum = mvCtrlSataMaxPortGet();
	for (i = 0; i < sataNum; i++)
		printf(", sata%d", i);
#endif

	/*   SPI	*/
#if defined(MV_INCLUDE_SPI)
	printf(", spi");
#endif

	/*   NAND	*/
#if defined(MV_NAND)
	printf(", nand");
#endif

	/*   I2C	*/
#if defined(MV_INCLUDE_TWSI)
	printf(", i2c0");
#endif

#if defined (MV_INCLUDE_TDM)
	/*   TDM	*/
	if (mvBoardSlicUnitTypeGet() != MV_BOARD_SLIC_DISABLED)
		printf(", tdm0");
#endif

	printf("\n");
	return 0;
}
コード例 #4
0
static int __init   mv_usb_init(void)
{
	int                     status, dev, num, isHost;
	char*                   name_ptr;
	struct platform_device* mv_usb_dev_ptr;
	int 			irq_num[3] = {	IRQ_AURORA_USB0,
						IRQ_AURORA_USB1,
						IRQ_AURORA_USB2};

	num = mvCtrlUsbMaxGet(); 
	if (num > MAX_USB_PORTS) {
		printk("WARNING: Limited USB ports number to %d\n", MAX_USB_PORTS);
		num = MAX_USB_PORTS;
	}

	for(dev=0; dev<num; dev++)
	{
		if (MV_FALSE == mvCtrlPwrClckGet(USB_UNIT_ID, dev))
		{
			printk("\nWarning Integrated USB %d is Powered Off\n",dev);
			continue;
		}

		/* Check if this USB is mapped to this AMP group - YY */
		if(MV_FALSE == mvUnitMapIsMine(USB0 + dev))
		{
			continue;
		}

		isHost = mvIsUsbHost & (1 << dev);

		if(isHost)
			name_ptr = usb_host_name;
		else
			name_ptr = usb_dev_name;

		printk("registered dev#%d asa %s\n",dev,name_ptr);
		status = mvSysUsbInit(dev, isHost);

		mv_usb_dev_ptr = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
		if(mv_usb_dev_ptr == NULL)
		{
			printk("Can't allocate platform_device structure - %d bytes\n",
					sizeof(struct platform_device) );
			return 1;
		}
		memset(mv_usb_dev_ptr, 0, sizeof(struct platform_device) );

		mv_usb_dev_ptr->name               = name_ptr;
		mv_usb_dev_ptr->id                 = dev;

		mv_usb_dev_ptr->num_resources  = 2;

		mv_usb_dev_ptr->resource = (struct resource*)kmalloc(2*sizeof(struct resource), GFP_KERNEL);
		if(mv_usb_dev_ptr->resource == NULL)
		{
			printk("Can't allocate 2 resource structure - %d bytes\n",
					2*sizeof(struct resource) );
			kfree(mv_usb_dev_ptr);
			return 1;
		}
		memset(mv_usb_dev_ptr->resource, 0, 2*sizeof(struct resource));

		mv_usb_dev_ptr->resource[0].start =
			( INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev));
		mv_usb_dev_ptr->resource[0].end   =
			((INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev)) + 4096);
		mv_usb_dev_ptr->resource[0].flags = IORESOURCE_DMA;

		mv_usb_dev_ptr->resource[1].start = irq_num[dev];
		mv_usb_dev_ptr->resource[1].flags = IORESOURCE_IRQ;

		mv_usb_dev_ptr->dev.dma_mask           = kmalloc(sizeof(u64), GFP_KERNEL);
		*mv_usb_dev_ptr->dev.dma_mask          = MV_USB_DMA_MASK;

		mv_usb_dev_ptr->dev.coherent_dma_mask  = ~0;
		mv_usb_dev_ptr->dev.release            = mv_usb_release;
		dev_set_name(&mv_usb_dev_ptr->dev, "%s", usb_bus_name);

		printk("Marvell USB %s controller #%d: %p\n",
				isHost ? "EHCI Host" : "Gadget", dev, mv_usb_dev_ptr);

		status = platform_device_register(mv_usb_dev_ptr);
		if (status)
		{
			printk("Can't register Marvell USB EHCI controller #%d, status=%d\n", 
					dev, status);
			return status;
		}
	}
	return 0;
}
コード例 #5
0
/*******************************************************************************
* mvSysUsbHalInit - Initialize the USB subsystem
*
* DESCRIPTION:
*
* INPUT:
*       None
* OUTPUT:
*		None
* RETURN:
*       None
*
*******************************************************************************/
MV_STATUS mvSysUsbInit(MV_VOID)
{
	MV_USB_HAL_DATA halData;
	MV_STATUS status = MV_OK;
	MV_U32 dev;
	MV_UNIT_WIN_INFO addrWinMap[MAX_TARGETS + 1];
	halData.ctrlModel = mvCtrlModelGet();
	halData.ctrlRev = mvCtrlRevGet();
	halData.ctrlFamily = mvCtrlDevFamilyIdGet(halData.ctrlModel);


	status = mvCtrlAddrWinMapBuild(addrWinMap, MAX_TARGETS + 1);

#ifdef CONFIG_USB_EHCI
		MV_BOOL isHost;
		char envname[10], *env;
		int maxUsbPorts = mvCtrlUsbMaxGet();
		/* for ALP/A375: if using single usb2 port, use Virtual MAC ID since
		 MAC ID0 (usbActive =0) is connected to Physical MAC ID1 */
		int id, mac_id[2] = {1, 0};

		 for (id = 0; id < maxUsbPorts ; id++) {
			if (mvBoardIsUsbPortConnected(USB_UNIT_ID,id) == MV_FALSE)
				continue;
			if (maxUsbPorts == 1 && (halData.ctrlFamily == MV_88F67X0 ||
					(halData.ctrlRev == MV_88F66XX_A0_ID && halData.ctrlFamily == MV_88F66X0)))
				dev = mac_id[id];
			else
				dev = id;

			sprintf(envname, "usb%dMode", dev);
			env = getenv(envname);
			if ((!env) || (strcmp(env, "device") == 0) || (strcmp(env, "Device") == 0))
				isHost = MV_FALSE;
			else
				isHost = MV_TRUE;

			if (status == MV_OK)	/* Map DDR windows to EHCI */
#ifdef CONFIG_USB_XHCI_HCD
/* CONFIG_USB_XHCI_HCD indicate that both xHCI and eHCI are compiled:
 * Last Boolean argument is used to indicate the HAL layer which unit is currently initiated */
				status = mvUsbWinInit(dev, addrWinMap, MV_FALSE);
#else
				status = mvUsbWinInit(dev, addrWinMap);
#endif
			if (status == MV_OK)
				status = mvUsbHalInit(dev, isHost, &halData);
			if (status == MV_OK)
				printf("USB2.0 %d: %s Mode\n", dev, (isHost == MV_TRUE ? "Host" : "Device"));
			else
				mvOsPrintf("%s: Error: USB2.0 initialization failed (port %d).\n", __func__, dev);
		}
#endif
#ifdef CONFIG_USB_XHCI
		MV_U32 reg;
		for (dev = 0; dev < mvCtrlUsb3HostMaxGet(); dev++) {
			if (mvBoardIsUsbPortConnected(USB3_UNIT_ID,dev) == MV_FALSE)
				continue;
			status = mvUsbUtmiPhyInit(dev, &halData);
			if (halData.ctrlFamily == MV_88F66X0 || halData.ctrlFamily == MV_88F67X0) {
				/* ALP/A375: Set UTMI PHY Selector:
				 * - Connect UTMI PHY to USB2 port of USB3 Host
				 * - Powers down the other unit (so USB3.0 unit's registers are accessible) */
				reg = MV_REG_READ(USB_CLUSTER_CONTROL);
				reg = (reg & (~0x1)) | 0x1;
				MV_REG_WRITE(USB_CLUSTER_CONTROL, reg);
			}
			if (status == MV_OK)	/* Map DDR windows to XHCI */
				status = mvUsbWinInit(mvCtrlUsbMapGet(USB3_UNIT_ID, dev), addrWinMap, MV_TRUE);
			if (status == MV_OK)
				printf("USB3.0 %d: Host Mode\n", mvCtrlUsbMapGet(USB3_UNIT_ID, dev));
			else
				mvOsPrintf("%s: Error: USB3.0 initialization failed (port %d).\n", __func__,
						mvCtrlUsbMapGet(USB3_UNIT_ID, dev));
		}
#endif
	return status;
}
コード例 #6
0
ファイル: usb.c プロジェクト: juergh/dns323-fw
static int __init   mv_usb_init(void)
{
    int		                status, dev, num, isHost;
    char*                   name_ptr;
    struct platform_device* mv_usb_dev_ptr;

    if(mvCtrlModelRevGet() == MV_5181L_A0_ID) {
        /* metal problem */
        return 0;
    }

    num = mvCtrlUsbMaxGet(); 
    for(dev=0; dev<num; dev++)
    {
        isHost = mvIsUsbHost & (1 << dev);

        if(isHost)
        {        
            name_ptr = usb_host_name;
        }
        else
        {
            name_ptr = usb_dev_name;
        }

	    status = mvUsbInit(dev, isHost);

        mv_usb_dev_ptr = kmalloc(sizeof(struct platform_device), GFP_KERNEL);
        if(mv_usb_dev_ptr == NULL)
        {
            printk("Can't allocate platform_device structure - %d bytes\n",
                    sizeof(struct platform_device) );
            return 1;
        }
        memset(mv_usb_dev_ptr, 0, sizeof(struct platform_device) );

        mv_usb_dev_ptr->name               = name_ptr;
        mv_usb_dev_ptr->id                 = MV_USB_DEVICE_ID | (dev << 16);

        mv_usb_dev_ptr->num_resources  = 2;

        mv_usb_dev_ptr->resource = (struct resource*)kmalloc(2*sizeof(struct resource), GFP_KERNEL);
        if(mv_usb_dev_ptr->resource == NULL)
        {
            printk("Can't allocate 2 resource structure - %d bytes\n",
                    2*sizeof(struct resource) );
            return 1;
        }
        memset(mv_usb_dev_ptr->resource, 0, 2*sizeof(struct resource));

        mv_usb_dev_ptr->resource[0].start = 
                        ( INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev));
        mv_usb_dev_ptr->resource[0].end   = 
                        ((INTER_REGS_BASE | MV_USB_CORE_CAP_LENGTH_REG(dev)) + 4096);
        mv_usb_dev_ptr->resource[0].flags = IORESOURCE_MEM;

        mv_usb_dev_ptr->resource[1].start = IRQ_USB_CTRL(dev);
        mv_usb_dev_ptr->resource[1].flags = IORESOURCE_IRQ;

        mv_usb_dev_ptr->dev.dma_mask           = kmalloc(sizeof(u64), GFP_KERNEL);
        *mv_usb_dev_ptr->dev.dma_mask          = MV_USB_DMA_MASK;

        mv_usb_dev_ptr->dev.coherent_dma_mask  = ~0;
        mv_usb_dev_ptr->dev.release            = mv_usb_release;
        strncpy(mv_usb_dev_ptr->dev.bus_id, usb_bus_name, BUS_ID_SIZE);

        printk("Marvell USB EHCI %s controller #%d: %p\n", 
                isHost ? "Host" : "Gadget", dev, mv_usb_dev_ptr); 
        
        status = platform_device_register(mv_usb_dev_ptr);
        if (status)
        {
            printk("Can't register Marvell USB EHCI controller #%d, status=%d\n", 
                        dev, status);
            return status;
        }
    }    
    return 0;
}
コード例 #7
0
/*******************************************************************************
* mvUsbAddrDecShow - Print the USB address decode map.
*
* DESCRIPTION:
*       This function print the USB address decode map.
*
* INPUT:
*       None.
*
* OUTPUT:
*       None.
*
* RETURN:
*       None.
*
*******************************************************************************/
MV_VOID mvUsbAddrDecShow(MV_VOID)
{
    MV_UNIT_WIN_INFO	addrDecWin;
    int         	i, winNum;

    mvOsOutput( "\n" );
    mvOsOutput( "USB:\n" );
    mvOsOutput( "----\n" );

    for(i=0; i<mvCtrlUsbMaxGet(); i++)
    {
        mvOsOutput( "Device %d:\n", i);

        for(winNum = 0; winNum < MV_USB_MAX_ADDR_DECODE_WIN; winNum++)
        {
            memset(&addrDecWin, 0, sizeof(MV_DEC_WIN) );

            mvOsOutput( "win%d - ", winNum );

            if( mvUsbWinRead(i, winNum, &addrDecWin ) == MV_OK )
            {
                if( addrDecWin.enable )
                {
			/* In MV88F6781 there is no differentiation between different DRAM Chip Selects,	*/
			/* they all use the same target ID and attributes. So in order to print correctly	*/
			/* we use i as the target. When i is 1 it is SDRAM_CS1 etc.				*/
			if (mvCtrlTargetByWinInfoGet(&addrDecWin) != SDRAM_CS0) {
				mvOsOutput( "%s base %08x, ",
                       		mvCtrlTargetNameGet(mvCtrlTargetByWinInfoGet(&addrDecWin)), addrDecWin.addrWin.baseLow );
			}
			else {
				mvOsOutput( "%s base %08x, ",
                        		mvCtrlTargetNameGet(winNum), addrDecWin.addrWin.baseLow);
			}

                    	mvSizePrint( addrDecWin.addrWin.size );

#if defined(MV645xx) || defined(MV646xx)
                    switch( addrDecWin.addrWinAttr.swapType)
                    {
                        case MV_BYTE_SWAP:
                            mvOsOutput( "BYTE_SWAP, " );
                            break;
                        case MV_NO_SWAP:
                            mvOsOutput( "NO_SWAP  , " );
                            break;
                        case MV_BYTE_WORD_SWAP:
                            mvOsOutput( "BYTE_WORD_SWAP, " );
                            break;
                        case MV_WORD_SWAP:
                            mvOsOutput( "WORD_SWAP, " );
                            break;
                        default:
                            mvOsOutput( "SWAP N/A , " );
                    }

                    switch( addrDecWin.addrWinAttr.cachePolicy )
                    {
                        case NO_COHERENCY:
                            mvOsOutput( "NO_COHERENCY , " );
                            break;
                        case WT_COHERENCY:
                            mvOsOutput( "WT_COHERENCY , " );
                            break;
                        case WB_COHERENCY:
                            mvOsOutput( "WB_COHERENCY , " );
                            break;
                        default:
                            mvOsOutput( "COHERENCY N/A, " );
                    }

                    switch( addrDecWin.addrWinAttr.pcixNoSnoop )
                    {
                        case 0:
                            mvOsOutput( "PCI-X NS inactive, " );
                            break;
                        case 1:
                            mvOsOutput( "PCI-X NS active  , " );
                            break;
                        default:
                            mvOsOutput( "PCI-X NS N/A     , " );
                    }

                    switch( addrDecWin.addrWinAttr.p2pReq64 )
                    {
                        case 0:
                            mvOsOutput( "REQ64 force" );
                            break;
                        case 1:
                            mvOsOutput( "REQ64 detect" );
                            break;
                        default:
                            mvOsOutput( "REQ64 N/A" );
                    }
#endif /* MV645xx || MV646xx */
                    mvOsOutput( "\n" );
                }
                else
                    mvOsOutput( "disable\n" );
            }
        }
    }
}