projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
usb: dwc_otg_310: add rk3288 usb otg support
[firefly-linux-kernel-4.4.55.git]
/
drivers
/
usb
/
dwc_otg_310
/
dwc_otg_driver.c
diff --git
a/drivers/usb/dwc_otg_310/dwc_otg_driver.c
b/drivers/usb/dwc_otg_310/dwc_otg_driver.c
old mode 100755
(executable)
new mode 100644
(file)
index
775d29c
..
9905a39
--- a/
drivers/usb/dwc_otg_310/dwc_otg_driver.c
+++ b/
drivers/usb/dwc_otg_310/dwc_otg_driver.c
@@
-68,6
+68,7
@@
static const char dwc_host20_driver_name[] = "usb20_host";
static const char dwc_otg20_driver_name[] = "usb20_otg";
dwc_otg_device_t *g_otgdev;
static const char dwc_otg20_driver_name[] = "usb20_otg";
dwc_otg_device_t *g_otgdev;
+void *dwc_otg_dev;
extern int pcd_init(struct platform_device *_dev);
extern int otg20_hcd_init(struct platform_device *_dev);
extern int pcd_init(struct platform_device *_dev);
extern int otg20_hcd_init(struct platform_device *_dev);
@@
-77,8
+78,9
@@
extern void hcd_remove(struct platform_device *_dev);
extern void dwc_otg_adp_start(dwc_otg_core_if_t *core_if, uint8_t is_host);
extern void dwc_otg_adp_start(dwc_otg_core_if_t *core_if, uint8_t is_host);
-
+#ifdef CONFIG_RK_USB_UART
static u32 usb_to_uart_status;
static u32 usb_to_uart_status;
+#endif
/*-------------------------------------------------------------------------*/
/* Encapsulate the module parameter settings */
/*-------------------------------------------------------------------------*/
/* Encapsulate the module parameter settings */
@@
-384,6
+386,7
@@
void dwc_otg_force_device(dwc_otg_core_if_t *core_if)
local_irq_save(flags);
if (core_if->op_state == B_PERIPHERAL) {
local_irq_save(flags);
if (core_if->op_state == B_PERIPHERAL) {
+ local_irq_restore(flags);
printk
("dwc_otg_force_device,already in B_PERIPHERAL,everest\n");
return;
printk
("dwc_otg_force_device,already in B_PERIPHERAL,everest\n");
return;
@@
-914,6
+917,7
@@
static int host20_driver_remove(struct platform_device *_dev)
}
static const struct of_device_id usb20_host_of_match[] = {
}
static const struct of_device_id usb20_host_of_match[] = {
+#ifdef CONFIG_ARM
{
.compatible = "rockchip,rk3188_usb20_host",
.data = &usb20host_pdata_rk3188,
{
.compatible = "rockchip,rk3188_usb20_host",
.data = &usb20host_pdata_rk3188,
@@
-930,6
+934,7
@@
static const struct of_device_id usb20_host_of_match[] = {
.compatible = "rockchip,rk3126_usb20_host",
.data = &usb20host_pdata_rk3126,
},
.compatible = "rockchip,rk3126_usb20_host",
.data = &usb20host_pdata_rk3126,
},
+#endif
{},
};
{},
};
@@
-1157,18
+1162,16
@@
static void dwc_otg_driver_shutdown(struct platform_device *_dev)
dwc_otg_core_if_t *core_if = otg_dev->core_if;
struct dwc_otg_platform_data *pldata = otg_dev->pldata;
dctl_data_t dctl = {.d32 = 0 };
dwc_otg_core_if_t *core_if = otg_dev->core_if;
struct dwc_otg_platform_data *pldata = otg_dev->pldata;
dctl_data_t dctl = {.d32 = 0 };
+ dwc_otg_pcd_t *pcd = core_if->otg_dev->pcd;
DWC_PRINTF("%s: disconnect USB %s mode\n", __func__,
dwc_otg_is_host_mode(core_if) ? "host" : "device");
DWC_PRINTF("%s: disconnect USB %s mode\n", __func__,
dwc_otg_is_host_mode(core_if) ? "host" : "device");
- if (pldata->dwc_otg_uart_mode != NULL)
- pldata->dwc_otg_uart_mode(pldata, PHY_USB_MODE);
- if (pldata->phy_suspend != NULL)
- pldata->phy_suspend(pldata, USB_PHY_ENABLED);
if (dwc_otg_is_host_mode(core_if)) {
if (core_if->hcd_cb && core_if->hcd_cb->stop)
core_if->hcd_cb->stop(core_if->hcd_cb_p);
} else {
if (dwc_otg_is_host_mode(core_if)) {
if (core_if->hcd_cb && core_if->hcd_cb->stop)
core_if->hcd_cb->stop(core_if->hcd_cb_p);
} else {
+ cancel_delayed_work_sync(&pcd->check_vbus_work);
/* soft disconnect */
dctl.d32 =
DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl);
/* soft disconnect */
dctl.d32 =
DWC_READ_REG32(&core_if->dev_if->dev_global_regs->dctl);
@@
-1179,6
+1182,11
@@
static void dwc_otg_driver_shutdown(struct platform_device *_dev)
/* Clear any pending interrupts */
DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF);
/* Clear any pending interrupts */
DWC_WRITE_REG32(&core_if->core_global_regs->gintsts, 0xFFFFFFFF);
+ if (pldata->dwc_otg_uart_mode != NULL)
+ pldata->dwc_otg_uart_mode(pldata, PHY_USB_MODE);
+ if (pldata->phy_suspend != NULL)
+ pldata->phy_suspend(pldata, USB_PHY_ENABLED);
+
}
/**
}
/**
@@
-1284,6
+1292,7
@@
static int otg20_driver_remove(struct platform_device *_dev)
}
static const struct of_device_id usb20_otg_of_match[] = {
}
static const struct of_device_id usb20_otg_of_match[] = {
+#ifdef CONFIG_ARM
{
.compatible = "rockchip,rk3188_usb20_otg",
.data = &usb20otg_pdata_rk3188,
{
.compatible = "rockchip,rk3188_usb20_otg",
.data = &usb20otg_pdata_rk3188,
@@
-1300,10
+1309,13
@@
static const struct of_device_id usb20_otg_of_match[] = {
.compatible = "rockchip,rk3126_usb20_otg",
.data = &usb20otg_pdata_rk3126,
},
.compatible = "rockchip,rk3126_usb20_otg",
.data = &usb20otg_pdata_rk3126,
},
+#endif
+#ifdef CONFIG_ARM64
{
{
- .compatible = "rockchip,rk3368
_usb20_otg
",
+ .compatible = "rockchip,rk3368
-usb
",
.data = &usb20otg_pdata_rk3368,
},
.data = &usb20otg_pdata_rk3368,
},
+#endif
{ },
};
{ },
};
@@
-1409,6
+1421,7
@@
static int otg20_driver_probe(struct platform_device *_dev)
*/
g_otgdev = dwc_otg_device;
*/
g_otgdev = dwc_otg_device;
+ dwc_otg_dev = (struct device *)&_dev->dev;
pldata->privdata = dwc_otg_device;
dwc_otg_device->pldata = pldata;
pldata->privdata = dwc_otg_device;
dwc_otg_device->pldata = pldata;
@@
-1519,7
+1532,8
@@
static int otg20_driver_probe(struct platform_device *_dev)
* perform initial actions required for Internal ADP logic.
*/
if (!dwc_otg_get_param_adp_enable(dwc_otg_device->core_if)) {
* perform initial actions required for Internal ADP logic.
*/
if (!dwc_otg_get_param_adp_enable(dwc_otg_device->core_if)) {
- if (pldata->phy_status == USB_PHY_ENABLED) {
+ if (dwc_otg_device->core_if->usb_mode == USB_MODE_NORMAL &&
+ pldata->phy_status == USB_PHY_ENABLED) {
pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
udelay(3);
pldata->clock_enable(pldata, 0);
pldata->phy_suspend(pldata, USB_PHY_SUSPEND);
udelay(3);
pldata->clock_enable(pldata, 0);
@@
-1607,14
+1621,14
@@
static struct platform_driver dwc_otg_driver = {
void rk_usb_power_up(void)
{
struct dwc_otg_platform_data *pldata_otg;
void rk_usb_power_up(void)
{
struct dwc_otg_platform_data *pldata_otg;
+#ifdef CONFIG_USB20_HOST
struct dwc_otg_platform_data *pldata_host;
struct dwc_otg_platform_data *pldata_host;
+#endif
+#ifdef CONFIG_USB_EHCI_RK
struct rkehci_platform_data *pldata_ehci;
struct rkehci_platform_data *pldata_ehci;
- if (cpu_is_rk312x()) {
- pldata_otg = &usb20otg_pdata_rk3126;
- if (usb_to_uart_status)
- pldata_otg->dwc_otg_uart_mode(pldata_otg, PHY_UART_MODE);
- }
- if (cpu_is_rk3288()) {
+#endif
+
+ if (is_rk3288_usb()) {
#ifdef CONFIG_RK_USB_UART
/* enable USB bypass UART function */
writel_relaxed(0x00c00000 | usb_to_uart_status,
#ifdef CONFIG_RK_USB_UART
/* enable USB bypass UART function */
writel_relaxed(0x00c00000 | usb_to_uart_status,
@@
-1650,21
+1664,29
@@
void rk_usb_power_up(void)
}
#endif
}
#endif
+ } else {
+ dwc_otg_device_t *otg_dev = g_otgdev;
+
+ if (!otg_dev)
+ return;
+
+ pldata_otg = otg_dev->pldata;
+ if (pldata_otg && pldata_otg->phy_power_down)
+ pldata_otg->phy_power_down(PHY_POWER_UP);
}
}
void rk_usb_power_down(void)
{
struct dwc_otg_platform_data *pldata_otg;
}
}
void rk_usb_power_down(void)
{
struct dwc_otg_platform_data *pldata_otg;
+#ifdef CONFIG_USB20_HOST
struct dwc_otg_platform_data *pldata_host;
struct dwc_otg_platform_data *pldata_host;
+#endif
+#ifdef CONFIG_USB_EHCI_RK
struct rkehci_platform_data *pldata_ehci;
struct rkehci_platform_data *pldata_ehci;
+#endif
- if (cpu_is_rk312x()) {
- pldata_otg = &usb20otg_pdata_rk3126;
- usb_to_uart_status = pldata_otg->get_status(USB_STATUS_UARTMODE);
- pldata_otg->dwc_otg_uart_mode(pldata_otg, PHY_USB_MODE);
- }
- if (cpu_is_rk3288()) {
+ if (is_rk3288_usb()) {
#ifdef CONFIG_RK_USB_UART
/* disable USB bypass UART function */
usb_to_uart_status =
#ifdef CONFIG_RK_USB_UART
/* disable USB bypass UART function */
usb_to_uart_status =
@@
-1707,6
+1729,15
@@
void rk_usb_power_down(void)
RK3288_GRF_UOC1_CON0);
}
#endif
RK3288_GRF_UOC1_CON0);
}
#endif
+ } else {
+ dwc_otg_device_t *otg_dev = g_otgdev;
+
+ if (!otg_dev)
+ return;
+
+ pldata_otg = otg_dev->pldata;
+ if (pldata_otg && pldata_otg->phy_power_down)
+ pldata_otg->phy_power_down(PHY_POWER_DOWN);
}
}
}
}