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,2/2] usb: typec: ucsi: add support for Cypress CCGx From: Ajay Gupta Message-Id: <1535746941-7660-2-git-send-email-ajayg@nvidia.com> Date: Fri, 31 Aug 2018 13:22:21 -0700 To: wsa@the-dreams.de, heikki.krogerus@linux.intel.com Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, Ajay Gupta List-ID: TGF0ZXN0IE5WSURJQSBHUFUgY2FyZHMgaGF2ZSBhIEN5cHJlc3MgQ0NHeCBUeXBlLUMgY29udHJv bGxlcgpvdmVyIEkyQyBpbnRlcmZhY2UuCgpUaGlzIFVDU0kgSTJDIGRyaXZlciB1c2VzIEkyQyBi dXMgZHJpdmVyIGludGVyZmFjZSBmb3IgY29tbXVuaWNhdGluZwp3aXRoIFR5cGUtQyBjb250cm9s bGVyLgoKU2lnbmVkLW9mZi1ieTogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4KLS0tCkNo YW5nZXMgZnJvbSB2MSAtPiB2MgoJRml4ZWQgaWRlbnRhdGlvbiBpbiBkcml2ZXJzL3VzYi90eXBl Yy91Y3NpL0tjb25maWcKQ2hhbmdlcyBmcm9tIHYyIC0+IHYzCglGaXhlZCBtb3N0IG9mIGNvbW1l bnRzIGZyb20gSGVpa2tpCglSZW5hbWUgdWNzaV9pMmNfY2NnLmMgLT4gdWNzaV9jY2cuYwpDaGFu Z2VzIGZyb20gdjMgLT4gdjQKCUZpeGVkIGNvbW1lbnRzIGZyb20gQW5keQpDaGFuZ2VzIGZyb20g djQgLT4gdjUKCUZpeGVkIGNvbW1lbnRzIGZyb20gQW5keQoKIGRyaXZlcnMvdXNiL3R5cGVjL3Vj c2kvS2NvbmZpZyAgICB8ICAxMCArCiBkcml2ZXJzL3VzYi90eXBlYy91Y3NpL01ha2VmaWxlICAg fCAgIDIgKwogZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3NpX2NjZy5jIHwgMzkwICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDQwMiBpbnNl cnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3Np X2NjZy5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnIGIvZHJp dmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnCmluZGV4IGUzNmQ2YzcuLjc4MTE4ODggMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi90 eXBlYy91Y3NpL0tjb25maWcKQEAgLTIzLDYgKzIzLDE2IEBAIGNvbmZpZyBUWVBFQ19VQ1NJCiAK IGlmIFRZUEVDX1VDU0kKIAorY29uZmlnIFVDU0lfQ0NHCisJdHJpc3RhdGUgIlVDU0kgSW50ZXJm YWNlIERyaXZlciBmb3IgQ3lwcmVzcyBDQ0d4IgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAg VGhpcyBkcml2ZXIgZW5hYmxlcyBVQ1NJIHN1cHBvcnQgb24gcGxhdGZvcm1zIHRoYXQgZXhwb3Nl IGEKKwkgIEN5cHJlc3MgQ0NHeCBUeXBlLUMgY29udHJvbGxlciBvdmVyIEkyQyBpbnRlcmZhY2Uu CisKKwkgIFRvIGNvbXBpbGUgdGhlIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTog dGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdWNzaV9jY2cuCisKIGNvbmZpZyBVQ1NJX0FD UEkKIAl0cmlzdGF0ZSAiVUNTSSBBQ1BJIEludGVyZmFjZSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBB Q1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL01ha2VmaWxlIGIvZHJpdmVy cy91c2IvdHlwZWMvdWNzaS9NYWtlZmlsZQppbmRleCA3YWZiZWE1Li4yZjQ5MDBiIDEwMDY0NAot LS0gYS9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3R5 cGVjL3Vjc2kvTWFrZWZpbGUKQEAgLTgsMyArOCw1IEBAIHR5cGVjX3Vjc2kteQkJCTo9IHVjc2ku bwogdHlwZWNfdWNzaS0kKENPTkZJR19UUkFDSU5HKQkrPSB0cmFjZS5vCiAKIG9iai0kKENPTkZJ R19VQ1NJX0FDUEkpCQkrPSB1Y3NpX2FjcGkubworCitvYmotJChDT05GSUdfVUNTSV9DQ0cpCQkr PSB1Y3NpX2NjZy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfY2Nn LmMgYi9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfY2NnLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uMWU3YzNiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNi L3R5cGVjL3Vjc2kvdWNzaV9jY2cuYwpAQCAtMCwwICsxLDM5MCBAQAorLy8gU1BEWC1MaWNlbnNl LUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBVQ1NJIGRyaXZlciBmb3IgQ3lwcmVzcyBDQ0d4 IFR5cGUtQyBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggTlZJRElB IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBBamF5IEd1cHRh IDxhamF5Z0BudmlkaWEuY29tPgorICoKKyAqIFNvbWUgY29kZSBib3Jyb3dlZCBmcm9tIGRyaXZl cnMvdXNiL3R5cGVjL3Vjc2kvdWNzaV9hY3BpLmMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2FjcGku aD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2lu Y2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgor I2luY2x1ZGUgInVjc2kuaCIKKworc3RydWN0IHVjc2lfY2NnIHsKKwlzdHJ1Y3QgZGV2aWNlICpk ZXY7CisJc3RydWN0IHVjc2kgKnVjc2k7CisJc3RydWN0IHVjc2lfcHBtIHBwbTsKKwlzdHJ1Y3Qg aTJjX2NsaWVudCAqY2xpZW50OworCWludCBpcnE7Cit9OworCisjZGVmaW5lIENDR1hfSTJDX1JB Ql9ERVZJQ0VfTU9ERQkJCTB4MDAKKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1JFQURfU0lMSUNPTl9J RAkJCTB4MgorI2RlZmluZSBDQ0dYX0kyQ19SQUJfSU5UUl9SRUcJCQkJMHgwNgorI2RlZmluZSBD Q0dYX0kyQ19SQUJfRlcxX1ZFUlNJT04JCQkweDI4CisjZGVmaW5lIENDR1hfSTJDX1JBQl9GVzJf VkVSU0lPTgkJCTB4MjAKKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTAkJCTB4MzkK KyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTF9TVEFSVAkJCUJJVCgwKQorI2RlZmlu ZSBDQ0dYX0kyQ19SQUJfVUNTSV9DT05UUk9MX1NUT1AJCQlCSVQoMSkKKyNkZWZpbmUgQ0NHWF9J MkNfUkFCX1JFU1BPTlNFX1JFRwkJCTB4N0UKKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lfREFU QV9CTE9DSwkJCTB4ZjAwMAorCitzdGF0aWMgaW50IGNjZ19yZWFkKHN0cnVjdCB1Y3NpX2NjZyAq dWMsIHUxNiByYWIsIHU4ICpkYXRhLCB1MzIgbGVuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9 IHVjLT5kZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVjLT5jbGllbnQ7CisJdW5z aWduZWQgY2hhciBidWZbMl07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQku YWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyAgPSAweDAsCisJCQkubGVuCT0gMHgyLAor CQkJLmJ1Zgk9IGJ1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBjbGllbnQtPmFkZHIsCisJCQku ZmxhZ3MgID0gSTJDX01fUkQsCisJCQkuYnVmCT0gZGF0YSwKKwkJfSwKKwl9OworCXUzMiBybGVu LCByZW1fbGVuID0gbGVuOworCWludCBlcnI7CisKKwl3aGlsZSAocmVtX2xlbiA+IDApIHsKKwkJ bXNnc1sxXS5idWYgPSAmZGF0YVtsZW4gLSByZW1fbGVuXTsKKwkJcmxlbiA9IG1pbl90KHUxNiwg cmVtX2xlbiwgNCk7CisJCW1zZ3NbMV0ubGVuID0gcmxlbjsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2 KHJhYiwgYnVmKTsKKwkJZXJyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywg QVJSQVlfU0laRShtc2dzKSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImky Y190cmFuc2ZlciBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0K KwkJcmFiICs9IHJsZW47CisJCXJlbV9sZW4gLT0gcmxlbjsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBjY2dfd3JpdGUoc3RydWN0IHVjc2lfY2NnICp1YywgdTE2IHJhYiwgdTgg KmRhdGEsIHUzMiBsZW4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdWMtPmRldjsKKwlzdHJ1 Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdWMtPmNsaWVudDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zlsy XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyCT0gY2xpZW50LT5h ZGRyLAorCQkJLmZsYWdzICA9IDB4MCwKKwkJCS5sZW4JPSAweDIsCisJCQkuYnVmCT0gYnVmLAor CQl9LAorCQl7CisJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyAgPSAweDAsCisJ CQkuYnVmCT0gZGF0YSwKKwkJCS5sZW4JPSBsZW4sCisJCX0sCisJCXsKKwkJCS5hZGRyCT0gY2xp ZW50LT5hZGRyLAorCQkJLmZsYWdzICA9IEkyQ19NX1NUT1AsCisJCX0sCisJfTsKKwlpbnQgZXJy OworCisJcHV0X3VuYWxpZ25lZF9sZTE2KHJhYiwgYnVmKTsKKwllcnIgPSBpMmNfdHJhbnNmZXIo Y2xpZW50LT5hZGFwdGVyLCBtc2dzLCBBUlJBWV9TSVpFKG1zZ3MpKTsKKwlpZiAoZXJyIDwgMCkg eworCQlkZXZfZXJyKGRldiwgImkyY190cmFuc2ZlciBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsK KwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Y3NpX2Nj Z19pbml0KHN0cnVjdCB1Y3NpX2NjZyAqdWMpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gdWMt PmRldjsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAxMDsKKwl1OCBkYXRhWzY0XTsKKwlpbnQgZXJy OworCisJLyoKKwkgKiBTZWxlY3RpdmVseSBpc3N1ZSBkZXZpY2UgcmVzZXQKKwkgKiAtIGlmIFJF U1BPTlNFIHJlZ2lzdGVyIGlzIFJFU0VUX0NPTVBMRVRFLCBkbyBub3QgaXNzdWUgZGV2aWNlIHJl c2V0CisJICogICAod2lsbCBjYXVzZSB1c2IgZGV2aWNlIGRpc2Nvbm5lY3QgLyByZWNvbm5lY3Qp CisJICogLSBpZiBSRVNQT05TRSByZWdpc3RlciBpcyBub3QgUkVTRVRfQ09NUExFVEUsIGlzc3Vl IGRldmljZSByZXNldAorCSAqICAgKGNhdXNlcyBQUEMgdG8gcmVzeW5jIGRldmljZSBjb25uZWN0 IHN0YXRlIGJ5IHJlLWlzc3VpbmcKKwkgKiAgIHNldCBtdXggY29tbWFuZCkKKwkgKi8KKwlkYXRh WzBdID0gMHgwMDsKKwlkYXRhWzFdID0gMHgwMDsKKworCWVyciA9IGNjZ19yZWFkKHVjLCBDQ0dY X0kyQ19SQUJfUkVTUE9OU0VfUkVHLCBkYXRhLCAweDIpOworCWlmIChlcnIgPCAwKSB7CisJCWRl dl9lcnIoZGV2LCAiY2NnX3JlYWQgZmFpbGVkLCBlcnIgJWRcbiIsIGVycik7CisJCXJldHVybiBl cnI7CisJfQorCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZXJyID0gY2NnX3Jl YWQodWMsIENDR1hfSTJDX1JBQl9ERVZJQ0VfTU9ERSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwlp ZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNjZ19yZWFkIGZhaWxlZCwgZXJyICVkXG4i LCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRldl9pbmZvKGRldiwgIlNpbGljb24gaWQg JTJwaCIsIGRhdGEgKyBDQ0dYX0kyQ19SQUJfUkVBRF9TSUxJQ09OX0lEKTsKKwlkZXZfaW5mbyhk ZXYsICJGVzEgdmVyc2lvbiAlOHBoXG4iLCBkYXRhICsgQ0NHWF9JMkNfUkFCX0ZXMV9WRVJTSU9O KTsKKwlkZXZfaW5mbyhkZXYsICJGVzIgdmVyc2lvbiAlOHBoXG4iLCBkYXRhICsgQ0NHWF9JMkNf UkFCX0ZXMl9WRVJTSU9OKTsKKworCWRhdGFbMF0gPSAweDA7CisJZGF0YVsxXSA9IDB4MDsKKwll cnIgPSBjY2dfcmVhZCh1YywgQ0NHWF9JMkNfUkFCX1JFU1BPTlNFX1JFRywgZGF0YSwgMHgyKTsK KwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNjZ19yZWFkIGZhaWxlZCwgZXJyICVk XG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRhdGFbMF0gPSBDQ0dYX0kyQ19SQUJf VUNTSV9DT05UUk9MX1NUT1A7CisJZXJyID0gY2NnX3dyaXRlKHVjLCBDQ0dYX0kyQ19SQUJfVUNT SV9DT05UUk9MLCBkYXRhLCAweDEpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAi Y2NnX3dyaXRlIGZhaWxlZCwgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwor CWRhdGFbMF0gPSBDQ0dYX0kyQ19SQUJfVUNTSV9DT05UUk9MX1NUQVJUOworCWVyciA9IGNjZ193 cml0ZSh1YywgQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTCwgZGF0YSwgMHgxKTsKKwlpZiAoZXJy IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNjZ193cml0ZSBmYWlsZWQsIGVyciAlZFxuIiwgZXJy KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEZsdXNoIENDR3ggUkVTUE9OU0UgcXVl dWUgYnkgYWNraW5nIGludGVycnVwdHMKKwkgKiAtIGFib3ZlIHVjc2kgY29udHJvbCByZWdpc3Rl ciB3cml0ZSB3aWxsIHB1c2ggcmVzcG9uc2UKKwkgKiB3aGljaCBtdXN0IGJlIGZsdXNoZWQKKwkg KiAtIGFmZmVjdHMgZi93IHVwZGF0ZSB3aGljaCByZWFkcyByZXNwb25zZSByZWdpc3RlcgorCSAq LworCWRhdGFbMF0gPSAweGZmOworCWRvIHsKKwkJZXJyID0gY2NnX3dyaXRlKHVjLCBDQ0dYX0ky Q19SQUJfSU5UUl9SRUcsIGRhdGEsIDB4MSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlkZXZfZXJy KGRldiwgImNjZ193cml0ZSBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7 CisJCX0KKworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKKworCQllcnIgPSBjY2dfcmVh ZCh1YywgQ0NHWF9JMkNfUkFCX0lOVFJfUkVHLCBkYXRhLCAweDEpOworCQlpZiAoZXJyIDwgMCkg eworCQkJZGV2X2VycihkZXYsICJjY2dfcmVhZCBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwkJ CXJldHVybiBlcnI7CisJCX0KKwl9IHdoaWxlICgoZGF0YVswXSAhPSAweDAwKSAmJiBjb3VudC0t KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVjc2lfY2NnX3NlbmRfZGF0YShzdHJ1 Y3QgdWNzaV9jY2cgKnVjKQoreworCWludCBlcnI7CisJdW5zaWduZWQgY2hhciBidWZbNF0gPSB7 CisJCTB4MjAsIENDR1hfSTJDX1JBQl9VQ1NJX0RBVEFfQkxPQ0sgPj4gOCwKKwkJMHg4LCBDQ0dY X0kyQ19SQUJfVUNTSV9EQVRBX0JMT0NLID4+IDgsCisJfTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZjFb MTZdOworCXVuc2lnbmVkIGNoYXIgYnVmMls4XTsKKworCW1lbWNweShidWYxLCAoKGNvbnN0IHZv aWQgKil1Yy0+cHBtLmRhdGEpICsgMHgyMCwgc2l6ZW9mKGJ1ZjEpKTsKKwltZW1jcHkoYnVmMiwg KChjb25zdCB2b2lkICopdWMtPnBwbS5kYXRhKSArIDB4OCwgc2l6ZW9mKGJ1ZjIpKTsKKworCWVy ciA9IGNjZ193cml0ZSh1YywgKih1MTYgKilidWYsIGJ1ZjEsIHNpemVvZihidWYxKSk7CisJaWYg KGVyciA8IDApIHsKKwkJZGV2X2Vycih1Yy0+ZGV2LCAiY2NnX3dyaXRlIGZhaWxlZCwgZXJyICVk XG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGNjZ193cml0ZSh1YywgKih1 MTYgKikoYnVmICsgMiksIGJ1ZjIsIHNpemVvZihidWYyKSk7CisJaWYgKGVyciA8IDApIHsKKwkJ ZGV2X2Vycih1Yy0+ZGV2LCAiY2NnX3dyaXRlIGZhaWxlZCwgZXJyICVkXG4iLCBlcnIpOworCQly ZXR1cm4gZXJyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdWNzaV9jY2df cmVjdl9kYXRhKHN0cnVjdCB1Y3NpX2NjZyAqdWMpCit7CisJdTggKnBwbSA9ICh1OCAqKXVjLT5w cG0uZGF0YTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYnVmWzZdID0geworCQkweDAsIEND R1hfSTJDX1JBQl9VQ1NJX0RBVEFfQkxPQ0sgPj4gOCwKKwkJMHg0LCBDQ0dYX0kyQ19SQUJfVUNT SV9EQVRBX0JMT0NLID4+IDgsCisJCTB4MTAsIENDR1hfSTJDX1JBQl9VQ1NJX0RBVEFfQkxPQ0sg Pj4gOCwKKwl9OworCisJZXJyID0gY2NnX3JlYWQodWMsICoodTE2ICopYnVmLCBwcG0sIDB4Mik7 CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycih1Yy0+ZGV2LCAiY2NnX3JlYWQgZmFpbGVkLCBl cnIgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gY2NnX3JlYWQodWMs ICoodTE2ICopKGJ1ZiArIDIpLCBwcG0gKyAweDQsIDB4NCk7CisJaWYgKGVyciA8IDApIHsKKwkJ ZGV2X2Vycih1Yy0+ZGV2LCAiY2NnX3JlYWQgZmFpbGVkLCBlcnIgJWRcbiIsIGVycik7CisJCXJl dHVybiBlcnI7CisJfQorCisJZXJyID0gY2NnX3JlYWQodWMsICoodTE2ICopKGJ1ZiArIDQpLCBw cG0gKyAweDEwLCAweDEwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKHVjLT5kZXYsICJj Y2dfcmVhZCBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVjc2lfY2NnX2Fja19pbnRlcnJ1cHQoc3RydWN0 IHVjc2lfY2NnICp1YykKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGNoYXIgYnVmWzJdID0gewor CQlDQ0dYX0kyQ19SQUJfSU5UUl9SRUcsIENDR1hfSTJDX1JBQl9JTlRSX1JFRyA+PiA4fTsKKwl1 bnNpZ25lZCBjaGFyIGJ1ZjJbMV0gPSB7MHgwfTsKKworCWVyciA9IGNjZ19yZWFkKHVjLCAqKHUx NiAqKWJ1ZiwgYnVmMiwgMHgxKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKHVjLT5kZXYs ICJjY2dfcmVhZCBmYWlsZWQsIGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisK KwllcnIgPSBjY2dfd3JpdGUodWMsICoodTE2ICopYnVmLCBidWYyLCAweDEpOworCWlmIChlcnIg PCAwKSB7CisJCWRldl9lcnIodWMtPmRldiwgImNjZ19yZWFkIGZhaWxlZCwgZXJyICVkXG4iLCBl cnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQg dWNzaV9jY2dfc3luYyhzdHJ1Y3QgdWNzaV9wcG0gKnBwbSkKK3sKKwlzdHJ1Y3QgdWNzaV9jY2cg KnVjID0gY29udGFpbmVyX29mKHBwbSwgc3RydWN0IHVjc2lfY2NnLCBwcG0pOworCWludCBlcnI7 CisKKwllcnIgPSB1Y3NpX2NjZ19yZWN2X2RhdGEodWMpOworCWlmIChlcnIgPCAwKSB7CisJCWRl dl9lcnIodWMtPmRldiwgInVjc2lfY2NnX3JlY3ZfZGF0YSgpIGVyciAlZFxuIiwgZXJyKTsKKwkJ cmV0dXJuIDA7CisJfQorCisJLyogYWNrIGludGVycnVwdCB0byBhbGxvdyBuZXh0IGNvbW1hbmQg dG8gcnVuICovCisJZXJyID0gdWNzaV9jY2dfYWNrX2ludGVycnVwdCh1Yyk7CisJaWYgKGVyciA8 IDApCisJCWRldl9lcnIodWMtPmRldiwgInVjc2lfY2NnX2Fja19pbnRlcnJ1cHQoKSBlcnIgJWRc biIsIGVycik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Y3NpX2NjZ19jbWQoc3Ry dWN0IHVjc2lfcHBtICpwcG0sIHN0cnVjdCB1Y3NpX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0 IHVjc2lfY2NnICp1YyA9IGNvbnRhaW5lcl9vZihwcG0sIHN0cnVjdCB1Y3NpX2NjZywgcHBtKTsK KwlpbnQgZXJyOworCisJcHBtLT5kYXRhLT5jdHJsLnJhd19jbWQgPSBjdHJsLT5yYXdfY21kOwor CWVyciA9IHVjc2lfY2NnX3NlbmRfZGF0YSh1Yyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0 aWMgaXJxcmV0dXJuX3QgY2NnX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJ c3RydWN0IHVjc2lfY2NnICp1YyA9IGRhdGE7CisKKwl1Y3NpX25vdGlmeSh1Yy0+dWNzaSk7CisK KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdWNzaV9jY2dfcHJvYmUoc3Ry dWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQg KmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgdWNz aV9jY2cgKnVjOworCWludCBzdGF0dXM7CisKKwl1YyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVv ZigqdWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVj LT5wcG0uZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgdWNzaV9kYXRhKSwg R0ZQX0tFUk5FTCk7CisJaWYgKCF1Yy0+cHBtLmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJ dWMtPnBwbS5jbWQgPSB1Y3NpX2NjZ19jbWQ7CisJdWMtPnBwbS5zeW5jID0gdWNzaV9jY2dfc3lu YzsKKwl1Yy0+ZGV2ID0gZGV2OworCXVjLT5jbGllbnQgPSBjbGllbnQ7CisKKwkvKiByZXNldCBj Y2cgZGV2aWNlIGFuZCBpbml0aWFsaXplIHVjc2kgKi8KKwlzdGF0dXMgPSB1Y3NpX2NjZ19pbml0 KHVjKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZXJyKHVjLT5kZXYsICJ1Y3NpX2NjZ19p bml0IGZhaWxlZCAtICVkXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXVj LT5pcnEgPSBjbGllbnQtPmlycTsKKworCXN0YXR1cyA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9p cnEoZGV2LCB1Yy0+aXJxLCBOVUxMLCBjY2dfaXJxX2hhbmRsZXIsCisJCQkJCSAgIElSUUZfT05F U0hPVCB8IElSUUZfVFJJR0dFUl9ISUdILAorCQkJCQkgICBkZXZfbmFtZShkZXYpLCB1Yyk7CisJ aWYgKHN0YXR1cyA8IDApIHsKKwkJZGV2X2Vycih1Yy0+ZGV2LCAicmVxdWVzdF90aHJlYWRlZF9p cnEgZmFpbGVkIC0gJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJdWMt PnVjc2kgPSB1Y3NpX3JlZ2lzdGVyX3BwbShkZXYsICZ1Yy0+cHBtKTsKKwlpZiAoSVNfRVJSKHVj LT51Y3NpKSkgeworCQlkZXZfZXJyKHVjLT5kZXYsICJ1Y3NpX3JlZ2lzdGVyX3BwbSBmYWlsZWRc biIpOworCQlyZXR1cm4gUFRSX0VSUih1Yy0+dWNzaSk7CisJfQorCisJaTJjX3NldF9jbGllbnRk YXRhKGNsaWVudCwgdWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVjc2lfY2NnX3Jl bW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB1Y3NpX2NjZyAqdWMg PSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXVjc2lfdW5yZWdpc3Rlcl9wcG0odWMt PnVjc2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rldmlj ZV9pZCB1Y3NpX2NjZ19kZXZpY2VfaWRbXSA9IHsKKwl7ImNjZ3gtdWNzaSIsIDB9LAorCXt9Cit9 OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHVjc2lfY2NnX2RldmljZV9pZCk7CisKK3N0YXRp YyBzdHJ1Y3QgaTJjX2RyaXZlciB1Y3NpX2NjZ19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJ Lm5hbWUgPSAidWNzaV9jY2ciLAorCX0sCisJLnByb2JlID0gdWNzaV9jY2dfcHJvYmUsCisJLnJl bW92ZSA9IHVjc2lfY2NnX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB1Y3NpX2NjZ19kZXZpY2VfaWQs Cit9OworCittb2R1bGVfaTJjX2RyaXZlcih1Y3NpX2NjZ19kcml2ZXIpOworCitNT0RVTEVfQVVU SE9SKCJBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9O KCJVQ1NJIGRyaXZlciBmb3IgQ3lwcmVzcyBDQ0d4IFR5cGUtQyBjb250cm9sbGVyIik7CitNT0RV TEVfTElDRU5TRSgiR1BMIHYyIik7Cg==