From mboxrd@z Thu Jan 1 00:00:00 1970 From: Quentin Schulz Subject: [PATCH 17/22] power: supply: add battery driver for AXP20X and AXP22X PMICs Date: Mon, 2 Jan 2017 17:37:17 +0100 Message-ID: <20170102163723.7939-18-quentin.schulz@free-electrons.com> References: <20170102163723.7939-1-quentin.schulz@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170102163723.7939-1-quentin.schulz@free-electrons.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: jic23@kernel.org, knaack.h@gmx.de, lars@metafoo.de, pmeerw@pmeerw.net, robh+dt@kernel.org, mark.rutland@arm.com, wens@csie.org, sre@kernel.org, linux@armlinux.org.uk, maxime.ripard@free-electrons.com, lee.jones@linaro.org Cc: thomas.petazzoni@free-electrons.com, devicetree@vger.kernel.org, linux-pm@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, Quentin Schulz , bonbons@linux-vserver.org, icenowy@aosc.xyz, linux-arm-kernel@lists.infradead.org List-Id: devicetree@vger.kernel.org VGhlIFgtUG93ZXJzIEFYUDIwWCBhbmQgQVhQMjJYIFBNSUNzIGNhbiBoYXZlIGEgYmF0dGVyeSBh cyBwb3dlciBzdXBwbHkuCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGJhdHRlcnkgcG93ZXIgc3VwcGx5 IGRyaXZlciB0byBnZXQgdmFyaW91cyBkYXRhIGZyb20KdGhlIFBNSUMsIHN1Y2ggYXMgdGhlIGJh dHRlcnkgc3RhdHVzIChjaGFyZ2luZywgZGlzY2hhcmdpbmcsIGZ1bGwsCmRlYWQpLCBjdXJyZW50 IG1heCBsaW1pdCwgY3VycmVudCBjdXJyZW50LCBiYXR0ZXJ5IGNhcGFjaXR5IChpbgpwZXJjZW50 YWdlKSwgdm9sdGFnZSBtYXggYW5kIG1pbiBsaW1pdHMsIGN1cnJlbnQgdm9sdGFnZSBhbmQgYmF0 dGVyeQpjYXBhY2l0eSAoaW4gQWgpLgoKVGhpcyBiYXR0ZXJ5IGRyaXZlciB1c2VzIHRoZSBBWFAy MFgvQVhQMjJYIEFEQyBkcml2ZXIgYXMgUE1JQyBkYXRhCnByb3ZpZGVyLgoKU2lnbmVkLW9mZi1i eTogUXVlbnRpbiBTY2h1bHogPHF1ZW50aW4uc2NodWx6QGZyZWUtZWxlY3Ryb25zLmNvbT4KLS0t CiBkcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmlnICAgICAgICAgIHwgIDEyICsKIGRyaXZlcnMv cG93ZXIvc3VwcGx5L01ha2VmaWxlICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9wb3dlci9zdXBw bHkvYXhwMjB4X2JhdHRlcnkuYyB8IDQ1OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrCiAzIGZpbGVzIGNoYW5nZWQsIDQ3MSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9wb3dlci9zdXBwbHkvYXhwMjB4X2JhdHRlcnkuYwoKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9LY29uZmln CmluZGV4IGM1NTJiNGIuLjQ4NjE5ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5 L0tjb25maWcKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZwpAQCAtMjI2LDYgKzIy NiwxOCBAQCBjb25maWcgQ0hBUkdFUl9BWFAyMFgKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJl IGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQg YXhwMjB4X2FjX3Bvd2VyLgogCitjb25maWcgQkFUVEVSWV9BWFAyMFgKKwl0cmlzdGF0ZSAiWC1Q b3dlcnMgQVhQMjBYIGJhdHRlcnkgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX0FYUDIwWAorCWRl cGVuZHMgb24gQVhQMjBYX0FEQworCWRlcGVuZHMgb24gSUlPCisJaGVscAorCSAgU2F5IFkgaGVy ZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgWC1Qb3dlcnMgQVhQMjBYIFBNSUNzJyBiYXR0ZXJ5IHBv d2VyCisJICBzdXBwbHkuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEg bW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXhwMjB4X2JhdHRl cnkuCisKIGNvbmZpZyBBWFAyODhfQ0hBUkdFUgogCXRyaXN0YXRlICJYLVBvd2VycyBBWFAyODgg Q2hhcmdlciIKIAlkZXBlbmRzIG9uIE1GRF9BWFAyMFggJiYgRVhUQ09OX0FYUDI4OApkaWZmIC0t Z2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL3N1cHBs eS9NYWtlZmlsZQppbmRleCA3ZDIyNDE3Li41YTIxN2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bv d2VyL3N1cHBseS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQpA QCAtMTgsNiArMTgsNyBAQCBvYmotJChDT05GSUdfVEVTVF9QT1dFUikJKz0gdGVzdF9wb3dlci5v CiAKIG9iai0kKENPTkZJR19CQVRURVJZXzg4UE04NjBYKQkrPSA4OHBtODYweF9iYXR0ZXJ5Lm8K IG9iai0kKENPTkZJR19CQVRURVJZX0FDVDg5NDVBKQkrPSBhY3Q4OTQ1YV9jaGFyZ2VyLm8KK29i ai0kKENPTkZJR19CQVRURVJZX0FYUDIwWCkJKz0gYXhwMjB4X2JhdHRlcnkubwogb2JqLSQoQ09O RklHX0NIQVJHRVJfQVhQMjBYKQkrPSBheHAyMHhfYWNfcG93ZXIubwogb2JqLSQoQ09ORklHX0JB VFRFUllfRFMyNzYwKQkrPSBkczI3NjBfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9E UzI3ODApCSs9IGRzMjc4MF9iYXR0ZXJ5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3Vw cGx5L2F4cDIweF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyMHhfYmF0dGVy eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDdiNWYKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9heHAyMHhfYmF0dGVyeS5jCkBAIC0wLDAg KzEsNDU4IEBACisvKgorICogQmF0dGVyeSBwb3dlciBzdXBwbHkgZHJpdmVyIGZvciBYLVBvd2Vy cyBBWFAyMFggYW5kIEFYUDIyWCBQTUlDcworICoKKyAqIENvcHlyaWdodCAyMDE2IEZyZWUgRWxl Y3Ryb25zIE5leHRUaGluZyBDby4KKyAqCVF1ZW50aW4gU2NodWx6IDxxdWVudGluLnNjaHVsekBm cmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gYSBwcmV2 aW91cyB1cHN0cmVhbWluZyBhdHRlbXB0IGJ5OgorICoJQnJ1bm8gUHLDqW1vbnQgPGJvbmJvbnNA bGludXgtdnNlcnZlci5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRl cm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2Uu IFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMKKyAq IGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJp YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0 aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8K KworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgor I2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+ CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2lu Y2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVk ZSA8bGludXgvaWlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2F4cDIweC5oPgor CisjZGVmaW5lIEFYUDIwWF9QV1JfU1RBVFVTX0JBVF9DSEFSR0lORwlCSVQoMikKKworI2RlZmlu ZSBBWFAyMFhfUFdSX09QX0JBVFRfUFJFU0VOVAlCSVQoNSkKKyNkZWZpbmUgQVhQMjBYX1BXUl9P UF9CQVRUX0FDVElWQVRFRAlCSVQoMykKKworI2RlZmluZSBBWFAyMDlfRkdfUEVSQ0VOVAkJR0VO TUFTSyg2LCAwKQorI2RlZmluZSBBWFAyMlhfRkdfVkFMSUQJCQlCSVQoNykKKworI2RlZmluZSBB WFAyMFhfQ0hSR19DVFJMMV9UR1RfVk9MVAlHRU5NQVNLKDYsIDUpCisjZGVmaW5lIEFYUDIwWF9D SFJHX0NUUkwxX1RHVF80XzFWCSgwIDw8IDUpCisjZGVmaW5lIEFYUDIwWF9DSFJHX0NUUkwxX1RH VF80XzE1VglCSVQoNSkKKyNkZWZpbmUgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUXzRfMlYJKDIgPDwg NSkKKyNkZWZpbmUgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUXzRfMzZWCSgzIDw8IDUpCisjZGVmaW5l IEFYUDIwWF9DSFJHX0NUUkwxX1RHVF9DVVJSCUdFTk1BU0soMywgMCkKKworI2RlZmluZSBBWFAy MlhfQ0hSR19DVFJMMV9UR1RfNF8yMlYJQklUKDUpCisjZGVmaW5lIEFYUDIyWF9DSFJHX0NUUkwx X1RHVF80XzI0VgkoMyA8PCA1KQorCisjZGVmaW5lIEFYUDIwWF9WX09GRl9NQVNLCQlHRU5NQVNL KDIsIDApCisKK3N0cnVjdCBheHAyMHhfYmF0dF9wcyB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFw OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHQ7CisJc3RydWN0IGF4cDIweF9kZXYgKmF4cDIw eDsKKwlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmJhdHRfY2hyZ19pOworCXN0cnVjdCBpaW9fY2hhbm5l bCAqYmF0dF9kaXNjaHJnX2k7CisJc3RydWN0IGlpb19jaGFubmVsICpiYXR0X3Y7CisJdTggYXhw X2lkOworfTsKKworc3RhdGljIGludCBheHAyMHhfYmF0dGVyeV9nZXRfbWF4X3ZvbHRhZ2Uoc3Ry dWN0IGF4cDIweF9iYXR0X3BzICpheHAyMHhfYmF0dCwKKwkJCQkJICBpbnQgKnZhbCkKK3sKKwlp bnQgcmV0LCByZWc7CisKKwlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhfYmF0dC0+cmVnbWFwLCBB WFAyMFhfQ0hSR19DVFJMMSwgJnJlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3 aXRjaCAocmVnICYgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUX1ZPTFQpIHsKKwljYXNlIEFYUDIwWF9D SFJHX0NUUkwxX1RHVF80XzFWOgorCQkqdmFsID0gNDEwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBB WFAyMFhfQ0hSR19DVFJMMV9UR1RfNF8xNVY6CisJCSp2YWwgPSA0MTUwMDAwOworCQlicmVhazsK KwljYXNlIEFYUDIwWF9DSFJHX0NUUkwxX1RHVF80XzJWOgorCQkqdmFsID0gNDIwMDAwMDsKKwkJ YnJlYWs7CisJY2FzZSBBWFAyMFhfQ0hSR19DVFJMMV9UR1RfNF8zNlY6CisJCSp2YWwgPSA0MzYw MDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBheHAyMnhfYmF0dGVyeV9nZXRfbWF4X3ZvbHRhZ2Uoc3Ry dWN0IGF4cDIweF9iYXR0X3BzICpheHAyMHhfYmF0dCwKKwkJCQkJICBpbnQgKnZhbCkKK3sKKwlp bnQgcmV0LCByZWc7CisKKwlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhfYmF0dC0+cmVnbWFwLCBB WFAyMFhfQ0hSR19DVFJMMSwgJnJlZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3 aXRjaCAocmVnICYgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUX1ZPTFQpIHsKKwljYXNlIEFYUDIwWF9D SFJHX0NUUkwxX1RHVF80XzFWOgorCQkqdmFsID0gNDEwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBB WFAyMFhfQ0hSR19DVFJMMV9UR1RfNF8yVjoKKwkJKnZhbCA9IDQyMDAwMDA7CisJCWJyZWFrOwor CWNhc2UgQVhQMjJYX0NIUkdfQ1RSTDFfVEdUXzRfMjJWOgorCQkqdmFsID0gNDIyMDAwMDsKKwkJ YnJlYWs7CisJY2FzZSBBWFAyMlhfQ0hSR19DVFJMMV9UR1RfNF8yNFY6CisJCSp2YWwgPSA0MjQw MDAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBheHAyMHhfYmF0dGVyeV9nZXRfcHJvcChzdHJ1Y3QgcG93 ZXJfc3VwcGx5ICpwc3ksCisJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAor CQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IGF4cDIw eF9iYXR0X3BzICpheHAyMHhfYmF0dCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwor CXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsKKwlpbnQgcmV0ID0gMCwgcmVnLCB2YWwxOworCisJ c3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJY2FzZSBQ T1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IHJlZ21hcF9yZWFkKGF4cDIweF9iYXR0 LT5yZWdtYXAsIEFYUDIwWF9QV1JfT1BfTU9ERSwKKwkJCQkgICZyZWcpOworCQlpZiAocmV0KQor CQkJcmV0dXJuIHJldDsKKworCQl2YWwtPmludHZhbCA9ICEhKHJlZyAmIEFYUDIwWF9QV1JfT1Bf QkFUVF9QUkVTRU5UKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRV UzoKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYXhwMjB4X2JhdHQtPnJlZ21hcCwgQVhQMjBYX1BXUl9J TlBVVF9TVEFUVVMsCisJCQkJICAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisK KwkJaWYgKHJlZyAmIEFYUDIwWF9QV1JfU1RBVFVTX0JBVF9DSEFSR0lORykgeworCQkJdmFsLT5p bnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQkJcmV0dXJuIDA7CisJCX0K KworCQlyZXQgPSBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChheHAyMHhfYmF0dC0+YmF0dF9k aXNjaHJnX2ksCisJCQkJCQkgJnZhbDEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwor CQlpZiAodmFsMSkgeworCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NI QVJHSU5HOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhf YmF0dC0+cmVnbWFwLCBBWFAyMFhfRkdfUkVTLCAmdmFsMSk7CisJCWlmIChyZXQpCisJCQlyZXR1 cm4gcmV0OworCisJCS8qCisJCSAqIEZ1ZWwgR2F1Z2UgZGF0YSB0YWtlcyA3IGJpdHMgYnV0IHRo ZSBzdG9yZWQgdmFsdWUgc2VlbXMgdG8gYmUKKwkJICogZGlyZWN0bHkgdGhlIHJhdyBwZXJjZW50 YWdlIHdpdGhvdXQgYW55IHNjYWxpbmcgdG8gNyBiaXRzLgorCQkgKi8KKwkJaWYgKCh2YWwxICYg QVhQMjA5X0ZHX1BFUkNFTlQpID09IDEwMCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZ X1NUQVRVU19GVUxMOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFU VVNfTk9UX0NIQVJHSU5HOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVB TFRIOgorCQlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhfYmF0dC0+cmVnbWFwLCBBWFAyMFhfUFdS X09QX01PREUsCisJCQkJICAmdmFsMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJ CWlmICh2YWwxICYgQVhQMjBYX1BXUl9PUF9CQVRUX0FDVElWQVRFRCkgeworCQkJdmFsLT5pbnR2 YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCXZh bC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQlicmVhazsKKworCWNhc2Ug UE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9NQVg6CisJCXJldCA9IHJlZ21hcF9yZWFkKGF4cDIw eF9iYXR0LT5yZWdtYXAsIEFYUDIwWF9DSFJHX0NUUkwxLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJ CXJldHVybiByZXQ7CisKKwkJcmVnICY9IEFYUDIwWF9DSFJHX0NUUkwxX1RHVF9DVVJSOworCQl2 YWwtPmludHZhbCA9IHJlZyAqIDEwMDAwMCArIDMwMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIFBP V0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCQlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhf YmF0dC0+cmVnbWFwLCBBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywKKwkJCQkgICZyZWcpOworCQlp ZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAocmVnICYgQVhQMjBYX1BXUl9TVEFUVVNf QkFUX0NIQVJHSU5HKQorCQkJY2hhbiA9IGF4cDIweF9iYXR0LT5iYXR0X2NocmdfaTsKKwkJZWxz ZQorCQkJY2hhbiA9IGF4cDIweF9iYXR0LT5iYXR0X2Rpc2NocmdfaTsKKworCQlyZXQgPSBpaW9f cmVhZF9jaGFubmVsX3Byb2Nlc3NlZChjaGFuLCAmdmFsLT5pbnR2YWwpOworCQlpZiAocmV0KQor CQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBJSU8gZnJhbWV3b3JrIGdpdmVzIG1WIGJ1dCBQ b3dlciBTdXBwbHkgZnJhbWV3b3JrIGdpdmVzIMK1Vi4KKwkJICovCisJCXZhbC0+aW50dmFsICo9 IDEwMDA7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKKwkJ LyogV2hlbiBubyBiYXR0ZXJ5IGlzIHByZXNlbnQsIHJldHVybiBjYXBhY2l0eSBpcyAxMDAlICov CisJCXJldCA9IHJlZ21hcF9yZWFkKGF4cDIweF9iYXR0LT5yZWdtYXAsIEFYUDIwWF9QV1JfT1Bf TU9ERSwKKwkJCQkgICZyZWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpZiAo IShyZWcgJiBBWFAyMFhfUFdSX09QX0JBVFRfUFJFU0VOVCkpIHsKKwkJCXZhbC0+aW50dmFsID0g MTAwOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXQgPSByZWdtYXBfcmVhZChheHAyMHhfYmF0 dC0+cmVnbWFwLCBBWFAyMFhfRkdfUkVTLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBy ZXQ7CisKKwkJaWYgKGF4cDIweF9iYXR0LT5heHBfaWQgPT0gQVhQMjIxX0lEICYmCisJCSAgICAh KHJlZyAmIEFYUDIyWF9GR19WQUxJRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKgorCQkg KiBGdWVsIEdhdWdlIGRhdGEgdGFrZXMgNyBiaXRzIGJ1dCB0aGUgc3RvcmVkIHZhbHVlIHNlZW1z IHRvIGJlCisJCSAqIGRpcmVjdGx5IHRoZSByYXcgcGVyY2VudGFnZSB3aXRob3V0IGFueSBzY2Fs aW5nIHRvIDcgYml0cy4KKwkJICovCisJCXZhbC0+aW50dmFsID0gcmVnICYgQVhQMjA5X0ZHX1BF UkNFTlQ7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9E RVNJR046CisJCWlmIChheHAyMHhfYmF0dC0+YXhwX2lkID09IEFYUDIwOV9JRCkKKwkJCXJldHVy biBheHAyMHhfYmF0dGVyeV9nZXRfbWF4X3ZvbHRhZ2UoYXhwMjB4X2JhdHQsCisJCQkJCQkJICAg ICAgJnZhbC0+aW50dmFsKTsKKwkJcmV0dXJuIGF4cDIyeF9iYXR0ZXJ5X2dldF9tYXhfdm9sdGFn ZShheHAyMHhfYmF0dCwKKwkJCQkJCSAgICAgICZ2YWwtPmludHZhbCk7CisKKwljYXNlIFBPV0VS X1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYXhw MjB4X2JhdHQtPnJlZ21hcCwgQVhQMjBYX1ZfT0ZGLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJl dHVybiByZXQ7CisKKwkJdmFsLT5pbnR2YWwgPSAyNjAwMDAwICsgMTAwMDAwICogKHJlZyAmIEFY UDIwWF9WX09GRl9NQVNLKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZP TFRBR0VfTk9XOgorCQlyZXQgPSBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChheHAyMHhfYmF0 dC0+YmF0dF92LAorCQkJCQkJICZ2YWwtPmludHZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4g cmV0OworCisJCS8qCisJCSAqIElJTyBmcmFtZXdvcmsgZ2l2ZXMgbVYgYnV0IFBvd2VyIFN1cHBs eSBmcmFtZXdvcmsgZ2l2ZXMgwrVWLgorCQkgKi8KKwkJdmFsLT5pbnR2YWwgKj0gMTAwMDsKKwkJ YnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBheHAyMHhfYmF0dGVyeV9zZXRfbWF4X3ZvbHRhZ2Uoc3RydWN0IGF4 cDIweF9iYXR0X3BzICpheHAyMHhfYmF0dCwKKwkJCQkJICBpbnQgdmFsKQoreworCXN3aXRjaCAo dmFsKSB7CisJY2FzZSA0MTAwMDAwOgorCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGF4cDIw eF9iYXR0LT5yZWdtYXAsCisJCQkJCSAgQVhQMjBYX0NIUkdfQ1RSTDEsCisJCQkJCSAgQVhQMjBY X0NIUkdfQ1RSTDFfVEdUX1ZPTFQsCisJCQkJCSAgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUXzRfMVYp OworCWNhc2UgNDE1MDAwMDoKKwkJaWYgKGF4cDIweF9iYXR0LT5heHBfaWQgPT0gQVhQMjIxX0lE KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhheHAy MHhfYmF0dC0+cmVnbWFwLAorCQkJCQkgIEFYUDIwWF9DSFJHX0NUUkwxLAorCQkJCQkgIEFYUDIw WF9DSFJHX0NUUkwxX1RHVF9WT0xULAorCQkJCQkgIEFYUDIwWF9DSFJHX0NUUkwxX1RHVF80XzE1 Vik7CisJY2FzZSA0MjAwMDAwOgorCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGF4cDIweF9i YXR0LT5yZWdtYXAsCisJCQkJCSAgQVhQMjBYX0NIUkdfQ1RSTDEsCisJCQkJCSAgQVhQMjBYX0NI UkdfQ1RSTDFfVEdUX1ZPTFQsCisJCQkJCSAgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUXzRfMlYpOwor CWRlZmF1bHQ6CisJCS8qCisJCSAqIEFYUDIweCBtYXggdm9sdGFnZSBjYW4gYmUgc2V0IHRvIDQu MzZWIGFuZCBBWFAyMlggbWF4IHZvbHRhZ2UKKwkJICogY2FuIGJlIHNldCB0byA0LjIyViBhbmQg NC4yNFYsIGJ1dCB0aGVzZSB2b2x0YWdlcyBhcmUgdG9vCisJCSAqIGhpZ2ggZm9yIExpdGhpdW0g YmFzZWQgYmF0dGVyaWVzIChBWFAgUE1JQ3MgYXJlIHN1cHBvc2VkIHRvCisJCSAqIGJlIHVzZWQg d2l0aCB0aGVzZSBraW5kcyBvZiBiYXR0ZXJ5KS4KKwkJICovCisJCXJldHVybiAtRUlOVkFMOwor CX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF4cDIweF9iYXR0ZXJ5X3NldF9wcm9w KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9w ZXJ0eSBwc3AsCisJCQkJICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkK K3sKKwlzdHJ1Y3QgYXhwMjB4X2JhdHRfcHMgKmF4cDIweF9iYXR0ID0gcG93ZXJfc3VwcGx5X2dl dF9kcnZkYXRhKHBzeSk7CisJaW50IHJldCA9IDAsIHZhbDE7CisKKwlzd2l0Y2ggKHBzcCkgewor CWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCQl2YWwxID0gKHZh bC0+aW50dmFsIC0gMjYwMDAwMCkgLyAxMDAwMDA7CisJCWlmICh2YWwxIDwgMCB8fCB2YWwxID4g QVhQMjBYX1ZfT0ZGX01BU0spCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gcmVnbWFw X3VwZGF0ZV9iaXRzKGF4cDIweF9iYXR0LT5yZWdtYXAsIEFYUDIwWF9WX09GRiwKKwkJCQkJICBB WFAyMFhfVl9PRkZfTUFTSywgdmFsMSk7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRB R0VfTUFYX0RFU0lHTjoKKwkJcmV0dXJuIGF4cDIweF9iYXR0ZXJ5X3NldF9tYXhfdm9sdGFnZShh eHAyMHhfYmF0dCwgdmFsLT5pbnR2YWwpOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJS RU5UX01BWDoKKwkJaWYgKGF4cDIweF9iYXR0LT5heHBfaWQgPT0gQVhQMjA5X0lEKQorCQkJdmFs MSA9ICh2YWwtPmludHZhbCAtIDMwMDAwMCkgLyAxMDAwMDA7CisJCWVsc2UKKwkJCXZhbDEgPSAo dmFsLT5pbnR2YWwgLSAzMDAwMDApIC8gMTUwMDAwOworCisJCWlmICh2YWwxID4gQVhQMjBYX0NI UkdfQ1RSTDFfVEdUX0NVUlIgfHwgdmFsMSA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQly ZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGF4cDIweF9iYXR0LT5yZWdtYXAsCisJCQkJCSAgQVhQ MjBYX0NIUkdfQ1RSTDEsCisJCQkJCSAgQVhQMjBYX0NIUkdfQ1RSTDFfVEdUX0NVUlIsIHZhbDEp OworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBheHAyMHhfYmF0dGVyeV9wcm9wc1td ID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfT05M SU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xU QUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlf UFJPUF9DVVJSRU5UX01BWCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQ UExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0Vf TUlOX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKK307CisKK3N0YXRpYyBp bnQgYXhwMjB4X2JhdHRlcnlfcHJvcF93cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5 LAorCQkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKQoreworCXJldHVybiBwc3Ag PT0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOIHx8CisJICAgICAgIHBzcCA9 PSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04gfHwKKwkgICAgICAgcHNwID09 IFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTUFYOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0 IHBvd2VyX3N1cHBseV9kZXNjIGF4cDIweF9iYXR0X3BzX2Rlc2MgPSB7CisJLm5hbWUgPSAiYXhw MjB4LWJhdHRlcnkiLAorCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJv cGVydGllcyA9IGF4cDIweF9iYXR0ZXJ5X3Byb3BzLAorCS5udW1fcHJvcGVydGllcyA9IEFSUkFZ X1NJWkUoYXhwMjB4X2JhdHRlcnlfcHJvcHMpLAorCS5wcm9wZXJ0eV9pc193cml0ZWFibGUgPSBh eHAyMHhfYmF0dGVyeV9wcm9wX3dyaXRlYWJsZSwKKwkuZ2V0X3Byb3BlcnR5ID0gYXhwMjB4X2Jh dHRlcnlfZ2V0X3Byb3AsCisJLnNldF9wcm9wZXJ0eSA9IGF4cDIweF9iYXR0ZXJ5X3NldF9wcm9w LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXhwMjB4X2JhdHRlcnlf cHNfaWRbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOS1iYXR0ZXJ5 LXBvd2VyLXN1cHBseSIsCisJCS5kYXRhID0gKHZvaWQgKilBWFAyMDlfSUQsCisJfSwgeworCQku Y29tcGF0aWJsZSA9ICJ4LXBvd2VycyxheHAyMjEtYmF0dGVyeS1wb3dlci1zdXBwbHkiLAorCQku ZGF0YSA9ICh2b2lkICopQVhQMjIxX0lELAorCX0sIHsgLyogc2VudGluZWwgKi8gfSwKK307CitN T0RVTEVfREVWSUNFX1RBQkxFKG9mLCBheHAyMHhfYmF0dGVyeV9wc19pZCk7CisKK3N0YXRpYyBp bnQgYXhwMjB4X3Bvd2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJ c3RydWN0IGF4cDIweF9kZXYgKmF4cDIweCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFy ZW50KTsKKwlzdHJ1Y3QgYXhwMjB4X2JhdHRfcHMgKmF4cDIweF9iYXR0OworCXN0cnVjdCBwb3dl cl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKworCWF4cDIweF9iYXR0ID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsIHNpemVvZigqYXhwMjB4X2JhdHQpLAorCQkJCSAgIEdGUF9LRVJORUwp OworCWlmICghYXhwMjB4X2JhdHQpCisJCXJldHVybiAtRU5PTUVNOworCisJYXhwMjB4X2JhdHQt PmJhdHRfdiA9IGRldm1faWlvX2NoYW5uZWxfZ2V0KCZwZGV2LT5kZXYsICJiYXR0X3YiKTsKKwlp ZiAoSVNfRVJSKGF4cDIweF9iYXR0LT5iYXR0X3YpKSB7CisJCWlmIChQVFJfRVJSKGF4cDIweF9i YXR0LT5iYXR0X3YpID09IC1FTk9ERVYpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJcmV0 dXJuIFBUUl9FUlIoYXhwMjB4X2JhdHQtPmJhdHRfdik7CisJfQorCisJYXhwMjB4X2JhdHQtPmJh dHRfY2hyZ19pID0gZGV2bV9paW9fY2hhbm5lbF9nZXQoJnBkZXYtPmRldiwKKwkJCQkJCQkiYmF0 dF9jaHJnX2kiKTsKKwlpZiAoSVNfRVJSKGF4cDIweF9iYXR0LT5iYXR0X2NocmdfaSkpIHsKKwkJ aWYgKFBUUl9FUlIoYXhwMjB4X2JhdHQtPmJhdHRfY2hyZ19pKSA9PSAtRU5PREVWKQorCQkJcmV0 dXJuIC1FUFJPQkVfREVGRVI7CisJCXJldHVybiBQVFJfRVJSKGF4cDIweF9iYXR0LT5iYXR0X2No cmdfaSk7CisJfQorCisJYXhwMjB4X2JhdHQtPmJhdHRfZGlzY2hyZ19pID0gZGV2bV9paW9fY2hh bm5lbF9nZXQoJnBkZXYtPmRldiwKKwkJCQkJCQkgICAiYmF0dF9kaXNjaHJnX2kiKTsKKwlpZiAo SVNfRVJSKGF4cDIweF9iYXR0LT5iYXR0X2Rpc2NocmdfaSkpIHsKKwkJaWYgKFBUUl9FUlIoYXhw MjB4X2JhdHQtPmJhdHRfZGlzY2hyZ19pKSA9PSAtRU5PREVWKQorCQkJcmV0dXJuIC1FUFJPQkVf REVGRVI7CisJCXJldHVybiBQVFJfRVJSKGF4cDIweF9iYXR0LT5iYXR0X2Rpc2NocmdfaSk7CisJ fQorCisJYXhwMjB4X2JhdHQtPnJlZ21hcCA9IGF4cDIweC0+cmVnbWFwOworCXBsYXRmb3JtX3Nl dF9kcnZkYXRhKHBkZXYsIGF4cDIweF9iYXR0KTsKKworCXBzeV9jZmcuZHJ2X2RhdGEgPSBheHAy MHhfYmF0dDsKKwlwc3lfY2ZnLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWF4cDIw eF9iYXR0LT5heHBfaWQgPSAoaW50KW9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2 KTsKKworCWF4cDIweF9iYXR0LT5iYXR0ID0gZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBk ZXYtPmRldiwKKwkJCQkJCSAgICAgICAmYXhwMjB4X2JhdHRfcHNfZGVzYywKKwkJCQkJCSAgICAg ICAmcHN5X2NmZyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhheHAyMHhfYmF0dC0+YmF0dCk7 Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF4cDIweF9iYXR0X2RyaXZlciA9 IHsKKwkucHJvYmUgICAgPSBheHAyMHhfcG93ZXJfcHJvYmUsCisJLmRyaXZlciAgID0geworCQku bmFtZSAgPSAiYXhwMjB4LWJhdHRlcnktcG93ZXItc3VwcGx5IiwKKwkJLm9mX21hdGNoX3RhYmxl ID0gYXhwMjB4X2JhdHRlcnlfcHNfaWQsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2 ZXIoYXhwMjB4X2JhdHRfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJCYXR0ZXJ5IHBv d2VyIHN1cHBseSBkcml2ZXIgZm9yIEFYUDIwWCBhbmQgQVhQMjJYIFBNSUNzIik7CitNT0RVTEVf QVVUSE9SKCJRdWVudGluIFNjaHVseiA8cXVlbnRpbi5zY2h1bHpAZnJlZS1lbGVjdHJvbnMuY29t PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotLSAKMi45LjMKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==