From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Subject: [PATCH RESEND v7 3/3] phy: Add driver for mixel dphy found on imx8 Date: Wed, 27 Mar 2019 09:20:01 +0100 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Kishon Vijay Abraham I , Rob Herring , Mark Rutland , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Thierry Reding , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Martin Blumenstingl , Heiko Stuebner , Johan Hovold , Lucas Stach , Abel Vesa , Li Jun , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, dri-devel@lists.freedesktop.org, Robert Chiras , Sam Ravnborg , Maxime Ripard List-Id: devicetree@vger.kernel.org VGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBNaXhlbCBEUEhZIGFzIGZvdW5kIG9uIGkuTVg4IENQ VXMgYnV0IHNpbmNlCnRoaXMgaXMgYW4gSVAgY29yZSBpdCB3aWxsIGxpa2VseSBiZSBmb3VuZCBv biBvdGhlcnMgaW4gdGhlIGZ1dHVyZS4gU28KaW5zdGVhZCBvZiBhZGRpbmcgdGhpcyB0byB0aGUg bndsIGhvc3QgZHJpdmVyIG1ha2UgaXQgYSBnZW5lcmljIFBIWQpkcml2ZXIuCgpUaGUgZHJpdmVy IHN1cHBvcnRzIHRoZSBpLk1YOE1RLiBTdXBwb3J0IGZvciBpLk1YOFFNIGFuZCBpLk1YOFFYUCBj YW4gYmUKYWRkZWQgb25jZSB0aGUgbmVjZXNzYXJ5IHN5c3RlbSBjb250cm9sbGVyIGJpdHMgYXJl IGluIHZpYQptaXhlbF9kcGh5X2RldmRhdGEuCgpDby1hdXRob3JlZC1ieTogUm9iZXJ0IENoaXJh cyA8cm9iZXJ0LmNoaXJhc0BueHAuY29tPgpTaWduZWQtb2ZmLWJ5OiBHdWlkbyBHw7xudGhlciA8 YWd4QHNpZ3hjcHUub3JnPgotLS0KIGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnICAgICAg ICAgICAgICAgICB8ICAxMSArCiBkcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUgICAgICAg ICAgICAgICAgfCAgIDEgKwogLi4uL3BoeS9mcmVlc2NhbGUvcGh5LWZzbC1pbXg4LW1pcGktZHBo eS5jICAgIHwgNTA2ICsrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA1MTggaW5z ZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9waHkt ZnNsLWlteDgtbWlwaS1kcGh5LmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUv S2NvbmZpZyBiL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCmluZGV4IDgzMjY3MGI0OTUy Yi4uYTExMWIxMzBmOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvS2NvbmZp ZworKysgYi9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvS2NvbmZpZwpAQCAtMywzICszLDE0IEBAIGNv bmZpZyBQSFlfRlNMX0lNWDhNUV9VU0IKIAlkZXBlbmRzIG9uIE9GICYmIEhBU19JT01FTQogCXNl bGVjdCBHRU5FUklDX1BIWQogCWRlZmF1bHQgQVJDSF9NWEMgJiYgQVJNNjQKKworY29uZmlnIFBI WV9NSVhFTF9NSVBJX0RQSFkKKwl0cmlzdGF0ZSAiTWl4ZWwgTUlQSSBEU0kgUEhZIHN1cHBvcnQi CisJZGVwZW5kcyBvbiBPRiAmJiBIQVNfSU9NRU0KKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxl Y3QgR0VORVJJQ19QSFlfTUlQSV9EUEhZCisJc2VsZWN0IFJFR01BUF9NTUlPCisJZGVmYXVsdCBB UkNIX01YQyAmJiBBUk02NAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIGFkZCBzdXBwb3J0IGZv ciB0aGUgTWl4ZWwgRFNJIFBIWSBhcyBmb3VuZAorCSAgb24gTlhQJ3MgaS5NWDggZmFtaWx5IG9m IFNPQ3MuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUgYi9kcml2 ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKaW5kZXggZGMyYjNmMWYyZjgwLi4wNzQ5MWM5MjZh MmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9NYWtlZmlsZQorKysgYi9kcml2 ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKQEAgLTEgKzEsMiBAQAogb2JqLSQoQ09ORklHX1BI WV9GU0xfSU1YOE1RX1VTQikJKz0gcGh5LWZzbC1pbXg4bXEtdXNiLm8KK29iai0kKENPTkZJR19Q SFlfTUlYRUxfTUlQSV9EUEhZKQkrPSBwaHktZnNsLWlteDgtbWlwaS1kcGh5Lm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9waHktZnNsLWlteDgtbWlwaS1kcGh5LmMgYi9kcml2 ZXJzL3BoeS9mcmVlc2NhbGUvcGh5LWZzbC1pbXg4LW1pcGktZHBoeS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZmQ0ODdhOWU1YTM1Ci0tLSAvZGV2L251bGwKKysr IGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL3BoeS1mc2wtaW14OC1taXBpLWRwaHkuYwpAQCAtMCww ICsxLDUwNiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICog Q29weXJpZ2h0IDIwMTcsMjAxOCBOWFAKKyAqIENvcHlyaWdodCAyMDE5IFB1cmlzbSBTUEMKKyAq LworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVy Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRl IDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKy8qIERQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5l IERQSFlfUERfRFBIWQkJCTB4MDAKKyNkZWZpbmUgRFBIWV9NX1BSR19IU19QUkVQQVJFCQkweDA0 CisjZGVmaW5lIERQSFlfTUNfUFJHX0hTX1BSRVBBUkUJCTB4MDgKKyNkZWZpbmUgRFBIWV9NX1BS R19IU19aRVJPCQkweDBjCisjZGVmaW5lIERQSFlfTUNfUFJHX0hTX1pFUk8JCTB4MTAKKyNkZWZp bmUgRFBIWV9NX1BSR19IU19UUkFJTAkJMHgxNAorI2RlZmluZSBEUEhZX01DX1BSR19IU19UUkFJ TAkJMHgxOAorI2RlZmluZSBEUEhZX1BEX1BMTAkJCTB4MWMKKyNkZWZpbmUgRFBIWV9UU1QJCQkw eDIwCisjZGVmaW5lIERQSFlfQ04JCQkJMHgyNAorI2RlZmluZSBEUEhZX0NNCQkJCTB4MjgKKyNk ZWZpbmUgRFBIWV9DTwkJCQkweDJjCisjZGVmaW5lIERQSFlfTE9DSwkJCTB4MzAKKyNkZWZpbmUg RFBIWV9MT0NLX0JZUAkJCTB4MzQKKyNkZWZpbmUgRFBIWV9SRUdfQllQQVNTX1BMTAkJMHg0Qwor CisjZGVmaW5lIE1CUFMoeCkgKCh4KSAqIDEwMDAwMDApCisKKyNkZWZpbmUgREFUQV9SQVRFX01B WF9TUEVFRCBNQlBTKDE1MDApCisjZGVmaW5lIERBVEFfUkFURV9NSU5fU1BFRUQgTUJQUyg4MCkK KworI2RlZmluZSBQTExfTE9DS19TTEVFUCAxMAorI2RlZmluZSBQTExfTE9DS19USU1FT1VUIDEw MDAKKworI2RlZmluZSBDTl9CVUYJMHhjYjdhODljMAorI2RlZmluZSBDT19CVUYJMHg2MworI2Rl ZmluZSBDTSh4KQkoCQkJCVwKKwkJKCh4KSA8CTMyKT8weGUwfCgoeCktMTYpIDoJXAorCQkoKHgp IDwJNjQpPzB4YzB8KCh4KS0zMikgOglcCisJCSgoeCkgPCAxMjgpPzB4ODB8KCh4KS02NCkgOglc CisJCSgoeCkgLSAxMjgpKQorI2RlZmluZSBDTih4KQkoKCh4KSA9PSAxKT8weDFmIDogKCgoQ05f QlVGKT4+KCh4KS0xKSkmMHgxZikpCisjZGVmaW5lIENPKHgpCSgoQ09fQlVGKT4+KDgtKHgpKSYw eDMpCisKKy8qIFBIWSBwb3dlciBvbiBpcyBhY3RpdmUgbG93ICovCisjZGVmaW5lIFBXUl9PTgkw CisjZGVmaW5lIFBXUl9PRkYJMQorCitlbnVtIG1peGVsX2RwaHlfZGV2dHlwZSB7CisJTUlYRUxf SU1YOE1RLAorfTsKKworc3RydWN0IG1peGVsX2RwaHlfZGV2ZGF0YSB7CisJdTggcmVnX3R4X3Jj YWw7CisJdTggcmVnX2F1dG9fcGRfZW47CisJdTggcmVnX3J4bHBycDsKKwl1OCByZWdfcnhjZHJw OworCXU4IHJlZ19yeGhzX3NldHRsZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWl4ZWxf ZHBoeV9kZXZkYXRhIG1peGVsX2RwaHlfZGV2ZGF0YVtdID0geworCVtNSVhFTF9JTVg4TVFdID0g eworCQkucmVnX3R4X3JjYWwgPSAweDM4LAorCQkucmVnX2F1dG9fcGRfZW4gPSAweDNjLAorCQku cmVnX3J4bHBycCA9IDB4NDAsCisJCS5yZWdfcnhjZHJwID0gMHg0NCwKKwkJLnJlZ19yeGhzX3Nl dHRsZSA9IDB4NDgsCisJfSwKK307CisKK3N0cnVjdCBtaXhlbF9kcGh5X2NmZyB7CisJLyogRFBI WSBQTEwgcGFyYW1ldGVycyAqLworCXUzMiBjbTsKKwl1MzIgY247CisJdTMyIGNvOworCS8qIERQ SFkgcmVnaXN0ZXIgdmFsdWVzICovCisJdTggbWNfcHJnX2hzX3ByZXBhcmU7CisJdTggbV9wcmdf aHNfcHJlcGFyZTsKKwl1OCBtY19wcmdfaHNfemVybzsKKwl1OCBtX3ByZ19oc196ZXJvOworCXU4 IG1jX3ByZ19oc190cmFpbDsKKwl1OCBtX3ByZ19oc190cmFpbDsKKwl1OCByeGhzX3NldHRsZTsK K307CisKK3N0cnVjdCBtaXhlbF9kcGh5X3ByaXYgeworCXN0cnVjdCBtaXhlbF9kcGh5X2NmZyBj Zmc7CisJc3RydWN0IHJlZ21hcCAqcmVnczsKKwlzdHJ1Y3QgY2xrICpwaHlfcmVmX2NsazsKKwlj b25zdCBzdHJ1Y3QgbWl4ZWxfZHBoeV9kZXZkYXRhICpkZXZkYXRhOworfTsKKworc3RhdGljIGNv bnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1peGVsX2RwaHlfcmVnbWFwX2NvbmZpZyA9IHsKKwku cmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkubWF4 X3JlZ2lzdGVyID0gRFBIWV9SRUdfQllQQVNTX1BMTCwKKwkubmFtZSA9ICJtaXBpLWRwaHkiLAor fTsKKworc3RhdGljIGludCBwaHlfd3JpdGUoc3RydWN0IHBoeSAqcGh5LCB1MzIgdmFsdWUsIHVu c2lnbmVkIGludCByZWcpCit7CisJc3RydWN0IG1peGVsX2RwaHlfcHJpdiAqcHJpdiA9IHBoeV9n ZXRfZHJ2ZGF0YShwaHkpOworCWludCByZXQ7CisKKwlyZXQgPSByZWdtYXBfd3JpdGUocHJpdi0+ cmVncywgcmVnLCB2YWx1ZSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJnBoeS0+ZGV2LCAi RmFpbGVkIHRvIHdyaXRlIERQSFkgcmVnICVkOiAlZCIsIHJlZywgcmV0KTsKKwlyZXR1cm4gcmV0 OworfQorCisvKgorICogRmluZCBhIHJhdGlvIGNsb3NlIHRvIHRoZSBkZXNpcmVkIG9uZSB1c2lu ZyBjb250aW51ZWQgZnJhY3Rpb24KKyAqIGFwcHJveGltYXRpb24gZW5kaW5nIGVpdGhlciBhdCBl eGFjdCBtYXRjaCBvciBtYXhpbXVtIGFsbG93ZWQKKyAqIG5vbWluYXRvciwgZGVub21pbmF0b3Iu CisgKi8KK3N0YXRpYyB2b2lkIGdldF9iZXN0X3JhdGlvKHUzMiAqcG51bSwgdTMyICpwZGVub20s IHVuc2lnbmVkIGludCBtYXhfbiwKKwkJCSAgIHVuc2lnbmVkIGludCBtYXhfZCkKK3sKKwl1MzIg YSA9ICpwbnVtOworCXUzMiBiID0gKnBkZW5vbTsKKwl1MzIgYzsKKwl1MzIgbltdID0gezAsIDF9 OworCXUzMiBkW10gPSB7MSwgMH07CisJdTMyIHdob2xlOworCXVuc2lnbmVkIGludCBpID0gMTsK KworCXdoaWxlIChiKSB7CisJCWkgXj0gMTsKKwkJd2hvbGUgPSBhIC8gYjsKKwkJbltpXSArPSAo bltpIF4gMV0gKiB3aG9sZSk7CisJCWRbaV0gKz0gKGRbaSBeIDFdICogd2hvbGUpOworCQlpZiAo KG5baV0gPiBtYXhfbikgfHwgKGRbaV0gPiBtYXhfZCkpIHsKKwkJCWkgXj0gMTsKKwkJCWJyZWFr OworCQl9CisJCWMgPSBhIC0gKGIgKiB3aG9sZSk7CisJCWEgPSBiOworCQliID0gYzsKKwl9CisJ KnBudW0gPSBuW2ldOworCSpwZGVub20gPSBkW2ldOworfQorCitzdGF0aWMgaW50IG1peGVsX2Rw aHlfY29uZmlnX2Zyb21fb3B0cyhzdHJ1Y3QgcGh5ICpwaHksCisJICAgICAgIHN0cnVjdCBwaHlf Y29uZmlndXJlX29wdHNfbWlwaV9kcGh5ICpkcGh5X29wdHMsCisJICAgICAgIHN0cnVjdCBtaXhl bF9kcGh5X2NmZyAqY2ZnKQoreworCXN0cnVjdCBtaXhlbF9kcGh5X3ByaXYgKnByaXYgPSBkZXZf Z2V0X2RydmRhdGEocGh5LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIHJlZl9jbGsgPSBj bGtfZ2V0X3JhdGUocHJpdi0+cGh5X3JlZl9jbGspOworCXUzMiBscF90LCBudW1lcmF0b3IsIGRl bm9taW5hdG9yOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CisJdTMyIG47CisJaW50IGk7CisK KwlpZiAoZHBoeV9vcHRzLT5oc19jbGtfcmF0ZSA+IERBVEFfUkFURV9NQVhfU1BFRUQgfHwKKwkg ICAgZHBoeV9vcHRzLT5oc19jbGtfcmF0ZSA8IERBVEFfUkFURV9NSU5fU1BFRUQpCisJCXJldHVy biAtRUlOVkFMOworCisJbnVtZXJhdG9yID0gZHBoeV9vcHRzLT5oc19jbGtfcmF0ZTsKKwlkZW5v bWluYXRvciA9IHJlZl9jbGs7CisJZ2V0X2Jlc3RfcmF0aW8oJm51bWVyYXRvciwgJmRlbm9taW5h dG9yLCAyNTUsIDI1Nik7CisJaWYgKCFudW1lcmF0b3IgfHwgIWRlbm9taW5hdG9yKSB7CisJCWRl dl9lcnIoJnBoeS0+ZGV2LCAiSW52YWxpZCAlZC8lZCBmb3IgJWxkLyVsZFxuIiwKKwkJCW51bWVy YXRvciwgZGVub21pbmF0b3IsCisJCQlkcGh5X29wdHMtPmhzX2Nsa19yYXRlLCByZWZfY2xrKTsK KwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2hpbGUgKChudW1lcmF0b3IgPCAxNikgJiYgKGRl bm9taW5hdG9yIDw9IDEyOCkpIHsKKwkJbnVtZXJhdG9yIDw8PSAxOworCQlkZW5vbWluYXRvciA8 PD0gMTsKKwl9CisJLyoKKwkgKiBDTSByYW5nZXMgYmV0d2VlbiAxNiBhbmQgMjU1CisJICogQ04g cmFuZ2VzIGJldHdlZW4gMSBhbmQgMzIKKwkgKiBDTyBpcyBwb3dlciBvZiAyOiAxLCAyLCA0LCA4 CisJICovCisJaSA9IF9fZmZzKGRlbm9taW5hdG9yKTsKKwlpZiAoaSA+IDMpCisJCWkgPSAzOwor CWNmZy0+Y24gPSBkZW5vbWluYXRvciA+PiBpOworCWNmZy0+Y28gPSAxIDw8IGk7CisJY2ZnLT5j bSA9IG51bWVyYXRvcjsKKworCWlmIChjZmctPmNtIDwgMTYgfHwgY2ZnLT5jbSA+IDI1NSB8fAor CSAgICBjZmctPmNuIDwgMSB8fCBjZmctPmNuID4gMzIgfHwKKwkgICAgY2ZnLT5jbyA8IDEgfHwg Y2ZnLT5jbyA+IDgpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJJbnZhbGlkIENNL0NOL0NPIHZh bHVlczogJXUvJXUvJXVcbiIsCisJCQljZmctPmNtLCBjZmctPmNuLCBjZmctPmNvKTsKKwkJZGV2 X2VycigmcGh5LT5kZXYsICJmb3IgaHNfY2xrL3JlZl9jbGs9JWxkLyVsZCDiqbAgJWQvJWRcbiIs CisJCQlkcGh5X29wdHMtPmhzX2Nsa19yYXRlLCByZWZfY2xrLAorCQkJbnVtZXJhdG9yLCBkZW5v bWluYXRvcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoJnBoeS0+ZGV2LCAi aHNfY2xrL3JlZl9jbGs9JWxkLyVsZCDiqbAgJWQvJWRcbiIsCisJCWRwaHlfb3B0cy0+aHNfY2xr X3JhdGUsIHJlZl9jbGssIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworCisJLyogTFAgY2xvY2sg cGVyaW9kICovCisJdG1wID0gMTAwMDAwMDAwMDAwMExMOworCWRvX2Rpdih0bXAsIGRwaHlfb3B0 cy0+bHBfY2xrX3JhdGUpOyAvKiBwcyAqLworCWlmICh0bXAgPiBVTE9OR19NQVgpCisJICByZXR1 cm4gLUVJTlZBTDsKKwllbHNlCisJICBscF90ID0gdG1wOworCWRldl9kYmcoJnBoeS0+ZGV2LCAi TFAgY2xvY2sgJWx1LCBwZXJpb2Q6ICV1IHBzXG4iLAorCQlkcGh5X29wdHMtPmxwX2Nsa19yYXRl LCBscF90KTsKKworCS8qIGhzX3ByZXBhcmU6IGluIGxwIGNsb2NrIHBlcmlvZHMgKi8KKwlpZiAo MiAqIGRwaHlfb3B0cy0+aHNfcHJlcGFyZSA+IDUgKiBscF90KSB7CisJCWRldl9lcnIoJnBoeS0+ ZGV2LAorCQkJImhzX3ByZXBhcmUgKCV1KSA+IDIuNSAqIGxwIGNsb2NrIHBlcmlvZCAoJXUpIiwK KwkJCWRwaHlfb3B0cy0+aHNfcHJlcGFyZSwgbHBfdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0K KwkvKiAwMDogbHBfdCwgMDE6IDEuNSAqIGxwX3QsIDEwOiAyICogbHBfdCwgMTE6IDIuNSAqIGxw X3QgKi8KKwlpZiAoZHBoeV9vcHRzLT5oc19wcmVwYXJlIDwgbHBfdCkgeworCQluID0gMDsKKwl9 IGVsc2UgeworCQl0bXAgPSAyICogKGRwaHlfb3B0cy0+aHNfcHJlcGFyZSAtIGxwX3QpOworCQlk b19kaXYodG1wLCBscF90KTsKKwkJbiA9IHRtcDsKKwl9CisJY2ZnLT5tX3ByZ19oc19wcmVwYXJl ID0gbjsKKworCS8qIGNsa19wcmVwYXJlOiBpbiBscCBjbG9jayBwZXJpb2RzICovCisJaWYgKDIg KiBkcGh5X29wdHMtPmNsa19wcmVwYXJlID4gMyAqIGxwX3QpIHsKKwkJZGV2X2VycigmcGh5LT5k ZXYsCisJCQkiY2xrX3ByZXBhcmUgKCV1KSA+IDEuNSAqIGxwIGNsb2NrIHBlcmlvZCAoJXUpIiwK KwkJCWRwaHlfb3B0cy0+Y2xrX3ByZXBhcmUsIGxwX3QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9 CisJLyogMDA6IGxwX3QsIDAxOiAxLjUgKiBscF90ICovCisJY2ZnLT5tY19wcmdfaHNfcHJlcGFy ZSA9IGRwaHlfb3B0cy0+Y2xrX3ByZXBhcmUgPiBscF90ID8gMSA6IDA7CisKKwkvKiBoc196ZXJv OiBmb3JtdWxhIGZyb20gTlhQIEJTUCAqLworCW4gPSAoMTQ0ICogKGRwaHlfb3B0cy0+aHNfY2xr X3JhdGUgLyAxMDAwMDAwKSAtIDQ3NTAwKSAvIDEwMDAwOworCWNmZy0+bV9wcmdfaHNfemVybyA9 IG4gPCAxID8gMSA6IG47CisKKwkvKiBjbGtfemVybzogZm9ybXVsYSBmcm9tIE5YUCBCU1AgKi8K KwluID0gKDM0ICogKGRwaHlfb3B0cy0+aHNfY2xrX3JhdGUgLyAxMDAwMDAwKSAtIDI1MDApIC8g MTAwMDsKKwljZmctPm1jX3ByZ19oc196ZXJvID0gbiA8IDEgPyAxIDogbjsKKworCS8qIGNsa190 cmFpbCwgaHNfdHJhaWw6IGZvcm11bGEgZnJvbSBOWFAgQlNQICovCisJbiA9ICgxMDMgKiAoZHBo eV9vcHRzLT5oc19jbGtfcmF0ZSAvIDEwMDAwMDApICsgMTAwMDApIC8gMTAwMDA7CisJaWYgKG4g PiAxNSkKKwkJbiA9IDE1OworCWlmIChuIDwgMSkKKwkJbiA9IDE7CisJY2ZnLT5tX3ByZ19oc190 cmFpbCA9IG47CisJY2ZnLT5tY19wcmdfaHNfdHJhaWwgPSBuOworCisJLyogcnhoc19zZXR0bGU6 IGZvcm11bGEgZnJvbSBOWFAgQlNQICovCisJaWYgKGRwaHlfb3B0cy0+aHNfY2xrX3JhdGUgPCBN QlBTKDgwKSkKKwkJY2ZnLT5yeGhzX3NldHRsZSA9IDB4MGQ7CisJZWxzZSBpZiAoZHBoeV9vcHRz LT5oc19jbGtfcmF0ZSA8IE1CUFMoOTApKQorCQljZmctPnJ4aHNfc2V0dGxlID0gMHgwYzsKKwll bHNlIGlmIChkcGh5X29wdHMtPmhzX2Nsa19yYXRlIDwgTUJQUygxMjUpKQorCQljZmctPnJ4aHNf c2V0dGxlID0gMHgwYjsKKwllbHNlIGlmIChkcGh5X29wdHMtPmhzX2Nsa19yYXRlIDwgTUJQUygx NTApKQorCQljZmctPnJ4aHNfc2V0dGxlID0gMHgwYTsKKwllbHNlIGlmIChkcGh5X29wdHMtPmhz X2Nsa19yYXRlIDwgTUJQUygyMjUpKQorCQljZmctPnJ4aHNfc2V0dGxlID0gMHgwOTsKKwllbHNl IGlmIChkcGh5X29wdHMtPmhzX2Nsa19yYXRlIDwgTUJQUyg1MDApKQorCQljZmctPnJ4aHNfc2V0 dGxlID0gMHgwODsKKwllbHNlCisJCWNmZy0+cnhoc19zZXR0bGUgPSAweDA3OworCisJZGV2X2Ri ZygmcGh5LT5kZXYsICJoc19wcmVwYXJlOiAldSwgY2xrX3ByZXBhcmU6ICV1LCAiCisJCSJoc19w cmVwYXJlOiAldSwgY2xrX3ByZXBhcmU6ICV1LCAiCisJCSJoc190cmFpbDogJXUsIGNsa190cmFp bDogJXUsICIKKwkJInJ4aHNfc2V0dGxlOiAldVxuIiwKKwkJY2ZnLT5tX3ByZ19oc19wcmVwYXJl LCBjZmctPm1jX3ByZ19oc19wcmVwYXJlLAorCQljZmctPm1fcHJnX2hzX3plcm8sIGNmZy0+bWNf cHJnX2hzX3plcm8sCisJCWNmZy0+bV9wcmdfaHNfdHJhaWwsIGNmZy0+bWNfcHJnX2hzX3RyYWls LAorCQljZmctPnJ4aHNfc2V0dGxlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBt aXhlbF9waHlfc2V0X2hzX3RpbWluZ3Moc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBtaXhl bF9kcGh5X3ByaXYgKnByaXYgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCXBoeV93cml0ZShw aHksIHByaXYtPmNmZy5tX3ByZ19oc19wcmVwYXJlLCBEUEhZX01fUFJHX0hTX1BSRVBBUkUpOwor CXBoeV93cml0ZShwaHksIHByaXYtPmNmZy5tY19wcmdfaHNfcHJlcGFyZSwgRFBIWV9NQ19QUkdf SFNfUFJFUEFSRSk7CisJcGh5X3dyaXRlKHBoeSwgcHJpdi0+Y2ZnLm1fcHJnX2hzX3plcm8sIERQ SFlfTV9QUkdfSFNfWkVSTyk7CisJcGh5X3dyaXRlKHBoeSwgcHJpdi0+Y2ZnLm1jX3ByZ19oc196 ZXJvLCBEUEhZX01DX1BSR19IU19aRVJPKTsKKwlwaHlfd3JpdGUocGh5LCBwcml2LT5jZmcubV9w cmdfaHNfdHJhaWwsIERQSFlfTV9QUkdfSFNfVFJBSUwpOworCXBoeV93cml0ZShwaHksIHByaXYt PmNmZy5tY19wcmdfaHNfdHJhaWwsIERQSFlfTUNfUFJHX0hTX1RSQUlMKTsKKwlwaHlfd3JpdGUo cGh5LCBwcml2LT5jZmcucnhoc19zZXR0bGUsIHByaXYtPmRldmRhdGEtPnJlZ19yeGhzX3NldHRs ZSk7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZWxfZHBoeV9zZXRfcGxsX3BhcmFtcyhzdHJ1Y3QgcGh5 ICpwaHkpCit7CisJc3RydWN0IG1peGVsX2RwaHlfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0 YShwaHktPmRldi5wYXJlbnQpOworCisJaWYgKHByaXYtPmNmZy5jbSA8IDE2IHx8IHByaXYtPmNm Zy5jbSA+IDI1NSB8fAorCSAgICBwcml2LT5jZmcuY24gPCAxIHx8IHByaXYtPmNmZy5jbiA+IDMy IHx8CisJICAgIHByaXYtPmNmZy5jbyA8IDEgfHwgcHJpdi0+Y2ZnLmNvID4gOCkgeworCQlkZXZf ZXJyKCZwaHktPmRldiwgIkludmFsaWQgQ00vQ04vQ08gdmFsdWVzISAoJXUvJXUvJXUpXG4iLAor CQkJcHJpdi0+Y2ZnLmNtLCBwcml2LT5jZmcuY24sIHByaXYtPmNmZy5jbyk7CisJCXJldHVybiAt RUlOVkFMOworCX0KKwlkZXZfZGJnKCZwaHktPmRldiwgIlVzaW5nIENNOiV1IENOOiV1IENPOiV1 XG4iLAorCQlwcml2LT5jZmcuY20sIHByaXYtPmNmZy5jbiwgcHJpdi0+Y2ZnLmNvKTsKKwlwaHlf d3JpdGUocGh5LCBDTShwcml2LT5jZmcuY20pLCBEUEhZX0NNKTsKKwlwaHlfd3JpdGUocGh5LCBD Tihwcml2LT5jZmcuY24pLCBEUEhZX0NOKTsKKwlwaHlfd3JpdGUocGh5LCBDTyhwcml2LT5jZmcu Y28pLCBEUEhZX0NPKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaXhlbF9kcGh5X2Nv bmZpZ3VyZShzdHJ1Y3QgcGh5ICpwaHksIHVuaW9uIHBoeV9jb25maWd1cmVfb3B0cyAqb3B0cykK K3sKKwlzdHJ1Y3QgbWl4ZWxfZHBoeV9wcml2ICpwcml2ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7 CisJc3RydWN0IG1peGVsX2RwaHlfY2ZnIGNmZyA9IHsgMCB9OworCWludCByZXQ7CisKKwlyZXQg PSBtaXhlbF9kcGh5X2NvbmZpZ19mcm9tX29wdHMocGh5LCAmb3B0cy0+bWlwaV9kcGh5LCAmY2Zn KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVXBkYXRlIHRoZSBjb25maWd1cmF0 aW9uICovCisJbWVtY3B5KCZwcml2LT5jZmcsICZjZmcsIHNpemVvZihzdHJ1Y3QgbWl4ZWxfZHBo eV9jZmcpKTsKKworCXBoeV93cml0ZShwaHksIDB4MDAsIERQSFlfTE9DS19CWVApOworCXBoeV93 cml0ZShwaHksIDB4MDEsIHByaXYtPmRldmRhdGEtPnJlZ190eF9yY2FsKTsKKwlwaHlfd3JpdGUo cGh5LCAweDAwLCBwcml2LT5kZXZkYXRhLT5yZWdfYXV0b19wZF9lbik7CisJcGh5X3dyaXRlKHBo eSwgMHgwMiwgcHJpdi0+ZGV2ZGF0YS0+cmVnX3J4bHBycCk7CisJcGh5X3dyaXRlKHBoeSwgMHgw MiwgcHJpdi0+ZGV2ZGF0YS0+cmVnX3J4Y2RycCk7CisJcGh5X3dyaXRlKHBoeSwgMHgyNSwgRFBI WV9UU1QpOworCisJbWl4ZWxfcGh5X3NldF9oc190aW1pbmdzKHBoeSk7CisJcmV0ID0gbWl4ZWxf ZHBoeV9zZXRfcGxsX3BhcmFtcyhwaHkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0Owor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZWxfZHBoeV92YWxpZGF0ZShzdHJ1Y3Qg cGh5ICpwaHksIGVudW0gcGh5X21vZGUgbW9kZSwgaW50IHN1Ym1vZGUsCisJCQkgICAgICAgdW5p b24gcGh5X2NvbmZpZ3VyZV9vcHRzICpvcHRzKQoreworCXN0cnVjdCBtaXhlbF9kcGh5X2NmZyBj ZmcgPSB7IDAgfTsKKworCWlmIChtb2RlICE9IFBIWV9NT0RFX01JUElfRFBIWSkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwlyZXR1cm4gbWl4ZWxfZHBoeV9jb25maWdfZnJvbV9vcHRzKHBoeSwgJm9w dHMtPm1pcGlfZHBoeSwgJmNmZyk7Cit9CisKKworc3RhdGljIGludCBtaXhlbF9kcGh5X2luaXQo c3RydWN0IHBoeSAqcGh5KQoreworCXBoeV93cml0ZShwaHksIFBXUl9PRkYsIERQSFlfUERfUExM KTsKKwlwaHlfd3JpdGUocGh5LCBQV1JfT0ZGLCBEUEhZX1BEX0RQSFkpOworCisJcmV0dXJuIDA7 Cit9CisKKworc3RhdGljIGludCBtaXhlbF9kcGh5X2V4aXQoc3RydWN0IHBoeSAqcGh5KQorewor CXBoeV93cml0ZShwaHksIDAsIERQSFlfQ00pOworCXBoeV93cml0ZShwaHksIDAsIERQSFlfQ04p OworCXBoeV93cml0ZShwaHksIDAsIERQSFlfQ08pOworCisJcmV0dXJuIDA7Cit9CisKKworc3Rh dGljIGludCBtaXhlbF9kcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qg bWl4ZWxfZHBoeV9wcml2ICpwcml2ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJdTMyIGxvY2tl ZDsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPnBoeV9yZWZf Y2xrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBoeV93cml0ZShwaHksIFBX Ul9PTiwgRFBIWV9QRF9QTEwpOworCXJldCA9IHJlZ21hcF9yZWFkX3BvbGxfdGltZW91dChwcml2 LT5yZWdzLCBEUEhZX0xPQ0ssIGxvY2tlZCwKKwkJCQkgICAgICAgbG9ja2VkLCBQTExfTE9DS19T TEVFUCwKKwkJCQkgICAgICAgUExMX0xPQ0tfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJ ZGV2X2VycigmcGh5LT5kZXYsICJDb3VsZCBub3QgZ2V0IERQSFkgbG9jayAoJWQpIVxuIiwgcmV0 KTsKKwkJZ290byBjbG9ja19kaXNhYmxlOworCX0KKwlwaHlfd3JpdGUocGh5LCBQV1JfT04sIERQ SFlfUERfRFBIWSk7CisKKwlyZXR1cm4gMDsKK2Nsb2NrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGVf dW5wcmVwYXJlKHByaXYtPnBoeV9yZWZfY2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IG1peGVsX2RwaHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3QgbWl4 ZWxfZHBoeV9wcml2ICpwcml2ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwlwaHlfd3JpdGUo cGh5LCBQV1JfT0ZGLCBEUEhZX1BEX1BMTCk7CisJcGh5X3dyaXRlKHBoeSwgUFdSX09GRiwgRFBI WV9QRF9EUEhZKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5waHlfcmVmX2Nsayk7 CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgbWl4ZWxf ZHBoeV9waHlfb3BzID0geworCS5pbml0ID0gbWl4ZWxfZHBoeV9pbml0LAorCS5leGl0ID0gbWl4 ZWxfZHBoeV9leGl0LAorCS5wb3dlcl9vbiA9IG1peGVsX2RwaHlfcG93ZXJfb24sCisJLnBvd2Vy X29mZiA9IG1peGVsX2RwaHlfcG93ZXJfb2ZmLAorCS5jb25maWd1cmUgPSBtaXhlbF9kcGh5X2Nv bmZpZ3VyZSwKKwkudmFsaWRhdGUgPSBtaXhlbF9kcGh5X3ZhbGlkYXRlLAorCS5vd25lciA9IFRI SVNfTU9EVUxFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWl4ZWxf ZHBoeV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWl4ZWwsaW14OG1xLW1pcGkt ZHBoeSIsCisJICAuZGF0YSA9ICZtaXhlbF9kcGh5X2RldmRhdGFbTUlYRUxfSU1YOE1RXSB9LAor CXsgLyogc2VudGluZWwgKi8gfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtaXhlbF9k cGh5X29mX21hdGNoKTsKKworc3RhdGljIGludCBtaXhlbF9kcGh5X3Byb2JlKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsK KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBwaHlfcHJv dmlkZXIgKnBoeV9wcm92aWRlcjsKKwlzdHJ1Y3QgbWl4ZWxfZHBoeV9wcml2ICpwcml2OworCXN0 cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwaHkgKnBoeTsKKwl2b2lkIF9faW9tZW0gKnJl Z3M7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXByaXYgPSBkZXZtX2t6YWxs b2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVy biAtRU5PTUVNOworCisJcHJpdi0+ZGV2ZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgm cGRldi0+ZGV2KTsKKwlpZiAoIXByaXYtPmRldmRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJ cmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwly ZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHJlZ3Mp KSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgbWFwIHRoZSBEUEhZIHJlZ2lzdGVyc1xuIik7 CisJCXJldHVybiBQVFJfRVJSKHJlZ3MpOworCX0KKworCXByaXYtPnJlZ3MgPSBkZXZtX3JlZ21h cF9pbml0X21taW8oJnBkZXYtPmRldiwgcmVncywKKwkJCQkJICAgJm1peGVsX2RwaHlfcmVnbWFw X2NvbmZpZyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdzKSkgeworCQlkZXZfZXJyKGRldiwgIkNv dWxkbid0IGNyZWF0ZSB0aGUgRFBIWSByZWdtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwcml2 LT5yZWdzKTsKKwl9CisKKwlwcml2LT5waHlfcmVmX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ ZGV2LCAicGh5X3JlZiIpOworCWlmIChJU19FUlIocHJpdi0+cGh5X3JlZl9jbGspKSB7CisJCWRl dl9lcnIoZGV2LCAiTm8gcGh5X3JlZiBjbG9jayBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJS KHByaXYtPnBoeV9yZWZfY2xrKTsKKwl9CisJZGV2X2RiZyhkZXYsICJwaHlfcmVmIGNsb2NrIHJh dGU6ICVsdVxuIiwKKwkJY2xrX2dldF9yYXRlKHByaXYtPnBoeV9yZWZfY2xrKSk7CisKKwlkZXZf c2V0X2RydmRhdGEoZGV2LCBwcml2KTsKKworCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIG5w LCAmbWl4ZWxfZHBoeV9waHlfb3BzKTsKKwlpZiAoSVNfRVJSKHBoeSkpIHsKKwkJZGV2X2Vycihk ZXYsICJGYWlsZWQgdG8gY3JlYXRlIHBoeSAlbGRcbiIsIFBUUl9FUlIocGh5KSk7CisJCXJldHVy biBQVFJfRVJSKHBoeSk7CisJfQorCXBoeV9zZXRfZHJ2ZGF0YShwaHksIHByaXYpOworCisJcGh5 X3Byb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2lt cGxlX3hsYXRlKTsKKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKK30K Kworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWl4ZWxfZHBoeV9kcml2ZXIgPSB7CisJ LnByb2JlCT0gbWl4ZWxfZHBoeV9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtaXhl bC1taXBpLWRwaHkiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBtaXhlbF9kcGh5X29mX21hdGNoLAor CX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1peGVsX2RwaHlfZHJpdmVyKTsKKworTU9E VUxFX0FVVEhPUigiTlhQIFNlbWljb25kdWN0b3IiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWl4 ZWwgTUlQSS1EU0kgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotLSAK Mi4yMC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpk cmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0 cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=