static __u32 USBC_Phy_TpWrite(__u32 usbc_no, __u32 addr, __u32 data, __u32 len) { __u32 temp = 0, dtmp = 0; __u32 j=0; dtmp = data; for(j = 0; j < len; j++) { /* set the bit address to be write */ temp = USBC_Readl(USBC_Phy_GetCsr(usbc_no)); temp &= ~(0xff << 8); temp |= ((addr + j) << 8); USBC_Writel(temp, USBC_Phy_GetCsr(usbc_no)); temp = USBC_Readb(USBC_Phy_GetCsr(usbc_no)); temp &= ~(0x1 << 7); temp |= (dtmp & 0x1) << 7; temp &= ~(0x1 << (usbc_no << 1)); USBC_Writeb(temp, USBC_Phy_GetCsr(usbc_no)); temp = USBC_Readb(USBC_Phy_GetCsr(usbc_no)); temp |= (0x1 << (usbc_no << 1)); USBC_Writeb( temp, USBC_Phy_GetCsr(usbc_no)); temp = USBC_Readb(USBC_Phy_GetCsr(usbc_no)); temp &= ~(0x1 << (usbc_no <<1 )); USBC_Writeb(temp, USBC_Phy_GetCsr(usbc_no)); dtmp >>= 1; } return data; }
static __u32 USBC_Phy_TpRead(__u32 usbc_no, __u32 addr, __u32 len) { __u32 temp = 0, ret = 0; __u32 i=0; __u32 j=0; for(j = len; j > 0; j--) { /* set the bit address to be read */ temp = USBC_Readl(USBC_Phy_GetCsr(usbc_no)); temp &= ~(0xff << 8); temp |= ((addr + j -1) << 8); USBC_Writel(temp, USBC_Phy_GetCsr(usbc_no)); for(i = 0; i < 0x4; i++); temp = USBC_Readl(USBC_Phy_GetCsr(usbc_no)); ret <<= 1; ret |= ((temp >> (16 + usbc_no)) & 0x1); } return ret; }
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; }
static __u32 USBC_Phy_Write(__u32 usbc_no, __u32 addr, __u32 data, __u32 len) { __u32 temp = 0, dtmp = 0; __u32 j = 0; __u32 usbc_bit = 0; __u32 dest = USBC_Phy_GetCsr(usbc_no); dtmp = data; usbc_bit = BIT(usbc_no * 2); for (j = 0; j < len; j++) { /* set the bit address to be written */ temp = readl(dest); temp &= ~(0xff << 8); temp |= ((addr + j) << 8); writel(temp, dest); /* clear usbc bit and set data bit */ temp = readb(dest); temp &= ~usbc_bit; if (dtmp & 0x1) temp |= BIT(7); else temp &= ~BIT(7); writeb(temp, dest); /* set usbc bit */ temp = readb(dest); temp |= usbc_bit; writeb(temp, dest); /* clear usbc bit */ temp = readb(dest); temp &= ~usbc_bit; writeb(temp, dest); dtmp >>= 1; } return data; }