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.