示例#1
0
/*
*******************************************************************************
*                     open_clock
*
* Description:
*    void
*
* Parameters:
*    void
*
* Return value:
*    void
*
* note:
*    void
*
*******************************************************************************
*/
static int open_clock(struct sw_hci_hcd *sw_hci, u32 ohci)
{
 	DMSG_INFO("[%s]: open clock\n", sw_hci->hci_name);

    if(sw_hci->sie_clk && sw_hci->phy_gate
       && sw_hci->phy_reset && !sw_hci->clk_is_open){
        sw_hci->clk_is_open = 1;

 	    clk_enable(sw_hci->phy_gate);
		DMSG_DEBUG("[%s]: open clock, 0x60(0x%x), 0xcc(0x%x)\n",
				  sw_hci->hci_name,
				  (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0x60),
				  (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0xcc));

	    clk_enable(sw_hci->phy_reset);
		clk_reset(sw_hci->phy_reset, 0);
		DMSG_DEBUG("[%s]: open clock, 0x60(0x%x), 0xcc(0x%x)\n",
				  sw_hci->hci_name,
				  (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0x60),
				  (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0xcc));


        if(ohci && sw_hci->ohci_gate){
            clk_enable(sw_hci->ohci_gate);
        }

        mdelay(10);

   	    clk_enable(sw_hci->sie_clk);

        mdelay(10);

    	UsbPhyInit(sw_hci->usbc_no);
    }else{
		DMSG_PANIC("[%s]: wrn: open clock failed, (0x%p, 0x%p, 0x%p, %d, 0x%p)\n",
			      sw_hci->hci_name,
			      sw_hci->sie_clk, sw_hci->phy_gate,
			      sw_hci->phy_reset, sw_hci->clk_is_open,
			      sw_hci->ohci_gate);
	}

    DMSG_DEBUG("[%s]: open clock, 0x60(0x%x), 0xcc(0x%x)\n",
              sw_hci->hci_name,
              (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0x60),
              (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0xcc));

	return 0;
}
示例#2
0
/*
*******************************************************************************
*                     sw_set_vbus
*
* Description:
*    void
*
* Parameters:
*    void
*
* Return value:
*    void
*
* note:
*    void
*
*******************************************************************************
*/
static void sw_set_vbus(struct sw_hci_hcd *sw_hci, int is_on)
{
    DMSG_DEBUG("[%s]: sw_set_vbus cnt %d\n",
              sw_hci->hci_name,
              (sw_hci->usbc_no == 1) ? usb1_set_vbus_cnt : usb2_set_vbus_cnt);

    if(sw_hci->usbc_no == 1){
        if(is_on && usb1_set_vbus_cnt == 0){
            __sw_set_vbus(sw_hci, is_on);  /* power on */
        }else if(!is_on && usb1_set_vbus_cnt == 1){
            __sw_set_vbus(sw_hci, is_on);  /* power off */
        }

        if(is_on){
            usb1_set_vbus_cnt++;
        }else{
            usb1_set_vbus_cnt--;
        }
    }else{
        if(is_on && usb2_set_vbus_cnt == 0){
            __sw_set_vbus(sw_hci, is_on);  /* power on */
        }else if(!is_on && usb2_set_vbus_cnt == 1){
            __sw_set_vbus(sw_hci, is_on);  /* power off */
        }

        if(is_on){
            usb2_set_vbus_cnt++;
        }else{
            usb2_set_vbus_cnt--;
        }
    }

	return;
}
示例#3
0
/*
*******************************************************************************
*                     close_clock
*
* Description:
*    void
*
* Parameters:
*    void
*
* Return value:
*    void
*
* note:
*    void
*
*******************************************************************************
*/
static int close_clock(struct sw_hci_hcd *sw_hci, u32 ohci)
{
 	DMSG_INFO("[%s]: close clock\n", sw_hci->hci_name);

    if(sw_hci->sie_clk && sw_hci->phy_gate
       && sw_hci->phy_reset && sw_hci->clk_is_open){

    	sw_hci->clk_is_open = 0;

        if(ohci && sw_hci->ohci_gate){
	        clk_disable(sw_hci->ohci_gate);
	    }

		clk_reset(sw_hci->phy_reset, 1);
	    clk_disable(sw_hci->phy_reset);
	    clk_disable(sw_hci->phy_gate);

	    clk_disable(sw_hci->sie_clk);
    }else{
		DMSG_PANIC("[%s]: wrn: open clock failed, (0x%p, 0x%p, 0x%p, %d, 0x%p)\n",
			      sw_hci->hci_name,
			      sw_hci->sie_clk, sw_hci->phy_gate,
			      sw_hci->phy_reset, sw_hci->clk_is_open,
			      sw_hci->ohci_gate);
	}

    DMSG_DEBUG("[%s]: close clock, 0x60(0x%x), 0xcc(0x%x)\n",
              sw_hci->hci_name,
              (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0x60),
              (u32)USBC_Readl(SW_VA_CCM_IO_BASE + 0xcc));

	return 0;
}
static void dbg_clocks(struct sw_hci_hcd *sw_hci)
{
	DMSG_DEBUG("[%s]: clock info, SW_VA_CCM_AHBMOD_OFFSET(0x%x), SW_VA_CCM_USBCLK_OFFSET(0x%x)\n",
		   sw_hci->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));
}
static void UsbPhyInit(__u32 usbc_no)
{
	/* 调整 USB0 PHY 的幅度和速率 */
	USBC_Phy_Write(usbc_no, 0x20, 0x14, 5);

	/* DMSG_DEBUG("csr2-1: usbc%d: 0x%x\n", usbc_no, (u32)USBC_Phy_Read(usbc_no, 0x20, 5)); */

	/* 调节 disconnect 域值 */
	if (!sunxi_is_sun4i())
		USBC_Phy_Write(usbc_no, 0x2a, 2, 2);
	else
		USBC_Phy_Write(usbc_no, 0x2a, 3, 2);

	/* DMSG_DEBUG("csr2: usbc%d: 0x%x\n", usbc_no, (u32)USBC_Phy_Read(usbc_no, 0x2a, 2)); */
	DMSG_DEBUG("csr3: usbc%d: 0x%x\n", usbc_no, (u32)readl(USBC_Phy_GetCsr(usbc_no)));

	return;
}
示例#6
0
static void print_sunxi_hci(struct sunxi_hci_hcd *sunxi_hci)
{
	DMSG_DEBUG("\n------%s config------\n", sunxi_hci->hci_name);
	DMSG_DEBUG("hci_name                 = %s\n", sunxi_hci->hci_name);
	DMSG_DEBUG("irq_no                   = %d\n", sunxi_hci->irq_no);
	DMSG_DEBUG("usbc_no                  = %d\n", sunxi_hci->usbc_no);

	DMSG_DEBUG("usb_vbase                = 0x%p\n", sunxi_hci->usb_vbase);
	DMSG_DEBUG("sram_vbase               = 0x%p\n", sunxi_hci->sram_vbase);
	DMSG_DEBUG("clock_vbase              = 0x%p\n", sunxi_hci->clock_vbase);
	DMSG_DEBUG("sdram_vbase              = 0x%p\n", sunxi_hci->sdram_vbase);

	DMSG_DEBUG("used                     = %d\n", sunxi_hci->used);
	DMSG_DEBUG("host_init_state          = %d\n", sunxi_hci->host_init_state);

	DMSG_DEBUG("gpio_name                = %s\n", sunxi_hci->drv_vbus_gpio_set.gpio_name);
	DMSG_DEBUG("port                     = %d\n", sunxi_hci->drv_vbus_gpio_set.port);
	DMSG_DEBUG("port_num                 = %d\n", sunxi_hci->drv_vbus_gpio_set.port_num);
	DMSG_DEBUG("mul_sel                  = %d\n", sunxi_hci->drv_vbus_gpio_set.mul_sel);
	DMSG_DEBUG("pull                     = %d\n", sunxi_hci->drv_vbus_gpio_set.pull);
	DMSG_DEBUG("drv_level                = %d\n", sunxi_hci->drv_vbus_gpio_set.drv_level);
	DMSG_DEBUG("data                     = %d\n", sunxi_hci->drv_vbus_gpio_set.data);

	DMSG_DEBUG("\n--------------------------\n");

	return;
}