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: [v5,6/6] usb: musb: Add support for MediaTek musb controller From: min.guo@mediatek.com Message-Id: <1550561795-31132-7-git-send-email-min.guo@mediatek.com> Date: Tue, 19 Feb 2019 15:36:35 +0800 To: Bin Liu , Rob Herring Cc: Greg Kroah-Hartman , Mark Rutland , Matthias Brugger , Alan Stern , chunfeng.yun@mediatek.com, linux-usb@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, tony@atomide.com, hdegoede@redhat.com, Min Guo , Yonglong Wu List-ID: RnJvbTogTWluIEd1byA8bWluLmd1b0BtZWRpYXRlay5jb20+CgpUaGlzIGFkZHMgc3VwcG9ydCBm b3IgTWVkaWFUZWsgbXVzYiBjb250cm9sbGVyIGluCmhvc3QsIHBlcmlwaGVyYWwgYW5kIG90ZyBt b2RlLgpUaGVyZSBhcmUgc29tZSBxdWlyayBvZiBNZWRpYVRlayBtdXNiIGNvbnRyb2xsZXIsIHN1 Y2ggYXM6CiAtVzFDIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXJzCiAtUHJpdmF0ZSBkYXRhIHRv Z2dsZSByZWdpc3RlcnMKIC1ObyBkZWRpY2F0ZWQgRE1BIGludGVycnVwdCBsaW5lCgpTaWduZWQt b2ZmLWJ5OiBNaW4gR3VvIDxtaW4uZ3VvQG1lZGlhdGVrLmNvbT4KU2lnbmVkLW9mZi1ieTogWW9u Z2xvbmcgV3UgPHlvbmdsb25nLnd1QG1lZGlhdGVrLmNvbT4KLS0tCmNoYW5nZXMgaW4gdjU6CjEu IFJlcGxhY2UgbXVzYl9yZWFkYigpIHdpdGggbXVzYl9jbGVhcmIoKSB0byBjbGVhciBjb21tb24v dHgvcnggcGVuZGluZyBpbnRlcnJ1cHRzCjIuIE1ha2UgbXVzYl9jbGVhcmIvdygpIHJldHVybiB0 aGUgdmFsdWUgb2YgbXVzYl9yZWFkYi93KCkKMy4gQWRkIGRyaXZlciB0byBnZXQgY2hpbGQgbm9k ZXMgb2YgdXNiIGNvbm5lY3RvciBhbmQgZXh0Y29uIGRldmljZQoKY2hhbmdlcyBpbiB2NDoKMS4g bm8gY2hhbmdlcwoKY2hhbmdlcyBpbiB2MzoKc3VnZ2VzdGVkIGJ5IEJpbjoKMS4gUmVtb3ZlICd1 OC91MTYgZGF0YScgcGFyYW1ldGVyIGluIGNsZWFyYi93KCkgaG9va3MKMi4gUmVwbGFjZSBtdXNi X3JlYWRiL3coKSB3aXRoIG11c2JfY2xlYXJiL3coKSB0byBjbGVhciBpbnRlcnJ1cHRzIHN0YXR1 cwoKY2hhbmdlcyBpbiB2MjoKc3VnZ2VzdGVkIGJ5IEJpbjoKMS4gQWRkIHN1bW1hcml6ZSBvZiBN ZWRpYVRlayBtdXNiIGNvbnRyb2xsZXIgZGlmZmVyZW5jZXMgaW4gdGhlIGNvbW1pdCBsb2cKMi4g QWRkICJ8fCBDT01QSUxFX1RFU1QiIGluIEtjb25maWcKMy4gTW92ZSBNZWRpYVRlaydzIHByaXZh dGUgdG9nZ2xlIHJlZ2lzdGVycyBmcm9tIG11c2JfcmVncy5oIHRvIG1lZGlhdGVrLmMKNC4gUmVw bGFjZSBtdXNiX3JlYWRsKCkgd2l0aCBtdXNiX3JlYWR3KCkgdG8gcmVhZCAxNmJpdCB0b2dnbGUg cmVnaXN0ZXIKLS0tCiBkcml2ZXJzL3VzYi9tdXNiL0tjb25maWcgICAgfCAgIDggKy0KIGRyaXZl cnMvdXNiL211c2IvTWFrZWZpbGUgICB8ICAgMSArCiBkcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVr LmMgfCA2MjkgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMg ZmlsZXMgY2hhbmdlZCwgNjM3IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBt b2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMKCmRpZmYgLS1naXQgYS9kcml2 ZXJzL3VzYi9tdXNiL0tjb25maWcgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKaW5kZXggYWQw ODg5NS4uYjcyYjdjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCisrKyBi L2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwpAQCAtMTE1LDYgKzExNSwxMiBAQCBjb25maWcgVVNC X01VU0JfSlo0NzQwCiAJZGVwZW5kcyBvbiBVU0JfTVVTQl9HQURHRVQKIAlkZXBlbmRzIG9uIFVT Ql9PVEdfQkxBQ0tMSVNUX0hVQgogCitjb25maWcgVVNCX01VU0JfTUVESUFURUsKKwl0cmlzdGF0 ZSAiTWVkaWFUZWsgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCBDT01Q SUxFX1RFU1QKKwlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYKKwlkZXBlbmRzIG9uIEdFTkVSSUNf UEhZCisKIGNvbmZpZyBVU0JfTVVTQl9BTTMzNVhfQ0hJTEQKIAl0cmlzdGF0ZQogCkBAIC0xNDEs NyArMTQ3LDcgQEAgY29uZmlnIFVTQl9VWDUwMF9ETUEKIAogY29uZmlnIFVTQl9JTlZFTlRSQV9E TUEKIAlib29sICdJbnZlbnRyYScKLQlkZXBlbmRzIG9uIFVTQl9NVVNCX09NQVAyUExVUworCWRl cGVuZHMgb24gVVNCX01VU0JfT01BUDJQTFVTIHx8IFVTQl9NVVNCX01FRElBVEVLCiAJaGVscAog CSAgRW5hYmxlIERNQSB0cmFuc2ZlcnMgdXNpbmcgTWVudG9yJ3MgZW5naW5lLgogCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3VzYi9tdXNiL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbXVzYi9NYWtlZmls ZQppbmRleCAzYTg4Yzc5Li42M2Q4MmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL01h a2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL211c2IvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAg b2JqLSQoQ09ORklHX1VTQl9NVVNCX0RBOFhYKQkJCSs9IGRhOHh4Lm8KIG9iai0kKENPTkZJR19V U0JfTVVTQl9VWDUwMCkJCQkrPSB1eDUwMC5vCiBvYmotJChDT05GSUdfVVNCX01VU0JfSlo0NzQw KQkJCSs9IGp6NDc0MC5vCiBvYmotJChDT05GSUdfVVNCX01VU0JfU1VOWEkpCQkJKz0gc3VueGku bworb2JqLSQoQ09ORklHX1VTQl9NVVNCX01FRElBVEVLKSAgICAgIAkJKz0gbWVkaWF0ZWsubwog CiAKIG9iai0kKENPTkZJR19VU0JfTVVTQl9BTTMzNVhfQ0hJTEQpCQkrPSBtdXNiX2FtMzM1eC5v CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL21lZGlhdGVrLmMgYi9kcml2ZXJzL3VzYi9t dXNiL21lZGlhdGVrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2YjQ1 MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbWVkaWF0ZWsuYwpAQCAtMCww ICsxLDYyOSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBD b3B5cmlnaHQgKEMpIDIwMTggTWVkaWFUZWsgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqICBNaW4g R3VvIDxtaW4uZ3VvQG1lZGlhdGVrLmNvbT4KKyAqICBZb25nbG9uZyBXdSA8eW9uZ2xvbmcud3VA bWVkaWF0ZWsuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxs aW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JfcGh5X2dl bmVyaWMuaD4KKyNpbmNsdWRlICJtdXNiX2NvcmUuaCIKKyNpbmNsdWRlICJtdXNiX2RtYS5oIgor CisjZGVmaW5lIFVTQl9MMUlOVFMJMHgwMGEwCisjZGVmaW5lIFVTQl9MMUlOVE0JMHgwMGE0Cisj ZGVmaW5lIE1US19NVVNCX1RYRlVOQ0FERFIJMHgwNDgwCisKKy8qIE1lZGlhVGVrIGNvbnRyb2xs ZXIgdG9nZ2xlIGVuYWJsZSBhbmQgc3RhdHVzIHJlZyAqLworI2RlZmluZSBNVVNCX1JYVE9HCQkw eDgwCisjZGVmaW5lIE1VU0JfUlhUT0dFTgkJMHg4MgorI2RlZmluZSBNVVNCX1RYVE9HCQkweDg0 CisjZGVmaW5lIE1VU0JfVFhUT0dFTgkJMHg4NgorCisjZGVmaW5lIFRYX0lOVF9TVEFUVVMJCUJJ VCgwKQorI2RlZmluZSBSWF9JTlRfU1RBVFVTCQlCSVQoMSkKKyNkZWZpbmUgVVNCQ09NX0lOVF9T VEFUVVMJCUJJVCgyKQorI2RlZmluZSBETUFfSU5UX1NUQVRVUwkJQklUKDMpCisKKyNkZWZpbmUg RE1BX0lOVFJfU1RBVFVTX01TSwkJR0VOTUFTSyg3LCAwKQorI2RlZmluZSBETUFfSU5UUl9VTk1B U0tfU0VUX01TSwlHRU5NQVNLKDMxLCAyNCkKKworZW51bSBtdGtfdmJ1c19pZF9zdGF0ZSB7CisJ TVRLX0lEX0ZMT0FUID0gMSwKKwlNVEtfSURfR1JPVU5ELAorCU1US19WQlVTX09GRiwKKwlNVEtf VkJVU19WQUxJRCwKK307CisKK3N0cnVjdCBtdGtfZ2x1ZSB7CisJc3RydWN0IGRldmljZSAqZGV2 OworCXN0cnVjdCBtdXNiICptdXNiOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm11c2JfcGRl djsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICp1c2JfcGh5OworCXN0cnVjdCBwaHkgKnBoeTsK KwlzdHJ1Y3QgdXNiX3BoeSAqeGNlaXY7CisJZW51bSBwaHlfbW9kZSBwaHlfbW9kZTsKKwlzdHJ1 Y3QgY2xrICptYWluOworCXN0cnVjdCBjbGsgKm1jdTsKKwlzdHJ1Y3QgY2xrICp1bml2cGxsOwor CXN0cnVjdCByZWd1bGF0b3IgKnZidXM7CisJc3RydWN0IGV4dGNvbl9kZXYgKmVkZXY7CisJc3Ry dWN0IG5vdGlmaWVyX2Jsb2NrIHZidXNfbmI7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGlkX25i OworfTsKKworc3RhdGljIGludCBtdGtfbXVzYl9jbGtzX2dldChzdHJ1Y3QgbXRrX2dsdWUgKmds dWUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZ2x1ZS0+ZGV2OworCisJZ2x1ZS0+bWFpbiA9 IGRldm1fY2xrX2dldChkZXYsICJtYWluIik7CisJaWYgKElTX0VSUihnbHVlLT5tYWluKSkgewor CQlkZXZfZXJyKGRldiwgImZhaWwgdG8gZ2V0IG1haW4gY2xvY2tcbiIpOworCQlyZXR1cm4gUFRS X0VSUihnbHVlLT5tYWluKTsKKwl9CisKKwlnbHVlLT5tY3UgPSBkZXZtX2Nsa19nZXQoZGV2LCAi bWN1Iik7CisJaWYgKElTX0VSUihnbHVlLT5tY3UpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbCB0 byBnZXQgbWN1IGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ2x1ZS0+bWN1KTsKKwl9CisK KwlnbHVlLT51bml2cGxsID0gZGV2bV9jbGtfZ2V0KGRldiwgInVuaXZwbGwiKTsKKwlpZiAoSVNf RVJSKGdsdWUtPnVuaXZwbGwpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbCB0byBnZXQgdW5pdnBs bCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKGdsdWUtPnVuaXZwbGwpOworCX0KKworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19tdXNiX2Nsa3NfZW5hYmxlKHN0cnVjdCBtdGtf Z2x1ZSAqZ2x1ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGds dWUtPm1haW4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJmYWlsZWQgdG8g ZW5hYmxlIG1haW4gY2xvY2tcbiIpOworCQlnb3RvIGVycl9tYWluX2NsazsKKwl9CisKKwlyZXQg PSBjbGtfcHJlcGFyZV9lbmFibGUoZ2x1ZS0+bWN1KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIo Z2x1ZS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBtY3UgY2xvY2tcbiIpOworCQlnb3RvIGVycl9t Y3VfY2xrOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShnbHVlLT51bml2cGxsKTsK KwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB1bml2 cGxsIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfdW5pdnBsbF9jbGs7CisJfQorCisJcmV0dXJuIDA7 CisKK2Vycl91bml2cGxsX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+bWN1KTsK K2Vycl9tY3VfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShnbHVlLT5tYWluKTsKK2Vycl9t YWluX2NsazoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtdGtfbXVzYl9jbGtzX2Rp c2FibGUoc3RydWN0IG10a19nbHVlICpnbHVlKQoreworCWNsa19kaXNhYmxlX3VucHJlcGFyZShn bHVlLT51bml2cGxsKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+bWN1KTsKKwljbGtf ZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+bWFpbik7Cit9CisKK3N0YXRpYyB2b2lkIG10a19tdXNi X3NldF92YnVzKHN0cnVjdCBtdXNiICptdXNiLCBpbnQgaXNfb24pCit7CisJc3RydWN0IGRldmlj ZSAqZGV2ID0gbXVzYi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgbXRrX2dsdWUgKmdsdWUgPSBkZXZf Z2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOworCWludCByZXQ7CisKKwkvKiB2YnVzIGlzIG9wdGlv bmFsICovCisJaWYgKCFnbHVlLT52YnVzKQorCQlyZXR1cm47CisKKwlkZXZfZGJnKG11c2ItPmNv bnRyb2xsZXIsICIlcywgaXNfb249JWRcclxuIiwgX19mdW5jX18sIGlzX29uKTsKKwlpZiAoaXNf b24pIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShnbHVlLT52YnVzKTsKKwkJaWYgKHJldCkg eworCQkJZGV2X2VycihnbHVlLT5kZXYsICJmYWlsIHRvIGVuYWJsZSB2YnVzIHJlZ3VsYXRvclxu Iik7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlyZWd1bGF0b3JfZGlzYWJsZShnbHVl LT52YnVzKTsKKwl9Cit9CisKKy8qCisgKiBzd2l0Y2ggdG8gaG9zdDogLT4gTVRLX1ZCVVNfT0ZG IC0tPiBNVEtfSURfR1JPVU5ECisgKiBzd2l0Y2ggdG8gZGV2aWNlOiAtPiBNVEtfSURfRkxPQVQg LS0+IE1US19WQlVTX1ZBTElECisgKi8KK3N0YXRpYyB2b2lkIG10a19tdXNiX3NldF9tYWlsYm94 KHN0cnVjdCBtdGtfZ2x1ZSAqZ2x1ZSwKKwkJCQkgZW51bSBtdGtfdmJ1c19pZF9zdGF0ZSBzdGF0 dXMpCit7CisJc3RydWN0IG11c2IgKm11c2IgPSBnbHVlLT5tdXNiOworCXU4IGRldmN0bCA9IDA7 CisKKwlkZXZfZGJnKGdsdWUtPmRldiwgIm1haWxib3ggc3RhdGUoJWQpXG4iLCBzdGF0dXMpOwor CXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSBNVEtfSURfR1JPVU5EOgorCQlwaHlfcG93ZXJfb24o Z2x1ZS0+cGh5KTsKKwkJZGV2Y3RsID0gcmVhZGIobXVzYi0+bXJlZ3MgKyBNVVNCX0RFVkNUTCk7 CisJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WUklTRTsKKwkJ bXRrX211c2Jfc2V0X3ZidXMobXVzYiwgMSk7CisJCWdsdWUtPnBoeV9tb2RlID0gUEhZX01PREVf VVNCX0hPU1Q7CisJCXBoeV9zZXRfbW9kZShnbHVlLT5waHksIGdsdWUtPnBoeV9tb2RlKTsKKwkJ ZGV2Y3RsIHw9IE1VU0JfREVWQ1RMX1NFU1NJT047CisJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdz LCBNVVNCX0RFVkNUTCwgZGV2Y3RsKTsKKwkJTVVTQl9IU1RfTU9ERShtdXNiKTsKKwkJYnJlYWs7 CisJLyoKKwkgKiBNVEtfSURfRkxPQVQgcHJvY2VzcyBpcyB0aGUgc2FtZSBhcyBNVEtfVkJVU19W QUxJRAorCSAqIGV4Y2VwdCB0aGF0IHR1cm4gb2ZmIFZCVVMKKwkgKi8KKwljYXNlIE1US19JRF9G TE9BVDoKKwkJbXRrX211c2Jfc2V0X3ZidXMobXVzYiwgMCk7CisJCS8qIGZhbGwgdGhyb3VnaCAq LworCWNhc2UgTVRLX1ZCVVNfT0ZGOgorCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9IE9UR19T VEFURV9CX0lETEU7CisJCWRldmN0bCAmPSB+TVVTQl9ERVZDVExfU0VTU0lPTjsKKwkJbXVzYl93 cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMLCBkZXZjdGwpOworCQlwaHlfcG93ZXJfb2Zm KGdsdWUtPnBoeSk7CisJCWJyZWFrOworCWNhc2UgTVRLX1ZCVVNfVkFMSUQ6CisJCXBoeV9wb3dl cl9vbihnbHVlLT5waHkpOworCQlnbHVlLT5waHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9ERVZJQ0U7 CisJCXBoeV9zZXRfbW9kZShnbHVlLT5waHksIGdsdWUtPnBoeV9tb2RlKTsKKwkJTVVTQl9ERVZf TU9ERShtdXNiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihnbHVlLT5kZXYsICJp bnZhbGlkIHN0YXRlXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXRrX211c2JfaWRfbm90aWZp ZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50LCB2 b2lkICpwdHIpCit7CisJc3RydWN0IG10a19nbHVlICpnbHVlID0gY29udGFpbmVyX29mKG5iLCBz dHJ1Y3QgbXRrX2dsdWUsIGlkX25iKTsKKworCWlmIChldmVudCkKKwkJbXRrX211c2Jfc2V0X21h aWxib3goZ2x1ZSwgTVRLX0lEX0dST1VORCk7CisJZWxzZQorCQltdGtfbXVzYl9zZXRfbWFpbGJv eChnbHVlLCBNVEtfSURfRkxPQVQpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0 aWMgaW50IG10a19tdXNiX3ZidXNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwK KwkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbXRrX2ds dWUgKmdsdWUgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBtdGtfZ2x1ZSwgdmJ1c19uYik7CisK KwlpZiAoZXZlbnQpCisJCW10a19tdXNiX3NldF9tYWlsYm94KGdsdWUsIE1US19WQlVTX1ZBTElE KTsKKwllbHNlCisJCW10a19tdXNiX3NldF9tYWlsYm94KGdsdWUsIE1US19WQlVTX09GRik7CisK KwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyB2b2lkIG10a19vdGdfc3dpdGNoX2lu aXQoc3RydWN0IG10a19nbHVlICpnbHVlKQoreworCWludCByZXQ7CisKKwkvKiBleHRjb24gaXMg b3B0aW9uYWwgKi8KKwlpZiAoIWdsdWUtPmVkZXYpCisJCXJldHVybjsKKworCWdsdWUtPnZidXNf bmIubm90aWZpZXJfY2FsbCA9IG10a19tdXNiX3ZidXNfbm90aWZpZXI7CisJcmV0ID0gZGV2bV9l eHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoZ2x1ZS0+ZGV2LCBnbHVlLT5lZGV2LCBFWFRDT05fVVNC LAorCQkJCQkgICAgJmdsdWUtPnZidXNfbmIpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGds dWUtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBub3RpZmllciBmb3IgVVNCXG4iKTsKKworCWds dWUtPmlkX25iLm5vdGlmaWVyX2NhbGwgPSBtdGtfbXVzYl9pZF9ub3RpZmllcjsKKwlyZXQgPSBk ZXZtX2V4dGNvbl9yZWdpc3Rlcl9ub3RpZmllcihnbHVlLT5kZXYsIGdsdWUtPmVkZXYsCisJCQkJ CSAgICBFWFRDT05fVVNCX0hPU1QsICZnbHVlLT5pZF9uYik7CisJaWYgKHJldCA8IDApCisJCWRl dl9lcnIoZ2x1ZS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG5vdGlmaWVyIGZvciBVU0ItSE9T VFxuIik7CisKKwlkZXZfZGJnKGdsdWUtPmRldiwgIkVYVENPTl9VU0I6ICVkLCBFWFRDT05fVVNC X0hPU1Q6ICVkXG4iLAorCQlleHRjb25fZ2V0X3N0YXRlKGdsdWUtPmVkZXYsIEVYVENPTl9VU0Ip LAorCQlleHRjb25fZ2V0X3N0YXRlKGdsdWUtPmVkZXYsIEVYVENPTl9VU0JfSE9TVCkpOworCisJ LyogZGVmYXVsdCBhcyBob3N0LCBzd2l0Y2ggdG8gZGV2aWNlIG1vZGUgaWYgbmVlZGVkICovCisJ aWYgKGV4dGNvbl9nZXRfc3RhdGUoZ2x1ZS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NUKSA9PSBmYWxz ZSkKKwkJbXRrX211c2Jfc2V0X21haWxib3goZ2x1ZSwgTVRLX0lEX0ZMT0FUKTsKKwlpZiAoZXh0 Y29uX2dldF9zdGF0ZShnbHVlLT5lZGV2LCBFWFRDT05fVVNCKSA9PSB0cnVlKQorCQltdGtfbXVz Yl9zZXRfbWFpbGJveChnbHVlLCBNVEtfVkJVU19WQUxJRCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1 cm5fdCBnZW5lcmljX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpfX2hjaSkKK3sKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCWlycXJldHVybl90IHJldHZhbCA9IElSUV9OT05FOworCXN0cnVjdCBt dXNiICptdXNiID0gX19oY2k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxh Z3MpOworCW11c2ItPmludF91c2IgPSBtdXNiX2NsZWFyYihtdXNiLT5tcmVncywgTVVTQl9JTlRS VVNCKTsKKwltdXNiLT5pbnRfcnggPSBtdXNiX2NsZWFydyhtdXNiLT5tcmVncywgTVVTQl9JTlRS UlgpOworCW11c2ItPmludF90eCA9IG11c2JfY2xlYXJ3KG11c2ItPm1yZWdzLCBNVVNCX0lOVFJU WCk7CisKKwlpZiAobXVzYi0+aW50X3VzYiB8fCBtdXNiLT5pbnRfdHggfHwgbXVzYi0+aW50X3J4 KQorCQlyZXR2YWwgPSBtdXNiX2ludGVycnVwdChtdXNiKTsKKworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRp YyBpcnFyZXR1cm5fdCBtdGtfbXVzYl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQor eworCWlycXJldHVybl90IHJldHZhbCA9IElSUV9OT05FOworCXN0cnVjdCBtdXNiICptdXNiID0g KHN0cnVjdCBtdXNiICopZGV2X2lkOworCXUzMiBsMV9pbnRzOworCisJbDFfaW50cyA9IG11c2Jf cmVhZGwobXVzYi0+bXJlZ3MsIFVTQl9MMUlOVFMpICYKKwkJCW11c2JfcmVhZGwobXVzYi0+bXJl Z3MsIFVTQl9MMUlOVE0pOworCisJaWYgKGwxX2ludHMgJiAoVFhfSU5UX1NUQVRVUyB8IFJYX0lO VF9TVEFUVVMgfCBVU0JDT01fSU5UX1NUQVRVUykpCisJCXJldHZhbCA9IGdlbmVyaWNfaW50ZXJy dXB0KGlycSwgbXVzYik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKQor CWlmIChsMV9pbnRzICYgRE1BX0lOVF9TVEFUVVMpCisJCXJldHZhbCA9IGRtYV9jb250cm9sbGVy X2lycShpcnEsIG11c2ItPmRtYV9jb250cm9sbGVyKTsKKyNlbmRpZgorCXJldHVybiByZXR2YWw7 Cit9CisKK3N0YXRpYyB1MzIgbXRrX211c2JfYnVzY3RsX29mZnNldCh1OCBlcG51bSwgdTE2IG9m ZnNldCkKK3sKKwlyZXR1cm4gTVRLX01VU0JfVFhGVU5DQUREUiArIG9mZnNldCArIDggKiBlcG51 bTsKK30KKworc3RhdGljIHU4IG10a19tdXNiX2NsZWFyYih2b2lkIF9faW9tZW0gKmFkZHIsIHVu c2lnbmVkIGludCBvZmZzZXQpCit7CisJdTggZGF0YTsKKworCS8qIFcxQyAqLworCWRhdGEgPSBt dXNiX3JlYWRiKGFkZHIsIG9mZnNldCk7CisJbXVzYl93cml0ZWIoYWRkciwgb2Zmc2V0LCBkYXRh KTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHUxNiBtdGtfbXVzYl9jbGVhcncodm9pZCBf X2lvbWVtICphZGRyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXUxNiBkYXRhOworCisJLyog VzFDICovCisJZGF0YSA9IG11c2JfcmVhZHcoYWRkciwgb2Zmc2V0KTsKKwltdXNiX3dyaXRldyhh ZGRyLCBvZmZzZXQsIGRhdGEpOworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IG10a19t dXNiX2luaXQoc3RydWN0IG11c2IgKm11c2IpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbXVz Yi0+Y29udHJvbGxlcjsKKwlzdHJ1Y3QgbXRrX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEo ZGV2LT5wYXJlbnQpOworCWludCByZXQ7CisKKwlnbHVlLT5tdXNiID0gbXVzYjsKKwltdXNiLT5w aHkgPSBnbHVlLT5waHk7CisJbXVzYi0+eGNlaXYgPSBnbHVlLT54Y2VpdjsKKwltdXNiLT5pc19o b3N0ID0gZmFsc2U7CisJbXVzYi0+aXNyID0gbXRrX211c2JfaW50ZXJydXB0OworCXJldCA9IHBo eV9pbml0KGdsdWUtPnBoeSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBo eV9wb3dlcl9vbihnbHVlLT5waHkpOworCWlmIChyZXQpIHsKKwkJcGh5X2V4aXQoZ2x1ZS0+cGh5 KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwaHlfc2V0X21vZGUoZ2x1ZS0+cGh5LCBnbHVlLT5w aHlfbW9kZSk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfSU5WRU5UUkFfRE1BKQorCW11c2Jf d3JpdGVsKG11c2ItPm1yZWdzLCBNVVNCX0hTRE1BX0lOVFIsCisJCSAgICBETUFfSU5UUl9TVEFU VVNfTVNLIHwgRE1BX0lOVFJfVU5NQVNLX1NFVF9NU0spOworI2VuZGlmCisJbXVzYl93cml0ZWwo bXVzYi0+bXJlZ3MsIFVTQl9MMUlOVE0sIFRYX0lOVF9TVEFUVVMgfCBSWF9JTlRfU1RBVFVTIHwK KwkJICAgIFVTQkNPTV9JTlRfU1RBVFVTIHwgRE1BX0lOVF9TVEFUVVMpOworCXJldHVybiAwOwor fQorCitzdGF0aWMgdTE2IG10a19tdXNiX2dldF90b2dnbGUoc3RydWN0IG11c2JfcWggKnFoLCBp bnQgaXNfb3V0KQoreworCXN0cnVjdCBtdXNiICptdXNiID0gcWgtPmh3X2VwLT5tdXNiOworCXU4 IGVwbnVtID0gcWgtPmh3X2VwLT5lcG51bTsKKwl1MTYgdG9nZ2xlOworCisJaWYgKGlzX291dCkK KwkJdG9nZ2xlID0gbXVzYl9yZWFkdyhtdXNiLT5tcmVncywgTVVTQl9UWFRPRyk7CisJZWxzZQor CQl0b2dnbGUgPSBtdXNiX3JlYWR3KG11c2ItPm1yZWdzLCBNVVNCX1JYVE9HKTsKKworCXJldHVy biB0b2dnbGUgJiAoMSA8PCBlcG51bSk7Cit9CisKK3N0YXRpYyB1MTYgbXRrX211c2Jfc2V0X3Rv Z2dsZShzdHJ1Y3QgbXVzYl9xaCAqcWgsIGludCBpc19vdXQsIHN0cnVjdCB1cmIgKnVyYikKK3sK KwlzdHJ1Y3QgbXVzYiAqbXVzYiA9IHFoLT5od19lcC0+bXVzYjsKKwl1OCBlcG51bSA9IHFoLT5o d19lcC0+ZXBudW07CisJdTE2IHRvZ2dsZTsKKworCXRvZ2dsZSA9IHVzYl9nZXR0b2dnbGUodXJi LT5kZXYsIHFoLT5lcG51bSwgaXNfb3V0KTsKKworCWlmIChpc19vdXQpIHsKKwkJbXVzYl93cml0 ZXcobXVzYi0+bXJlZ3MsIE1VU0JfVFhUT0dFTiwgKDEgPDwgZXBudW0pKTsKKwkJbXVzYl93cml0 ZXcobXVzYi0+bXJlZ3MsIE1VU0JfVFhUT0csICh0b2dnbGUgPDwgZXBudW0pKTsKKwl9IGVsc2Ug eworCQltdXNiX3dyaXRldyhtdXNiLT5tcmVncywgTVVTQl9SWFRPR0VOLCAoMSA8PCBlcG51bSkp OworCQltdXNiX3dyaXRldyhtdXNiLT5tcmVncywgTVVTQl9SWFRPRywgKHRvZ2dsZSA8PCBlcG51 bSkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19tdXNiX3NldF9tb2Rl KHN0cnVjdCBtdXNiICptdXNiLCB1OCBtb2RlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11 c2ItPmNvbnRyb2xsZXI7CisJc3RydWN0IG10a19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRh KGRldi0+cGFyZW50KTsKKwllbnVtIHBoeV9tb2RlIG5ld19tb2RlOworCisJc3dpdGNoIChtb2Rl KSB7CisJY2FzZSBNVVNCX0hPU1Q6CisJCW5ld19tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CisJ CW10a19tdXNiX3NldF92YnVzKG11c2IsIDEpOworCQlicmVhazsKKwljYXNlIE1VU0JfUEVSSVBI RVJBTDoKKwkJbmV3X21vZGUgPSBQSFlfTU9ERV9VU0JfREVWSUNFOworCQlicmVhazsKKwljYXNl IE1VU0JfT1RHOgorCQluZXdfbW9kZSA9IFBIWV9NT0RFX1VTQl9IT1NUOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCwKKwkJCSJFcnJvciBy ZXF1ZXN0ZWQgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMga2VybmVsXG4iKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCWlmIChnbHVlLT5waHlfbW9kZSA9PSBuZXdfbW9kZSkKKwkJcmV0dXJu IDA7CisKKwltdGtfbXVzYl9zZXRfbWFpbGJveChnbHVlLCBNVEtfSURfR1JPVU5EKTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfbXVzYl9leGl0KHN0cnVjdCBtdXNiICptdXNiKQor eworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7CisJc3RydWN0IG10a19n bHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKworCXBoeV9wb3dlcl9v ZmYoZ2x1ZS0+cGh5KTsKKwlwaHlfZXhpdChnbHVlLT5waHkpOworCW10a19tdXNiX2Nsa3NfZGlz YWJsZShnbHVlKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwlwbV9ydW50aW1lX2Rp c2FibGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdXNiX3Bs YXRmb3JtX29wcyBtdGtfbXVzYl9vcHMgPSB7CisJLnF1aXJrcyA9IE1VU0JfRE1BX0lOVkVOVFJB LAorCS5pbml0ID0gbXRrX211c2JfaW5pdCwKKwkuZ2V0X3RvZ2dsZSA9IG10a19tdXNiX2dldF90 b2dnbGUsCisJLnNldF90b2dnbGUgPSBtdGtfbXVzYl9zZXRfdG9nZ2xlLAorCS5leGl0ID0gbXRr X211c2JfZXhpdCwKKyNpZmRlZiBDT05GSUdfVVNCX0lOVkVOVFJBX0RNQQorCS5kbWFfaW5pdCA9 IG11c2Joc19kbWFfY29udHJvbGxlcl9jcmVhdGVfbm9pcnEsCisJLmRtYV9leGl0ID0gbXVzYmhz X2RtYV9jb250cm9sbGVyX2Rlc3Ryb3ksCisjZW5kaWYKKwkuY2xlYXJiID0gbXRrX211c2JfY2xl YXJiLAorCS5jbGVhcncgPSBtdGtfbXVzYl9jbGVhcncsCisJLmJ1c2N0bF9vZmZzZXQgPSBtdGtf bXVzYl9idXNjdGxfb2Zmc2V0LAorCS5zZXRfbW9kZSA9IG10a19tdXNiX3NldF9tb2RlLAorCS5z ZXRfdmJ1cyA9IG10a19tdXNiX3NldF92YnVzLAorfTsKKworI2RlZmluZSBNVEtfTVVTQl9NQVhf RVBfTlVNCTgKKyNkZWZpbmUgTVRLX01VU0JfUkFNX0JJVFMJMTEKKworc3RhdGljIHN0cnVjdCBt dXNiX2ZpZm9fY2ZnIG10a19tdXNiX21vZGVfY2ZnW10gPSB7CisJeyAuaHdfZXBfbnVtID0gMSwg LnN0eWxlID0gRklGT19UWCwgLm1heHBhY2tldCA9IDUxMiwgfSwKKwl7IC5od19lcF9udW0gPSAx LCAuc3R5bGUgPSBGSUZPX1JYLCAubWF4cGFja2V0ID0gNTEyLCB9LAorCXsgLmh3X2VwX251bSA9 IDIsIC5zdHlsZSA9IEZJRk9fVFgsIC5tYXhwYWNrZXQgPSA1MTIsIH0sCisJeyAuaHdfZXBfbnVt ID0gMiwgLnN0eWxlID0gRklGT19SWCwgLm1heHBhY2tldCA9IDUxMiwgfSwKKwl7IC5od19lcF9u dW0gPSAzLCAuc3R5bGUgPSBGSUZPX1RYLCAubWF4cGFja2V0ID0gNTEyLCB9LAorCXsgLmh3X2Vw X251bSA9IDMsIC5zdHlsZSA9IEZJRk9fUlgsIC5tYXhwYWNrZXQgPSA1MTIsIH0sCisJeyAuaHdf ZXBfbnVtID0gNCwgLnN0eWxlID0gRklGT19UWCwgLm1heHBhY2tldCA9IDUxMiwgfSwKKwl7IC5o d19lcF9udW0gPSA0LCAuc3R5bGUgPSBGSUZPX1JYLCAubWF4cGFja2V0ID0gNTEyLCB9LAorCXsg Lmh3X2VwX251bSA9IDUsIC5zdHlsZSA9IEZJRk9fVFgsIC5tYXhwYWNrZXQgPSA1MTIsIH0sCisJ eyAuaHdfZXBfbnVtID0gNSwgLnN0eWxlID0gRklGT19SWCwgLm1heHBhY2tldCA9IDUxMiwgfSwK Kwl7IC5od19lcF9udW0gPSA2LCAuc3R5bGUgPSBGSUZPX1RYLCAubWF4cGFja2V0ID0gMTAyNCwg fSwKKwl7IC5od19lcF9udW0gPSA2LCAuc3R5bGUgPSBGSUZPX1JYLCAubWF4cGFja2V0ID0gMTAy NCwgfSwKKwl7IC5od19lcF9udW0gPSA3LCAuc3R5bGUgPSBGSUZPX1RYLCAubWF4cGFja2V0ID0g NTEyLCB9LAorCXsgLmh3X2VwX251bSA9IDcsIC5zdHlsZSA9IEZJRk9fUlgsIC5tYXhwYWNrZXQg PSA2NCwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXVzYl9oZHJjX2NvbmZpZyBtdGtf bXVzYl9oZHJjX2NvbmZpZyA9IHsKKwkuZmlmb19jZmcgPSBtdGtfbXVzYl9tb2RlX2NmZywKKwku Zmlmb19jZmdfc2l6ZSA9IEFSUkFZX1NJWkUobXRrX211c2JfbW9kZV9jZmcpLAorCS5tdWx0aXBv aW50ID0gdHJ1ZSwKKwkuZHluX2ZpZm8gPSB0cnVlLAorCS5udW1fZXBzID0gTVRLX01VU0JfTUFY X0VQX05VTSwKKwkucmFtX2JpdHMgPSBNVEtfTVVTQl9SQU1fQklUUywKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2luZm8gbXRrX2Rldl9pbmZvID0geworCS5uYW1l ID0gIm11c2ItaGRyYyIsCisJLmlkID0gUExBVEZPUk1fREVWSURfQVVUTywKKwkuZG1hX21hc2sg PSBETUFfQklUX01BU0soMzIpLAorfTsKKworc3RhdGljIGludCBtdGtfbXVzYl9wcm9iZShzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdXNiX2hkcmNfcGxhdGZvcm1f ZGF0YSAqcGRhdGE7CisJc3RydWN0IG10a19nbHVlICpnbHVlOworCXN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2VfaW5mbyBwaW5mbzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0 cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2Rl ICpjaGlsZCwgKmV4dGNvbl9ub2RlOworCWludCByZXQgPSAtRU5PTUVNOworCisJZ2x1ZSA9IGRl dm1fa3phbGxvYyhkZXYsIHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWlmICghZ2x1ZSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlnbHVlLT5kZXYgPSBkZXY7CisJcGRhdGEgPSBkZXZtX2t6 YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBtdGtfbXVzYl9jbGtzX2dldChnbHVlKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJcGRhdGEtPmNvbmZpZyA9ICZtdGtfbXVzYl9oZHJjX2Nv bmZpZzsKKwlwZGF0YS0+cGxhdGZvcm1fb3BzID0gJm10a19tdXNiX29wczsKKworCWdsdWUtPnZi dXMgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LCAidmJ1cyIpOworCWlmIChJU19FUlIoZ2x1ZS0+ dmJ1cykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsIHRvIGdldCB2YnVzXG4iKTsKKwkJcmV0dXJu IFBUUl9FUlIoZ2x1ZS0+dmJ1cyk7CisJfQorCisJY2hpbGQgPSBvZl9nZXRfY2hpbGRfYnlfbmFt ZShucCwgImNvbm5lY3RvciIpOworCWlmICghY2hpbGQpIHsKKwkJZGV2X2VycihkZXYsICJmYWls ZWQgdG8gZmluZCB1c2IgY29ubmVjdG9yIG5vZGVcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5P REVWKTsKKwl9CisKKwlleHRjb25fbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUoY2hpbGQsICJleHRj b24iLCAwKTsKKwlpZiAoIWV4dGNvbl9ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRv IGdldCBleHRjb24gcGhhbmRsZSIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwl9CisK KwlnbHVlLT5lZGV2ID0gZXh0Y29uX2ZpbmRfZWRldl9ieV9ub2RlKGV4dGNvbl9ub2RlKTsKKwlp ZiAoSVNfRVJSKGdsdWUtPmVkZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbCB0byBnZXQgZXh0 Y29uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ2x1ZS0+ZWRldik7CisJfQorCisJcGRhdGEtPm1v ZGUgPSB1c2JfZ2V0X2RyX21vZGUoZGV2KTsKKwlzd2l0Y2ggKHBkYXRhLT5tb2RlKSB7CisJY2Fz ZSBVU0JfRFJfTU9ERV9IT1NUOgorCQlnbHVlLT5waHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9IT1NU OworCQlicmVhazsKKwljYXNlIFVTQl9EUl9NT0RFX1BFUklQSEVSQUw6CisJCWdsdWUtPnBoeV9t b2RlID0gUEhZX01PREVfVVNCX0RFVklDRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGRhdGEt Pm1vZGUgPSBVU0JfRFJfTU9ERV9PVEc7CisJCS8qIEZBTEwgVEhST1VHSCAqLworCWNhc2UgVVNC X0RSX01PREVfT1RHOgorCQlnbHVlLT5waHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9PVEc7CisJCWJy ZWFrOworCX0KKworCWdsdWUtPnBoeSA9IGRldm1fb2ZfcGh5X2dldF9ieV9pbmRleChkZXYsIG5w LCAwKTsKKwlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsIHRv IGdldHRpbmcgcGh5ICVsZFxuIiwKKwkJCVBUUl9FUlIoZ2x1ZS0+cGh5KSk7CisJCXJldHVybiBQ VFJfRVJSKGdsdWUtPnBoeSk7CisJfQorCisJZ2x1ZS0+dXNiX3BoeSA9IHVzYl9waHlfZ2VuZXJp Y19yZWdpc3RlcigpOworCWlmIChJU19FUlIoZ2x1ZS0+dXNiX3BoeSkpIHsKKwkJZGV2X2Vycihk ZXYsICJmYWlsIHRvIHJlZ2lzdGVyaW5nIHVzYi1waHkgJWxkXG4iLAorCQkJUFRSX0VSUihnbHVl LT51c2JfcGh5KSk7CisJCXJldHVybiBQVFJfRVJSKGdsdWUtPnVzYl9waHkpOworCX0KKworCWds dWUtPnhjZWl2ID0gZGV2bV91c2JfZ2V0X3BoeShkZXYsIFVTQl9QSFlfVFlQRV9VU0IyKTsKKwlp ZiAoSVNfRVJSKGdsdWUtPnhjZWl2KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWwgdG8gZ2V0dGlu ZyB1c2ItcGh5ICVkXG4iLCByZXQpOworCQlyZXQgPSBQVFJfRVJSKGdsdWUtPnhjZWl2KTsKKwkJ Z290byBlcnJfdW5yZWdpc3Rlcl91c2JfcGh5OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRh KHBkZXYsIGdsdWUpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9nZXRf c3luYyhkZXYpOworCisJcmV0ID0gbXRrX211c2JfY2xrc19lbmFibGUoZ2x1ZSk7CisJaWYgKHJl dCkKKwkJZ290byBlcnJfZW5hYmxlX2NsazsKKworCXBpbmZvID0gbXRrX2Rldl9pbmZvOworCXBp bmZvLnBhcmVudCA9IGRldjsKKwlwaW5mby5yZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwlwaW5mby5u dW1fcmVzID0gcGRldi0+bnVtX3Jlc291cmNlczsKKwlwaW5mby5kYXRhID0gcGRhdGE7CisJcGlu Zm8uc2l6ZV9kYXRhID0gc2l6ZW9mKCpwZGF0YSk7CisKKwlnbHVlLT5tdXNiX3BkZXYgPSBwbGF0 Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZnVsbCgmcGluZm8pOworCWlmIChJU19FUlIoZ2x1ZS0+bXVz Yl9wZGV2KSkgeworCQlyZXQgPSBQVFJfRVJSKGdsdWUtPm11c2JfcGRldik7CisJCWRldl9lcnIo ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIG11c2IgZGV2aWNlOiAlZFxuIiwgcmV0KTsKKwkJZ290 byBlcnJfZGV2aWNlX3JlZ2lzdGVyOworCX0KKworCWlmIChwZGF0YS0+bW9kZSA9PSBVU0JfRFJf TU9ERV9PVEcpCisJCW10a19vdGdfc3dpdGNoX2luaXQoZ2x1ZSk7CisKKwlyZXR1cm4gMDsKKwor ZXJyX2RldmljZV9yZWdpc3RlcjoKKwltdGtfbXVzYl9jbGtzX2Rpc2FibGUoZ2x1ZSk7CitlcnJf ZW5hYmxlX2NsazoKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CisJcG1fcnVudGltZV9kaXNh YmxlKGRldik7CitlcnJfdW5yZWdpc3Rlcl91c2JfcGh5OgorCXVzYl9waHlfZ2VuZXJpY191bnJl Z2lzdGVyKGdsdWUtPnVzYl9waHkpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXRr X211c2JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10 a19nbHVlICpnbHVlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHBsYXRm b3JtX2RldmljZSAqdXNiX3BoeSA9IGdsdWUtPnVzYl9waHk7CisKKwlwbGF0Zm9ybV9kZXZpY2Vf dW5yZWdpc3RlcihnbHVlLT5tdXNiX3BkZXYpOworCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVy KHVzYl9waHkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10a19tdXNiX21hdGNoW10gPSB7CisJey5jb21wYXRp YmxlID0gIm1lZGlhdGVrLG10ay1tdXNiIix9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFC TEUob2YsIG10a19tdXNiX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3Jt X2RyaXZlciBtdGtfbXVzYl9kcml2ZXIgPSB7CisJLnByb2JlID0gbXRrX211c2JfcHJvYmUsCisJ LnJlbW92ZSA9IG10a19tdXNiX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJt dXNiLW10ayIsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihtdGtfbXVzYl9t YXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXRrX211c2JfZHJpdmVy KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYVRlayBNVVNCIEdsdWUgTGF5ZXIiKTsKK01P RFVMRV9BVVRIT1IoIk1pbiBHdW8gPG1pbi5ndW9AbWVkaWF0ZWsuY29tPiIpOworTU9EVUxFX0xJ Q0VOU0UoIkdQTCB2MiIpOwo=