Esempio n. 1
0
/*
*******************************************************************************
*                     sw_usb_disable_hcd
*
* Description:
*    void
*
* Parameters:
*    void
*
* Return value:
*    void
*
* note:
*    void
*
*******************************************************************************
*/
int sw_usb_disable_hcd(__u32 usbc_no)
{
	if(usbc_no == 0){
#if defined(CONFIG_USB_SW_SUN4I_USB0_OTG) || defined(USB_SW_SUN4I_USB0_HOST_ONLY)
		sw_usb_disable_hcd0();
#endif
	}else if(usbc_no == 1){
#if defined(CONFIG_USB_SW_SUN4I_EHCI0)
		sw_usb_disable_ehci(usbc_no);
#endif

#if defined(CONFIG_USB_SW_SUN4I_OHCI0)
		sw_usb_disable_ohci(usbc_no);
#endif
	}else if(usbc_no == 2){
#if defined(CONFIG_USB_SW_SUN4I_EHCI1)
		sw_usb_disable_ehci(usbc_no);
#endif

#if defined(CONFIG_USB_SW_SUN4I_OHCI1)
		sw_usb_disable_ohci(usbc_no);
#endif
	}else{
		DMSG_PANIC("ERR: unkown usbc_no(%d)\n", usbc_no);
		return -1;
	}

    return 0;
}
static int sw_ohci_hcd_probe(struct platform_device *pdev)
{
	int ret;
	int irq;
	struct resource *res;
	struct usb_hcd *hcd = NULL;
	struct sw_hci_hcd *sw_ohci = NULL;

	if (pdev == NULL)
		return -EINVAL;

	sw_ohci = pdev->dev.platform_data;
	if (!sw_ohci)
		return -ENODATA;

	sw_ohci->pdev = pdev;
	g_sw_ohci[sw_ohci->usbc_no] = sw_ohci;

	pr_debug("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n",
		SW_OHCI_NAME, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci);

	/* get io resource */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		pr_err("%s: failed to get io memory\n", __func__);
		ret = -ENOMEM;
		goto err_get_iomem;
	}

	/*creat a usb_hcd for the ohci controller */
	hcd = usb_create_hcd(&sw_ohci_hc_driver, &pdev->dev, SW_OHCI_NAME);
	if (!hcd) {
		pr_err("%s: failed to create hcd\n", __func__);
		ret = -ENOMEM;
		goto err_create_hcd;
	}

	hcd->rsrc_start = res->start;
	hcd->rsrc_len = resource_size(res);
	hcd->regs = ioremap(res->start, resource_size(res));
	if (!hcd->regs) {
		pr_err("%s: failed to ioremap\n", __func__);
		ret = -ENOMEM;
		goto err_ioremap;
	}

	sw_ohci->hcd = hcd;

	/* ochi start to work */
	sw_start_ohc(sw_ohci);

	ohci_hcd_init(hcd_to_ohci(hcd));

	irq = platform_get_irq(pdev, 0);
	if (!irq) {
		pr_err("%s: failed to get irq\n", __func__);
		ret =  -ENODEV;
		goto err_get_irq;
	}

	ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
	if (ret != 0) {
		pr_err("%s: failed to add hcd, rc=%d\n", __func__, ret);
		goto err_add_hcd;
	}

	platform_set_drvdata(pdev, hcd);

	pr_debug("[%s]: probe, clock: SW_VA_CCM_AHBMOD_OFFSET(0x%x), SW_VA_CCM_USBCLK_OFFSET(0x%x);"
	     " usb: SW_USB_PMU_IRQ_ENABLE(0x%x), dram:(0x%x, 0x%x)\n",
	     sw_ohci->hci_name, (u32) readl(SW_VA_CCM_IO_BASE + SW_VA_CCM_AHBMOD_OFFSET),
	     (u32) readl(SW_VA_CCM_IO_BASE + SW_VA_CCM_USBCLK_OFFSET),
	     (u32) readl(sw_ohci->usb_vbase + SW_USB_PMU_IRQ_ENABLE),
	     (u32) readl(SW_VA_DRAM_IO_BASE + SW_SDRAM_REG_HPCR_USB1),
	     (u32) readl(SW_VA_DRAM_IO_BASE + SW_SDRAM_REG_HPCR_USB2));

	sw_ohci->probe = 1;

	/* Disable ohci, when driver probe */
	if (sw_ohci->host_init_state == 0) {
		if (ohci_first_probe[sw_ohci->usbc_no]) {
			sw_usb_disable_ohci(sw_ohci->usbc_no);
			ohci_first_probe[sw_ohci->usbc_no]--;
		}
	}

	return 0;

err_add_hcd:
err_get_irq:
	iounmap(hcd->regs);
err_ioremap:
	usb_put_hcd(hcd);
err_get_iomem:
err_create_hcd:
	sw_ohci->hcd = NULL;
	g_sw_ohci[sw_ohci->usbc_no] = NULL;
	return ret;
}
static int sw_ohci_hcd_probe(struct platform_device *pdev)
{
	int ret;
	struct usb_hcd *hcd = NULL;
	struct sw_hci_hcd *sw_ohci = NULL;

	if(pdev == NULL){
	    DMSG_PANIC("ERR: Argment is invaild\n");
	    return -1;
    }

    /* if usb is disabled, can not probe */
    if (usb_disabled()){
        DMSG_PANIC("ERR: usb hcd is disabled\n");
        return -ENODEV;
    }

	sw_ohci = pdev->dev.platform_data;
	if(!sw_ohci){
		DMSG_PANIC("ERR: sw_ohci is null\n");
		ret = -ENOMEM;
		goto ERR1;
	}

	sw_ohci->pdev = pdev;
	g_sw_ohci[sw_ohci->usbc_no] = sw_ohci;

	DMSG_INFO("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n",
		      ohci_name, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci);

	/* get io resource */
	sw_get_io_resource(pdev, sw_ohci);
	sw_ohci->ohci_base 			= sw_ohci->usb_vbase + SW_USB_OHCI_BASE_OFFSET;
	sw_ohci->ohci_reg_length 	= SW_USB_OHCI_LEN;

    /*creat a usb_hcd for the ohci controller*/
	hcd = usb_create_hcd(&sw_ohci_hc_driver, &pdev->dev, ohci_name);
	if(!hcd){
        DMSG_PANIC("ERR: usb_ohci_create_hcd failed\n");
        ret = -ENOMEM;
		goto ERR2;
	}

  	hcd->rsrc_start = (u32)sw_ohci->ohci_base;
	hcd->rsrc_len 	= sw_ohci->ohci_reg_length;
	hcd->regs 		= sw_ohci->ohci_base;
	sw_ohci->hcd    = hcd;

	/* ochi start to work */
	sw_start_ohc(sw_ohci);

    ohci_hcd_init(hcd_to_ohci(hcd));

    ret = usb_add_hcd(hcd, sw_ohci->irq_no, IRQF_DISABLED | IRQF_SHARED);
    if(ret != 0){
        DMSG_PANIC("ERR: usb_add_hcd failed\n");
        ret = -ENOMEM;
        goto ERR3;
    }

    platform_set_drvdata(pdev, hcd);

#ifdef  SW_USB_OHCI_DEBUG
    DMSG_INFO("[%s]: probe, clock: 0x60(0x%x), 0xcc(0x%x); usb: 0x800(0x%x), dram:(0x%x, 0x%x)\n",
              sw_ohci->hci_name,
              (u32)USBC_Readl(sw_ohci->clock_vbase + 0x60),
              (u32)USBC_Readl(sw_ohci->clock_vbase + 0xcc),
              (u32)USBC_Readl(sw_ohci->usb_vbase + 0x800),
              (u32)USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB1),
              (u32)USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB2));
#endif

	sw_ohci->probe = 1;

    /* Disable ohci, when driver probe */
    if(sw_ohci->host_init_state == 0){
        if(ohci_first_probe[sw_ohci->usbc_no]){
            sw_usb_disable_ohci(sw_ohci->usbc_no);
            ohci_first_probe[sw_ohci->usbc_no]--;
        }
    }

    return 0;

ERR3:
	usb_put_hcd(hcd);

ERR2:
	sw_ohci->hcd = NULL;
	g_sw_ohci[sw_ohci->usbc_no] = NULL;

ERR1:

    return ret;
}
Esempio n. 4
0
static int sw_ohci_hcd_probe(struct platform_device *pdev)
{
	int ret;
	struct usb_hcd *hcd = NULL;
	struct sw_hci_hcd *sw_ohci = NULL;

	if (pdev == NULL)
		return -EINVAL;

	/* if usb is disabled, can not probe */
	if (usb_disabled())
		return -ENODEV;

	sw_ohci = pdev->dev.platform_data;
	if (!sw_ohci)
		return -ENODATA;

	sw_ohci->pdev = pdev;
	g_sw_ohci[sw_ohci->usbc_no] = sw_ohci;

	pr_debug("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n",
		SW_OHCI_NAME, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci);

	/* get io resource */
	sw_get_io_resource(pdev, sw_ohci);
	sw_ohci->ohci_base = sw_ohci->usb_vbase + SW_USB_OHCI_BASE_OFFSET;
	sw_ohci->ohci_reg_length = SW_USB_OHCI_LEN;

	/*creat a usb_hcd for the ohci controller */
	hcd = usb_create_hcd(&sw_ohci_hc_driver, &pdev->dev, SW_OHCI_NAME);
	if (!hcd) {
		pr_err("%s: failed to create hcd\n", __func__);
		ret = -ENOMEM;
		goto err_create_hcd;
	}

	hcd->rsrc_start = (u32) sw_ohci->ohci_base;
	hcd->rsrc_len = sw_ohci->ohci_reg_length;
	hcd->regs = sw_ohci->ohci_base;
	sw_ohci->hcd = hcd;

	/* ochi start to work */
	sw_start_ohc(sw_ohci);

	ohci_hcd_init(hcd_to_ohci(hcd));

	ret = usb_add_hcd(hcd, sw_ohci->irq_no, IRQF_DISABLED | IRQF_SHARED);
	if (ret != 0) {
		pr_err("%s: failed to add hcd, rc=%d\n", __func__, ret);
		goto err_add_hcd;
	}

	platform_set_drvdata(pdev, hcd);

	pr_debug("[%s]: probe, clock: 0x60(0x%x), 0xcc(0x%x);"
	     " usb: 0x800(0x%x), dram:(0x%x, 0x%x)\n",
	     sw_ohci->hci_name, (u32) USBC_Readl(sw_ohci->clock_vbase + 0x60),
	     (u32) USBC_Readl(sw_ohci->clock_vbase + 0xcc),
	     (u32) USBC_Readl(sw_ohci->usb_vbase + 0x800),
	     (u32) USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB1),
	     (u32) USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB2));

	sw_ohci->probe = 1;

	/* Disable ohci, when driver probe */
	if (sw_ohci->host_init_state == 0) {
		if (ohci_first_probe[sw_ohci->usbc_no]) {
			sw_usb_disable_ohci(sw_ohci->usbc_no);
			ohci_first_probe[sw_ohci->usbc_no]--;
		}
	}

	return 0;

err_add_hcd:
	usb_put_hcd(hcd);
err_create_hcd:
	sw_ohci->hcd = NULL;
	g_sw_ohci[sw_ohci->usbc_no] = NULL;
	return ret;
}