|
@@ -82,6 +82,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
|
|
}
|
|
}
|
|
} while ((tmp & USBE) != USBE);
|
|
} while ((tmp & USBE) != USBE);
|
|
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
|
|
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
|
|
|
|
+#if !defined(CONFIG_RZA_USB)
|
|
r8a66597_mdfy(r8a66597, CONFIG_R8A66597_XTAL, XTAL, SYSCFG0);
|
|
r8a66597_mdfy(r8a66597, CONFIG_R8A66597_XTAL, XTAL, SYSCFG0);
|
|
|
|
|
|
i = 0;
|
|
i = 0;
|
|
@@ -94,6 +95,20 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
} while ((tmp & SCKE) != SCKE);
|
|
} while ((tmp & SCKE) != SCKE);
|
|
|
|
+#else
|
|
|
|
+ /*
|
|
|
|
+ * RZ/A Only:
|
|
|
|
+ * Bits XTAL(UCKSEL) and UPLLE in SYSCFG0 for USB0 controls both USB0
|
|
|
|
+ * and USB1, so we must always set the USB0 register
|
|
|
|
+ */
|
|
|
|
+#if (CONFIG_R8A66597_XTAL == 1)
|
|
|
|
+ setbits(le16, R8A66597_BASE0, XTAL);
|
|
|
|
+#endif
|
|
|
|
+ mdelay(1);
|
|
|
|
+ setbits(le16, R8A66597_BASE0, UPLLE);
|
|
|
|
+ mdelay(1);
|
|
|
|
+ r8a66597_bset(r8a66597, SUSPM, SUSPMODE0);
|
|
|
|
+#endif /* CONFIG_RZA_USB */
|
|
#endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */
|
|
#endif /* #if defined(CONFIG_SUPERH_ON_CHIP_R8A66597) */
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -101,6 +116,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
|
|
|
|
|
|
static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
|
|
static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
|
|
{
|
|
{
|
|
|
|
+#if !defined(CONFIG_RZA_USB)
|
|
r8a66597_bclr(r8a66597, SCKE, SYSCFG0);
|
|
r8a66597_bclr(r8a66597, SCKE, SYSCFG0);
|
|
udelay(1);
|
|
udelay(1);
|
|
#if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
|
|
#if !defined(CONFIG_SUPERH_ON_CHIP_R8A66597)
|
|
@@ -108,6 +124,15 @@ static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
|
|
r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
|
|
r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
|
|
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
|
|
r8a66597_bclr(r8a66597, USBE, SYSCFG0);
|
|
#endif
|
|
#endif
|
|
|
|
+#else
|
|
|
|
+ r8a66597_bclr(r8a66597, SUSPM, SUSPMODE0);
|
|
|
|
+
|
|
|
|
+ clrbits(le16, R8A66597_BASE0, UPLLE);
|
|
|
|
+ mdelay(1);
|
|
|
|
+ r8a66597_bclr(r8a66597, USBE, SYSCFG0);
|
|
|
|
+ mdelay(1);
|
|
|
|
+
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
|
|
static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
|
|
@@ -118,7 +143,9 @@ static void r8a66597_enable_port(struct r8a66597 *r8a66597, int port)
|
|
r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
|
|
r8a66597_bset(r8a66597, val, get_syscfg_reg(port));
|
|
r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
|
|
r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port));
|
|
|
|
|
|
|
|
+#if !defined(CONFIG_RZA_USB)
|
|
r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port));
|
|
r8a66597_write(r8a66597, BURST | CPU_ADR_RD_WR, get_dmacfg_reg(port));
|
|
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
|
|
static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
|
|
static void r8a66597_disable_port(struct r8a66597 *r8a66597, int port)
|
|
@@ -148,7 +175,9 @@ static int enable_controller(struct r8a66597 *r8a66597)
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
|
|
+#if !defined(CONFIG_RZA_USB)
|
|
r8a66597_bset(r8a66597, CONFIG_R8A66597_LDRV & LDRV, PINCFG);
|
|
r8a66597_bset(r8a66597, CONFIG_R8A66597_LDRV & LDRV, PINCFG);
|
|
|
|
+#endif
|
|
r8a66597_bset(r8a66597, USBE, SYSCFG0);
|
|
r8a66597_bset(r8a66597, USBE, SYSCFG0);
|
|
|
|
|
|
r8a66597_bset(r8a66597, INTL, SOFCFG);
|
|
r8a66597_bset(r8a66597, INTL, SOFCFG);
|
|
@@ -266,12 +295,30 @@ static int send_setup_packet(struct r8a66597 *r8a66597, struct usb_device *dev,
|
|
unsigned long setup_addr = USBREQ;
|
|
unsigned long setup_addr = USBREQ;
|
|
u16 intsts1;
|
|
u16 intsts1;
|
|
int timeout = 3000;
|
|
int timeout = 3000;
|
|
|
|
+#if defined(CONFIG_RZA_USB)
|
|
|
|
+ u16 dcpctr;
|
|
|
|
+ int timeout2 = 10000;
|
|
|
|
+#endif
|
|
u16 devsel = setup->request == USB_REQ_SET_ADDRESS ? 0 : dev->devnum;
|
|
u16 devsel = setup->request == USB_REQ_SET_ADDRESS ? 0 : dev->devnum;
|
|
|
|
|
|
r8a66597_write(r8a66597, make_devsel(devsel) |
|
|
r8a66597_write(r8a66597, make_devsel(devsel) |
|
|
(8 << dev->maxpacketsize), DCPMAXP);
|
|
(8 << dev->maxpacketsize), DCPMAXP);
|
|
r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1);
|
|
r8a66597_write(r8a66597, ~(SIGN | SACK), INTSTS1);
|
|
|
|
|
|
|
|
+#if defined(CONFIG_RZA_USB)
|
|
|
|
+ dcpctr = r8a66597_read(r8a66597, DCPCTR);
|
|
|
|
+ if ((dcpctr & PID) == PID_BUF) {
|
|
|
|
+ timeout2 = 10000;
|
|
|
|
+ while (!(dcpctr & BSTS)) {
|
|
|
|
+ dcpctr = r8a66597_read(r8a66597, DCPCTR);
|
|
|
|
+ if (timeout2-- < 0) {
|
|
|
|
+ printf("DCPCTR clear timeout!\n");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
for (i = 0; i < 4; i++) {
|
|
for (i = 0; i < 4; i++) {
|
|
r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr);
|
|
r8a66597_write(r8a66597, le16_to_cpu(p[i]), setup_addr);
|
|
setup_addr += 2;
|
|
setup_addr += 2;
|