All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <53997544.5090106@denx.de>

diff --git a/a/1.txt b/N1/1.txt
index 2a81eb8..308174f 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,275 +1,538 @@
-SGVsbG8gR3VlbnRlciwKCkFtIDExLjA2LjIwMTQgMTk6MTEsIHNjaHJpZWIgR3VlbnRlciBSb2Vj
-azoKPiBPbiAwNi8xMC8yMDE0IDExOjI4IFBNLCBIZWlrbyBTY2hvY2hlciB3cm90ZToKPj4gRHJp
-dmVyIGZvciB0aGUgVEkgVE1QMTAzLgo+Pgo+PiBUaGUgVEkgVE1QMTAzIGlzIHNpbWlsYXIgdG8g
-dGhlIFRNUDEwMi4gSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4gYnkgaGF2aW5nIG9ubHkg
-OCBiaXQgcmVnaXN0ZXJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNA
-ZGVueC5kZT4KPj4gQ2M6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgo+PiBDYzog
-R3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0Pgo+PiBDYzogbGludXgta2VybmVsQHZn
-ZXIua2VybmVsLm9yZwo+Cj4gSGkgSGVpa28sCj4KPiBZb3UgZG9uJ3QgbmVlZCB0aG9zZSBDYzog
-aW4gdGhlIGhlYWRlci4KCk9rLCBJIHJlbW92ZSB0aGVtLgoKPiBXaHkgcGF0Y2ggMDkvMTMgPyBJ
-J2QgZXhwZWN0IHRvIHNlZSAxMiBtb3JlIHBhdGNoZXMgaW4gdGhpcyBzZXJpZXMsCgpIdXBzLCBz
-b3JyeSwgbXkgbWlzdGFrZSwgdGhlcmUgaXMganVzdCB0aGlzIHBhdGNoLi4uCgo+IGJ1dCB0aGVy
-ZSBpcyBvbmx5IG9uZSAoZXZlbiBvbiBrZXJuZWwub3JnKS4gSWYgeW91IHNlbnQgdGhvc2UKPiBv
-dGhlciBwYXRjaGVzIHRvIHZhcmlvdXMgb3RoZXIgbWFpbGluZyBsaXN0cywgZXZlcnlvbmUgd2ls
-bCB3b25kZXIKPiB3aGVyZSB0aGUgcmVtYWluaW5nIHBhdGNoZXMgYXJlLiBJZiB0aGVyZSBpcyBq
-dXN0IG9uZSBwYXRjaCwKPiBpdCBpcyBqdXN0IGNvbmZ1c2luZy4KPgo+PiAtLS0KPj4gRG9jdW1l
-bnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL3RtcDEwMyB8IDMwICsrKwo+PiBkcml2
-ZXJzL2h3bW9uL0tjb25maWcgfCAxMCArCj4+IGRyaXZlcnMvaHdtb24vTWFrZWZpbGUgfCAxICsK
-Pj4gZHJpdmVycy9od21vbi90bXAxMDMuYyB8IDI4MSArKysrKysrKysrKysrKysrKysrKysrKysr
-Cj4+IDQgZmlsZXMgY2hhbmdlZCwgMzIyIGluc2VydGlvbnMoKykKPj4gY3JlYXRlIG1vZGUgMTAw
-NjQ0IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi90bXAxMDMKPj4gY3Jl
-YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4KPj4gZGlmZiAtLWdpdCBh
-L0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi90bXAxMDMgYi9Eb2N1bWVu
-dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vdG1wMTAzCj4+IG5ldyBmaWxlIG1vZGUg
-MTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAuLjM2ZDdiMzYKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysg
-Yi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vdG1wMTAzCj4KPiBTaG91
-bGQgYmUgRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMuCgpIbW0uLiBJIGRpZCB0aGlzIGZpcnN0
-IHRoZXJlLCBidXQgInNjcmlwdHMvY2hlY2twYXRjaC5wbCIKd2FybnMgKGlmIHVzaW5nIGEgRFQg
-YmFzZWQgYm9hcmQgd2l0aCBjb21wYXRpYmxlID0gInRpLHRtcDEwMyIpOgoKV0FSTklORzogRFQg
-Y29tcGF0aWJsZSBzdHJpbmcgInRpLHRtcDEwMyIgYXBwZWFycyB1bi1kb2N1bWVudGVkIC0tIGNo
-ZWNrIC4vRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzLwojMzI0OiBGSUxFOiBhcmNo
-L2FybS9ib290L2R0cy9pbXg2cWRsLWFyaXN0YWluZXRvcy5kdHNpOjEwNzoKKyAgICAgICAgICAg
-ICAgIGNvbXBhdGlibGUgPSAidGksdG1wMTAzIjsKCj4+IEBAIC0wLDAgKzEsMzAgQEAKPj4gK0tl
-cm5lbCBkcml2ZXIgdG1wMTAzCj4+ICs9PT09PT09PT09PT09PT09PT09PQo+PiArCj4+ICtTdXBw
-b3J0ZWQgY2hpcHM6Cj4+ICsgKiBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMKPj4gKyBQcmVmaXg6
-ICd0bXAxMDMnCj4+ICsgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUKPj4gKyBQcm9kdWN0IGluZm8g
-YW5kIGRhdGFzaGVldDogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC90bXAxMDMKPj4gKwo+PiAr
-QXV0aG9yOgo+PiArIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+PiArCj4+ICtEZXNjcmlw
-dGlvbgo+PiArLS0tLS0tLS0tLS0KPj4gKwo+PiArVGhlIFRNUDEwMyBpcyBhIGRpZ2l0YWwgb3V0
-cHV0IHRlbXBlcmF0dXJlIHNlbnNvciBpbiBhIGZvdXItYmFsbAo+PiArd2FmZXIgY2hpcC1zY2Fs
-ZSBwYWNrYWdlIChXQ1NQKS4gVGhlIFRNUDEwMyBpcyBjYXBhYmxlIG9mIHJlYWRpbmcKPj4gK3Rl
-bXBlcmF0dXJlcyB0byBhIHJlc29sdXRpb24gb2YgMcKwQy4gVGhlIFRNUDEwMyBpcyBzcGVjaWZp
-ZWQgZm9yCj4+ICtvcGVyYXRpb24gb3ZlciBhIHRlbXBlcmF0dXJlIHJhbmdlIG9mIOKAkzQwwrBD
-IHRvICsxMjXCsEMuCj4+ICsKPj4gK1Jlc29sdXRpb246IDggQml0cwo+PiArQWNjdXJhY3k6IMKx
-McKwQyBUeXAgKOKAkzEwwrBDIHRvICsxMDDCsEMpCj4+ICsKPj4gK1RoZSBkcml2ZXIgcHJvdmlk
-ZXMgdGhlIGNvbW1vbiBzeXNmcy1pbnRlcmZhY2UgZm9yIHRlbXBlcmF0dXJlcyAoc2VlCj4+ICtE
-b2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZSB1bmRlciBUZW1wZXJhdHVyZXMpLgo+
-PiArCj4+ICtSZXF1aXJlZCBub2RlIHByb3BlcnRpZXM6Cj4+ICstIGNvbXBhdGlibGU6IG1hbnVm
-YWN0dXJlciBhbmQgY2hpcCBuYW1lCj4+ICsgInRpLHRtcDEwMyIKPj4gKy0gcmVnOiBJMkMgYnVz
-IGFkZHJlc3Mgb2YgdGhlIGRldmljZQo+Cj4gWW91IGRvbid0IG5lZWQgdGhpcyBwYXJ0LCBhbmQg
-aXQgaXMgbm90IHJlYWxseSBjb3JyZWN0ICh0aGVyZSBhcmUKPiBvdGhlciB3YXlzIHRvIGluc3Rh
-bnRpYXRlIHRoZSBkZXZpY2UsIGRldmljZXRyZWUgaXMganVzdCBvbmUgb2YgdGhlbSkuCgpPay4K
-Cj4gSSB3b3VsZCBzdWdnZXN0IHRvIHJlZmVyIHRvIERvY3VtZW50YXRpb24vaTJjL2luc3RhbnRp
-YXRpbmctZGV2aWNlcwo+IGluc3RlYWQuIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byB1cGRh
-dGUKPiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNl
-cy50eHQuCgpBaCwgb2ssIGdvb2QgaWRlYSwgdGhpcyByZW1vdmVzIGFsc28gdGhlIGNoZWNrcGF0
-Y2ggd2FybmluZywgdGhhbmtzIQpDaGFuZ2VkLgoKPiBBbHNvLCB3aGVuZXZlciB5b3UgdG91Y2gg
-YW55IG9mIHRoZSB0aGUgZHQgZmlsZXMsIHlvdSBuZWVkIHRvIGNvcHkKPiB0aGUgRFQgbWFpbnRh
-aW5lcnMuIHNjcmlwdHMvZ2V0X21haW50YWluZXIucGwgd2lsbCB0ZWxsIHlvdSB3aG8gbmVlZHMK
-PiB0byBiZSBjb3BpZWQuCgpPay4KClsuLi5dCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9u
-L01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQo+PiBpbmRleCAxMTc5OGFkLi44ZTJm
-NmEyIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+ICsrKyBiL2RyaXZl
-cnMvaHdtb24vTWFrZWZpbGUKPj4gQEAgLTEzNCw2ICsxMzQsNyBAQCBvYmotJChDT05GSUdfU0VO
-U09SU19TTVNDNDdNMTkyKSs9IHNtc2M0N20xOTIubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19B
-TUM2ODIxKSArPSBhbWM2ODIxLm8KPj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVEhNQzUwKSArPSB0
-aG1jNTAubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19UTVAxMDIpICs9IHRtcDEwMi5vCj4+ICtv
-YmotJChDT05GSUdfU0VOU09SU19UTVAxMDMpICs9IHRtcDEwMy5vCj4+IG9iai0kKENPTkZJR19T
-RU5TT1JTX1RNUDQwMSkgKz0gdG1wNDAxLm8KPj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDIx
-KSArPSB0bXA0MjEubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19UV0w0MDMwX01BREMpKz0gdHds
-NDAzMC1tYWRjLWh3bW9uLm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMg
-Yi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4
-IDAwMDAwMDAuLjBiZDMzZDYKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2h3bW9u
-L3RtcDEwMy5jCj4+IEBAIC0wLDAgKzEsMjgxIEBACj4+ICsvKgo+PiArICogVGV4YXMgSW5zdHJ1
-bWVudHMgVE1QMTAzIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKPj4gKyAqIENvcHly
-aWdodCAoQykgMjAxNCBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KPj4gKyAqCj4+ICsgKiBC
-YXNlZCBvbjoKPj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMiBTTUJ1cyB0ZW1wZXJhdHVy
-ZSBzZW5zb3IgZHJpdmVyCj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChDKSAyMDEwIFN0ZXZlbiBL
-aW5nIDxzZmtpbmdAZmR3ZGMuY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl
-IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsgKiBp
-dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
-Ymxpc2hlZCBieQo+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl
-cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
-dGVyIHZlcnNpb24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu
-IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkg
-V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVS
-Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhl
-Cj4+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiAr
-ICoKPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsjaW5jbHVk
-ZSA8bGludXgvaW5pdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gKyNpbmNsdWRl
-IDxsaW51eC9pMmMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgo+PiArI2luY2x1ZGUg
-PGxpbnV4L2h3bW9uLXN5c2ZzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+Cj4+ICsjaW5j
-bHVkZSA8bGludXgvbXV0ZXguaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4gKyNp
-bmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Cj4+ICsKPj4gKyNkZWZpbmUgRFJJVkVSX05BTUUgInRt
-cDEwMyIKPj4gKwo+PiArI2RlZmluZSBUTVAxMDNfVEVNUF9SRUcgMHgwMAo+PiArI2RlZmluZSBU
-TVAxMDNfQ09ORl9SRUcgMHgwMQo+PiArI2RlZmluZSBUTVAxMDNfVExPV19SRUcgMHgwMgo+PiAr
-I2RlZmluZSBUTVAxMDNfVEhJR0hfUkVHIDB4MDMKPj4gKwo+PiArI2RlZmluZSBUTVAxMDNfQ09O
-Rl9NMCAweDAxCj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX00xIDB4MDIKPj4gKyNkZWZpbmUgVE1Q
-MTAzX0NPTkZfTEMgMHgwNAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9GTCAweDA4Cj4+ICsjZGVm
-aW5lIFRNUDEwM19DT05GX0ZIIDB4MTAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwIDB4MjAK
-Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IxIDB4NDAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZf
-SUQgMHg4MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAoVE1QMTAzX0NPTkZfTTAgfCBUTVAx
-MDNfQ09ORl9NMSkKPj4gKwo+PiArc3RydWN0IHRtcDEwMyB7Cj4+ICsgc3RydWN0IGRldmljZSAq
-aHdtb25fZGV2Owo+PiArIHN0cnVjdCBtdXRleCBsb2NrOwo+PiArIHUxNiBjb25maWdfb3JpZzsK
-Pj4gKyB1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwo+PiArIGludCB0ZW1wWzNdOwo+PiArfTsK
-Pj4gKwo+PiArc3RhdGljIGlubGluZSBpbnQgdG1wMTAzX3JlZ190b19tQyhzOCB2YWwpCj4+ICt7
-Cj4+ICsgcmV0dXJuIHZhbCAqIDEwMDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgdTgg
-dG1wMTAzX21DX3RvX3JlZyhpbnQgdmFsKQo+PiArewo+PiArIHJldHVybiB2YWwgLyAxMDAwOwo+
-Cj4gRElWX1JPVU5EX0NMT1NFU1QoKSA/Cj4KPiBObyBjYW1lbENhc2UsIHBsZWFzZS4KCk9rIC4u
-LiBobW0sIHdvbmRlcmluZyB0aGF0IGNoZWNrcGF0Y2gucGwgbm90IGNsYWltZWQgdGhpcy4KcmVt
-b3ZlZC4KCj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCB1OCB0bXAxMDNfcmVnW10gPSB7Cj4+
-ICsgVE1QMTAzX1RFTVBfUkVHLAo+PiArIFRNUDEwM19UTE9XX1JFRywKPj4gKyBUTVAxMDNfVEhJ
-R0hfUkVHLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCB0bXAxMDMgKnRtcDEwM191cGRh
-dGVfZGV2aWNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCj4+ICt7Cj4+ICsgc3RydWN0IHRt
-cDEwMyAqdG1wMTAzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4+ICsKPj4gKyBtdXRl
-eF9sb2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtcDEw
-My0+bGFzdF91cGRhdGUgKyBIWiAvIDMpKSB7Cj4+ICsgaW50IGk7Cj4+ICsKPj4gKyBmb3IgKGkg
-PSAwOyBpIDwgQVJSQVlfU0laRSh0bXAxMDMtPnRlbXApOyArK2kpIHsKPj4gKyBpbnQgc3RhdHVz
-ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKPj4gKyB0bXAxMDNfcmVnW2ldKTsK
-Pj4gKyBpZiAoc3RhdHVzID4gLTEpCj4+ICsgdG1wMTAzLT50ZW1wW2ldID0gdG1wMTAzX3JlZ190
-b19tQyhzdGF0dXMpOwo+Cj4gSSB1bmRlcnN0YW5kIHRoaXMgaXMgZnJvbSB0aGUgdG1wMTAyIGRy
-aXZlciwgYnV0IGl0IGlzIGtpbmQgb2YgdW51c3VhbAo+IGJlY2F1c2UgaXQgZG9lcyBub3QgcmVw
-b3J0IHRoZSBlcnJvciBiYWNrIHRvIHRoZSB1c2VyLiBQbGVhc2UgY29uc2lkZXIKPiBkb2luZyB0
-aGF0LCBpZSByZXR1cm4gUFRSX0VSUihzdGF0dXMpIG9uIGVycm9yIGFuZCBjaGVjay9yZXR1cm4g
-dGhlIGVycm9yCj4gZnJvbSB0aGUgY2FsbGluZyBmdW5jdGlvbnMuIElycmVsZXZhbnQgaWYgeW91
-IHVzZSByZWdtYXAgKHNlZSBiZWxvdykuCgp5b3UgbWVhbiBFUlJfUFRSKCkgPwpPaywgYWRkIHRo
-aXMuCgo+PiArIH0KPj4gKyB0bXAxMDMtPmxhc3RfdXBkYXRlID0gamlmZmllczsKPj4gKyB9Cj4+
-ICsgbXV0ZXhfdW5sb2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIHJldHVybiB0bXAxMDM7Cj4+ICt9
-Cj4KPiBPdmVyYWxsIHlvdSBtaWdodCBjb25zaWRlciBkcm9wcGluZyB0aGUgdXBkYXRlIGZ1bmN0
-aW9uIGFuZCB1c2luZyByZWdtYXAgaW5zdGVhZC4KPiBJdCB3b3VsZCBiZSBhbiBleGNlbGxlbnQg
-Zml0IGZvciB0aGlzIGRyaXZlcjsgd2hpbGUgaXQgZG9lc24ndCBkbyB0aW1lZCBjYWNoaW5nCj4g
-aXQgc3VwcG9ydHMgcGVyLXJlZ2lzdGVyIGNhY2hpbmcgd2hpY2ggaXMgdWx0aW1hdGVseSBtb3Jl
-IHVzZWZ1bCBhbnl3YXkuCj4gU29tZSBvZiB0aGUgZHJpdmVycyBpbiB0aGUgaHdtb24gZGlyZWN0
-b3J5IHVzZSBpdCwgc28geW91IGNvdWxkIHVzZSB0aGF0Cj4gYXMgZXhhbXBsZS4gTm90IG1hbmRh
-dG9yeSwgdGhvdWdoOyBqdXN0IGEgc3VnZ2VzdGlvbi4KCkNvdWxkIHlvdSBnaXZlIG1lIGFuIGV4
-YW1wbGU/Cgo+PiArCj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2hvd190ZW1wKHN0cnVjdCBk
-ZXZpY2UgKmRldiwKPj4gKyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPj4gKyBjaGFy
-ICpidWYpCj4+ICt7Cj4+ICsgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0
-b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Cj4+ICsgc3RydWN0IHRtcDEwMyAqdG1wMTAzID0gdG1w
-MTAzX3VwZGF0ZV9kZXZpY2UodG9faTJjX2NsaWVudChkZXYpKTsKPj4gKwo+PiArIHJldHVybiBz
-cHJpbnRmKGJ1ZiwgIiVkXG4iLCB0bXAxMDMtPnRlbXBbc2RhLT5pbmRleF0pOwo+PiArfQo+PiAr
-Cj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAo+
-PiArIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAo+PiArIGNvbnN0IGNoYXIgKmJ1Ziwg
-c2l6ZV90IGNvdW50KQo+PiArewo+PiArIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAq
-c2RhID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+PiArIHN0cnVjdCBpMmNfY2xpZW50ICpj
-bGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Cj4+ICsgc3RydWN0IHRtcDEwMyAqdG1wMTAzID0g
-aTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4+ICsgbG9uZyB2YWw7Cj4+ICsgaW50IHN0YXR1
-czsKPj4gKwo+PiArIGlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKPj4gKyByZXR1cm4g
-LUVJTlZBTDsKPj4gKyB2YWwgPSBjbGFtcF92YWwodmFsLCAtNTUwMDAsIDEyODAwMCk7Cj4KPiBN
-YXggc2hvdWxkIGJlIDEyNzAwMC4KCk9rLCBjaGFuZ2UgdGhpcy4KCj4+ICsKPj4gKyBtdXRleF9s
-b2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIHRtcDEwMy0+dGVtcFtzZGEtPmluZGV4XSA9IHZhbDsK
-Pgo+IFlvdSBjYW4gbm90IGRvIHRoYXQgc2luY2UgaXQgaXMgdGhlIG5vbi1yb3VuZGVkIHZhbHVl
-LiBZb3UgaGF2ZSB0byBjb252ZXJ0IHRvCj4gdGhlIHJlZ2lzdGVyIHZhbHVlLCB0aGVuIGNvbnZl
-cnQgYmFjayB0byB0aGUgZGlzcGxheSB2YWx1ZS4KPgo+IElmIHlvdSB1c2UgcmVnbWFwLCB0aGUg
-cHJvYmxlbSBnb2VzIGF3YXksIHNpbmNlIHlvdSB3b3VsZCBub3QgY2FjaGUgY29udmVydGVkCj4g
-ZGF0YSBidXQgY29udmVydCBpbiB0aGUgc2hvdyBmdW5jdGlvbi4gQWx0ZXJuYXRpdmVseSwgeW91
-IGNvdWxkIHN0b3JlIHJlZ2lzdGVyCj4gdmFsdWVzIGFuZCBjb252ZXJ0IGluIHRoZSBzaG93IGZ1
-bmN0aW9uLgoKSSB0YWtlIGEgbG9vayBhdCB0aGlzLgoKPj4gKyBzdGF0dXMgPSBpMmNfc21idXNf
-d3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgdG1wMTAzX3JlZ1tzZGEtPmluZGV4XSwKPj4gKyB0bXAx
-MDNfbUNfdG9fcmVnKHZhbCkpOwo+Cj4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGNvbnRpbnVhdGlv
-biBsaW5lcyBtYXRjaCB0aGUgJygnIGluIHRoZSBsaW5lIGFib3ZlLgo+IEFsaWdubWVudHMgYXJl
-IGluY29uc2lzdGVudCwgb3RoZXJ3aXNlIEkgd291bGQgbm90IG1lbnRpb24gaXQuCj4gY2hlY2tw
-YXRjaCAtLXN0cmljdCB0ZWxscyB5b3Ugd2hpY2ggb25lcyBhcmUgbWlzYWxpZ25lZC4KCkFoLCBk
-aWQgYSBjaGVja3BhdGNoIGJ1dCB3aXRob3V0IHRoZSAiLS1zdHJpY3QiIG9wdGlvbiAhCgpJIGZp
-eCB0aGlzIGdsb2JhbGx5LgoKPj4gKyBtdXRleF91bmxvY2soJnRtcDEwMy0+bG9jayk7Cj4+ICsg
-cmV0dXJuIHN0YXR1cyA/IDogY291bnQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBTRU5TT1JfREVW
-SUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHRtcDEwM19zaG93X3RlbXAsIE5VTEwgLCAw
-KTsKPj4gKwo+IElmIHlvdSB1c2UgcmVnbWFwIHlvdSBjYW4gc3RvcmUgdGhlIHJlZ2lzdGVyIGRp
-cmVjdGx5IGhlcmUgYW5kIHlvdSB3b3VsZCBub3QKPiBuZWVkIHRtcDEwM19yZWdbXS4KCk9rLgoK
-Pj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVdVU1IgfCBT
-X0lSVUdPLCB0bXAxMDNfc2hvd190ZW1wLAo+PiArIHRtcDEwM19zZXRfdGVtcCwgMSk7Cj4+ICsK
-PiBQZXIgdGhlIGRhdGFzaGVldCB0aGlzIHNob3VsZCBiZSB0ZW1wMV9taW4uIFRoZSByZWdpc3Rl
-ciBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB0byBUTVAxMDIuCgpjaGFuZ2VkLgoKPj4gK3N0YXRp
-YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgdG1wMTAz
-X3Nob3dfdGVtcCwKPj4gKyB0bXAxMDNfc2V0X3RlbXAsIDIpOwo+PiArCj4+ICtzdGF0aWMgc3Ry
-dWN0IGF0dHJpYnV0ZSAqdG1wMTAzX2F0dHJpYnV0ZXNbXSA9IHsKPj4gKyAmc2Vuc29yX2Rldl9h
-dHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCj4+ICsgJnNlbnNvcl9kZXZfYXR0cl90ZW1w
-MV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAo+PiArICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4
-LmRldl9hdHRyLmF0dHIsCj4KPiBZb3UgbWlnaHQgYWxzbyBjb25zaWRlciBhZGRpbmcgdGVtcDFf
-bWluX2FsYXJtIGFuZCB0ZW1wMV9tYXhfYWxhcm0gdG8gaW5mb3JtCj4gdXNlciBzcGFjZSBpZiBs
-aW1pdHMgYXJlIGV4Y2VlZGVkLiBUaGUgc3RhdHVzIGlzIHJlcG9ydGVkIHdpdGggdGhlIEZMIGFu
-ZCBGSAo+IGJpdHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCgpBZGQgdGhpcyBpZiBJ
-IGZpbmQgdGltZSwgb3IgaW4gYW4gYW5vdGhlciBwYXRjaC4uLgoKPj4gKyBOVUxMCj4+ICt9Owo+
-PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0bXAxMDNfYXR0cl9n
-cm91cCA9IHsKPj4gKyAuYXR0cnMgPSB0bXAxMDNfYXR0cmlidXRlcywKPj4gK307Cj4+ICsKPiBQ
-bGVhc2UgdXNlIHRoZSBBVFRSSUJVVEVfR1JPVVBTKCkgbWFjcm8uCgpPay4KCj4+ICsjZGVmaW5l
-IFRNUDEwM19DT05GSUcgKFRNUDEwM19DT05GX0NSMSB8IFRNUDEwM19DT05GX00xKQo+PiArI2Rl
-ZmluZSBUTVAxMDNfQ09ORklHX1JEX09OTFkgKFRNUDEwM19DT05GX0NSMSB8IFRNUDEwM19DT05G
-X00xKQo+Cj4gTGF0dGVyIGRlZmluZSBpcyBub3QgdXNlZCBhcyBmYXIgYXMgSSBjYW4gc2VlLiBT
-aW5jZSBpdCBpcyB0aGUgc2FtZQo+IGl0IGlzIHVubmVjZXNzYXJ5IGFueXdheS4KCnJlbW92ZWQu
-Cgo+PiArCj4+ICtzdGF0aWMgaW50IHRtcDEwM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xp
-ZW50LAo+PiArIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPj4gK3sKPj4gKyBzdHJ1
-Y3QgdG1wMTAzICp0bXAxMDM7Cj4+ICsgaW50IHN0YXR1czsKPj4gKwo+PiArIGlmICghaTJjX2No
-ZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAo+PiArIEkyQ19GVU5DX1NNQlVTX1dP
-UkRfREFUQSkpIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwKPj4gKyAiYWRhcHRlciBkb2Vz
-bid0IHN1cHBvcnQgU01CdXMgd29yZCB0cmFuc2FjdGlvbnNcbiIpOwo+Cj4gR29vZCB0aGF0IHRo
-ZSBjaGlwIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgOy0pLiBDaGVjayBmb3IgYnl0ZSB0cmFuc2FjdGlv
-bnMgaW5zdGVhZC4KCkhlaC4uLiBjaGFuZ2VkLgoKPj4gKyByZXR1cm4gLUVOT0RFVjsKPj4gKyB9
-Cj4+ICsKPj4gKyB0bXAxMDMgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnRt
-cDEwMyksIEdGUF9LRVJORUwpOwo+PiArIGlmICghdG1wMTAzKQo+PiArIHJldHVybiAtRU5PTUVN
-Owo+PiArCj4+ICsgaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdG1wMTAzKTsKPj4gKwo+PiAr
-IHN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFRNUDEwM19DT05GX1JF
-Ryk7Cj4+ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwgImVy
-cm9yIHJlYWRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyByZXR1cm4gc3RhdHVzOwo+PiAr
-IH0KPj4gKyB0bXAxMDMtPmNvbmZpZ19vcmlnID0gc3RhdHVzOwo+Cj4gWW91IGRvbid0IHVzZSBj
-b25maWdfb3JpZyBvdXRzaWRlIHRoZSBwcm9iZSBmdW5jdGlvbiwKPiBzbyBzdG9yaW5nIGl0IGlu
-IHByaXZhdGUgZGF0YSBkb2Vzbid0IGFkZCBhbnkgdmFsdWUuCj4gQWx0ZXJuYXRpdmVseSwgeW91
-IGNvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gb24gZXhpdC4KCkkgYWRk
-ICJyZXN0b3JpbmcgaXQgb24gZXhpdC4iCgo+PiArIHN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9i
-eXRlX2RhdGEoY2xpZW50LCBUTVAxMDNfQ09ORl9SRUcsCj4+ICsgVE1QMTAzX0NPTkZJRyk7Cj4+
-ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIHdy
-aXRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyBnb3RvIGZhaWxfcmVzdG9yZV9jb25maWc7
-Cj4+ICsgfQo+PiArIHN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFRN
-UDEwM19DT05GX1JFRyk7Cj4+ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGll
-bnQtPmRldiwgImVycm9yIHJlYWRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyBnb3RvIGZh
-aWxfcmVzdG9yZV9jb25maWc7Cj4+ICsgfQo+PiArIGlmIChzdGF0dXMgIT0gVE1QMTAzX0NPTkZJ
-Rykgewo+PiArIGRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY29uZmlnIHNldHRpbmdzIGRpZCBub3Qg
-c3RpY2tcbiIpOwo+PiArIHN0YXR1cyA9IC1FTk9ERVY7Cj4+ICsgZ290byBmYWlsX3Jlc3RvcmVf
-Y29uZmlnOwo+PiArIH0KPj4gKyB0bXAxMDMtPmxhc3RfdXBkYXRlID0gamlmZmllcyAtIEhaOwo+
-PiArIG11dGV4X2luaXQoJnRtcDEwMy0+bG9jayk7Cj4+ICsKPj4gKyBzdGF0dXMgPSBzeXNmc19j
-cmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICsg
-aWYgKHN0YXR1cykgewo+PiArIGRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY291bGQgbm90IGNyZWF0
-ZSBzeXNmcyBmaWxlc1xuIik7Cj4+ICsgZ290byBmYWlsX3Jlc3RvcmVfY29uZmlnOwo+PiArIH0K
-Pj4gKyB0bXAxMDMtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5k
-ZXYpOwo+PiArIGlmIChJU19FUlIodG1wMTAzLT5od21vbl9kZXYpKSB7Cj4+ICsgZGV2X2RiZygm
-Y2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKPj4gKyBz
-dGF0dXMgPSBQVFJfRVJSKHRtcDEwMy0+aHdtb25fZGV2KTsKPj4gKyBnb3RvIGZhaWxfcmVtb3Zl
-X3N5c2ZzOwo+PiArIH0KPgo+IFBsZWFzZSB1c2UgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJf
-d2l0aF9ncm91cHMoKS4KCk9rLgoKPj4gKwo+PiArIGRldl9pbmZvKCZjbGllbnQtPmRldiwgImlu
-aXRpYWxpemVkXG4iKTsKPgo+IFBsZWFzZSBkcm9wIHRoaXMgbWVzc2FnZS4KCk9rLgoKPj4gKwo+
-PiArIHJldHVybiAwOwo+PiArCj4+ICtmYWlsX3JlbW92ZV9zeXNmczoKPj4gKyBzeXNmc19yZW1v
-dmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICtmYWls
-X3Jlc3RvcmVfY29uZmlnOgo+PiArIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50
-LCBUTVAxMDNfQ09ORl9SRUcsCj4+ICsgdG1wMTAzLT5jb25maWdfb3JpZyk7Cj4KPiBpMmNfc21i
-dXNfd3JpdGVfYnl0ZV9kYXRhKCkgPwoKWWVzLCBjaGFuZ2VkIQoKPj4gKyByZXR1cm4gc3RhdHVz
-Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRtcDEwM19yZW1vdmUoc3RydWN0IGkyY19jbGll
-bnQgKmNsaWVudCkKPj4gK3sKPj4gKyBzdHJ1Y3QgdG1wMTAzICp0bXAxMDMgPSBpMmNfZ2V0X2Ns
-aWVudGRhdGEoY2xpZW50KTsKPj4gKwo+PiArIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHRtcDEw
-My0+aHdtb25fZGV2KTsKPj4gKyBzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmos
-ICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICsKPj4gKyByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiAr
-I2lmZGVmIENPTkZJR19QTQo+PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2
-aWNlICpkZXYpCj4+ICt7Cj4+ICsgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19j
-bGllbnQoZGV2KTsKPj4gKyBpbnQgY29uZmlnOwo+PiArCj4+ICsgY29uZmlnID0gaTJjX3NtYnVz
-X3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHKTsKPgo+IGJ5dGUKPgo+
-PiArIGlmIChjb25maWcgPCAwKQo+PiArIHJldHVybiBjb25maWc7Cj4+ICsKPj4gKyBjb25maWcg
-Jj0gflRNUDEwM19DT05GX1NEOwo+PiArIHJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2Fw
-cGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHLCBjb25maWcpOwo+Cj4gYnl0ZQo+Cj4+ICt9Cj4+
-ICsKPj4gK3N0YXRpYyBpbnQgdG1wMTAzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7
-Cj4+ICsgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKPj4g
-KyBpbnQgY29uZmlnOwo+PiArCj4+ICsgY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2Fw
-cGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHKTsKPgo+IGJ5dGUKPgo+PiArIGlmIChjb25maWcg
-PCAwKQo+PiArIHJldHVybiBjb25maWc7Cj4+ICsKPj4gKyBjb25maWcgfD0gVE1QMTAzX0NPTkZf
-U0Q7Cj4+ICsgcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAx
-MDNfQ09ORl9SRUcsIGNvbmZpZyk7Cj4KPiBieXRlCgpjaGFuZ2VkLgoKPj4gK30KPj4gKwo+PiAr
-c3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRtcDEwM19kZXZfcG1fb3BzID0gewo+PiAr
-IC5zdXNwZW5kID0gdG1wMTAzX3N1c3BlbmQsCj4+ICsgLnJlc3VtZSA9IHRtcDEwM19yZXN1bWUs
-Cj4+ICt9Owo+PiArCj4+ICsjZGVmaW5lIFRNUDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9w
-bV9vcHMpCj4+ICsjZWxzZQo+PiArI2RlZmluZSBUTVAxMDNfREVWX1BNX09QUyBOVUxMCj4+ICsj
-ZW5kaWYgLyogQ09ORklHX1BNICovCj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rl
-dmljZV9pZCB0bXAxMDNfaWRbXSA9IHsKPj4gKyB7IERSSVZFUl9OQU1FLCAwIH0sCj4+ICsgeyB9
-Cj4+ICt9Owo+PiArTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRtcDEwM19pZCk7Cj4+ICsKPj4g
-K3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bXAxMDNfZHJpdmVyID0gewo+PiArIC5kcml2ZXIu
-bmFtZSA9IERSSVZFUl9OQU1FLAo+PiArIC5kcml2ZXIucG0gPSBUTVAxMDNfREVWX1BNX09QUywK
-Pgo+IC5kcml2ZXIgPSB7Cj4gLm5hbWUgPSBEUklWRVJfTkFNRSwKPiAucG0gPSBUTVAxMDNfREVW
-X1BNX09QUywKPiB9LAo+Cj4gd291bGQgYmUgYSBiaXQgbmljZXIuIEkgd29uJ3QgbWFuZGF0ZSBp
-dCwgdGhvdWdoLgoKY2hhbmdlZC4KCj4+ICsgLnByb2JlID0gdG1wMTAzX3Byb2JlLAo+PiArIC5y
-ZW1vdmUgPSB0bXAxMDNfcmVtb3ZlLAo+PiArIC5pZF90YWJsZSA9IHRtcDEwM19pZCwKPj4gK307
-Cj4+ICsKPj4gK21vZHVsZV9pMmNfZHJpdmVyKHRtcDEwM19kcml2ZXIpOwo+PiArCj4+ICtNT0RV
-TEVfQVVUSE9SKCJIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4iKTsKPj4gK01PRFVMRV9ERVND
-UklQVElPTigiVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2
-ZXIiKTsKPj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKClRoYW5rcyBmb3IgdGhpcyBncmVhdCBy
-ZXZpZXchCgpieWUsCkhlaWtvCi0tIApERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgsICAg
-ICBNRDogV29sZmdhbmcgRGVuayAmIERldGxldiBadW5kZWwKSFJCIDE2NTIzNSBNdW5pY2gsIE9m
-ZmljZTogS2lyY2hlbnN0ci41LCBELTgyMTk0IEdyb2ViZW56ZWxsLCBHZXJtYW55CgpfX19fX19f
-X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxp
-bmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3Jz
-Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM
+Hello Guenter,
+
+Am 11.06.2014 19:11, schrieb Guenter Roeck:
+> On 06/10/2014 11:28 PM, Heiko Schocher wrote:
+>> Driver for the TI TMP103.
+>>
+>> The TI TMP103 is similar to the TMP102. It differs from the TMP102
+>> by having only 8 bit registers.
+>>
+>> Signed-off-by: Heiko Schocher <hs@denx.de>
+>> Cc: Jean Delvare <khali@linux-fr.org>
+>> Cc: Guenter Roeck <linux@roeck-us.net>
+>> Cc: linux-kernel@vger.kernel.org
+>
+> Hi Heiko,
+>
+> You don't need those Cc: in the header.
+
+Ok, I remove them.
+
+> Why patch 09/13 ? I'd expect to see 12 more patches in this series,
+
+Hups, sorry, my mistake, there is just this patch...
+
+> but there is only one (even on kernel.org). If you sent those
+> other patches to various other mailing lists, everyone will wonder
+> where the remaining patches are. If there is just one patch,
+> it is just confusing.
+>
+>> ---
+>> Documentation/devicetree/bindings/hwmon/tmp103 | 30 +++
+>> drivers/hwmon/Kconfig | 10 +
+>> drivers/hwmon/Makefile | 1 +
+>> drivers/hwmon/tmp103.c | 281 +++++++++++++++++++++++++
+>> 4 files changed, 322 insertions(+)
+>> create mode 100644 Documentation/devicetree/bindings/hwmon/tmp103
+>> create mode 100644 drivers/hwmon/tmp103.c
+>>
+>> diff --git a/Documentation/devicetree/bindings/hwmon/tmp103 b/Documentation/devicetree/bindings/hwmon/tmp103
+>> new file mode 100644
+>> index 0000000..36d7b36
+>> --- /dev/null
+>> +++ b/Documentation/devicetree/bindings/hwmon/tmp103
+>
+> Should be Documentation/hwmon/tmp103.
+
+Hmm.. I did this first there, but "scripts/checkpatch.pl"
+warns (if using a DT based board with compatible = "ti,tmp103"):
+
+WARNING: DT compatible string "ti,tmp103" appears un-documented -- check ./Documentation/devicetree/bindings/
+#324: FILE: arch/arm/boot/dts/imx6qdl-aristainetos.dtsi:107:
++               compatible = "ti,tmp103";
+
+>> @@ -0,0 +1,30 @@
+>> +Kernel driver tmp103
+>> +====================
+>> +
+>> +Supported chips:
+>> + * Texas Instruments TMP103
+>> + Prefix: 'tmp103'
+>> + Addresses scanned: none
+>> + Product info and datasheet: http://www.ti.com/product/tmp103
+>> +
+>> +Author:
+>> + Heiko Schocher <hs@denx.de>
+>> +
+>> +Description
+>> +-----------
+>> +
+>> +The TMP103 is a digital output temperature sensor in a four-ball
+>> +wafer chip-scale package (WCSP). The TMP103 is capable of reading
+>> +temperatures to a resolution of 1°C. The TMP103 is specified for
+>> +operation over a temperature range of –40°C to +125°C.
+>> +
+>> +Resolution: 8 Bits
+>> +Accuracy: ±1°C Typ (–10°C to +100°C)
+>> +
+>> +The driver provides the common sysfs-interface for temperatures (see
+>> +Documentation/hwmon/sysfs-interface under Temperatures).
+>> +
+>> +Required node properties:
+>> +- compatible: manufacturer and chip name
+>> + "ti,tmp103"
+>> +- reg: I2C bus address of the device
+>
+> You don't need this part, and it is not really correct (there are
+> other ways to instantiate the device, devicetree is just one of them).
+
+Ok.
+
+> I would suggest to refer to Documentation/i2c/instantiating-devices
+> instead. It might also make sense to update
+> Documentation/devicetree/bindings/i2c/trivial-devices.txt.
+
+Ah, ok, good idea, this removes also the checkpatch warning, thanks!
+Changed.
+
+> Also, whenever you touch any of the the dt files, you need to copy
+> the DT maintainers. scripts/get_maintainer.pl will tell you who needs
+> to be copied.
+
+Ok.
+
+[...]
+>> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+>> index 11798ad..8e2f6a2 100644
+>> --- a/drivers/hwmon/Makefile
+>> +++ b/drivers/hwmon/Makefile
+>> @@ -134,6 +134,7 @@ obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o
+>> obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o
+>> obj-$(CONFIG_SENSORS_THMC50) += thmc50.o
+>> obj-$(CONFIG_SENSORS_TMP102) += tmp102.o
+>> +obj-$(CONFIG_SENSORS_TMP103) += tmp103.o
+>> obj-$(CONFIG_SENSORS_TMP401) += tmp401.o
+>> obj-$(CONFIG_SENSORS_TMP421) += tmp421.o
+>> obj-$(CONFIG_SENSORS_TWL4030_MADC)+= twl4030-madc-hwmon.o
+>> diff --git a/drivers/hwmon/tmp103.c b/drivers/hwmon/tmp103.c
+>> new file mode 100644
+>> index 0000000..0bd33d6
+>> --- /dev/null
+>> +++ b/drivers/hwmon/tmp103.c
+>> @@ -0,0 +1,281 @@
+>> +/*
+>> + * Texas Instruments TMP103 SMBus temperature sensor driver
+>> + * Copyright (C) 2014 Heiko Schocher <hs@denx.de>
+>> + *
+>> + * Based on:
+>> + * Texas Instruments TMP102 SMBus temperature sensor driver
+>> + *
+>> + * Copyright (C) 2010 Steven King <sfking@fdwdc.com>
+>> + *
+>> + * This program is free software; you can redistribute it and/or modify
+>> + * it under the terms of the GNU General Public License as published by
+>> + * the Free Software Foundation; either version 2 of the License, or
+>> + * (at your option) any later version.
+>> + *
+>> + * This program is distributed in the hope that it will be useful,
+>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
+>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+>> + * GNU General Public License for more details.
+>> + *
+>> + */
+>> +
+>> +#include <linux/module.h>
+>> +#include <linux/init.h>
+>> +#include <linux/slab.h>
+>> +#include <linux/i2c.h>
+>> +#include <linux/hwmon.h>
+>> +#include <linux/hwmon-sysfs.h>
+>> +#include <linux/err.h>
+>> +#include <linux/mutex.h>
+>> +#include <linux/device.h>
+>> +#include <linux/jiffies.h>
+>> +
+>> +#define DRIVER_NAME "tmp103"
+>> +
+>> +#define TMP103_TEMP_REG 0x00
+>> +#define TMP103_CONF_REG 0x01
+>> +#define TMP103_TLOW_REG 0x02
+>> +#define TMP103_THIGH_REG 0x03
+>> +
+>> +#define TMP103_CONF_M0 0x01
+>> +#define TMP103_CONF_M1 0x02
+>> +#define TMP103_CONF_LC 0x04
+>> +#define TMP103_CONF_FL 0x08
+>> +#define TMP103_CONF_FH 0x10
+>> +#define TMP103_CONF_CR0 0x20
+>> +#define TMP103_CONF_CR1 0x40
+>> +#define TMP103_CONF_ID 0x80
+>> +#define TMP103_CONF_SD (TMP103_CONF_M0 | TMP103_CONF_M1)
+>> +
+>> +struct tmp103 {
+>> + struct device *hwmon_dev;
+>> + struct mutex lock;
+>> + u16 config_orig;
+>> + unsigned long last_update;
+>> + int temp[3];
+>> +};
+>> +
+>> +static inline int tmp103_reg_to_mC(s8 val)
+>> +{
+>> + return val * 1000;
+>> +}
+>> +
+>> +static inline u8 tmp103_mC_to_reg(int val)
+>> +{
+>> + return val / 1000;
+>
+> DIV_ROUND_CLOSEST() ?
+>
+> No camelCase, please.
+
+Ok ... hmm, wondering that checkpatch.pl not claimed this.
+removed.
+
+>> +}
+>> +
+>> +static const u8 tmp103_reg[] = {
+>> + TMP103_TEMP_REG,
+>> + TMP103_TLOW_REG,
+>> + TMP103_THIGH_REG,
+>> +};
+>> +
+>> +static struct tmp103 *tmp103_update_device(struct i2c_client *client)
+>> +{
+>> + struct tmp103 *tmp103 = i2c_get_clientdata(client);
+>> +
+>> + mutex_lock(&tmp103->lock);
+>> + if (time_after(jiffies, tmp103->last_update + HZ / 3)) {
+>> + int i;
+>> +
+>> + for (i = 0; i < ARRAY_SIZE(tmp103->temp); ++i) {
+>> + int status = i2c_smbus_read_byte_data(client,
+>> + tmp103_reg[i]);
+>> + if (status > -1)
+>> + tmp103->temp[i] = tmp103_reg_to_mC(status);
+>
+> I understand this is from the tmp102 driver, but it is kind of unusual
+> because it does not report the error back to the user. Please consider
+> doing that, ie return PTR_ERR(status) on error and check/return the error
+> from the calling functions. Irrelevant if you use regmap (see below).
+
+you mean ERR_PTR() ?
+Ok, add this.
+
+>> + }
+>> + tmp103->last_update = jiffies;
+>> + }
+>> + mutex_unlock(&tmp103->lock);
+>> + return tmp103;
+>> +}
+>
+> Overall you might consider dropping the update function and using regmap instead.
+> It would be an excellent fit for this driver; while it doesn't do timed caching
+> it supports per-register caching which is ultimately more useful anyway.
+> Some of the drivers in the hwmon directory use it, so you could use that
+> as example. Not mandatory, though; just a suggestion.
+
+Could you give me an example?
+
+>> +
+>> +static ssize_t tmp103_show_temp(struct device *dev,
+>> + struct device_attribute *attr,
+>> + char *buf)
+>> +{
+>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
+>> + struct tmp103 *tmp103 = tmp103_update_device(to_i2c_client(dev));
+>> +
+>> + return sprintf(buf, "%d\n", tmp103->temp[sda->index]);
+>> +}
+>> +
+>> +static ssize_t tmp103_set_temp(struct device *dev,
+>> + struct device_attribute *attr,
+>> + const char *buf, size_t count)
+>> +{
+>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);
+>> + struct i2c_client *client = to_i2c_client(dev);
+>> + struct tmp103 *tmp103 = i2c_get_clientdata(client);
+>> + long val;
+>> + int status;
+>> +
+>> + if (kstrtol(buf, 10, &val) < 0)
+>> + return -EINVAL;
+>> + val = clamp_val(val, -55000, 128000);
+>
+> Max should be 127000.
+
+Ok, change this.
+
+>> +
+>> + mutex_lock(&tmp103->lock);
+>> + tmp103->temp[sda->index] = val;
+>
+> You can not do that since it is the non-rounded value. You have to convert to
+> the register value, then convert back to the display value.
+>
+> If you use regmap, the problem goes away, since you would not cache converted
+> data but convert in the show function. Alternatively, you could store register
+> values and convert in the show function.
+
+I take a look at this.
+
+>> + status = i2c_smbus_write_byte_data(client, tmp103_reg[sda->index],
+>> + tmp103_mC_to_reg(val));
+>
+> Please make sure that continuation lines match the '(' in the line above.
+> Alignments are inconsistent, otherwise I would not mention it.
+> checkpatch --strict tells you which ones are misaligned.
+
+Ah, did a checkpatch but without the "--strict" option !
+
+I fix this globally.
+
+>> + mutex_unlock(&tmp103->lock);
+>> + return status ? : count;
+>> +}
+>> +
+>> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp103_show_temp, NULL , 0);
+>> +
+> If you use regmap you can store the register directly here and you would not
+> need tmp103_reg[].
+
+Ok.
+
+>> +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, tmp103_show_temp,
+>> + tmp103_set_temp, 1);
+>> +
+> Per the datasheet this should be temp1_min. The register definition is different to TMP102.
+
+changed.
+
+>> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, tmp103_show_temp,
+>> + tmp103_set_temp, 2);
+>> +
+>> +static struct attribute *tmp103_attributes[] = {
+>> + &sensor_dev_attr_temp1_input.dev_attr.attr,
+>> + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,
+>> + &sensor_dev_attr_temp1_max.dev_attr.attr,
+>
+> You might also consider adding temp1_min_alarm and temp1_max_alarm to inform
+> user space if limits are exceeded. The status is reported with the FL and FH
+> bits in the configuration register.
+
+Add this if I find time, or in an another patch...
+
+>> + NULL
+>> +};
+>> +
+>> +static const struct attribute_group tmp103_attr_group = {
+>> + .attrs = tmp103_attributes,
+>> +};
+>> +
+> Please use the ATTRIBUTE_GROUPS() macro.
+
+Ok.
+
+>> +#define TMP103_CONFIG (TMP103_CONF_CR1 | TMP103_CONF_M1)
+>> +#define TMP103_CONFIG_RD_ONLY (TMP103_CONF_CR1 | TMP103_CONF_M1)
+>
+> Latter define is not used as far as I can see. Since it is the same
+> it is unnecessary anyway.
+
+removed.
+
+>> +
+>> +static int tmp103_probe(struct i2c_client *client,
+>> + const struct i2c_device_id *id)
+>> +{
+>> + struct tmp103 *tmp103;
+>> + int status;
+>> +
+>> + if (!i2c_check_functionality(client->adapter,
+>> + I2C_FUNC_SMBUS_WORD_DATA)) {
+>> + dev_err(&client->dev,
+>> + "adapter doesn't support SMBus word transactions\n");
+>
+> Good that the chip doesn't support any ;-). Check for byte transactions instead.
+
+Heh... changed.
+
+>> + return -ENODEV;
+>> + }
+>> +
+>> + tmp103 = devm_kzalloc(&client->dev, sizeof(*tmp103), GFP_KERNEL);
+>> + if (!tmp103)
+>> + return -ENOMEM;
+>> +
+>> + i2c_set_clientdata(client, tmp103);
+>> +
+>> + status = i2c_smbus_read_byte_data(client, TMP103_CONF_REG);
+>> + if (status < 0) {
+>> + dev_err(&client->dev, "error reading config register\n");
+>> + return status;
+>> + }
+>> + tmp103->config_orig = status;
+>
+> You don't use config_orig outside the probe function,
+> so storing it in private data doesn't add any value.
+> Alternatively, you could restore the original configuration on exit.
+
+I add "restoring it on exit."
+
+>> + status = i2c_smbus_write_byte_data(client, TMP103_CONF_REG,
+>> + TMP103_CONFIG);
+>> + if (status < 0) {
+>> + dev_err(&client->dev, "error writing config register\n");
+>> + goto fail_restore_config;
+>> + }
+>> + status = i2c_smbus_read_byte_data(client, TMP103_CONF_REG);
+>> + if (status < 0) {
+>> + dev_err(&client->dev, "error reading config register\n");
+>> + goto fail_restore_config;
+>> + }
+>> + if (status != TMP103_CONFIG) {
+>> + dev_err(&client->dev, "config settings did not stick\n");
+>> + status = -ENODEV;
+>> + goto fail_restore_config;
+>> + }
+>> + tmp103->last_update = jiffies - HZ;
+>> + mutex_init(&tmp103->lock);
+>> +
+>> + status = sysfs_create_group(&client->dev.kobj, &tmp103_attr_group);
+>> + if (status) {
+>> + dev_dbg(&client->dev, "could not create sysfs files\n");
+>> + goto fail_restore_config;
+>> + }
+>> + tmp103->hwmon_dev = hwmon_device_register(&client->dev);
+>> + if (IS_ERR(tmp103->hwmon_dev)) {
+>> + dev_dbg(&client->dev, "unable to register hwmon device\n");
+>> + status = PTR_ERR(tmp103->hwmon_dev);
+>> + goto fail_remove_sysfs;
+>> + }
+>
+> Please use devm_hwmon_device_register_with_groups().
+
+Ok.
+
+>> +
+>> + dev_info(&client->dev, "initialized\n");
+>
+> Please drop this message.
+
+Ok.
+
+>> +
+>> + return 0;
+>> +
+>> +fail_remove_sysfs:
+>> + sysfs_remove_group(&client->dev.kobj, &tmp103_attr_group);
+>> +fail_restore_config:
+>> + i2c_smbus_write_word_swapped(client, TMP103_CONF_REG,
+>> + tmp103->config_orig);
+>
+> i2c_smbus_write_byte_data() ?
+
+Yes, changed!
+
+>> + return status;
+>> +}
+>> +
+>> +static int tmp103_remove(struct i2c_client *client)
+>> +{
+>> + struct tmp103 *tmp103 = i2c_get_clientdata(client);
+>> +
+>> + hwmon_device_unregister(tmp103->hwmon_dev);
+>> + sysfs_remove_group(&client->dev.kobj, &tmp103_attr_group);
+>> +
+>> + return 0;
+>> +}
+>> +
+>> +#ifdef CONFIG_PM
+>> +static int tmp103_suspend(struct device *dev)
+>> +{
+>> + struct i2c_client *client = to_i2c_client(dev);
+>> + int config;
+>> +
+>> + config = i2c_smbus_read_word_swapped(client, TMP103_CONF_REG);
+>
+> byte
+>
+>> + if (config < 0)
+>> + return config;
+>> +
+>> + config &= ~TMP103_CONF_SD;
+>> + return i2c_smbus_write_word_swapped(client, TMP103_CONF_REG, config);
+>
+> byte
+>
+>> +}
+>> +
+>> +static int tmp103_resume(struct device *dev)
+>> +{
+>> + struct i2c_client *client = to_i2c_client(dev);
+>> + int config;
+>> +
+>> + config = i2c_smbus_read_word_swapped(client, TMP103_CONF_REG);
+>
+> byte
+>
+>> + if (config < 0)
+>> + return config;
+>> +
+>> + config |= TMP103_CONF_SD;
+>> + return i2c_smbus_write_word_swapped(client, TMP103_CONF_REG, config);
+>
+> byte
+
+changed.
+
+>> +}
+>> +
+>> +static const struct dev_pm_ops tmp103_dev_pm_ops = {
+>> + .suspend = tmp103_suspend,
+>> + .resume = tmp103_resume,
+>> +};
+>> +
+>> +#define TMP103_DEV_PM_OPS (&tmp103_dev_pm_ops)
+>> +#else
+>> +#define TMP103_DEV_PM_OPS NULL
+>> +#endif /* CONFIG_PM */
+>> +
+>> +static const struct i2c_device_id tmp103_id[] = {
+>> + { DRIVER_NAME, 0 },
+>> + { }
+>> +};
+>> +MODULE_DEVICE_TABLE(i2c, tmp103_id);
+>> +
+>> +static struct i2c_driver tmp103_driver = {
+>> + .driver.name = DRIVER_NAME,
+>> + .driver.pm = TMP103_DEV_PM_OPS,
+>
+> .driver = {
+> .name = DRIVER_NAME,
+> .pm = TMP103_DEV_PM_OPS,
+> },
+>
+> would be a bit nicer. I won't mandate it, though.
+
+changed.
+
+>> + .probe = tmp103_probe,
+>> + .remove = tmp103_remove,
+>> + .id_table = tmp103_id,
+>> +};
+>> +
+>> +module_i2c_driver(tmp103_driver);
+>> +
+>> +MODULE_AUTHOR("Heiko Schocher <hs@denx.de>");
+>> +MODULE_DESCRIPTION("Texas Instruments TMP103 temperature sensor driver");
+>> +MODULE_LICENSE("GPL");
+
+Thanks for this great review!
+
+bye,
+Heiko
+-- 
+DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
+HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
diff --git a/a/content_digest b/N1/content_digest
index 5dd1b8f..56f2899 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,288 +1,551 @@
  "ref\01402468095-14678-1-git-send-email-hs@denx.de\0"
  "ref\053988DC1.7000203@roeck-us.net\0"
  "From\0Heiko Schocher <hs@denx.de>\0"
- "Subject\0Re: [lm-sensors] [PATCH 09/13] hwmon: Driver for TI TMP103 temperature sensor\0"
- "Date\0Thu, 12 Jun 2014 09:39:16 +0000\0"
+ "Subject\0Re: [PATCH 09/13] hwmon: Driver for TI TMP103 temperature sensor\0"
+ "Date\0Thu, 12 Jun 2014 11:39:16 +0200\0"
  "To\0Guenter Roeck <linux@roeck-us.net>\0"
  "Cc\0lm-sensors@lm-sensors.org"
   Jean Delvare <khali@linux-fr.org>
  " linux-kernel@vger.kernel.org\0"
  "\00:1\0"
  "b\0"
- "SGVsbG8gR3VlbnRlciwKCkFtIDExLjA2LjIwMTQgMTk6MTEsIHNjaHJpZWIgR3VlbnRlciBSb2Vj\n"
- "azoKPiBPbiAwNi8xMC8yMDE0IDExOjI4IFBNLCBIZWlrbyBTY2hvY2hlciB3cm90ZToKPj4gRHJp\n"
- "dmVyIGZvciB0aGUgVEkgVE1QMTAzLgo+Pgo+PiBUaGUgVEkgVE1QMTAzIGlzIHNpbWlsYXIgdG8g\n"
- "dGhlIFRNUDEwMi4gSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4gYnkgaGF2aW5nIG9ubHkg\n"
- "OCBiaXQgcmVnaXN0ZXJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNA\n"
- "ZGVueC5kZT4KPj4gQ2M6IEplYW4gRGVsdmFyZSA8a2hhbGlAbGludXgtZnIub3JnPgo+PiBDYzog\n"
- "R3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0Pgo+PiBDYzogbGludXgta2VybmVsQHZn\n"
- "ZXIua2VybmVsLm9yZwo+Cj4gSGkgSGVpa28sCj4KPiBZb3UgZG9uJ3QgbmVlZCB0aG9zZSBDYzog\n"
- "aW4gdGhlIGhlYWRlci4KCk9rLCBJIHJlbW92ZSB0aGVtLgoKPiBXaHkgcGF0Y2ggMDkvMTMgPyBJ\n"
- "J2QgZXhwZWN0IHRvIHNlZSAxMiBtb3JlIHBhdGNoZXMgaW4gdGhpcyBzZXJpZXMsCgpIdXBzLCBz\n"
- "b3JyeSwgbXkgbWlzdGFrZSwgdGhlcmUgaXMganVzdCB0aGlzIHBhdGNoLi4uCgo+IGJ1dCB0aGVy\n"
- "ZSBpcyBvbmx5IG9uZSAoZXZlbiBvbiBrZXJuZWwub3JnKS4gSWYgeW91IHNlbnQgdGhvc2UKPiBv\n"
- "dGhlciBwYXRjaGVzIHRvIHZhcmlvdXMgb3RoZXIgbWFpbGluZyBsaXN0cywgZXZlcnlvbmUgd2ls\n"
- "bCB3b25kZXIKPiB3aGVyZSB0aGUgcmVtYWluaW5nIHBhdGNoZXMgYXJlLiBJZiB0aGVyZSBpcyBq\n"
- "dXN0IG9uZSBwYXRjaCwKPiBpdCBpcyBqdXN0IGNvbmZ1c2luZy4KPgo+PiAtLS0KPj4gRG9jdW1l\n"
- "bnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL3RtcDEwMyB8IDMwICsrKwo+PiBkcml2\n"
- "ZXJzL2h3bW9uL0tjb25maWcgfCAxMCArCj4+IGRyaXZlcnMvaHdtb24vTWFrZWZpbGUgfCAxICsK\n"
- "Pj4gZHJpdmVycy9od21vbi90bXAxMDMuYyB8IDI4MSArKysrKysrKysrKysrKysrKysrKysrKysr\n"
- "Cj4+IDQgZmlsZXMgY2hhbmdlZCwgMzIyIGluc2VydGlvbnMoKykKPj4gY3JlYXRlIG1vZGUgMTAw\n"
- "NjQ0IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi90bXAxMDMKPj4gY3Jl\n"
- "YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4KPj4gZGlmZiAtLWdpdCBh\n"
- "L0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi90bXAxMDMgYi9Eb2N1bWVu\n"
- "dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vdG1wMTAzCj4+IG5ldyBmaWxlIG1vZGUg\n"
- "MTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAuLjM2ZDdiMzYKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysg\n"
- "Yi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vdG1wMTAzCj4KPiBTaG91\n"
- "bGQgYmUgRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMuCgpIbW0uLiBJIGRpZCB0aGlzIGZpcnN0\n"
- "IHRoZXJlLCBidXQgInNjcmlwdHMvY2hlY2twYXRjaC5wbCIKd2FybnMgKGlmIHVzaW5nIGEgRFQg\n"
- "YmFzZWQgYm9hcmQgd2l0aCBjb21wYXRpYmxlID0gInRpLHRtcDEwMyIpOgoKV0FSTklORzogRFQg\n"
- "Y29tcGF0aWJsZSBzdHJpbmcgInRpLHRtcDEwMyIgYXBwZWFycyB1bi1kb2N1bWVudGVkIC0tIGNo\n"
- "ZWNrIC4vRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzLwojMzI0OiBGSUxFOiBhcmNo\n"
- "L2FybS9ib290L2R0cy9pbXg2cWRsLWFyaXN0YWluZXRvcy5kdHNpOjEwNzoKKyAgICAgICAgICAg\n"
- "ICAgIGNvbXBhdGlibGUgPSAidGksdG1wMTAzIjsKCj4+IEBAIC0wLDAgKzEsMzAgQEAKPj4gK0tl\n"
- "cm5lbCBkcml2ZXIgdG1wMTAzCj4+ICs9PT09PT09PT09PT09PT09PT09PQo+PiArCj4+ICtTdXBw\n"
- "b3J0ZWQgY2hpcHM6Cj4+ICsgKiBUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMKPj4gKyBQcmVmaXg6\n"
- "ICd0bXAxMDMnCj4+ICsgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUKPj4gKyBQcm9kdWN0IGluZm8g\n"
- "YW5kIGRhdGFzaGVldDogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC90bXAxMDMKPj4gKwo+PiAr\n"
- "QXV0aG9yOgo+PiArIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+PiArCj4+ICtEZXNjcmlw\n"
- "dGlvbgo+PiArLS0tLS0tLS0tLS0KPj4gKwo+PiArVGhlIFRNUDEwMyBpcyBhIGRpZ2l0YWwgb3V0\n"
- "cHV0IHRlbXBlcmF0dXJlIHNlbnNvciBpbiBhIGZvdXItYmFsbAo+PiArd2FmZXIgY2hpcC1zY2Fs\n"
- "ZSBwYWNrYWdlIChXQ1NQKS4gVGhlIFRNUDEwMyBpcyBjYXBhYmxlIG9mIHJlYWRpbmcKPj4gK3Rl\n"
- "bXBlcmF0dXJlcyB0byBhIHJlc29sdXRpb24gb2YgMcKwQy4gVGhlIFRNUDEwMyBpcyBzcGVjaWZp\n"
- "ZWQgZm9yCj4+ICtvcGVyYXRpb24gb3ZlciBhIHRlbXBlcmF0dXJlIHJhbmdlIG9mIOKAkzQwwrBD\n"
- "IHRvICsxMjXCsEMuCj4+ICsKPj4gK1Jlc29sdXRpb246IDggQml0cwo+PiArQWNjdXJhY3k6IMKx\n"
- "McKwQyBUeXAgKOKAkzEwwrBDIHRvICsxMDDCsEMpCj4+ICsKPj4gK1RoZSBkcml2ZXIgcHJvdmlk\n"
- "ZXMgdGhlIGNvbW1vbiBzeXNmcy1pbnRlcmZhY2UgZm9yIHRlbXBlcmF0dXJlcyAoc2VlCj4+ICtE\n"
- "b2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZSB1bmRlciBUZW1wZXJhdHVyZXMpLgo+\n"
- "PiArCj4+ICtSZXF1aXJlZCBub2RlIHByb3BlcnRpZXM6Cj4+ICstIGNvbXBhdGlibGU6IG1hbnVm\n"
- "YWN0dXJlciBhbmQgY2hpcCBuYW1lCj4+ICsgInRpLHRtcDEwMyIKPj4gKy0gcmVnOiBJMkMgYnVz\n"
- "IGFkZHJlc3Mgb2YgdGhlIGRldmljZQo+Cj4gWW91IGRvbid0IG5lZWQgdGhpcyBwYXJ0LCBhbmQg\n"
- "aXQgaXMgbm90IHJlYWxseSBjb3JyZWN0ICh0aGVyZSBhcmUKPiBvdGhlciB3YXlzIHRvIGluc3Rh\n"
- "bnRpYXRlIHRoZSBkZXZpY2UsIGRldmljZXRyZWUgaXMganVzdCBvbmUgb2YgdGhlbSkuCgpPay4K\n"
- "Cj4gSSB3b3VsZCBzdWdnZXN0IHRvIHJlZmVyIHRvIERvY3VtZW50YXRpb24vaTJjL2luc3RhbnRp\n"
- "YXRpbmctZGV2aWNlcwo+IGluc3RlYWQuIEl0IG1pZ2h0IGFsc28gbWFrZSBzZW5zZSB0byB1cGRh\n"
- "dGUKPiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNl\n"
- "cy50eHQuCgpBaCwgb2ssIGdvb2QgaWRlYSwgdGhpcyByZW1vdmVzIGFsc28gdGhlIGNoZWNrcGF0\n"
- "Y2ggd2FybmluZywgdGhhbmtzIQpDaGFuZ2VkLgoKPiBBbHNvLCB3aGVuZXZlciB5b3UgdG91Y2gg\n"
- "YW55IG9mIHRoZSB0aGUgZHQgZmlsZXMsIHlvdSBuZWVkIHRvIGNvcHkKPiB0aGUgRFQgbWFpbnRh\n"
- "aW5lcnMuIHNjcmlwdHMvZ2V0X21haW50YWluZXIucGwgd2lsbCB0ZWxsIHlvdSB3aG8gbmVlZHMK\n"
- "PiB0byBiZSBjb3BpZWQuCgpPay4KClsuLi5dCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9u\n"
- "L01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQo+PiBpbmRleCAxMTc5OGFkLi44ZTJm\n"
- "NmEyIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+ICsrKyBiL2RyaXZl\n"
- "cnMvaHdtb24vTWFrZWZpbGUKPj4gQEAgLTEzNCw2ICsxMzQsNyBAQCBvYmotJChDT05GSUdfU0VO\n"
- "U09SU19TTVNDNDdNMTkyKSs9IHNtc2M0N20xOTIubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19B\n"
- "TUM2ODIxKSArPSBhbWM2ODIxLm8KPj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVEhNQzUwKSArPSB0\n"
- "aG1jNTAubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19UTVAxMDIpICs9IHRtcDEwMi5vCj4+ICtv\n"
- "YmotJChDT05GSUdfU0VOU09SU19UTVAxMDMpICs9IHRtcDEwMy5vCj4+IG9iai0kKENPTkZJR19T\n"
- "RU5TT1JTX1RNUDQwMSkgKz0gdG1wNDAxLm8KPj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDIx\n"
- "KSArPSB0bXA0MjEubwo+PiBvYmotJChDT05GSUdfU0VOU09SU19UV0w0MDMwX01BREMpKz0gdHds\n"
- "NDAzMC1tYWRjLWh3bW9uLm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMg\n"
- "Yi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4\n"
- "IDAwMDAwMDAuLjBiZDMzZDYKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL2h3bW9u\n"
- "L3RtcDEwMy5jCj4+IEBAIC0wLDAgKzEsMjgxIEBACj4+ICsvKgo+PiArICogVGV4YXMgSW5zdHJ1\n"
- "bWVudHMgVE1QMTAzIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKPj4gKyAqIENvcHly\n"
- "aWdodCAoQykgMjAxNCBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KPj4gKyAqCj4+ICsgKiBC\n"
- "YXNlZCBvbjoKPj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMiBTTUJ1cyB0ZW1wZXJhdHVy\n"
- "ZSBzZW5zb3IgZHJpdmVyCj4+ICsgKgo+PiArICogQ29weXJpZ2h0IChDKSAyMDEwIFN0ZXZlbiBL\n"
- "aW5nIDxzZmtpbmdAZmR3ZGMuY29tPgo+PiArICoKPj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl\n"
- "IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4+ICsgKiBp\n"
- "dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1\n"
- "Ymxpc2hlZCBieQo+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl\n"
- "cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4gKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxh\n"
- "dGVyIHZlcnNpb24uCj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu\n"
- "IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+ICsgKiBidXQgV0lUSE9VVCBBTlkg\n"
- "V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+PiArICogTUVS\n"
- "Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhl\n"
- "Cj4+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiAr\n"
- "ICoKPj4gKyAqLwo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsjaW5jbHVk\n"
- "ZSA8bGludXgvaW5pdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gKyNpbmNsdWRl\n"
- "IDxsaW51eC9pMmMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgo+PiArI2luY2x1ZGUg\n"
- "PGxpbnV4L2h3bW9uLXN5c2ZzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+Cj4+ICsjaW5j\n"
- "bHVkZSA8bGludXgvbXV0ZXguaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4gKyNp\n"
- "bmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Cj4+ICsKPj4gKyNkZWZpbmUgRFJJVkVSX05BTUUgInRt\n"
- "cDEwMyIKPj4gKwo+PiArI2RlZmluZSBUTVAxMDNfVEVNUF9SRUcgMHgwMAo+PiArI2RlZmluZSBU\n"
- "TVAxMDNfQ09ORl9SRUcgMHgwMQo+PiArI2RlZmluZSBUTVAxMDNfVExPV19SRUcgMHgwMgo+PiAr\n"
- "I2RlZmluZSBUTVAxMDNfVEhJR0hfUkVHIDB4MDMKPj4gKwo+PiArI2RlZmluZSBUTVAxMDNfQ09O\n"
- "Rl9NMCAweDAxCj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX00xIDB4MDIKPj4gKyNkZWZpbmUgVE1Q\n"
- "MTAzX0NPTkZfTEMgMHgwNAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9GTCAweDA4Cj4+ICsjZGVm\n"
- "aW5lIFRNUDEwM19DT05GX0ZIIDB4MTAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwIDB4MjAK\n"
- "Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IxIDB4NDAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZf\n"
- "SUQgMHg4MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAoVE1QMTAzX0NPTkZfTTAgfCBUTVAx\n"
- "MDNfQ09ORl9NMSkKPj4gKwo+PiArc3RydWN0IHRtcDEwMyB7Cj4+ICsgc3RydWN0IGRldmljZSAq\n"
- "aHdtb25fZGV2Owo+PiArIHN0cnVjdCBtdXRleCBsb2NrOwo+PiArIHUxNiBjb25maWdfb3JpZzsK\n"
- "Pj4gKyB1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwo+PiArIGludCB0ZW1wWzNdOwo+PiArfTsK\n"
- "Pj4gKwo+PiArc3RhdGljIGlubGluZSBpbnQgdG1wMTAzX3JlZ190b19tQyhzOCB2YWwpCj4+ICt7\n"
- "Cj4+ICsgcmV0dXJuIHZhbCAqIDEwMDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgdTgg\n"
- "dG1wMTAzX21DX3RvX3JlZyhpbnQgdmFsKQo+PiArewo+PiArIHJldHVybiB2YWwgLyAxMDAwOwo+\n"
- "Cj4gRElWX1JPVU5EX0NMT1NFU1QoKSA/Cj4KPiBObyBjYW1lbENhc2UsIHBsZWFzZS4KCk9rIC4u\n"
- "LiBobW0sIHdvbmRlcmluZyB0aGF0IGNoZWNrcGF0Y2gucGwgbm90IGNsYWltZWQgdGhpcy4KcmVt\n"
- "b3ZlZC4KCj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCB1OCB0bXAxMDNfcmVnW10gPSB7Cj4+\n"
- "ICsgVE1QMTAzX1RFTVBfUkVHLAo+PiArIFRNUDEwM19UTE9XX1JFRywKPj4gKyBUTVAxMDNfVEhJ\n"
- "R0hfUkVHLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCB0bXAxMDMgKnRtcDEwM191cGRh\n"
- "dGVfZGV2aWNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCj4+ICt7Cj4+ICsgc3RydWN0IHRt\n"
- "cDEwMyAqdG1wMTAzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4+ICsKPj4gKyBtdXRl\n"
- "eF9sb2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtcDEw\n"
- "My0+bGFzdF91cGRhdGUgKyBIWiAvIDMpKSB7Cj4+ICsgaW50IGk7Cj4+ICsKPj4gKyBmb3IgKGkg\n"
- "PSAwOyBpIDwgQVJSQVlfU0laRSh0bXAxMDMtPnRlbXApOyArK2kpIHsKPj4gKyBpbnQgc3RhdHVz\n"
- "ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKPj4gKyB0bXAxMDNfcmVnW2ldKTsK\n"
- "Pj4gKyBpZiAoc3RhdHVzID4gLTEpCj4+ICsgdG1wMTAzLT50ZW1wW2ldID0gdG1wMTAzX3JlZ190\n"
- "b19tQyhzdGF0dXMpOwo+Cj4gSSB1bmRlcnN0YW5kIHRoaXMgaXMgZnJvbSB0aGUgdG1wMTAyIGRy\n"
- "aXZlciwgYnV0IGl0IGlzIGtpbmQgb2YgdW51c3VhbAo+IGJlY2F1c2UgaXQgZG9lcyBub3QgcmVw\n"
- "b3J0IHRoZSBlcnJvciBiYWNrIHRvIHRoZSB1c2VyLiBQbGVhc2UgY29uc2lkZXIKPiBkb2luZyB0\n"
- "aGF0LCBpZSByZXR1cm4gUFRSX0VSUihzdGF0dXMpIG9uIGVycm9yIGFuZCBjaGVjay9yZXR1cm4g\n"
- "dGhlIGVycm9yCj4gZnJvbSB0aGUgY2FsbGluZyBmdW5jdGlvbnMuIElycmVsZXZhbnQgaWYgeW91\n"
- "IHVzZSByZWdtYXAgKHNlZSBiZWxvdykuCgp5b3UgbWVhbiBFUlJfUFRSKCkgPwpPaywgYWRkIHRo\n"
- "aXMuCgo+PiArIH0KPj4gKyB0bXAxMDMtPmxhc3RfdXBkYXRlID0gamlmZmllczsKPj4gKyB9Cj4+\n"
- "ICsgbXV0ZXhfdW5sb2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIHJldHVybiB0bXAxMDM7Cj4+ICt9\n"
- "Cj4KPiBPdmVyYWxsIHlvdSBtaWdodCBjb25zaWRlciBkcm9wcGluZyB0aGUgdXBkYXRlIGZ1bmN0\n"
- "aW9uIGFuZCB1c2luZyByZWdtYXAgaW5zdGVhZC4KPiBJdCB3b3VsZCBiZSBhbiBleGNlbGxlbnQg\n"
- "Zml0IGZvciB0aGlzIGRyaXZlcjsgd2hpbGUgaXQgZG9lc24ndCBkbyB0aW1lZCBjYWNoaW5nCj4g\n"
- "aXQgc3VwcG9ydHMgcGVyLXJlZ2lzdGVyIGNhY2hpbmcgd2hpY2ggaXMgdWx0aW1hdGVseSBtb3Jl\n"
- "IHVzZWZ1bCBhbnl3YXkuCj4gU29tZSBvZiB0aGUgZHJpdmVycyBpbiB0aGUgaHdtb24gZGlyZWN0\n"
- "b3J5IHVzZSBpdCwgc28geW91IGNvdWxkIHVzZSB0aGF0Cj4gYXMgZXhhbXBsZS4gTm90IG1hbmRh\n"
- "dG9yeSwgdGhvdWdoOyBqdXN0IGEgc3VnZ2VzdGlvbi4KCkNvdWxkIHlvdSBnaXZlIG1lIGFuIGV4\n"
- "YW1wbGU/Cgo+PiArCj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2hvd190ZW1wKHN0cnVjdCBk\n"
- "ZXZpY2UgKmRldiwKPj4gKyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPj4gKyBjaGFy\n"
- "ICpidWYpCj4+ICt7Cj4+ICsgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0\n"
- "b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Cj4+ICsgc3RydWN0IHRtcDEwMyAqdG1wMTAzID0gdG1w\n"
- "MTAzX3VwZGF0ZV9kZXZpY2UodG9faTJjX2NsaWVudChkZXYpKTsKPj4gKwo+PiArIHJldHVybiBz\n"
- "cHJpbnRmKGJ1ZiwgIiVkXG4iLCB0bXAxMDMtPnRlbXBbc2RhLT5pbmRleF0pOwo+PiArfQo+PiAr\n"
- "Cj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAo+\n"
- "PiArIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAo+PiArIGNvbnN0IGNoYXIgKmJ1Ziwg\n"
- "c2l6ZV90IGNvdW50KQo+PiArewo+PiArIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAq\n"
- "c2RhID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+PiArIHN0cnVjdCBpMmNfY2xpZW50ICpj\n"
- "bGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Cj4+ICsgc3RydWN0IHRtcDEwMyAqdG1wMTAzID0g\n"
- "aTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Cj4+ICsgbG9uZyB2YWw7Cj4+ICsgaW50IHN0YXR1\n"
- "czsKPj4gKwo+PiArIGlmIChrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKPj4gKyByZXR1cm4g\n"
- "LUVJTlZBTDsKPj4gKyB2YWwgPSBjbGFtcF92YWwodmFsLCAtNTUwMDAsIDEyODAwMCk7Cj4KPiBN\n"
- "YXggc2hvdWxkIGJlIDEyNzAwMC4KCk9rLCBjaGFuZ2UgdGhpcy4KCj4+ICsKPj4gKyBtdXRleF9s\n"
- "b2NrKCZ0bXAxMDMtPmxvY2spOwo+PiArIHRtcDEwMy0+dGVtcFtzZGEtPmluZGV4XSA9IHZhbDsK\n"
- "Pgo+IFlvdSBjYW4gbm90IGRvIHRoYXQgc2luY2UgaXQgaXMgdGhlIG5vbi1yb3VuZGVkIHZhbHVl\n"
- "LiBZb3UgaGF2ZSB0byBjb252ZXJ0IHRvCj4gdGhlIHJlZ2lzdGVyIHZhbHVlLCB0aGVuIGNvbnZl\n"
- "cnQgYmFjayB0byB0aGUgZGlzcGxheSB2YWx1ZS4KPgo+IElmIHlvdSB1c2UgcmVnbWFwLCB0aGUg\n"
- "cHJvYmxlbSBnb2VzIGF3YXksIHNpbmNlIHlvdSB3b3VsZCBub3QgY2FjaGUgY29udmVydGVkCj4g\n"
- "ZGF0YSBidXQgY29udmVydCBpbiB0aGUgc2hvdyBmdW5jdGlvbi4gQWx0ZXJuYXRpdmVseSwgeW91\n"
- "IGNvdWxkIHN0b3JlIHJlZ2lzdGVyCj4gdmFsdWVzIGFuZCBjb252ZXJ0IGluIHRoZSBzaG93IGZ1\n"
- "bmN0aW9uLgoKSSB0YWtlIGEgbG9vayBhdCB0aGlzLgoKPj4gKyBzdGF0dXMgPSBpMmNfc21idXNf\n"
- "d3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgdG1wMTAzX3JlZ1tzZGEtPmluZGV4XSwKPj4gKyB0bXAx\n"
- "MDNfbUNfdG9fcmVnKHZhbCkpOwo+Cj4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IGNvbnRpbnVhdGlv\n"
- "biBsaW5lcyBtYXRjaCB0aGUgJygnIGluIHRoZSBsaW5lIGFib3ZlLgo+IEFsaWdubWVudHMgYXJl\n"
- "IGluY29uc2lzdGVudCwgb3RoZXJ3aXNlIEkgd291bGQgbm90IG1lbnRpb24gaXQuCj4gY2hlY2tw\n"
- "YXRjaCAtLXN0cmljdCB0ZWxscyB5b3Ugd2hpY2ggb25lcyBhcmUgbWlzYWxpZ25lZC4KCkFoLCBk\n"
- "aWQgYSBjaGVja3BhdGNoIGJ1dCB3aXRob3V0IHRoZSAiLS1zdHJpY3QiIG9wdGlvbiAhCgpJIGZp\n"
- "eCB0aGlzIGdsb2JhbGx5LgoKPj4gKyBtdXRleF91bmxvY2soJnRtcDEwMy0+bG9jayk7Cj4+ICsg\n"
- "cmV0dXJuIHN0YXR1cyA/IDogY291bnQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBTRU5TT1JfREVW\n"
- "SUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHRtcDEwM19zaG93X3RlbXAsIE5VTEwgLCAw\n"
- "KTsKPj4gKwo+IElmIHlvdSB1c2UgcmVnbWFwIHlvdSBjYW4gc3RvcmUgdGhlIHJlZ2lzdGVyIGRp\n"
- "cmVjdGx5IGhlcmUgYW5kIHlvdSB3b3VsZCBub3QKPiBuZWVkIHRtcDEwM19yZWdbXS4KCk9rLgoK\n"
- "Pj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVdVU1IgfCBT\n"
- "X0lSVUdPLCB0bXAxMDNfc2hvd190ZW1wLAo+PiArIHRtcDEwM19zZXRfdGVtcCwgMSk7Cj4+ICsK\n"
- "PiBQZXIgdGhlIGRhdGFzaGVldCB0aGlzIHNob3VsZCBiZSB0ZW1wMV9taW4uIFRoZSByZWdpc3Rl\n"
- "ciBkZWZpbml0aW9uIGlzIGRpZmZlcmVudCB0byBUTVAxMDIuCgpjaGFuZ2VkLgoKPj4gK3N0YXRp\n"
- "YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgdG1wMTAz\n"
- "X3Nob3dfdGVtcCwKPj4gKyB0bXAxMDNfc2V0X3RlbXAsIDIpOwo+PiArCj4+ICtzdGF0aWMgc3Ry\n"
- "dWN0IGF0dHJpYnV0ZSAqdG1wMTAzX2F0dHJpYnV0ZXNbXSA9IHsKPj4gKyAmc2Vuc29yX2Rldl9h\n"
- "dHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCj4+ICsgJnNlbnNvcl9kZXZfYXR0cl90ZW1w\n"
- "MV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAo+PiArICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4\n"
- "LmRldl9hdHRyLmF0dHIsCj4KPiBZb3UgbWlnaHQgYWxzbyBjb25zaWRlciBhZGRpbmcgdGVtcDFf\n"
- "bWluX2FsYXJtIGFuZCB0ZW1wMV9tYXhfYWxhcm0gdG8gaW5mb3JtCj4gdXNlciBzcGFjZSBpZiBs\n"
- "aW1pdHMgYXJlIGV4Y2VlZGVkLiBUaGUgc3RhdHVzIGlzIHJlcG9ydGVkIHdpdGggdGhlIEZMIGFu\n"
- "ZCBGSAo+IGJpdHMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCgpBZGQgdGhpcyBpZiBJ\n"
- "IGZpbmQgdGltZSwgb3IgaW4gYW4gYW5vdGhlciBwYXRjaC4uLgoKPj4gKyBOVUxMCj4+ICt9Owo+\n"
- "PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0bXAxMDNfYXR0cl9n\n"
- "cm91cCA9IHsKPj4gKyAuYXR0cnMgPSB0bXAxMDNfYXR0cmlidXRlcywKPj4gK307Cj4+ICsKPiBQ\n"
- "bGVhc2UgdXNlIHRoZSBBVFRSSUJVVEVfR1JPVVBTKCkgbWFjcm8uCgpPay4KCj4+ICsjZGVmaW5l\n"
- "IFRNUDEwM19DT05GSUcgKFRNUDEwM19DT05GX0NSMSB8IFRNUDEwM19DT05GX00xKQo+PiArI2Rl\n"
- "ZmluZSBUTVAxMDNfQ09ORklHX1JEX09OTFkgKFRNUDEwM19DT05GX0NSMSB8IFRNUDEwM19DT05G\n"
- "X00xKQo+Cj4gTGF0dGVyIGRlZmluZSBpcyBub3QgdXNlZCBhcyBmYXIgYXMgSSBjYW4gc2VlLiBT\n"
- "aW5jZSBpdCBpcyB0aGUgc2FtZQo+IGl0IGlzIHVubmVjZXNzYXJ5IGFueXdheS4KCnJlbW92ZWQu\n"
- "Cgo+PiArCj4+ICtzdGF0aWMgaW50IHRtcDEwM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xp\n"
- "ZW50LAo+PiArIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPj4gK3sKPj4gKyBzdHJ1\n"
- "Y3QgdG1wMTAzICp0bXAxMDM7Cj4+ICsgaW50IHN0YXR1czsKPj4gKwo+PiArIGlmICghaTJjX2No\n"
- "ZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAo+PiArIEkyQ19GVU5DX1NNQlVTX1dP\n"
- "UkRfREFUQSkpIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwKPj4gKyAiYWRhcHRlciBkb2Vz\n"
- "bid0IHN1cHBvcnQgU01CdXMgd29yZCB0cmFuc2FjdGlvbnNcbiIpOwo+Cj4gR29vZCB0aGF0IHRo\n"
- "ZSBjaGlwIGRvZXNuJ3Qgc3VwcG9ydCBhbnkgOy0pLiBDaGVjayBmb3IgYnl0ZSB0cmFuc2FjdGlv\n"
- "bnMgaW5zdGVhZC4KCkhlaC4uLiBjaGFuZ2VkLgoKPj4gKyByZXR1cm4gLUVOT0RFVjsKPj4gKyB9\n"
- "Cj4+ICsKPj4gKyB0bXAxMDMgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnRt\n"
- "cDEwMyksIEdGUF9LRVJORUwpOwo+PiArIGlmICghdG1wMTAzKQo+PiArIHJldHVybiAtRU5PTUVN\n"
- "Owo+PiArCj4+ICsgaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgdG1wMTAzKTsKPj4gKwo+PiAr\n"
- "IHN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFRNUDEwM19DT05GX1JF\n"
- "Ryk7Cj4+ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwgImVy\n"
- "cm9yIHJlYWRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyByZXR1cm4gc3RhdHVzOwo+PiAr\n"
- "IH0KPj4gKyB0bXAxMDMtPmNvbmZpZ19vcmlnID0gc3RhdHVzOwo+Cj4gWW91IGRvbid0IHVzZSBj\n"
- "b25maWdfb3JpZyBvdXRzaWRlIHRoZSBwcm9iZSBmdW5jdGlvbiwKPiBzbyBzdG9yaW5nIGl0IGlu\n"
- "IHByaXZhdGUgZGF0YSBkb2Vzbid0IGFkZCBhbnkgdmFsdWUuCj4gQWx0ZXJuYXRpdmVseSwgeW91\n"
- "IGNvdWxkIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gb24gZXhpdC4KCkkgYWRk\n"
- "ICJyZXN0b3JpbmcgaXQgb24gZXhpdC4iCgo+PiArIHN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9i\n"
- "eXRlX2RhdGEoY2xpZW50LCBUTVAxMDNfQ09ORl9SRUcsCj4+ICsgVE1QMTAzX0NPTkZJRyk7Cj4+\n"
- "ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGllbnQtPmRldiwgImVycm9yIHdy\n"
- "aXRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyBnb3RvIGZhaWxfcmVzdG9yZV9jb25maWc7\n"
- "Cj4+ICsgfQo+PiArIHN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFRN\n"
- "UDEwM19DT05GX1JFRyk7Cj4+ICsgaWYgKHN0YXR1cyA8IDApIHsKPj4gKyBkZXZfZXJyKCZjbGll\n"
- "bnQtPmRldiwgImVycm9yIHJlYWRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyBnb3RvIGZh\n"
- "aWxfcmVzdG9yZV9jb25maWc7Cj4+ICsgfQo+PiArIGlmIChzdGF0dXMgIT0gVE1QMTAzX0NPTkZJ\n"
- "Rykgewo+PiArIGRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY29uZmlnIHNldHRpbmdzIGRpZCBub3Qg\n"
- "c3RpY2tcbiIpOwo+PiArIHN0YXR1cyA9IC1FTk9ERVY7Cj4+ICsgZ290byBmYWlsX3Jlc3RvcmVf\n"
- "Y29uZmlnOwo+PiArIH0KPj4gKyB0bXAxMDMtPmxhc3RfdXBkYXRlID0gamlmZmllcyAtIEhaOwo+\n"
- "PiArIG11dGV4X2luaXQoJnRtcDEwMy0+bG9jayk7Cj4+ICsKPj4gKyBzdGF0dXMgPSBzeXNmc19j\n"
- "cmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICsg\n"
- "aWYgKHN0YXR1cykgewo+PiArIGRldl9kYmcoJmNsaWVudC0+ZGV2LCAiY291bGQgbm90IGNyZWF0\n"
- "ZSBzeXNmcyBmaWxlc1xuIik7Cj4+ICsgZ290byBmYWlsX3Jlc3RvcmVfY29uZmlnOwo+PiArIH0K\n"
- "Pj4gKyB0bXAxMDMtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5k\n"
- "ZXYpOwo+PiArIGlmIChJU19FUlIodG1wMTAzLT5od21vbl9kZXYpKSB7Cj4+ICsgZGV2X2RiZygm\n"
- "Y2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgaHdtb24gZGV2aWNlXG4iKTsKPj4gKyBz\n"
- "dGF0dXMgPSBQVFJfRVJSKHRtcDEwMy0+aHdtb25fZGV2KTsKPj4gKyBnb3RvIGZhaWxfcmVtb3Zl\n"
- "X3N5c2ZzOwo+PiArIH0KPgo+IFBsZWFzZSB1c2UgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJf\n"
- "d2l0aF9ncm91cHMoKS4KCk9rLgoKPj4gKwo+PiArIGRldl9pbmZvKCZjbGllbnQtPmRldiwgImlu\n"
- "aXRpYWxpemVkXG4iKTsKPgo+IFBsZWFzZSBkcm9wIHRoaXMgbWVzc2FnZS4KCk9rLgoKPj4gKwo+\n"
- "PiArIHJldHVybiAwOwo+PiArCj4+ICtmYWlsX3JlbW92ZV9zeXNmczoKPj4gKyBzeXNmc19yZW1v\n"
- "dmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICtmYWls\n"
- "X3Jlc3RvcmVfY29uZmlnOgo+PiArIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50\n"
- "LCBUTVAxMDNfQ09ORl9SRUcsCj4+ICsgdG1wMTAzLT5jb25maWdfb3JpZyk7Cj4KPiBpMmNfc21i\n"
- "dXNfd3JpdGVfYnl0ZV9kYXRhKCkgPwoKWWVzLCBjaGFuZ2VkIQoKPj4gKyByZXR1cm4gc3RhdHVz\n"
- "Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHRtcDEwM19yZW1vdmUoc3RydWN0IGkyY19jbGll\n"
- "bnQgKmNsaWVudCkKPj4gK3sKPj4gKyBzdHJ1Y3QgdG1wMTAzICp0bXAxMDMgPSBpMmNfZ2V0X2Ns\n"
- "aWVudGRhdGEoY2xpZW50KTsKPj4gKwo+PiArIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHRtcDEw\n"
- "My0+aHdtb25fZGV2KTsKPj4gKyBzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmos\n"
- "ICZ0bXAxMDNfYXR0cl9ncm91cCk7Cj4+ICsKPj4gKyByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiAr\n"
- "I2lmZGVmIENPTkZJR19QTQo+PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2\n"
- "aWNlICpkZXYpCj4+ICt7Cj4+ICsgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19j\n"
- "bGllbnQoZGV2KTsKPj4gKyBpbnQgY29uZmlnOwo+PiArCj4+ICsgY29uZmlnID0gaTJjX3NtYnVz\n"
- "X3JlYWRfd29yZF9zd2FwcGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHKTsKPgo+IGJ5dGUKPgo+\n"
- "PiArIGlmIChjb25maWcgPCAwKQo+PiArIHJldHVybiBjb25maWc7Cj4+ICsKPj4gKyBjb25maWcg\n"
- "Jj0gflRNUDEwM19DT05GX1NEOwo+PiArIHJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9zd2Fw\n"
- "cGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHLCBjb25maWcpOwo+Cj4gYnl0ZQo+Cj4+ICt9Cj4+\n"
- "ICsKPj4gK3N0YXRpYyBpbnQgdG1wMTAzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7\n"
- "Cj4+ICsgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKPj4g\n"
- "KyBpbnQgY29uZmlnOwo+PiArCj4+ICsgY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfd29yZF9zd2Fw\n"
- "cGVkKGNsaWVudCwgVE1QMTAzX0NPTkZfUkVHKTsKPgo+IGJ5dGUKPgo+PiArIGlmIChjb25maWcg\n"
- "PCAwKQo+PiArIHJldHVybiBjb25maWc7Cj4+ICsKPj4gKyBjb25maWcgfD0gVE1QMTAzX0NPTkZf\n"
- "U0Q7Cj4+ICsgcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LCBUTVAx\n"
- "MDNfQ09ORl9SRUcsIGNvbmZpZyk7Cj4KPiBieXRlCgpjaGFuZ2VkLgoKPj4gK30KPj4gKwo+PiAr\n"
- "c3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRtcDEwM19kZXZfcG1fb3BzID0gewo+PiAr\n"
- "IC5zdXNwZW5kID0gdG1wMTAzX3N1c3BlbmQsCj4+ICsgLnJlc3VtZSA9IHRtcDEwM19yZXN1bWUs\n"
- "Cj4+ICt9Owo+PiArCj4+ICsjZGVmaW5lIFRNUDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9w\n"
- "bV9vcHMpCj4+ICsjZWxzZQo+PiArI2RlZmluZSBUTVAxMDNfREVWX1BNX09QUyBOVUxMCj4+ICsj\n"
- "ZW5kaWYgLyogQ09ORklHX1BNICovCj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2Rl\n"
- "dmljZV9pZCB0bXAxMDNfaWRbXSA9IHsKPj4gKyB7IERSSVZFUl9OQU1FLCAwIH0sCj4+ICsgeyB9\n"
- "Cj4+ICt9Owo+PiArTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRtcDEwM19pZCk7Cj4+ICsKPj4g\n"
- "K3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0bXAxMDNfZHJpdmVyID0gewo+PiArIC5kcml2ZXIu\n"
- "bmFtZSA9IERSSVZFUl9OQU1FLAo+PiArIC5kcml2ZXIucG0gPSBUTVAxMDNfREVWX1BNX09QUywK\n"
- "Pgo+IC5kcml2ZXIgPSB7Cj4gLm5hbWUgPSBEUklWRVJfTkFNRSwKPiAucG0gPSBUTVAxMDNfREVW\n"
- "X1BNX09QUywKPiB9LAo+Cj4gd291bGQgYmUgYSBiaXQgbmljZXIuIEkgd29uJ3QgbWFuZGF0ZSBp\n"
- "dCwgdGhvdWdoLgoKY2hhbmdlZC4KCj4+ICsgLnByb2JlID0gdG1wMTAzX3Byb2JlLAo+PiArIC5y\n"
- "ZW1vdmUgPSB0bXAxMDNfcmVtb3ZlLAo+PiArIC5pZF90YWJsZSA9IHRtcDEwM19pZCwKPj4gK307\n"
- "Cj4+ICsKPj4gK21vZHVsZV9pMmNfZHJpdmVyKHRtcDEwM19kcml2ZXIpOwo+PiArCj4+ICtNT0RV\n"
- "TEVfQVVUSE9SKCJIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4iKTsKPj4gK01PRFVMRV9ERVND\n"
- "UklQVElPTigiVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2\n"
- "ZXIiKTsKPj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKClRoYW5rcyBmb3IgdGhpcyBncmVhdCBy\n"
- "ZXZpZXchCgpieWUsCkhlaWtvCi0tIApERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nIEdtYkgsICAg\n"
- "ICBNRDogV29sZmdhbmcgRGVuayAmIERldGxldiBadW5kZWwKSFJCIDE2NTIzNSBNdW5pY2gsIE9m\n"
- "ZmljZTogS2lyY2hlbnN0ci41LCBELTgyMTk0IEdyb2ViZW56ZWxsLCBHZXJtYW55CgpfX19fX19f\n"
- "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3JzIG1haWxp\n"
- "bmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1zZW5zb3Jz\n"
- Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM
+ "Hello Guenter,\n"
+ "\n"
+ "Am 11.06.2014 19:11, schrieb Guenter Roeck:\n"
+ "> On 06/10/2014 11:28 PM, Heiko Schocher wrote:\n"
+ ">> Driver for the TI TMP103.\n"
+ ">>\n"
+ ">> The TI TMP103 is similar to the TMP102. It differs from the TMP102\n"
+ ">> by having only 8 bit registers.\n"
+ ">>\n"
+ ">> Signed-off-by: Heiko Schocher <hs@denx.de>\n"
+ ">> Cc: Jean Delvare <khali@linux-fr.org>\n"
+ ">> Cc: Guenter Roeck <linux@roeck-us.net>\n"
+ ">> Cc: linux-kernel@vger.kernel.org\n"
+ ">\n"
+ "> Hi Heiko,\n"
+ ">\n"
+ "> You don't need those Cc: in the header.\n"
+ "\n"
+ "Ok, I remove them.\n"
+ "\n"
+ "> Why patch 09/13 ? I'd expect to see 12 more patches in this series,\n"
+ "\n"
+ "Hups, sorry, my mistake, there is just this patch...\n"
+ "\n"
+ "> but there is only one (even on kernel.org). If you sent those\n"
+ "> other patches to various other mailing lists, everyone will wonder\n"
+ "> where the remaining patches are. If there is just one patch,\n"
+ "> it is just confusing.\n"
+ ">\n"
+ ">> ---\n"
+ ">> Documentation/devicetree/bindings/hwmon/tmp103 | 30 +++\n"
+ ">> drivers/hwmon/Kconfig | 10 +\n"
+ ">> drivers/hwmon/Makefile | 1 +\n"
+ ">> drivers/hwmon/tmp103.c | 281 +++++++++++++++++++++++++\n"
+ ">> 4 files changed, 322 insertions(+)\n"
+ ">> create mode 100644 Documentation/devicetree/bindings/hwmon/tmp103\n"
+ ">> create mode 100644 drivers/hwmon/tmp103.c\n"
+ ">>\n"
+ ">> diff --git a/Documentation/devicetree/bindings/hwmon/tmp103 b/Documentation/devicetree/bindings/hwmon/tmp103\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..36d7b36\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/Documentation/devicetree/bindings/hwmon/tmp103\n"
+ ">\n"
+ "> Should be Documentation/hwmon/tmp103.\n"
+ "\n"
+ "Hmm.. I did this first there, but \"scripts/checkpatch.pl\"\n"
+ "warns (if using a DT based board with compatible = \"ti,tmp103\"):\n"
+ "\n"
+ "WARNING: DT compatible string \"ti,tmp103\" appears un-documented -- check ./Documentation/devicetree/bindings/\n"
+ "#324: FILE: arch/arm/boot/dts/imx6qdl-aristainetos.dtsi:107:\n"
+ "+               compatible = \"ti,tmp103\";\n"
+ "\n"
+ ">> @@ -0,0 +1,30 @@\n"
+ ">> +Kernel driver tmp103\n"
+ ">> +====================\n"
+ ">> +\n"
+ ">> +Supported chips:\n"
+ ">> + * Texas Instruments TMP103\n"
+ ">> + Prefix: 'tmp103'\n"
+ ">> + Addresses scanned: none\n"
+ ">> + Product info and datasheet: http://www.ti.com/product/tmp103\n"
+ ">> +\n"
+ ">> +Author:\n"
+ ">> + Heiko Schocher <hs@denx.de>\n"
+ ">> +\n"
+ ">> +Description\n"
+ ">> +-----------\n"
+ ">> +\n"
+ ">> +The TMP103 is a digital output temperature sensor in a four-ball\n"
+ ">> +wafer chip-scale package (WCSP). The TMP103 is capable of reading\n"
+ ">> +temperatures to a resolution of 1\302\260C. The TMP103 is specified for\n"
+ ">> +operation over a temperature range of \342\200\22340\302\260C to +125\302\260C.\n"
+ ">> +\n"
+ ">> +Resolution: 8 Bits\n"
+ ">> +Accuracy: \302\2611\302\260C Typ (\342\200\22310\302\260C to +100\302\260C)\n"
+ ">> +\n"
+ ">> +The driver provides the common sysfs-interface for temperatures (see\n"
+ ">> +Documentation/hwmon/sysfs-interface under Temperatures).\n"
+ ">> +\n"
+ ">> +Required node properties:\n"
+ ">> +- compatible: manufacturer and chip name\n"
+ ">> + \"ti,tmp103\"\n"
+ ">> +- reg: I2C bus address of the device\n"
+ ">\n"
+ "> You don't need this part, and it is not really correct (there are\n"
+ "> other ways to instantiate the device, devicetree is just one of them).\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ "> I would suggest to refer to Documentation/i2c/instantiating-devices\n"
+ "> instead. It might also make sense to update\n"
+ "> Documentation/devicetree/bindings/i2c/trivial-devices.txt.\n"
+ "\n"
+ "Ah, ok, good idea, this removes also the checkpatch warning, thanks!\n"
+ "Changed.\n"
+ "\n"
+ "> Also, whenever you touch any of the the dt files, you need to copy\n"
+ "> the DT maintainers. scripts/get_maintainer.pl will tell you who needs\n"
+ "> to be copied.\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ "[...]\n"
+ ">> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile\n"
+ ">> index 11798ad..8e2f6a2 100644\n"
+ ">> --- a/drivers/hwmon/Makefile\n"
+ ">> +++ b/drivers/hwmon/Makefile\n"
+ ">> @@ -134,6 +134,7 @@ obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o\n"
+ ">> obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o\n"
+ ">> obj-$(CONFIG_SENSORS_THMC50) += thmc50.o\n"
+ ">> obj-$(CONFIG_SENSORS_TMP102) += tmp102.o\n"
+ ">> +obj-$(CONFIG_SENSORS_TMP103) += tmp103.o\n"
+ ">> obj-$(CONFIG_SENSORS_TMP401) += tmp401.o\n"
+ ">> obj-$(CONFIG_SENSORS_TMP421) += tmp421.o\n"
+ ">> obj-$(CONFIG_SENSORS_TWL4030_MADC)+= twl4030-madc-hwmon.o\n"
+ ">> diff --git a/drivers/hwmon/tmp103.c b/drivers/hwmon/tmp103.c\n"
+ ">> new file mode 100644\n"
+ ">> index 0000000..0bd33d6\n"
+ ">> --- /dev/null\n"
+ ">> +++ b/drivers/hwmon/tmp103.c\n"
+ ">> @@ -0,0 +1,281 @@\n"
+ ">> +/*\n"
+ ">> + * Texas Instruments TMP103 SMBus temperature sensor driver\n"
+ ">> + * Copyright (C) 2014 Heiko Schocher <hs@denx.de>\n"
+ ">> + *\n"
+ ">> + * Based on:\n"
+ ">> + * Texas Instruments TMP102 SMBus temperature sensor driver\n"
+ ">> + *\n"
+ ">> + * Copyright (C) 2010 Steven King <sfking@fdwdc.com>\n"
+ ">> + *\n"
+ ">> + * This program is free software; you can redistribute it and/or modify\n"
+ ">> + * it under the terms of the GNU General Public License as published by\n"
+ ">> + * the Free Software Foundation; either version 2 of the License, or\n"
+ ">> + * (at your option) any later version.\n"
+ ">> + *\n"
+ ">> + * This program is distributed in the hope that it will be useful,\n"
+ ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ ">> + * GNU General Public License for more details.\n"
+ ">> + *\n"
+ ">> + */\n"
+ ">> +\n"
+ ">> +#include <linux/module.h>\n"
+ ">> +#include <linux/init.h>\n"
+ ">> +#include <linux/slab.h>\n"
+ ">> +#include <linux/i2c.h>\n"
+ ">> +#include <linux/hwmon.h>\n"
+ ">> +#include <linux/hwmon-sysfs.h>\n"
+ ">> +#include <linux/err.h>\n"
+ ">> +#include <linux/mutex.h>\n"
+ ">> +#include <linux/device.h>\n"
+ ">> +#include <linux/jiffies.h>\n"
+ ">> +\n"
+ ">> +#define DRIVER_NAME \"tmp103\"\n"
+ ">> +\n"
+ ">> +#define TMP103_TEMP_REG 0x00\n"
+ ">> +#define TMP103_CONF_REG 0x01\n"
+ ">> +#define TMP103_TLOW_REG 0x02\n"
+ ">> +#define TMP103_THIGH_REG 0x03\n"
+ ">> +\n"
+ ">> +#define TMP103_CONF_M0 0x01\n"
+ ">> +#define TMP103_CONF_M1 0x02\n"
+ ">> +#define TMP103_CONF_LC 0x04\n"
+ ">> +#define TMP103_CONF_FL 0x08\n"
+ ">> +#define TMP103_CONF_FH 0x10\n"
+ ">> +#define TMP103_CONF_CR0 0x20\n"
+ ">> +#define TMP103_CONF_CR1 0x40\n"
+ ">> +#define TMP103_CONF_ID 0x80\n"
+ ">> +#define TMP103_CONF_SD (TMP103_CONF_M0 | TMP103_CONF_M1)\n"
+ ">> +\n"
+ ">> +struct tmp103 {\n"
+ ">> + struct device *hwmon_dev;\n"
+ ">> + struct mutex lock;\n"
+ ">> + u16 config_orig;\n"
+ ">> + unsigned long last_update;\n"
+ ">> + int temp[3];\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +static inline int tmp103_reg_to_mC(s8 val)\n"
+ ">> +{\n"
+ ">> + return val * 1000;\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static inline u8 tmp103_mC_to_reg(int val)\n"
+ ">> +{\n"
+ ">> + return val / 1000;\n"
+ ">\n"
+ "> DIV_ROUND_CLOSEST() ?\n"
+ ">\n"
+ "> No camelCase, please.\n"
+ "\n"
+ "Ok ... hmm, wondering that checkpatch.pl not claimed this.\n"
+ "removed.\n"
+ "\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static const u8 tmp103_reg[] = {\n"
+ ">> + TMP103_TEMP_REG,\n"
+ ">> + TMP103_TLOW_REG,\n"
+ ">> + TMP103_THIGH_REG,\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +static struct tmp103 *tmp103_update_device(struct i2c_client *client)\n"
+ ">> +{\n"
+ ">> + struct tmp103 *tmp103 = i2c_get_clientdata(client);\n"
+ ">> +\n"
+ ">> + mutex_lock(&tmp103->lock);\n"
+ ">> + if (time_after(jiffies, tmp103->last_update + HZ / 3)) {\n"
+ ">> + int i;\n"
+ ">> +\n"
+ ">> + for (i = 0; i < ARRAY_SIZE(tmp103->temp); ++i) {\n"
+ ">> + int status = i2c_smbus_read_byte_data(client,\n"
+ ">> + tmp103_reg[i]);\n"
+ ">> + if (status > -1)\n"
+ ">> + tmp103->temp[i] = tmp103_reg_to_mC(status);\n"
+ ">\n"
+ "> I understand this is from the tmp102 driver, but it is kind of unusual\n"
+ "> because it does not report the error back to the user. Please consider\n"
+ "> doing that, ie return PTR_ERR(status) on error and check/return the error\n"
+ "> from the calling functions. Irrelevant if you use regmap (see below).\n"
+ "\n"
+ "you mean ERR_PTR() ?\n"
+ "Ok, add this.\n"
+ "\n"
+ ">> + }\n"
+ ">> + tmp103->last_update = jiffies;\n"
+ ">> + }\n"
+ ">> + mutex_unlock(&tmp103->lock);\n"
+ ">> + return tmp103;\n"
+ ">> +}\n"
+ ">\n"
+ "> Overall you might consider dropping the update function and using regmap instead.\n"
+ "> It would be an excellent fit for this driver; while it doesn't do timed caching\n"
+ "> it supports per-register caching which is ultimately more useful anyway.\n"
+ "> Some of the drivers in the hwmon directory use it, so you could use that\n"
+ "> as example. Not mandatory, though; just a suggestion.\n"
+ "\n"
+ "Could you give me an example?\n"
+ "\n"
+ ">> +\n"
+ ">> +static ssize_t tmp103_show_temp(struct device *dev,\n"
+ ">> + struct device_attribute *attr,\n"
+ ">> + char *buf)\n"
+ ">> +{\n"
+ ">> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);\n"
+ ">> + struct tmp103 *tmp103 = tmp103_update_device(to_i2c_client(dev));\n"
+ ">> +\n"
+ ">> + return sprintf(buf, \"%d\\n\", tmp103->temp[sda->index]);\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static ssize_t tmp103_set_temp(struct device *dev,\n"
+ ">> + struct device_attribute *attr,\n"
+ ">> + const char *buf, size_t count)\n"
+ ">> +{\n"
+ ">> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);\n"
+ ">> + struct i2c_client *client = to_i2c_client(dev);\n"
+ ">> + struct tmp103 *tmp103 = i2c_get_clientdata(client);\n"
+ ">> + long val;\n"
+ ">> + int status;\n"
+ ">> +\n"
+ ">> + if (kstrtol(buf, 10, &val) < 0)\n"
+ ">> + return -EINVAL;\n"
+ ">> + val = clamp_val(val, -55000, 128000);\n"
+ ">\n"
+ "> Max should be 127000.\n"
+ "\n"
+ "Ok, change this.\n"
+ "\n"
+ ">> +\n"
+ ">> + mutex_lock(&tmp103->lock);\n"
+ ">> + tmp103->temp[sda->index] = val;\n"
+ ">\n"
+ "> You can not do that since it is the non-rounded value. You have to convert to\n"
+ "> the register value, then convert back to the display value.\n"
+ ">\n"
+ "> If you use regmap, the problem goes away, since you would not cache converted\n"
+ "> data but convert in the show function. Alternatively, you could store register\n"
+ "> values and convert in the show function.\n"
+ "\n"
+ "I take a look at this.\n"
+ "\n"
+ ">> + status = i2c_smbus_write_byte_data(client, tmp103_reg[sda->index],\n"
+ ">> + tmp103_mC_to_reg(val));\n"
+ ">\n"
+ "> Please make sure that continuation lines match the '(' in the line above.\n"
+ "> Alignments are inconsistent, otherwise I would not mention it.\n"
+ "> checkpatch --strict tells you which ones are misaligned.\n"
+ "\n"
+ "Ah, did a checkpatch but without the \"--strict\" option !\n"
+ "\n"
+ "I fix this globally.\n"
+ "\n"
+ ">> + mutex_unlock(&tmp103->lock);\n"
+ ">> + return status ? : count;\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp103_show_temp, NULL , 0);\n"
+ ">> +\n"
+ "> If you use regmap you can store the register directly here and you would not\n"
+ "> need tmp103_reg[].\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ ">> +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR | S_IRUGO, tmp103_show_temp,\n"
+ ">> + tmp103_set_temp, 1);\n"
+ ">> +\n"
+ "> Per the datasheet this should be temp1_min. The register definition is different to TMP102.\n"
+ "\n"
+ "changed.\n"
+ "\n"
+ ">> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, tmp103_show_temp,\n"
+ ">> + tmp103_set_temp, 2);\n"
+ ">> +\n"
+ ">> +static struct attribute *tmp103_attributes[] = {\n"
+ ">> + &sensor_dev_attr_temp1_input.dev_attr.attr,\n"
+ ">> + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr,\n"
+ ">> + &sensor_dev_attr_temp1_max.dev_attr.attr,\n"
+ ">\n"
+ "> You might also consider adding temp1_min_alarm and temp1_max_alarm to inform\n"
+ "> user space if limits are exceeded. The status is reported with the FL and FH\n"
+ "> bits in the configuration register.\n"
+ "\n"
+ "Add this if I find time, or in an another patch...\n"
+ "\n"
+ ">> + NULL\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +static const struct attribute_group tmp103_attr_group = {\n"
+ ">> + .attrs = tmp103_attributes,\n"
+ ">> +};\n"
+ ">> +\n"
+ "> Please use the ATTRIBUTE_GROUPS() macro.\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ ">> +#define TMP103_CONFIG (TMP103_CONF_CR1 | TMP103_CONF_M1)\n"
+ ">> +#define TMP103_CONFIG_RD_ONLY (TMP103_CONF_CR1 | TMP103_CONF_M1)\n"
+ ">\n"
+ "> Latter define is not used as far as I can see. Since it is the same\n"
+ "> it is unnecessary anyway.\n"
+ "\n"
+ "removed.\n"
+ "\n"
+ ">> +\n"
+ ">> +static int tmp103_probe(struct i2c_client *client,\n"
+ ">> + const struct i2c_device_id *id)\n"
+ ">> +{\n"
+ ">> + struct tmp103 *tmp103;\n"
+ ">> + int status;\n"
+ ">> +\n"
+ ">> + if (!i2c_check_functionality(client->adapter,\n"
+ ">> + I2C_FUNC_SMBUS_WORD_DATA)) {\n"
+ ">> + dev_err(&client->dev,\n"
+ ">> + \"adapter doesn't support SMBus word transactions\\n\");\n"
+ ">\n"
+ "> Good that the chip doesn't support any ;-). Check for byte transactions instead.\n"
+ "\n"
+ "Heh... changed.\n"
+ "\n"
+ ">> + return -ENODEV;\n"
+ ">> + }\n"
+ ">> +\n"
+ ">> + tmp103 = devm_kzalloc(&client->dev, sizeof(*tmp103), GFP_KERNEL);\n"
+ ">> + if (!tmp103)\n"
+ ">> + return -ENOMEM;\n"
+ ">> +\n"
+ ">> + i2c_set_clientdata(client, tmp103);\n"
+ ">> +\n"
+ ">> + status = i2c_smbus_read_byte_data(client, TMP103_CONF_REG);\n"
+ ">> + if (status < 0) {\n"
+ ">> + dev_err(&client->dev, \"error reading config register\\n\");\n"
+ ">> + return status;\n"
+ ">> + }\n"
+ ">> + tmp103->config_orig = status;\n"
+ ">\n"
+ "> You don't use config_orig outside the probe function,\n"
+ "> so storing it in private data doesn't add any value.\n"
+ "> Alternatively, you could restore the original configuration on exit.\n"
+ "\n"
+ "I add \"restoring it on exit.\"\n"
+ "\n"
+ ">> + status = i2c_smbus_write_byte_data(client, TMP103_CONF_REG,\n"
+ ">> + TMP103_CONFIG);\n"
+ ">> + if (status < 0) {\n"
+ ">> + dev_err(&client->dev, \"error writing config register\\n\");\n"
+ ">> + goto fail_restore_config;\n"
+ ">> + }\n"
+ ">> + status = i2c_smbus_read_byte_data(client, TMP103_CONF_REG);\n"
+ ">> + if (status < 0) {\n"
+ ">> + dev_err(&client->dev, \"error reading config register\\n\");\n"
+ ">> + goto fail_restore_config;\n"
+ ">> + }\n"
+ ">> + if (status != TMP103_CONFIG) {\n"
+ ">> + dev_err(&client->dev, \"config settings did not stick\\n\");\n"
+ ">> + status = -ENODEV;\n"
+ ">> + goto fail_restore_config;\n"
+ ">> + }\n"
+ ">> + tmp103->last_update = jiffies - HZ;\n"
+ ">> + mutex_init(&tmp103->lock);\n"
+ ">> +\n"
+ ">> + status = sysfs_create_group(&client->dev.kobj, &tmp103_attr_group);\n"
+ ">> + if (status) {\n"
+ ">> + dev_dbg(&client->dev, \"could not create sysfs files\\n\");\n"
+ ">> + goto fail_restore_config;\n"
+ ">> + }\n"
+ ">> + tmp103->hwmon_dev = hwmon_device_register(&client->dev);\n"
+ ">> + if (IS_ERR(tmp103->hwmon_dev)) {\n"
+ ">> + dev_dbg(&client->dev, \"unable to register hwmon device\\n\");\n"
+ ">> + status = PTR_ERR(tmp103->hwmon_dev);\n"
+ ">> + goto fail_remove_sysfs;\n"
+ ">> + }\n"
+ ">\n"
+ "> Please use devm_hwmon_device_register_with_groups().\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ ">> +\n"
+ ">> + dev_info(&client->dev, \"initialized\\n\");\n"
+ ">\n"
+ "> Please drop this message.\n"
+ "\n"
+ "Ok.\n"
+ "\n"
+ ">> +\n"
+ ">> + return 0;\n"
+ ">> +\n"
+ ">> +fail_remove_sysfs:\n"
+ ">> + sysfs_remove_group(&client->dev.kobj, &tmp103_attr_group);\n"
+ ">> +fail_restore_config:\n"
+ ">> + i2c_smbus_write_word_swapped(client, TMP103_CONF_REG,\n"
+ ">> + tmp103->config_orig);\n"
+ ">\n"
+ "> i2c_smbus_write_byte_data() ?\n"
+ "\n"
+ "Yes, changed!\n"
+ "\n"
+ ">> + return status;\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static int tmp103_remove(struct i2c_client *client)\n"
+ ">> +{\n"
+ ">> + struct tmp103 *tmp103 = i2c_get_clientdata(client);\n"
+ ">> +\n"
+ ">> + hwmon_device_unregister(tmp103->hwmon_dev);\n"
+ ">> + sysfs_remove_group(&client->dev.kobj, &tmp103_attr_group);\n"
+ ">> +\n"
+ ">> + return 0;\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +#ifdef CONFIG_PM\n"
+ ">> +static int tmp103_suspend(struct device *dev)\n"
+ ">> +{\n"
+ ">> + struct i2c_client *client = to_i2c_client(dev);\n"
+ ">> + int config;\n"
+ ">> +\n"
+ ">> + config = i2c_smbus_read_word_swapped(client, TMP103_CONF_REG);\n"
+ ">\n"
+ "> byte\n"
+ ">\n"
+ ">> + if (config < 0)\n"
+ ">> + return config;\n"
+ ">> +\n"
+ ">> + config &= ~TMP103_CONF_SD;\n"
+ ">> + return i2c_smbus_write_word_swapped(client, TMP103_CONF_REG, config);\n"
+ ">\n"
+ "> byte\n"
+ ">\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static int tmp103_resume(struct device *dev)\n"
+ ">> +{\n"
+ ">> + struct i2c_client *client = to_i2c_client(dev);\n"
+ ">> + int config;\n"
+ ">> +\n"
+ ">> + config = i2c_smbus_read_word_swapped(client, TMP103_CONF_REG);\n"
+ ">\n"
+ "> byte\n"
+ ">\n"
+ ">> + if (config < 0)\n"
+ ">> + return config;\n"
+ ">> +\n"
+ ">> + config |= TMP103_CONF_SD;\n"
+ ">> + return i2c_smbus_write_word_swapped(client, TMP103_CONF_REG, config);\n"
+ ">\n"
+ "> byte\n"
+ "\n"
+ "changed.\n"
+ "\n"
+ ">> +}\n"
+ ">> +\n"
+ ">> +static const struct dev_pm_ops tmp103_dev_pm_ops = {\n"
+ ">> + .suspend = tmp103_suspend,\n"
+ ">> + .resume = tmp103_resume,\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +#define TMP103_DEV_PM_OPS (&tmp103_dev_pm_ops)\n"
+ ">> +#else\n"
+ ">> +#define TMP103_DEV_PM_OPS NULL\n"
+ ">> +#endif /* CONFIG_PM */\n"
+ ">> +\n"
+ ">> +static const struct i2c_device_id tmp103_id[] = {\n"
+ ">> + { DRIVER_NAME, 0 },\n"
+ ">> + { }\n"
+ ">> +};\n"
+ ">> +MODULE_DEVICE_TABLE(i2c, tmp103_id);\n"
+ ">> +\n"
+ ">> +static struct i2c_driver tmp103_driver = {\n"
+ ">> + .driver.name = DRIVER_NAME,\n"
+ ">> + .driver.pm = TMP103_DEV_PM_OPS,\n"
+ ">\n"
+ "> .driver = {\n"
+ "> .name = DRIVER_NAME,\n"
+ "> .pm = TMP103_DEV_PM_OPS,\n"
+ "> },\n"
+ ">\n"
+ "> would be a bit nicer. I won't mandate it, though.\n"
+ "\n"
+ "changed.\n"
+ "\n"
+ ">> + .probe = tmp103_probe,\n"
+ ">> + .remove = tmp103_remove,\n"
+ ">> + .id_table = tmp103_id,\n"
+ ">> +};\n"
+ ">> +\n"
+ ">> +module_i2c_driver(tmp103_driver);\n"
+ ">> +\n"
+ ">> +MODULE_AUTHOR(\"Heiko Schocher <hs@denx.de>\");\n"
+ ">> +MODULE_DESCRIPTION(\"Texas Instruments TMP103 temperature sensor driver\");\n"
+ ">> +MODULE_LICENSE(\"GPL\");\n"
+ "\n"
+ "Thanks for this great review!\n"
+ "\n"
+ "bye,\n"
+ "Heiko\n"
+ "-- \n"
+ "DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel\n"
+ HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
 
-614b3ef1e4bdd441c34a7535c2fc6c12a098c389a2e97b5f2c84841e7ccd1074
+f0aefacd05389130e5a7d784b31a9b5af04bde7f7992322fb77cb20d004bf1b8

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.