All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <56A23FD2.9040009@roeck-us.net>

diff --git a/a/1.txt b/N1/1.txt
index 1c92646..07aa873 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,529 +1,801 @@
-T24gMDEvMjEvMjAxNiAxMTozNCBBTSwgU3TDqXBoYW4gS29jaGVuIHdyb3RlOgo+IEFkZCBhZGRp
-dGlvbmFsIHN1cHBvcnQgZnVuY3Rpb25zIGBsbTkwX2dldF8qYCBhbmQgYGxtOTBfc2V0XypgIGV4
-dHJhY3RlZAo+IGZyb20gdGhlIHN5c2ZzIHJvdXRpbmVzLiBUaGUgc3lzZnMgcm91dGluZXMgYXJl
-IG5vdyBqdXN0IHN0dWJzIHdyYXBwaW5nCj4gdGhlIG5ldyBzdXBwb3J0IGZ1bmN0aW9ucy4KPgo+
-IFRoaXMgd2F5IHdlIGhhdmUgYSBjb25zaXN0ZW50IHJlZ2lzdGVyIGFjY2VzcyBpbnRlcmZhY2Us
-IHdoaWNoIGNhbiBiZQo+IHVzZWQgZnJvbSBvdGhlciBpbnRlZ3JhdGlvbnMgZG93biB0aGUgbGlu
-ZS4gVG8gYXZvaWQgY29uZnVzaW9uLCBhbGwKPiBzeXNmcyBtZXRob2RzIGFyZSBub3cgcHJlZml4
-ZWQgYGxtOTBfc3lzZnNfKmAuCj4KPiBUbyBhY2NvbXBsaXNoIHRoaXMsIHRoZSBgbG05MF91cGRh
-dGVfZGV2aWNlYCBzaWduYXR1cmUgaGFzIGNoYW5nZWQgYW5kCj4gaXMgbm93IGBsbTkwX3VwZGF0
-ZWAsIHRha2luZyBkYXRhIGRpcmVjdGx5LiBJdCBubyBsb25nZXIgc2VydmVzIHRoZQo+IGR1YWwg
-cHVycG9zZSBvZiB1cGRhdGUgZnVuY3Rpb24gKmFuZCogZHJpdmVyIGRhdGEgZ2V0dGVyLgo+Cj4g
-YGxtOTBfc2V0X2NvbnZyYXRlYCwgYGxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsYCBhbmQgYGxt
-OTBfaW5pdF9jbGllbnRgCj4gYWxzbyBoYWQgcmVkdW5kYW50IGkyYyBjbGllbnQgcGFyYW1ldGVy
-cywgd2hpY2ggaGF2ZSBiZWVuIHJlbW92ZWQuCj4KPiBTaWduZWQtb2ZmLWJ5OiBTdMOpcGhhbiBL
-b2NoZW4gPHN0ZXBoYW5Aa29jaGVuLm5sPgo+IC0tLQo+ICAgZHJpdmVycy9od21vbi9sbTkwLmMg
-fCA1MTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0t
-Cj4gICAxIGZpbGUgY2hhbmdlZCwgMzAwIGluc2VydGlvbnMoKyksIDIxMSBkZWxldGlvbnMoLSkK
-Pgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05
-MC5jCj4gaW5kZXggYzlmZjA4ZC4uODhkYWY3MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2h3bW9u
-L2xtOTAuYwo+ICsrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCj4gQEAgLTQ3MywxMCArNDczLDEw
-IEBAIHN0YXRpYyBpbnQgbG05MF9yZWFkMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTgg
-cmVnaCwgdTggcmVnbCwgdTE2ICp2YWx1ZSkKPiAgICAqIHZhcmlvdXMgcmVnaXN0ZXJzIGhhdmUg
-ZGlmZmVyZW50IG1lYW5pbmdzIGFzIGEgcmVzdWx0IG9mIHNlbGVjdGluZyBhCj4gICAgKiBub24t
-ZGVmYXVsdCByZW1vdGUgY2hhbm5lbC4KPiAgICAqLwo+IC1zdGF0aWMgaW5saW5lIHZvaWQgbG05
-MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPiAtCQkJ
-CQkgICAgICBzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLAo+IC0JCQkJCSAgICAgIGludCBjaGFubmVs
-KQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoCj4gKwkJ
-c3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGNoYW5uZWwpCgpWZXJ5IG11Y2ggcGVyc29uYWwg
-cHJlZmVyZW5jZSBoZXJlLCB1bnJlbGF0ZWQgY2hhbmdlLCBhbmQgdmlvbGF0ZXMgY29kaW5nIHN0
-eWxlLgoKUGxlYXNlIG9ubHkgb25lIGxvZ2ljYWwgY2hhbmdlIHBlciBwYXRjaC4gSWYgeW91IHRo
-aW5rIGl0IGlzIHdvcnRod2hpbGUgdG8gcmVtb3ZlCnRoZSBjbGllbnQgYXJndW1lbnQsIHByZXBh
-cmUgYSBzZXBhcmF0ZSBwYXRjaCB3aXRoIG9ubHkgdGhhdCBjaGFuZ2UsIGFuZCBzaG93CnRoYXQg
-aXQgcmVkdWNlcyBjb2RlIHNpemUuIEFsc28gcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdXIgcGF0
-Y2ggZm9sbG93cwpjb2Rpbmcgc3R5bGUuCgo+ICAgewo+ICsJc3RydWN0IGkyY19jbGllbnQgKmNs
-aWVudCA9IGRhdGEtPmNsaWVudDsKPiAgIAl1OCBjb25maWc7Cj4KPiAgIAlpZiAoZGF0YS0+a2lu
-ZCA9PSBtYXg2Njk2KSB7Cj4gQEAgLTQ5MCwzMiArNDkwLDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9p
-ZCBsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+
-ICAgfQo+Cj4gICAvKgo+IC0gKiBTZXQgY29udmVyc2lvbiByYXRlLgo+IC0gKiBjbGllbnQtPnVw
-ZGF0ZV9sb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAodW5sZXNz
-IHdlIGFyZQo+IC0gKiBpbiBkZXRlY3Rpb24gb3IgaW5pdGlhbGl6YXRpb24gc3RlcHMpLgo+ICsg
-KiBVcGRhdGUgYWxsIGN1cnJlbnQgcmVnaXN0ZXIgdmFsdWVzCj4gICAgKi8KPiAtc3RhdGljIHZv
-aWQgbG05MF9zZXRfY29udnJhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxt
-OTBfZGF0YSAqZGF0YSwKPiAtCQkJICAgICAgdW5zaWduZWQgaW50IGludGVydmFsKQo+IC17Cj4g
-LQlpbnQgaTsKPiAtCXVuc2lnbmVkIGludCB1cGRhdGVfaW50ZXJ2YWw7Cj4gLQo+IC0JLyogU2hp
-ZnQgY2FsY3VsYXRpb25zIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyAqLwo+IC0JaW50ZXJ2YWwg
-PDw9IDY7Cj4gLQo+IC0JLyogZmluZCB0aGUgbmVhcmVzdCB1cGRhdGUgcmF0ZSAqLwo+IC0JZm9y
-IChpID0gMCwgdXBkYXRlX2ludGVydmFsID0gTE05MF9NQVhfQ09OVlJBVEVfTVMgPDwgNjsKPiAt
-CSAgICAgaSA8IGRhdGEtPm1heF9jb252cmF0ZTsgaSsrLCB1cGRhdGVfaW50ZXJ2YWwgPj49IDEp
-Cj4gLQkJaWYgKGludGVydmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQo+IC0JCQlicmVh
-azsKPiAtCj4gLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19D
-T05WUkFURSwgaSk7Cj4gLQlkYXRhLT51cGRhdGVfaW50ZXJ2YWwgPSBESVZfUk9VTkRfQ0xPU0VT
-VCh1cGRhdGVfaW50ZXJ2YWwsIDY0KTsKPiAtfQo+IC0KPiAtc3RhdGljIHN0cnVjdCBsbTkwX2Rh
-dGEgKmxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3N0YXRpYyB2b2lk
-IGxtOTBfdXBkYXRlKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEpCj4gICB7Cj4gLQlzdHJ1Y3QgbG05
-MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gICAJc3RydWN0IGkyY19jbGll
-bnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKPiAgIAl1bnNpZ25lZCBsb25nIG5leHRfdXBkYXRl
-Owo+Cj4gQEAgLTU4Myw3ICs1NjEsNyBAQCBzdGF0aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91
-cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgIAkJZGF0YS0+YWxhcm1zID0gYWxh
-cm1zOwkvKiBzYXZlIGFzIDE2IGJpdCB2YWx1ZSAqLwo+Cj4gICAJCWlmIChkYXRhLT5raW5kID09
-IG1heDY2OTYpIHsKPiAtCQkJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRh
-LCAxKTsKPiArCQkJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoZGF0YSwgMSk7Cj4gICAJCQls
-bTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfQ1JJVCwKPiAgIAkJCQkgICAg
-ICAmZGF0YS0+dGVtcDhbUkVNT1RFMl9DUklUXSk7Cj4gICAJCQlsbTkwX3JlYWRfcmVnKGNsaWVu
-dCwgTUFYNjY1OV9SRUdfUl9SRU1PVEVfRU1FUkcsCj4gQEAgLTU5NSw3ICs1NzMsNyBAQCBzdGF0
-aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRl
-dikKPiAgIAkJCQlkYXRhLT50ZW1wMTFbUkVNT1RFMl9MT1ddID0gaCA8PCA4Owo+ICAgCQkJaWYg
-KCFsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfSElHSEgsICZoKSkKPiAg
-IAkJCQlkYXRhLT50ZW1wMTFbUkVNT1RFMl9ISUdIXSA9IGggPDwgODsKPiAtCQkJbG05MF9zZWxl
-Y3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKPiArCQkJbG05MF9zZWxlY3RfcmVt
-b3RlX2NoYW5uZWwoZGF0YSwgMCk7Cj4KPiAgIAkJCWlmICghbG05MF9yZWFkX3JlZyhjbGllbnQs
-IE1BWDY2OTZfUkVHX1JfU1RBVFVTMiwKPiAgIAkJCQkJICAgJmFsYXJtcykpCj4gQEAgLTYyNCw4
-ICs2MDIsNiBAQCBzdGF0aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91cGRhdGVfZGV2aWNlKHN0
-cnVjdCBkZXZpY2UgKmRldikKPiAgIAl9Cj4KPiAgIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0
-ZV9sb2NrKTsKPiAtCj4gLQlyZXR1cm4gZGF0YTsKPiAgIH0KPgo+ICAgLyoKPiBAQCAtNzU2LDMy
-ICs3MzIsMzEgQEAgc3RhdGljIHUxNiB0ZW1wX3RvX3UxNl9hZHQ3NDYxKHN0cnVjdCBsbTkwX2Rh
-dGEgKmRhdGEsIGxvbmcgdmFsKQo+ICAgfQo+Cj4gICAvKgo+IC0gKiBTeXNmcyBzdHVmZgo+ICsg
-KiBSZWdpc3RlciBhY2Nlc3NvcnMuIEdldHRlcnMgdHJpZ2dlciBhbiB1cGRhdGUuIFNldHRlcnMg
-aGF2ZSBsb2NrZWQgdmFyaWFudHMKPiArICogdGhhdCByZXF1aXJlIHVwZGF0ZV9sb2NrIHRvIGJl
-IGhlbGQuCj4gICAgKi8KPgo+IC1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXA4KHN0cnVjdCBkZXZp
-Y2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gLQkJCSAgY2hhciAq
-YnVmKQo+ICtzdGF0aWMgaW50IGxtOTBfZ2V0X3RlbXA4KHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEs
-IGludCBpbmRleCkKPiAgIHsKPiAtCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0
-ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiAtCXN0cnVjdCBsbTkwX2RhdGEgKmRh
-dGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKPiAgIAlpbnQgdGVtcDsKPgo+ICsJbG05MF91
-cGRhdGUoZGF0YSk7Cj4gKwo+ICAgCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+
-a2luZCA9PSB0bXA0NTEpCj4gLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRh
-dGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Cj4gKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYx
-KGRhdGEsIGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4gICAJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBt
-YXg2NjQ2KQo+IC0JCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhd
-KTsKPiArCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4gICAJZWxz
-ZQo+IC0JCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKPiAr
-CQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4KPiAgIAkvKiArMTYg
-ZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwo+IC0JaWYgKGRhdGEtPmtp
-bmQgPT0gbG05OSAmJiBhdHRyLT5pbmRleCA9PSAzKQo+ICsJaWYgKGRhdGEtPmtpbmQgPT0gbG05
-OSAmJiBpbmRleCA9PSAzKQo+ICAgCQl0ZW1wICs9IDE2MDAwOwo+Cj4gLQlyZXR1cm4gc3ByaW50
-ZihidWYsICIlZFxuIiwgdGVtcCk7Cj4gKwlyZXR1cm4gdGVtcDsKPiAgIH0KPgo+IC1zdGF0aWMg
-c3NpemVfdCBzZXRfdGVtcDgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJp
-YnV0ZSAqZGV2YXR0ciwKPiAtCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICtz
-dGF0aWMgdm9pZCBsbTkwX3NldF90ZW1wOF9sb2NrZWQoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwg
-aW50IGluZGV4LCBsb25nIHZhbCkKPiAgIHsKPiAgIAlzdGF0aWMgY29uc3QgdTggcmVnW1RFTVA4
-X1JFR19OVU1dID0gewo+ICAgCQlMTTkwX1JFR19XX0xPQ0FMX0xPVywKPiBAQCAtNzk0LDkwICs3
-NjksNzMgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3RlbXA4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry
-dWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gICAJCU1BWDY2NTlfUkVHX1dfUkVNT1RF
-X0VNRVJHLAo+ICAgCX07Cj4KPiAtCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0
-ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiAtCXN0cnVjdCBsbTkwX2RhdGEgKmRh
-dGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAtCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQg
-PSBkYXRhLT5jbGllbnQ7Cj4gLQlpbnQgbnIgPSBhdHRyLT5pbmRleDsKPiAtCWxvbmcgdmFsOwo+
-IC0JaW50IGVycjsKPiAtCj4gLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwo+IC0JaWYg
-KGVyciA8IDApCj4gLQkJcmV0dXJuIGVycjsKPiAtCj4gICAJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0
-IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KPiAtCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYg
-YXR0ci0+aW5kZXggPT0gMykKPiArCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPT0g
-MykKPiAgIAkJdmFsIC09IDE2MDAwOwo+Cj4gLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9j
-ayk7Cj4gICAJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1
-MSkKPiAtCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsK
-PiArCQlkYXRhLT50ZW1wOFtpbmRleF0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsK
-PiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJZGF0YS0+dGVtcDhbbnJd
-ID0gdGVtcF90b191OCh2YWwpOwo+ICsJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fdTgo
-dmFsKTsKPiAgIAllbHNlCj4gLQkJZGF0YS0+dGVtcDhbbnJdID0gdGVtcF90b19zOCh2YWwpOwo+
-ICsJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fczgodmFsKTsKPgo+IC0JbG05MF9zZWxl
-Y3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCBuciA+PSA2KTsKPiAtCWkyY19zbWJ1c193
-cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLCBkYXRhLT50ZW1wOFtucl0pOwo+IC0JbG05
-MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKPiArCWxtOTBfc2VsZWN0
-X3JlbW90ZV9jaGFubmVsKGRhdGEsIGluZGV4ID49IDYpOwo+ICsJaTJjX3NtYnVzX3dyaXRlX2J5
-dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZ1tpbmRleF0sIGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4g
-KwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChkYXRhLCAwKTsKPiArfQo+Cj4gK3N0YXRpYyB2
-b2lkIGxtOTBfc2V0X3RlbXA4KHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCwgbG9u
-ZyB2YWwpCj4gK3sKPiArCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiArCWxtOTBf
-c2V0X3RlbXA4X2xvY2tlZChkYXRhLCBpbmRleCwgdmFsKTsKPiAgIAltdXRleF91bmxvY2soJmRh
-dGEtPnVwZGF0ZV9sb2NrKTsKPiAtCXJldHVybiBjb3VudDsKPiAgIH0KPgo+IC1zdGF0aWMgc3Np
-emVfdCBzaG93X3RlbXAxMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmli
-dXRlICpkZXZhdHRyLAo+IC0JCQkgICBjaGFyICpidWYpCj4gK3N0YXRpYyBpbnQgbG05MF9nZXRf
-dGVtcDExKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCkKPiAgIHsKPiAtCXN0cnVj
-dCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIo
-ZGV2YXR0cik7Cj4gLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNl
-KGRldik7Cj4gICAJaW50IHRlbXA7Cj4KPiArCWxtOTBfdXBkYXRlKGRhdGEpOwo+ICsKPiAgIAlp
-ZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQo+IC0JCXRl
-bXAgPSB0ZW1wX2Zyb21fdTE2X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDExW2F0dHItPmluZGV4
-XSk7Cj4gKwkJdGVtcCA9IHRlbXBfZnJvbV91MTZfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wMTFb
-aW5kZXhdKTsKPiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJdGVtcCA9
-IHRlbXBfZnJvbV91MTYoZGF0YS0+dGVtcDExW2F0dHItPmluZGV4XSk7Cj4gKwkJdGVtcCA9IHRl
-bXBfZnJvbV91MTYoZGF0YS0+dGVtcDExW2luZGV4XSk7Cj4gICAJZWxzZQo+IC0JCXRlbXAgPSB0
-ZW1wX2Zyb21fczE2KGRhdGEtPnRlbXAxMVthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1w
-X2Zyb21fczE2KGRhdGEtPnRlbXAxMVtpbmRleF0pOwo+Cj4gICAJLyogKzE2IGRlZ3JlZXMgb2Zm
-c2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KPiAtCWlmIChkYXRhLT5raW5kID09IGxtOTkg
-JiYgIGF0dHItPmluZGV4IDw9IDIpCj4gKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4
-IDw9IDIpCj4gICAJCXRlbXAgKz0gMTYwMDA7Cj4KPiAtCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVk
-XG4iLCB0ZW1wKTsKPiArCXJldHVybiB0ZW1wOwo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNl
-dF90ZW1wMTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2
-YXR0ciwKPiAtCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArc3RhdGljIHZv
-aWQgbG05MF9zZXRfdGVtcDExX2xvY2tlZChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5k
-ZXgsIGxvbmcgdmFsKQo+ICAgewo+IC0Jc3RydWN0IHsKPiAtCQl1OCBoaWdoOwo+IC0JCXU4IGxv
-dzsKPiAtCQlpbnQgY2hhbm5lbDsKPiAtCX0gcmVnWzVdID0gewo+IC0JCXsgTE05MF9SRUdfV19S
-RU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCwgMCB9LAo+IC0JCXsgTE05MF9SRUdf
-V19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMLCAwIH0sCj4gLQkJeyBMTTkw
-X1JFR19XX1JFTU9URV9PRkZTSCwgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0wsIDAgfSwKPiAtCQl7
-IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wsIDEgfSwKPiAt
-CQl7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCwgMSB9
-Cj4gLQl9OwoKQW5vdGhlciBzZXQgb2YgcGVyc29uYWwgcHJlZmVyZW5jZSBjaGFuZ2VzLgoKPiAt
-Cj4gLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9k
-ZXZfYXR0cl8yKGRldmF0dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRf
-ZHJ2ZGF0YShkZXYpOwo+ICAgCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGll
-bnQ7Cj4gLQlpbnQgbnIgPSBhdHRyLT5ucjsKPiAtCWludCBpbmRleCA9IGF0dHItPmluZGV4Owo+
-IC0JbG9uZyB2YWw7Cj4gLQlpbnQgZXJyOwo+ICsJdTggaGlnaCwgbG93LCBjaGFubmVsOwo+Cj4g
-LQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwo+IC0JaWYgKGVyciA8IDApCj4gLQkJcmV0
-dXJuIGVycjsKPiArI2RlZmluZSBTRUxFQ1RfUkVHUyhfcmVnLCBfY2hhbm5lbCkgeyBcCj4gKwlo
-aWdoID0gTE05MF9SRUdfV18jI19yZWcjI0g7IFwKPiArCWxvdyA9IExNOTBfUkVHX1dfIyNfcmVn
-IyNMOyBcCj4gKwljaGFubmVsID0gX2NoYW5uZWw7IFwKPiArfQoKV2UgaGF2ZSBiZWVuIHRyeWlu
-ZyB0byBnZXQgcmlkIG9mIGZ1bmN0aW9uIGRlZmluZXMgc3VjaCBhcyB0aGlzIG9uZS4KTW9zdCBv
-ZiB0aGUgdGltZSBpdCBpbmNyZWFzZXMgY29kZSBzaXplLCBhbmQgcmVkdWNlcyByZWFkYWJpbGl0
-eS4KUGx1cywgaXQgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgdGltZSB3ZSBoYXZlIHRvIHNwZW5k
-IHJldmlld2luZwp0aGUgY29kZSB0byBlbnN1cmUgaXQgaXMgY29ycmVjdC4KCj4gKwlzd2l0Y2gg
-KGluZGV4KSB7Cj4gKwljYXNlIFJFTU9URV9MT1c6ICAgIFNFTEVDVF9SRUdTKFJFTU9URV9MT1cs
-ICAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URV9ISUdIOiAgIFNFTEVDVF9SRUdTKFJFTU9URV9I
-SUdILCAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URV9PRkZTRVQ6IFNFTEVDVF9SRUdTKFJFTU9U
-RV9PRkZTLCAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URTJfTE9XOiAgIFNFTEVDVF9SRUdTKFJF
-TU9URV9MT1csICAxKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URTJfSElHSDogIFNFTEVDVF9SRUdT
-KFJFTU9URV9ISUdILCAxKTsgYnJlYWs7Cj4gKwlkZWZhdWx0OiByZXR1cm47CgouLi4gYW5kLCBp
-biB0aGlzIGNhc2UsIGludHJvZHVjZXMgY2hlY2twYXRjaCBlcnJvcnMuCgpUaGlzIHBhdGNoIGlz
-IGNsZWFybHkgbW9yZSB0aGFuIHdoYXQgaXRzIGhlYWRsaW5lIHNheXMuIEl0IGlzCnRvbyBjb21w
-bGV4IHRvIHJldmlldyBhcyBzaW5nbGUgcGF0Y2guIFBsZWFzZSBzcGxpdCBpbnRvCmxvZ2ljYWwg
-Y2hhbmdlcywgYW5kIGV4cGxhaW4gd2h5IHlvdSBtYWtlIHRob3NlIGNoYW5nZXMuCgpUaGFua3Ms
-Ckd1ZW50ZXIKCgo+ICsJfQo+ICsjdW5kZWYgU0VMRUNUX1JFR1MKPgo+ICAgCS8qICsxNiBkZWdy
-ZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCj4gICAJaWYgKGRhdGEtPmtpbmQg
-PT0gbG05OSAmJiBpbmRleCA8PSAyKQo+ICAgCQl2YWwgLT0gMTYwMDA7Cj4KPiAtCW11dGV4X2xv
-Y2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiAgIAlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8
-IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQo+ICAgCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90
-b191MTZfYWR0NzQ2MShkYXRhLCB2YWwpOwo+ICAgCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4
-NjY0NikKPiBAQCAtODg3LDU0ICs4NDUsNDYgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAxMShz
-dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICAg
-CWVsc2UKPiAgIAkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczgodmFsKSA8PCA4Owo+
-Cj4gLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIHJlZ1tucl0uY2hh
-bm5lbCk7Cj4gLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5oaWdo
-LAo+IC0JCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdID4+IDgpOwo+ICsJbG05MF9zZWxlY3RfcmVt
-b3RlX2NoYW5uZWwoZGF0YSwgY2hhbm5lbCk7Cj4gKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRh
-KGNsaWVudCwgaGlnaCwKPiArCQkJZGF0YS0+dGVtcDExW2luZGV4XSA+PiA4KTsKPiAgIAlpZiAo
-ZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKPiAtCQlpMmNfc21idXNfd3Jp
-dGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5sb3csCj4gLQkJCQkJICBkYXRhLT50ZW1wMTFb
-aW5kZXhdICYgMHhmZik7Cj4gLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRh
-dGEsIDApOwo+ICsJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBsb3csCj4gKwkJ
-CQlkYXRhLT50ZW1wMTFbaW5kZXhdICYgMHhmZik7Cj4gKwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hh
-bm5lbChkYXRhLCAwKTsKPiArfQo+Cj4gK3N0YXRpYyB2b2lkIGxtOTBfc2V0X3RlbXAxMShzdHJ1
-Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgsIGxvbmcgdmFsKQo+ICt7Cj4gKwltdXRleF9s
-b2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Cj4gKwlsbTkwX3NldF90ZW1wMTFfbG9ja2VkKGRhdGEs
-IGluZGV4LCB2YWwpOwo+ICAgCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwo+IC0J
-cmV0dXJuIGNvdW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcGh5c3Qoc3Ry
-dWN0IGRldmljZSAqZGV2LAo+IC0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZh
-dHRyLAo+IC0JCQkgICAgIGNoYXIgKmJ1ZikKPiArc3RhdGljIHNzaXplX3QgbG05MF9nZXRfdGVt
-cGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQo+ICAgewo+IC0Jc3RydWN0
-IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0
-dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYp
-Owo+ICAgCWludCB0ZW1wOwo+Cj4gKwlsbTkwX3VwZGF0ZShkYXRhKTsKPiArCj4gICAJaWYgKGRh
-dGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKPiAtCQl0ZW1wID0g
-dGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKPiAr
-CQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbaW5kZXhdKTsK
-PiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJdGVtcCA9IHRlbXBfZnJv
-bV91OChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1wX2Zyb21fdTgo
-ZGF0YS0+dGVtcDhbaW5kZXhdKTsKPiAgIAllbHNlCj4gLQkJdGVtcCA9IHRlbXBfZnJvbV9zOChk
-YXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+
-dGVtcDhbaW5kZXhdKTsKPgo+ICAgCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9y
-IHRoZSBMTTk5ICovCj4gLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGF0dHItPmluZGV4ID09
-IDMpCj4gKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4ID09IDMpCj4gICAJCXRlbXAg
-Kz0gMTYwMDA7Cj4KPiAtCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wIC0gdGVtcF9m
-cm9tX3M4KGRhdGEtPnRlbXBfaHlzdCkpOwo+ICsJcmV0dXJuIHRlbXAgLSB0ZW1wX2Zyb21fczgo
-ZGF0YS0+dGVtcF9oeXN0KTsKPiAgIH0KPgo+IC1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcGh5c3Qo
-c3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCj4gLQkJ
-CSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArc3RhdGljIHZvaWQgbG05MF9z
-ZXRfdGVtcGh5c3RfbG9ja2VkKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGxvbmcgdmFsKQo+ICAg
-ewo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+IC0J
-c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKPiAtCWxvbmcgdmFsOwo+
-IC0JaW50IGVycjsKPiAgIAlpbnQgdGVtcDsKPgo+IC0JZXJyID0ga3N0cnRvbChidWYsIDEwLCAm
-dmFsKTsKPiAtCWlmIChlcnIgPCAwKQo+IC0JCXJldHVybiBlcnI7Cj4gLQo+IC0JbXV0ZXhfbG9j
-aygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICAgCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwg
-ZGF0YS0+a2luZCA9PSB0bXA0NTEpCj4gICAJCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShk
-YXRhLCBkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7Cj4gICAJZWxzZSBpZiAoZGF0YS0+a2luZCA9
-PSBtYXg2NjQ2KQo+IEBAIC05NDMsNDMgKzg5MywxNjcgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3Rl
-bXBoeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15
-LAo+ICAgCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKPgo+
-ICAgCWRhdGEtPnRlbXBfaHlzdCA9IGh5c3RfdG9fcmVnKHRlbXAgLSB2YWwpOwo+IC0JaTJjX3Nt
-YnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfVENSSVRfSFlTVCwKPiAtCQkJ
-CSAgZGF0YS0+dGVtcF9oeXN0KTsKPiArCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+
-Y2xpZW50LCBMTTkwX1JFR19XX1RDUklUX0hZU1QsCj4gKwkJCWRhdGEtPnRlbXBfaHlzdCk7Cj4g
-K30KPiArCj4gK3N0YXRpYyB2b2lkIGxtOTBfc2V0X3RlbXBoeXN0KHN0cnVjdCBsbTkwX2RhdGEg
-KmRhdGEsIGxvbmcgdmFsKQo+ICt7Cj4gKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7
-Cj4gKwlsbTkwX3NldF90ZW1waHlzdF9sb2NrZWQoZGF0YSwgdmFsKTsKPiArCW11dGV4X3VubG9j
-aygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBsbTkwX3NldF9j
-b252cmF0ZV9sb2NrZWQoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHZhbCkK
-PiArewo+ICsJaW50IGk7Cj4gKwl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOwo+ICsKPiAr
-CS8qIFNoaWZ0IGNhbGN1bGF0aW9ucyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgKi8KPiArCXZh
-bCA8PD0gNjsKPiArCj4gKwkvKiBmaW5kIHRoZSBuZWFyZXN0IHVwZGF0ZSByYXRlICovCj4gKwlm
-b3IgKGkgPSAwLCB1cGRhdGVfaW50ZXJ2YWwgPSBMTTkwX01BWF9DT05WUkFURV9NUyA8PCA2Owo+
-ICsJICAgICBpIDwgZGF0YS0+bWF4X2NvbnZyYXRlOyBpKyssIHVwZGF0ZV9pbnRlcnZhbCA+Pj0g
-MSkKPiArCQlpZiAodmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQo+ICsJCQlicmVhazsK
-PiArCj4gKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05MF9SRUdf
-V19DT05WUkFURSwgaSk7Cj4gKwlkYXRhLT51cGRhdGVfaW50ZXJ2YWwgPSBESVZfUk9VTkRfQ0xP
-U0VTVCh1cGRhdGVfaW50ZXJ2YWwsIDY0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbG05MF9z
-ZXRfY29udnJhdGUoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHZhbCkKPiAr
-ewo+ICsJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICsJbG05MF9zZXRfY29udnJh
-dGVfbG9ja2VkKGRhdGEsIHZhbCk7Cj4gICAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9j
-ayk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFN5c2ZzIHN0dWZmCj4gKyAqLwo+ICsKPiArc3RhdGlj
-IHNzaXplX3QgbG05MF9zeXNmc19zaG93X3RlbXA4KAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwg
-c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gKwkJY2hhciAqYnVmKQo+ICt7Cj4g
-KwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0
-dHIoZGV2YXR0cik7Cj4gKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRh
-KGRldik7Cj4gKwo+ICsJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxtOTBfZ2V0X3RlbXA4
-KGRhdGEsIGF0dHItPmluZGV4KSk7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lz
-ZnNfc2V0X3RlbXA4KAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRy
-aWJ1dGUgKmRldmF0dHIsCj4gKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCj4gK3sK
-PiArCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZf
-YXR0cihkZXZhdHRyKTsKPiArCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRh
-dGEoZGV2KTsKPiArCWxvbmcgdmFsOwo+ICsJaW50IGVycjsKPiArCj4gKwllcnIgPSBrc3RydG9s
-KGJ1ZiwgMTAsICZ2YWwpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g
-KwlsbTkwX3NldF90ZW1wOChkYXRhLCBhdHRyLT5pbmRleCwgdmFsKTsKPiArCj4gICAJcmV0dXJu
-IGNvdW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZp
-Y2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+IC0JCQkgICBjaGFyICpi
-dWYpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNfc2hvd190ZW1wMTEoCj4gKwkJc3RydWN0
-IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQljaGFy
-ICpidWYpCj4gK3sKPiArCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRv
-X3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiArCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBk
-ZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwg
-bG05MF9nZXRfdGVtcDExKGRhdGEsIGF0dHItPmluZGV4KSk7Cj4gK30KPiArCj4gK3N0YXRpYyBz
-c2l6ZV90IGxtOTBfc3lzZnNfc2V0X3RlbXAxMSgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0
-cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6
-ZV90IGNvdW50KQo+ICAgewo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRl
-X2RldmljZShkZXYpOwo+ICsJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0g
-dG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwo+ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9
-IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJbG9uZyB2YWw7Cj4gKwlpbnQgZXJyOwo+ICsKPiAr
-CWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1
-cm4gZXJyOwo+ICsKPiArCWxtOTBfc2V0X3RlbXAxMShkYXRhLCBhdHRyLT5pbmRleCwgdmFsKTsK
-PiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lz
-ZnNfc2hvd190ZW1waHlzdCgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vf
-YXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCWNoYXIgKmJ1ZikKPiArewo+ICsJc3RydWN0IHNlbnNv
-cl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwo+
-ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiAr
-CXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsbTkwX2dldF90ZW1waHlzdChkYXRhLCBhdHRy
-LT5pbmRleCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3NldF90ZW1w
-aHlzdCgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpk
-dW1teSwKPiArCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0
-IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJbG9uZyB2YWw7Cj4g
-KwlpbnQgZXJyOwo+ICsKPiArCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Cj4gKwlpZiAo
-ZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCWxtOTBfc2V0X3RlbXBoeXN0KGRhdGEs
-IHZhbCk7Cj4gKwo+ICsJcmV0dXJuIGNvdW50Owo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBs
-bTkwX3N5c2ZzX3Nob3dfYWxhcm1zKAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRl
-dmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+ICsJCWNoYXIgKmJ1ZikKPiArewo+ICsJc3RydWN0IGxt
-OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiArCWxtOTBfdXBkYXRl
-KGRhdGEpOwo+ICsKPiAgIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1z
-KTsKPiAgIH0KPgo+IC1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRl
-diwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKPiAtCQkJICAqZGV2YXR0ciwgY2hhciAqYnVmKQo+
-ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3Nob3dfYWxhcm0oCj4gKwkJc3RydWN0IGRldmlj
-ZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQljaGFyICpidWYp
-Cj4gICB7Cj4gICAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vu
-c29yX2Rldl9hdHRyKGRldmF0dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBf
-dXBkYXRlX2RldmljZShkZXYpOwo+ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRf
-ZHJ2ZGF0YShkZXYpOwo+ICAgCWludCBiaXRuciA9IGF0dHItPmluZGV4Owo+Cj4gKwlsbTkwX3Vw
-ZGF0ZShkYXRhKTsKPiArCj4gICAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5h
-bGFybXMgPj4gYml0bnIpICYgMSk7Cj4gICB9Cj4KPiAtc3RhdGljIHNzaXplX3Qgc2hvd191cGRh
-dGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAo+IC0JCQkJICAgIHN0cnVjdCBkZXZpY2Vf
-YXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNf
-c2hvd191cGRhdGVfaW50ZXJ2YWwoCj4gKwkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2
-aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiArCQljaGFyICpidWYpCj4gICB7Cj4gICAJc3RydWN0IGxt
-OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Cj4gICAJcmV0dXJuIHNwcmlu
-dGYoYnVmLCAiJXVcbiIsIGRhdGEtPnVwZGF0ZV9pbnRlcnZhbCk7Cj4gICB9Cj4KPiAtc3RhdGlj
-IHNzaXplX3Qgc2V0X3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gLQkJCQkg
-ICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiAtCQkJCSAgIGNvbnN0IGNoYXIgKmJ1
-Ziwgc2l6ZV90IGNvdW50KQo+ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3NldF91cGRhdGVf
-aW50ZXJ2YWwoCj4gKwkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0
-ZSAqYXR0ciwKPiArCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiAgIHsKPiAgIAlz
-dHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gLQlzdHJ1Y3Qg
-aTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50Owo+ICAgCXVuc2lnbmVkIGxvbmcgdmFs
-Owo+ICAgCWludCBlcnI7Cj4KPiBAQCAtOTg3LDQ5ICsxMDYxLDU1IEBAIHN0YXRpYyBzc2l6ZV90
-IHNldF91cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAo+ICAgCWlmIChlcnIpCj4g
-ICAJCXJldHVybiBlcnI7Cj4KPiAtCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiAt
-CWxtOTBfc2V0X2NvbnZyYXRlKGNsaWVudCwgZGF0YSwgY2xhbXBfdmFsKHZhbCwgMCwgMTAwMDAw
-KSk7Cj4gLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiArCWxtOTBfc2V0X2Nv
-bnZyYXRlKGRhdGEsIGNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOwo+Cj4gICAJcmV0dXJuIGNv
-dW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9pbnB1dCwg
-U19JUlVHTywgc2hvd190ZW1wMTEsIE5VTEwsCj4gLQkwLCBMT0NBTF9URU1QKTsKPiAtc3RhdGlj
-IFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwg
-TlVMTCwKPiAtCTAsIFJFTU9URV9URU1QKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAo+IC0Jc2V0X3RlbXA4LCBM
-T0NBTF9MT1cpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWluLCBTX0lX
-VVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCj4gLQlzZXRfdGVtcDExLCAwLCBSRU1PVEVfTE9X
-KTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lS
-VUdPLCBzaG93X3RlbXA4LAo+IC0Jc2V0X3RlbXA4LCBMT0NBTF9ISUdIKTsKPiAtc3RhdGljIFNF
-TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVt
-cDExLAo+IC0Jc2V0X3RlbXAxMSwgMSwgUkVNT1RFX0hJR0gpOwo+IC1zdGF0aWMgU0VOU09SX0RF
-VklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAo+IC0J
-c2V0X3RlbXA4LCBMT0NBTF9DUklUKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1w
-Ml9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgUkVN
-T1RFX0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwg
-U19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCj4gLQlzZXRfdGVtcGh5c3QsIExPQ0FM
-X0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19J
-UlVHTywgc2hvd190ZW1waHlzdCwgTlVMTCwKPiAtCVJFTU9URV9DUklUKTsKPiAtc3RhdGljIFNF
-TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX29mZnNldCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3df
-dGVtcDExLAo+IC0Jc2V0X3RlbXAxMSwgMiwgUkVNT1RFX09GRlNFVCk7Cj4gK3N0YXRpYyBTRU5T
-T1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3df
-dGVtcDExLCBOVUxMLCBMT0NBTF9URU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wMl9pbnB1dCwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wMTEsIE5VTEwsIFJF
-TU9URV9URU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdV
-U1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXA4LCBsbTkwX3N5c2ZzX3NldF90
-ZW1wOCwgTE9DQUxfTE9XKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9taW4s
-IFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgbG05MF9zeXNm
-c19zZXRfdGVtcDExLCBSRU1PVEVfTE9XKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXA4LCBs
-bTkwX3N5c2ZzX3NldF90ZW1wOCwgTE9DQUxfSElHSCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNF
-X0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190
-ZW1wMTEsIGxtOTBfc3lzZnNfc2V0X3RlbXAxMSwgUkVNT1RFX0hJR0gpOwo+ICtzdGF0aWMgU0VO
-U09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9z
-eXNmc19zaG93X3RlbXA4LCBsbTkwX3N5c2ZzX3NldF90ZW1wOCwgTE9DQUxfQ1JJVCk7Cj4gK3N0
-YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sCj4g
-KwlsbTkwX3N5c2ZzX3Nob3dfdGVtcDgsIGxtOTBfc3lzZnNfc2V0X3RlbXA4LCBSRU1PVEVfQ1JJ
-VCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNS
-IHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1waHlzdCwgbG05MF9zeXNmc19zZXRf
-dGVtcGh5c3QsIExPQ0FMX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAy
-X2NyaXRfaHlzdCwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1waHlzdCwgTlVMTCwg
-UkVNT1RFX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX29mZnNldCwg
-U19JV1VTUiB8IFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfdGVtcDExLCBsbTkwX3N5c2Zz
-X3NldF90ZW1wMTEsIFJFTU9URV9PRkZTRVQpOwo+Cj4gICAvKiBJbmRpdmlkdWFsIGFsYXJtIGZp
-bGVzICovCj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19J
-UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo
-dGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7Cj4gLXN0YXRp
-YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5V
-TEwsIDIpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbl9hbGFybSwgU19J
-UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo
-dGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKPiAtc3RhdGlj
-IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0s
-IE5VTEwsIDUpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwg
-U19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FU
-VFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwg
-TlVMTCwgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwg
-U19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMSk7Cj4gK3N0YXRpYyBT
-RU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3No
-b3dfYWxhcm0sIE5VTEwsIDIpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21p
-bl9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMyk7Cj4g
-K3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLAo+ICsJ
-bG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCA0KTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0Vf
-QVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfYWxhcm0s
-IE5VTEwsIDUpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwg
-U19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgNik7Cj4gICAvKiBSYXcg
-YWxhcm0gZmlsZSBmb3IgY29tcGF0aWJpbGl0eSAqLwo+IC1zdGF0aWMgREVWSUNFX0FUVFIoYWxh
-cm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7Cj4gK3N0YXRpYyBERVZJQ0VfQVRUUihh
-bGFybXMsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfYWxhcm1zLCBOVUxMKTsKPgo+IC1z
-dGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hv
-d191cGRhdGVfaW50ZXJ2YWwsCj4gLQkJICAgc2V0X3VwZGF0ZV9pbnRlcnZhbCk7Cj4gK3N0YXRp
-YyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAo+ICsJbG05
-MF9zeXNmc19zaG93X3VwZGF0ZV9pbnRlcnZhbCwgbG05MF9zeXNmc19zZXRfdXBkYXRlX2ludGVy
-dmFsKTsKPgo+ICAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfYXR0cmlidXRlc1tdID0g
-ewo+ICAgCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKPiBAQCAt
-MTA3MSwxNCArMTE1MSwxNCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBs
-bTkwX3RlbXAyX29mZnNldF9ncm91cCA9IHsKPiAgIC8qCj4gICAgKiBBZGRpdGlvbmFsIGF0dHJp
-YnV0ZXMgZm9yIGRldmljZXMgd2l0aCBlbWVyZ2VuY3kgc2Vuc29ycwo+ICAgICovCj4gLXN0YXRp
-YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5LCBTX0lXVVNSIHwgU19JUlVHTywg
-c2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgTE9DQUxfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09S
-X0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVt
-cDgsCj4gLQlzZXRfdGVtcDgsIFJFTU9URV9FTUVSRyk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNF
-X0FUVFIodGVtcDFfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCj4gLQkJ
-CSAgTlVMTCwgTE9DQUxfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAy
-X2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LAo+IC0JCQkgIE5VTEwsIFJF
-TU9URV9FTUVSRyk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5
-LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wOCwgbG05MF9zeXNm
-c19zZXRfdGVtcDgsIExPQ0FMX0VNRVJHKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wMl9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3Rl
-bXA4LCBsbTkwX3N5c2ZzX3NldF90ZW1wOCwgUkVNT1RFX0VNRVJHKTsKPiArc3RhdGljIFNFTlNP
-Ul9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywKPiArCWxtOTBfc3lz
-ZnNfc2hvd190ZW1waHlzdCwgTlVMTCwgTE9DQUxfRU1FUkcpOwo+ICtzdGF0aWMgU0VOU09SX0RF
-VklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19z
-aG93X3RlbXBoeXN0LCBOVUxMLCBSRU1PVEVfRU1FUkcpOwo+Cj4gICBzdGF0aWMgc3RydWN0IGF0
-dHJpYnV0ZSAqbG05MF9lbWVyZ2VuY3lfYXR0cmlidXRlc1tdID0gewo+ICAgCSZzZW5zb3JfZGV2
-X2F0dHJfdGVtcDFfZW1lcmdlbmN5LmRldl9hdHRyLmF0dHIsCj4gQEAgLTEwOTIsOCArMTE3Miwx
-MCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTkwX2VtZXJnZW5jeV9n
-cm91cCA9IHsKPiAgIAkuYXR0cnMgPSBsbTkwX2VtZXJnZW5jeV9hdHRyaWJ1dGVzLAo+ICAgfTsK
-Pgo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2VtZXJnZW5jeV9hbGFybSwgU19J
-UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTUpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS
-KHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTMpOwo+
-ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2VtZXJnZW5jeV9hbGFybSwgU19JUlVH
-TywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMTUpOwo+ICtzdGF0aWMgU0VOU09S
-X0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lz
-ZnNfc2hvd19hbGFybSwgTlVMTCwgMTMpOwo+Cj4gICBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAq
-bG05MF9lbWVyZ2VuY3lfYWxhcm1fYXR0cmlidXRlc1tdID0gewo+ICAgCSZzZW5zb3JfZGV2X2F0
-dHJfdGVtcDFfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCj4gQEAgLTExMDgsMjYgKzEx
-OTAsMzEgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF9lbWVyZ2Vu
-Y3lfYWxhcm1fZ3JvdXAgPSB7Cj4gICAvKgo+ICAgICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZv
-ciBkZXZpY2VzIHdpdGggMyB0ZW1wZXJhdHVyZSBzZW5zb3JzCj4gICAgKi8KPiAtc3RhdGljIFNF
-TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwgTlVM
-TCwKPiAtCTAsIFJFTU9URTJfVEVNUCk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0
-ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxMSwKPiAtCXNldF90ZW1wMTEs
-IDMsIFJFTU9URTJfTE9XKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX21h
-eCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAo+IC0Jc2V0X3RlbXAxMSwgNCwgUkVN
-T1RFMl9ISUdIKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19jcml0LCBTX0lX
-VVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgUkVNT1RFMl9DUklUKTsK
-PiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19jcml0X2h5c3QsIFNfSVJVR08sIHNo
-b3dfdGVtcGh5c3QsIE5VTEwsCj4gLQlSRU1PVEUyX0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RF
-VklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgs
-Cj4gLQlzZXRfdGVtcDgsIFJFTU9URTJfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9B
-VFRSKHRlbXAzX2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LAo+IC0JCQkg
-IE5VTEwsIFJFTU9URTJfRU1FUkcpOwo+IC0KPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wM19jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA5KTsKPiAtc3RhdGlj
-IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVM
-TCwgMTApOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbl9hbGFybSwgU19J
-UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS
-KHRlbXAzX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTIpOwo+IC1zdGF0
-aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hv
-d19hbGFybSwgTlVMTCwgMTQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lu
-cHV0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgTlVMTCwgUkVNT1RFMl9U
-RU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVdVU1IgfCBT
-X0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgbG05MF9zeXNmc19zZXRfdGVtcDEx
-LCBSRU1PVEUyX0xPVyk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBT
-X0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wMTEsIGxtOTBfc3lzZnNf
-c2V0X3RlbXAxMSwgUkVNT1RFMl9ISUdIKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0
-ZW1wM19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wOCwg
-bG05MF9zeXNmc19zZXRfdGVtcDgsIFJFTU9URTJfQ1JJVCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVW
-SUNFX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3Rl
-bXBoeXN0LCBOVUxMLCBSRU1PVEUyX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS
-KHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3df
-dGVtcDgsIGxtOTBfc3lzZnNfc2V0X3RlbXA4LCBSRU1PVEUyX0VNRVJHKTsKPiArc3RhdGljIFNF
-TlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywKPiArCWxtOTBf
-c3lzZnNfc2hvd190ZW1waHlzdCwgTlVMTCwgUkVNT1RFMl9FTUVSRyk7Cj4gKwo+ICtzdGF0aWMg
-U0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXRfYWxhcm0sIFNfSVJVR08sCj4gKwlsbTkwX3N5
-c2ZzX3Nob3dfYWxhcm0sIE5VTEwsIDkpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRl
-bXAzX2ZhdWx0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxMCk7
-Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWluX2FsYXJtLCBTX0lSVUdPLAo+
-ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxMSk7Cj4gK3N0YXRpYyBTRU5TT1JfREVW
-SUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2Fs
-YXJtLCBOVUxMLCAxMik7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdl
-bmN5X2FsYXJtLCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxNCk7
-Cj4KPiAgIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX3RlbXAzX2F0dHJpYnV0ZXNbXSA9
-IHsKPiAgIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCj4gQEAg
-LTExNTEsMTUgKzEyMzgsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAg
-bG05MF90ZW1wM19ncm91cCA9IHsKPiAgIH07Cj4KPiAgIC8qIHBlYyB1c2VkIGZvciBBRE0xMDMy
-IG9ubHkgKi8KPiAtc3RhdGljIHNzaXplX3Qgc2hvd19wZWMoc3RydWN0IGRldmljZSAqZGV2LCBz
-dHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCj4gLQkJCWNoYXIgKmJ1ZikKPiArc3RhdGlj
-IHNzaXplX3QgbG05MF9zeXNmc19zaG93X3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJc3Ry
-dWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LCBjaGFyICpidWYpCj4gICB7Cj4gICAJc3RydWN0
-IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKPiAgIAlyZXR1cm4gc3By
-aW50ZihidWYsICIlZFxuIiwgISEoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfUEVDKSk7Cj4g
-ICB9Cj4KPiAtc3RhdGljIHNzaXplX3Qgc2V0X3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj
-dCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKPiAtCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBz
-aXplX3QgY291bnQpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNfc2V0X3BlYyhzdHJ1Y3Qg
-ZGV2aWNlICpkZXYsCj4gKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LCBjb25zdCBj
-aGFyICpidWYsIHNpemVfdCBjb3VudCkKPiAgIHsKPiAgIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xp
-ZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwo+ICAgCWxvbmcgdmFsOwo+IEBAIC0xMTgzLDcgKzEy
-NzAsOCBAQCBzdGF0aWMgc3NpemVfdCBzZXRfcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0
-IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+ICAgCXJldHVybiBjb3VudDsKPiAgIH0KPgo+IC1z
-dGF0aWMgREVWSUNFX0FUVFIocGVjLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wZWMsIHNldF9w
-ZWMpOwo+ICtzdGF0aWMgREVWSUNFX0FUVFIocGVjLCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxt
-OTBfc3lzZnNfc2hvd19wZWMsIGxtOTBfc3lzZnNfc2V0X3BlYyk7Cj4KPiAgIC8qCj4gICAgKiBS
-ZWFsIGNvZGUKPiBAQCAtMTQxMyw4ICsxNTAxLDkgQEAgc3RhdGljIHZvaWQgbG05MF9yZXN0b3Jl
-X2NvbmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxtOTBfZGF0YSAqZGF0YSkK
-PiAgIAkJCQkgIGRhdGEtPmNvbmZpZ19vcmlnKTsKPiAgIH0KPgo+IC1zdGF0aWMgdm9pZCBsbTkw
-X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEg
-KmRhdGEpCj4gK3N0YXRpYyB2b2lkIGxtOTBfaW5pdF9jbGllbnQoc3RydWN0IGxtOTBfZGF0YSAq
-ZGF0YSkKPiAgIHsKPiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7
-Cj4gICAJdTggY29uZmlnLCBjb252cmF0ZTsKPgo+ICAgCWlmIChsbTkwX3JlYWRfcmVnKGNsaWVu
-dCwgTE05MF9SRUdfUl9DT05WUkFURSwgJmNvbnZyYXRlKSA8IDApIHsKPiBAQCAtMTQyNiw3ICsx
-NTE1LDcgQEAgc3RhdGljIHZvaWQgbG05MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAq
-Y2xpZW50LCBzdHJ1Y3QgbG05MF9kYXRhICpkYXRhKQo+ICAgCS8qCj4gICAJICogU3RhcnQgdGhl
-IGNvbnZlcnNpb25zLgo+ICAgCSAqLwo+IC0JbG05MF9zZXRfY29udnJhdGUoY2xpZW50LCBkYXRh
-LCA1MDApOwkvKiA1MDBtczsgMkh6IGNvbnZlcnNpb24gcmF0ZSAqLwo+ICsJbG05MF9zZXRfY29u
-dnJhdGVfbG9ja2VkKGRhdGEsIDUwMCk7ICAvKiA1MDBtcyAvIDJIeiAgKi8KPiAgIAlpZiAobG05
-MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMSwgJmNvbmZpZykgPCAwKSB7Cj4g
-ICAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwo+
-ICAgCQlyZXR1cm47Cj4gQEAgLTE1NTcsNyArMTY0Niw3IEBAIHN0YXRpYyBpbnQgbG05MF9wcm9i
-ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+ICAgCWRhdGEtPm1heF9jb252cmF0ZSA9IGxt
-OTBfcGFyYW1zW2RhdGEtPmtpbmRdLm1heF9jb252cmF0ZTsKPgo+ICAgCS8qIEluaXRpYWxpemUg
-dGhlIExNOTAgY2hpcCAqLwo+IC0JbG05MF9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwo+ICsJ
-bG05MF9pbml0X2NsaWVudChkYXRhKTsKPgo+ICAgCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICov
-Cj4gICAJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX2dyb3VwOwo+CgoKX19fX19fX19f
-X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5n
-IGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5v
-cmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz
+On 01/21/2016 11:34 AM, Stéphan Kochen wrote:
+> Add additional support functions `lm90_get_*` and `lm90_set_*` extracted
+> from the sysfs routines. The sysfs routines are now just stubs wrapping
+> the new support functions.
+>
+> This way we have a consistent register access interface, which can be
+> used from other integrations down the line. To avoid confusion, all
+> sysfs methods are now prefixed `lm90_sysfs_*`.
+>
+> To accomplish this, the `lm90_update_device` signature has changed and
+> is now `lm90_update`, taking data directly. It no longer serves the
+> dual purpose of update function *and* driver data getter.
+>
+> `lm90_set_convrate`, `lm90_select_remote_channel` and `lm90_init_client`
+> also had redundant i2c client parameters, which have been removed.
+>
+> Signed-off-by: Stéphan Kochen <stephan-j6uo2F6POYhmR6Xm/wNWPw@public.gmane.org>
+> ---
+>   drivers/hwmon/lm90.c | 511 ++++++++++++++++++++++++++++++---------------------
+>   1 file changed, 300 insertions(+), 211 deletions(-)
+>
+> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c
+> index c9ff08d..88daf72 100644
+> --- a/drivers/hwmon/lm90.c
+> +++ b/drivers/hwmon/lm90.c
+> @@ -473,10 +473,10 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl, u16 *value)
+>    * various registers have different meanings as a result of selecting a
+>    * non-default remote channel.
+>    */
+> -static inline void lm90_select_remote_channel(struct i2c_client *client,
+> -					      struct lm90_data *data,
+> -					      int channel)
+> +static inline void lm90_select_remote_channel(
+> +		struct lm90_data *data, int channel)
+
+Very much personal preference here, unrelated change, and violates coding style.
+
+Please only one logical change per patch. If you think it is worthwhile to remove
+the client argument, prepare a separate patch with only that change, and show
+that it reduces code size. Also please make sure that your patch follows
+coding style.
+
+>   {
+> +	struct i2c_client *client = data->client;
+>   	u8 config;
+>
+>   	if (data->kind == max6696) {
+> @@ -490,32 +490,10 @@ static inline void lm90_select_remote_channel(struct i2c_client *client,
+>   }
+>
+>   /*
+> - * Set conversion rate.
+> - * client->update_lock must be held when calling this function (unless we are
+> - * in detection or initialization steps).
+> + * Update all current register values
+>    */
+> -static void lm90_set_convrate(struct i2c_client *client, struct lm90_data *data,
+> -			      unsigned int interval)
+> -{
+> -	int i;
+> -	unsigned int update_interval;
+> -
+> -	/* Shift calculations to avoid rounding errors */
+> -	interval <<= 6;
+> -
+> -	/* find the nearest update rate */
+> -	for (i = 0, update_interval = LM90_MAX_CONVRATE_MS << 6;
+> -	     i < data->max_convrate; i++, update_interval >>= 1)
+> -		if (interval >= update_interval * 3 / 4)
+> -			break;
+> -
+> -	i2c_smbus_write_byte_data(client, LM90_REG_W_CONVRATE, i);
+> -	data->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);
+> -}
+> -
+> -static struct lm90_data *lm90_update_device(struct device *dev)
+> +static void lm90_update(struct lm90_data *data)
+>   {
+> -	struct lm90_data *data = dev_get_drvdata(dev);
+>   	struct i2c_client *client = data->client;
+>   	unsigned long next_update;
+>
+> @@ -583,7 +561,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)
+>   		data->alarms = alarms;	/* save as 16 bit value */
+>
+>   		if (data->kind == max6696) {
+> -			lm90_select_remote_channel(client, data, 1);
+> +			lm90_select_remote_channel(data, 1);
+>   			lm90_read_reg(client, LM90_REG_R_REMOTE_CRIT,
+>   				      &data->temp8[REMOTE2_CRIT]);
+>   			lm90_read_reg(client, MAX6659_REG_R_REMOTE_EMERG,
+> @@ -595,7 +573,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)
+>   				data->temp11[REMOTE2_LOW] = h << 8;
+>   			if (!lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h))
+>   				data->temp11[REMOTE2_HIGH] = h << 8;
+> -			lm90_select_remote_channel(client, data, 0);
+> +			lm90_select_remote_channel(data, 0);
+>
+>   			if (!lm90_read_reg(client, MAX6696_REG_R_STATUS2,
+>   					   &alarms))
+> @@ -624,8 +602,6 @@ static struct lm90_data *lm90_update_device(struct device *dev)
+>   	}
+>
+>   	mutex_unlock(&data->update_lock);
+> -
+> -	return data;
+>   }
+>
+>   /*
+> @@ -756,32 +732,31 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)
+>   }
+>
+>   /*
+> - * Sysfs stuff
+> + * Register accessors. Getters trigger an update. Setters have locked variants
+> + * that require update_lock to be held.
+>    */
+>
+> -static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,
+> -			  char *buf)
+> +static int lm90_get_temp8(struct lm90_data *data, int index)
+>   {
+> -	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> -	struct lm90_data *data = lm90_update_device(dev);
+>   	int temp;
+>
+> +	lm90_update(data);
+> +
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+> -		temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
+> +		temp = temp_from_u8_adt7461(data, data->temp8[index]);
+>   	else if (data->kind == max6646)
+> -		temp = temp_from_u8(data->temp8[attr->index]);
+> +		temp = temp_from_u8(data->temp8[index]);
+>   	else
+> -		temp = temp_from_s8(data->temp8[attr->index]);
+> +		temp = temp_from_s8(data->temp8[index]);
+>
+>   	/* +16 degrees offset for temp2 for the LM99 */
+> -	if (data->kind == lm99 && attr->index == 3)
+> +	if (data->kind == lm99 && index == 3)
+>   		temp += 16000;
+>
+> -	return sprintf(buf, "%d\n", temp);
+> +	return temp;
+>   }
+>
+> -static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
+> -			 const char *buf, size_t count)
+> +static void lm90_set_temp8_locked(struct lm90_data *data, int index, long val)
+>   {
+>   	static const u8 reg[TEMP8_REG_NUM] = {
+>   		LM90_REG_W_LOCAL_LOW,
+> @@ -794,90 +769,73 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,
+>   		MAX6659_REG_W_REMOTE_EMERG,
+>   	};
+>
+> -	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> -	struct lm90_data *data = dev_get_drvdata(dev);
+> -	struct i2c_client *client = data->client;
+> -	int nr = attr->index;
+> -	long val;
+> -	int err;
+> -
+> -	err = kstrtol(buf, 10, &val);
+> -	if (err < 0)
+> -		return err;
+> -
+>   	/* +16 degrees offset for temp2 for the LM99 */
+> -	if (data->kind == lm99 && attr->index == 3)
+> +	if (data->kind == lm99 && index == 3)
+>   		val -= 16000;
+>
+> -	mutex_lock(&data->update_lock);
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+> -		data->temp8[nr] = temp_to_u8_adt7461(data, val);
+> +		data->temp8[index] = temp_to_u8_adt7461(data, val);
+>   	else if (data->kind == max6646)
+> -		data->temp8[nr] = temp_to_u8(val);
+> +		data->temp8[index] = temp_to_u8(val);
+>   	else
+> -		data->temp8[nr] = temp_to_s8(val);
+> +		data->temp8[index] = temp_to_s8(val);
+>
+> -	lm90_select_remote_channel(client, data, nr >= 6);
+> -	i2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);
+> -	lm90_select_remote_channel(client, data, 0);
+> +	lm90_select_remote_channel(data, index >= 6);
+> +	i2c_smbus_write_byte_data(data->client, reg[index], data->temp8[index]);
+> +	lm90_select_remote_channel(data, 0);
+> +}
+>
+> +static void lm90_set_temp8(struct lm90_data *data, int index, long val)
+> +{
+> +	mutex_lock(&data->update_lock);
+> +	lm90_set_temp8_locked(data, index, val);
+>   	mutex_unlock(&data->update_lock);
+> -	return count;
+>   }
+>
+> -static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,
+> -			   char *buf)
+> +static int lm90_get_temp11(struct lm90_data *data, int index)
+>   {
+> -	struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
+> -	struct lm90_data *data = lm90_update_device(dev);
+>   	int temp;
+>
+> +	lm90_update(data);
+> +
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+> -		temp = temp_from_u16_adt7461(data, data->temp11[attr->index]);
+> +		temp = temp_from_u16_adt7461(data, data->temp11[index]);
+>   	else if (data->kind == max6646)
+> -		temp = temp_from_u16(data->temp11[attr->index]);
+> +		temp = temp_from_u16(data->temp11[index]);
+>   	else
+> -		temp = temp_from_s16(data->temp11[attr->index]);
+> +		temp = temp_from_s16(data->temp11[index]);
+>
+>   	/* +16 degrees offset for temp2 for the LM99 */
+> -	if (data->kind == lm99 &&  attr->index <= 2)
+> +	if (data->kind == lm99 && index <= 2)
+>   		temp += 16000;
+>
+> -	return sprintf(buf, "%d\n", temp);
+> +	return temp;
+>   }
+>
+> -static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
+> -			  const char *buf, size_t count)
+> +static void lm90_set_temp11_locked(struct lm90_data *data, int index, long val)
+>   {
+> -	struct {
+> -		u8 high;
+> -		u8 low;
+> -		int channel;
+> -	} reg[5] = {
+> -		{ LM90_REG_W_REMOTE_LOWH, LM90_REG_W_REMOTE_LOWL, 0 },
+> -		{ LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 0 },
+> -		{ LM90_REG_W_REMOTE_OFFSH, LM90_REG_W_REMOTE_OFFSL, 0 },
+> -		{ LM90_REG_W_REMOTE_LOWH, LM90_REG_W_REMOTE_LOWL, 1 },
+> -		{ LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 1 }
+> -	};
+
+Another set of personal preference changes.
+
+> -
+> -	struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
+> -	struct lm90_data *data = dev_get_drvdata(dev);
+>   	struct i2c_client *client = data->client;
+> -	int nr = attr->nr;
+> -	int index = attr->index;
+> -	long val;
+> -	int err;
+> +	u8 high, low, channel;
+>
+> -	err = kstrtol(buf, 10, &val);
+> -	if (err < 0)
+> -		return err;
+> +#define SELECT_REGS(_reg, _channel) { \
+> +	high = LM90_REG_W_##_reg##H; \
+> +	low = LM90_REG_W_##_reg##L; \
+> +	channel = _channel; \
+> +}
+
+We have been trying to get rid of function defines such as this one.
+Most of the time it increases code size, and reduces readability.
+Plus, it increases the amount of time we have to spend reviewing
+the code to ensure it is correct.
+
+> +	switch (index) {
+> +	case REMOTE_LOW:    SELECT_REGS(REMOTE_LOW,  0); break;
+> +	case REMOTE_HIGH:   SELECT_REGS(REMOTE_HIGH, 0); break;
+> +	case REMOTE_OFFSET: SELECT_REGS(REMOTE_OFFS, 0); break;
+> +	case REMOTE2_LOW:   SELECT_REGS(REMOTE_LOW,  1); break;
+> +	case REMOTE2_HIGH:  SELECT_REGS(REMOTE_HIGH, 1); break;
+> +	default: return;
+
+... and, in this case, introduces checkpatch errors.
+
+This patch is clearly more than what its headline says. It is
+too complex to review as single patch. Please split into
+logical changes, and explain why you make those changes.
+
+Thanks,
+Guenter
+
+
+> +	}
+> +#undef SELECT_REGS
+>
+>   	/* +16 degrees offset for temp2 for the LM99 */
+>   	if (data->kind == lm99 && index <= 2)
+>   		val -= 16000;
+>
+> -	mutex_lock(&data->update_lock);
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+>   		data->temp11[index] = temp_to_u16_adt7461(data, val);
+>   	else if (data->kind == max6646)
+> @@ -887,54 +845,46 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,
+>   	else
+>   		data->temp11[index] = temp_to_s8(val) << 8;
+>
+> -	lm90_select_remote_channel(client, data, reg[nr].channel);
+> -	i2c_smbus_write_byte_data(client, reg[nr].high,
+> -				  data->temp11[index] >> 8);
+> +	lm90_select_remote_channel(data, channel);
+> +	i2c_smbus_write_byte_data(client, high,
+> +			data->temp11[index] >> 8);
+>   	if (data->flags & LM90_HAVE_REM_LIMIT_EXT)
+> -		i2c_smbus_write_byte_data(client, reg[nr].low,
+> -					  data->temp11[index] & 0xff);
+> -	lm90_select_remote_channel(client, data, 0);
+> +		i2c_smbus_write_byte_data(client, low,
+> +				data->temp11[index] & 0xff);
+> +	lm90_select_remote_channel(data, 0);
+> +}
+>
+> +static void lm90_set_temp11(struct lm90_data *data, int index, long val)
+> +{
+> +	mutex_lock(&data->update_lock);
+> +	lm90_set_temp11_locked(data, index, val);
+>   	mutex_unlock(&data->update_lock);
+> -	return count;
+>   }
+>
+> -static ssize_t show_temphyst(struct device *dev,
+> -			     struct device_attribute *devattr,
+> -			     char *buf)
+> +static ssize_t lm90_get_temphyst(struct lm90_data *data, int index)
+>   {
+> -	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> -	struct lm90_data *data = lm90_update_device(dev);
+>   	int temp;
+>
+> +	lm90_update(data);
+> +
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+> -		temp = temp_from_u8_adt7461(data, data->temp8[attr->index]);
+> +		temp = temp_from_u8_adt7461(data, data->temp8[index]);
+>   	else if (data->kind == max6646)
+> -		temp = temp_from_u8(data->temp8[attr->index]);
+> +		temp = temp_from_u8(data->temp8[index]);
+>   	else
+> -		temp = temp_from_s8(data->temp8[attr->index]);
+> +		temp = temp_from_s8(data->temp8[index]);
+>
+>   	/* +16 degrees offset for temp2 for the LM99 */
+> -	if (data->kind == lm99 && attr->index == 3)
+> +	if (data->kind == lm99 && index == 3)
+>   		temp += 16000;
+>
+> -	return sprintf(buf, "%d\n", temp - temp_from_s8(data->temp_hyst));
+> +	return temp - temp_from_s8(data->temp_hyst);
+>   }
+>
+> -static ssize_t set_temphyst(struct device *dev, struct device_attribute *dummy,
+> -			    const char *buf, size_t count)
+> +static void lm90_set_temphyst_locked(struct lm90_data *data, long val)
+>   {
+> -	struct lm90_data *data = dev_get_drvdata(dev);
+> -	struct i2c_client *client = data->client;
+> -	long val;
+> -	int err;
+>   	int temp;
+>
+> -	err = kstrtol(buf, 10, &val);
+> -	if (err < 0)
+> -		return err;
+> -
+> -	mutex_lock(&data->update_lock);
+>   	if (data->kind == adt7461 || data->kind == tmp451)
+>   		temp = temp_from_u8_adt7461(data, data->temp8[LOCAL_CRIT]);
+>   	else if (data->kind == max6646)
+> @@ -943,43 +893,167 @@ static ssize_t set_temphyst(struct device *dev, struct device_attribute *dummy,
+>   		temp = temp_from_s8(data->temp8[LOCAL_CRIT]);
+>
+>   	data->temp_hyst = hyst_to_reg(temp - val);
+> -	i2c_smbus_write_byte_data(client, LM90_REG_W_TCRIT_HYST,
+> -				  data->temp_hyst);
+> +	i2c_smbus_write_byte_data(data->client, LM90_REG_W_TCRIT_HYST,
+> +			data->temp_hyst);
+> +}
+> +
+> +static void lm90_set_temphyst(struct lm90_data *data, long val)
+> +{
+> +	mutex_lock(&data->update_lock);
+> +	lm90_set_temphyst_locked(data, val);
+> +	mutex_unlock(&data->update_lock);
+> +}
+> +
+> +static void lm90_set_convrate_locked(struct lm90_data *data, unsigned int val)
+> +{
+> +	int i;
+> +	unsigned int update_interval;
+> +
+> +	/* Shift calculations to avoid rounding errors */
+> +	val <<= 6;
+> +
+> +	/* find the nearest update rate */
+> +	for (i = 0, update_interval = LM90_MAX_CONVRATE_MS << 6;
+> +	     i < data->max_convrate; i++, update_interval >>= 1)
+> +		if (val >= update_interval * 3 / 4)
+> +			break;
+> +
+> +	i2c_smbus_write_byte_data(data->client, LM90_REG_W_CONVRATE, i);
+> +	data->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);
+> +}
+> +
+> +static void lm90_set_convrate(struct lm90_data *data, unsigned int val)
+> +{
+> +	mutex_lock(&data->update_lock);
+> +	lm90_set_convrate_locked(data, val);
+>   	mutex_unlock(&data->update_lock);
+> +}
+> +
+> +/*
+> + * Sysfs stuff
+> + */
+> +
+> +static ssize_t lm90_sysfs_show_temp8(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		char *buf)
+> +{
+> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +
+> +	return sprintf(buf, "%d\n", lm90_get_temp8(data, attr->index));
+> +}
+> +
+> +static ssize_t lm90_sysfs_set_temp8(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		const char *buf, size_t count)
+> +{
+> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +	long val;
+> +	int err;
+> +
+> +	err = kstrtol(buf, 10, &val);
+> +	if (err < 0)
+> +		return err;
+> +
+> +	lm90_set_temp8(data, attr->index, val);
+> +
+>   	return count;
+>   }
+>
+> -static ssize_t show_alarms(struct device *dev, struct device_attribute *dummy,
+> -			   char *buf)
+> +static ssize_t lm90_sysfs_show_temp11(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		char *buf)
+> +{
+> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +
+> +	return sprintf(buf, "%d\n", lm90_get_temp11(data, attr->index));
+> +}
+> +
+> +static ssize_t lm90_sysfs_set_temp11(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		const char *buf, size_t count)
+>   {
+> -	struct lm90_data *data = lm90_update_device(dev);
+> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +	long val;
+> +	int err;
+> +
+> +	err = kstrtol(buf, 10, &val);
+> +	if (err < 0)
+> +		return err;
+> +
+> +	lm90_set_temp11(data, attr->index, val);
+> +
+> +	return count;
+> +}
+> +
+> +static ssize_t lm90_sysfs_show_temphyst(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		char *buf)
+> +{
+> +	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +
+> +	return sprintf(buf, "%d\n", lm90_get_temphyst(data, attr->index));
+> +}
+> +
+> +static ssize_t lm90_sysfs_set_temphyst(
+> +		struct device *dev, struct device_attribute *dummy,
+> +		const char *buf, size_t count)
+> +{
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +	long val;
+> +	int err;
+> +
+> +	err = kstrtol(buf, 10, &val);
+> +	if (err < 0)
+> +		return err;
+> +
+> +	lm90_set_temphyst(data, val);
+> +
+> +	return count;
+> +}
+> +
+> +static ssize_t lm90_sysfs_show_alarms(
+> +		struct device *dev, struct device_attribute *dummy,
+> +		char *buf)
+> +{
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+> +
+> +	lm90_update(data);
+> +
+>   	return sprintf(buf, "%d\n", data->alarms);
+>   }
+>
+> -static ssize_t show_alarm(struct device *dev, struct device_attribute
+> -			  *devattr, char *buf)
+> +static ssize_t lm90_sysfs_show_alarm(
+> +		struct device *dev, struct device_attribute *devattr,
+> +		char *buf)
+>   {
+>   	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
+> -	struct lm90_data *data = lm90_update_device(dev);
+> +	struct lm90_data *data = dev_get_drvdata(dev);
+>   	int bitnr = attr->index;
+>
+> +	lm90_update(data);
+> +
+>   	return sprintf(buf, "%d\n", (data->alarms >> bitnr) & 1);
+>   }
+>
+> -static ssize_t show_update_interval(struct device *dev,
+> -				    struct device_attribute *attr, char *buf)
+> +static ssize_t lm90_sysfs_show_update_interval(
+> +		struct device *dev, struct device_attribute *attr,
+> +		char *buf)
+>   {
+>   	struct lm90_data *data = dev_get_drvdata(dev);
+>
+>   	return sprintf(buf, "%u\n", data->update_interval);
+>   }
+>
+> -static ssize_t set_update_interval(struct device *dev,
+> -				   struct device_attribute *attr,
+> -				   const char *buf, size_t count)
+> +static ssize_t lm90_sysfs_set_update_interval(
+> +		struct device *dev, struct device_attribute *attr,
+> +		const char *buf, size_t count)
+>   {
+>   	struct lm90_data *data = dev_get_drvdata(dev);
+> -	struct i2c_client *client = data->client;
+>   	unsigned long val;
+>   	int err;
+>
+> @@ -987,49 +1061,55 @@ static ssize_t set_update_interval(struct device *dev,
+>   	if (err)
+>   		return err;
+>
+> -	mutex_lock(&data->update_lock);
+> -	lm90_set_convrate(client, data, clamp_val(val, 0, 100000));
+> -	mutex_unlock(&data->update_lock);
+> +	lm90_set_convrate(data, clamp_val(val, 0, 100000));
+>
+>   	return count;
+>   }
+>
+> -static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp11, NULL,
+> -	0, LOCAL_TEMP);
+> -static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp11, NULL,
+> -	0, REMOTE_TEMP);
+> -static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, LOCAL_LOW);
+> -static SENSOR_DEVICE_ATTR_2(temp2_min, S_IWUSR | S_IRUGO, show_temp11,
+> -	set_temp11, 0, REMOTE_LOW);
+> -static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, LOCAL_HIGH);
+> -static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp11,
+> -	set_temp11, 1, REMOTE_HIGH);
+> -static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, LOCAL_CRIT);
+> -static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, REMOTE_CRIT);
+> -static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temphyst,
+> -	set_temphyst, LOCAL_CRIT);
+> -static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temphyst, NULL,
+> -	REMOTE_CRIT);
+> -static SENSOR_DEVICE_ATTR_2(temp2_offset, S_IWUSR | S_IRUGO, show_temp11,
+> -	set_temp11, 2, REMOTE_OFFSET);
+> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,
+> +	lm90_sysfs_show_temp11, NULL, LOCAL_TEMP);
+> +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,
+> +	lm90_sysfs_show_temp11, NULL, REMOTE_TEMP);
+> +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_LOW);
+> +static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_LOW);
+> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_HIGH);
+> +static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_HIGH);
+> +static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temphyst, lm90_sysfs_set_temphyst, LOCAL_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO,
+> +	lm90_sysfs_show_temphyst, NULL, REMOTE_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp2_offset, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_OFFSET);
+>
+>   /* Individual alarm files */
+> -static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0);
+> -static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO, show_alarm, NULL, 1);
+> -static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);
+> -static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3);
+> -static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);
+> -static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 5);
+> -static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6);
+> +static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 0);
+> +static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 1);
+> +static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 2);
+> +static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 3);
+> +static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 4);
+> +static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 5);
+> +static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 6);
+>   /* Raw alarm file for compatibility */
+> -static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);
+> +static DEVICE_ATTR(alarms, S_IRUGO,
+> +	lm90_sysfs_show_alarms, NULL);
+>
+> -static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval,
+> -		   set_update_interval);
+> +static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR,
+> +	lm90_sysfs_show_update_interval, lm90_sysfs_set_update_interval);
+>
+>   static struct attribute *lm90_attributes[] = {
+>   	&sensor_dev_attr_temp1_input.dev_attr.attr,
+> @@ -1071,14 +1151,14 @@ static const struct attribute_group lm90_temp2_offset_group = {
+>   /*
+>    * Additional attributes for devices with emergency sensors
+>    */
+> -static SENSOR_DEVICE_ATTR(temp1_emergency, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, LOCAL_EMERG);
+> -static SENSOR_DEVICE_ATTR(temp2_emergency, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, REMOTE_EMERG);
+> -static SENSOR_DEVICE_ATTR(temp1_emergency_hyst, S_IRUGO, show_temphyst,
+> -			  NULL, LOCAL_EMERG);
+> -static SENSOR_DEVICE_ATTR(temp2_emergency_hyst, S_IRUGO, show_temphyst,
+> -			  NULL, REMOTE_EMERG);
+> +static SENSOR_DEVICE_ATTR(temp1_emergency, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_EMERG);
+> +static SENSOR_DEVICE_ATTR(temp2_emergency, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE_EMERG);
+> +static SENSOR_DEVICE_ATTR(temp1_emergency_hyst, S_IRUGO,
+> +	lm90_sysfs_show_temphyst, NULL, LOCAL_EMERG);
+> +static SENSOR_DEVICE_ATTR(temp2_emergency_hyst, S_IRUGO,
+> +	lm90_sysfs_show_temphyst, NULL, REMOTE_EMERG);
+>
+>   static struct attribute *lm90_emergency_attributes[] = {
+>   	&sensor_dev_attr_temp1_emergency.dev_attr.attr,
+> @@ -1092,8 +1172,10 @@ static const struct attribute_group lm90_emergency_group = {
+>   	.attrs = lm90_emergency_attributes,
+>   };
+>
+> -static SENSOR_DEVICE_ATTR(temp1_emergency_alarm, S_IRUGO, show_alarm, NULL, 15);
+> -static SENSOR_DEVICE_ATTR(temp2_emergency_alarm, S_IRUGO, show_alarm, NULL, 13);
+> +static SENSOR_DEVICE_ATTR(temp1_emergency_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 15);
+> +static SENSOR_DEVICE_ATTR(temp2_emergency_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 13);
+>
+>   static struct attribute *lm90_emergency_alarm_attributes[] = {
+>   	&sensor_dev_attr_temp1_emergency_alarm.dev_attr.attr,
+> @@ -1108,26 +1190,31 @@ static const struct attribute_group lm90_emergency_alarm_group = {
+>   /*
+>    * Additional attributes for devices with 3 temperature sensors
+>    */
+> -static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp11, NULL,
+> -	0, REMOTE2_TEMP);
+> -static SENSOR_DEVICE_ATTR_2(temp3_min, S_IWUSR | S_IRUGO, show_temp11,
+> -	set_temp11, 3, REMOTE2_LOW);
+> -static SENSOR_DEVICE_ATTR_2(temp3_max, S_IWUSR | S_IRUGO, show_temp11,
+> -	set_temp11, 4, REMOTE2_HIGH);
+> -static SENSOR_DEVICE_ATTR(temp3_crit, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, REMOTE2_CRIT);
+> -static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_temphyst, NULL,
+> -	REMOTE2_CRIT);
+> -static SENSOR_DEVICE_ATTR(temp3_emergency, S_IWUSR | S_IRUGO, show_temp8,
+> -	set_temp8, REMOTE2_EMERG);
+> -static SENSOR_DEVICE_ATTR(temp3_emergency_hyst, S_IRUGO, show_temphyst,
+> -			  NULL, REMOTE2_EMERG);
+> -
+> -static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO, show_alarm, NULL, 9);
+> -static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 10);
+> -static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_alarm, NULL, 11);
+> -static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_alarm, NULL, 12);
+> -static SENSOR_DEVICE_ATTR(temp3_emergency_alarm, S_IRUGO, show_alarm, NULL, 14);
+> +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,
+> +	lm90_sysfs_show_temp11, NULL, REMOTE2_TEMP);
+> +static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE2_LOW);
+> +static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE2_HIGH);
+> +static SENSOR_DEVICE_ATTR(temp3_crit, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE2_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO,
+> +	lm90_sysfs_show_temphyst, NULL, REMOTE2_CRIT);
+> +static SENSOR_DEVICE_ATTR(temp3_emergency, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE2_EMERG);
+> +static SENSOR_DEVICE_ATTR(temp3_emergency_hyst, S_IRUGO,
+> +	lm90_sysfs_show_temphyst, NULL, REMOTE2_EMERG);
+> +
+> +static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 9);
+> +static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 10);
+> +static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 11);
+> +static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 12);
+> +static SENSOR_DEVICE_ATTR(temp3_emergency_alarm, S_IRUGO,
+> +	lm90_sysfs_show_alarm, NULL, 14);
+>
+>   static struct attribute *lm90_temp3_attributes[] = {
+>   	&sensor_dev_attr_temp3_input.dev_attr.attr,
+> @@ -1151,15 +1238,15 @@ static const struct attribute_group lm90_temp3_group = {
+>   };
+>
+>   /* pec used for ADM1032 only */
+> -static ssize_t show_pec(struct device *dev, struct device_attribute *dummy,
+> -			char *buf)
+> +static ssize_t lm90_sysfs_show_pec(struct device *dev,
+> +		struct device_attribute *dummy, char *buf)
+>   {
+>   	struct i2c_client *client = to_i2c_client(dev);
+>   	return sprintf(buf, "%d\n", !!(client->flags & I2C_CLIENT_PEC));
+>   }
+>
+> -static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,
+> -		       const char *buf, size_t count)
+> +static ssize_t lm90_sysfs_set_pec(struct device *dev,
+> +		struct device_attribute *dummy, const char *buf, size_t count)
+>   {
+>   	struct i2c_client *client = to_i2c_client(dev);
+>   	long val;
+> @@ -1183,7 +1270,8 @@ static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,
+>   	return count;
+>   }
+>
+> -static DEVICE_ATTR(pec, S_IWUSR | S_IRUGO, show_pec, set_pec);
+> +static DEVICE_ATTR(pec, S_IWUSR | S_IRUGO,
+> +	lm90_sysfs_show_pec, lm90_sysfs_set_pec);
+>
+>   /*
+>    * Real code
+> @@ -1413,8 +1501,9 @@ static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data)
+>   				  data->config_orig);
+>   }
+>
+> -static void lm90_init_client(struct i2c_client *client, struct lm90_data *data)
+> +static void lm90_init_client(struct lm90_data *data)
+>   {
+> +	struct i2c_client *client = data->client;
+>   	u8 config, convrate;
+>
+>   	if (lm90_read_reg(client, LM90_REG_R_CONVRATE, &convrate) < 0) {
+> @@ -1426,7 +1515,7 @@ static void lm90_init_client(struct i2c_client *client, struct lm90_data *data)
+>   	/*
+>   	 * Start the conversions.
+>   	 */
+> -	lm90_set_convrate(client, data, 500);	/* 500ms; 2Hz conversion rate */
+> +	lm90_set_convrate_locked(data, 500);  /* 500ms / 2Hz  */
+>   	if (lm90_read_reg(client, LM90_REG_R_CONFIG1, &config) < 0) {
+>   		dev_warn(&client->dev, "Initialization failed!\n");
+>   		return;
+> @@ -1557,7 +1646,7 @@ static int lm90_probe(struct i2c_client *client,
+>   	data->max_convrate = lm90_params[data->kind].max_convrate;
+>
+>   	/* Initialize the LM90 chip */
+> -	lm90_init_client(client, data);
+> +	lm90_init_client(data);
+>
+>   	/* Register sysfs hooks */
+>   	data->groups[groups++] = &lm90_group;
+>
+
+--
+To unsubscribe from this list: send the line "unsubscribe devicetree" in
+the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
+More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff --git a/a/content_digest b/N1/content_digest
index ba46222..8d12cb1 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,9 +1,9 @@
  "ref\01453404877-17897-1-git-send-email-stephan@kochen.nl\0"
  "ref\01453404877-17897-2-git-send-email-stephan@kochen.nl\0"
  "ref\01453404877-17897-2-git-send-email-stephan-j6uo2F6POYhmR6Xm/wNWPw@public.gmane.org\0"
- "From\0Guenter Roeck <linux@roeck-us.net>\0"
- "Subject\0Re: [lm-sensors] [PATCH 1/3] lm90: separate register accessors from sysfs\0"
- "Date\0Fri, 22 Jan 2016 14:42:26 +0000\0"
+ "From\0Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>\0"
+ "Subject\0Re: [PATCH 1/3] lm90: separate register accessors from sysfs\0"
+ "Date\0Fri, 22 Jan 2016 06:42:26 -0800\0"
  "To\0St\303\251phan Kochen <stephan-j6uo2F6POYhmR6Xm/wNWPw@public.gmane.org>"
  " Jean Delvare <jdelvare-IBi9RG/b67k@public.gmane.org>\0"
  "Cc\0Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>"
@@ -15,534 +15,806 @@
  " devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org\0"
  "\00:1\0"
  "b\0"
- "T24gMDEvMjEvMjAxNiAxMTozNCBBTSwgU3TDqXBoYW4gS29jaGVuIHdyb3RlOgo+IEFkZCBhZGRp\n"
- "dGlvbmFsIHN1cHBvcnQgZnVuY3Rpb25zIGBsbTkwX2dldF8qYCBhbmQgYGxtOTBfc2V0XypgIGV4\n"
- "dHJhY3RlZAo+IGZyb20gdGhlIHN5c2ZzIHJvdXRpbmVzLiBUaGUgc3lzZnMgcm91dGluZXMgYXJl\n"
- "IG5vdyBqdXN0IHN0dWJzIHdyYXBwaW5nCj4gdGhlIG5ldyBzdXBwb3J0IGZ1bmN0aW9ucy4KPgo+\n"
- "IFRoaXMgd2F5IHdlIGhhdmUgYSBjb25zaXN0ZW50IHJlZ2lzdGVyIGFjY2VzcyBpbnRlcmZhY2Us\n"
- "IHdoaWNoIGNhbiBiZQo+IHVzZWQgZnJvbSBvdGhlciBpbnRlZ3JhdGlvbnMgZG93biB0aGUgbGlu\n"
- "ZS4gVG8gYXZvaWQgY29uZnVzaW9uLCBhbGwKPiBzeXNmcyBtZXRob2RzIGFyZSBub3cgcHJlZml4\n"
- "ZWQgYGxtOTBfc3lzZnNfKmAuCj4KPiBUbyBhY2NvbXBsaXNoIHRoaXMsIHRoZSBgbG05MF91cGRh\n"
- "dGVfZGV2aWNlYCBzaWduYXR1cmUgaGFzIGNoYW5nZWQgYW5kCj4gaXMgbm93IGBsbTkwX3VwZGF0\n"
- "ZWAsIHRha2luZyBkYXRhIGRpcmVjdGx5LiBJdCBubyBsb25nZXIgc2VydmVzIHRoZQo+IGR1YWwg\n"
- "cHVycG9zZSBvZiB1cGRhdGUgZnVuY3Rpb24gKmFuZCogZHJpdmVyIGRhdGEgZ2V0dGVyLgo+Cj4g\n"
- "YGxtOTBfc2V0X2NvbnZyYXRlYCwgYGxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsYCBhbmQgYGxt\n"
- "OTBfaW5pdF9jbGllbnRgCj4gYWxzbyBoYWQgcmVkdW5kYW50IGkyYyBjbGllbnQgcGFyYW1ldGVy\n"
- "cywgd2hpY2ggaGF2ZSBiZWVuIHJlbW92ZWQuCj4KPiBTaWduZWQtb2ZmLWJ5OiBTdMOpcGhhbiBL\n"
- "b2NoZW4gPHN0ZXBoYW5Aa29jaGVuLm5sPgo+IC0tLQo+ICAgZHJpdmVycy9od21vbi9sbTkwLmMg\n"
- "fCA1MTEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0t\n"
- "Cj4gICAxIGZpbGUgY2hhbmdlZCwgMzAwIGluc2VydGlvbnMoKyksIDIxMSBkZWxldGlvbnMoLSkK\n"
- "Pgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05\n"
- "MC5jCj4gaW5kZXggYzlmZjA4ZC4uODhkYWY3MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2h3bW9u\n"
- "L2xtOTAuYwo+ICsrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCj4gQEAgLTQ3MywxMCArNDczLDEw\n"
- "IEBAIHN0YXRpYyBpbnQgbG05MF9yZWFkMTYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTgg\n"
- "cmVnaCwgdTggcmVnbCwgdTE2ICp2YWx1ZSkKPiAgICAqIHZhcmlvdXMgcmVnaXN0ZXJzIGhhdmUg\n"
- "ZGlmZmVyZW50IG1lYW5pbmdzIGFzIGEgcmVzdWx0IG9mIHNlbGVjdGluZyBhCj4gICAgKiBub24t\n"
- "ZGVmYXVsdCByZW1vdGUgY2hhbm5lbC4KPiAgICAqLwo+IC1zdGF0aWMgaW5saW5lIHZvaWQgbG05\n"
- "MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPiAtCQkJ\n"
- "CQkgICAgICBzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLAo+IC0JCQkJCSAgICAgIGludCBjaGFubmVs\n"
- "KQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoCj4gKwkJ\n"
- "c3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGNoYW5uZWwpCgpWZXJ5IG11Y2ggcGVyc29uYWwg\n"
- "cHJlZmVyZW5jZSBoZXJlLCB1bnJlbGF0ZWQgY2hhbmdlLCBhbmQgdmlvbGF0ZXMgY29kaW5nIHN0\n"
- "eWxlLgoKUGxlYXNlIG9ubHkgb25lIGxvZ2ljYWwgY2hhbmdlIHBlciBwYXRjaC4gSWYgeW91IHRo\n"
- "aW5rIGl0IGlzIHdvcnRod2hpbGUgdG8gcmVtb3ZlCnRoZSBjbGllbnQgYXJndW1lbnQsIHByZXBh\n"
- "cmUgYSBzZXBhcmF0ZSBwYXRjaCB3aXRoIG9ubHkgdGhhdCBjaGFuZ2UsIGFuZCBzaG93CnRoYXQg\n"
- "aXQgcmVkdWNlcyBjb2RlIHNpemUuIEFsc28gcGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdXIgcGF0\n"
- "Y2ggZm9sbG93cwpjb2Rpbmcgc3R5bGUuCgo+ICAgewo+ICsJc3RydWN0IGkyY19jbGllbnQgKmNs\n"
- "aWVudCA9IGRhdGEtPmNsaWVudDsKPiAgIAl1OCBjb25maWc7Cj4KPiAgIAlpZiAoZGF0YS0+a2lu\n"
- "ZCA9PSBtYXg2Njk2KSB7Cj4gQEAgLTQ5MCwzMiArNDkwLDEwIEBAIHN0YXRpYyBpbmxpbmUgdm9p\n"
- "ZCBsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+\n"
- "ICAgfQo+Cj4gICAvKgo+IC0gKiBTZXQgY29udmVyc2lvbiByYXRlLgo+IC0gKiBjbGllbnQtPnVw\n"
- "ZGF0ZV9sb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAodW5sZXNz\n"
- "IHdlIGFyZQo+IC0gKiBpbiBkZXRlY3Rpb24gb3IgaW5pdGlhbGl6YXRpb24gc3RlcHMpLgo+ICsg\n"
- "KiBVcGRhdGUgYWxsIGN1cnJlbnQgcmVnaXN0ZXIgdmFsdWVzCj4gICAgKi8KPiAtc3RhdGljIHZv\n"
- "aWQgbG05MF9zZXRfY29udnJhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxt\n"
- "OTBfZGF0YSAqZGF0YSwKPiAtCQkJICAgICAgdW5zaWduZWQgaW50IGludGVydmFsKQo+IC17Cj4g\n"
- "LQlpbnQgaTsKPiAtCXVuc2lnbmVkIGludCB1cGRhdGVfaW50ZXJ2YWw7Cj4gLQo+IC0JLyogU2hp\n"
- "ZnQgY2FsY3VsYXRpb25zIHRvIGF2b2lkIHJvdW5kaW5nIGVycm9ycyAqLwo+IC0JaW50ZXJ2YWwg\n"
- "PDw9IDY7Cj4gLQo+IC0JLyogZmluZCB0aGUgbmVhcmVzdCB1cGRhdGUgcmF0ZSAqLwo+IC0JZm9y\n"
- "IChpID0gMCwgdXBkYXRlX2ludGVydmFsID0gTE05MF9NQVhfQ09OVlJBVEVfTVMgPDwgNjsKPiAt\n"
- "CSAgICAgaSA8IGRhdGEtPm1heF9jb252cmF0ZTsgaSsrLCB1cGRhdGVfaW50ZXJ2YWwgPj49IDEp\n"
- "Cj4gLQkJaWYgKGludGVydmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQo+IC0JCQlicmVh\n"
- "azsKPiAtCj4gLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19D\n"
- "T05WUkFURSwgaSk7Cj4gLQlkYXRhLT51cGRhdGVfaW50ZXJ2YWwgPSBESVZfUk9VTkRfQ0xPU0VT\n"
- "VCh1cGRhdGVfaW50ZXJ2YWwsIDY0KTsKPiAtfQo+IC0KPiAtc3RhdGljIHN0cnVjdCBsbTkwX2Rh\n"
- "dGEgKmxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3N0YXRpYyB2b2lk\n"
- "IGxtOTBfdXBkYXRlKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEpCj4gICB7Cj4gLQlzdHJ1Y3QgbG05\n"
- "MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gICAJc3RydWN0IGkyY19jbGll\n"
- "bnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKPiAgIAl1bnNpZ25lZCBsb25nIG5leHRfdXBkYXRl\n"
- "Owo+Cj4gQEAgLTU4Myw3ICs1NjEsNyBAQCBzdGF0aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91\n"
- "cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKPiAgIAkJZGF0YS0+YWxhcm1zID0gYWxh\n"
- "cm1zOwkvKiBzYXZlIGFzIDE2IGJpdCB2YWx1ZSAqLwo+Cj4gICAJCWlmIChkYXRhLT5raW5kID09\n"
- "IG1heDY2OTYpIHsKPiAtCQkJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRh\n"
- "LCAxKTsKPiArCQkJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoZGF0YSwgMSk7Cj4gICAJCQls\n"
- "bTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfQ1JJVCwKPiAgIAkJCQkgICAg\n"
- "ICAmZGF0YS0+dGVtcDhbUkVNT1RFMl9DUklUXSk7Cj4gICAJCQlsbTkwX3JlYWRfcmVnKGNsaWVu\n"
- "dCwgTUFYNjY1OV9SRUdfUl9SRU1PVEVfRU1FUkcsCj4gQEAgLTU5NSw3ICs1NzMsNyBAQCBzdGF0\n"
- "aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRl\n"
- "dikKPiAgIAkJCQlkYXRhLT50ZW1wMTFbUkVNT1RFMl9MT1ddID0gaCA8PCA4Owo+ICAgCQkJaWYg\n"
- "KCFsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfSElHSEgsICZoKSkKPiAg\n"
- "IAkJCQlkYXRhLT50ZW1wMTFbUkVNT1RFMl9ISUdIXSA9IGggPDwgODsKPiAtCQkJbG05MF9zZWxl\n"
- "Y3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKPiArCQkJbG05MF9zZWxlY3RfcmVt\n"
- "b3RlX2NoYW5uZWwoZGF0YSwgMCk7Cj4KPiAgIAkJCWlmICghbG05MF9yZWFkX3JlZyhjbGllbnQs\n"
- "IE1BWDY2OTZfUkVHX1JfU1RBVFVTMiwKPiAgIAkJCQkJICAgJmFsYXJtcykpCj4gQEAgLTYyNCw4\n"
- "ICs2MDIsNiBAQCBzdGF0aWMgc3RydWN0IGxtOTBfZGF0YSAqbG05MF91cGRhdGVfZGV2aWNlKHN0\n"
- "cnVjdCBkZXZpY2UgKmRldikKPiAgIAl9Cj4KPiAgIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0\n"
- "ZV9sb2NrKTsKPiAtCj4gLQlyZXR1cm4gZGF0YTsKPiAgIH0KPgo+ICAgLyoKPiBAQCAtNzU2LDMy\n"
- "ICs3MzIsMzEgQEAgc3RhdGljIHUxNiB0ZW1wX3RvX3UxNl9hZHQ3NDYxKHN0cnVjdCBsbTkwX2Rh\n"
- "dGEgKmRhdGEsIGxvbmcgdmFsKQo+ICAgfQo+Cj4gICAvKgo+IC0gKiBTeXNmcyBzdHVmZgo+ICsg\n"
- "KiBSZWdpc3RlciBhY2Nlc3NvcnMuIEdldHRlcnMgdHJpZ2dlciBhbiB1cGRhdGUuIFNldHRlcnMg\n"
- "aGF2ZSBsb2NrZWQgdmFyaWFudHMKPiArICogdGhhdCByZXF1aXJlIHVwZGF0ZV9sb2NrIHRvIGJl\n"
- "IGhlbGQuCj4gICAgKi8KPgo+IC1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXA4KHN0cnVjdCBkZXZp\n"
- "Y2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gLQkJCSAgY2hhciAq\n"
- "YnVmKQo+ICtzdGF0aWMgaW50IGxtOTBfZ2V0X3RlbXA4KHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEs\n"
- "IGludCBpbmRleCkKPiAgIHsKPiAtCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0\n"
- "ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiAtCXN0cnVjdCBsbTkwX2RhdGEgKmRh\n"
- "dGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKPiAgIAlpbnQgdGVtcDsKPgo+ICsJbG05MF91\n"
- "cGRhdGUoZGF0YSk7Cj4gKwo+ICAgCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+\n"
- "a2luZCA9PSB0bXA0NTEpCj4gLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRh\n"
- "dGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Cj4gKwkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYx\n"
- "KGRhdGEsIGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4gICAJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBt\n"
- "YXg2NjQ2KQo+IC0JCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhd\n"
- "KTsKPiArCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4gICAJZWxz\n"
- "ZQo+IC0JCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKPiAr\n"
- "CQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4KPiAgIAkvKiArMTYg\n"
- "ZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwo+IC0JaWYgKGRhdGEtPmtp\n"
- "bmQgPT0gbG05OSAmJiBhdHRyLT5pbmRleCA9PSAzKQo+ICsJaWYgKGRhdGEtPmtpbmQgPT0gbG05\n"
- "OSAmJiBpbmRleCA9PSAzKQo+ICAgCQl0ZW1wICs9IDE2MDAwOwo+Cj4gLQlyZXR1cm4gc3ByaW50\n"
- "ZihidWYsICIlZFxuIiwgdGVtcCk7Cj4gKwlyZXR1cm4gdGVtcDsKPiAgIH0KPgo+IC1zdGF0aWMg\n"
- "c3NpemVfdCBzZXRfdGVtcDgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJp\n"
- "YnV0ZSAqZGV2YXR0ciwKPiAtCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+ICtz\n"
- "dGF0aWMgdm9pZCBsbTkwX3NldF90ZW1wOF9sb2NrZWQoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwg\n"
- "aW50IGluZGV4LCBsb25nIHZhbCkKPiAgIHsKPiAgIAlzdGF0aWMgY29uc3QgdTggcmVnW1RFTVA4\n"
- "X1JFR19OVU1dID0gewo+ICAgCQlMTTkwX1JFR19XX0xPQ0FMX0xPVywKPiBAQCAtNzk0LDkwICs3\n"
- "NjksNzMgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3RlbXA4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3Ry\n"
- "dWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gICAJCU1BWDY2NTlfUkVHX1dfUkVNT1RF\n"
- "X0VNRVJHLAo+ICAgCX07Cj4KPiAtCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0\n"
- "ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiAtCXN0cnVjdCBsbTkwX2RhdGEgKmRh\n"
- "dGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAtCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQg\n"
- "PSBkYXRhLT5jbGllbnQ7Cj4gLQlpbnQgbnIgPSBhdHRyLT5pbmRleDsKPiAtCWxvbmcgdmFsOwo+\n"
- "IC0JaW50IGVycjsKPiAtCj4gLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwo+IC0JaWYg\n"
- "KGVyciA8IDApCj4gLQkJcmV0dXJuIGVycjsKPiAtCj4gICAJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0\n"
- "IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KPiAtCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYg\n"
- "YXR0ci0+aW5kZXggPT0gMykKPiArCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPT0g\n"
- "MykKPiAgIAkJdmFsIC09IDE2MDAwOwo+Cj4gLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9j\n"
- "ayk7Cj4gICAJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1\n"
- "MSkKPiAtCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsK\n"
- "PiArCQlkYXRhLT50ZW1wOFtpbmRleF0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsK\n"
- "PiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJZGF0YS0+dGVtcDhbbnJd\n"
- "ID0gdGVtcF90b191OCh2YWwpOwo+ICsJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fdTgo\n"
- "dmFsKTsKPiAgIAllbHNlCj4gLQkJZGF0YS0+dGVtcDhbbnJdID0gdGVtcF90b19zOCh2YWwpOwo+\n"
- "ICsJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fczgodmFsKTsKPgo+IC0JbG05MF9zZWxl\n"
- "Y3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCBuciA+PSA2KTsKPiAtCWkyY19zbWJ1c193\n"
- "cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLCBkYXRhLT50ZW1wOFtucl0pOwo+IC0JbG05\n"
- "MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKPiArCWxtOTBfc2VsZWN0\n"
- "X3JlbW90ZV9jaGFubmVsKGRhdGEsIGluZGV4ID49IDYpOwo+ICsJaTJjX3NtYnVzX3dyaXRlX2J5\n"
- "dGVfZGF0YShkYXRhLT5jbGllbnQsIHJlZ1tpbmRleF0sIGRhdGEtPnRlbXA4W2luZGV4XSk7Cj4g\n"
- "KwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChkYXRhLCAwKTsKPiArfQo+Cj4gK3N0YXRpYyB2\n"
- "b2lkIGxtOTBfc2V0X3RlbXA4KHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCwgbG9u\n"
- "ZyB2YWwpCj4gK3sKPiArCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiArCWxtOTBf\n"
- "c2V0X3RlbXA4X2xvY2tlZChkYXRhLCBpbmRleCwgdmFsKTsKPiAgIAltdXRleF91bmxvY2soJmRh\n"
- "dGEtPnVwZGF0ZV9sb2NrKTsKPiAtCXJldHVybiBjb3VudDsKPiAgIH0KPgo+IC1zdGF0aWMgc3Np\n"
- "emVfdCBzaG93X3RlbXAxMShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmli\n"
- "dXRlICpkZXZhdHRyLAo+IC0JCQkgICBjaGFyICpidWYpCj4gK3N0YXRpYyBpbnQgbG05MF9nZXRf\n"
- "dGVtcDExKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCkKPiAgIHsKPiAtCXN0cnVj\n"
- "dCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIo\n"
- "ZGV2YXR0cik7Cj4gLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNl\n"
- "KGRldik7Cj4gICAJaW50IHRlbXA7Cj4KPiArCWxtOTBfdXBkYXRlKGRhdGEpOwo+ICsKPiAgIAlp\n"
- "ZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQo+IC0JCXRl\n"
- "bXAgPSB0ZW1wX2Zyb21fdTE2X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDExW2F0dHItPmluZGV4\n"
- "XSk7Cj4gKwkJdGVtcCA9IHRlbXBfZnJvbV91MTZfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wMTFb\n"
- "aW5kZXhdKTsKPiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJdGVtcCA9\n"
- "IHRlbXBfZnJvbV91MTYoZGF0YS0+dGVtcDExW2F0dHItPmluZGV4XSk7Cj4gKwkJdGVtcCA9IHRl\n"
- "bXBfZnJvbV91MTYoZGF0YS0+dGVtcDExW2luZGV4XSk7Cj4gICAJZWxzZQo+IC0JCXRlbXAgPSB0\n"
- "ZW1wX2Zyb21fczE2KGRhdGEtPnRlbXAxMVthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1w\n"
- "X2Zyb21fczE2KGRhdGEtPnRlbXAxMVtpbmRleF0pOwo+Cj4gICAJLyogKzE2IGRlZ3JlZXMgb2Zm\n"
- "c2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KPiAtCWlmIChkYXRhLT5raW5kID09IGxtOTkg\n"
- "JiYgIGF0dHItPmluZGV4IDw9IDIpCj4gKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4\n"
- "IDw9IDIpCj4gICAJCXRlbXAgKz0gMTYwMDA7Cj4KPiAtCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVk\n"
- "XG4iLCB0ZW1wKTsKPiArCXJldHVybiB0ZW1wOwo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNl\n"
- "dF90ZW1wMTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2\n"
- "YXR0ciwKPiAtCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArc3RhdGljIHZv\n"
- "aWQgbG05MF9zZXRfdGVtcDExX2xvY2tlZChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5k\n"
- "ZXgsIGxvbmcgdmFsKQo+ICAgewo+IC0Jc3RydWN0IHsKPiAtCQl1OCBoaWdoOwo+IC0JCXU4IGxv\n"
- "dzsKPiAtCQlpbnQgY2hhbm5lbDsKPiAtCX0gcmVnWzVdID0gewo+IC0JCXsgTE05MF9SRUdfV19S\n"
- "RU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCwgMCB9LAo+IC0JCXsgTE05MF9SRUdf\n"
- "V19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMLCAwIH0sCj4gLQkJeyBMTTkw\n"
- "X1JFR19XX1JFTU9URV9PRkZTSCwgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0wsIDAgfSwKPiAtCQl7\n"
- "IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wsIDEgfSwKPiAt\n"
- "CQl7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCwgMSB9\n"
- "Cj4gLQl9OwoKQW5vdGhlciBzZXQgb2YgcGVyc29uYWwgcHJlZmVyZW5jZSBjaGFuZ2VzLgoKPiAt\n"
- "Cj4gLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9k\n"
- "ZXZfYXR0cl8yKGRldmF0dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRf\n"
- "ZHJ2ZGF0YShkZXYpOwo+ICAgCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGll\n"
- "bnQ7Cj4gLQlpbnQgbnIgPSBhdHRyLT5ucjsKPiAtCWludCBpbmRleCA9IGF0dHItPmluZGV4Owo+\n"
- "IC0JbG9uZyB2YWw7Cj4gLQlpbnQgZXJyOwo+ICsJdTggaGlnaCwgbG93LCBjaGFubmVsOwo+Cj4g\n"
- "LQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwo+IC0JaWYgKGVyciA8IDApCj4gLQkJcmV0\n"
- "dXJuIGVycjsKPiArI2RlZmluZSBTRUxFQ1RfUkVHUyhfcmVnLCBfY2hhbm5lbCkgeyBcCj4gKwlo\n"
- "aWdoID0gTE05MF9SRUdfV18jI19yZWcjI0g7IFwKPiArCWxvdyA9IExNOTBfUkVHX1dfIyNfcmVn\n"
- "IyNMOyBcCj4gKwljaGFubmVsID0gX2NoYW5uZWw7IFwKPiArfQoKV2UgaGF2ZSBiZWVuIHRyeWlu\n"
- "ZyB0byBnZXQgcmlkIG9mIGZ1bmN0aW9uIGRlZmluZXMgc3VjaCBhcyB0aGlzIG9uZS4KTW9zdCBv\n"
- "ZiB0aGUgdGltZSBpdCBpbmNyZWFzZXMgY29kZSBzaXplLCBhbmQgcmVkdWNlcyByZWFkYWJpbGl0\n"
- "eS4KUGx1cywgaXQgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgdGltZSB3ZSBoYXZlIHRvIHNwZW5k\n"
- "IHJldmlld2luZwp0aGUgY29kZSB0byBlbnN1cmUgaXQgaXMgY29ycmVjdC4KCj4gKwlzd2l0Y2gg\n"
- "KGluZGV4KSB7Cj4gKwljYXNlIFJFTU9URV9MT1c6ICAgIFNFTEVDVF9SRUdTKFJFTU9URV9MT1cs\n"
- "ICAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URV9ISUdIOiAgIFNFTEVDVF9SRUdTKFJFTU9URV9I\n"
- "SUdILCAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URV9PRkZTRVQ6IFNFTEVDVF9SRUdTKFJFTU9U\n"
- "RV9PRkZTLCAwKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URTJfTE9XOiAgIFNFTEVDVF9SRUdTKFJF\n"
- "TU9URV9MT1csICAxKTsgYnJlYWs7Cj4gKwljYXNlIFJFTU9URTJfSElHSDogIFNFTEVDVF9SRUdT\n"
- "KFJFTU9URV9ISUdILCAxKTsgYnJlYWs7Cj4gKwlkZWZhdWx0OiByZXR1cm47CgouLi4gYW5kLCBp\n"
- "biB0aGlzIGNhc2UsIGludHJvZHVjZXMgY2hlY2twYXRjaCBlcnJvcnMuCgpUaGlzIHBhdGNoIGlz\n"
- "IGNsZWFybHkgbW9yZSB0aGFuIHdoYXQgaXRzIGhlYWRsaW5lIHNheXMuIEl0IGlzCnRvbyBjb21w\n"
- "bGV4IHRvIHJldmlldyBhcyBzaW5nbGUgcGF0Y2guIFBsZWFzZSBzcGxpdCBpbnRvCmxvZ2ljYWwg\n"
- "Y2hhbmdlcywgYW5kIGV4cGxhaW4gd2h5IHlvdSBtYWtlIHRob3NlIGNoYW5nZXMuCgpUaGFua3Ms\n"
- "Ckd1ZW50ZXIKCgo+ICsJfQo+ICsjdW5kZWYgU0VMRUNUX1JFR1MKPgo+ICAgCS8qICsxNiBkZWdy\n"
- "ZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCj4gICAJaWYgKGRhdGEtPmtpbmQg\n"
- "PT0gbG05OSAmJiBpbmRleCA8PSAyKQo+ICAgCQl2YWwgLT0gMTYwMDA7Cj4KPiAtCW11dGV4X2xv\n"
- "Y2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiAgIAlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8\n"
- "IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQo+ICAgCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90\n"
- "b191MTZfYWR0NzQ2MShkYXRhLCB2YWwpOwo+ICAgCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4\n"
- "NjY0NikKPiBAQCAtODg3LDU0ICs4NDUsNDYgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAxMShz\n"
- "dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICAg\n"
- "CWVsc2UKPiAgIAkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczgodmFsKSA8PCA4Owo+\n"
- "Cj4gLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIHJlZ1tucl0uY2hh\n"
- "bm5lbCk7Cj4gLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5oaWdo\n"
- "LAo+IC0JCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdID4+IDgpOwo+ICsJbG05MF9zZWxlY3RfcmVt\n"
- "b3RlX2NoYW5uZWwoZGF0YSwgY2hhbm5lbCk7Cj4gKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRh\n"
- "KGNsaWVudCwgaGlnaCwKPiArCQkJZGF0YS0+dGVtcDExW2luZGV4XSA+PiA4KTsKPiAgIAlpZiAo\n"
- "ZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKPiAtCQlpMmNfc21idXNfd3Jp\n"
- "dGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW25yXS5sb3csCj4gLQkJCQkJICBkYXRhLT50ZW1wMTFb\n"
- "aW5kZXhdICYgMHhmZik7Cj4gLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRh\n"
- "dGEsIDApOwo+ICsJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBsb3csCj4gKwkJ\n"
- "CQlkYXRhLT50ZW1wMTFbaW5kZXhdICYgMHhmZik7Cj4gKwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hh\n"
- "bm5lbChkYXRhLCAwKTsKPiArfQo+Cj4gK3N0YXRpYyB2b2lkIGxtOTBfc2V0X3RlbXAxMShzdHJ1\n"
- "Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgsIGxvbmcgdmFsKQo+ICt7Cj4gKwltdXRleF9s\n"
- "b2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Cj4gKwlsbTkwX3NldF90ZW1wMTFfbG9ja2VkKGRhdGEs\n"
- "IGluZGV4LCB2YWwpOwo+ICAgCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwo+IC0J\n"
- "cmV0dXJuIGNvdW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNob3dfdGVtcGh5c3Qoc3Ry\n"
- "dWN0IGRldmljZSAqZGV2LAo+IC0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZh\n"
- "dHRyLAo+IC0JCQkgICAgIGNoYXIgKmJ1ZikKPiArc3RhdGljIHNzaXplX3QgbG05MF9nZXRfdGVt\n"
- "cGh5c3Qoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgaW50IGluZGV4KQo+ICAgewo+IC0Jc3RydWN0\n"
- "IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0\n"
- "dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYp\n"
- "Owo+ICAgCWludCB0ZW1wOwo+Cj4gKwlsbTkwX3VwZGF0ZShkYXRhKTsKPiArCj4gICAJaWYgKGRh\n"
- "dGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKPiAtCQl0ZW1wID0g\n"
- "dGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKPiAr\n"
- "CQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbaW5kZXhdKTsK\n"
- "PiAgIAllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCj4gLQkJdGVtcCA9IHRlbXBfZnJv\n"
- "bV91OChkYXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1wX2Zyb21fdTgo\n"
- "ZGF0YS0+dGVtcDhbaW5kZXhdKTsKPiAgIAllbHNlCj4gLQkJdGVtcCA9IHRlbXBfZnJvbV9zOChk\n"
- "YXRhLT50ZW1wOFthdHRyLT5pbmRleF0pOwo+ICsJCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+\n"
- "dGVtcDhbaW5kZXhdKTsKPgo+ICAgCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9y\n"
- "IHRoZSBMTTk5ICovCj4gLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGF0dHItPmluZGV4ID09\n"
- "IDMpCj4gKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4ID09IDMpCj4gICAJCXRlbXAg\n"
- "Kz0gMTYwMDA7Cj4KPiAtCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wIC0gdGVtcF9m\n"
- "cm9tX3M4KGRhdGEtPnRlbXBfaHlzdCkpOwo+ICsJcmV0dXJuIHRlbXAgLSB0ZW1wX2Zyb21fczgo\n"
- "ZGF0YS0+dGVtcF9oeXN0KTsKPiAgIH0KPgo+IC1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcGh5c3Qo\n"
- "c3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCj4gLQkJ\n"
- "CSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArc3RhdGljIHZvaWQgbG05MF9z\n"
- "ZXRfdGVtcGh5c3RfbG9ja2VkKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGxvbmcgdmFsKQo+ICAg\n"
- "ewo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+IC0J\n"
- "c3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKPiAtCWxvbmcgdmFsOwo+\n"
- "IC0JaW50IGVycjsKPiAgIAlpbnQgdGVtcDsKPgo+IC0JZXJyID0ga3N0cnRvbChidWYsIDEwLCAm\n"
- "dmFsKTsKPiAtCWlmIChlcnIgPCAwKQo+IC0JCXJldHVybiBlcnI7Cj4gLQo+IC0JbXV0ZXhfbG9j\n"
- "aygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICAgCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwg\n"
- "ZGF0YS0+a2luZCA9PSB0bXA0NTEpCj4gICAJCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShk\n"
- "YXRhLCBkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7Cj4gICAJZWxzZSBpZiAoZGF0YS0+a2luZCA9\n"
- "PSBtYXg2NjQ2KQo+IEBAIC05NDMsNDMgKzg5MywxNjcgQEAgc3RhdGljIHNzaXplX3Qgc2V0X3Rl\n"
- "bXBoeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15\n"
- "LAo+ICAgCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKPgo+\n"
- "ICAgCWRhdGEtPnRlbXBfaHlzdCA9IGh5c3RfdG9fcmVnKHRlbXAgLSB2YWwpOwo+IC0JaTJjX3Nt\n"
- "YnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTBfUkVHX1dfVENSSVRfSFlTVCwKPiAtCQkJ\n"
- "CSAgZGF0YS0+dGVtcF9oeXN0KTsKPiArCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+\n"
- "Y2xpZW50LCBMTTkwX1JFR19XX1RDUklUX0hZU1QsCj4gKwkJCWRhdGEtPnRlbXBfaHlzdCk7Cj4g\n"
- "K30KPiArCj4gK3N0YXRpYyB2b2lkIGxtOTBfc2V0X3RlbXBoeXN0KHN0cnVjdCBsbTkwX2RhdGEg\n"
- "KmRhdGEsIGxvbmcgdmFsKQo+ICt7Cj4gKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7\n"
- "Cj4gKwlsbTkwX3NldF90ZW1waHlzdF9sb2NrZWQoZGF0YSwgdmFsKTsKPiArCW11dGV4X3VubG9j\n"
- "aygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBsbTkwX3NldF9j\n"
- "b252cmF0ZV9sb2NrZWQoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHZhbCkK\n"
- "PiArewo+ICsJaW50IGk7Cj4gKwl1bnNpZ25lZCBpbnQgdXBkYXRlX2ludGVydmFsOwo+ICsKPiAr\n"
- "CS8qIFNoaWZ0IGNhbGN1bGF0aW9ucyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgKi8KPiArCXZh\n"
- "bCA8PD0gNjsKPiArCj4gKwkvKiBmaW5kIHRoZSBuZWFyZXN0IHVwZGF0ZSByYXRlICovCj4gKwlm\n"
- "b3IgKGkgPSAwLCB1cGRhdGVfaW50ZXJ2YWwgPSBMTTkwX01BWF9DT05WUkFURV9NUyA8PCA2Owo+\n"
- "ICsJICAgICBpIDwgZGF0YS0+bWF4X2NvbnZyYXRlOyBpKyssIHVwZGF0ZV9pbnRlcnZhbCA+Pj0g\n"
- "MSkKPiArCQlpZiAodmFsID49IHVwZGF0ZV9pbnRlcnZhbCAqIDMgLyA0KQo+ICsJCQlicmVhazsK\n"
- "PiArCj4gKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05MF9SRUdf\n"
- "V19DT05WUkFURSwgaSk7Cj4gKwlkYXRhLT51cGRhdGVfaW50ZXJ2YWwgPSBESVZfUk9VTkRfQ0xP\n"
- "U0VTVCh1cGRhdGVfaW50ZXJ2YWwsIDY0KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgbG05MF9z\n"
- "ZXRfY29udnJhdGUoc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHZhbCkKPiAr\n"
- "ewo+ICsJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwo+ICsJbG05MF9zZXRfY29udnJh\n"
- "dGVfbG9ja2VkKGRhdGEsIHZhbCk7Cj4gICAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9j\n"
- "ayk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFN5c2ZzIHN0dWZmCj4gKyAqLwo+ICsKPiArc3RhdGlj\n"
- "IHNzaXplX3QgbG05MF9zeXNmc19zaG93X3RlbXA4KAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwg\n"
- "c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCj4gKwkJY2hhciAqYnVmKQo+ICt7Cj4g\n"
- "KwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0\n"
- "dHIoZGV2YXR0cik7Cj4gKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRh\n"
- "KGRldik7Cj4gKwo+ICsJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGxtOTBfZ2V0X3RlbXA4\n"
- "KGRhdGEsIGF0dHItPmluZGV4KSk7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lz\n"
- "ZnNfc2V0X3RlbXA4KAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRy\n"
- "aWJ1dGUgKmRldmF0dHIsCj4gKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCj4gK3sK\n"
- "PiArCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZf\n"
- "YXR0cihkZXZhdHRyKTsKPiArCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRh\n"
- "dGEoZGV2KTsKPiArCWxvbmcgdmFsOwo+ICsJaW50IGVycjsKPiArCj4gKwllcnIgPSBrc3RydG9s\n"
- "KGJ1ZiwgMTAsICZ2YWwpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4g\n"
- "KwlsbTkwX3NldF90ZW1wOChkYXRhLCBhdHRyLT5pbmRleCwgdmFsKTsKPiArCj4gICAJcmV0dXJu\n"
- "IGNvdW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZp\n"
- "Y2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+IC0JCQkgICBjaGFyICpi\n"
- "dWYpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNfc2hvd190ZW1wMTEoCj4gKwkJc3RydWN0\n"
- "IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQljaGFy\n"
- "ICpidWYpCj4gK3sKPiArCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRv\n"
- "X3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKPiArCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBk\n"
- "ZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwg\n"
- "bG05MF9nZXRfdGVtcDExKGRhdGEsIGF0dHItPmluZGV4KSk7Cj4gK30KPiArCj4gK3N0YXRpYyBz\n"
- "c2l6ZV90IGxtOTBfc3lzZnNfc2V0X3RlbXAxMSgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0\n"
- "cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6\n"
- "ZV90IGNvdW50KQo+ICAgewo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRl\n"
- "X2RldmljZShkZXYpOwo+ICsJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0g\n"
- "dG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwo+ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9\n"
- "IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJbG9uZyB2YWw7Cj4gKwlpbnQgZXJyOwo+ICsKPiAr\n"
- "CWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Cj4gKwlpZiAoZXJyIDwgMCkKPiArCQlyZXR1\n"
- "cm4gZXJyOwo+ICsKPiArCWxtOTBfc2V0X3RlbXAxMShkYXRhLCBhdHRyLT5pbmRleCwgdmFsKTsK\n"
- "PiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lz\n"
- "ZnNfc2hvd190ZW1waHlzdCgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vf\n"
- "YXR0cmlidXRlICpkZXZhdHRyLAo+ICsJCWNoYXIgKmJ1ZikKPiArewo+ICsJc3RydWN0IHNlbnNv\n"
- "cl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwo+\n"
- "ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiAr\n"
- "CXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsbTkwX2dldF90ZW1waHlzdChkYXRhLCBhdHRy\n"
- "LT5pbmRleCkpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3NldF90ZW1w\n"
- "aHlzdCgKPiArCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpk\n"
- "dW1teSwKPiArCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiArewo+ICsJc3RydWN0\n"
- "IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsJbG9uZyB2YWw7Cj4g\n"
- "KwlpbnQgZXJyOwo+ICsKPiArCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Cj4gKwlpZiAo\n"
- "ZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCWxtOTBfc2V0X3RlbXBoeXN0KGRhdGEs\n"
- "IHZhbCk7Cj4gKwo+ICsJcmV0dXJuIGNvdW50Owo+ICt9Cj4gKwo+ICtzdGF0aWMgc3NpemVfdCBs\n"
- "bTkwX3N5c2ZzX3Nob3dfYWxhcm1zKAo+ICsJCXN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRl\n"
- "dmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+ICsJCWNoYXIgKmJ1ZikKPiArewo+ICsJc3RydWN0IGxt\n"
- "OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiArCWxtOTBfdXBkYXRl\n"
- "KGRhdGEpOwo+ICsKPiAgIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1z\n"
- "KTsKPiAgIH0KPgo+IC1zdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRl\n"
- "diwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKPiAtCQkJICAqZGV2YXR0ciwgY2hhciAqYnVmKQo+\n"
- "ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3Nob3dfYWxhcm0oCj4gKwkJc3RydWN0IGRldmlj\n"
- "ZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKPiArCQljaGFyICpidWYp\n"
- "Cj4gICB7Cj4gICAJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vu\n"
- "c29yX2Rldl9hdHRyKGRldmF0dHIpOwo+IC0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBf\n"
- "dXBkYXRlX2RldmljZShkZXYpOwo+ICsJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRf\n"
- "ZHJ2ZGF0YShkZXYpOwo+ICAgCWludCBiaXRuciA9IGF0dHItPmluZGV4Owo+Cj4gKwlsbTkwX3Vw\n"
- "ZGF0ZShkYXRhKTsKPiArCj4gICAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5h\n"
- "bGFybXMgPj4gYml0bnIpICYgMSk7Cj4gICB9Cj4KPiAtc3RhdGljIHNzaXplX3Qgc2hvd191cGRh\n"
- "dGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAo+IC0JCQkJICAgIHN0cnVjdCBkZXZpY2Vf\n"
- "YXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNf\n"
- "c2hvd191cGRhdGVfaW50ZXJ2YWwoCj4gKwkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2\n"
- "aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiArCQljaGFyICpidWYpCj4gICB7Cj4gICAJc3RydWN0IGxt\n"
- "OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Cj4gICAJcmV0dXJuIHNwcmlu\n"
- "dGYoYnVmLCAiJXVcbiIsIGRhdGEtPnVwZGF0ZV9pbnRlcnZhbCk7Cj4gICB9Cj4KPiAtc3RhdGlj\n"
- "IHNzaXplX3Qgc2V0X3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gLQkJCQkg\n"
- "ICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKPiAtCQkJCSAgIGNvbnN0IGNoYXIgKmJ1\n"
- "Ziwgc2l6ZV90IGNvdW50KQo+ICtzdGF0aWMgc3NpemVfdCBsbTkwX3N5c2ZzX3NldF91cGRhdGVf\n"
- "aW50ZXJ2YWwoCj4gKwkJc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0\n"
- "ZSAqYXR0ciwKPiArCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKPiAgIHsKPiAgIAlz\n"
- "dHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gLQlzdHJ1Y3Qg\n"
- "aTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50Owo+ICAgCXVuc2lnbmVkIGxvbmcgdmFs\n"
- "Owo+ICAgCWludCBlcnI7Cj4KPiBAQCAtOTg3LDQ5ICsxMDYxLDU1IEBAIHN0YXRpYyBzc2l6ZV90\n"
- "IHNldF91cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAo+ICAgCWlmIChlcnIpCj4g\n"
- "ICAJCXJldHVybiBlcnI7Cj4KPiAtCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiAt\n"
- "CWxtOTBfc2V0X2NvbnZyYXRlKGNsaWVudCwgZGF0YSwgY2xhbXBfdmFsKHZhbCwgMCwgMTAwMDAw\n"
- "KSk7Cj4gLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKPiArCWxtOTBfc2V0X2Nv\n"
- "bnZyYXRlKGRhdGEsIGNsYW1wX3ZhbCh2YWwsIDAsIDEwMDAwMCkpOwo+Cj4gICAJcmV0dXJuIGNv\n"
- "dW50Owo+ICAgfQo+Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9pbnB1dCwg\n"
- "U19JUlVHTywgc2hvd190ZW1wMTEsIE5VTEwsCj4gLQkwLCBMT0NBTF9URU1QKTsKPiAtc3RhdGlj\n"
- "IFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwg\n"
- "TlVMTCwKPiAtCTAsIFJFTU9URV9URU1QKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAo+IC0Jc2V0X3RlbXA4LCBM\n"
- "T0NBTF9MT1cpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWluLCBTX0lX\n"
- "VVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCj4gLQlzZXRfdGVtcDExLCAwLCBSRU1PVEVfTE9X\n"
- "KTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lS\n"
- "VUdPLCBzaG93X3RlbXA4LAo+IC0Jc2V0X3RlbXA4LCBMT0NBTF9ISUdIKTsKPiAtc3RhdGljIFNF\n"
- "TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVt\n"
- "cDExLAo+IC0Jc2V0X3RlbXAxMSwgMSwgUkVNT1RFX0hJR0gpOwo+IC1zdGF0aWMgU0VOU09SX0RF\n"
- "VklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAo+IC0J\n"
- "c2V0X3RlbXA4LCBMT0NBTF9DUklUKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1w\n"
- "Ml9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgUkVN\n"
- "T1RFX0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwg\n"
- "U19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCj4gLQlzZXRfdGVtcGh5c3QsIExPQ0FM\n"
- "X0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19J\n"
- "UlVHTywgc2hvd190ZW1waHlzdCwgTlVMTCwKPiAtCVJFTU9URV9DUklUKTsKPiAtc3RhdGljIFNF\n"
- "TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAyX29mZnNldCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3df\n"
- "dGVtcDExLAo+IC0Jc2V0X3RlbXAxMSwgMiwgUkVNT1RFX09GRlNFVCk7Cj4gK3N0YXRpYyBTRU5T\n"
- "T1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3df\n"
- "dGVtcDExLCBOVUxMLCBMT0NBTF9URU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wMl9pbnB1dCwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wMTEsIE5VTEwsIFJF\n"
- "TU9URV9URU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVdV\n"
- "U1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXA4LCBsbTkwX3N5c2ZzX3NldF90\n"
- "ZW1wOCwgTE9DQUxfTE9XKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9taW4s\n"
- "IFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgbG05MF9zeXNm\n"
- "c19zZXRfdGVtcDExLCBSRU1PVEVfTE9XKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXA4LCBs\n"
- "bTkwX3N5c2ZzX3NldF90ZW1wOCwgTE9DQUxfSElHSCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNF\n"
- "X0FUVFIodGVtcDJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190\n"
- "ZW1wMTEsIGxtOTBfc3lzZnNfc2V0X3RlbXAxMSwgUkVNT1RFX0hJR0gpOwo+ICtzdGF0aWMgU0VO\n"
- "U09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9z\n"
- "eXNmc19zaG93X3RlbXA4LCBsbTkwX3N5c2ZzX3NldF90ZW1wOCwgTE9DQUxfQ1JJVCk7Cj4gK3N0\n"
- "YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sCj4g\n"
- "KwlsbTkwX3N5c2ZzX3Nob3dfdGVtcDgsIGxtOTBfc3lzZnNfc2V0X3RlbXA4LCBSRU1PVEVfQ1JJ\n"
- "VCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lXVVNS\n"
- "IHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1waHlzdCwgbG05MF9zeXNmc19zZXRf\n"
- "dGVtcGh5c3QsIExPQ0FMX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAy\n"
- "X2NyaXRfaHlzdCwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1waHlzdCwgTlVMTCwg\n"
- "UkVNT1RFX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX29mZnNldCwg\n"
- "U19JV1VTUiB8IFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfdGVtcDExLCBsbTkwX3N5c2Zz\n"
- "X3NldF90ZW1wMTEsIFJFTU9URV9PRkZTRVQpOwo+Cj4gICAvKiBJbmRpdmlkdWFsIGFsYXJtIGZp\n"
- "bGVzICovCj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19J\n"
- "UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo\n"
- "dGVtcDJfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMSk7Cj4gLXN0YXRp\n"
- "YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5V\n"
- "TEwsIDIpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbl9hbGFybSwgU19J\n"
- "UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIo\n"
- "dGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKPiAtc3RhdGlj\n"
- "IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0s\n"
- "IE5VTEwsIDUpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwg\n"
- "U19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FU\n"
- "VFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwg\n"
- "TlVMTCwgMCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9hbGFybSwg\n"
- "U19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMSk7Cj4gK3N0YXRpYyBT\n"
- "RU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3No\n"
- "b3dfYWxhcm0sIE5VTEwsIDIpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21p\n"
- "bl9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMyk7Cj4g\n"
- "K3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLAo+ICsJ\n"
- "bG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCA0KTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0Vf\n"
- "QVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfYWxhcm0s\n"
- "IE5VTEwsIDUpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwg\n"
- "U19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgNik7Cj4gICAvKiBSYXcg\n"
- "YWxhcm0gZmlsZSBmb3IgY29tcGF0aWJpbGl0eSAqLwo+IC1zdGF0aWMgREVWSUNFX0FUVFIoYWxh\n"
- "cm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtcywgTlVMTCk7Cj4gK3N0YXRpYyBERVZJQ0VfQVRUUihh\n"
- "bGFybXMsIFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3dfYWxhcm1zLCBOVUxMKTsKPgo+IC1z\n"
- "dGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hv\n"
- "d191cGRhdGVfaW50ZXJ2YWwsCj4gLQkJICAgc2V0X3VwZGF0ZV9pbnRlcnZhbCk7Cj4gK3N0YXRp\n"
- "YyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVJVR08gfCBTX0lXVVNSLAo+ICsJbG05\n"
- "MF9zeXNmc19zaG93X3VwZGF0ZV9pbnRlcnZhbCwgbG05MF9zeXNmc19zZXRfdXBkYXRlX2ludGVy\n"
- "dmFsKTsKPgo+ICAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfYXR0cmlidXRlc1tdID0g\n"
- "ewo+ICAgCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKPiBAQCAt\n"
- "MTA3MSwxNCArMTE1MSwxNCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBs\n"
- "bTkwX3RlbXAyX29mZnNldF9ncm91cCA9IHsKPiAgIC8qCj4gICAgKiBBZGRpdGlvbmFsIGF0dHJp\n"
- "YnV0ZXMgZm9yIGRldmljZXMgd2l0aCBlbWVyZ2VuY3kgc2Vuc29ycwo+ICAgICovCj4gLXN0YXRp\n"
- "YyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5LCBTX0lXVVNSIHwgU19JUlVHTywg\n"
- "c2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgTE9DQUxfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09S\n"
- "X0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVt\n"
- "cDgsCj4gLQlzZXRfdGVtcDgsIFJFTU9URV9FTUVSRyk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNF\n"
- "X0FUVFIodGVtcDFfZW1lcmdlbmN5X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsCj4gLQkJ\n"
- "CSAgTlVMTCwgTE9DQUxfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAy\n"
- "X2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LAo+IC0JCQkgIE5VTEwsIFJF\n"
- "TU9URV9FTUVSRyk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfZW1lcmdlbmN5\n"
- "LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wOCwgbG05MF9zeXNm\n"
- "c19zZXRfdGVtcDgsIExPQ0FMX0VNRVJHKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wMl9lbWVyZ2VuY3ksIFNfSVdVU1IgfCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3Rl\n"
- "bXA4LCBsbTkwX3N5c2ZzX3NldF90ZW1wOCwgUkVNT1RFX0VNRVJHKTsKPiArc3RhdGljIFNFTlNP\n"
- "Ul9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywKPiArCWxtOTBfc3lz\n"
- "ZnNfc2hvd190ZW1waHlzdCwgTlVMTCwgTE9DQUxfRU1FUkcpOwo+ICtzdGF0aWMgU0VOU09SX0RF\n"
- "VklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19z\n"
- "aG93X3RlbXBoeXN0LCBOVUxMLCBSRU1PVEVfRU1FUkcpOwo+Cj4gICBzdGF0aWMgc3RydWN0IGF0\n"
- "dHJpYnV0ZSAqbG05MF9lbWVyZ2VuY3lfYXR0cmlidXRlc1tdID0gewo+ICAgCSZzZW5zb3JfZGV2\n"
- "X2F0dHJfdGVtcDFfZW1lcmdlbmN5LmRldl9hdHRyLmF0dHIsCj4gQEAgLTEwOTIsOCArMTE3Miwx\n"
- "MCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTkwX2VtZXJnZW5jeV9n\n"
- "cm91cCA9IHsKPiAgIAkuYXR0cnMgPSBsbTkwX2VtZXJnZW5jeV9hdHRyaWJ1dGVzLAo+ICAgfTsK\n"
- "Pgo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2VtZXJnZW5jeV9hbGFybSwgU19J\n"
- "UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTUpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS\n"
- "KHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTMpOwo+\n"
- "ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2VtZXJnZW5jeV9hbGFybSwgU19JUlVH\n"
- "TywKPiArCWxtOTBfc3lzZnNfc2hvd19hbGFybSwgTlVMTCwgMTUpOwo+ICtzdGF0aWMgU0VOU09S\n"
- "X0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywKPiArCWxtOTBfc3lz\n"
- "ZnNfc2hvd19hbGFybSwgTlVMTCwgMTMpOwo+Cj4gICBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAq\n"
- "bG05MF9lbWVyZ2VuY3lfYWxhcm1fYXR0cmlidXRlc1tdID0gewo+ICAgCSZzZW5zb3JfZGV2X2F0\n"
- "dHJfdGVtcDFfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCj4gQEAgLTExMDgsMjYgKzEx\n"
- "OTAsMzEgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF9lbWVyZ2Vu\n"
- "Y3lfYWxhcm1fZ3JvdXAgPSB7Cj4gICAvKgo+ICAgICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZv\n"
- "ciBkZXZpY2VzIHdpdGggMyB0ZW1wZXJhdHVyZSBzZW5zb3JzCj4gICAgKi8KPiAtc3RhdGljIFNF\n"
- "TlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAxMSwgTlVM\n"
- "TCwKPiAtCTAsIFJFTU9URTJfVEVNUCk7Cj4gLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0\n"
- "ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxMSwKPiAtCXNldF90ZW1wMTEs\n"
- "IDMsIFJFTU9URTJfTE9XKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKHRlbXAzX21h\n"
- "eCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDExLAo+IC0Jc2V0X3RlbXAxMSwgNCwgUkVN\n"
- "T1RFMl9ISUdIKTsKPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19jcml0LCBTX0lX\n"
- "VVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKPiAtCXNldF90ZW1wOCwgUkVNT1RFMl9DUklUKTsK\n"
- "PiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19jcml0X2h5c3QsIFNfSVJVR08sIHNo\n"
- "b3dfdGVtcGh5c3QsIE5VTEwsCj4gLQlSRU1PVEUyX0NSSVQpOwo+IC1zdGF0aWMgU0VOU09SX0RF\n"
- "VklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgs\n"
- "Cj4gLQlzZXRfdGVtcDgsIFJFTU9URTJfRU1FUkcpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9B\n"
- "VFRSKHRlbXAzX2VtZXJnZW5jeV9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LAo+IC0JCQkg\n"
- "IE5VTEwsIFJFTU9URTJfRU1FUkcpOwo+IC0KPiAtc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wM19jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA5KTsKPiAtc3RhdGlj\n"
- "IFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVM\n"
- "TCwgMTApOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbl9hbGFybSwgU19J\n"
- "UlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOwo+IC1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS\n"
- "KHRlbXAzX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTIpOwo+IC1zdGF0\n"
- "aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2VtZXJnZW5jeV9hbGFybSwgU19JUlVHTywgc2hv\n"
- "d19hbGFybSwgTlVMTCwgMTQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lu\n"
- "cHV0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgTlVMTCwgUkVNT1RFMl9U\n"
- "RU1QKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19taW4sIFNfSVdVU1IgfCBT\n"
- "X0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3RlbXAxMSwgbG05MF9zeXNmc19zZXRfdGVtcDEx\n"
- "LCBSRU1PVEUyX0xPVyk7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBT\n"
- "X0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wMTEsIGxtOTBfc3lzZnNf\n"
- "c2V0X3RlbXAxMSwgUkVNT1RFMl9ISUdIKTsKPiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0\n"
- "ZW1wM19jcml0LCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxtOTBfc3lzZnNfc2hvd190ZW1wOCwg\n"
- "bG05MF9zeXNmc19zZXRfdGVtcDgsIFJFTU9URTJfQ1JJVCk7Cj4gK3N0YXRpYyBTRU5TT1JfREVW\n"
- "SUNFX0FUVFIodGVtcDNfY3JpdF9oeXN0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X3Rl\n"
- "bXBoeXN0LCBOVUxMLCBSRU1PVEUyX0NSSVQpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS\n"
- "KHRlbXAzX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sCj4gKwlsbTkwX3N5c2ZzX3Nob3df\n"
- "dGVtcDgsIGxtOTBfc3lzZnNfc2V0X3RlbXA4LCBSRU1PVEUyX0VNRVJHKTsKPiArc3RhdGljIFNF\n"
- "TlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywKPiArCWxtOTBf\n"
- "c3lzZnNfc2hvd190ZW1waHlzdCwgTlVMTCwgUkVNT1RFMl9FTUVSRyk7Cj4gKwo+ICtzdGF0aWMg\n"
- "U0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2NyaXRfYWxhcm0sIFNfSVJVR08sCj4gKwlsbTkwX3N5\n"
- "c2ZzX3Nob3dfYWxhcm0sIE5VTEwsIDkpOwo+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRl\n"
- "bXAzX2ZhdWx0LCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxMCk7\n"
- "Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWluX2FsYXJtLCBTX0lSVUdPLAo+\n"
- "ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxMSk7Cj4gK3N0YXRpYyBTRU5TT1JfREVW\n"
- "SUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2Fs\n"
- "YXJtLCBOVUxMLCAxMik7Cj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdl\n"
- "bmN5X2FsYXJtLCBTX0lSVUdPLAo+ICsJbG05MF9zeXNmc19zaG93X2FsYXJtLCBOVUxMLCAxNCk7\n"
- "Cj4KPiAgIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX3RlbXAzX2F0dHJpYnV0ZXNbXSA9\n"
- "IHsKPiAgIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCj4gQEAg\n"
- "LTExNTEsMTUgKzEyMzgsMTUgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAg\n"
- "bG05MF90ZW1wM19ncm91cCA9IHsKPiAgIH07Cj4KPiAgIC8qIHBlYyB1c2VkIGZvciBBRE0xMDMy\n"
- "IG9ubHkgKi8KPiAtc3RhdGljIHNzaXplX3Qgc2hvd19wZWMoc3RydWN0IGRldmljZSAqZGV2LCBz\n"
- "dHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCj4gLQkJCWNoYXIgKmJ1ZikKPiArc3RhdGlj\n"
- "IHNzaXplX3QgbG05MF9zeXNmc19zaG93X3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCj4gKwkJc3Ry\n"
- "dWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LCBjaGFyICpidWYpCj4gICB7Cj4gICAJc3RydWN0\n"
- "IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKPiAgIAlyZXR1cm4gc3By\n"
- "aW50ZihidWYsICIlZFxuIiwgISEoY2xpZW50LT5mbGFncyAmIEkyQ19DTElFTlRfUEVDKSk7Cj4g\n"
- "ICB9Cj4KPiAtc3RhdGljIHNzaXplX3Qgc2V0X3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVj\n"
- "dCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKPiAtCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBz\n"
- "aXplX3QgY291bnQpCj4gK3N0YXRpYyBzc2l6ZV90IGxtOTBfc3lzZnNfc2V0X3BlYyhzdHJ1Y3Qg\n"
- "ZGV2aWNlICpkZXYsCj4gKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LCBjb25zdCBj\n"
- "aGFyICpidWYsIHNpemVfdCBjb3VudCkKPiAgIHsKPiAgIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xp\n"
- "ZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwo+ICAgCWxvbmcgdmFsOwo+IEBAIC0xMTgzLDcgKzEy\n"
- "NzAsOCBAQCBzdGF0aWMgc3NpemVfdCBzZXRfcGVjKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0\n"
- "IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAo+ICAgCXJldHVybiBjb3VudDsKPiAgIH0KPgo+IC1z\n"
- "dGF0aWMgREVWSUNFX0FUVFIocGVjLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wZWMsIHNldF9w\n"
- "ZWMpOwo+ICtzdGF0aWMgREVWSUNFX0FUVFIocGVjLCBTX0lXVVNSIHwgU19JUlVHTywKPiArCWxt\n"
- "OTBfc3lzZnNfc2hvd19wZWMsIGxtOTBfc3lzZnNfc2V0X3BlYyk7Cj4KPiAgIC8qCj4gICAgKiBS\n"
- "ZWFsIGNvZGUKPiBAQCAtMTQxMyw4ICsxNTAxLDkgQEAgc3RhdGljIHZvaWQgbG05MF9yZXN0b3Jl\n"
- "X2NvbmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxtOTBfZGF0YSAqZGF0YSkK\n"
- "PiAgIAkJCQkgIGRhdGEtPmNvbmZpZ19vcmlnKTsKPiAgIH0KPgo+IC1zdGF0aWMgdm9pZCBsbTkw\n"
- "X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBsbTkwX2RhdGEg\n"
- "KmRhdGEpCj4gK3N0YXRpYyB2b2lkIGxtOTBfaW5pdF9jbGllbnQoc3RydWN0IGxtOTBfZGF0YSAq\n"
- "ZGF0YSkKPiAgIHsKPiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7\n"
- "Cj4gICAJdTggY29uZmlnLCBjb252cmF0ZTsKPgo+ICAgCWlmIChsbTkwX3JlYWRfcmVnKGNsaWVu\n"
- "dCwgTE05MF9SRUdfUl9DT05WUkFURSwgJmNvbnZyYXRlKSA8IDApIHsKPiBAQCAtMTQyNiw3ICsx\n"
- "NTE1LDcgQEAgc3RhdGljIHZvaWQgbG05MF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAq\n"
- "Y2xpZW50LCBzdHJ1Y3QgbG05MF9kYXRhICpkYXRhKQo+ICAgCS8qCj4gICAJICogU3RhcnQgdGhl\n"
- "IGNvbnZlcnNpb25zLgo+ICAgCSAqLwo+IC0JbG05MF9zZXRfY29udnJhdGUoY2xpZW50LCBkYXRh\n"
- "LCA1MDApOwkvKiA1MDBtczsgMkh6IGNvbnZlcnNpb24gcmF0ZSAqLwo+ICsJbG05MF9zZXRfY29u\n"
- "dnJhdGVfbG9ja2VkKGRhdGEsIDUwMCk7ICAvKiA1MDBtcyAvIDJIeiAgKi8KPiAgIAlpZiAobG05\n"
- "MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfQ09ORklHMSwgJmNvbmZpZykgPCAwKSB7Cj4g\n"
- "ICAJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIkluaXRpYWxpemF0aW9uIGZhaWxlZCFcbiIpOwo+\n"
- "ICAgCQlyZXR1cm47Cj4gQEAgLTE1NTcsNyArMTY0Niw3IEBAIHN0YXRpYyBpbnQgbG05MF9wcm9i\n"
- "ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+ICAgCWRhdGEtPm1heF9jb252cmF0ZSA9IGxt\n"
- "OTBfcGFyYW1zW2RhdGEtPmtpbmRdLm1heF9jb252cmF0ZTsKPgo+ICAgCS8qIEluaXRpYWxpemUg\n"
- "dGhlIExNOTAgY2hpcCAqLwo+IC0JbG05MF9pbml0X2NsaWVudChjbGllbnQsIGRhdGEpOwo+ICsJ\n"
- "bG05MF9pbml0X2NsaWVudChkYXRhKTsKPgo+ICAgCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICov\n"
- "Cj4gICAJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX2dyb3VwOwo+CgoKX19fX19fX19f\n"
- "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5n\n"
- "IGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5v\n"
- cmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz
+ "On 01/21/2016 11:34 AM, St\303\251phan Kochen wrote:\n"
+ "> Add additional support functions `lm90_get_*` and `lm90_set_*` extracted\n"
+ "> from the sysfs routines. The sysfs routines are now just stubs wrapping\n"
+ "> the new support functions.\n"
+ ">\n"
+ "> This way we have a consistent register access interface, which can be\n"
+ "> used from other integrations down the line. To avoid confusion, all\n"
+ "> sysfs methods are now prefixed `lm90_sysfs_*`.\n"
+ ">\n"
+ "> To accomplish this, the `lm90_update_device` signature has changed and\n"
+ "> is now `lm90_update`, taking data directly. It no longer serves the\n"
+ "> dual purpose of update function *and* driver data getter.\n"
+ ">\n"
+ "> `lm90_set_convrate`, `lm90_select_remote_channel` and `lm90_init_client`\n"
+ "> also had redundant i2c client parameters, which have been removed.\n"
+ ">\n"
+ "> Signed-off-by: St\303\251phan Kochen <stephan-j6uo2F6POYhmR6Xm/wNWPw@public.gmane.org>\n"
+ "> ---\n"
+ ">   drivers/hwmon/lm90.c | 511 ++++++++++++++++++++++++++++++---------------------\n"
+ ">   1 file changed, 300 insertions(+), 211 deletions(-)\n"
+ ">\n"
+ "> diff --git a/drivers/hwmon/lm90.c b/drivers/hwmon/lm90.c\n"
+ "> index c9ff08d..88daf72 100644\n"
+ "> --- a/drivers/hwmon/lm90.c\n"
+ "> +++ b/drivers/hwmon/lm90.c\n"
+ "> @@ -473,10 +473,10 @@ static int lm90_read16(struct i2c_client *client, u8 regh, u8 regl, u16 *value)\n"
+ ">    * various registers have different meanings as a result of selecting a\n"
+ ">    * non-default remote channel.\n"
+ ">    */\n"
+ "> -static inline void lm90_select_remote_channel(struct i2c_client *client,\n"
+ "> -\t\t\t\t\t      struct lm90_data *data,\n"
+ "> -\t\t\t\t\t      int channel)\n"
+ "> +static inline void lm90_select_remote_channel(\n"
+ "> +\t\tstruct lm90_data *data, int channel)\n"
+ "\n"
+ "Very much personal preference here, unrelated change, and violates coding style.\n"
+ "\n"
+ "Please only one logical change per patch. If you think it is worthwhile to remove\n"
+ "the client argument, prepare a separate patch with only that change, and show\n"
+ "that it reduces code size. Also please make sure that your patch follows\n"
+ "coding style.\n"
+ "\n"
+ ">   {\n"
+ "> +\tstruct i2c_client *client = data->client;\n"
+ ">   \tu8 config;\n"
+ ">\n"
+ ">   \tif (data->kind == max6696) {\n"
+ "> @@ -490,32 +490,10 @@ static inline void lm90_select_remote_channel(struct i2c_client *client,\n"
+ ">   }\n"
+ ">\n"
+ ">   /*\n"
+ "> - * Set conversion rate.\n"
+ "> - * client->update_lock must be held when calling this function (unless we are\n"
+ "> - * in detection or initialization steps).\n"
+ "> + * Update all current register values\n"
+ ">    */\n"
+ "> -static void lm90_set_convrate(struct i2c_client *client, struct lm90_data *data,\n"
+ "> -\t\t\t      unsigned int interval)\n"
+ "> -{\n"
+ "> -\tint i;\n"
+ "> -\tunsigned int update_interval;\n"
+ "> -\n"
+ "> -\t/* Shift calculations to avoid rounding errors */\n"
+ "> -\tinterval <<= 6;\n"
+ "> -\n"
+ "> -\t/* find the nearest update rate */\n"
+ "> -\tfor (i = 0, update_interval = LM90_MAX_CONVRATE_MS << 6;\n"
+ "> -\t     i < data->max_convrate; i++, update_interval >>= 1)\n"
+ "> -\t\tif (interval >= update_interval * 3 / 4)\n"
+ "> -\t\t\tbreak;\n"
+ "> -\n"
+ "> -\ti2c_smbus_write_byte_data(client, LM90_REG_W_CONVRATE, i);\n"
+ "> -\tdata->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);\n"
+ "> -}\n"
+ "> -\n"
+ "> -static struct lm90_data *lm90_update_device(struct device *dev)\n"
+ "> +static void lm90_update(struct lm90_data *data)\n"
+ ">   {\n"
+ "> -\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ ">   \tstruct i2c_client *client = data->client;\n"
+ ">   \tunsigned long next_update;\n"
+ ">\n"
+ "> @@ -583,7 +561,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)\n"
+ ">   \t\tdata->alarms = alarms;\t/* save as 16 bit value */\n"
+ ">\n"
+ ">   \t\tif (data->kind == max6696) {\n"
+ "> -\t\t\tlm90_select_remote_channel(client, data, 1);\n"
+ "> +\t\t\tlm90_select_remote_channel(data, 1);\n"
+ ">   \t\t\tlm90_read_reg(client, LM90_REG_R_REMOTE_CRIT,\n"
+ ">   \t\t\t\t      &data->temp8[REMOTE2_CRIT]);\n"
+ ">   \t\t\tlm90_read_reg(client, MAX6659_REG_R_REMOTE_EMERG,\n"
+ "> @@ -595,7 +573,7 @@ static struct lm90_data *lm90_update_device(struct device *dev)\n"
+ ">   \t\t\t\tdata->temp11[REMOTE2_LOW] = h << 8;\n"
+ ">   \t\t\tif (!lm90_read_reg(client, LM90_REG_R_REMOTE_HIGHH, &h))\n"
+ ">   \t\t\t\tdata->temp11[REMOTE2_HIGH] = h << 8;\n"
+ "> -\t\t\tlm90_select_remote_channel(client, data, 0);\n"
+ "> +\t\t\tlm90_select_remote_channel(data, 0);\n"
+ ">\n"
+ ">   \t\t\tif (!lm90_read_reg(client, MAX6696_REG_R_STATUS2,\n"
+ ">   \t\t\t\t\t   &alarms))\n"
+ "> @@ -624,8 +602,6 @@ static struct lm90_data *lm90_update_device(struct device *dev)\n"
+ ">   \t}\n"
+ ">\n"
+ ">   \tmutex_unlock(&data->update_lock);\n"
+ "> -\n"
+ "> -\treturn data;\n"
+ ">   }\n"
+ ">\n"
+ ">   /*\n"
+ "> @@ -756,32 +732,31 @@ static u16 temp_to_u16_adt7461(struct lm90_data *data, long val)\n"
+ ">   }\n"
+ ">\n"
+ ">   /*\n"
+ "> - * Sysfs stuff\n"
+ "> + * Register accessors. Getters trigger an update. Setters have locked variants\n"
+ "> + * that require update_lock to be held.\n"
+ ">    */\n"
+ ">\n"
+ "> -static ssize_t show_temp8(struct device *dev, struct device_attribute *devattr,\n"
+ "> -\t\t\t  char *buf)\n"
+ "> +static int lm90_get_temp8(struct lm90_data *data, int index)\n"
+ ">   {\n"
+ "> -\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> -\tstruct lm90_data *data = lm90_update_device(dev);\n"
+ ">   \tint temp;\n"
+ ">\n"
+ "> +\tlm90_update(data);\n"
+ "> +\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ "> -\t\ttemp = temp_from_u8_adt7461(data, data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u8_adt7461(data, data->temp8[index]);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> -\t\ttemp = temp_from_u8(data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u8(data->temp8[index]);\n"
+ ">   \telse\n"
+ "> -\t\ttemp = temp_from_s8(data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_s8(data->temp8[index]);\n"
+ ">\n"
+ ">   \t/* +16 degrees offset for temp2 for the LM99 */\n"
+ "> -\tif (data->kind == lm99 && attr->index == 3)\n"
+ "> +\tif (data->kind == lm99 && index == 3)\n"
+ ">   \t\ttemp += 16000;\n"
+ ">\n"
+ "> -\treturn sprintf(buf, \"%d\\n\", temp);\n"
+ "> +\treturn temp;\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,\n"
+ "> -\t\t\t const char *buf, size_t count)\n"
+ "> +static void lm90_set_temp8_locked(struct lm90_data *data, int index, long val)\n"
+ ">   {\n"
+ ">   \tstatic const u8 reg[TEMP8_REG_NUM] = {\n"
+ ">   \t\tLM90_REG_W_LOCAL_LOW,\n"
+ "> @@ -794,90 +769,73 @@ static ssize_t set_temp8(struct device *dev, struct device_attribute *devattr,\n"
+ ">   \t\tMAX6659_REG_W_REMOTE_EMERG,\n"
+ ">   \t};\n"
+ ">\n"
+ "> -\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> -\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> -\tstruct i2c_client *client = data->client;\n"
+ "> -\tint nr = attr->index;\n"
+ "> -\tlong val;\n"
+ "> -\tint err;\n"
+ "> -\n"
+ "> -\terr = kstrtol(buf, 10, &val);\n"
+ "> -\tif (err < 0)\n"
+ "> -\t\treturn err;\n"
+ "> -\n"
+ ">   \t/* +16 degrees offset for temp2 for the LM99 */\n"
+ "> -\tif (data->kind == lm99 && attr->index == 3)\n"
+ "> +\tif (data->kind == lm99 && index == 3)\n"
+ ">   \t\tval -= 16000;\n"
+ ">\n"
+ "> -\tmutex_lock(&data->update_lock);\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ "> -\t\tdata->temp8[nr] = temp_to_u8_adt7461(data, val);\n"
+ "> +\t\tdata->temp8[index] = temp_to_u8_adt7461(data, val);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> -\t\tdata->temp8[nr] = temp_to_u8(val);\n"
+ "> +\t\tdata->temp8[index] = temp_to_u8(val);\n"
+ ">   \telse\n"
+ "> -\t\tdata->temp8[nr] = temp_to_s8(val);\n"
+ "> +\t\tdata->temp8[index] = temp_to_s8(val);\n"
+ ">\n"
+ "> -\tlm90_select_remote_channel(client, data, nr >= 6);\n"
+ "> -\ti2c_smbus_write_byte_data(client, reg[nr], data->temp8[nr]);\n"
+ "> -\tlm90_select_remote_channel(client, data, 0);\n"
+ "> +\tlm90_select_remote_channel(data, index >= 6);\n"
+ "> +\ti2c_smbus_write_byte_data(data->client, reg[index], data->temp8[index]);\n"
+ "> +\tlm90_select_remote_channel(data, 0);\n"
+ "> +}\n"
+ ">\n"
+ "> +static void lm90_set_temp8(struct lm90_data *data, int index, long val)\n"
+ "> +{\n"
+ "> +\tmutex_lock(&data->update_lock);\n"
+ "> +\tlm90_set_temp8_locked(data, index, val);\n"
+ ">   \tmutex_unlock(&data->update_lock);\n"
+ "> -\treturn count;\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t show_temp11(struct device *dev, struct device_attribute *devattr,\n"
+ "> -\t\t\t   char *buf)\n"
+ "> +static int lm90_get_temp11(struct lm90_data *data, int index)\n"
+ ">   {\n"
+ "> -\tstruct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);\n"
+ "> -\tstruct lm90_data *data = lm90_update_device(dev);\n"
+ ">   \tint temp;\n"
+ ">\n"
+ "> +\tlm90_update(data);\n"
+ "> +\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ "> -\t\ttemp = temp_from_u16_adt7461(data, data->temp11[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u16_adt7461(data, data->temp11[index]);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> -\t\ttemp = temp_from_u16(data->temp11[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u16(data->temp11[index]);\n"
+ ">   \telse\n"
+ "> -\t\ttemp = temp_from_s16(data->temp11[attr->index]);\n"
+ "> +\t\ttemp = temp_from_s16(data->temp11[index]);\n"
+ ">\n"
+ ">   \t/* +16 degrees offset for temp2 for the LM99 */\n"
+ "> -\tif (data->kind == lm99 &&  attr->index <= 2)\n"
+ "> +\tif (data->kind == lm99 && index <= 2)\n"
+ ">   \t\ttemp += 16000;\n"
+ ">\n"
+ "> -\treturn sprintf(buf, \"%d\\n\", temp);\n"
+ "> +\treturn temp;\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,\n"
+ "> -\t\t\t  const char *buf, size_t count)\n"
+ "> +static void lm90_set_temp11_locked(struct lm90_data *data, int index, long val)\n"
+ ">   {\n"
+ "> -\tstruct {\n"
+ "> -\t\tu8 high;\n"
+ "> -\t\tu8 low;\n"
+ "> -\t\tint channel;\n"
+ "> -\t} reg[5] = {\n"
+ "> -\t\t{ LM90_REG_W_REMOTE_LOWH, LM90_REG_W_REMOTE_LOWL, 0 },\n"
+ "> -\t\t{ LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 0 },\n"
+ "> -\t\t{ LM90_REG_W_REMOTE_OFFSH, LM90_REG_W_REMOTE_OFFSL, 0 },\n"
+ "> -\t\t{ LM90_REG_W_REMOTE_LOWH, LM90_REG_W_REMOTE_LOWL, 1 },\n"
+ "> -\t\t{ LM90_REG_W_REMOTE_HIGHH, LM90_REG_W_REMOTE_HIGHL, 1 }\n"
+ "> -\t};\n"
+ "\n"
+ "Another set of personal preference changes.\n"
+ "\n"
+ "> -\n"
+ "> -\tstruct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);\n"
+ "> -\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ ">   \tstruct i2c_client *client = data->client;\n"
+ "> -\tint nr = attr->nr;\n"
+ "> -\tint index = attr->index;\n"
+ "> -\tlong val;\n"
+ "> -\tint err;\n"
+ "> +\tu8 high, low, channel;\n"
+ ">\n"
+ "> -\terr = kstrtol(buf, 10, &val);\n"
+ "> -\tif (err < 0)\n"
+ "> -\t\treturn err;\n"
+ "> +#define SELECT_REGS(_reg, _channel) { \\\n"
+ "> +\thigh = LM90_REG_W_##_reg##H; \\\n"
+ "> +\tlow = LM90_REG_W_##_reg##L; \\\n"
+ "> +\tchannel = _channel; \\\n"
+ "> +}\n"
+ "\n"
+ "We have been trying to get rid of function defines such as this one.\n"
+ "Most of the time it increases code size, and reduces readability.\n"
+ "Plus, it increases the amount of time we have to spend reviewing\n"
+ "the code to ensure it is correct.\n"
+ "\n"
+ "> +\tswitch (index) {\n"
+ "> +\tcase REMOTE_LOW:    SELECT_REGS(REMOTE_LOW,  0); break;\n"
+ "> +\tcase REMOTE_HIGH:   SELECT_REGS(REMOTE_HIGH, 0); break;\n"
+ "> +\tcase REMOTE_OFFSET: SELECT_REGS(REMOTE_OFFS, 0); break;\n"
+ "> +\tcase REMOTE2_LOW:   SELECT_REGS(REMOTE_LOW,  1); break;\n"
+ "> +\tcase REMOTE2_HIGH:  SELECT_REGS(REMOTE_HIGH, 1); break;\n"
+ "> +\tdefault: return;\n"
+ "\n"
+ "... and, in this case, introduces checkpatch errors.\n"
+ "\n"
+ "This patch is clearly more than what its headline says. It is\n"
+ "too complex to review as single patch. Please split into\n"
+ "logical changes, and explain why you make those changes.\n"
+ "\n"
+ "Thanks,\n"
+ "Guenter\n"
+ "\n"
+ "\n"
+ "> +\t}\n"
+ "> +#undef SELECT_REGS\n"
+ ">\n"
+ ">   \t/* +16 degrees offset for temp2 for the LM99 */\n"
+ ">   \tif (data->kind == lm99 && index <= 2)\n"
+ ">   \t\tval -= 16000;\n"
+ ">\n"
+ "> -\tmutex_lock(&data->update_lock);\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ ">   \t\tdata->temp11[index] = temp_to_u16_adt7461(data, val);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> @@ -887,54 +845,46 @@ static ssize_t set_temp11(struct device *dev, struct device_attribute *devattr,\n"
+ ">   \telse\n"
+ ">   \t\tdata->temp11[index] = temp_to_s8(val) << 8;\n"
+ ">\n"
+ "> -\tlm90_select_remote_channel(client, data, reg[nr].channel);\n"
+ "> -\ti2c_smbus_write_byte_data(client, reg[nr].high,\n"
+ "> -\t\t\t\t  data->temp11[index] >> 8);\n"
+ "> +\tlm90_select_remote_channel(data, channel);\n"
+ "> +\ti2c_smbus_write_byte_data(client, high,\n"
+ "> +\t\t\tdata->temp11[index] >> 8);\n"
+ ">   \tif (data->flags & LM90_HAVE_REM_LIMIT_EXT)\n"
+ "> -\t\ti2c_smbus_write_byte_data(client, reg[nr].low,\n"
+ "> -\t\t\t\t\t  data->temp11[index] & 0xff);\n"
+ "> -\tlm90_select_remote_channel(client, data, 0);\n"
+ "> +\t\ti2c_smbus_write_byte_data(client, low,\n"
+ "> +\t\t\t\tdata->temp11[index] & 0xff);\n"
+ "> +\tlm90_select_remote_channel(data, 0);\n"
+ "> +}\n"
+ ">\n"
+ "> +static void lm90_set_temp11(struct lm90_data *data, int index, long val)\n"
+ "> +{\n"
+ "> +\tmutex_lock(&data->update_lock);\n"
+ "> +\tlm90_set_temp11_locked(data, index, val);\n"
+ ">   \tmutex_unlock(&data->update_lock);\n"
+ "> -\treturn count;\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t show_temphyst(struct device *dev,\n"
+ "> -\t\t\t     struct device_attribute *devattr,\n"
+ "> -\t\t\t     char *buf)\n"
+ "> +static ssize_t lm90_get_temphyst(struct lm90_data *data, int index)\n"
+ ">   {\n"
+ "> -\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> -\tstruct lm90_data *data = lm90_update_device(dev);\n"
+ ">   \tint temp;\n"
+ ">\n"
+ "> +\tlm90_update(data);\n"
+ "> +\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ "> -\t\ttemp = temp_from_u8_adt7461(data, data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u8_adt7461(data, data->temp8[index]);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> -\t\ttemp = temp_from_u8(data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_u8(data->temp8[index]);\n"
+ ">   \telse\n"
+ "> -\t\ttemp = temp_from_s8(data->temp8[attr->index]);\n"
+ "> +\t\ttemp = temp_from_s8(data->temp8[index]);\n"
+ ">\n"
+ ">   \t/* +16 degrees offset for temp2 for the LM99 */\n"
+ "> -\tif (data->kind == lm99 && attr->index == 3)\n"
+ "> +\tif (data->kind == lm99 && index == 3)\n"
+ ">   \t\ttemp += 16000;\n"
+ ">\n"
+ "> -\treturn sprintf(buf, \"%d\\n\", temp - temp_from_s8(data->temp_hyst));\n"
+ "> +\treturn temp - temp_from_s8(data->temp_hyst);\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t set_temphyst(struct device *dev, struct device_attribute *dummy,\n"
+ "> -\t\t\t    const char *buf, size_t count)\n"
+ "> +static void lm90_set_temphyst_locked(struct lm90_data *data, long val)\n"
+ ">   {\n"
+ "> -\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> -\tstruct i2c_client *client = data->client;\n"
+ "> -\tlong val;\n"
+ "> -\tint err;\n"
+ ">   \tint temp;\n"
+ ">\n"
+ "> -\terr = kstrtol(buf, 10, &val);\n"
+ "> -\tif (err < 0)\n"
+ "> -\t\treturn err;\n"
+ "> -\n"
+ "> -\tmutex_lock(&data->update_lock);\n"
+ ">   \tif (data->kind == adt7461 || data->kind == tmp451)\n"
+ ">   \t\ttemp = temp_from_u8_adt7461(data, data->temp8[LOCAL_CRIT]);\n"
+ ">   \telse if (data->kind == max6646)\n"
+ "> @@ -943,43 +893,167 @@ static ssize_t set_temphyst(struct device *dev, struct device_attribute *dummy,\n"
+ ">   \t\ttemp = temp_from_s8(data->temp8[LOCAL_CRIT]);\n"
+ ">\n"
+ ">   \tdata->temp_hyst = hyst_to_reg(temp - val);\n"
+ "> -\ti2c_smbus_write_byte_data(client, LM90_REG_W_TCRIT_HYST,\n"
+ "> -\t\t\t\t  data->temp_hyst);\n"
+ "> +\ti2c_smbus_write_byte_data(data->client, LM90_REG_W_TCRIT_HYST,\n"
+ "> +\t\t\tdata->temp_hyst);\n"
+ "> +}\n"
+ "> +\n"
+ "> +static void lm90_set_temphyst(struct lm90_data *data, long val)\n"
+ "> +{\n"
+ "> +\tmutex_lock(&data->update_lock);\n"
+ "> +\tlm90_set_temphyst_locked(data, val);\n"
+ "> +\tmutex_unlock(&data->update_lock);\n"
+ "> +}\n"
+ "> +\n"
+ "> +static void lm90_set_convrate_locked(struct lm90_data *data, unsigned int val)\n"
+ "> +{\n"
+ "> +\tint i;\n"
+ "> +\tunsigned int update_interval;\n"
+ "> +\n"
+ "> +\t/* Shift calculations to avoid rounding errors */\n"
+ "> +\tval <<= 6;\n"
+ "> +\n"
+ "> +\t/* find the nearest update rate */\n"
+ "> +\tfor (i = 0, update_interval = LM90_MAX_CONVRATE_MS << 6;\n"
+ "> +\t     i < data->max_convrate; i++, update_interval >>= 1)\n"
+ "> +\t\tif (val >= update_interval * 3 / 4)\n"
+ "> +\t\t\tbreak;\n"
+ "> +\n"
+ "> +\ti2c_smbus_write_byte_data(data->client, LM90_REG_W_CONVRATE, i);\n"
+ "> +\tdata->update_interval = DIV_ROUND_CLOSEST(update_interval, 64);\n"
+ "> +}\n"
+ "> +\n"
+ "> +static void lm90_set_convrate(struct lm90_data *data, unsigned int val)\n"
+ "> +{\n"
+ "> +\tmutex_lock(&data->update_lock);\n"
+ "> +\tlm90_set_convrate_locked(data, val);\n"
+ ">   \tmutex_unlock(&data->update_lock);\n"
+ "> +}\n"
+ "> +\n"
+ "> +/*\n"
+ "> + * Sysfs stuff\n"
+ "> + */\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_show_temp8(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tchar *buf)\n"
+ "> +{\n"
+ "> +\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\n"
+ "> +\treturn sprintf(buf, \"%d\\n\", lm90_get_temp8(data, attr->index));\n"
+ "> +}\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_set_temp8(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tconst char *buf, size_t count)\n"
+ "> +{\n"
+ "> +\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\tlong val;\n"
+ "> +\tint err;\n"
+ "> +\n"
+ "> +\terr = kstrtol(buf, 10, &val);\n"
+ "> +\tif (err < 0)\n"
+ "> +\t\treturn err;\n"
+ "> +\n"
+ "> +\tlm90_set_temp8(data, attr->index, val);\n"
+ "> +\n"
+ ">   \treturn count;\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t show_alarms(struct device *dev, struct device_attribute *dummy,\n"
+ "> -\t\t\t   char *buf)\n"
+ "> +static ssize_t lm90_sysfs_show_temp11(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tchar *buf)\n"
+ "> +{\n"
+ "> +\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\n"
+ "> +\treturn sprintf(buf, \"%d\\n\", lm90_get_temp11(data, attr->index));\n"
+ "> +}\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_set_temp11(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tconst char *buf, size_t count)\n"
+ ">   {\n"
+ "> -\tstruct lm90_data *data = lm90_update_device(dev);\n"
+ "> +\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\tlong val;\n"
+ "> +\tint err;\n"
+ "> +\n"
+ "> +\terr = kstrtol(buf, 10, &val);\n"
+ "> +\tif (err < 0)\n"
+ "> +\t\treturn err;\n"
+ "> +\n"
+ "> +\tlm90_set_temp11(data, attr->index, val);\n"
+ "> +\n"
+ "> +\treturn count;\n"
+ "> +}\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_show_temphyst(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tchar *buf)\n"
+ "> +{\n"
+ "> +\tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\n"
+ "> +\treturn sprintf(buf, \"%d\\n\", lm90_get_temphyst(data, attr->index));\n"
+ "> +}\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_set_temphyst(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *dummy,\n"
+ "> +\t\tconst char *buf, size_t count)\n"
+ "> +{\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\tlong val;\n"
+ "> +\tint err;\n"
+ "> +\n"
+ "> +\terr = kstrtol(buf, 10, &val);\n"
+ "> +\tif (err < 0)\n"
+ "> +\t\treturn err;\n"
+ "> +\n"
+ "> +\tlm90_set_temphyst(data, val);\n"
+ "> +\n"
+ "> +\treturn count;\n"
+ "> +}\n"
+ "> +\n"
+ "> +static ssize_t lm90_sysfs_show_alarms(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *dummy,\n"
+ "> +\t\tchar *buf)\n"
+ "> +{\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> +\n"
+ "> +\tlm90_update(data);\n"
+ "> +\n"
+ ">   \treturn sprintf(buf, \"%d\\n\", data->alarms);\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t show_alarm(struct device *dev, struct device_attribute\n"
+ "> -\t\t\t  *devattr, char *buf)\n"
+ "> +static ssize_t lm90_sysfs_show_alarm(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *devattr,\n"
+ "> +\t\tchar *buf)\n"
+ ">   {\n"
+ ">   \tstruct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);\n"
+ "> -\tstruct lm90_data *data = lm90_update_device(dev);\n"
+ "> +\tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ ">   \tint bitnr = attr->index;\n"
+ ">\n"
+ "> +\tlm90_update(data);\n"
+ "> +\n"
+ ">   \treturn sprintf(buf, \"%d\\n\", (data->alarms >> bitnr) & 1);\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t show_update_interval(struct device *dev,\n"
+ "> -\t\t\t\t    struct device_attribute *attr, char *buf)\n"
+ "> +static ssize_t lm90_sysfs_show_update_interval(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *attr,\n"
+ "> +\t\tchar *buf)\n"
+ ">   {\n"
+ ">   \tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ ">\n"
+ ">   \treturn sprintf(buf, \"%u\\n\", data->update_interval);\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t set_update_interval(struct device *dev,\n"
+ "> -\t\t\t\t   struct device_attribute *attr,\n"
+ "> -\t\t\t\t   const char *buf, size_t count)\n"
+ "> +static ssize_t lm90_sysfs_set_update_interval(\n"
+ "> +\t\tstruct device *dev, struct device_attribute *attr,\n"
+ "> +\t\tconst char *buf, size_t count)\n"
+ ">   {\n"
+ ">   \tstruct lm90_data *data = dev_get_drvdata(dev);\n"
+ "> -\tstruct i2c_client *client = data->client;\n"
+ ">   \tunsigned long val;\n"
+ ">   \tint err;\n"
+ ">\n"
+ "> @@ -987,49 +1061,55 @@ static ssize_t set_update_interval(struct device *dev,\n"
+ ">   \tif (err)\n"
+ ">   \t\treturn err;\n"
+ ">\n"
+ "> -\tmutex_lock(&data->update_lock);\n"
+ "> -\tlm90_set_convrate(client, data, clamp_val(val, 0, 100000));\n"
+ "> -\tmutex_unlock(&data->update_lock);\n"
+ "> +\tlm90_set_convrate(data, clamp_val(val, 0, 100000));\n"
+ ">\n"
+ ">   \treturn count;\n"
+ ">   }\n"
+ ">\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp1_input, S_IRUGO, show_temp11, NULL,\n"
+ "> -\t0, LOCAL_TEMP);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp2_input, S_IRUGO, show_temp11, NULL,\n"
+ "> -\t0, REMOTE_TEMP);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, LOCAL_LOW);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp2_min, S_IWUSR | S_IRUGO, show_temp11,\n"
+ "> -\tset_temp11, 0, REMOTE_LOW);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, LOCAL_HIGH);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp2_max, S_IWUSR | S_IRUGO, show_temp11,\n"
+ "> -\tset_temp11, 1, REMOTE_HIGH);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, LOCAL_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, REMOTE_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, show_temphyst,\n"
+ "> -\tset_temphyst, LOCAL_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, show_temphyst, NULL,\n"
+ "> -\tREMOTE_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp2_offset, S_IWUSR | S_IRUGO, show_temp11,\n"
+ "> -\tset_temp11, 2, REMOTE_OFFSET);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, NULL, LOCAL_TEMP);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, NULL, REMOTE_TEMP);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_LOW);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_min, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_LOW);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_HIGH);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_max, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_HIGH);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_crit, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, lm90_sysfs_set_temphyst, LOCAL_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, NULL, REMOTE_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_offset, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE_OFFSET);\n"
+ ">\n"
+ ">   /* Individual alarm files */\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL, 0);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO, show_alarm, NULL, 1);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO, show_alarm, NULL, 2);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO, show_alarm, NULL, 3);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO, show_alarm, NULL, 4);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO, show_alarm, NULL, 5);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO, show_alarm, NULL, 6);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_crit_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 0);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_crit_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 1);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_fault, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 2);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_min_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 3);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_max_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 4);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_min_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 5);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_max_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 6);\n"
+ ">   /* Raw alarm file for compatibility */\n"
+ "> -static DEVICE_ATTR(alarms, S_IRUGO, show_alarms, NULL);\n"
+ "> +static DEVICE_ATTR(alarms, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarms, NULL);\n"
+ ">\n"
+ "> -static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR, show_update_interval,\n"
+ "> -\t\t   set_update_interval);\n"
+ "> +static DEVICE_ATTR(update_interval, S_IRUGO | S_IWUSR,\n"
+ "> +\tlm90_sysfs_show_update_interval, lm90_sysfs_set_update_interval);\n"
+ ">\n"
+ ">   static struct attribute *lm90_attributes[] = {\n"
+ ">   \t&sensor_dev_attr_temp1_input.dev_attr.attr,\n"
+ "> @@ -1071,14 +1151,14 @@ static const struct attribute_group lm90_temp2_offset_group = {\n"
+ ">   /*\n"
+ ">    * Additional attributes for devices with emergency sensors\n"
+ ">    */\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_emergency, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, LOCAL_EMERG);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_emergency, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, REMOTE_EMERG);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_emergency_hyst, S_IRUGO, show_temphyst,\n"
+ "> -\t\t\t  NULL, LOCAL_EMERG);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_emergency_hyst, S_IRUGO, show_temphyst,\n"
+ "> -\t\t\t  NULL, REMOTE_EMERG);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_emergency, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, LOCAL_EMERG);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_emergency, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE_EMERG);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_emergency_hyst, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, NULL, LOCAL_EMERG);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_emergency_hyst, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, NULL, REMOTE_EMERG);\n"
+ ">\n"
+ ">   static struct attribute *lm90_emergency_attributes[] = {\n"
+ ">   \t&sensor_dev_attr_temp1_emergency.dev_attr.attr,\n"
+ "> @@ -1092,8 +1172,10 @@ static const struct attribute_group lm90_emergency_group = {\n"
+ ">   \t.attrs = lm90_emergency_attributes,\n"
+ ">   };\n"
+ ">\n"
+ "> -static SENSOR_DEVICE_ATTR(temp1_emergency_alarm, S_IRUGO, show_alarm, NULL, 15);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp2_emergency_alarm, S_IRUGO, show_alarm, NULL, 13);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp1_emergency_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 15);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp2_emergency_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 13);\n"
+ ">\n"
+ ">   static struct attribute *lm90_emergency_alarm_attributes[] = {\n"
+ ">   \t&sensor_dev_attr_temp1_emergency_alarm.dev_attr.attr,\n"
+ "> @@ -1108,26 +1190,31 @@ static const struct attribute_group lm90_emergency_alarm_group = {\n"
+ ">   /*\n"
+ ">    * Additional attributes for devices with 3 temperature sensors\n"
+ ">    */\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp3_input, S_IRUGO, show_temp11, NULL,\n"
+ "> -\t0, REMOTE2_TEMP);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp3_min, S_IWUSR | S_IRUGO, show_temp11,\n"
+ "> -\tset_temp11, 3, REMOTE2_LOW);\n"
+ "> -static SENSOR_DEVICE_ATTR_2(temp3_max, S_IWUSR | S_IRUGO, show_temp11,\n"
+ "> -\tset_temp11, 4, REMOTE2_HIGH);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_crit, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, REMOTE2_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, show_temphyst, NULL,\n"
+ "> -\tREMOTE2_CRIT);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_emergency, S_IWUSR | S_IRUGO, show_temp8,\n"
+ "> -\tset_temp8, REMOTE2_EMERG);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_emergency_hyst, S_IRUGO, show_temphyst,\n"
+ "> -\t\t\t  NULL, REMOTE2_EMERG);\n"
+ "> -\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO, show_alarm, NULL, 9);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO, show_alarm, NULL, 10);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO, show_alarm, NULL, 11);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO, show_alarm, NULL, 12);\n"
+ "> -static SENSOR_DEVICE_ATTR(temp3_emergency_alarm, S_IRUGO, show_alarm, NULL, 14);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, NULL, REMOTE2_TEMP);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_min, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE2_LOW);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_max, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp11, lm90_sysfs_set_temp11, REMOTE2_HIGH);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_crit, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE2_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, NULL, REMOTE2_CRIT);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_emergency, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temp8, lm90_sysfs_set_temp8, REMOTE2_EMERG);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_emergency_hyst, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_temphyst, NULL, REMOTE2_EMERG);\n"
+ "> +\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_crit_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 9);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_fault, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 10);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_min_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 11);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_max_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 12);\n"
+ "> +static SENSOR_DEVICE_ATTR(temp3_emergency_alarm, S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_alarm, NULL, 14);\n"
+ ">\n"
+ ">   static struct attribute *lm90_temp3_attributes[] = {\n"
+ ">   \t&sensor_dev_attr_temp3_input.dev_attr.attr,\n"
+ "> @@ -1151,15 +1238,15 @@ static const struct attribute_group lm90_temp3_group = {\n"
+ ">   };\n"
+ ">\n"
+ ">   /* pec used for ADM1032 only */\n"
+ "> -static ssize_t show_pec(struct device *dev, struct device_attribute *dummy,\n"
+ "> -\t\t\tchar *buf)\n"
+ "> +static ssize_t lm90_sysfs_show_pec(struct device *dev,\n"
+ "> +\t\tstruct device_attribute *dummy, char *buf)\n"
+ ">   {\n"
+ ">   \tstruct i2c_client *client = to_i2c_client(dev);\n"
+ ">   \treturn sprintf(buf, \"%d\\n\", !!(client->flags & I2C_CLIENT_PEC));\n"
+ ">   }\n"
+ ">\n"
+ "> -static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,\n"
+ "> -\t\t       const char *buf, size_t count)\n"
+ "> +static ssize_t lm90_sysfs_set_pec(struct device *dev,\n"
+ "> +\t\tstruct device_attribute *dummy, const char *buf, size_t count)\n"
+ ">   {\n"
+ ">   \tstruct i2c_client *client = to_i2c_client(dev);\n"
+ ">   \tlong val;\n"
+ "> @@ -1183,7 +1270,8 @@ static ssize_t set_pec(struct device *dev, struct device_attribute *dummy,\n"
+ ">   \treturn count;\n"
+ ">   }\n"
+ ">\n"
+ "> -static DEVICE_ATTR(pec, S_IWUSR | S_IRUGO, show_pec, set_pec);\n"
+ "> +static DEVICE_ATTR(pec, S_IWUSR | S_IRUGO,\n"
+ "> +\tlm90_sysfs_show_pec, lm90_sysfs_set_pec);\n"
+ ">\n"
+ ">   /*\n"
+ ">    * Real code\n"
+ "> @@ -1413,8 +1501,9 @@ static void lm90_restore_conf(struct i2c_client *client, struct lm90_data *data)\n"
+ ">   \t\t\t\t  data->config_orig);\n"
+ ">   }\n"
+ ">\n"
+ "> -static void lm90_init_client(struct i2c_client *client, struct lm90_data *data)\n"
+ "> +static void lm90_init_client(struct lm90_data *data)\n"
+ ">   {\n"
+ "> +\tstruct i2c_client *client = data->client;\n"
+ ">   \tu8 config, convrate;\n"
+ ">\n"
+ ">   \tif (lm90_read_reg(client, LM90_REG_R_CONVRATE, &convrate) < 0) {\n"
+ "> @@ -1426,7 +1515,7 @@ static void lm90_init_client(struct i2c_client *client, struct lm90_data *data)\n"
+ ">   \t/*\n"
+ ">   \t * Start the conversions.\n"
+ ">   \t */\n"
+ "> -\tlm90_set_convrate(client, data, 500);\t/* 500ms; 2Hz conversion rate */\n"
+ "> +\tlm90_set_convrate_locked(data, 500);  /* 500ms / 2Hz  */\n"
+ ">   \tif (lm90_read_reg(client, LM90_REG_R_CONFIG1, &config) < 0) {\n"
+ ">   \t\tdev_warn(&client->dev, \"Initialization failed!\\n\");\n"
+ ">   \t\treturn;\n"
+ "> @@ -1557,7 +1646,7 @@ static int lm90_probe(struct i2c_client *client,\n"
+ ">   \tdata->max_convrate = lm90_params[data->kind].max_convrate;\n"
+ ">\n"
+ ">   \t/* Initialize the LM90 chip */\n"
+ "> -\tlm90_init_client(client, data);\n"
+ "> +\tlm90_init_client(data);\n"
+ ">\n"
+ ">   \t/* Register sysfs hooks */\n"
+ ">   \tdata->groups[groups++] = &lm90_group;\n"
+ ">\n"
+ "\n"
+ "--\n"
+ "To unsubscribe from this list: send the line \"unsubscribe devicetree\" in\n"
+ "the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org\n"
+ More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
-17bbab688bbb3bd82ef32639058aa910691e08a442b04664582104f19f30fab8
+5fab6784b08fa91530521b9770c7e87a3d1190bc8f1656705f56817c625f960a

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.