aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/chipidea
diff options
context:
space:
mode:
authorLi Jun <jun.li@freescale.com>2015-12-15 04:51:29 -0500
committerPeter Chen <peter.chen@freescale.com>2015-12-24 01:18:07 -0500
commit8c100e74409ad3bbcb8a1ccdff4540fc0aa7a0fc (patch)
tree394332ad518c473a52060e3a69ba15f4e0f5adf6 /drivers/usb/chipidea
parent43a404577a93d236913b67e41758adf5b9a8f45d (diff)
usb: chipidea: otg: use usb autosuspend to suspend bus for HNP
Directly manipulate the controller regsiter to suspend the usb bus for HNP is not the proper way, this should be done through the usbcore by usb autosuspend. So to start HNP, autosuspend support should be added for OTG devices interface driver if it's not enabled. Signed-off-by: Li Jun <jun.li@freescale.com> Signed-off-by: Peter Chen <peter.chen@freescale.com>
Diffstat (limited to 'drivers/usb/chipidea')
-rw-r--r--drivers/usb/chipidea/otg_fsm.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
index 00ab59d45da1..ba90dc66703d 100644
--- a/drivers/usb/chipidea/otg_fsm.c
+++ b/drivers/usb/chipidea/otg_fsm.c
@@ -485,20 +485,30 @@ static void ci_otg_loc_conn(struct otg_fsm *fsm, int on)
485 485
486/* 486/*
487 * Generate SOF by host. 487 * Generate SOF by host.
488 * This is controlled through suspend/resume the port.
489 * In host mode, controller will automatically send SOF. 488 * In host mode, controller will automatically send SOF.
490 * Suspend will block the data on the port. 489 * Suspend will block the data on the port.
490 *
491 * This is controlled through usbcore by usb autosuspend,
492 * so the usb device class driver need support autosuspend,
493 * otherwise the bus suspend will not happen.
491 */ 494 */
492static void ci_otg_loc_sof(struct otg_fsm *fsm, int on) 495static void ci_otg_loc_sof(struct otg_fsm *fsm, int on)
493{ 496{
494 struct ci_hdrc *ci = container_of(fsm, struct ci_hdrc, fsm); 497 struct usb_device *udev;
495 498
496 if (on) 499 if (!fsm->otg->host)
497 hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_FPR, 500 return;
498 PORTSC_FPR); 501
499 else 502 udev = usb_hub_find_child(fsm->otg->host->root_hub, 1);
500 hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_SUSP, 503 if (!udev)
501 PORTSC_SUSP); 504 return;
505
506 if (on) {
507 usb_disable_autosuspend(udev);
508 } else {
509 pm_runtime_set_autosuspend_delay(&udev->dev, 0);
510 usb_enable_autosuspend(udev);
511 }
502} 512}
503 513
504/* 514/*