From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,3/4] usb: chipidea: host: override ehci->hub_control From: Peter Chen Message-Id: <20181127092824.22756-4-peter.chen@nxp.com> Date: Tue, 27 Nov 2018 09:30:59 +0000 To: "linux-usb@vger.kernel.org" Cc: dl-linux-imx , "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "frieder.schrempf@exceet.de" , "festevam@gmail.com" , PETER CHEN List-ID: VGhlIGNoaXBpZGVhIGNvbnRyb2xsZXIgaGFzIHNvbWUgc3BlY2lhbCByZXF1aXJlbWVudHMgZHVy aW5nCnN1c3BlbmQvcmVzdW1lLCBvdmVycmlkZSBjb21tb24gZWhjaS0+aHViX2NvbnRyb2wgdG8g aW1wbGVtZW50Cml0LgoKU2lnbmVkLW9mZi1ieTogUGV0ZXIgQ2hlbiA8cGV0ZXIuY2hlbkBueHAu Y29tPgotLS0KIGRyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYyB8IDc2ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQsIDc2IGluc2Vy dGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMgYi9kcml2 ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMKaW5kZXggMDI4YTM1NzQyNjZhLi5hYTQ3NTZkYWI0ODcg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYworKysgYi9kcml2ZXJzL3Vz Yi9jaGlwaWRlYS9ob3N0LmMKQEAgLTIyMCw2ICsyMjAsODEgQEAgdm9pZCBjaV9oZHJjX2hvc3Rf ZGVzdHJveShzdHJ1Y3QgY2lfaGRyYyAqY2kpCiAJCWhvc3Rfc3RvcChjaSk7CiB9CiAKKy8qIFRo ZSBiZWxvdyBjb2RlIGlzIGJhc2VkIG9uIHRlZ3JhIGVoY2kgZHJpdmVyICovCitzdGF0aWMgaW50 IGNpX2VoY2lfaHViX2NvbnRyb2woCisJc3RydWN0IHVzYl9oY2QJKmhjZCwKKwl1MTYJCXR5cGVS ZXEsCisJdTE2CQl3VmFsdWUsCisJdTE2CQl3SW5kZXgsCisJY2hhcgkJKmJ1ZiwKKwl1MTYJCXdM ZW5ndGgKKykKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOwor CXUzMiBfX2lvbWVtCSpzdGF0dXNfcmVnOworCXUzMgkJdGVtcDsKKwl1bnNpZ25lZCBsb25nCWZs YWdzOworCWludAkJcmV0dmFsID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYu Y29udHJvbGxlcjsKKwlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsK KworCXN0YXR1c19yZWcgPSAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXNbKHdJbmRleCAmIDB4ZmYp IC0gMV07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWhjaS0+bG9jaywgZmxhZ3MpOworCisJaWYg KHR5cGVSZXEgPT0gU2V0UG9ydEZlYXR1cmUgJiYgd1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfU1VT UEVORCkgeworCQl0ZW1wID0gZWhjaV9yZWFkbChlaGNpLCBzdGF0dXNfcmVnKTsKKwkJaWYgKCh0 ZW1wICYgUE9SVF9QRSkgPT0gMCB8fCAodGVtcCAmIFBPUlRfUkVTRVQpICE9IDApIHsKKwkJCXJl dHZhbCA9IC1FUElQRTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXRlbXAgJj0gfihQT1JUX1JX Q19CSVRTIHwgUE9SVF9XS0NPTk5fRSk7CisJCXRlbXAgfD0gUE9SVF9XS0RJU0NfRSB8IFBPUlRf V0tPQ19FOworCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wIHwgUE9SVF9TVVNQRU5ELCBzdGF0dXNf cmVnKTsKKworCQkvKgorCQkgKiBJZiBhIHRyYW5zYWN0aW9uIGlzIGluIHByb2dyZXNzLCB0aGVy ZSBtYXkgYmUgYSBkZWxheSBpbgorCQkgKiBzdXNwZW5kaW5nIHRoZSBwb3J0LiBQb2xsIHVudGls IHRoZSBwb3J0IGlzIHN1c3BlbmRlZC4KKwkJICovCisJCWlmIChlaGNpX2hhbmRzaGFrZShlaGNp LCBzdGF0dXNfcmVnLCBQT1JUX1NVU1BFTkQsCisJCQkJCQlQT1JUX1NVU1BFTkQsIDUwMDApKQor CQkJZWhjaV9lcnIoZWhjaSwgInRpbWVvdXQgd2FpdGluZyBmb3IgU1VTUEVORFxuIik7CisKKwkJ aWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0lNWF9JU19IU0lDKSB7CisJCQlpZiAo Y2ktPnBsYXRkYXRhLT5ub3RpZnlfZXZlbnQpCisJCQkJY2ktPnBsYXRkYXRhLT5ub3RpZnlfZXZl bnQKKwkJCQkJKGNpLCBDSV9IRFJDX0lNWF9IU0lDX1NVU1BFTkRfRVZFTlQpOworCisJCQl0ZW1w ID0gZWhjaV9yZWFkbChlaGNpLCBzdGF0dXNfcmVnKTsKKwkJCXRlbXAgJj0gfihQT1JUX1dLRElT Q19FIHwgUE9SVF9XS0NPTk5fRSk7CisJCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wLCBzdGF0dXNf cmVnKTsKKwkJfQorCisJCXNldF9iaXQoKHdJbmRleCAmIDB4ZmYpIC0gMSwgJmVoY2ktPnN1c3Bl bmRlZF9wb3J0cyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIEFmdGVyIHJlc3VtZSBo YXMgZmluaXNoZWQsIGl0IG5lZWRzIGRvIHNvbWUgcG9zdCByZXN1bWUKKwkgKiBvcGVyYXRpb24g Zm9yIHNvbWUgU29Dcy4KKwkgKi8KKwllbHNlIGlmICh0eXBlUmVxID09IENsZWFyUG9ydEZlYXR1 cmUgJiYKKwkJCQkJd1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfQ19TVVNQRU5EKSB7CisKKwkJLyog TWFrZSBzdXJlIHRoZSByZXN1bWUgaGFzIGZpbmlzaGVkLCBpdCBzaG91bGQgYmUgZmluaXNoZWQg Ki8KKwkJaWYgKGVoY2lfaGFuZHNoYWtlKGVoY2ksIHN0YXR1c19yZWcsIFBPUlRfUkVTVU1FLCAw LCAyNTAwMCkpCisJCQllaGNpX2VycihlaGNpLCAidGltZW91dCB3YWl0aW5nIGZvciByZXN1bWVc biIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVoY2ktPmxvY2ssIGZsYWdzKTsK KworCS8qIEhhbmRsZSB0aGUgaHViIGNvbnRyb2wgZXZlbnRzIGhlcmUgKi8KKwlyZXR1cm4gZWhj aV9odWJfY29udHJvbChoY2QsIHR5cGVSZXEsIHdWYWx1ZSwgd0luZGV4LCBidWYsIHdMZW5ndGgp OworZG9uZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlaGNpLT5sb2NrLCBmbGFncyk7CisJ cmV0dXJuIHJldHZhbDsKK30KIHN0YXRpYyBpbnQgY2lfZWhjaV9idXNfc3VzcGVuZChzdHJ1Y3Qg dXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhj ZCk7CkBAIC0yOTgsNCArMzczLDUgQEAgdm9pZCBjaV9oZHJjX2hvc3RfZHJpdmVyX2luaXQodm9p ZCkKIAllaGNpX2luaXRfZHJpdmVyKCZjaV9laGNpX2hjX2RyaXZlciwgJmVoY2lfY2lfb3ZlcnJp ZGVzKTsKIAlvcmlnX2J1c19zdXNwZW5kID0gY2lfZWhjaV9oY19kcml2ZXIuYnVzX3N1c3BlbmQ7 CiAJY2lfZWhjaV9oY19kcml2ZXIuYnVzX3N1c3BlbmQgPSBjaV9laGNpX2J1c19zdXNwZW5kOwor CWNpX2VoY2lfaGNfZHJpdmVyLmh1Yl9jb250cm9sID0gY2lfZWhjaV9odWJfY29udHJvbDsKIH0K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-eopbgr60054.outbound.protection.outlook.com ([40.107.6.54]:26834 "EHLO EUR04-DB3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728512AbeK0U2V (ORCPT ); Tue, 27 Nov 2018 15:28:21 -0500 From: PETER CHEN Subject: [PATCH v3 3/4] usb: chipidea: host: override ehci->hub_control Date: Tue, 27 Nov 2018 09:30:59 +0000 Message-ID: <20181127092824.22756-4-peter.chen@nxp.com> References: <20181127092824.22756-1-peter.chen@nxp.com> In-Reply-To: <20181127092824.22756-1-peter.chen@nxp.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: devicetree-owner@vger.kernel.org To: "linux-usb@vger.kernel.org" Cc: dl-linux-imx , "robh+dt@kernel.org" , "devicetree@vger.kernel.org" , "frieder.schrempf@exceet.de" , "festevam@gmail.com" , PETER CHEN List-ID: The chipidea controller has some special requirements during suspend/resume, override common ehci->hub_control to implement it. Signed-off-by: Peter Chen --- drivers/usb/chipidea/host.c | 76 +++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 76 insertions(+) diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 028a3574266a..aa4756dab487 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c @@ -220,6 +220,81 @@ void ci_hdrc_host_destroy(struct ci_hdrc *ci) host_stop(ci); } =20 +/* The below code is based on tegra ehci driver */ +static int ci_ehci_hub_control( + struct usb_hcd *hcd, + u16 typeReq, + u16 wValue, + u16 wIndex, + char *buf, + u16 wLength +) +{ + struct ehci_hcd *ehci =3D hcd_to_ehci(hcd); + u32 __iomem *status_reg; + u32 temp; + unsigned long flags; + int retval =3D 0; + struct device *dev =3D hcd->self.controller; + struct ci_hdrc *ci =3D dev_get_drvdata(dev); + + status_reg =3D &ehci->regs->port_status[(wIndex & 0xff) - 1]; + + spin_lock_irqsave(&ehci->lock, flags); + + if (typeReq =3D=3D SetPortFeature && wValue =3D=3D USB_PORT_FEAT_SUSPEND)= { + temp =3D ehci_readl(ehci, status_reg); + if ((temp & PORT_PE) =3D=3D 0 || (temp & PORT_RESET) !=3D 0) { + retval =3D -EPIPE; + goto done; + } + + temp &=3D ~(PORT_RWC_BITS | PORT_WKCONN_E); + temp |=3D PORT_WKDISC_E | PORT_WKOC_E; + ehci_writel(ehci, temp | PORT_SUSPEND, status_reg); + + /* + * If a transaction is in progress, there may be a delay in + * suspending the port. Poll until the port is suspended. + */ + if (ehci_handshake(ehci, status_reg, PORT_SUSPEND, + PORT_SUSPEND, 5000)) + ehci_err(ehci, "timeout waiting for SUSPEND\n"); + + if (ci->platdata->flags & CI_HDRC_IMX_IS_HSIC) { + if (ci->platdata->notify_event) + ci->platdata->notify_event + (ci, CI_HDRC_IMX_HSIC_SUSPEND_EVENT); + + temp =3D ehci_readl(ehci, status_reg); + temp &=3D ~(PORT_WKDISC_E | PORT_WKCONN_E); + ehci_writel(ehci, temp, status_reg); + } + + set_bit((wIndex & 0xff) - 1, &ehci->suspended_ports); + goto done; + } + + /* + * After resume has finished, it needs do some post resume + * operation for some SoCs. + */ + else if (typeReq =3D=3D ClearPortFeature && + wValue =3D=3D USB_PORT_FEAT_C_SUSPEND) { + + /* Make sure the resume has finished, it should be finished */ + if (ehci_handshake(ehci, status_reg, PORT_RESUME, 0, 25000)) + ehci_err(ehci, "timeout waiting for resume\n"); + } + + spin_unlock_irqrestore(&ehci->lock, flags); + + /* Handle the hub control events here */ + return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength); +done: + spin_unlock_irqrestore(&ehci->lock, flags); + return retval; +} static int ci_ehci_bus_suspend(struct usb_hcd *hcd) { struct ehci_hcd *ehci =3D hcd_to_ehci(hcd); @@ -298,4 +373,5 @@ void ci_hdrc_host_driver_init(void) ehci_init_driver(&ci_ehci_hc_driver, &ehci_ci_overrides); orig_bus_suspend =3D ci_ehci_hc_driver.bus_suspend; ci_ehci_hc_driver.bus_suspend =3D ci_ehci_bus_suspend; + ci_ehci_hc_driver.hub_control =3D ci_ehci_hub_control; } --=20 2.14.1