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: [v2,1/5] usb: dwc2: bus suspend/resume for hosts with DWC2_POWER_DOWN_PARAM_NONE From: Doug Anderson Message-Id: <20190418001356.124334-2-dianders@chromium.org> Date: Wed, 17 Apr 2019 17:13:52 -0700 To: Minas Harutyunyan , Felipe Balbi , heiko@sntech.de Cc: Alan Stern , Artur Petrosyan , amstan@chromium.org, linux-rockchip@lists.infradead.org, William Wu , linux-usb@vger.kernel.org, Stefan Wahren , Randy Li , zyw@rock-chips.com, mka@chromium.org, ryandcase@chromium.org, Amelie Delaunay , jwerner@chromium.org, dinguyen@opensource.altera.com, Elaine Zhang , Douglas Anderson , Greg Kroah-Hartman , linux-kernel@vger.kernel.org List-ID: VGhpcyBpcyBhbiBhdHRlbXB0IHRvIHJlaGFzaCBjb21taXQgMGNmODg0ZTgxOWUwICgidXNiOiBk d2MyOiBhZGQgYnVzCnN1c3BlbmQvcmVzdW1lIGZvciBkd2MyIikgb24gVG9ULiAgVGhhdCBjb21t aXQgd2FzIHJldmVydGVkIGluIGNvbW1pdApiMGJiOWJiNmNlMDEgKCJSZXZlcnQgInVzYjogZHdj MjogYWRkIGJ1cyBzdXNwZW5kL3Jlc3VtZSBmb3IgZHdjMiIiKQpiZWNhdXNlIGFwcGFyZW50bHkg aXQgYnJva2UgdGhlIEFsdGVyYSBTT0NGUEdBLgoKV2l0aCBhbGwgdGhlIGNoYW5nZXMgdGhhdCBo YXZlIGhhcHBlbmVkIHRvIGR3YzIgaW4gdGhlIG1lYW50aW1lLCBpdCdzCnBvc3NpYmxlIHRoYXQg dGhlIEFsdGVyYSBTT0NGUEdBIHdpbGwganVzdCBtYWdpY2FsbHkgd29yayB3aXRoIHRoaXMKY2hh bmdlIG5vdy4gIC4uLmFuZCBpdCB3b3VsZCBiZSBnb29kIHRvIGdldCBidXMgc3VzcGVuZC9yZXN1 bWUKaW1wbGVtZW50ZWQuCgpUaGlzIGNoYW5nZSBpcyBhIGZvcndhcmQgcG9ydCBvZiBvbmUgdGhh dCdzIGJlZW4gbGl2aW5nIGluIHRoZSBDaHJvbWUKT1MgMy4xNCBrZXJuZWwgdHJlZS4KClNpZ25l ZC1vZmYtYnk6IERvdWdsYXMgQW5kZXJzb24gPGRpYW5kZXJzQGNocm9taXVtLm9yZz4KLS0tClRo aXMgcGF0Y2ggd2FzIGxhc3QgcG9zdGVkIGF0OgoKaHR0cHM6Ly9sa21sLmtlcm5lbC5vcmcvci8x NDQ2MjM3MTczLTE1MjYzLTEtZ2l0LXNlbmQtZW1haWwtZGlhbmRlcnNAY2hyb21pdW0ub3JnCgou Li5hbmQgYXBwZWFycyB0byBoYXZlIGRpZWQgdGhlIGRlYXRoIG9mIHNpbGVuY2UuICBNYXliZSBp dCBjb3VsZCBnZXQKc29tZSBiYWtlIHRpbWUgaW4gbGludXhuZXh0IGlmIHdlIGNhbid0IGZpbmQg YW55IHByb2FjdGl2ZSB0ZXN0aW5nPwoKSSB3aWxsIGFsc28gZnJlZWx5IGFkbWl0IHRoYXQgSSBk b24ndCBrbm93IHRvbnMgYWJvdXQgdGhlIHRoZW9yeQpiZWhpbmQgdGhpcyBwYXRjaC4gIEknbSBt b3N0bHkganVzdCByZS1oYXNoaW5nIHRoZSBvcmlnaW5hbCBjb21taXQKZnJvbSBLZXZlciB0aGF0 IHdhcyByZXZlcnRlZCBzaW5jZToKKiBUdXJuaW5nIG9uIHBhcnRpYWwgcG93ZXIgZG93biBvbiBy azMyODggZG9lc24ndCAianVzdCB3b3JrIi4gIEkKICBkb24ndCBnZXQgaG90cGx1ZyBldmVudHMu ICBUaGlzIGlzIGRlc3BpdGUgZHdjMiBhdXRvLWRldGVjdGluZyB0aGF0CiAgd2UgYXJlIHBvd2Vy IG9wdGltaXplZC4KKiBJZiB3ZSBkb24ndCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzIGNvbW1pdCB3 ZSBkb24ndCBnZXQgaW50byBhcyBsb3cKICBvZiBhIHBvd2VyIG1vZGUuCgpDaGFuZ2VzIGluIHYy OiBOb25lCgogZHJpdmVycy91c2IvZHdjMi9oY2QuYyB8IDg0ICsrKysrKysrKysrKysrKysrKysr KysrKysrLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDUzIGluc2VydGlvbnMoKyks IDMxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMgYi9k cml2ZXJzL3VzYi9kd2MyL2hjZC5jCmluZGV4IGUyNzJkMDIwMDEyZS4uOTc4MjMyYTllNGE4IDEw MDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIv aGNkLmMKQEAgLTQ0ODIsNiArNDQ4Miw3IEBAIHN0YXRpYyBpbnQgX2R3YzJfaGNkX3N1c3BlbmQo c3RydWN0IHVzYl9oY2QgKmhjZCkKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAw OwogCXUzMiBocHJ0MDsKKwl1MzIgcGNnY3RsOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhzb3Rn LT5sb2NrLCBmbGFncyk7CiAKQEAgLTQ0OTcsNyArNDQ5OCw3IEBAIHN0YXRpYyBpbnQgX2R3YzJf aGNkX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKIAlpZiAoaHNvdGctPm9wX3N0YXRlID09 IE9UR19TVEFURV9CX1BFUklQSEVSQUwpCiAJCWdvdG8gdW5sb2NrOwogCi0JaWYgKGhzb3RnLT5w YXJhbXMucG93ZXJfZG93biAhPSBEV0MyX1BPV0VSX0RPV05fUEFSQU1fUEFSVElBTCkKKwlpZiAo aHNvdGctPnBhcmFtcy5wb3dlcl9kb3duID4gRFdDMl9QT1dFUl9ET1dOX1BBUkFNX1BBUlRJQUwp CiAJCWdvdG8gc2tpcF9wb3dlcl9zYXZpbmc7CiAKIAkvKgpAQCAtNDUwNiwyMSArNDUwNywzNSBA QCBzdGF0aWMgaW50IF9kd2MyX2hjZF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCiAJICov CiAJaWYgKCFoc290Zy0+YnVzX3N1c3BlbmRlZCkgewogCQlocHJ0MCA9IGR3YzJfcmVhZF9ocHJ0 MChoc290Zyk7Ci0JCWhwcnQwIHw9IEhQUlQwX1NVU1A7Ci0JCWhwcnQwICY9IH5IUFJUMF9QV1I7 Ci0JCWR3YzJfd3JpdGVsKGhzb3RnLCBocHJ0MCwgSFBSVDApOwotCQlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZoc290Zy0+bG9jaywgZmxhZ3MpOwotCQlkd2MyX3ZidXNfc3VwcGx5X2V4aXQoaHNv dGcpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGhw cnQwICYgSFBSVDBfQ09OTlNUUykgeworCQkJaHBydDAgfD0gSFBSVDBfU1VTUDsKKwkJCWlmICho c290Zy0+cGFyYW1zLnBvd2VyX2Rvd24gPT0gRFdDMl9QT1dFUl9ET1dOX1BBUkFNX1BBUlRJQUwp CisJCQkJaHBydDAgJj0gfkhQUlQwX1BXUjsKKwkJCWR3YzJfd3JpdGVsKGhzb3RnLCBocHJ0MCwg SFBSVDApOworCQl9CisJCWlmIChoc290Zy0+cGFyYW1zLnBvd2VyX2Rvd24gPT0gRFdDMl9QT1dF Ul9ET1dOX1BBUkFNX1BBUlRJQUwpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhzb3Rn LT5sb2NrLCBmbGFncyk7CisJCQlkd2MyX3ZidXNfc3VwcGx5X2V4aXQoaHNvdGcpOworCQkJc3Bp bl9sb2NrX2lycXNhdmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlwY2dj dGwgPSByZWFkbChoc290Zy0+cmVncyArIFBDR0NUTCk7CisJCQlwY2djdGwgfD0gUENHQ1RMX1NU T1BQQ0xLOworCQkJd3JpdGVsKHBjZ2N0bCwgaHNvdGctPnJlZ3MgKyBQQ0dDVEwpOworCQl9CiAJ fQogCi0JLyogRW50ZXIgcGFydGlhbF9wb3dlcl9kb3duICovCi0JcmV0ID0gZHdjMl9lbnRlcl9w YXJ0aWFsX3Bvd2VyX2Rvd24oaHNvdGcpOwotCWlmIChyZXQpIHsKLQkJaWYgKHJldCAhPSAtRU5P VFNVUFApCi0JCQlkZXZfZXJyKGhzb3RnLT5kZXYsCi0JCQkJImVudGVyIHBhcnRpYWxfcG93ZXJf ZG93biBmYWlsZWRcbiIpOwotCQlnb3RvIHNraXBfcG93ZXJfc2F2aW5nOworCWlmIChoc290Zy0+ cGFyYW1zLnBvd2VyX2Rvd24gPT0gRFdDMl9QT1dFUl9ET1dOX1BBUkFNX1BBUlRJQUwpIHsKKwkJ LyogRW50ZXIgcGFydGlhbF9wb3dlcl9kb3duICovCisJCXJldCA9IGR3YzJfZW50ZXJfcGFydGlh bF9wb3dlcl9kb3duKGhzb3RnKTsKKwkJaWYgKHJldCkgeworCQkJaWYgKHJldCAhPSAtRU5PVFNV UFApCisJCQkJZGV2X2Vycihoc290Zy0+ZGV2LAorCQkJCQkiZW50ZXIgcGFydGlhbF9wb3dlcl9k b3duIGZhaWxlZFxuIik7CisJCQlnb3RvIHNraXBfcG93ZXJfc2F2aW5nOworCQl9CisKKwkJLyog QWZ0ZXIgZW50ZXJpbmcgcGFydGlhbF9wb3dlcl9kb3duLCBoYXJkd2FyZSBpcyBubyBtb3JlIGFj Y2Vzc2libGUgKi8KKwkJY2xlYXJfYml0KEhDRF9GTEFHX0hXX0FDQ0VTU0lCTEUsICZoY2QtPmZs YWdzKTsKIAl9CiAKIAkvKiBBc2sgcGh5IHRvIGJlIHN1c3BlbmRlZCAqLwpAQCAtNDUzMCw5ICs0 NTQ1LDYgQEAgc3RhdGljIGludCBfZHdjMl9oY2Rfc3VzcGVuZChzdHJ1Y3QgdXNiX2hjZCAqaGNk KQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaHNvdGctPmxvY2ssIGZsYWdzKTsKIAl9CiAKLQkvKiBB ZnRlciBlbnRlcmluZyBwYXJ0aWFsX3Bvd2VyX2Rvd24sIGhhcmR3YXJlIGlzIG5vIG1vcmUgYWNj ZXNzaWJsZSAqLwotCWNsZWFyX2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFn cyk7Ci0KIHNraXBfcG93ZXJfc2F2aW5nOgogCWhzb3RnLT5seF9zdGF0ZSA9IERXQzJfTDI7CiB1 bmxvY2s6CkBAIC00NTQ1LDYgKzQ1NTcsNyBAQCBzdGF0aWMgaW50IF9kd2MyX2hjZF9yZXN1bWUo c3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlzdHJ1Y3QgZHdjMl9oc290ZyAqaHNvdGcgPSBkd2My X2hjZF90b19oc290ZyhoY2QpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHBjZ2N0bDsK IAlpbnQgcmV0ID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoc290Zy0+bG9jaywgZmxhZ3Mp OwpAQCAtNDU1NSwxNyArNDU2OCwxMSBAQCBzdGF0aWMgaW50IF9kd2MyX2hjZF9yZXN1bWUoc3Ry dWN0IHVzYl9oY2QgKmhjZCkKIAlpZiAoaHNvdGctPmx4X3N0YXRlICE9IERXQzJfTDIpCiAJCWdv dG8gdW5sb2NrOwogCi0JaWYgKGhzb3RnLT5wYXJhbXMucG93ZXJfZG93biAhPSBEV0MyX1BPV0VS X0RPV05fUEFSQU1fUEFSVElBTCkgeworCWlmIChoc290Zy0+cGFyYW1zLnBvd2VyX2Rvd24gPiBE V0MyX1BPV0VSX0RPV05fUEFSQU1fUEFSVElBTCkgewogCQloc290Zy0+bHhfc3RhdGUgPSBEV0My X0wwOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQkvKgotCSAqIFNldCBIVyBhY2Nlc3NpYmxlIGJp dCBiZWZvcmUgcG93ZXJpbmcgb24gdGhlIGNvbnRyb2xsZXIKLQkgKiBzaW5jZSBhbiBpbnRlcnJ1 cHQgbWF5IHJpc2UuCi0JICovCi0Jc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNk LT5mbGFncyk7Ci0KIAkvKgogCSAqIEVuYWJsZSBwb3dlciBpZiBub3QgYWxyZWFkeSBkb25lLgog CSAqIFRoaXMgbXVzdCBub3QgYmUgc3BpbmxvY2tlZCBzaW5jZSBkdXJhdGlvbgpAQCAtNDU3Nywx MCArNDU4NCwyMyBAQCBzdGF0aWMgaW50IF9kd2MyX2hjZF9yZXN1bWUoc3RydWN0IHVzYl9oY2Qg KmhjZCkKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhzb3RnLT5sb2NrLCBmbGFncyk7CiAJfQogCi0J LyogRXhpdCBwYXJ0aWFsX3Bvd2VyX2Rvd24gKi8KLQlyZXQgPSBkd2MyX2V4aXRfcGFydGlhbF9w b3dlcl9kb3duKGhzb3RnLCB0cnVlKTsKLQlpZiAocmV0ICYmIChyZXQgIT0gLUVOT1RTVVBQKSkK LQkJZGV2X2Vycihoc290Zy0+ZGV2LCAiZXhpdCBwYXJ0aWFsX3Bvd2VyX2Rvd24gZmFpbGVkXG4i KTsKKwlpZiAoaHNvdGctPnBhcmFtcy5wb3dlcl9kb3duID09IERXQzJfUE9XRVJfRE9XTl9QQVJB TV9QQVJUSUFMKSB7CisJCS8qCisJCSAqIFNldCBIVyBhY2Nlc3NpYmxlIGJpdCBiZWZvcmUgcG93 ZXJpbmcgb24gdGhlIGNvbnRyb2xsZXIKKwkJICogc2luY2UgYW4gaW50ZXJydXB0IG1heSByaXNl LgorCQkgKi8KKwkJc2V0X2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7 CisKKworCQkvKiBFeGl0IHBhcnRpYWxfcG93ZXJfZG93biAqLworCQlyZXQgPSBkd2MyX2V4aXRf cGFydGlhbF9wb3dlcl9kb3duKGhzb3RnLCB0cnVlKTsKKwkJaWYgKHJldCAmJiAocmV0ICE9IC1F Tk9UU1VQUCkpCisJCQlkZXZfZXJyKGhzb3RnLT5kZXYsICJleGl0IHBhcnRpYWxfcG93ZXJfZG93 biBmYWlsZWRcbiIpOworCX0gZWxzZSB7CisJCXBjZ2N0bCA9IHJlYWRsKGhzb3RnLT5yZWdzICsg UENHQ1RMKTsKKwkJcGNnY3RsICY9IH5QQ0dDVExfU1RPUFBDTEs7CisJCXdyaXRlbChwY2djdGws IGhzb3RnLT5yZWdzICsgUENHQ1RMKTsKKwl9CiAKIAloc290Zy0+bHhfc3RhdGUgPSBEV0MyX0ww OwogCkBAIC00NTkyLDEwICs0NjEyLDEyIEBAIHN0YXRpYyBpbnQgX2R3YzJfaGNkX3Jlc3VtZShz dHJ1Y3QgdXNiX2hjZCAqaGNkKQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc290Zy0+bG9j aywgZmxhZ3MpOwogCQlkd2MyX3BvcnRfcmVzdW1lKGhzb3RnKTsKIAl9IGVsc2UgewotCQlkd2My X3ZidXNfc3VwcGx5X2luaXQoaHNvdGcpOworCQlpZiAoaHNvdGctPnBhcmFtcy5wb3dlcl9kb3du ID09IERXQzJfUE9XRVJfRE9XTl9QQVJBTV9QQVJUSUFMKSB7CisJCQlkd2MyX3ZidXNfc3VwcGx5 X2luaXQoaHNvdGcpOwogCi0JCS8qIFdhaXQgZm9yIGNvbnRyb2xsZXIgdG8gY29ycmVjdGx5IHVw ZGF0ZSBEKy9ELSBsZXZlbCAqLwotCQl1c2xlZXBfcmFuZ2UoMzAwMCwgNTAwMCk7CisJCQkvKiBX YWl0IGZvciBjb250cm9sbGVyIHRvIGNvcnJlY3RseSB1cGRhdGUgRCsvRC0gbGV2ZWwgKi8KKwkJ CXVzbGVlcF9yYW5nZSgzMDAwLCA1MDAwKTsKKwkJfQogCiAJCS8qCiAJCSAqIENsZWFyIFBvcnQg RW5hYmxlIGFuZCBQb3J0IFN0YXR1cyBjaGFuZ2VzLgo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,T_DKIMWL_WL_HIGH,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0BDB3C282DD for ; Thu, 18 Apr 2019 00:15:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C133A21850 for ; Thu, 18 Apr 2019 00:15:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="P3yGxppl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387638AbfDRAO7 (ORCPT ); Wed, 17 Apr 2019 20:14:59 -0400 Received: from mail-pf1-f195.google.com ([209.85.210.195]:34992 "EHLO mail-pf1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729331AbfDRAO6 (ORCPT ); Wed, 17 Apr 2019 20:14:58 -0400 Received: by mail-pf1-f195.google.com with SMTP id t21so242650pfh.2 for ; Wed, 17 Apr 2019 17:14:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kqTM4X13zllIwVukxHiG4L+ohv7hFQSZFxL4FXnl0KE=; b=P3yGxpplISbbAjyh5feqp9pmKDDhUZ6n4aB2skbFqXMwReC1ufBQbAsj4sCAj4J8er IR5cdMUZp8M57uV4tT32Slvzzrm3r3dMK4PTHr0+U7lqtR2mCKQ3YBtQAb1PcJMOTjtx ecFK9YRgTFNqcrrg/UnicukR/zopR1waAk/54= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kqTM4X13zllIwVukxHiG4L+ohv7hFQSZFxL4FXnl0KE=; b=SsXRwteewiJGc0b/75wbZE0sDfwLywC4fbKKiYxEv5xEv8Jv7qhhN8mQ5uFZfja+Sy ZBAULZp+03hUBJXuU8cKs9kpbCMUwIOidGsaVKlCXSuwLLMkxKH9qwksIQ+Qo8v7ZSDC XylYn61gzv0kadrfy2TJiZcJ3tELdjIbA7nQabcyXc0X7CZyakARv1nhhlEI9K6JTH9q YIqmFhuKa36EGea9V1YZgLRrLqEuoy3bp7/v5PQ3zRroi/0FEY4J+2wYf1HG0uVr/mo9 QXGIdlTdr9RPgDScR1O9zcbrDEXfMJnHTdX6HKrCPnk7WC4y7bZ68r9BfOFwwl51vqOn PVXA== X-Gm-Message-State: APjAAAUGKVsOro4yJ+QKJLf+mgvuo48zgKLCQwkaUg8Zsc/J+8Og8CIX QbNS+Cf7/AOoZN+w8PxO4LZPyA== X-Google-Smtp-Source: APXvYqyivasih9sth0BaBOc1OCWFOlMcvZv0okIVjyRZVEgbD74taE1L9rgCQIevhcQzSJ8LltJoPA== X-Received: by 2002:aa7:884b:: with SMTP id k11mr92680149pfo.49.1555546497634; Wed, 17 Apr 2019 17:14:57 -0700 (PDT) Received: from tictac2.mtv.corp.google.com ([2620:15c:202:1:24fa:e766:52c9:e3b2]) by smtp.gmail.com with ESMTPSA id q5sm447668pff.97.2019.04.17.17.14.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 17 Apr 2019 17:14:57 -0700 (PDT) From: Douglas Anderson To: Minas Harutyunyan , Felipe Balbi , heiko@sntech.de Cc: Alan Stern , Artur Petrosyan , amstan@chromium.org, linux-rockchip@lists.infradead.org, William Wu , linux-usb@vger.kernel.org, Stefan Wahren , Randy Li , zyw@rock-chips.com, mka@chromium.org, ryandcase@chromium.org, Amelie Delaunay , jwerner@chromium.org, dinguyen@opensource.altera.com, Elaine Zhang , Douglas Anderson , Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: [PATCH v2 1/5] usb: dwc2: bus suspend/resume for hosts with DWC2_POWER_DOWN_PARAM_NONE Date: Wed, 17 Apr 2019 17:13:52 -0700 Message-Id: <20190418001356.124334-2-dianders@chromium.org> X-Mailer: git-send-email 2.21.0.593.g511ec345e18-goog In-Reply-To: <20190418001356.124334-1-dianders@chromium.org> References: <20190418001356.124334-1-dianders@chromium.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-usb-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-usb@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Message-ID: <20190418001352.JQzQHO2QIKlI1FP_yX1K_nPu5lLhg0fXnueu_qeQT-s@z> This is an attempt to rehash commit 0cf884e819e0 ("usb: dwc2: add bus suspend/resume for dwc2") on ToT. That commit was reverted in commit b0bb9bb6ce01 ("Revert "usb: dwc2: add bus suspend/resume for dwc2"") because apparently it broke the Altera SOCFPGA. With all the changes that have happened to dwc2 in the meantime, it's possible that the Altera SOCFPGA will just magically work with this change now. ...and it would be good to get bus suspend/resume implemented. This change is a forward port of one that's been living in the Chrome OS 3.14 kernel tree. Signed-off-by: Douglas Anderson --- This patch was last posted at: https://lkml.kernel.org/r/1446237173-15263-1-git-send-email-dianders@chromium.org ...and appears to have died the death of silence. Maybe it could get some bake time in linuxnext if we can't find any proactive testing? I will also freely admit that I don't know tons about the theory behind this patch. I'm mostly just re-hashing the original commit from Kever that was reverted since: * Turning on partial power down on rk3288 doesn't "just work". I don't get hotplug events. This is despite dwc2 auto-detecting that we are power optimized. * If we don't do something like this commit we don't get into as low of a power mode. Changes in v2: None drivers/usb/dwc2/hcd.c | 84 ++++++++++++++++++++++++++---------------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index e272d020012e..978232a9e4a8 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -4482,6 +4482,7 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) unsigned long flags; int ret = 0; u32 hprt0; + u32 pcgctl; spin_lock_irqsave(&hsotg->lock, flags); @@ -4497,7 +4498,7 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) if (hsotg->op_state == OTG_STATE_B_PERIPHERAL) goto unlock; - if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL) + if (hsotg->params.power_down > DWC2_POWER_DOWN_PARAM_PARTIAL) goto skip_power_saving; /* @@ -4506,21 +4507,35 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) */ if (!hsotg->bus_suspended) { hprt0 = dwc2_read_hprt0(hsotg); - hprt0 |= HPRT0_SUSP; - hprt0 &= ~HPRT0_PWR; - dwc2_writel(hsotg, hprt0, HPRT0); - spin_unlock_irqrestore(&hsotg->lock, flags); - dwc2_vbus_supply_exit(hsotg); - spin_lock_irqsave(&hsotg->lock, flags); + if (hprt0 & HPRT0_CONNSTS) { + hprt0 |= HPRT0_SUSP; + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) + hprt0 &= ~HPRT0_PWR; + dwc2_writel(hsotg, hprt0, HPRT0); + } + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) { + spin_unlock_irqrestore(&hsotg->lock, flags); + dwc2_vbus_supply_exit(hsotg); + spin_lock_irqsave(&hsotg->lock, flags); + } else { + pcgctl = readl(hsotg->regs + PCGCTL); + pcgctl |= PCGCTL_STOPPCLK; + writel(pcgctl, hsotg->regs + PCGCTL); + } } - /* Enter partial_power_down */ - ret = dwc2_enter_partial_power_down(hsotg); - if (ret) { - if (ret != -ENOTSUPP) - dev_err(hsotg->dev, - "enter partial_power_down failed\n"); - goto skip_power_saving; + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) { + /* Enter partial_power_down */ + ret = dwc2_enter_partial_power_down(hsotg); + if (ret) { + if (ret != -ENOTSUPP) + dev_err(hsotg->dev, + "enter partial_power_down failed\n"); + goto skip_power_saving; + } + + /* After entering partial_power_down, hardware is no more accessible */ + clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); } /* Ask phy to be suspended */ @@ -4530,9 +4545,6 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) spin_lock_irqsave(&hsotg->lock, flags); } - /* After entering partial_power_down, hardware is no more accessible */ - clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - skip_power_saving: hsotg->lx_state = DWC2_L2; unlock: @@ -4545,6 +4557,7 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd) { struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd); unsigned long flags; + u32 pcgctl; int ret = 0; spin_lock_irqsave(&hsotg->lock, flags); @@ -4555,17 +4568,11 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd) if (hsotg->lx_state != DWC2_L2) goto unlock; - if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL) { + if (hsotg->params.power_down > DWC2_POWER_DOWN_PARAM_PARTIAL) { hsotg->lx_state = DWC2_L0; goto unlock; } - /* - * Set HW accessible bit before powering on the controller - * since an interrupt may rise. - */ - set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); - /* * Enable power if not already done. * This must not be spinlocked since duration @@ -4577,10 +4584,23 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd) spin_lock_irqsave(&hsotg->lock, flags); } - /* Exit partial_power_down */ - ret = dwc2_exit_partial_power_down(hsotg, true); - if (ret && (ret != -ENOTSUPP)) - dev_err(hsotg->dev, "exit partial_power_down failed\n"); + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) { + /* + * Set HW accessible bit before powering on the controller + * since an interrupt may rise. + */ + set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + + + /* Exit partial_power_down */ + ret = dwc2_exit_partial_power_down(hsotg, true); + if (ret && (ret != -ENOTSUPP)) + dev_err(hsotg->dev, "exit partial_power_down failed\n"); + } else { + pcgctl = readl(hsotg->regs + PCGCTL); + pcgctl &= ~PCGCTL_STOPPCLK; + writel(pcgctl, hsotg->regs + PCGCTL); + } hsotg->lx_state = DWC2_L0; @@ -4592,10 +4612,12 @@ static int _dwc2_hcd_resume(struct usb_hcd *hcd) spin_unlock_irqrestore(&hsotg->lock, flags); dwc2_port_resume(hsotg); } else { - dwc2_vbus_supply_init(hsotg); + if (hsotg->params.power_down == DWC2_POWER_DOWN_PARAM_PARTIAL) { + dwc2_vbus_supply_init(hsotg); - /* Wait for controller to correctly update D+/D- level */ - usleep_range(3000, 5000); + /* Wait for controller to correctly update D+/D- level */ + usleep_range(3000, 5000); + } /* * Clear Port Enable and Port Status changes. -- 2.21.0.593.g511ec345e18-goog