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=-17.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 autolearn=ham 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 C6BBBC433DB for ; Tue, 5 Jan 2021 07:14:41 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6226D22515 for ; Tue, 5 Jan 2021 07:14:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726300AbhAEHOl (ORCPT ); Tue, 5 Jan 2021 02:14:41 -0500 Received: from Mailgw01.mediatek.com ([1.203.163.78]:4359 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1725769AbhAEHOk (ORCPT ); Tue, 5 Jan 2021 02:14:40 -0500 X-UUID: dc6a76dccc2044f5b3dd9d0c1c8a2bd5-20210105 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=C1MgoqN9hzwMlKk8wIlBMJzdyW2My6gPGw6t6QrMglQ=; b=cJWD9bxabMPHeXjjw9NZ/rBG075ejwRcAo/SNe7oOjjf9+cuUUBx/ebLbDCedCRW2KnTG76K00nX0ZuuPpnMeT6UPnMwmNkP8whTH/XzMQMtnyC4giVNAjNcf8Wod+irXbiUAR9WQ/+o2PopskzMpcnLwWvdTnDBqJbkuVbMrTo=; X-UUID: dc6a76dccc2044f5b3dd9d0c1c8a2bd5-20210105 Received: from mtkcas35.mediatek.inc [(172.27.4.253)] by mailgw01.mediatek.com (envelope-from ) (mailgw01.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 192954080; Tue, 05 Jan 2021 15:13:44 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 5 Jan 2021 15:13:42 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 5 Jan 2021 15:13:41 +0800 Message-ID: <1609830821.24856.26.camel@mhfsdcap03> Subject: Re: [RFC PATCH v3 4/5] usb: xhci-mtk: add support runtime pm From: Chunfeng Yun To: Ikjoon Jang CC: Tianping Fang , Zhanyong Wang , "moderated list:ARM/Mediatek SoC support" , , open list , CK Hu , Zhanyong Wang Date: Tue, 5 Jan 2021 15:13:41 +0800 In-Reply-To: References: <1608629682-8535-1-git-send-email-chunfeng.yun@mediatek.com> <1608629682-8535-4-git-send-email-chunfeng.yun@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AF622B8E7BC7E5D23CB01030AA6E6075776304E5B40B25307A910127801E36552000:8 X-MTK: N Content-Transfer-Encoding: base64 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgSWtqb29uLA0KDQogICBJIHRyeSB0byByZWJ1aWxkIHRoZSBjb2RlIGZsb3csIGFuZCB3YW50 IHRvIGFwcGx5IHRoZSBmcmFtZXdvcmsgZnJvbQ0Kd2FrZWlycS5jDQoNCk9uIFR1ZSwgMjAyMC0x Mi0yOSBhdCAxNTozOCArMDgwMCwgSWtqb29uIEphbmcgd3JvdGU6DQo+IE9uIFR1ZSwgRGVjIDIy LCAyMDIwIGF0IDU6MzUgUE0gQ2h1bmZlbmcgWXVuIDxjaHVuZmVuZy55dW5AbWVkaWF0ZWsuY29t PiB3cm90ZToNCj4gPg0KPiA+IEZyb206IENLIEh1IDxjay5odUBtZWRpYXRlay5jb20+DQo+ID4N Cj4gPiBhZGQgc3VwcG9ydCBydW50aW1lIHBtIGZlYXR1cmUNCj4gPg0KPiA+IFNpZ25lZC1vZmYt Ynk6IFpoYW55b25nIFdhbmcgPHpoYW55b25nLndhbmdAbWVkaWF0ZWsuY29tPg0KPiA+IFNpZ25l ZC1vZmYtYnk6IENodW5mZW5nIFl1biA8Y2h1bmZlbmcueXVuQG1lZGlhdGVrLmNvbT4NCj4gPiAt LS0NCj4gPiB2MzoNCj4gPiAgIDEuIGZpeCBzb21lIGlzc3Vlcw0KPiA+ICAgMi4gcmVtb3ZlIGF0 dHJpYnV0ZSBmaWxlcw0KPiA+DQo+ID4gdjI6IGZpeCBlcnJvciBjYXVzZWQgYnkgcmVxdWVzdCBp cnEgc3VnZ2VzdGVkIGJ5IENLDQo+ID4gLS0tDQo+ID4gIGRyaXZlcnMvdXNiL2hvc3QveGhjaS1t dGsuYyB8IDI4NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0NCj4gPiAgZHJp dmVycy91c2IvaG9zdC94aGNpLW10ay5oIHwgIDE0ICsrDQo+ID4gIDIgZmlsZXMgY2hhbmdlZCwg Mjk0IGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pDQo+ID4gIG1vZGUgY2hhbmdlIDEwMDc1 NSA9PiAxMDA2NDQgZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5jDQo+ID4NCj4gPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNp LW10ay5jDQo+ID4gb2xkIG1vZGUgMTAwNzU1DQo+ID4gbmV3IG1vZGUgMTAwNjQ0DQo+ID4gaW5k ZXggMzRiZDNkZTA5MGIxLi5jMDdkNTRhY2JjYjcNCj4gPiAtLS0gYS9kcml2ZXJzL3VzYi9ob3N0 L3hoY2ktbXRrLmMNCj4gPiArKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbXRrLmMNCj4gPiBA QCAtMTQsNiArMTQsNyBAQA0KPiA+ICAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPg0KPiA+ ICAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+DQo+ID4gICNpbmNsdWRlIDxsaW51eC9vZi5oPg0K PiA+ICsjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+DQo+ID4gICNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4NCj4gPiAgI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4NCj4gPiAg I2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPg0KPiA+IEBAIC03Nyw2ICs3OCw3MiBAQCBlbnVtIHNz dXNiX3V3a192ZXJzIHsNCj4gPiAgICAgICAgIFNTVVNCX1VXS19WMywNCj4gPiAgfTsNCj4gPg0K PiA+ICtpbnQgeGhjaV9tdGtfcnVudGltZV9yZWFkeTsNCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQg eGhjaV9tdGtfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsNCj4gPiArDQo+ID4g K3N0YXRpYyB2b2lkIHhoY2lfbXRrX3NlYWxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsp DQo+ID4gK3sNCj4gPiArICAgICAgIHN0cnVjdCB4aGNpX2hjZF9tdGsgKm10ayA9DQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB4aGNpX2hjZF9t dGssIHNlYWwud29yayk7DQo+ID4gKyAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gbXRrLT5o Y2Q7DQo+ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9oY2QgKnhoY2kgPSBoY2RfdG9feGhjaShoY2Qp Ow0KPiA+ICsNCj4gPiArICAgICAgIHhoY2lfZGJnKHhoY2ksICJzcG0gdW5zZWFscyB4SENJIGNv bnRyb2xsZXIgJWlcbiIsIG10ay0+c2VhbF9zdGF0dXMpOw0KPiA+ICsgICAgICAgaWYgKG10ay0+ c2VhbF9zdGF0dXMgPT0gU0VBTF9TVVNQRU5ERUQpIHsNCj4gPiArICAgICAgICAgICAgICAgbXRr LT5zZWFsX3N0YXR1cyA9IFNFQUxfUkVTVU1JTkc7DQo+ID4gKyAgICAgICAgICAgICAgIHBtX3J1 bnRpbWVfbWFya19sYXN0X2J1c3kobXRrLT5kZXYpOw0KPiA+ICsgICAgICAgICAgICAgICBwbV9y dW50aW1lX3B1dF9zeW5jX2F1dG9zdXNwZW5kKG10ay0+ZGV2KTsNCj4gDQo+IElmIEkgdW5kZXJz dGFuZCBjb3JyZWN0bHksIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHdha2luZyB1cCB0aGUgZGV2aWNl DQo+IGJ1dCB0aGlzIGZ1bmN0aW9uIGNhbGxzIHB1dCgpIG9ubHkgd2l0aG91dCBnZXQoKS4NCndp bGwgdXNlIHBtX3JlcXVlc3RfcmVzdW1lKCk7DQoNCj4gDQo+ID4gKyAgICAgICB9IGVsc2Ugew0K PiA+ICsgICAgICAgICAgICAgICAvKg0KPiA+ICsgICAgICAgICAgICAgICAgKiBGSVhNRTogU29t ZXRpbWVzIHNlYWxfc3RhdHVzIHdpbGwga2VlcCBpdCBvbiBTRUFMX1JFU1VNSU5HIHN0YXVzIG5v dCB0byBleHBlY3QNCj4gPiArICAgICAgICAgICAgICAgICogc2luY2UgcG1fcnVudGltZV9wdXRf c3luY19hdXRvc3VzcGVuZCBkb2Vzbid0IGludm9rZSBydW50aW1lX3Jlc3VtZSBvZiBjYWxsYmFj ay4NCj4gPiArICAgICAgICAgICAgICAgICogYW5kIHRvIHN1cnZleSB3aHkgbm90IHRvIGludm9r ZSBydW50aW1lX3Jlc3VtZSBjYWxsYmFjayBuYW1lZA0KPiA+ICsgICAgICAgICAgICAgICAgKiB4 aGNpX210a19ydW50aW1lX3Jlc3VtZSBpbiB0aW1lIGluIHNob3J0IGZlYXR1cmUsIEhlcmVseSBw cm92aWRlIG9uZSBzb2x1dGlvbg0KPiA+ICsgICAgICAgICAgICAgICAgKiB0aGF0IG1ha2Ugc3Vy ZSBzZWFsX3N0YXR1cyB0byBtYXRjaCBoL3cgc3RhdGUgbWFjaGluZSxhbmQgTVRLIHhIQ0kgY2xv Y2tzDQo+ID4gKyAgICAgICAgICAgICAgICAqIG9uIGFzIHNvb24gYXMgdW5zZWFsIGV2ZW50IHJl Y2VpdmVkLg0KPiANCj4gSSBndWVzcyBhY3R1YWwgcmVzdW1pbmcgc2hvdWxkIGJlIGhhcHBlbmVk IG9ubHkgZnJvbSB0aGUgMXN0IGludGVycnVwdA0KPiAod2hlbiBpbiBTRUFMX1NVU1BFTkRFRCkN Cj4gYW5kIGZvbGxvd2luZyBzcHVyaW91cyBpbnRlcnJ1cHRzIGNhbiBiZSBqdXN0IGlnbm9yZWQu DQpZZXMNCj4gDQo+ID4gKyAgICAgICAgICAgICAgICAqLw0KPiA+ICsgICAgICAgICAgICAgICBp ZiAobXRrLT5zZWFsX3N0YXR1cyA9PSBTRUFMX1JFU1VNSU5HKQ0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIHhoY2lfbXRrX3J1bnRpbWVfcmVzdW1lKG10ay0+ZGV2KTsNCj4gDQo+IHhoY2lf bXRrX3J1bnRpbWVfcmVzdW1lKCkgaXMgZGVmaW5lZCBhcyBhIHJ1bnRpbWUgcG0gY2FsbGJhY2ss DQo+IHBtIGNvcmUgd2lsbCBjYWxsIHRoYXQgY2FsbGJhY2sgd2hlbiBwbSB1c2FnZSBjb3VudGVy IHJlYWNoZXMgdG8gemVyby4NClllcw0KPiANCj4gPiArICAgICAgICAgICAgICAgZWxzZQ0KPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgIHhoY2lfd2Fybih4aGNpLA0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIklnbm9yZSBzZWFsIHdha2V1cCBzb3VyY2UgZGlzb3JkZXJl ZCBpbiB4SENJIGNvbnRyb2xsZXJcbiIpOw0KPiA+ICsgICAgICAgfQ0KPiA+ICt9DQo+ID4gKw0K PiA+ICtzdGF0aWMgaXJxcmV0dXJuX3QgeGhjaV9tdGtfc2VhbF9pcnEoaW50IGlycSwgdm9pZCAq ZGF0YSkNCj4gPiArew0KPiA+ICsgICAgICAgc3RydWN0IHhoY2lfaGNkX210ayAqbXRrID0gZGF0 YTsNCj4gPiArICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBtdGstPmhjZDsNCj4gPiArICAg ICAgIHN0cnVjdCB4aGNpX2hjZCAqeGhjaSA9IGhjZF90b194aGNpKGhjZCk7DQo+ID4gKw0KPiA+ ICsgICAgICAgeGhjaV9kYmcoeGhjaSwgInNlYWwgaXJxIElTUiBpbnZva2VkXG4iKTsNCj4gPiAr DQo+ID4gKyAgICAgICBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm10ay0+c2VhbCwgMCk7DQo+ID4g Kw0KPiA+ICsgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgdm9pZCB4aGNpX210a19zZWFsX3dha2V1cF9lbmFibGUoc3RydWN0IHhoY2lfaGNkX210 ayAqbXRrLCBib29sIGVuYWJsZSkNCj4gPiArew0KPiA+ICsgICAgICAgc3RydWN0IGlycV9kZXNj ICpkZXNjOw0KPiA+ICsgICAgICAgc3RydWN0IGRldmljZSAqZGV2ID0gbXRrLT5kZXY7DQo+ID4g Kw0KPiA+ICsgICAgICAgaWYgKG10ayAmJiBtdGstPnNlYWxfaXJxKSB7DQo+ID4gKyAgICAgICAg ICAgICAgIGRlc2MgPSBpcnFfdG9fZGVzYyhtdGstPnNlYWxfaXJxKTsNCj4gPiArICAgICAgICAg ICAgICAgaWYgKGVuYWJsZSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmly cV9kYXRhLmNoaXAtPmlycV9hY2soJmRlc2MtPmlycV9kYXRhKTsNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICBlbmFibGVfaXJxKG10ay0+c2VhbF9pcnEpOw0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIGRldl9kYmcoZGV2LCAiJXM6IGVuYWJsZV9pcnEgJWlcbiIsDQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG10ay0+c2VhbF9pcnEpOw0KPiA+ ICsgICAgICAgICAgICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGRp c2FibGVfaXJxKG10ay0+c2VhbF9pcnEpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGRl dl9kYmcoZGV2LCAiJXM6IGRpc2FibGVfaXJxICVpXG4iLA0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtdGstPnNlYWxfaXJxKTsNCj4gPiArICAgICAgICAg ICAgICAgfQ0KPiA+ICsgICAgICAgfQ0KPiA+ICt9DQo+ID4gKw0KPiANCj4gSSB0aGluayB0aGlz IGlzIHVubmVjZXNzYXJ5IGlmIHRoaXMgZHJpdmVyIGNhbiBjaGVjayB0aGUgY3VycmVudCBzdGF0 ZQ0KPiBhbmQgaWdub3JlIHRoZSBzcHVyaW91cyBpcnFzIGlmIHNwbSBzb21ldGltZXMgdHJpZ2dl cnMgdGhlIHdha2UtdXAgaXJxcy4NCkl0IGhlbHBzIHRvIHJlZHVjZSBzb21lIGlycXMsIHRoZXJl IGFyZSBtYW55IHNwdXJpb3VzIGludGVycnVwdHMsIEkNCnRoaW5rIHRoZXJlIGlzIHNvbWV0aGlu ZyB3cm9uZyBmcm9tIHRoZSBwb2ludCBvZiBIVywgd2lsbCB0cnkgdG8gZmluZA0KdGhlIHJvb3Qg Y2F1c2UuDQoNCj4gDQo+ID4gIHN0YXRpYyBpbnQgeGhjaV9tdGtfaG9zdF9lbmFibGUoc3RydWN0 IHhoY2lfaGNkX210ayAqbXRrKQ0KPiA+ICB7DQo+ID4gICAgICAgICBzdHJ1Y3QgbXUzY19pcHBj X3JlZ3MgX19pb21lbSAqaXBwYyA9IG10ay0+aXBwY19yZWdzOw0KPiA+IEBAIC0zNDcsNyArNDE0 LDYgQEAgc3RhdGljIGludCB1c2Jfd2FrZXVwX29mX3Byb3BlcnR5X3BhcnNlKHN0cnVjdCB4aGNp X2hjZF9tdGsgKm10aywNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBtdGstPnV3a19yZWdf YmFzZSwgbXRrLT51d2tfdmVycyk7DQo+ID4NCj4gPiAgICAgICAgIHJldHVybiBQVFJfRVJSX09S X1pFUk8obXRrLT51d2spOw0KPiA+IC0NCj4gPiAgfQ0KPiA+DQo+ID4gIHN0YXRpYyB2b2lkIHVz Yl93YWtldXBfc2V0KHN0cnVjdCB4aGNpX2hjZF9tdGsgKm10aywgYm9vbCBlbmFibGUpDQo+ID4g QEAgLTQ4Miw5ICs1NDgsMTEgQEAgc3RhdGljIGludCB4aGNpX210a19wcm9iZShzdHJ1Y3QgcGxh dGZvcm1fZGV2aWNlICpwZGV2KQ0KPiA+ICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Ow0KPiA+ ICAgICAgICAgfQ0KPiA+DQo+ID4gKyAgICAgICBwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsN Cj4gPiArICAgICAgIHBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7DQo+ID4gKyAgICAg ICBwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShkZXYsDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBDT05GSUdfVVNCX0FVVE9TVVNQRU5EX0RFTEFZICogMTAwMCk7 DQo+ID4gICAgICAgICBwbV9ydW50aW1lX2VuYWJsZShkZXYpOw0KPiA+IC0gICAgICAgcG1fcnVu dGltZV9nZXRfc3luYyhkZXYpOw0KPiANCj4gVGhlIG9ubHkgb25lIGxlZnQgcG1fcnVudGltZV9n ZXQoKSBpcyByZW1vdmVkIGJ5IGhlcmUsDQo+IG5vdyB0aGlzIGRyaXZlciBvbmx5IGNhbGxzIHBt X3J1bnRpbWVfcHV0KCkuDQp3aWxsIGFkZCBpdCBiYWNrLCBhbmQgZm9yYmlkIHJ1bnRpbWUgYnkg ZGVmYXVsdA0KPiANCj4gPiAtICAgICAgIGRldmljZV9lbmFibGVfYXN5bmNfc3VzcGVuZChkZXYp Ow0KPiA+DQo+ID4gICAgICAgICByZXQgPSB4aGNpX210a19sZG9zX2VuYWJsZShtdGspOw0KPiA+ ICAgICAgICAgaWYgKHJldCkNCj4gPiBAQCAtNDk5LDYgKzU2NywxNCBAQCBzdGF0aWMgaW50IHho Y2lfbXRrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gICAgICAgICAg ICAgICAgIHJldCA9IGlycTsNCj4gPiAgICAgICAgICAgICAgICAgZ290byBkaXNhYmxlX2NsazsN Cj4gPiAgICAgICAgIH0NCj4gPiArICAgICAgIGRldl9kYmcoZGV2LCAiaXJxICVpXG4iLCBpcnEp Ow0KPiA+ICsNCj4gPiArICAgICAgIG10ay0+c2VhbF9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX29w dGlvbmFsKHBkZXYsIDEpOw0KPiA+ICsgICAgICAgaWYgKG10ay0+c2VhbF9pcnEgPCAwKSB7DQo+ ID4gKyAgICAgICAgICAgICAgIHJldCA9IG10ay0+c2VhbF9pcnE7DQo+ID4gKyAgICAgICAgICAg ICAgIGdvdG8gZGlzYWJsZV9jbGs7DQo+ID4gKyAgICAgICB9DQo+ID4gKyAgICAgICBkZXZfZGJn KGRldiwgInNlYWxfaXJxICVpXG4iLCBtdGstPnNlYWxfaXJxKTsNCj4gPg0KPiA+ICAgICAgICAg aGNkID0gdXNiX2NyZWF0ZV9oY2QoZHJpdmVyLCBkZXYsIGRldl9uYW1lKGRldikpOw0KPiA+ICAg ICAgICAgaWYgKCFoY2QpIHsNCj4gPiBAQCAtNTY1LDYgKzY0MSwyNyBAQCBzdGF0aWMgaW50IHho Y2lfbXRrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gICAgICAgICBp ZiAocmV0KQ0KPiA+ICAgICAgICAgICAgICAgICBnb3RvIGRlYWxsb2NfdXNiMl9oY2Q7DQo+ID4N Cj4gPiArICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZtdGstPnNlYWwsIHhoY2lfbXRrX3NlYWxf d29yayk7DQo+ID4gKyAgICAgICBzbnByaW50ZihtdGstPnNlYWxfZGVzY3IsIHNpemVvZihtdGst PnNlYWxfZGVzY3IpLCAic2VhbCVzOnVzYiVkIiwNCj4gPiArICAgICAgICAgICAgICAgIGhjZC0+ ZHJpdmVyLT5kZXNjcmlwdGlvbiwgaGNkLT5zZWxmLmJ1c251bSk7DQo+ID4gKyAgICAgICByZXQg PSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgbXRrLT5zZWFsX2lycSwgJnhoY2lfbXRrX3NlYWxfaXJx LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsIG10 ay0+c2VhbF9kZXNjciwgbXRrKTsNCj4gPiArICAgICAgIGlmIChyZXQgIT0gMCkgew0KPiA+ICsg ICAgICAgICAgICAgICBkZXZfZXJyKGRldiwgInNlYWwgcmVxdWVzdCBpbnRlcnJ1cHQgJWQgZmFp bGVkXG4iLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG10ay0+c2VhbF9pcnEpOw0KPiA+ ICsgICAgICAgICAgICAgICBnb3RvIGRlYWxsb2NfdXNiMl9oY2Q7DQo+ID4gKyAgICAgICB9DQo+ ID4gKyAgICAgICB4aGNpX210a19zZWFsX3dha2V1cF9lbmFibGUobXRrLCBmYWxzZSk7DQo+ID4g Kw0KPiA+ICsgICAgICAgZGV2aWNlX2VuYWJsZV9hc3luY19zdXNwZW5kKGRldik7DQo+ID4gKyAg ICAgICB4aGNpX210a19ydW50aW1lX3JlYWR5ID0gMTsNCj4gPiArDQo+ID4gKyAgICAgICBwbV9y dW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7DQo+ID4gKyAgICAgICBwbV9ydW50aW1lX3B1dF9h dXRvc3VzcGVuZChkZXYpOw0KPiANCj4gSSBleHBlY3QgdGhlIHVzYWdlIGNvdW50IHdpbGwgYmUg LTEgYnkgaGVyZSBpbiBwcm9iZS4NCndpbGwgY2hhbmdlIGl0DQo+IA0KPiA+ICsNCj4gPiArICAg ICAgIGRldl9kYmcoZGV2LCAiJXM6IHhoY2lfbXRrX3J1bnRpbWVfcmVhZHkgJWkiLA0KPiA+ICsg ICAgICAgICAgICAgICAgX19mdW5jX18sIHhoY2lfbXRrX3J1bnRpbWVfcmVhZHkpOw0KPiA+ICsN Cj4gPiAgICAgICAgIHJldHVybiAwOw0KPiA+DQo+ID4gIGRlYWxsb2NfdXNiMl9oY2Q6DQo+ID4g QEAgLTU4Nyw3ICs2ODQsNyBAQCBzdGF0aWMgaW50IHhoY2lfbXRrX3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpDQo+ID4gICAgICAgICB4aGNpX210a19sZG9zX2Rpc2FibGUobXRr KTsNCj4gPg0KPiA+ICBkaXNhYmxlX3BtOg0KPiA+IC0gICAgICAgcG1fcnVudGltZV9wdXRfc3lu YyhkZXYpOw0KPiA+ICsgICAgICAgcG1fcnVudGltZV9wdXRfc3luY19hdXRvc3VzcGVuZChkZXYp Ow0KPiA+ICAgICAgICAgcG1fcnVudGltZV9kaXNhYmxlKGRldik7DQo+ID4gICAgICAgICByZXR1 cm4gcmV0Ow0KPiA+ICB9DQo+ID4gQEAgLTYwMiw2ICs2OTksNyBAQCBzdGF0aWMgaW50IHhoY2lf bXRrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpDQo+ID4gICAgICAgICBwbV9y dW50aW1lX3B1dF9ub2lkbGUoJmRldi0+ZGV2KTsNCj4gPiAgICAgICAgIHBtX3J1bnRpbWVfZGlz YWJsZSgmZGV2LT5kZXYpOw0KPiA+DQo+ID4gKyAgICAgICB4aGNpX210a19ydW50aW1lX3JlYWR5 ID0gMDsNCj4gPiAgICAgICAgIHVzYl9yZW1vdmVfaGNkKHNoYXJlZF9oY2QpOw0KPiA+ICAgICAg ICAgeGhjaS0+c2hhcmVkX2hjZCA9IE5VTEw7DQo+ID4gICAgICAgICBkZXZpY2VfaW5pdF93YWtl dXAoJmRldi0+ZGV2LCBmYWxzZSk7DQo+ID4gQEAgLTYzOCw2ICs3MzYsNyBAQCBzdGF0aWMgaW50 IF9fbWF5YmVfdW51c2VkIHhoY2lfbXRrX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQ0KPiA+ ICAgICAgICAgeGhjaV9tdGtfaG9zdF9kaXNhYmxlKG10ayk7DQo+ID4gICAgICAgICB4aGNpX210 a19jbGtzX2Rpc2FibGUobXRrKTsNCj4gPiAgICAgICAgIHVzYl93YWtldXBfc2V0KG10aywgdHJ1 ZSk7DQo+ID4gKw0KPiA+ICAgICAgICAgcmV0dXJuIDA7DQo+ID4gIH0NCj4gPg0KPiA+IEBAIC02 NTksMTAgKzc1OCwxODUgQEAgc3RhdGljIGludCBfX21heWJlX3VudXNlZCB4aGNpX210a19yZXN1 bWUoc3RydWN0IGRldmljZSAqZGV2KQ0KPiA+ICAgICAgICAgcmV0dXJuIDA7DQo+ID4gIH0NCj4g Pg0KPiA+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHhoY2lfbXRrX2J1c19zdGF0dXMoc3Ry dWN0IGRldmljZSAqZGV2KQ0KPiA+ICt7DQo+ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9oY2RfbXRr ICptdGsgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsNCj4gPiArICAgICAgIHN0cnVjdCB1c2JfaGNk ICpoY2Q7DQo+ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7DQo+ID4gKyAgICAgICBz dHJ1Y3QgeGhjaV9odWIgKnVzYjJfcmh1YjsNCj4gPiArICAgICAgIHN0cnVjdCB4aGNpX2h1YiAq dXNiM19yaHViOw0KPiA+ICsgICAgICAgc3RydWN0IHhoY2lfYnVzX3N0YXRlICpidXNfc3RhdGU7 DQo+ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9wb3J0ICpwb3J0Ow0KPiA+ICsgICAgICAgdTMyICAg ICB1c2IyX3N1c3BlbmRlZF9wb3J0cyA9IC0xOw0KPiA+ICsgICAgICAgdTMyICAgICB1c2IzX3N1 c3BlbmRlZF9wb3J0cyA9IC0xOw0KPiA+ICsgICAgICAgdTE2IHN0YXR1czsNCj4gPiArICAgICAg IGludCBudW1fcG9ydHM7DQo+ID4gKyAgICAgICBpbnQgcmV0ID0gMDsNCj4gPiArICAgICAgIGlu dCBpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICghbXRrLT5oY2QpDQo+ID4gKyAgICAgICAgICAg ICAgIHJldHVybiAtRVNIVVRET1dOOw0KPiA+ICsNCj4gPiArICAgICAgIGhjZCA9IG10ay0+aGNk Ow0KPiA+ICsgICAgICAgeGhjaSA9IGhjZF90b194aGNpKGhjZCk7DQo+ID4gKyAgICAgICBpZiAo KHhoY2ktPnhoY19zdGF0ZSAmIFhIQ0lfU1RBVEVfUkVNT1ZJTkcpIHx8DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgKHhoY2ktPnhoY19zdGF0ZSAmIFhIQ0lfU1RBVEVfSEFMVEVEKSkgew0K PiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsNCj4gPiArICAgICAgIH0NCj4g DQo+IFRoaXMgaXMgZHVwbGljYXRlZCBmcm9tIHhoY2lfbXRrX3J1bnRpbWVfc3VzcGVuZCgpDQpZ ZXMsIHdpbGwgcmVtb3ZlIGl0IGFuZCByZWJ1aWxkIHRoZSBjb2RlDQo+IA0KPiA+ICsNCj4gPiAr ICAgICAgIHVzYjJfcmh1YiA9ICZ4aGNpLT51c2IyX3JodWI7DQo+ID4gKyAgICAgICBpZiAodXNi Ml9yaHViKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGJ1c19zdGF0ZSAgPSAmdXNiMl9yaHViLT5i dXNfc3RhdGU7DQo+ID4gKyAgICAgICAgICAgICAgIG51bV9wb3J0cyAgPSB1c2IyX3JodWItPm51 bV9wb3J0czsNCj4gPiArICAgICAgICAgICAgICAgdXNiMl9zdXNwZW5kZWRfcG9ydHMgID0gYnVz X3N0YXRlLT5zdXNwZW5kZWRfcG9ydHM7DQo+ID4gKyAgICAgICAgICAgICAgIHVzYjJfc3VzcGVu ZGVkX3BvcnRzIF49IChCSVQobnVtX3BvcnRzKSAtIDEpOw0KPiA+ICsgICAgICAgICAgICAgICB1 c2IyX3N1c3BlbmRlZF9wb3J0cyAmPSAoQklUKG51bV9wb3J0cykgLSAxKTsNCj4gPiArICAgICAg ICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wb3J0czsgaSsrKSB7DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgaWYgKHVzYjJfc3VzcGVuZGVkX3BvcnRzICYgKDFVTCA8PCBpKSkgew0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHVzYjJfcmh1Yi0+cG9y dHNbaV07DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSByZWFk bChwb3J0LT5hZGRyKTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB4aGNpX2RiZyh4aGNpLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJVU0IyMDogcG9ydHNjWyVpXTogMHglMDRYXG4iLA0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHN0YXR1cyk7DQo+ID4gKw0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoc3RhdHVzICYgUE9SVF9DT05ORUNUKSkN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiMl9zdXNwZW5k ZWRfcG9ydHMgJj0gfigxVUwgPDwgaSk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgfQ0K PiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBpZiAodXNi Ml9zdXNwZW5kZWRfcG9ydHMpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAt RUJVU1k7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZ290byBlYnVzeTsNCj4gPiArICAg ICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIHVzYjNfcmh1 YiA9ICZ4aGNpLT51c2IzX3JodWI7DQo+ID4gKyAgICAgICBpZiAodXNiM19yaHViKSB7DQo+ID4g KyAgICAgICAgICAgICAgIGJ1c19zdGF0ZSAgPSAmdXNiM19yaHViLT5idXNfc3RhdGU7DQo+ID4g KyAgICAgICAgICAgICAgIG51bV9wb3J0cyAgPSB1c2IzX3JodWItPm51bV9wb3J0czsNCj4gPiAr ICAgICAgICAgICAgICAgdXNiM19zdXNwZW5kZWRfcG9ydHMgID0gYnVzX3N0YXRlLT5zdXNwZW5k ZWRfcG9ydHM7DQo+ID4gKyAgICAgICAgICAgICAgIHVzYjNfc3VzcGVuZGVkX3BvcnRzIF49IChC SVQobnVtX3BvcnRzKSAtIDEpOw0KPiA+ICsgICAgICAgICAgICAgICB1c2IzX3N1c3BlbmRlZF9w b3J0cyAmPSAoQklUKG51bV9wb3J0cykgLSAxKTsNCj4gPiArICAgICAgICAgICAgICAgZm9yIChp ID0gMDsgaSA8IG51bV9wb3J0czsgaSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg aWYgKHVzYjNfc3VzcGVuZGVkX3BvcnRzICYgQklUKGkpKSB7DQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwb3J0ID0gdXNiM19yaHViLT5wb3J0c1tpXTsNCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlYWRsKHBvcnQtPmFkZHIpOw0KPiA+ ICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoY2lfZGJnKHhoY2ksICJV U0IzOiBwb3J0c2NbJWldOiAweCUwNFhcbiIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaSwgc3RhdHVzKTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZiAoIShzdGF0dXMgJiBQT1JUX0NPTk5FQ1QpKQ0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2IzX3N1c3BlbmRlZF9wb3J0cyAm PSB+QklUKGkpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAg ICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgaWYgKHVzYjNfc3VzcGVuZGVkX3Bv cnRzKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVCVVNZOw0KPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZWJ1c3k7DQo+ID4gKyAgICAgICAgICAgICAgIH0N Cj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gK2VidXN5Og0KPiA+ICsgICAgICAgeGhjaV9kYmco eGhjaSwgIiVzOiBVU0IyOiAweCUwOFgsIFVTQjM6IDB4JTA4WCByZXQ6ICVpXG4iLA0KPiA+ICsg ICAgICAgICAgICAgICAgIF9fZnVuY19fLCB1c2IyX3N1c3BlbmRlZF9wb3J0cywNCj4gPiArICAg ICAgICAgICAgICAgICB1c2IzX3N1c3BlbmRlZF9wb3J0cywgcmV0KTsNCj4gPiArDQo+ID4gKyAg ICAgICByZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0KPiANCj4gVGhpcyBpcyBiYXNpY2FsbHkg Y291bnRpbmcgYWN0aXZlIHBvcnRzIGJ5IGRpcmVjdGx5IHJlYWRpbmcgcG9ydHNjIHJlZ2lzdGVy Pw0KWWVzLCANCj4gSSBleHBlY3QgdGhpcyBmdW5jdGlvbiBuZXZlciByZXR1cm4gLUVCVVNZICBp ZiB5b3UgYmFsYW5jZSBwbSB1c2FnZQ0KPiBjb3VudGVyIHdlbGwuDQo+IEFyZSB0aGVyZSBhbnkg c3BlY2lmaWMgcmVhc29ucyBvZiBkb2luZyB0aGlzIG1hbnVhbGx5Pw0KcG1fcnVudGltZV9zZXRf YXV0b3N1c3BlbmRfZGVsYXkoKSBpcyB1c2VkLCBtYXkgY2hlY2sgdGhlIHBvcnRzIHN0YXR1cw0K cGVyaW9kaWNhbGx5LiBJIHdpbGwgY2hlY2sgaXQuDQoNCklmIG5vIHNwdXJpb3VzIHdha2V1cCBp cnEsIGFwcGx5IHRoZSBmcmFtZXdvcmsgZnJvbSB3YWtlaXJxLmMgaXMgdGhlDQplYXNpZXN0IHdh eSB0byBzdXBwb3J0IHJ1bnRpbWUtc3VzcGVuZC4gaG9wZSB0aGF0IGZpbmQgb3V0IHRoZSByb290 DQpjYXVzZSBhbmQgaW1wcm92ZSB0aGUgSFcgZGVzaWduLiBJbiBmYWN0IHRoZSBFSU5UIHdheSBp cyBhIGRlcHJlY2F0ZWQNCmZlYXR1cmUgYW5kIG5vdCB1c2VkIGJlZm9yZS4NCg0KVGhhbmtzIGEg bG90Lg0KDQo+IA0KPiA+ICtzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHhoY2lfbXRrX3J1bnRp bWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpDQo+ID4gK3sNCj4gPiArICAgICAgIGJvb2wg d2FrZXVwID0gZGV2aWNlX21heV93YWtldXAoZGV2KTsNCj4gPiArICAgICAgIHN0cnVjdCB4aGNp X2hjZF9tdGsgICptdGsgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsNCj4gPiArICAgICAgIHN0cnVj dCB1c2JfaGNkICpoY2Q7DQo+ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7DQo+ID4g KyAgICAgICBpbnQgcmV0ID0gMDsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoIW10ay0+aGNkKQ0K PiA+ICsgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsNCj4gPiArDQo+ID4gKyAgICAg ICBoY2QgPSBtdGstPmhjZDsNCj4gPiArICAgICAgIHhoY2kgPSBoY2RfdG9feGhjaShoY2QpOw0K PiA+ICsgICAgICAgaWYgKCh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NUQVRFX1JFTU9WSU5HKSB8 fA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICh4aGNpLT54aGNfc3RhdGUgJiBYSENJX1NU QVRFX0hBTFRFRCkpIHsNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047DQo+ ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgbXRrLT5zZWFsX3N0YXR1cyA9IFNFQUxf QlVTWTsNCj4gPiArICAgICAgIHJldCA9IHhoY2lfbXRrX2J1c19zdGF0dXMoZGV2KTsNCj4gPiAr ICAgICAgIGlmICh3YWtldXAgJiYgIXJldCkgew0KPiA+ICsgICAgICAgICAgICAgICBtdGstPnNl YWxfc3RhdHVzID0gU0VBTF9TVVNQRU5ESU5HOw0KPiA+ICsgICAgICAgICAgICAgICB4aGNpX210 a19zdXNwZW5kKGRldik7DQo+ID4gKyAgICAgICAgICAgICAgIHhoY2lfbXRrX3NlYWxfd2FrZXVw X2VuYWJsZShtdGssIHRydWUpOw0KPiA+ICsgICAgICAgICAgICAgICBtdGstPnNlYWxfc3RhdHVz ID0gU0VBTF9TVVNQRU5ERUQ7DQo+ID4gKyAgICAgICAgICAgICAgIHhoY2lfZGJnKHhoY2ksICIl czogc2VhbHMgeEhDSSBjb250cm9sbGVyXG4iLCBfX2Z1bmNfXyk7DQo+ID4gKyAgICAgICB9DQo+ ID4gKw0KPiA+ICsgICAgICAgeGhjaV9kYmcoeGhjaSwgIiVzOiBzZWFscyB3YWtldXAgPSAlaSwg cmV0ID0gJWkhXG4iLA0KPiA+ICsgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3YWtldXAsIHJl dCk7DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuIHJldDsNCj4gPiArfQ0KPiA+ICsNCj4gPiAr c3RhdGljIGludCBfX21heWJlX3VudXNlZCB4aGNpX210a19ydW50aW1lX3Jlc3VtZShzdHJ1Y3Qg ZGV2aWNlICpkZXYpDQo+ID4gK3sNCj4gPiArICAgICAgIGJvb2wgd2FrZXVwID0gZGV2aWNlX21h eV93YWtldXAoZGV2KTsNCj4gPiArICAgICAgIHN0cnVjdCB4aGNpX2hjZF9tdGsgICptdGsgPSBk ZXZfZ2V0X2RydmRhdGEoZGV2KTsNCj4gPiArICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2Q7DQo+ ID4gKyAgICAgICBzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYg KCFtdGstPmhjZCkNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047DQo+ID4g Kw0KPiA+ICsgICAgICAgaGNkID0gbXRrLT5oY2Q7DQo+ID4gKyAgICAgICB4aGNpID0gaGNkX3Rv X3hoY2koaGNkKTsNCj4gPiArICAgICAgIGlmICgoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFU RV9SRU1PVklORykgfHwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAoeGhjaS0+eGhjX3N0 YXRlICYgWEhDSV9TVEFURV9IQUxURUQpKSB7DQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAt RVNIVVRET1dOOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIC8qDQo+ID4gKyAg ICAgICAgKiAgbGlzdCBjYXNlcyBieSBvbmUgZXh0cmEgaW50ZXJydXB0IG5hbWVkIHNlYWwgdG8g cHJvY2VzcyEhIQ0KPiA+ICsgICAgICAgICogIFdobyB0byBwcm9jZXNzIHRoZXNlIG1vZHVsZSBy ZWluaXRpbGl6YXRpb24gYWZ0ZXIgU1BNIHdha2V1cA0KPiA+ICsgICAgICAgICogIGNhc2UgMTog dXNiIHJlbW90ZSB3YWtldXAsIHRoZXJlZm9yZSB4SENJIG5lZWQgcmVpbml0aWxpemF0ZSBhbHNv Lg0KPiA+ICsgICAgICAgICogIGNhc2UgMjogb3RoZXItd2FrZXVwLXNvdXJjZSB3YWtldXAsIHRo ZXJlZm9yZSwgeEhDSSBuZWVkIHJlaW5pdA0KPiA+ICsgICAgICAgICogIGNhc2UgMzogdXNiIGNs aWVudCBkcml2ZXIgY2FuIGludm9rZSBpdCBpbiBydW50aW1lIG1lY2hhbmlzbQ0KPiA+ICsgICAg ICAgICogIGNhc2UgNDogdXNlciBhY3RpdmUNCj4gPiArICAgICAgICAqLw0KPiA+ICsgICAgICAg aWYgKHdha2V1cCkgew0KPiA+ICsgICAgICAgICAgICAgICB4aGNpX210a19zZWFsX3dha2V1cF9l bmFibGUobXRrLCBmYWxzZSk7DQo+ID4gKyAgICAgICAgICAgICAgIHhoY2lfbXRrX3Jlc3VtZShk ZXYpOw0KPiA+ICsgICAgICAgICAgICAgICB4aGNpX2RiZyh4aGNpLCAiJXM6IHVuc2VhbHMgeEhD SSBjb250cm9sbGVyXG4iLCBfX2Z1bmNfXyk7DQo+ID4gKyAgICAgICB9DQo+ID4gKyAgICAgICBt dGstPnNlYWxfc3RhdHVzID0gU0VBTF9SRVNVTUVEOw0KPiA+ICsNCj4gPiArICAgICAgIHhoY2lf ZGJnKHhoY2ksICIlczogdW5zZWFscyB3YWtldXAgPSAlaVxuIiwgX19mdW5jX18sIHdha2V1cCk7 DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRp YyBpbnQgX19tYXliZV91bnVzZWQgeGhjaV9tdGtfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2Ug KmRldikNCj4gPiArew0KPiA+ICsgICAgICAgaW50IHJldCA9IDA7DQo+ID4gKw0KPiA+ICsgICAg ICAgZGV2X2RiZyhkZXYsICIlczogeGhjaV9tdGtfcnVudGltZV9yZWFkeSAlaSIsDQo+ID4gKyAg ICAgICAgICAgICAgICBfX2Z1bmNfXywgeGhjaV9tdGtfcnVudGltZV9yZWFkeSk7DQo+ID4gKw0K PiA+ICsgICAgICAgaWYgKCF4aGNpX210a19ydW50aW1lX3JlYWR5KQ0KPiA+ICsgICAgICAgICAg ICAgICByZXQgPSAtRUFHQUlOOw0KPiA+ICsNCj4gPiArICAgICAgIHJldHVybiByZXQ7DQo+ID4g K30NCj4gPiArDQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB4aGNpX210a19w bV9vcHMgPSB7DQo+ID4gICAgICAgICBTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh4aGNpX210a19z dXNwZW5kLCB4aGNpX210a19yZXN1bWUpDQo+ID4gKyAgICAgICBTRVRfUlVOVElNRV9QTV9PUFMo eGhjaV9tdGtfcnVudGltZV9zdXNwZW5kLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg IHhoY2lfbXRrX3J1bnRpbWVfcmVzdW1lLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg IHhoY2lfbXRrX3J1bnRpbWVfaWRsZSkNCj4gPiAgfTsNCj4gPiAtI2RlZmluZSBERVZfUE1fT1BT IElTX0VOQUJMRUQoQ09ORklHX1BNKSA/ICZ4aGNpX210a19wbV9vcHMgOiBOVUxMDQo+ID4gKw0K PiA+ICsjZGVmaW5lIERFVl9QTV9PUFMgKElTX0VOQUJMRUQoQ09ORklHX1BNKSA/ICZ4aGNpX210 a19wbV9vcHMgOiBOVUxMKQ0KPiA+DQo+ID4gICNpZmRlZiBDT05GSUdfT0YNCj4gPiAgc3RhdGlj IGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXRrX3hoY2lfb2ZfbWF0Y2hbXSA9IHsNCj4gPiBA QCAtNjg2LDYgKzk2MCw3IEBAIE1PRFVMRV9BTElBUygicGxhdGZvcm06eGhjaS1tdGsiKTsNCj4g Pg0KPiA+ICBzdGF0aWMgaW50IF9faW5pdCB4aGNpX210a19pbml0KHZvaWQpDQo+ID4gIHsNCj4g PiArICAgICAgIHhoY2lfbXRrX3J1bnRpbWVfcmVhZHkgPSAwOw0KPiA+ICAgICAgICAgeGhjaV9p bml0X2RyaXZlcigmeGhjaV9tdGtfaGNfZHJpdmVyLCAmeGhjaV9tdGtfb3ZlcnJpZGVzKTsNCj4g PiAgICAgICAgIHJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm10a194aGNpX2RyaXZl cik7DQo+ID4gIH0NCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5o IGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5oDQo+ID4gaW5kZXggMzIzYjI4MTkzM2I5Li4x MDNkODNjZTZhM2UgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5o DQo+ID4gKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLW10ay5oDQo+ID4gQEAgLTEzMyw2ICsx MzMsMTQgQEAgc3RydWN0IG11M2NfaXBwY19yZWdzIHsNCj4gPiAgICAgICAgIF9fbGUzMiByZXNl cnZlZDNbMzNdOyAvKiAweDgwIH4gMHhmZiAqLw0KPiA+ICB9Ow0KPiA+DQo+ID4gK2VudW0geGhj aV9tdGtfc2VhbCB7DQo+ID4gKyAgICAgICBTRUFMX0JVU1kgPSAwLA0KPiA+ICsgICAgICAgU0VB TF9TVVNQRU5ESU5HLA0KPiA+ICsgICAgICAgU0VBTF9TVVNQRU5ERUQsDQo+ID4gKyAgICAgICBT RUFMX1JFU1VNSU5HLA0KPiA+ICsgICAgICAgU0VBTF9SRVNVTUVEDQo+ID4gK307DQo+ID4gKw0K PiA+ICBzdHJ1Y3QgeGhjaV9oY2RfbXRrIHsNCj4gPiAgICAgICAgIHN0cnVjdCBkZXZpY2UgKmRl djsNCj4gPiAgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2Q7DQo+ID4gQEAgLTE1OCw2ICsxNjYs MTIgQEAgc3RydWN0IHhoY2lfaGNkX210ayB7DQo+ID4gICAgICAgICBzdHJ1Y3QgcmVnbWFwICp1 d2s7DQo+ID4gICAgICAgICB1MzIgdXdrX3JlZ19iYXNlOw0KPiA+ICAgICAgICAgdTMyIHV3a192 ZXJzOw0KPiA+ICsNCj4gPiArICAgICAgIC8qIHVzYiBlaW50IHdha2V1cCBzb3VyY2UgKi8NCj4g PiArICAgICAgIGludCBzZWFsX2lycTsNCj4gPiArICAgICAgIGVudW0geGhjaV9tdGtfc2VhbCBz ZWFsX3N0YXR1czsNCj4gPiArICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgIHNlYWw7DQo+ID4g KyAgICAgICBjaGFyICAgc2VhbF9kZXNjclszMl07ICAvKiAic2VhbCIgKyBkcml2ZXIgKyBidXMg IyAqLw0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBpbmxpbmUgc3RydWN0IHhoY2lfaGNkX210 ayAqaGNkX3RvX210ayhzdHJ1Y3QgdXNiX2hjZCAqaGNkKQ0KPiA+IC0tDQo+ID4gMi4xOC4wDQo+ ID4NCg0K 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=-15.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, USER_AGENT_SANE_2 autolearn=ham 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 3ED8FC433DB for ; Tue, 5 Jan 2021 07:28:30 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CE4F42256F for ; Tue, 5 Jan 2021 07:28:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CE4F42256F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Date:To:From: Subject:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=rrewOcOBw5M1SOz50ibuJAV9Y1e13JJXAKaN912SD9g=; b=3TDT3Mt37T2nR4ZY2H7icd6rW QR+jSGGR7/CRQgnT5WFE6uzwjMuXloV0yKa261BKZGYzFp1v8C+B59f4aCVv5jOyi5iFyotUz8zfV B3FlJsKxecVLzW8SDh7ADM3WTIHJmE75braz3NCw9RGXPECYiq1drbUNHo3rUUzjbLCQJyIMEcZDm 32A/BLNd4oaKA6LtHjhG/UqMDC5TvZi/L5LPOMpU88e587nWRWs6ODVbJExtJ5vlQ121gS/ZQFpTI rBD3KqB3fCcvBBceHHS0VRpZlt1Ll2G1MjYAqMjr+pFHInlCW2KnAeiaXKJHPKJWUTQHsA2y82j6A XPjjJBNtA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kwglF-0000Jq-1W; Tue, 05 Jan 2021 07:28:09 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kwglC-0000IV-Ho for linux-mediatek@lists.infradead.org; Tue, 05 Jan 2021 07:28:08 +0000 X-UUID: b2661b3dc9564223a5e0b7bcb1393283-20210104 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=C1MgoqN9hzwMlKk8wIlBMJzdyW2My6gPGw6t6QrMglQ=; b=cJWD9bxabMPHeXjjw9NZ/rBG075ejwRcAo/SNe7oOjjf9+cuUUBx/ebLbDCedCRW2KnTG76K00nX0ZuuPpnMeT6UPnMwmNkP8whTH/XzMQMtnyC4giVNAjNcf8Wod+irXbiUAR9WQ/+o2PopskzMpcnLwWvdTnDBqJbkuVbMrTo=; X-UUID: b2661b3dc9564223a5e0b7bcb1393283-20210104 Received: from mtkcas66.mediatek.inc [(172.29.193.44)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 3184254; Mon, 04 Jan 2021 23:23:48 -0800 Received: from MTKMBS31N2.mediatek.inc (172.27.4.87) by MTKMBS62N2.mediatek.inc (172.29.193.42) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 4 Jan 2021 23:13:45 -0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by MTKMBS31N2.mediatek.inc (172.27.4.87) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 5 Jan 2021 15:13:42 +0800 Received: from [10.17.3.153] (10.17.3.153) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Tue, 5 Jan 2021 15:13:41 +0800 Message-ID: <1609830821.24856.26.camel@mhfsdcap03> Subject: Re: [RFC PATCH v3 4/5] usb: xhci-mtk: add support runtime pm From: Chunfeng Yun To: Ikjoon Jang Date: Tue, 5 Jan 2021 15:13:41 +0800 In-Reply-To: References: <1608629682-8535-1-git-send-email-chunfeng.yun@mediatek.com> <1608629682-8535-4-git-send-email-chunfeng.yun@mediatek.com> X-Mailer: Evolution 3.10.4-0ubuntu2 MIME-Version: 1.0 X-TM-SNTS-SMTP: AF622B8E7BC7E5D23CB01030AA6E6075776304E5B40B25307A910127801E36552000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210105_022806_749993_7F260B8B X-CRM114-Status: GOOD ( 37.50 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Zhanyong Wang , Zhanyong Wang , linux-usb@vger.kernel.org, open list , Tianping Fang , "moderated list:ARM/Mediatek SoC support" , CK Hu Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org Hi Ikjoon, I try to rebuild the code flow, and want to apply the framework from wakeirq.c On Tue, 2020-12-29 at 15:38 +0800, Ikjoon Jang wrote: > On Tue, Dec 22, 2020 at 5:35 PM Chunfeng Yun wrote: > > > > From: CK Hu > > > > add support runtime pm feature > > > > Signed-off-by: Zhanyong Wang > > Signed-off-by: Chunfeng Yun > > --- > > v3: > > 1. fix some issues > > 2. remove attribute files > > > > v2: fix error caused by request irq suggested by CK > > --- > > drivers/usb/host/xhci-mtk.c | 285 +++++++++++++++++++++++++++++++++++- > > drivers/usb/host/xhci-mtk.h | 14 ++ > > 2 files changed, 294 insertions(+), 5 deletions(-) > > mode change 100755 => 100644 drivers/usb/host/xhci-mtk.c > > > > diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c > > old mode 100755 > > new mode 100644 > > index 34bd3de090b1..c07d54acbcb7 > > --- a/drivers/usb/host/xhci-mtk.c > > +++ b/drivers/usb/host/xhci-mtk.c > > @@ -14,6 +14,7 @@ > > #include > > #include > > #include > > +#include > > #include > > #include > > #include > > @@ -77,6 +78,72 @@ enum ssusb_uwk_vers { > > SSUSB_UWK_V3, > > }; > > > > +int xhci_mtk_runtime_ready; > > + > > +static int xhci_mtk_runtime_resume(struct device *dev); > > + > > +static void xhci_mtk_seal_work(struct work_struct *work) > > +{ > > + struct xhci_hcd_mtk *mtk = > > + container_of(work, struct xhci_hcd_mtk, seal.work); > > + struct usb_hcd *hcd = mtk->hcd; > > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > > + > > + xhci_dbg(xhci, "spm unseals xHCI controller %i\n", mtk->seal_status); > > + if (mtk->seal_status == SEAL_SUSPENDED) { > > + mtk->seal_status = SEAL_RESUMING; > > + pm_runtime_mark_last_busy(mtk->dev); > > + pm_runtime_put_sync_autosuspend(mtk->dev); > > If I understand correctly, this function is for waking up the device > but this function calls put() only without get(). will use pm_request_resume(); > > > + } else { > > + /* > > + * FIXME: Sometimes seal_status will keep it on SEAL_RESUMING staus not to expect > > + * since pm_runtime_put_sync_autosuspend doesn't invoke runtime_resume of callback. > > + * and to survey why not to invoke runtime_resume callback named > > + * xhci_mtk_runtime_resume in time in short feature, Herely provide one solution > > + * that make sure seal_status to match h/w state machine,and MTK xHCI clocks > > + * on as soon as unseal event received. > > I guess actual resuming should be happened only from the 1st interrupt > (when in SEAL_SUSPENDED) > and following spurious interrupts can be just ignored. Yes > > > + */ > > + if (mtk->seal_status == SEAL_RESUMING) > > + xhci_mtk_runtime_resume(mtk->dev); > > xhci_mtk_runtime_resume() is defined as a runtime pm callback, > pm core will call that callback when pm usage counter reaches to zero. Yes > > > + else > > + xhci_warn(xhci, > > + "Ignore seal wakeup source disordered in xHCI controller\n"); > > + } > > +} > > + > > +static irqreturn_t xhci_mtk_seal_irq(int irq, void *data) > > +{ > > + struct xhci_hcd_mtk *mtk = data; > > + struct usb_hcd *hcd = mtk->hcd; > > + struct xhci_hcd *xhci = hcd_to_xhci(hcd); > > + > > + xhci_dbg(xhci, "seal irq ISR invoked\n"); > > + > > + schedule_delayed_work(&mtk->seal, 0); > > + > > + return IRQ_HANDLED; > > +} > > + > > +static void xhci_mtk_seal_wakeup_enable(struct xhci_hcd_mtk *mtk, bool enable) > > +{ > > + struct irq_desc *desc; > > + struct device *dev = mtk->dev; > > + > > + if (mtk && mtk->seal_irq) { > > + desc = irq_to_desc(mtk->seal_irq); > > + if (enable) { > > + desc->irq_data.chip->irq_ack(&desc->irq_data); > > + enable_irq(mtk->seal_irq); > > + dev_dbg(dev, "%s: enable_irq %i\n", > > + __func__, mtk->seal_irq); > > + } else { > > + disable_irq(mtk->seal_irq); > > + dev_dbg(dev, "%s: disable_irq %i\n", > > + __func__, mtk->seal_irq); > > + } > > + } > > +} > > + > > I think this is unnecessary if this driver can check the current state > and ignore the spurious irqs if spm sometimes triggers the wake-up irqs. It helps to reduce some irqs, there are many spurious interrupts, I think there is something wrong from the point of HW, will try to find the root cause. > > > static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk) > > { > > struct mu3c_ippc_regs __iomem *ippc = mtk->ippc_regs; > > @@ -347,7 +414,6 @@ static int usb_wakeup_of_property_parse(struct xhci_hcd_mtk *mtk, > > mtk->uwk_reg_base, mtk->uwk_vers); > > > > return PTR_ERR_OR_ZERO(mtk->uwk); > > - > > } > > > > static void usb_wakeup_set(struct xhci_hcd_mtk *mtk, bool enable) > > @@ -482,9 +548,11 @@ static int xhci_mtk_probe(struct platform_device *pdev) > > return ret; > > } > > > > + pm_runtime_set_active(dev); > > + pm_runtime_use_autosuspend(dev); > > + pm_runtime_set_autosuspend_delay(dev, > > + CONFIG_USB_AUTOSUSPEND_DELAY * 1000); > > pm_runtime_enable(dev); > > - pm_runtime_get_sync(dev); > > The only one left pm_runtime_get() is removed by here, > now this driver only calls pm_runtime_put(). will add it back, and forbid runtime by default > > > - device_enable_async_suspend(dev); > > > > ret = xhci_mtk_ldos_enable(mtk); > > if (ret) > > @@ -499,6 +567,14 @@ static int xhci_mtk_probe(struct platform_device *pdev) > > ret = irq; > > goto disable_clk; > > } > > + dev_dbg(dev, "irq %i\n", irq); > > + > > + mtk->seal_irq = platform_get_irq_optional(pdev, 1); > > + if (mtk->seal_irq < 0) { > > + ret = mtk->seal_irq; > > + goto disable_clk; > > + } > > + dev_dbg(dev, "seal_irq %i\n", mtk->seal_irq); > > > > hcd = usb_create_hcd(driver, dev, dev_name(dev)); > > if (!hcd) { > > @@ -565,6 +641,27 @@ static int xhci_mtk_probe(struct platform_device *pdev) > > if (ret) > > goto dealloc_usb2_hcd; > > > > + INIT_DELAYED_WORK(&mtk->seal, xhci_mtk_seal_work); > > + snprintf(mtk->seal_descr, sizeof(mtk->seal_descr), "seal%s:usb%d", > > + hcd->driver->description, hcd->self.busnum); > > + ret = devm_request_irq(dev, mtk->seal_irq, &xhci_mtk_seal_irq, > > + IRQF_TRIGGER_FALLING, mtk->seal_descr, mtk); > > + if (ret != 0) { > > + dev_err(dev, "seal request interrupt %d failed\n", > > + mtk->seal_irq); > > + goto dealloc_usb2_hcd; > > + } > > + xhci_mtk_seal_wakeup_enable(mtk, false); > > + > > + device_enable_async_suspend(dev); > > + xhci_mtk_runtime_ready = 1; > > + > > + pm_runtime_mark_last_busy(dev); > > + pm_runtime_put_autosuspend(dev); > > I expect the usage count will be -1 by here in probe. will change it > > > + > > + dev_dbg(dev, "%s: xhci_mtk_runtime_ready %i", > > + __func__, xhci_mtk_runtime_ready); > > + > > return 0; > > > > dealloc_usb2_hcd: > > @@ -587,7 +684,7 @@ static int xhci_mtk_probe(struct platform_device *pdev) > > xhci_mtk_ldos_disable(mtk); > > > > disable_pm: > > - pm_runtime_put_sync(dev); > > + pm_runtime_put_sync_autosuspend(dev); > > pm_runtime_disable(dev); > > return ret; > > } > > @@ -602,6 +699,7 @@ static int xhci_mtk_remove(struct platform_device *dev) > > pm_runtime_put_noidle(&dev->dev); > > pm_runtime_disable(&dev->dev); > > > > + xhci_mtk_runtime_ready = 0; > > usb_remove_hcd(shared_hcd); > > xhci->shared_hcd = NULL; > > device_init_wakeup(&dev->dev, false); > > @@ -638,6 +736,7 @@ static int __maybe_unused xhci_mtk_suspend(struct device *dev) > > xhci_mtk_host_disable(mtk); > > xhci_mtk_clks_disable(mtk); > > usb_wakeup_set(mtk, true); > > + > > return 0; > > } > > > > @@ -659,10 +758,185 @@ static int __maybe_unused xhci_mtk_resume(struct device *dev) > > return 0; > > } > > > > +static int __maybe_unused xhci_mtk_bus_status(struct device *dev) > > +{ > > + struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev); > > + struct usb_hcd *hcd; > > + struct xhci_hcd *xhci; > > + struct xhci_hub *usb2_rhub; > > + struct xhci_hub *usb3_rhub; > > + struct xhci_bus_state *bus_state; > > + struct xhci_port *port; > > + u32 usb2_suspended_ports = -1; > > + u32 usb3_suspended_ports = -1; > > + u16 status; > > + int num_ports; > > + int ret = 0; > > + int i; > > + > > + if (!mtk->hcd) > > + return -ESHUTDOWN; > > + > > + hcd = mtk->hcd; > > + xhci = hcd_to_xhci(hcd); > > + if ((xhci->xhc_state & XHCI_STATE_REMOVING) || > > + (xhci->xhc_state & XHCI_STATE_HALTED)) { > > + return -ESHUTDOWN; > > + } > > This is duplicated from xhci_mtk_runtime_suspend() Yes, will remove it and rebuild the code > > > + > > + usb2_rhub = &xhci->usb2_rhub; > > + if (usb2_rhub) { > > + bus_state = &usb2_rhub->bus_state; > > + num_ports = usb2_rhub->num_ports; > > + usb2_suspended_ports = bus_state->suspended_ports; > > + usb2_suspended_ports ^= (BIT(num_ports) - 1); > > + usb2_suspended_ports &= (BIT(num_ports) - 1); > > + for (i = 0; i < num_ports; i++) { > > + if (usb2_suspended_ports & (1UL << i)) { > > + port = usb2_rhub->ports[i]; > > + status = readl(port->addr); > > + > > + xhci_dbg(xhci, > > + "USB20: portsc[%i]: 0x%04X\n", > > + i, status); > > + > > + if (!(status & PORT_CONNECT)) > > + usb2_suspended_ports &= ~(1UL << i); > > + } > > + } > > + > > + if (usb2_suspended_ports) { > > + ret = -EBUSY; > > + goto ebusy; > > + } > > + } > > + > > + usb3_rhub = &xhci->usb3_rhub; > > + if (usb3_rhub) { > > + bus_state = &usb3_rhub->bus_state; > > + num_ports = usb3_rhub->num_ports; > > + usb3_suspended_ports = bus_state->suspended_ports; > > + usb3_suspended_ports ^= (BIT(num_ports) - 1); > > + usb3_suspended_ports &= (BIT(num_ports) - 1); > > + for (i = 0; i < num_ports; i++) { > > + if (usb3_suspended_ports & BIT(i)) { > > + port = usb3_rhub->ports[i]; > > + status = readl(port->addr); > > + > > + xhci_dbg(xhci, "USB3: portsc[%i]: 0x%04X\n", > > + i, status); > > + > > + if (!(status & PORT_CONNECT)) > > + usb3_suspended_ports &= ~BIT(i); > > + } > > + } > > + > > + if (usb3_suspended_ports) { > > + ret = -EBUSY; > > + goto ebusy; > > + } > > + } > > + > > +ebusy: > > + xhci_dbg(xhci, "%s: USB2: 0x%08X, USB3: 0x%08X ret: %i\n", > > + __func__, usb2_suspended_ports, > > + usb3_suspended_ports, ret); > > + > > + return ret; > > +} > > + > > This is basically counting active ports by directly reading portsc register? Yes, > I expect this function never return -EBUSY if you balance pm usage > counter well. > Are there any specific reasons of doing this manually? pm_runtime_set_autosuspend_delay() is used, may check the ports status periodically. I will check it. If no spurious wakeup irq, apply the framework from wakeirq.c is the easiest way to support runtime-suspend. hope that find out the root cause and improve the HW design. In fact the EINT way is a deprecated feature and not used before. Thanks a lot. > > > +static int __maybe_unused xhci_mtk_runtime_suspend(struct device *dev) > > +{ > > + bool wakeup = device_may_wakeup(dev); > > + struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev); > > + struct usb_hcd *hcd; > > + struct xhci_hcd *xhci; > > + int ret = 0; > > + > > + if (!mtk->hcd) > > + return -ESHUTDOWN; > > + > > + hcd = mtk->hcd; > > + xhci = hcd_to_xhci(hcd); > > + if ((xhci->xhc_state & XHCI_STATE_REMOVING) || > > + (xhci->xhc_state & XHCI_STATE_HALTED)) { > > + return -ESHUTDOWN; > > + } > > + > > + mtk->seal_status = SEAL_BUSY; > > + ret = xhci_mtk_bus_status(dev); > > + if (wakeup && !ret) { > > + mtk->seal_status = SEAL_SUSPENDING; > > + xhci_mtk_suspend(dev); > > + xhci_mtk_seal_wakeup_enable(mtk, true); > > + mtk->seal_status = SEAL_SUSPENDED; > > + xhci_dbg(xhci, "%s: seals xHCI controller\n", __func__); > > + } > > + > > + xhci_dbg(xhci, "%s: seals wakeup = %i, ret = %i!\n", > > + __func__, wakeup, ret); > > + > > + return ret; > > +} > > + > > +static int __maybe_unused xhci_mtk_runtime_resume(struct device *dev) > > +{ > > + bool wakeup = device_may_wakeup(dev); > > + struct xhci_hcd_mtk *mtk = dev_get_drvdata(dev); > > + struct usb_hcd *hcd; > > + struct xhci_hcd *xhci; > > + > > + if (!mtk->hcd) > > + return -ESHUTDOWN; > > + > > + hcd = mtk->hcd; > > + xhci = hcd_to_xhci(hcd); > > + if ((xhci->xhc_state & XHCI_STATE_REMOVING) || > > + (xhci->xhc_state & XHCI_STATE_HALTED)) { > > + return -ESHUTDOWN; > > + } > > + > > + /* > > + * list cases by one extra interrupt named seal to process!!! > > + * Who to process these module reinitilization after SPM wakeup > > + * case 1: usb remote wakeup, therefore xHCI need reinitilizate also. > > + * case 2: other-wakeup-source wakeup, therefore, xHCI need reinit > > + * case 3: usb client driver can invoke it in runtime mechanism > > + * case 4: user active > > + */ > > + if (wakeup) { > > + xhci_mtk_seal_wakeup_enable(mtk, false); > > + xhci_mtk_resume(dev); > > + xhci_dbg(xhci, "%s: unseals xHCI controller\n", __func__); > > + } > > + mtk->seal_status = SEAL_RESUMED; > > + > > + xhci_dbg(xhci, "%s: unseals wakeup = %i\n", __func__, wakeup); > > + > > + return 0; > > +} > > + > > +static int __maybe_unused xhci_mtk_runtime_idle(struct device *dev) > > +{ > > + int ret = 0; > > + > > + dev_dbg(dev, "%s: xhci_mtk_runtime_ready %i", > > + __func__, xhci_mtk_runtime_ready); > > + > > + if (!xhci_mtk_runtime_ready) > > + ret = -EAGAIN; > > + > > + return ret; > > +} > > + > > static const struct dev_pm_ops xhci_mtk_pm_ops = { > > SET_SYSTEM_SLEEP_PM_OPS(xhci_mtk_suspend, xhci_mtk_resume) > > + SET_RUNTIME_PM_OPS(xhci_mtk_runtime_suspend, > > + xhci_mtk_runtime_resume, > > + xhci_mtk_runtime_idle) > > }; > > -#define DEV_PM_OPS IS_ENABLED(CONFIG_PM) ? &xhci_mtk_pm_ops : NULL > > + > > +#define DEV_PM_OPS (IS_ENABLED(CONFIG_PM) ? &xhci_mtk_pm_ops : NULL) > > > > #ifdef CONFIG_OF > > static const struct of_device_id mtk_xhci_of_match[] = { > > @@ -686,6 +960,7 @@ MODULE_ALIAS("platform:xhci-mtk"); > > > > static int __init xhci_mtk_init(void) > > { > > + xhci_mtk_runtime_ready = 0; > > xhci_init_driver(&xhci_mtk_hc_driver, &xhci_mtk_overrides); > > return platform_driver_register(&mtk_xhci_driver); > > } > > diff --git a/drivers/usb/host/xhci-mtk.h b/drivers/usb/host/xhci-mtk.h > > index 323b281933b9..103d83ce6a3e 100644 > > --- a/drivers/usb/host/xhci-mtk.h > > +++ b/drivers/usb/host/xhci-mtk.h > > @@ -133,6 +133,14 @@ struct mu3c_ippc_regs { > > __le32 reserved3[33]; /* 0x80 ~ 0xff */ > > }; > > > > +enum xhci_mtk_seal { > > + SEAL_BUSY = 0, > > + SEAL_SUSPENDING, > > + SEAL_SUSPENDED, > > + SEAL_RESUMING, > > + SEAL_RESUMED > > +}; > > + > > struct xhci_hcd_mtk { > > struct device *dev; > > struct usb_hcd *hcd; > > @@ -158,6 +166,12 @@ struct xhci_hcd_mtk { > > struct regmap *uwk; > > u32 uwk_reg_base; > > u32 uwk_vers; > > + > > + /* usb eint wakeup source */ > > + int seal_irq; > > + enum xhci_mtk_seal seal_status; > > + struct delayed_work seal; > > + char seal_descr[32]; /* "seal" + driver + bus # */ > > }; > > > > static inline struct xhci_hcd_mtk *hcd_to_mtk(struct usb_hcd *hcd) > > -- > > 2.18.0 > > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek