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: [v6,2/2] usb: typec: ucsi: add support for Cypress CCGx From: Heikki Krogerus Message-Id: <20180906112701.GD25121@kuha.fi.intel.com> Date: Thu, 6 Sep 2018 14:27:01 +0300 To: Ajay Gupta Cc: wsa@the-dreams.de, linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org List-ID: T24gV2VkLCBTZXAgMDUsIDIwMTggYXQgMDM6MjA6MjJQTSAtMDcwMCwgQWpheSBHdXB0YSB3cm90 ZToKPiBMYXRlc3QgTlZJRElBIEdQVSBjYXJkcyBoYXZlIGEgQ3lwcmVzcyBDQ0d4IFR5cGUtQyBj b250cm9sbGVyCj4gb3ZlciBJMkMgaW50ZXJmYWNlLgo+IAo+IFRoaXMgVUNTSSBJMkMgZHJpdmVy IHVzZXMgSTJDIGJ1cyBkcml2ZXIgaW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW5nCj4gd2l0aCBU eXBlLUMgY29udHJvbGxlci4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBBamF5IEd1cHRhIDxhamF5Z0Bu dmlkaWEuY29tPgoKQWNrZWQtYnk6IEhlaWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxp bnV4LmludGVsLmNvbT4KCj4gLS0tCj4gQ2hhbmdlcyBmcm9tIHYxIC0+IHYyCj4gCUZpeGVkIGlk ZW50YXRpb24gaW4gZHJpdmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnCj4gQ2hhbmdlcyBmcm9t IHYyIC0+IHYzCj4gCUZpeGVkIG1vc3Qgb2YgY29tbWVudHMgZnJvbSBIZWlra2kKPiAJUmVuYW1l IHVjc2lfaTJjX2NjZy5jIC0+IHVjc2lfY2NnLmMKPiBDaGFuZ2VzIGZyb20gdjMgLT4gdjQKPiAJ Rml4ZWQgY29tbWVudHMgZnJvbSBBbmR5Cj4gQ2hhbmdlcyBmcm9tIHY0IC0+IHY1Cj4gCUZpeGVk IGNvbW1lbnRzIGZyb20gQW5keQo+IENoYW5nZXMgZnJvbSB2NSAtPiB2Ngo+IAlGaXhlZCByZXZp ZXcgY29tbWVudHMgZnJvbSBHcmVnIAo+IAo+ICBkcml2ZXJzL3VzYi90eXBlYy91Y3NpL0tjb25m aWcgICAgfCAgMTAgKwo+ICBkcml2ZXJzL3VzYi90eXBlYy91Y3NpL01ha2VmaWxlICAgfCAgIDIg Kwo+ICBkcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfY2NnLmMgfCAzODIgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgMyBmaWxlcyBjaGFuZ2VkLCAzOTQgaW5zZXJ0 aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3Np X2NjZy5jCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvS2NvbmZpZyBi L2RyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvS2NvbmZpZwo+IGluZGV4IGUzNmQ2YzcuLjc4MTE4ODgg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnCj4gKysrIGIvZHJp dmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnCj4gQEAgLTIzLDYgKzIzLDE2IEBAIGNvbmZpZyBU WVBFQ19VQ1NJCj4gIAo+ICBpZiBUWVBFQ19VQ1NJCj4gIAo+ICtjb25maWcgVUNTSV9DQ0cKPiAr CXRyaXN0YXRlICJVQ1NJIEludGVyZmFjZSBEcml2ZXIgZm9yIEN5cHJlc3MgQ0NHeCIKPiArCWRl cGVuZHMgb24gSTJDCj4gKwloZWxwCj4gKwkgIFRoaXMgZHJpdmVyIGVuYWJsZXMgVUNTSSBzdXBw b3J0IG9uIHBsYXRmb3JtcyB0aGF0IGV4cG9zZSBhCj4gKwkgIEN5cHJlc3MgQ0NHeCBUeXBlLUMg Y29udHJvbGxlciBvdmVyIEkyQyBpbnRlcmZhY2UuCj4gKwo+ICsJICBUbyBjb21waWxlIHRoZSBk cml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQo+ICsJ ICBjYWxsZWQgdWNzaV9jY2cuCj4gKwo+ICBjb25maWcgVUNTSV9BQ1BJCj4gIAl0cmlzdGF0ZSAi VUNTSSBBQ1BJIEludGVyZmFjZSBEcml2ZXIiCj4gIAlkZXBlbmRzIG9uIEFDUEkKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvdHlwZWMvdWNzaS9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL3R5cGVj L3Vjc2kvTWFrZWZpbGUKPiBpbmRleCA3YWZiZWE1Li4yZjQ5MDBiIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvdXNiL3R5cGVjL3Vjc2kvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL3VzYi90eXBlYy91 Y3NpL01ha2VmaWxlCj4gQEAgLTgsMyArOCw1IEBAIHR5cGVjX3Vjc2kteQkJCTo9IHVjc2kubwo+ ICB0eXBlY191Y3NpLSQoQ09ORklHX1RSQUNJTkcpCSs9IHRyYWNlLm8KPiAgCj4gIG9iai0kKENP TkZJR19VQ1NJX0FDUEkpCQkrPSB1Y3NpX2FjcGkubwo+ICsKPiArb2JqLSQoQ09ORklHX1VDU0lf Q0NHKQkJKz0gdWNzaV9jY2cubwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi90eXBlYy91Y3Np L3Vjc2lfY2NnLmMgYi9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfY2NnLmMKPiBuZXcgZmls ZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjY1MjkyYmYKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3NpX2NjZy5jCj4gQEAgLTAsMCArMSwzODIg QEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogVUNT SSBkcml2ZXIgZm9yIEN5cHJlc3MgQ0NHeCBUeXBlLUMgY29udHJvbGxlcgo+ICsgKgo+ICsgKiBD b3B5cmlnaHQgKEMpIDIwMTctMjAxOCBOVklESUEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVz ZXJ2ZWQuCj4gKyAqIEF1dGhvcjogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4KPiArICoK PiArICogU29tZSBjb2RlIGJvcnJvd2VkIGZyb20gZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3Np X2FjcGkuYwo+ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiArI2luY2x1ZGUgPGxp bnV4L2RlbGF5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGNpLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4KPiArCj4gKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Cj4gKyNp bmNsdWRlICJ1Y3NpLmgiCj4gKwo+ICtzdHJ1Y3QgdWNzaV9jY2cgewo+ICsJc3RydWN0IGRldmlj ZSAqZGV2Owo+ICsJc3RydWN0IHVjc2kgKnVjc2k7Cj4gKwlzdHJ1Y3QgdWNzaV9wcG0gcHBtOwo+ ICsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKPiArCWludCBpcnE7Cj4gK307Cj4gKwo+ICsj ZGVmaW5lIENDR1hfSTJDX1JBQl9ERVZJQ0VfTU9ERQkJCTB4MDAKPiArI2RlZmluZSBDQ0dYX0ky Q19SQUJfUkVBRF9TSUxJQ09OX0lECQkJMHgyCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX0lOVFJf UkVHCQkJCTB4MDYKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfRlcxX1ZFUlNJT04JCQkweDI4Cj4g KyNkZWZpbmUgQ0NHWF9JMkNfUkFCX0ZXMl9WRVJTSU9OCQkJMHgyMAo+ICsjZGVmaW5lIENDR1hf STJDX1JBQl9VQ1NJX0NPTlRST0wJCQkweDM5Cj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lf Q09OVFJPTF9TVEFSVAkJCUJJVCgwKQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9VQ1NJX0NPTlRS T0xfU1RPUAkJCUJJVCgxKQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRVNQT05TRV9SRUcJCQkw eDdFCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lfREFUQV9CTE9DSwkJCTB4ZjAwMAo+ICsK PiArc3RhdGljIGludCBjY2dfcmVhZChzdHJ1Y3QgdWNzaV9jY2cgKnVjLCB1MTYgcmFiLCB1OCAq ZGF0YSwgdTMyIGxlbikKPiArewo+ICsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVjLT5j bGllbnQ7Cj4gKwl1bnNpZ25lZCBjaGFyICpidWY7Cj4gKwlzdHJ1Y3QgaTJjX21zZyAqbXNnczsK PiArCXUzMiBybGVuLCByZW1fbGVuID0gbGVuOwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwlidWYg PSBremFsbG9jKDIsIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFidWYpCj4gKwkJcmV0dXJuIC1FTk9N RU07Cj4gKwo+ICsJbXNncyA9IGtjYWxsb2MoMiwgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSwgR0ZQ X0tFUk5FTCk7Cj4gKwlpZiAoIW1zZ3MpIHsKPiArCQlrZnJlZShidWYpOwo+ICsJCXJldHVybiAt RU5PTUVNOwo+ICsJfQo+ICsKPiArCW1zZ3NbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKPiArCW1z Z3NbMF0ubGVuID0gMjsKPiArCW1zZ3NbMF0uYnVmID0gYnVmOwo+ICsJbXNnc1sxXS5hZGRyID0g Y2xpZW50LT5hZGRyOwo+ICsJbXNnc1sxXS5mbGFncyA9IEkyQ19NX1JEOwo+ICsKPiArCXdoaWxl IChyZW1fbGVuID4gMCkgewo+ICsJCW1zZ3NbMV0uYnVmID0gJmRhdGFbbGVuIC0gcmVtX2xlbl07 Cj4gKwkJcmxlbiA9IG1pbl90KHUxNiwgcmVtX2xlbiwgNCk7Cj4gKwkJbXNnc1sxXS5sZW4gPSBy bGVuOwo+ICsJCXB1dF91bmFsaWduZWRfbGUxNihyYWIsIGJ1Zik7Cj4gKwkJc3RhdHVzID0gaTJj X3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMik7Cj4gKwkJaWYgKHN0YXR1cyA8IDAp IHsKPiArCQkJZGV2X2Vycih1Yy0+ZGV2LCAiaTJjX3RyYW5zZmVyIGZhaWxlZCAlZCIsIHN0YXR1 cyk7Cj4gKwkJCWtmcmVlKGJ1Zik7Cj4gKwkJCWtmcmVlKG1zZ3MpOwo+ICsJCQlyZXR1cm4gc3Rh dHVzOwo+ICsJCX0KPiArCQlyYWIgKz0gcmxlbjsKPiArCQlyZW1fbGVuIC09IHJsZW47Cj4gKwl9 Cj4gKwo+ICsJa2ZyZWUoYnVmKTsKPiArCWtmcmVlKG1zZ3MpOwo+ICsJcmV0dXJuIDA7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgY2NnX3dyaXRlKHN0cnVjdCB1Y3NpX2NjZyAqdWMsIHUxNiByYWIs IHU4ICpkYXRhLCB1MzIgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0g dWMtPmNsaWVudDsKPiArCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKPiArCXN0cnVjdCBpMmNfbXNnICpt c2dzOwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwlidWYgPSBremFsbG9jKDIsIEdGUF9LRVJORUwp Owo+ICsJaWYgKCFidWYpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJbXNncyA9IGtjYWxs b2MoMywgc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW1zZ3Mp IHsKPiArCQlrZnJlZShidWYpOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ICsKPiArCW1z Z3NbMF0uYWRkciA9IGNsaWVudC0+YWRkcjsKPiArCW1zZ3NbMF0ubGVuID0gMjsKPiArCW1zZ3Nb MF0uYnVmID0gYnVmOwo+ICsJbXNnc1sxXS5hZGRyID0gY2xpZW50LT5hZGRyOwo+ICsJbXNnc1sx XS5sZW4gPSBsZW47Cj4gKwltc2dzWzFdLmJ1ZiA9IGRhdGE7Cj4gKwltc2dzWzJdLmFkZHIgPSBj bGllbnQtPmFkZHI7Cj4gKwltc2dzWzJdLmZsYWdzID0gSTJDX01fU1RPUDsKPiArCj4gKwlwdXRf dW5hbGlnbmVkX2xlMTYocmFiLCBidWYpOwo+ICsJc3RhdHVzID0gaTJjX3RyYW5zZmVyKGNsaWVu dC0+YWRhcHRlciwgbXNncywgMyk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkgewo+ICsJCWRldl9lcnIo dWMtPmRldiwgImkyY190cmFuc2ZlciBmYWlsZWQgJWQiLCBzdGF0dXMpOwo+ICsJCWtmcmVlKGJ1 Zik7Cj4gKwkJa2ZyZWUobXNncyk7Cj4gKwkJcmV0dXJuIHN0YXR1czsKPiArCX0KPiArCj4gKwlr ZnJlZShidWYpOwo+ICsJa2ZyZWUobXNncyk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3Rh dGljIGludCB1Y3NpX2NjZ19pbml0KHN0cnVjdCB1Y3NpX2NjZyAqdWMpCj4gK3sKPiArCXN0cnVj dCBkZXZpY2UgKmRldiA9IHVjLT5kZXY7Cj4gKwl1bnNpZ25lZCBpbnQgY291bnQgPSAxMDsKPiAr CXU4ICpkYXRhOwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwlkYXRhID0ga3phbGxvYyg2NCwgR0ZQ X0tFUk5FTCk7Cj4gKwlpZiAoIWRhdGEpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJLyoK PiArCSAqIFNlbGVjdGl2ZWx5IGlzc3VlIGRldmljZSByZXNldAo+ICsJICogLSBpZiBSRVNQT05T RSByZWdpc3RlciBpcyBSRVNFVF9DT01QTEVURSwgZG8gbm90IGlzc3VlIGRldmljZSByZXNldAo+ ICsJICogICAod2lsbCBjYXVzZSB1c2IgZGV2aWNlIGRpc2Nvbm5lY3QgLyByZWNvbm5lY3QpCj4g KwkgKiAtIGlmIFJFU1BPTlNFIHJlZ2lzdGVyIGlzIG5vdCBSRVNFVF9DT01QTEVURSwgaXNzdWUg ZGV2aWNlIHJlc2V0Cj4gKwkgKiAgIChjYXVzZXMgUFBDIHRvIHJlc3luYyBkZXZpY2UgY29ubmVj dCBzdGF0ZSBieSByZS1pc3N1aW5nCj4gKwkgKiAgIHNldCBtdXggY29tbWFuZCkKPiArCSAqLwo+ ICsJZGF0YVswXSA9IDB4MDA7Cj4gKwlkYXRhWzFdID0gMHgwMDsKPiArCj4gKwlzdGF0dXMgPSBj Y2dfcmVhZCh1YywgQ0NHWF9JMkNfUkFCX1JFU1BPTlNFX1JFRywgZGF0YSwgMHgyKTsKPiArCWlm IChzdGF0dXMgPCAwKQo+ICsJCWdvdG8gZnJlZV9tZW07Cj4gKwo+ICsJbWVtc2V0KGRhdGEsIDAs IDY0KTsKPiArCXN0YXR1cyA9IGNjZ19yZWFkKHVjLCBDQ0dYX0kyQ19SQUJfREVWSUNFX01PREUs IGRhdGEsIHNpemVvZihkYXRhKSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGZyZWVf bWVtOwo+ICsKPiArCWRldl9kYmcoZGV2LCAiU2lsaWNvbiBpZCAlMnBoIiwgZGF0YSArIENDR1hf STJDX1JBQl9SRUFEX1NJTElDT05fSUQpOwo+ICsJZGV2X2RiZyhkZXYsICJGVzEgdmVyc2lvbiAl OHBoXG4iLCBkYXRhICsgQ0NHWF9JMkNfUkFCX0ZXMV9WRVJTSU9OKTsKPiArCWRldl9kYmcoZGV2 LCAiRlcyIHZlcnNpb24gJThwaFxuIiwgZGF0YSArIENDR1hfSTJDX1JBQl9GVzJfVkVSU0lPTik7 Cj4gKwo+ICsJZGF0YVswXSA9IDB4MDsKPiArCWRhdGFbMV0gPSAweDA7Cj4gKwlzdGF0dXMgPSBj Y2dfcmVhZCh1YywgQ0NHWF9JMkNfUkFCX1JFU1BPTlNFX1JFRywgZGF0YSwgMHgyKTsKPiArCWlm IChzdGF0dXMgPCAwKQo+ICsJCWdvdG8gZnJlZV9tZW07Cj4gKwo+ICsJZGF0YVswXSA9IENDR1hf STJDX1JBQl9VQ1NJX0NPTlRST0xfU1RPUDsKPiArCXN0YXR1cyA9IGNjZ193cml0ZSh1YywgQ0NH WF9JMkNfUkFCX1VDU0lfQ09OVFJPTCwgZGF0YSwgMHgxKTsKPiArCWlmIChzdGF0dXMgPCAwKQo+ ICsJCWdvdG8gZnJlZV9tZW07Cj4gKwo+ICsJZGF0YVswXSA9IENDR1hfSTJDX1JBQl9VQ1NJX0NP TlRST0xfU1RBUlQ7Cj4gKwlzdGF0dXMgPSBjY2dfd3JpdGUodWMsIENDR1hfSTJDX1JBQl9VQ1NJ X0NPTlRST0wsIGRhdGEsIDB4MSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGZyZWVf bWVtOwo+ICsKPiArCS8qCj4gKwkgKiBGbHVzaCBDQ0d4IFJFU1BPTlNFIHF1ZXVlIGJ5IGFja2lu ZyBpbnRlcnJ1cHRzCj4gKwkgKiAtIGFib3ZlIHVjc2kgY29udHJvbCByZWdpc3RlciB3cml0ZSB3 aWxsIHB1c2ggcmVzcG9uc2UKPiArCSAqIHdoaWNoIG11c3QgYmUgZmx1c2hlZAo+ICsJICogLSBh ZmZlY3RzIGYvdyB1cGRhdGUgd2hpY2ggcmVhZHMgcmVzcG9uc2UgcmVnaXN0ZXIKPiArCSAqLwo+ ICsJZGF0YVswXSA9IDB4ZmY7Cj4gKwlkbyB7Cj4gKwkJc3RhdHVzID0gY2NnX3dyaXRlKHVjLCBD Q0dYX0kyQ19SQUJfSU5UUl9SRUcsIGRhdGEsIDB4MSk7Cj4gKwkJaWYgKHN0YXR1cyA8IDApCj4g KwkJCWdvdG8gZnJlZV9tZW07Cj4gKwo+ICsJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTEwMDApOwo+ ICsKPiArCQlzdGF0dXMgPSBjY2dfcmVhZCh1YywgQ0NHWF9JMkNfUkFCX0lOVFJfUkVHLCBkYXRh LCAweDEpOwo+ICsJCWlmIChzdGF0dXMgPCAwKQo+ICsJCQlnb3RvIGZyZWVfbWVtOwo+ICsJfSB3 aGlsZSAoKGRhdGFbMF0gIT0gMHgwMCkgJiYgY291bnQtLSk7Cj4gKwo+ICtmcmVlX21lbToKPiAr CWtmcmVlKGRhdGEpOwo+ICsJcmV0dXJuIHN0YXR1czsKPiArfQo+ICsKPiArc3RhdGljIGludCB1 Y3NpX2NjZ19zZW5kX2RhdGEoc3RydWN0IHVjc2lfY2NnICp1YykKPiArewo+ICsJaW50IHN0YXR1 czsKPiArCXVuc2lnbmVkIGNoYXIgYnVmWzRdID0gewo+ICsJCTB4MjAsIENDR1hfSTJDX1JBQl9V Q1NJX0RBVEFfQkxPQ0sgPj4gOCwKPiArCQkweDgsIENDR1hfSTJDX1JBQl9VQ1NJX0RBVEFfQkxP Q0sgPj4gOCwKPiArCX07Cj4gKwl1bnNpZ25lZCBjaGFyICpidWYxOwo+ICsJdW5zaWduZWQgY2hh ciAqYnVmMjsKPiArCj4gKwlidWYxID0ga3phbGxvYygxNiwgR0ZQX0tFUk5FTCk7Cj4gKwlpZiAo IWJ1ZjEpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJYnVmMiA9IGt6YWxsb2MoOCwgR0ZQ X0tFUk5FTCk7Cj4gKwlpZiAoIWJ1ZjIpIHsKPiArCQlrZnJlZShidWYxKTsKPiArCQlyZXR1cm4g LUVOT01FTTsKPiArCX0KPiArCj4gKwltZW1jcHkoYnVmMSwgKChjb25zdCB2b2lkICopdWMtPnBw bS5kYXRhKSArIDB4MjAsIDE2KTsKPiArCW1lbWNweShidWYyLCAoKGNvbnN0IHZvaWQgKil1Yy0+ cHBtLmRhdGEpICsgMHg4LCA4KTsKPiArCj4gKwlzdGF0dXMgPSBjY2dfd3JpdGUodWMsICoodTE2 ICopYnVmLCBidWYxLCAxNik7Cj4gKwlpZiAoc3RhdHVzIDwgMCkKPiArCQlnb3RvIGZyZWVfbWVt Owo+ICsKPiArCXN0YXR1cyA9IGNjZ193cml0ZSh1YywgKih1MTYgKikoYnVmICsgMiksIGJ1ZjIs IDgpOwo+ICsKPiArZnJlZV9tZW06Cj4gKwlrZnJlZShidWYxKTsKPiArCWtmcmVlKGJ1ZjIpOwo+ ICsJcmV0dXJuIHN0YXR1czsKPiArfQo+ICsKPiArc3RhdGljIGludCB1Y3NpX2NjZ19yZWN2X2Rh dGEoc3RydWN0IHVjc2lfY2NnICp1YykKPiArewo+ICsJdTggKnBwbSA9ICh1OCAqKXVjLT5wcG0u ZGF0YTsKPiArCWludCBzdGF0dXM7Cj4gKwl1bnNpZ25lZCBjaGFyIGJ1Zls2XSA9IHsKPiArCQkw eDAsIENDR1hfSTJDX1JBQl9VQ1NJX0RBVEFfQkxPQ0sgPj4gOCwKPiArCQkweDQsIENDR1hfSTJD X1JBQl9VQ1NJX0RBVEFfQkxPQ0sgPj4gOCwKPiArCQkweDEwLCBDQ0dYX0kyQ19SQUJfVUNTSV9E QVRBX0JMT0NLID4+IDgsCj4gKwl9Owo+ICsKPiArCXN0YXR1cyA9IGNjZ19yZWFkKHVjLCAqKHUx NiAqKWJ1ZiwgcHBtLCAweDIpOwo+ICsJaWYgKHN0YXR1cyA8IDApCj4gKwkJcmV0dXJuIHN0YXR1 czsKPiArCj4gKwlzdGF0dXMgPSBjY2dfcmVhZCh1YywgKih1MTYgKikoYnVmICsgMiksIHBwbSAr IDB4NCwgMHg0KTsKPiArCWlmIChzdGF0dXMgPCAwKQo+ICsJCXJldHVybiBzdGF0dXM7Cj4gKwo+ ICsJcmV0dXJuIGNjZ19yZWFkKHVjLCAqKHUxNiAqKShidWYgKyA0KSwgcHBtICsgMHgxMCwgMHgx MCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdWNzaV9jY2dfYWNrX2ludGVycnVwdChzdHJ1Y3Qg dWNzaV9jY2cgKnVjKQo+ICt7Cj4gKwlpbnQgc3RhdHVzOwo+ICsJdW5zaWduZWQgY2hhciBidWZb Ml0gPSB7Cj4gKwkJQ0NHWF9JMkNfUkFCX0lOVFJfUkVHLCBDQ0dYX0kyQ19SQUJfSU5UUl9SRUcg Pj4gOH07Cj4gKwl1bnNpZ25lZCBjaGFyICpidWYyOwo+ICsKPiArCWJ1ZjIgPSBremFsbG9jKDEs IEdGUF9LRVJORUwpOwo+ICsJaWYgKCFidWYyKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiAr CXN0YXR1cyA9IGNjZ19yZWFkKHVjLCAqKHUxNiAqKWJ1ZiwgYnVmMiwgMHgxKTsKPiArCWlmIChz dGF0dXMgPCAwKQo+ICsJCWdvdG8gZnJlZV9tZW07Cj4gKwo+ICsJc3RhdHVzID0gY2NnX3dyaXRl KHVjLCAqKHUxNiAqKWJ1ZiwgYnVmMiwgMHgxKTsKPiArCj4gK2ZyZWVfbWVtOgo+ICsJa2ZyZWUo YnVmMik7Cj4gKwlyZXR1cm4gc3RhdHVzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfY2Nn X3N5bmMoc3RydWN0IHVjc2lfcHBtICpwcG0pCj4gK3sKPiArCXN0cnVjdCB1Y3NpX2NjZyAqdWMg PSBjb250YWluZXJfb2YocHBtLCBzdHJ1Y3QgdWNzaV9jY2csIHBwbSk7Cj4gKwlpbnQgc3RhdHVz Owo+ICsKPiArCXN0YXR1cyA9IHVjc2lfY2NnX3JlY3ZfZGF0YSh1Yyk7Cj4gKwlpZiAoc3RhdHVz IDwgMCkKPiArCQlyZXR1cm4gc3RhdHVzOwo+ICsKPiArCS8qIGFjayBpbnRlcnJ1cHQgdG8gYWxs b3cgbmV4dCBjb21tYW5kIHRvIHJ1biAqLwo+ICsJcmV0dXJuIHVjc2lfY2NnX2Fja19pbnRlcnJ1 cHQodWMpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfY2NnX2NtZChzdHJ1Y3QgdWNzaV9w cG0gKnBwbSwgc3RydWN0IHVjc2lfY29udHJvbCAqY3RybCkKPiArewo+ICsJc3RydWN0IHVjc2lf Y2NnICp1YyA9IGNvbnRhaW5lcl9vZihwcG0sIHN0cnVjdCB1Y3NpX2NjZywgcHBtKTsKPiArCj4g KwlwcG0tPmRhdGEtPmN0cmwucmF3X2NtZCA9IGN0cmwtPnJhd19jbWQ7Cj4gKwlyZXR1cm4gdWNz aV9jY2dfc2VuZF9kYXRhKHVjKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJldHVybl90IGNjZ19p cnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgdWNzaV9jY2cg KnVjID0gZGF0YTsKPiArCj4gKwl1Y3NpX25vdGlmeSh1Yy0+dWNzaSk7Cj4gKwo+ICsJcmV0dXJu IElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfY2NnX3Byb2JlKHN0cnVj dCBpMmNfY2xpZW50ICpjbGllbnQsCj4gKwkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQg KmlkKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4gKwlzdHJ1 Y3QgdWNzaV9jY2cgKnVjOwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwl1YyA9IGRldm1fa3phbGxv YyhkZXYsIHNpemVvZigqdWMpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdWMpCj4gKwkJcmV0dXJu IC1FTk9NRU07Cj4gKwo+ICsJdWMtPnBwbS5kYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9m KHN0cnVjdCB1Y3NpX2RhdGEpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdWMtPnBwbS5kYXRhKQo+ ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXVjLT5wcG0uY21kID0gdWNzaV9jY2dfY21kOwo+ ICsJdWMtPnBwbS5zeW5jID0gdWNzaV9jY2dfc3luYzsKPiArCXVjLT5kZXYgPSBkZXY7Cj4gKwl1 Yy0+Y2xpZW50ID0gY2xpZW50Owo+ICsKPiArCS8qIHJlc2V0IGNjZyBkZXZpY2UgYW5kIGluaXRp YWxpemUgdWNzaSAqLwo+ICsJc3RhdHVzID0gdWNzaV9jY2dfaW5pdCh1Yyk7Cj4gKwlpZiAoc3Rh dHVzIDwgMCkgewo+ICsJCWRldl9lcnIodWMtPmRldiwgInVjc2lfY2NnX2luaXQgZmFpbGVkIC0g JWRcbiIsIHN0YXR1cyk7Cj4gKwkJcmV0dXJuIHN0YXR1czsKPiArCX0KPiArCj4gKwl1Yy0+aXJx ID0gY2xpZW50LT5pcnE7Cj4gKwo+ICsJc3RhdHVzID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2ly cShkZXYsIHVjLT5pcnEsIE5VTEwsIGNjZ19pcnFfaGFuZGxlciwKPiArCQkJCQkgICBJUlFGX09O RVNIT1QgfCBJUlFGX1RSSUdHRVJfSElHSCwKPiArCQkJCQkgICBkZXZfbmFtZShkZXYpLCB1Yyk7 Cj4gKwlpZiAoc3RhdHVzIDwgMCkgewo+ICsJCWRldl9lcnIodWMtPmRldiwgInJlcXVlc3RfdGhy ZWFkZWRfaXJxIGZhaWxlZCAtICVkXG4iLCBzdGF0dXMpOwo+ICsJCXJldHVybiBzdGF0dXM7Cj4g Kwl9Cj4gKwo+ICsJdWMtPnVjc2kgPSB1Y3NpX3JlZ2lzdGVyX3BwbShkZXYsICZ1Yy0+cHBtKTsK PiArCWlmIChJU19FUlIodWMtPnVjc2kpKSB7Cj4gKwkJZGV2X2Vycih1Yy0+ZGV2LCAidWNzaV9y ZWdpc3Rlcl9wcG0gZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gUFRSX0VSUih1Yy0+dWNzaSk7Cj4g Kwl9Cj4gKwo+ICsJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdWMpOwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdWNzaV9jY2dfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50 ICpjbGllbnQpCj4gK3sKPiArCXN0cnVjdCB1Y3NpX2NjZyAqdWMgPSBpMmNfZ2V0X2NsaWVudGRh dGEoY2xpZW50KTsKPiArCj4gKwl1Y3NpX3VucmVnaXN0ZXJfcHBtKHVjLT51Y3NpKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lk IHVjc2lfY2NnX2RldmljZV9pZFtdID0gewo+ICsJeyJjY2d4LXVjc2kiLCAwfSwKPiArCXt9Cj4g K307Cj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB1Y3NpX2NjZ19kZXZpY2VfaWQpOwo+ICsK PiArc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHVjc2lfY2NnX2RyaXZlciA9IHsKPiArCS5kcml2 ZXIgPSB7Cj4gKwkJLm5hbWUgPSAidWNzaV9jY2ciLAo+ICsJfSwKPiArCS5wcm9iZSA9IHVjc2lf Y2NnX3Byb2JlLAo+ICsJLnJlbW92ZSA9IHVjc2lfY2NnX3JlbW92ZSwKPiArCS5pZF90YWJsZSA9 IHVjc2lfY2NnX2RldmljZV9pZCwKPiArfTsKPiArCj4gK21vZHVsZV9pMmNfZHJpdmVyKHVjc2lf Y2NnX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVfQVVUSE9SKCJBamF5IEd1cHRhIDxhamF5Z0Budmlk aWEuY29tPiIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIlVDU0kgZHJpdmVyIGZvciBDeXByZXNz IENDR3ggVHlwZS1DIGNvbnRyb2xsZXIiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ IC0tIAo+IDIuNy40Cg==