From c49f135f72f98633653300bab5b0ac993b03c6be Mon Sep 17 00:00:00 2001 From: Imre Kaloz Date: Tue, 23 Jun 2009 21:04:37 +0000 Subject: use broken-out patches for the coldfire to make it easier to follow differences against the bsp SVN-Revision: 16547 --- .../patches/026-m5445x_usb_cleanup_2.patch | 470 +++++++++++++++++++++ 1 file changed, 470 insertions(+) create mode 100644 target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch (limited to 'target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch') diff --git a/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch b/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch new file mode 100644 index 0000000000..634e9dfc67 --- /dev/null +++ b/target/linux/coldfire/patches/026-m5445x_usb_cleanup_2.patch @@ -0,0 +1,470 @@ +From b014a8a0b66b1f0f55b3384f586f43e67e6dcc5d Mon Sep 17 00:00:00 2001 +From: Bruce Schmid +Date: Tue, 4 Dec 2007 16:03:17 -0700 +Subject: [PATCH] USB: cleanup + +LTIBName: m5445x-usb-cleanup-2 +Signed-off-by: Duck +--- + drivers/usb/gadget/mcf5445x_udc.c | 14 --- + drivers/usb/host/ehci-arc.c | 19 +--- + drivers/usb/otg/fsl_otg.c | 225 ++----------------------------------- + drivers/usb/otg/otg_fsm.h | 2 +- + include/linux/usb/fsl_usb2.h | 5 +- + 5 files changed, 15 insertions(+), 250 deletions(-) + +--- a/drivers/usb/gadget/mcf5445x_udc.c ++++ b/drivers/usb/gadget/mcf5445x_udc.c +@@ -321,11 +321,6 @@ static void pullup_enable(struct fsl_udc + temp = fsl_readl(&dr_regs->usbcmd); + temp |= USB_CMD_RUN_STOP; + fsl_writel(temp, &dr_regs->usbcmd); +- +-#ifdef NEVER /* DDD FIXME: we want this? */ +- if (!udc->transceiver) +- *((u16 *)(MCF_FBCS1_CSAR)) &= ~0x1; /* Enable pullup register */ +-#endif + } + + static void pullup_disable(struct fsl_udc *udc) +@@ -345,12 +340,6 @@ static void pullup_disable(struct fsl_ud + tmp = fsl_readl(&dr_regs->usbcmd); + tmp &= ~USB_CMD_RUN_STOP; + fsl_writel(tmp, &dr_regs->usbcmd); +- +-#ifdef NEVER /* DDD FIXME: we want this? */ +- if (!udc->transceiver) +- *((u16 *)(MCF_FBCS1_CSAR)) |= 0x1; /* Disable pullup register */ +-#endif +- + } + + static void dr_controller_run(struct fsl_udc *udc) +@@ -2598,9 +2587,6 @@ static int __init fsl_udc_probe(struct p + ret = -ENOMEM; + goto err4; + } +-#if 0 // DDD why this? hoarks OTG host +- pullup_disable(udc); +-#endif + + create_proc_file(); + return 0; +--- a/drivers/usb/host/ehci-arc.c ++++ b/drivers/usb/host/ehci-arc.c +@@ -378,25 +378,14 @@ static int ehci_fsl_drv_resume(struct pl + + memcpy(ehci->regs, (void *)&usb_ehci_regs, sizeof(struct ehci_regs)); + +-#if 0 // DDD test +- ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); +- printk("set portsc %08x %08x\n", usb_ehci_portsc, +- ehci_readl(ehci, &ehci->regs->port_status[0])); +- printk("set usbmode %08x\n", +- ehci_readl(ehci, &ehci->regs + FSL_SOC_USB_USBMODE)); +- + tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); + ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); +-#else +- tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0); +- ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE); +- printk("tmp %08x set usbmode %08x\n", tmp, +- ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); ++ pr_debug("tmp %08x set usbmode %08x\n", tmp, ++ ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE)); + + ehci_writel(ehci, usb_ehci_portsc, &ehci->regs->port_status[0]); +- printk("set portsc %08x %08x\n", usb_ehci_portsc, +- ehci_readl(ehci, &ehci->regs->port_status[0])); +-#endif ++ pr_debug("set portsc %08x %08x\n", usb_ehci_portsc, ++ ehci_readl(ehci, &ehci->regs->port_status[0])); + + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + hcd->state = HC_STATE_RUNNING; +--- a/drivers/usb/otg/fsl_otg.c ++++ b/drivers/usb/otg/fsl_otg.c +@@ -98,6 +98,7 @@ static struct fsl_otg_config fsl_otg_ini + .otg_port = 1, + }; + ++#if 0 + static void dump_state(const char *string, struct otg_fsm *fsm) + { + printk(KERN_DEBUG "%s\n\tOTG state: %s\n", string, +@@ -135,6 +136,7 @@ static void dump_state(const char *strin + printk(KERN_DEBUG "\tb_sess_vld: %d\n", fsm->b_sess_vld); + printk(KERN_DEBUG "\tid: %d\n", fsm->id); + } ++#endif + + + /* Routines to access transceiver ULPI registers */ +@@ -537,6 +539,7 @@ int fsl_otg_start_gadget(struct otg_fsm + return 0; + } + ++#if 0 + static void fsl_otg_enable(struct otg_transceiver *otg_p) + { + struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); +@@ -549,7 +552,7 @@ static void fsl_otg_enable(struct otg_tr + otg_sc |= OTGSC_INTERRUPT_ENABLE_BITS_MASK; + otg_sc &= ~OTGSC_IE_1ms_TIMER; + otg_sc &= ~OTGSC_CTRL_VBUS_DISCHARGE; +- otg_sc |= OTGSC_IE_USB_ID; /* DDD added this */ ++ otg_sc |= OTGSC_IE_USB_ID; + fsl_writel(otg_sc, &usb_dr_regs->otgsc); + + fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; +@@ -570,6 +573,7 @@ static void fsl_otg_enable(struct otg_tr + fsm->a_sess_vld = (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; + fsm->b_sess_end = (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; + } ++#endif + + /* + * Called by initialization code of host driver. Register host controller +@@ -577,34 +581,6 @@ static void fsl_otg_enable(struct otg_tr + */ + static int fsl_otg_set_host(struct otg_transceiver *otg_p, struct usb_bus *host) + { +-#if 0 // DDD beta-final +- struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); +- struct device *dev = host->controller; +- +- if (!otg_p || otg_dev != fsl_otg_dev) +- return -ENODEV; +- +- otg_p->host = host; +- otg_p->host->is_b_host = otg_dev->fsm.id; +- +- otg_dev->fsm.a_bus_drop = 0; +- otg_dev->fsm.a_bus_req = 1; +- +- otg_p->host->otg_port = fsl_otg_initdata.otg_port; +- +- if (dev && dev->driver) { +- VDBG("suspending host\n"); +- dev->driver->suspend(dev, PMSG_SUSPEND); +- otg_dev->host_working = 0; +- VDBG("back\n"); +- } +- +- +- /* dump_state("set_host running statemachine", &otg_dev->fsm); DDD */ +- otg_statemachine(&otg_dev->fsm); +- +- return 0; +-#else + struct fsl_otg *otg_dev = container_of(otg_p, struct fsl_otg, otg); + + if (!otg_p || otg_dev != fsl_otg_dev) +@@ -644,7 +620,6 @@ static int fsl_otg_set_host(struct otg_t + otg_statemachine(&otg_dev->fsm); + + return 0; +-#endif + } + + /* Called by initialization code of udc. Register udc to OTG.*/ +@@ -673,12 +648,6 @@ static int fsl_otg_set_peripheral(struct + + otg_dev->fsm.b_bus_req = 1; + +-#if 0 /* DDD uClinux */ +- if (otg_p->host) { +- fsl_otg_enable(otg_p); +- otg_statemachine(&otg_dev->fsm); +- } +-#endif + /* start the gadget right away if the ID pin says Mini-B */ + DBG("ID pin=%d\n", otg_dev->fsm.id); + if (otg_dev->fsm.id == 1) { +@@ -815,162 +784,6 @@ irqreturn_t fsl_otg_isr(int irq, void *d + } + + +-#if 0 // DDD feta-final +-irqreturn_t foo_fsl_otg_isr(int irq, void *dev_id) +-{ +- struct otg_fsm *fsm = &((struct fsl_otg *)dev_id)->fsm; +- struct otg_transceiver *otg = &((struct fsl_otg *)dev_id)->otg; +- u32 otg_int_src, usb_int_src, otg_sc; +- int trigger = 0; +- int tmp; +- +- usb_int_src = fsl_readl(&usb_dr_regs->usbsts); +- otg_sc = fsl_readl(&usb_dr_regs->otgsc); +- otg_int_src = otg_sc & OTGSC_INTSTS_MASK & (otg_sc >> 8); +- +- /* Only clear otg interrupts */ +- fsl_writel(otg_sc, &usb_dr_regs->otgsc); +- +- /*FIXME: ID change not generate when init to 0 */ +- /* process OTG interrupts */ +- if (otg_int_src) { +- VDBG("\nOTG irq 0x%08x\n", otg_int_src); +- if (otg_int_src & OTGSC_INTSTS_1MS_TIMER) +- trigger = fsl_otg_tick_timer(); +- +- if (otg_int_src & OTGSC_INTSTS_USB_ID) { +- fsm->id = (otg_sc & OTGSC_STS_USB_ID) ? 1 : 0; +- otg->default_a = (fsm->id == 0); +- if (otg->host) +- otg->host->is_b_host = fsm->id; +- if (otg->gadget) +- otg->gadget->is_a_peripheral = !fsm->id; +- VDBG("IRQ=ID now=%d\n", fsm->id); +- +- if (fsm->id) { /* switch to gadget */ +- schedule_delayed_work(&((struct fsl_otg *) +- dev_id)->otg_event, 25); +- } else { /* switch to host */ +- cancel_delayed_work(& +- ((struct fsl_otg *)dev_id)-> +- otg_event); +- fsl_otg_start_gadget(fsm, 0); +- fsl_otg_drv_vbus(1); +- fsl_otg_start_host(fsm, 1); +- } +- +- return IRQ_HANDLED; +- } +- if (otg_int_src & OTGSC_INTSTS_DATA_PULSE) { +- fsm->a_srp_det = 1; +- trigger = 1; +- VDBG("!!!!Data pulse int\n"); +- } +- if (otg_int_src & OTGSC_INTSTS_A_SESSION_VALID) { +- fsm->a_sess_vld = +- (otg_sc & OTGSC_STS_A_SESSION_VALID) ? 1 : 0; +- /* detect VBUS pulsing */ +- if ((fsm->transceiver->state == OTG_STATE_A_IDLE) +- && fsm->a_sess_vld) +- fsm->a_srp_det = 1; +- trigger = 1; +- VDBG("!!!a_sess_vld int state=%d\n", fsm->a_sess_vld); +- } +- if (otg_int_src & OTGSC_INTSTS_A_VBUS_VALID) { +- fsm->a_vbus_vld = !!(otg_sc & OTGSC_STS_A_VBUS_VALID); +- trigger = 1; +- VDBG("!!!a_vbus_vld int state=%d\n", fsm->a_vbus_vld); +- +-#if 1 +- if ((fsm->a_vbus_vld == 0) && (fsm->id == 0)) { +- if (fsm->transceiver->state != OTG_STATE_A_WAIT_VFALL) +- /* Warning insted of transfer to Error state. */ +- printk(KERN_WARNING "ulpi: The USB Device is " +- "sinking too much current!!\n"); +- fsm->a_vbus_vld = 1; +- } +-#endif +- +- +- } +- if (otg_int_src & OTGSC_INTSTS_B_SESSION_VALID) { +- fsm->b_sess_vld = +- (otg_sc & OTGSC_STS_B_SESSION_VALID) ? 1 : 0; +- trigger = 1; +- /* SRP done */ +- if ((fsl_otg_dev->otg.state == OTG_STATE_B_SRP_INIT) && +- fsm->b_sess_vld && srp_wait_done) +- fsm->b_srp_done = 1; +- VDBG("!!!!b_sess_vld int state=%d\n", fsm->b_sess_vld); +- } +- if (otg_int_src & OTGSC_INTSTS_B_SESSION_END) { +- fsm->b_sess_end = +- (otg_sc & OTGSC_STS_B_SESSION_END) ? 1 : 0; +- trigger = 1; +- VDBG("!!!!b_sess_end int state=%d\n", fsm->b_sess_end); +- } +- } +- +- /* process USB interrupts */ +- if ((usb_int_src & USB_STS_PORT_CHANGE) +- && (fsm->protocol == PROTO_HOST)) { +- VDBG("\nUSB irq A 0x%08x\n", usb_int_src); +- /* Device resume do not generate statemachine change */ +- if (fsl_readl(&usb_dr_regs->portsc1) & +- PORTSCX_PORT_FORCE_RESUME) { +- if (otg->default_a) { +- fsm->b_bus_resume = 1; +- trigger = 1; +- } else { +- fsm->a_bus_resume = 1; +- trigger = 1; +- } +- } +- +- tmp = (fsl_readl(&usb_dr_regs->portsc1) & +- PORTSCX_CURRENT_CONNECT_STATUS) ? 1 : 0; +- if (otg->default_a && (fsm->b_conn != tmp)) { +- fsm->b_conn = tmp; +- trigger = 1; +- } else if (!otg->default_a && (fsm->a_conn != tmp)) { +- fsm->a_conn = tmp; +- trigger = 1; +- } +- } +- /* Workaround: sometimes CSC bit will lost. We change to +- * polling CCS bit for connect change */ +- if (fsm->protocol == PROTO_GADGET) { +- if (usb_int_src & USB_STS_SUSPEND) { +- VDBG("\nUSB irq B 0x%08x\n", usb_int_src); +- VDBG("peripheral detected suspend\n"); +- if (otg->default_a) +- /* A-device detects B suspend */ +- fsm->b_bus_suspend = 1; +- else +- /* B-device detects A suspend */ +- fsm->a_bus_suspend = 1; +- trigger = 1; +- } else if (usb_int_src & USB_STS_PORT_CHANGE) { +- VDBG("\nUSB irq C 0x%08x\n", usb_int_src); +- VDBG("peripheral resumed\n"); +- if (otg->default_a) +- fsm->b_bus_suspend = 0; +- else +- fsm->a_bus_suspend = 0; +- trigger = 1; +- } +- } +- +- /* Invoke statemachine until state is stable */ +- while (trigger) { +- trigger = otg_statemachine(fsm); +- } +- +- return IRQ_HANDLED; +-} +-#endif +- +- + static struct otg_fsm_ops fsl_otg_ops = { + .chrg_vbus = fsl_otg_chrg_vbus, + .drv_vbus = fsl_otg_drv_vbus, +@@ -1003,7 +816,6 @@ int fsl_otg_cfg(struct platform_device * + if (!fsl_otg_tc) + return -ENODEV; + +-#if 1 // DDD + if (pdata->regs) { + fsl_otg_tc->dr_mem_map = pdata->regs; + } else { +@@ -1013,8 +825,10 @@ int fsl_otg_cfg(struct platform_device * + return -ENODEV; + } + ++ /* + printk("DDD %s(): rsrc_start=0x%x rsrc_len=0x%x\n", + __FUNCTION__, res->start, res->end - res->start + 1); ++ */ + + if (!request_mem_region(res->start, res->end - res->start + 1, + "OTG")) { +@@ -1026,7 +840,6 @@ int fsl_otg_cfg(struct platform_device * + } + DBG("set dr_mem_map to 0x%p\n", fsl_otg_tc->dr_mem_map); + +-#endif + INIT_DELAYED_WORK(&fsl_otg_tc->otg_event, fsl_otg_event); + + INIT_LIST_HEAD(&active_timers); +@@ -1035,12 +848,11 @@ int fsl_otg_cfg(struct platform_device * + /* Set OTG state machine operations */ + fsl_otg_tc->fsm.ops = &fsl_otg_ops; + +-#if 1 /* DDD */ + /* record initial state of ID pin */ + fsl_otg_tc->fsm.id = (fsl_otg_tc->dr_mem_map->otgsc & OTGSC_STS_USB_ID) + ? 1 : 0; + DBG("initial ID pin=%d\n", fsl_otg_tc->fsm.id); +-#endif ++ + /* initialize the otg structure */ + fsl_otg_tc->otg.label = DRIVER_DESC; + fsl_otg_tc->otg.set_host = fsl_otg_set_host; +@@ -1115,13 +927,8 @@ int usb_otg_start(struct platform_device + __FUNCTION__, timeout); + + /* configure the VBUSHS as IDLE(both host and device) */ +-#if 0 +- /* DDD really have to check into setting the following */ +- fsl_writel(USB_MODE_STREAM_DISABLE, &usb_dr_regs->usbmode); +-#else + temp = USB_MODE_STREAM_DISABLE | (pdata->es ? USBMODE_ES : 0); + fsl_writel(temp, &usb_dr_regs->usbmode); +-#endif + + /* configure PHY interface */ + temp = fsl_readl(&usb_dr_regs->portsc1); +@@ -1135,24 +942,11 @@ int usb_otg_start(struct platform_device + /* disable all interrupt and clear all OTGSC status */ + temp = fsl_readl(&usb_dr_regs->otgsc); + temp &= ~OTGSC_INTERRUPT_ENABLE_BITS_MASK; +-#if 0 // DDD +- /* DDD only want ID int +- * temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; +- */ +- temp |= OTGSC_IE_USB_ID; /* DDD added this */ +- temp &= ~OTGSC_IE_1ms_TIMER; /* DDD added this */ +-#else + temp |= OTGSC_INTERRUPT_STATUS_BITS_MASK | OTGSC_CTRL_VBUS_DISCHARGE; +-#endif + fsl_writel(temp, &usb_dr_regs->otgsc); + + fsl_otg_drv_vbus(0); + +-#if 0 // DDD beta-final +- temp = fsl_readl(&usb_dr_regs->otgsc); +- temp |= OTGSC_IE_A_SESSION_VALID; +- fsl_writel(temp, &usb_dr_regs->otgsc); +-#else + /* + * The identification (id) input is FALSE when a Mini-A plug is inserted + * in the devices Mini-AB receptacle. Otherwise, this input is TRUE. +@@ -1173,7 +967,6 @@ int usb_otg_start(struct platform_device + temp |= OTGSC_IE_USB_ID; + temp &= ~(OTGSC_CTRL_VBUS_DISCHARGE | OTGSC_IE_1ms_TIMER); + fsl_writel(temp, &usb_dr_regs->otgsc); +-#endif + + return 0; + } +@@ -1427,10 +1220,8 @@ static int __init fsl_otg_probe(struct p + return -ENOMEM; + + pdata = pdev->dev.platform_data; +-#if 1 // DDD do this elsewhere + /* Initialize the clock, multiplexing pin and PHY interface */ + board_init(pdev); +-#endif + + /* configure the OTG */ + status = fsl_otg_cfg(pdev); +--- a/drivers/usb/otg/otg_fsm.h ++++ b/drivers/usb/otg/otg_fsm.h +@@ -18,7 +18,7 @@ + #ifndef OTG_FSM_H + #define OTG_FSM_H + +-#if 1 ++#if 0 + #define DEBUG 1 + #define VERBOSE 1 + #endif +--- a/include/linux/usb/fsl_usb2.h ++++ b/include/linux/usb/fsl_usb2.h +@@ -104,9 +104,8 @@ struct fsl_usb_host_regs { + #if 0 + u32 endptctrl[USB_MAX_ENDPOINTS]; /* Endpoint Control Registers */ + #else +- // DDD: do these exits in the host register set?? +- // DDD see DCCPARAMS:DEN for the real number of device endpoints +- // DDD 16 is the max ++ /* DDD see DCCPARAMS:DEN for the real number of device endpoints */ ++ /* DDD 16 is the max */ + u32 endptctrl[16]; /* Endpoint Control Registers */ + #endif + }; -- cgit v1.2.3