diff for duplicates of <53A12F37.8020206@gmail.com> diff --git a/a/1.txt b/N1/1.txt index 151c06b..777f310 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,233 +1,368 @@ -T24gMDYvMTgvMjAxNCAxMTo0MiBBTSwgR3VlbnRlciBSb2VjayB3cm90ZToKPiBPbiAwNi8xNy8y -MDE0IDEwOjQ2IFBNLCBWYXJrYSBCaGFkcmFtIHdyb3RlOgo+PiBIaSwKPj4KPj4gT24gMDYvMTgv -MjAxNCAxMTowNyBBTSwgSGVpa28gU2Nob2NoZXIgd3JvdGU6Cj4+PiBEcml2ZXIgZm9yIHRoZSBU -SSBUTVAxMDMuCj4+Pgo+Pj4gVGhlIFRJIFRNUDEwMyBpcyBzaW1pbGFyIHRvIHRoZSBUTVAxMDIu -ICBJdCBkaWZmZXJzIGZyb20gdGhlIFRNUDEwMgo+Pj4gYnkgaGF2aW5nIG9ubHkgOCBiaXQgcmVn -aXN0ZXJzLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRl -Pgo+Pj4KPj4+IC0tLQo+Pj4KPj4+IENjOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9y -Zz4KPj4+IENjOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+Cj4+PiBDYzogbGlu -dXgta2VybmVsQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IGRldmljZXRyZWVAdmdlci5rZXJuZWwu -b3JnCj4+PiBDYzogbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IE1hcmsgUnV0bGFu -ZCA8bWFyay5ydXRsYW5kQGFybS5jb20+Cj4+Pgo+Pj4gLSBjaGFuZ2UgZm9yIHYyOgo+Pj4gICAg -LSBhZGQgY29tbWVudHMgZnJvbSBHdWVudGVyUm9lY2s6Cj4+PiAgICAgIC0gcmVtb3ZlIENjIGZy -b20gY29tbWl0IHN1YmplY3QKPj4+ICAgICAgLSBhZGQgZGV2aWNldHJlZSBtYWludGFpbmVyCj4+ -PiAgICAgIC0gbW92ZSBEb2N1bWVudGF0aW9uIHRvIERvY3VtZW50YXRpb24vaHdtb24vdG1wMTAz -Cj4+PiAgICAgIC0gcmVtb3ZlIGRldmljZXRyZWUgYmluZGluZ3MgZnJvbSBEb2N1bWVudGF0aW9u -Cj4+PiAgICAgIC0gYWRkIGNvbXBhdGlibGUgc3RyaW5nIHRvCj4+PiAiRG9jdW1lbnRhdGlvbi9k -ZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0Igo+Pj4gICAgICAtIHJl -bW92ZSBDYW1lbENhc2UKPj4+ICAgICAgLSBmaXggQ29kaW5nc3R5bGUgaXNzdWVzCj4+PiAgICAg -IC0gdXNlIEFUVFJJQlVURV9HUk9VUFMgYW5kIAo+Pj4gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0 -ZXJfd2l0aF9ncm91cHMoKQo+Pj4gICAgICAtIHJlbW92ZSB1bnN1c2VkIGRlZmluZSBUTVAxMDNf -Q09ORklHX1JEX09OTFkKPj4+ICAgICAgLSByZXN0b3JlIGNvbmZpZyByZWdpc3RlciB3aGVuIGV4 -aXQoKQo+Pj4gICAgICAtIHVzZSByZWdtYXAKPj4+IC0gY2hhbmdlcyBmb3IgdjM6Cj4+PiAgICBh -Z2FpbiBhIGxvdCBvZiBmYW50YXN0aWMgdGlwcyBob3cgdG8gdXNlIHJlZ21hcCBlZmZpY2llbnRs -eQo+Pj4gICAgZnJvbSBHdWVudGVyIFJvZWNrOgo+Pj4gICAgLSBnZXQgcmlkIG9mICJzdHJ1Y3Qg -dG1wMTAzIgo+Pj4gICAgLSBnZXQgcmlkIG9mICJzdGF0aWMgY29uc3QgdTggdG1wMTAzX3JlZ1td -Igo+Pj4gICAgLSBnZXQgcmlkIG9mIG11dGV4IGxvY2sKPj4+ICAgIC0gZHJvcCBjb25maWdfb3Jp -ZyBlbnRpcmVseQo+Pj4gICAgLSB1c2UgcmVnbWFwX3VwZGF0ZV9iaXRzKCkKPj4+IC0gY2hhbmdl -cyBmb3IgdjQ6Cj4+PiAgICAtIGFkZCBjb21tZW50IGZyb20gR3VlbnRlciBSb2VjazoKPj4+ICAg -ICAgZGVmaW5lIFRNUDEwM19DT05GSUdfTUFTSyBhbmQgVE1QMTAzX0NPTkZfU0RfTUFTSwo+Pj4g -ICAgICBzZXBhcmF0ZWx5IHRvIGVuc3VyZSB5b3UgY2F0Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVk -IGJpdHMuCj4+PiAtIGNoYW5nZXMgZm9yIHY1Ogo+Pj4gICAgYWRkIGNvbW1lbnQgZnJvbSBHdWVu -dGVyIFJvZWNrOgo+Pj4gICAgLSB1c2UgIiNkZWZpbmUgVE1QMTAzX0NPTkZfU0QgVE1QMTAzX0NP -TkZfTTEiCj4+PiAgICBhZGQgY29tbWVudCBmcm9tIE1hcmsgUnV0bGFuZDoKPj4+ICAgIC0gdXNl -IGZ1bGwgc3RyaW5nIGZvciBEVCBjb21wYXRpYmxlIHN0cmluZyBtYXRjaGluZywgaW5zdGVhZCBv -Zgo+Pj4gICAgICBEUklWRVJfTkFNRS4gR2V0IHJpZCBjb21wbGV0ZSBvZiBEUklWRVJfTkFNRSBk -ZWZpbmUuCj4+Pgo+Pj4gICAuLi4vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZp -Y2VzLnR4dCAgICB8ICAgMSArCj4+PiAgIERvY3VtZW50YXRpb24vaHdtb24vdG1wMTAzICAgICAg -ICAgICAgICAgICAgICAgICAgIHwgIDI4ICsrKwo+Pj4gICBkcml2ZXJzL2h3bW9uL0tjb25maWcg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMCArCj4+PiAgIGRyaXZlcnMvaHdtb24v -TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPj4+ICAgZHJpdmVy -cy9od21vbi90bXAxMDMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUgCj4+PiAr -KysrKysrKysrKysrKysrKysrKysKPj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCAyNDUgaW5zZXJ0aW9u -cygrKQo+Pj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMK -Pj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4+Cj4+PiBk -aWZmIC0tZ2l0IAo+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3Ry -aXZpYWwtZGV2aWNlcy50eHQgCj4+PiBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5n -cy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAo+Pj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2 -NDQKPj4+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlh -bC1kZXZpY2VzLnR4dAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdz -L2kyYy90cml2aWFsLWRldmljZXMudHh0Cj4+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgw -ICAgICAgICBNNDFUODAgLSBTRVJJQUwgQUNDRVNTIFJUQyBXSVRIIAo+Pj4gQUxBUk1TCj4+PiAg -IHRhb3MsdHNsMjU1MCAgICAgICAgQW1iaWVudCBMaWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28g -V2lyZSAKPj4+IFNlcmlhbCBJbnRlcmZhY2UKPj4+ICAgdGksdHNjMjAwMyAgICAgICAgSTJDIFRv -dWNoLVNjcmVlbiBDb250cm9sbGVyCj4+PiAgIHRpLHRtcDEwMiAgICAgICAgTG93IFBvd2VyIERp -Z2l0YWwgVGVtcGVyYXR1cmUgU2Vuc29yIHdpdGggCj4+PiBTTUJVUy9Ud28gV2lyZSBTZXJpYWwg -SW50ZXJmYWNlCj4+PiArdGksdG1wMTAzICAgICAgICBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJh -dHVyZSBTZW5zb3Igd2l0aCAKPj4+IFNNQlVTL1R3byBXaXJlIFNlcmlhbCBJbnRlcmZhY2UKTWF5 -IGkga25vdyBhYm91dCB0aGlzIGJpbmRpbmcgY29tcGF0aWJsZSBwcm9wZXJ0eSA/Cj4+PiAgIHRp -LHRtcDI3NSAgICAgICAgRGlnaXRhbCBUZW1wZXJhdHVyZSBTZW5zb3IKPj4+ICAgd2luYm9uZCx3 -cGN0MzAxICAgICAgICBpMmMgdHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUgKFRQTSkKPj4+IGRpZmYg -LS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMyBiL0RvY3VtZW50YXRpb24vaHdtb24v -dG1wMTAzCj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZWMwMGEx -NQo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMK -Pj4+IEBAIC0wLDAgKzEsMjggQEAKPj4+ICtLZXJuZWwgZHJpdmVyIHRtcDEwMwo+Pj4gKz09PT09 -PT09PT09PT09PT09PT09Cj4+PiArCj4+PiArU3VwcG9ydGVkIGNoaXBzOgo+Pj4gKyAgKiBUZXhh -cyBJbnN0cnVtZW50cyBUTVAxMDMKPj4+ICsgICAgUHJlZml4OiAndG1wMTAzJwo+Pj4gKyAgICBB -ZGRyZXNzZXMgc2Nhbm5lZDogbm9uZQo+Pj4gKyAgICBQcm9kdWN0IGluZm8gYW5kIGRhdGFzaGVl -dDogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC90bXAxMDMKPj4+ICsKPj4+ICtBdXRob3I6Cj4+ -PiArICAgIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKwo+Pj4gK0Rlc2NyaXB0aW9u -Cj4+PiArLS0tLS0tLS0tLS0KPj4+ICsKPj4+ICtUaGUgVE1QMTAzIGlzIGEgZGlnaXRhbCBvdXRw -dXQgdGVtcGVyYXR1cmUgc2Vuc29yIGluIGEgZm91ci1iYWxsCj4+PiArd2FmZXIgY2hpcC1zY2Fs -ZSBwYWNrYWdlIChXQ1NQKS4gVGhlIFRNUDEwMyBpcyBjYXBhYmxlIG9mIHJlYWRpbmcKPj4+ICt0 -ZW1wZXJhdHVyZXMgdG8gYSByZXNvbHV0aW9uIG9mIDHCsEMuIFRoZSBUTVAxMDMgaXMgc3BlY2lm -aWVkIGZvcgo+Pj4gK29wZXJhdGlvbiBvdmVyIGEgdGVtcGVyYXR1cmUgcmFuZ2Ugb2Yg4oCTNDDC -sEMgdG8gKzEyNcKwQy4KPj4+ICsKPj4+ICtSZXNvbHV0aW9uOiA4IEJpdHMKPj4+ICtBY2N1cmFj -eTogwrExwrBDIFR5cCAo4oCTMTDCsEMgdG8gKzEwMMKwQykKPj4+ICsKPj4+ICtUaGUgZHJpdmVy -IHByb3ZpZGVzIHRoZSBjb21tb24gc3lzZnMtaW50ZXJmYWNlIGZvciB0ZW1wZXJhdHVyZXMgKHNl -ZQo+Pj4gK0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIHVuZGVyIFRlbXBlcmF0 -dXJlcykuCj4+PiArCj4+PiArUGxlYXNlIHJlZmVyIGhvdyB0byBpbnN0YW50aWF0ZSB0aGlzIGRy -aXZlcjoKPj4+ICtEb2N1bWVudGF0aW9uL2kyYy9pbnN0YW50aWF0aW5nLWRldmljZXMKPj4+IGRp -ZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcK -Pj4+IGluZGV4IDA4NTMxYTEuLmM4ODJkNGIgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2h3bW9u -L0tjb25maWcKPj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+Pj4gQEAgLTEzOTEsNiAr -MTM5MSwxNiBAQCBjb25maWcgU0VOU09SU19UTVAxMDIKPj4+ICAgICAgICAgVGhpcyBkcml2ZXIg -Y2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQo+Pj4gICAg -ICAgICB3aWxsIGJlIGNhbGxlZCB0bXAxMDIuCj4+PiArY29uZmlnIFNFTlNPUlNfVE1QMTAzCj4+ -PiArICAgIHRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMiCj4+PiArICAgIGRlcGVu -ZHMgb24gSTJDCj4+PiArICAgIGhlbHAKPj4+ICsgICAgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlv -dSBnZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+PiArICAgICAgc2Vu -c29yIGNoaXBzLgo+Pj4gKwo+Pj4gKyAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0 -IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKPj4+ICsgICAgICB3aWxsIGJlIGNhbGxl -ZCB0bXAxMDMuCj4+PiArCj4+PiAgIGNvbmZpZyBTRU5TT1JTX1RNUDQwMQo+Pj4gICAgICAgdHJp -c3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRNUDQwMSBhbmQgY29tcGF0aWJsZXMiCj4+PiAgICAg -ICBkZXBlbmRzIG9uIEkyQwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUg -Yi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+PiBpbmRleCAzZGMwZjAyLi5jYzBkZjFlZiAxMDA2 -NDQKPj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4+ICsrKyBiL2RyaXZlcnMvaHdt -b24vTWFrZWZpbGUKPj4+IEBAIC0xMzUsNiArMTM1LDcgQEAgb2JqLSQoQ09ORklHX1NFTlNPUlNf -U01TQzQ3TTE5MikrPSBzbXNjNDdtMTkyLm8KPj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfQU1D -NjgyMSkgICAgKz0gYW1jNjgyMS5vCj4+PiAgIG9iai0kKENPTkZJR19TRU5TT1JTX1RITUM1MCkg -ICAgKz0gdGhtYzUwLm8KPj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QMTAyKSAgICArPSB0 -bXAxMDIubwo+Pj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEwMykgICAgKz0gdG1wMTAzLm8K -Pj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDAxKSAgICArPSB0bXA0MDEubwo+Pj4gICBv -YmotJChDT05GSUdfU0VOU09SU19UTVA0MjEpICAgICs9IHRtcDQyMS5vCj4+PiAgIG9iai0kKENP -TkZJR19TRU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMtaHdtb24ubwo+Pj4gZGlm -ZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5j -Cj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZTY5ZGJjYQo+Pj4g -LS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy9od21vbi90bXAxMDMuYwo+Pj4gQEAgLTAs -MCArMSwyMDUgQEAKPj4+ICsvKgo+Pj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMyBTTUJ1 -cyB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCj4+PiArICogQ29weXJpZ2h0IChDKSAyMDE0IEhl -aWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKyAqCj4+PiArICogQmFzZWQgb246Cj4+PiAr -ICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2 -ZXIKPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxMCBTdGV2ZW4gS2luZyA8c2ZraW5n -QGZkd2RjLmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl -OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCj4+PiBtb2RpZnkKPj4+ICsgKiBpdCB1 -bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAo+Pj4g -cHVibGlzaGVkIGJ5Cj4+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy -IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFu -eSBsYXRlciB2ZXJzaW9uLgo+Pj4gKyAqCj4+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 -dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+PiArICogYnV0IFdJVEhP -VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPj4+ -ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu -ICBTZWUgdGhlCj4+PiArICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 -YWlscy4KPj4+ICsgKgo+Pj4gKyAqLwo+Pj4gKwo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu -aD4KPj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFi -Lmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9od21v -bi5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgo+Pj4gKyNpbmNsdWRlIDxs -aW51eC9lcnIuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPj4+ICsjaW5jbHVkZSA8 -bGludXgvZGV2aWNlLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KPj4+ICsjaW5j -bHVkZSA8bGludXgvcmVnbWFwLmg+Cj4+PiArCj4+PiArI2RlZmluZSBUTVAxMDNfVEVNUF9SRUcg -ICAgICAgIDB4MDAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX1JFRyAgICAgICAgMHgwMQo+Pj4g -KyNkZWZpbmUgVE1QMTAzX1RMT1dfUkVHICAgICAgICAweDAyCj4+PiArI2RlZmluZSBUTVAxMDNf -VEhJR0hfUkVHICAgIDB4MDMKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX00wICAgICAg -ICAweDAxCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9NMSAgICAgICAgMHgwMgo+Pj4gKyNkZWZp -bmUgVE1QMTAzX0NPTkZfTEMgICAgICAgIDB4MDQKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0ZM -ICAgICAgICAweDA4Cj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9GSCAgICAgICAgMHgxMAo+Pj4g -KyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwICAgICAgICAweDIwCj4+PiArI2RlZmluZSBUTVAxMDNf -Q09ORl9DUjEgICAgICAgIDB4NDAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0lEICAgICAgICAw -eDgwCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAgICAgICAgKFRNUDEwM19DT05GX00xKQo+ -Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfU0RfTUFTSyAgICAoVE1QMTAzX0NPTkZfTTAgfCBUTVAx -MDNfQ09ORl9NMSkKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUcgICAgICAgIChUTVAx -MDNfQ09ORl9DUjEgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUdf -TUFTSyAgICAoVE1QMTAzX0NPTkZfQ1IwIHwgVE1QMTAzX0NPTkZfQ1IxIHwgXAo+Pj4gKyAgICAg -ICAgICAgICAgICAgVE1QMTAzX0NPTkZfTTAgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsKPj4+ICtz -dGF0aWMgaW5saW5lIGludCB0bXAxMDNfcmVnX3RvX21jKHM4IHZhbCkKPj4+ICt7Cj4+PiArICAg -IHJldHVybiB2YWwgKiAxMDAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW5saW5lIHU4IHRt -cDEwM19tY190b19yZWcoaW50IHZhbCkKPj4+ICt7Cj4+PiArICAgIHJldHVybiBESVZfUk9VTkRf -Q0xPU0VTVCh2YWwsIDEwMDApOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAx -MDNfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgc3Ry -dWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+PiArICAgICAgICAgICAgICAgIGNoYXIgKmJ1 -ZikKPj4+ICt7Cj4+PiArICAgIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2RhID0g -dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+Pj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAg -PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4+ICsgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPj4+ -ICsgICAgaW50IHJldDsKPj4+ICsKPj4+ICsgICAgcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBz -ZGEtPmluZGV4LCAmcmVndmFsKTsKPj4+ICsgICAgaWYgKHJldCA8IDApCj4+PiArICAgICAgICBy -ZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKyAgICByZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1w -MTAzX3JlZ190b19tYyhyZWd2YWwpKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHNzaXplX3Qg -dG1wMTAzX3NldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAg -ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+PiArICAgICAgICAgICAgICAgICAg -IGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+Pj4gK3sKPj4+ICsgICAgc3RydWN0IHNl -bnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Cj4+ -PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4g -KyAgICBsb25nIHZhbDsKPj4+ICsgICAgaW50IHJldDsKPj4+ICsKPj4+ICsgICAgaWYgKGtzdHJ0 -b2woYnVmLCAxMCwgJnZhbCkgPCAwKQo+Pj4gKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+PiAr -Cj4+PiArICAgIHZhbCA9IGNsYW1wX3ZhbCh2YWwsIC01NTAwMCwgMTI3MDAwKTsKPj4+ICsgICAg -cmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgc2RhLT5pbmRleCwgdG1wMTAzX21jX3RvX3JlZyh2 -YWwpKTsKPj4+ICsgICAgcmV0dXJuIHJldCA/IHJldCA6IGNvdW50Owo+Pj4gK30KPj4+ICsKPj4+ -ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCB0bXAxMDNf -c2hvd190ZW1wLCAKPj4+IE5VTEwgLAo+Pj4gKyAgICAgICAgICAgICAgVE1QMTAzX1RFTVBfUkVH -KTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VT -UiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3Nob3dfdGVtcCwKPj4+ICsgICAgICAgICAgICAgIHRt -cDEwM19zZXRfdGVtcCwgVE1QMTAzX1RMT1dfUkVHKTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09S -X0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3No -b3dfdGVtcCwKPj4+ICsgICAgICAgICAgICAgIHRtcDEwM19zZXRfdGVtcCwgVE1QMTAzX1RISUdI -X1JFRyk7Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRtcDEwM19hdHRyc1td -ID0gewo+Pj4gKyAgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIs -Cj4+PiArICAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCj4+PiAr -ICAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCj4+PiArICAgIE5V -TEwKPj4+ICt9Owo+Pj4gK0FUVFJJQlVURV9HUk9VUFModG1wMTAzKTsKPj4+ICsKPj4+ICtzdGF0 -aWMgYm9vbCB0bXAxMDNfcmVnbWFwX2lzX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5z -aWduZWQgCj4+PiBpbnQgcmVnKQo+Pj4gK3sKPj4+ICsgICAgcmV0dXJuIHJlZyA9PSBUTVAxMDNf -VEVNUF9SRUc7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0 -bXAxMDNfcmVnbWFwX2NvbmZpZyA9IHsKPj4+ICsgICAgLnJlZ19iaXRzID0gOCwKPj4+ICsgICAg -LnZhbF9iaXRzID0gOCwKPj4+ICsgICAgLm1heF9yZWdpc3RlciA9IFRNUDEwM19USElHSF9SRUcs -Cj4+PiArICAgIC52b2xhdGlsZV9yZWcgPSB0bXAxMDNfcmVnbWFwX2lzX3ZvbGF0aWxlLAo+Pj4g -K307Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQg -KmNsaWVudCwKPj4+ICsgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQp -Cj4+PiArewo+Pj4gKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4+PiAr -ICAgIHN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKPj4+ICsgICAgc3RydWN0IHJlZ21hcCAqcmVn -bWFwOwo+Pj4gKyAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICBpZiAoIWkyY19jaGVja19mdW5j -dGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKPj4+ICsgICAgICAgICAgICAgICAgICAgICBJMkNf -RlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7Cj4+PiArICAgICAgICBkZXZfZXJyKCZjbGllbnQtPmRl -diwKPj4+ICsgICAgICAgICAgICAiYWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgU01CdXMgYnl0ZSB0 -cmFuc2FjdGlvbnNcbiIpOwo+Pj4gKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4+PiArICAgIH0K -Pj4+ICsKPj4+ICsgICAgcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmdG1w -MTAzX3JlZ21hcF9jb25maWcpOwo+Pj4gKyAgICBpZiAoSVNfRVJSKHJlZ21hcCkpIHsKPj4+ICsg -ICAgICAgIGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7 -Cj4+PiArICAgICAgICByZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+Pj4gKyAgICB9Cj4+PiArCj4+ -PiArICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JFRywg -Cj4+PiBUTVAxMDNfQ09ORklHX01BU0ssCj4+PiArICAgICAgICAgICAgICAgICBUTVAxMDNfQ09O -RklHKTsKPj4+ICsgICAgaWYgKHJldCA8IDApIHsKPj4+ICsgICAgICAgIGRldl9lcnIoJmNsaWVu -dC0+ZGV2LCAiZXJyb3Igd3JpdGluZyBjb25maWcgcmVnaXN0ZXJcbiIpOwo+Pj4gKyAgICAgICAg -cmV0dXJuIHJldDsKPj4+ICsgICAgfQo+Pj4gKwo+Pj4gKyAgICBod21vbl9kZXYgPSBod21vbl9k -ZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCj4+PiArICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgcmVnbWFwLCB0bXAxMDNfZ3JvdXBzKTsKPj4+ICsgICAg -cmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwo+Pj4gK30KPj4+ICsKPj4+ICsjaWZk -ZWYgQ09ORklHX1BNCj4+PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNl -ICpkZXYpCj4+PiArewo+Pj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2Ry -dmRhdGEoZGV2KTsKPj4+ICsKPj4+ICsgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZWdt -YXAsIFRNUDEwM19DT05GX1JFRywKPj4+ICsgICAgICAgICAgICAgICAgICBUTVAxMDNfQ09ORl9T -RF9NQVNLLCAwKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcmVzdW1lKHN0 -cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9 -IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0 -ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyAgICAgICAgICAgICAgICAgIFRN -UDEwM19DT05GX1NEX01BU0ssIFRNUDEwM19DT05GX1NEKTsKPj4+ICt9Cj4+PiArCj4+PiArc3Rh -dGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRtcDEwM19kZXZfcG1fb3BzID0gewo+Pj4gKyAg -ICAuc3VzcGVuZCAgICA9IHRtcDEwM19zdXNwZW5kLAo+Pj4gKyAgICAucmVzdW1lICAgICAgICA9 -IHRtcDEwM19yZXN1bWUsCj4+PiArfTsKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19ERVZfUE1f -T1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+PiArI2Vsc2UKPj4+ICsjZGVmaW5lICAgIFRNUDEw -M19ERVZfUE1fT1BTIE5VTEwKPj4+ICsjZW5kaWYgLyogQ09ORklHX1BNICovCj4+PiArCj4+PiAr -c3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRtcDEwM19pZFtdID0gewo+Pj4gKyAg -ICB7ICJ0bXAxMDMiLCAwIH0sCj4+PiArICAgIHsgfQo+Pj4gK307Cj4+Cj4+IEluIHRoZSBiaW5k -aW5ncyB5b3UgYXJlIGdpdmluZyB0aGUgY29tcGF0aWJsZSBwcm9wZXJ0eSBhcyA6IAo+PiB0aSx0 -bXAxMDMsIGJ1dCBoZXJlIG9ubHkgdG1wMTAzLgo+Pgo+PiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBp -MmNfZGV2aWNlX2lkIHN0cnVjdCAsIHVzZSBvZl9kZXZpY2VfaWQgc3RydWN0IAo+PiBmb3IgZ2l2 -aW5nIHRoZQo+PiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+PiBjb21wYXRibGUgPSAiPG1h -bnVmYWN0dXJlcj4sPG1vZGVsPiIKPj4KPgo+IE5vLiBXZSBkb24ndCBkbyB0aGF0IGZvciBvdGhl -ciBpMmMgZHJpdmVycywgYW5kIHRoZSBpMmMgc3Vic3lzdGVtIGhhbmRsZXMKPiB0aGlzIGNhc2Us -IHNvIGl0IGRvZXMgbm90IHNlbnNlIHRvIHN0YXJ0IHRoYXQgd2l0aCB0aGlzIGRyaXZlciBqdXN0 -Cj4gZm9yIHRoZSBzYWtlIG9mIG1ha2luZyB0aGUgY29kZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4g -aXQgaGFzIHRvIGJlLgo+Cj4gVGhhbmtzLAo+IEd1ZW50ZXIKPgoKCl9fX19fX19fX19fX19fX19f -X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0Cmxt -LXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxt -YW4vbGlzdGluZm8vbG0tc2Vuc29ycw= +On 06/18/2014 11:42 AM, Guenter Roeck wrote: +> On 06/17/2014 10:46 PM, Varka Bhadram wrote: +>> Hi, +>> +>> On 06/18/2014 11:07 AM, Heiko Schocher wrote: +>>> Driver for the TI TMP103. +>>> +>>> The TI TMP103 is similar to the TMP102. It differs from the TMP102 +>>> by having only 8 bit registers. +>>> +>>> Signed-off-by: Heiko Schocher <hs@denx.de> +>>> +>>> --- +>>> +>>> Cc: Jean Delvare <khali@linux-fr.org> +>>> Cc: Guenter Roeck <linux@roeck-us.net> +>>> Cc: linux-kernel@vger.kernel.org +>>> Cc: devicetree@vger.kernel.org +>>> Cc: linux-doc@vger.kernel.org +>>> Cc: Mark Rutland <mark.rutland@arm.com> +>>> +>>> - change for v2: +>>> - add comments from GuenterRoeck: +>>> - remove Cc from commit subject +>>> - add devicetree maintainer +>>> - move Documentation to Documentation/hwmon/tmp103 +>>> - remove devicetree bindings from Documentation +>>> - add compatible string to +>>> "Documentation/devicetree/bindings/i2c/trivial-devices.txt" +>>> - remove CamelCase +>>> - fix Codingstyle issues +>>> - use ATTRIBUTE_GROUPS and +>>> devm_hwmon_device_register_with_groups() +>>> - remove unsused define TMP103_CONFIG_RD_ONLY +>>> - restore config register when exit() +>>> - use regmap +>>> - changes for v3: +>>> again a lot of fantastic tips how to use regmap efficiently +>>> from Guenter Roeck: +>>> - get rid of "struct tmp103" +>>> - get rid of "static const u8 tmp103_reg[]" +>>> - get rid of mutex lock +>>> - drop config_orig entirely +>>> - use regmap_update_bits() +>>> - changes for v4: +>>> - add comment from Guenter Roeck: +>>> define TMP103_CONFIG_MASK and TMP103_CONF_SD_MASK +>>> separately to ensure you catch all the to-be-cleared bits. +>>> - changes for v5: +>>> add comment from Guenter Roeck: +>>> - use "#define TMP103_CONF_SD TMP103_CONF_M1" +>>> add comment from Mark Rutland: +>>> - use full string for DT compatible string matching, instead of +>>> DRIVER_NAME. Get rid complete of DRIVER_NAME define. +>>> +>>> .../devicetree/bindings/i2c/trivial-devices.txt | 1 + +>>> Documentation/hwmon/tmp103 | 28 +++ +>>> drivers/hwmon/Kconfig | 10 + +>>> drivers/hwmon/Makefile | 1 + +>>> drivers/hwmon/tmp103.c | 205 +>>> +++++++++++++++++++++ +>>> 5 files changed, 245 insertions(+) +>>> create mode 100644 Documentation/hwmon/tmp103 +>>> create mode 100644 drivers/hwmon/tmp103.c +>>> +>>> diff --git +>>> a/Documentation/devicetree/bindings/i2c/trivial-devices.txt +>>> b/Documentation/devicetree/bindings/i2c/trivial-devices.txt +>>> index bef86e5..fc944e0 100644 +>>> --- a/Documentation/devicetree/bindings/i2c/trivial-devices.txt +>>> +++ b/Documentation/devicetree/bindings/i2c/trivial-devices.txt +>>> @@ -83,5 +83,6 @@ stm,m41t80 M41T80 - SERIAL ACCESS RTC WITH +>>> ALARMS +>>> taos,tsl2550 Ambient Light Sensor with SMBUS/Two Wire +>>> Serial Interface +>>> ti,tsc2003 I2C Touch-Screen Controller +>>> ti,tmp102 Low Power Digital Temperature Sensor with +>>> SMBUS/Two Wire Serial Interface +>>> +ti,tmp103 Low Power Digital Temperature Sensor with +>>> SMBUS/Two Wire Serial Interface +May i know about this binding compatible property ? +>>> ti,tmp275 Digital Temperature Sensor +>>> winbond,wpct301 i2c trusted platform module (TPM) +>>> diff --git a/Documentation/hwmon/tmp103 b/Documentation/hwmon/tmp103 +>>> new file mode 100644 +>>> index 0000000..ec00a15 +>>> --- /dev/null +>>> +++ b/Documentation/hwmon/tmp103 +>>> @@ -0,0 +1,28 @@ +>>> +Kernel driver tmp103 +>>> +==================== +>>> + +>>> +Supported chips: +>>> + * Texas Instruments TMP103 +>>> + Prefix: 'tmp103' +>>> + Addresses scanned: none +>>> + Product info and datasheet: http://www.ti.com/product/tmp103 +>>> + +>>> +Author: +>>> + Heiko Schocher <hs@denx.de> +>>> + +>>> +Description +>>> +----------- +>>> + +>>> +The TMP103 is a digital output temperature sensor in a four-ball +>>> +wafer chip-scale package (WCSP). The TMP103 is capable of reading +>>> +temperatures to a resolution of 1°C. The TMP103 is specified for +>>> +operation over a temperature range of –40°C to +125°C. +>>> + +>>> +Resolution: 8 Bits +>>> +Accuracy: ±1°C Typ (–10°C to +100°C) +>>> + +>>> +The driver provides the common sysfs-interface for temperatures (see +>>> +Documentation/hwmon/sysfs-interface under Temperatures). +>>> + +>>> +Please refer how to instantiate this driver: +>>> +Documentation/i2c/instantiating-devices +>>> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig +>>> index 08531a1..c882d4b 100644 +>>> --- a/drivers/hwmon/Kconfig +>>> +++ b/drivers/hwmon/Kconfig +>>> @@ -1391,6 +1391,16 @@ config SENSORS_TMP102 +>>> This driver can also be built as a module. If so, the module +>>> will be called tmp102. +>>> +config SENSORS_TMP103 +>>> + tristate "Texas Instruments TMP103" +>>> + depends on I2C +>>> + help +>>> + If you say yes here you get support for Texas Instruments TMP103 +>>> + sensor chips. +>>> + +>>> + This driver can also be built as a module. If so, the module +>>> + will be called tmp103. +>>> + +>>> config SENSORS_TMP401 +>>> tristate "Texas Instruments TMP401 and compatibles" +>>> depends on I2C +>>> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile +>>> index 3dc0f02..cc0df1ef 100644 +>>> --- a/drivers/hwmon/Makefile +>>> +++ b/drivers/hwmon/Makefile +>>> @@ -135,6 +135,7 @@ obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o +>>> obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o +>>> obj-$(CONFIG_SENSORS_THMC50) += thmc50.o +>>> obj-$(CONFIG_SENSORS_TMP102) += tmp102.o +>>> +obj-$(CONFIG_SENSORS_TMP103) += tmp103.o +>>> obj-$(CONFIG_SENSORS_TMP401) += tmp401.o +>>> obj-$(CONFIG_SENSORS_TMP421) += tmp421.o +>>> obj-$(CONFIG_SENSORS_TWL4030_MADC)+= twl4030-madc-hwmon.o +>>> diff --git a/drivers/hwmon/tmp103.c b/drivers/hwmon/tmp103.c +>>> new file mode 100644 +>>> index 0000000..e69dbca +>>> --- /dev/null +>>> +++ b/drivers/hwmon/tmp103.c +>>> @@ -0,0 +1,205 @@ +>>> +/* +>>> + * Texas Instruments TMP103 SMBus temperature sensor driver +>>> + * Copyright (C) 2014 Heiko Schocher <hs@denx.de> +>>> + * +>>> + * Based on: +>>> + * Texas Instruments TMP102 SMBus temperature sensor driver +>>> + * +>>> + * Copyright (C) 2010 Steven King <sfking@fdwdc.com> +>>> + * +>>> + * This program is free software; you can redistribute it and/or +>>> modify +>>> + * it under the terms of the GNU General Public License as +>>> published by +>>> + * the Free Software Foundation; either version 2 of the License, or +>>> + * (at your option) any later version. +>>> + * +>>> + * This program is distributed in the hope that it will be useful, +>>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of +>>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +>>> + * GNU General Public License for more details. +>>> + * +>>> + */ +>>> + +>>> +#include <linux/module.h> +>>> +#include <linux/init.h> +>>> +#include <linux/slab.h> +>>> +#include <linux/i2c.h> +>>> +#include <linux/hwmon.h> +>>> +#include <linux/hwmon-sysfs.h> +>>> +#include <linux/err.h> +>>> +#include <linux/mutex.h> +>>> +#include <linux/device.h> +>>> +#include <linux/jiffies.h> +>>> +#include <linux/regmap.h> +>>> + +>>> +#define TMP103_TEMP_REG 0x00 +>>> +#define TMP103_CONF_REG 0x01 +>>> +#define TMP103_TLOW_REG 0x02 +>>> +#define TMP103_THIGH_REG 0x03 +>>> + +>>> +#define TMP103_CONF_M0 0x01 +>>> +#define TMP103_CONF_M1 0x02 +>>> +#define TMP103_CONF_LC 0x04 +>>> +#define TMP103_CONF_FL 0x08 +>>> +#define TMP103_CONF_FH 0x10 +>>> +#define TMP103_CONF_CR0 0x20 +>>> +#define TMP103_CONF_CR1 0x40 +>>> +#define TMP103_CONF_ID 0x80 +>>> +#define TMP103_CONF_SD (TMP103_CONF_M1) +>>> +#define TMP103_CONF_SD_MASK (TMP103_CONF_M0 | TMP103_CONF_M1) +>>> + +>>> +#define TMP103_CONFIG (TMP103_CONF_CR1 | TMP103_CONF_M1) +>>> +#define TMP103_CONFIG_MASK (TMP103_CONF_CR0 | TMP103_CONF_CR1 | \ +>>> + TMP103_CONF_M0 | TMP103_CONF_M1) +>>> + +>>> +static inline int tmp103_reg_to_mc(s8 val) +>>> +{ +>>> + return val * 1000; +>>> +} +>>> + +>>> +static inline u8 tmp103_mc_to_reg(int val) +>>> +{ +>>> + return DIV_ROUND_CLOSEST(val, 1000); +>>> +} +>>> + +>>> +static ssize_t tmp103_show_temp(struct device *dev, +>>> + struct device_attribute *attr, +>>> + char *buf) +>>> +{ +>>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); +>>> + struct regmap *regmap = dev_get_drvdata(dev); +>>> + unsigned int regval; +>>> + int ret; +>>> + +>>> + ret = regmap_read(regmap, sda->index, ®val); +>>> + if (ret < 0) +>>> + return ret; +>>> + +>>> + return sprintf(buf, "%d\n", tmp103_reg_to_mc(regval)); +>>> +} +>>> + +>>> +static ssize_t tmp103_set_temp(struct device *dev, +>>> + struct device_attribute *attr, +>>> + const char *buf, size_t count) +>>> +{ +>>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr); +>>> + struct regmap *regmap = dev_get_drvdata(dev); +>>> + long val; +>>> + int ret; +>>> + +>>> + if (kstrtol(buf, 10, &val) < 0) +>>> + return -EINVAL; +>>> + +>>> + val = clamp_val(val, -55000, 127000); +>>> + ret = regmap_write(regmap, sda->index, tmp103_mc_to_reg(val)); +>>> + return ret ? ret : count; +>>> +} +>>> + +>>> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp103_show_temp, +>>> NULL , +>>> + TMP103_TEMP_REG); +>>> + +>>> +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, +>>> tmp103_show_temp, +>>> + tmp103_set_temp, TMP103_TLOW_REG); +>>> + +>>> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, +>>> tmp103_show_temp, +>>> + tmp103_set_temp, TMP103_THIGH_REG); +>>> + +>>> +static struct attribute *tmp103_attrs[] = { +>>> + &sensor_dev_attr_temp1_input.dev_attr.attr, +>>> + &sensor_dev_attr_temp1_min.dev_attr.attr, +>>> + &sensor_dev_attr_temp1_max.dev_attr.attr, +>>> + NULL +>>> +}; +>>> +ATTRIBUTE_GROUPS(tmp103); +>>> + +>>> +static bool tmp103_regmap_is_volatile(struct device *dev, unsigned +>>> int reg) +>>> +{ +>>> + return reg == TMP103_TEMP_REG; +>>> +} +>>> + +>>> +static struct regmap_config tmp103_regmap_config = { +>>> + .reg_bits = 8, +>>> + .val_bits = 8, +>>> + .max_register = TMP103_THIGH_REG, +>>> + .volatile_reg = tmp103_regmap_is_volatile, +>>> +}; +>>> + +>>> +static int tmp103_probe(struct i2c_client *client, +>>> + const struct i2c_device_id *id) +>>> +{ +>>> + struct device *dev = &client->dev; +>>> + struct device *hwmon_dev; +>>> + struct regmap *regmap; +>>> + int ret; +>>> + +>>> + if (!i2c_check_functionality(client->adapter, +>>> + I2C_FUNC_SMBUS_BYTE_DATA)) { +>>> + dev_err(&client->dev, +>>> + "adapter doesn't support SMBus byte transactions\n"); +>>> + return -ENODEV; +>>> + } +>>> + +>>> + regmap = devm_regmap_init_i2c(client, &tmp103_regmap_config); +>>> + if (IS_ERR(regmap)) { +>>> + dev_err(dev, "failed to allocate register map\n"); +>>> + return PTR_ERR(regmap); +>>> + } +>>> + +>>> + ret = regmap_update_bits(regmap, TMP103_CONF_REG, +>>> TMP103_CONFIG_MASK, +>>> + TMP103_CONFIG); +>>> + if (ret < 0) { +>>> + dev_err(&client->dev, "error writing config register\n"); +>>> + return ret; +>>> + } +>>> + +>>> + hwmon_dev = hwmon_device_register_with_groups(dev, client->name, +>>> + regmap, tmp103_groups); +>>> + return PTR_ERR_OR_ZERO(hwmon_dev); +>>> +} +>>> + +>>> +#ifdef CONFIG_PM +>>> +static int tmp103_suspend(struct device *dev) +>>> +{ +>>> + struct regmap *regmap = dev_get_drvdata(dev); +>>> + +>>> + return regmap_update_bits(regmap, TMP103_CONF_REG, +>>> + TMP103_CONF_SD_MASK, 0); +>>> +} +>>> + +>>> +static int tmp103_resume(struct device *dev) +>>> +{ +>>> + struct regmap *regmap = dev_get_drvdata(dev); +>>> + +>>> + return regmap_update_bits(regmap, TMP103_CONF_REG, +>>> + TMP103_CONF_SD_MASK, TMP103_CONF_SD); +>>> +} +>>> + +>>> +static const struct dev_pm_ops tmp103_dev_pm_ops = { +>>> + .suspend = tmp103_suspend, +>>> + .resume = tmp103_resume, +>>> +}; +>>> + +>>> +#define TMP103_DEV_PM_OPS (&tmp103_dev_pm_ops) +>>> +#else +>>> +#define TMP103_DEV_PM_OPS NULL +>>> +#endif /* CONFIG_PM */ +>>> + +>>> +static const struct i2c_device_id tmp103_id[] = { +>>> + { "tmp103", 0 }, +>>> + { } +>>> +}; +>> +>> In the bindings you are giving the compatible property as : +>> ti,tmp103, but here only tmp103. +>> +>> Instead of using the i2c_device_id struct , use of_device_id struct +>> for giving the +>> compatible property value. +>> compatble = "<manufacturer>,<model>" +>> +> +> No. We don't do that for other i2c drivers, and the i2c subsystem handles +> this case, so it does not sense to start that with this driver just +> for the sake of making the code more complicated than it has to be. +> +> Thanks, +> Guenter +> diff --git a/a/content_digest b/N1/content_digest index 29ff666..6b50266 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,8 +2,8 @@ "ref\053A127BB.7090802@gmail.com\0" "ref\053A12DBB.50704@roeck-us.net\0" "From\0Varka Bhadram <varkabhadram@gmail.com>\0" - "Subject\0Re: [lm-sensors] [PATCH v5] hwmon: Driver for TI TMP103 temperature sensor\0" - "Date\0Wed, 18 Jun 2014 06:30:31 +0000\0" + "Subject\0Re: [PATCH v5] hwmon: Driver for TI TMP103 temperature sensor\0" + "Date\0Wed, 18 Jun 2014 11:48:31 +0530\0" "To\0Guenter Roeck <linux@roeck-us.net>" Heiko Schocher <hs@denx.de> " lm-sensors@lm-sensors.org\0" @@ -14,238 +14,373 @@ " Mark Rutland <mark.rutland@arm.com>\0" "\00:1\0" "b\0" - "T24gMDYvMTgvMjAxNCAxMTo0MiBBTSwgR3VlbnRlciBSb2VjayB3cm90ZToKPiBPbiAwNi8xNy8y\n" - "MDE0IDEwOjQ2IFBNLCBWYXJrYSBCaGFkcmFtIHdyb3RlOgo+PiBIaSwKPj4KPj4gT24gMDYvMTgv\n" - "MjAxNCAxMTowNyBBTSwgSGVpa28gU2Nob2NoZXIgd3JvdGU6Cj4+PiBEcml2ZXIgZm9yIHRoZSBU\n" - "SSBUTVAxMDMuCj4+Pgo+Pj4gVGhlIFRJIFRNUDEwMyBpcyBzaW1pbGFyIHRvIHRoZSBUTVAxMDIu\n" - "ICBJdCBkaWZmZXJzIGZyb20gdGhlIFRNUDEwMgo+Pj4gYnkgaGF2aW5nIG9ubHkgOCBiaXQgcmVn\n" - "aXN0ZXJzLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRl\n" - "Pgo+Pj4KPj4+IC0tLQo+Pj4KPj4+IENjOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9y\n" - "Zz4KPj4+IENjOiBHdWVudGVyIFJvZWNrIDxsaW51eEByb2Vjay11cy5uZXQ+Cj4+PiBDYzogbGlu\n" - "dXgta2VybmVsQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IGRldmljZXRyZWVAdmdlci5rZXJuZWwu\n" - "b3JnCj4+PiBDYzogbGludXgtZG9jQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IE1hcmsgUnV0bGFu\n" - "ZCA8bWFyay5ydXRsYW5kQGFybS5jb20+Cj4+Pgo+Pj4gLSBjaGFuZ2UgZm9yIHYyOgo+Pj4gICAg\n" - "LSBhZGQgY29tbWVudHMgZnJvbSBHdWVudGVyUm9lY2s6Cj4+PiAgICAgIC0gcmVtb3ZlIENjIGZy\n" - "b20gY29tbWl0IHN1YmplY3QKPj4+ICAgICAgLSBhZGQgZGV2aWNldHJlZSBtYWludGFpbmVyCj4+\n" - "PiAgICAgIC0gbW92ZSBEb2N1bWVudGF0aW9uIHRvIERvY3VtZW50YXRpb24vaHdtb24vdG1wMTAz\n" - "Cj4+PiAgICAgIC0gcmVtb3ZlIGRldmljZXRyZWUgYmluZGluZ3MgZnJvbSBEb2N1bWVudGF0aW9u\n" - "Cj4+PiAgICAgIC0gYWRkIGNvbXBhdGlibGUgc3RyaW5nIHRvCj4+PiAiRG9jdW1lbnRhdGlvbi9k\n" - "ZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0Igo+Pj4gICAgICAtIHJl\n" - "bW92ZSBDYW1lbENhc2UKPj4+ICAgICAgLSBmaXggQ29kaW5nc3R5bGUgaXNzdWVzCj4+PiAgICAg\n" - "IC0gdXNlIEFUVFJJQlVURV9HUk9VUFMgYW5kIAo+Pj4gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0\n" - "ZXJfd2l0aF9ncm91cHMoKQo+Pj4gICAgICAtIHJlbW92ZSB1bnN1c2VkIGRlZmluZSBUTVAxMDNf\n" - "Q09ORklHX1JEX09OTFkKPj4+ICAgICAgLSByZXN0b3JlIGNvbmZpZyByZWdpc3RlciB3aGVuIGV4\n" - "aXQoKQo+Pj4gICAgICAtIHVzZSByZWdtYXAKPj4+IC0gY2hhbmdlcyBmb3IgdjM6Cj4+PiAgICBh\n" - "Z2FpbiBhIGxvdCBvZiBmYW50YXN0aWMgdGlwcyBob3cgdG8gdXNlIHJlZ21hcCBlZmZpY2llbnRs\n" - "eQo+Pj4gICAgZnJvbSBHdWVudGVyIFJvZWNrOgo+Pj4gICAgLSBnZXQgcmlkIG9mICJzdHJ1Y3Qg\n" - "dG1wMTAzIgo+Pj4gICAgLSBnZXQgcmlkIG9mICJzdGF0aWMgY29uc3QgdTggdG1wMTAzX3JlZ1td\n" - "Igo+Pj4gICAgLSBnZXQgcmlkIG9mIG11dGV4IGxvY2sKPj4+ICAgIC0gZHJvcCBjb25maWdfb3Jp\n" - "ZyBlbnRpcmVseQo+Pj4gICAgLSB1c2UgcmVnbWFwX3VwZGF0ZV9iaXRzKCkKPj4+IC0gY2hhbmdl\n" - "cyBmb3IgdjQ6Cj4+PiAgICAtIGFkZCBjb21tZW50IGZyb20gR3VlbnRlciBSb2VjazoKPj4+ICAg\n" - "ICAgZGVmaW5lIFRNUDEwM19DT05GSUdfTUFTSyBhbmQgVE1QMTAzX0NPTkZfU0RfTUFTSwo+Pj4g\n" - "ICAgICBzZXBhcmF0ZWx5IHRvIGVuc3VyZSB5b3UgY2F0Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVk\n" - "IGJpdHMuCj4+PiAtIGNoYW5nZXMgZm9yIHY1Ogo+Pj4gICAgYWRkIGNvbW1lbnQgZnJvbSBHdWVu\n" - "dGVyIFJvZWNrOgo+Pj4gICAgLSB1c2UgIiNkZWZpbmUgVE1QMTAzX0NPTkZfU0QgVE1QMTAzX0NP\n" - "TkZfTTEiCj4+PiAgICBhZGQgY29tbWVudCBmcm9tIE1hcmsgUnV0bGFuZDoKPj4+ICAgIC0gdXNl\n" - "IGZ1bGwgc3RyaW5nIGZvciBEVCBjb21wYXRpYmxlIHN0cmluZyBtYXRjaGluZywgaW5zdGVhZCBv\n" - "Zgo+Pj4gICAgICBEUklWRVJfTkFNRS4gR2V0IHJpZCBjb21wbGV0ZSBvZiBEUklWRVJfTkFNRSBk\n" - "ZWZpbmUuCj4+Pgo+Pj4gICAuLi4vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZp\n" - "Y2VzLnR4dCAgICB8ICAgMSArCj4+PiAgIERvY3VtZW50YXRpb24vaHdtb24vdG1wMTAzICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgIHwgIDI4ICsrKwo+Pj4gICBkcml2ZXJzL2h3bW9uL0tjb25maWcg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMCArCj4+PiAgIGRyaXZlcnMvaHdtb24v\n" - "TWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKPj4+ICAgZHJpdmVy\n" - "cy9od21vbi90bXAxMDMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDUgCj4+PiAr\n" - "KysrKysrKysrKysrKysrKysrKysKPj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCAyNDUgaW5zZXJ0aW9u\n" - "cygrKQo+Pj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMK\n" - "Pj4+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4+Cj4+PiBk\n" - "aWZmIC0tZ2l0IAo+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3Ry\n" - "aXZpYWwtZGV2aWNlcy50eHQgCj4+PiBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5n\n" - "cy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dAo+Pj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2\n" - "NDQKPj4+IC0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlh\n" - "bC1kZXZpY2VzLnR4dAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdz\n" - "L2kyYy90cml2aWFsLWRldmljZXMudHh0Cj4+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgw\n" - "ICAgICAgICBNNDFUODAgLSBTRVJJQUwgQUNDRVNTIFJUQyBXSVRIIAo+Pj4gQUxBUk1TCj4+PiAg\n" - "IHRhb3MsdHNsMjU1MCAgICAgICAgQW1iaWVudCBMaWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28g\n" - "V2lyZSAKPj4+IFNlcmlhbCBJbnRlcmZhY2UKPj4+ICAgdGksdHNjMjAwMyAgICAgICAgSTJDIFRv\n" - "dWNoLVNjcmVlbiBDb250cm9sbGVyCj4+PiAgIHRpLHRtcDEwMiAgICAgICAgTG93IFBvd2VyIERp\n" - "Z2l0YWwgVGVtcGVyYXR1cmUgU2Vuc29yIHdpdGggCj4+PiBTTUJVUy9Ud28gV2lyZSBTZXJpYWwg\n" - "SW50ZXJmYWNlCj4+PiArdGksdG1wMTAzICAgICAgICBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJh\n" - "dHVyZSBTZW5zb3Igd2l0aCAKPj4+IFNNQlVTL1R3byBXaXJlIFNlcmlhbCBJbnRlcmZhY2UKTWF5\n" - "IGkga25vdyBhYm91dCB0aGlzIGJpbmRpbmcgY29tcGF0aWJsZSBwcm9wZXJ0eSA/Cj4+PiAgIHRp\n" - "LHRtcDI3NSAgICAgICAgRGlnaXRhbCBUZW1wZXJhdHVyZSBTZW5zb3IKPj4+ICAgd2luYm9uZCx3\n" - "cGN0MzAxICAgICAgICBpMmMgdHJ1c3RlZCBwbGF0Zm9ybSBtb2R1bGUgKFRQTSkKPj4+IGRpZmYg\n" - "LS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMyBiL0RvY3VtZW50YXRpb24vaHdtb24v\n" - "dG1wMTAzCj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZWMwMGEx\n" - "NQo+Pj4gLS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMK\n" - "Pj4+IEBAIC0wLDAgKzEsMjggQEAKPj4+ICtLZXJuZWwgZHJpdmVyIHRtcDEwMwo+Pj4gKz09PT09\n" - "PT09PT09PT09PT09PT09Cj4+PiArCj4+PiArU3VwcG9ydGVkIGNoaXBzOgo+Pj4gKyAgKiBUZXhh\n" - "cyBJbnN0cnVtZW50cyBUTVAxMDMKPj4+ICsgICAgUHJlZml4OiAndG1wMTAzJwo+Pj4gKyAgICBB\n" - "ZGRyZXNzZXMgc2Nhbm5lZDogbm9uZQo+Pj4gKyAgICBQcm9kdWN0IGluZm8gYW5kIGRhdGFzaGVl\n" - "dDogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC90bXAxMDMKPj4+ICsKPj4+ICtBdXRob3I6Cj4+\n" - "PiArICAgIEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKwo+Pj4gK0Rlc2NyaXB0aW9u\n" - "Cj4+PiArLS0tLS0tLS0tLS0KPj4+ICsKPj4+ICtUaGUgVE1QMTAzIGlzIGEgZGlnaXRhbCBvdXRw\n" - "dXQgdGVtcGVyYXR1cmUgc2Vuc29yIGluIGEgZm91ci1iYWxsCj4+PiArd2FmZXIgY2hpcC1zY2Fs\n" - "ZSBwYWNrYWdlIChXQ1NQKS4gVGhlIFRNUDEwMyBpcyBjYXBhYmxlIG9mIHJlYWRpbmcKPj4+ICt0\n" - "ZW1wZXJhdHVyZXMgdG8gYSByZXNvbHV0aW9uIG9mIDHCsEMuIFRoZSBUTVAxMDMgaXMgc3BlY2lm\n" - "aWVkIGZvcgo+Pj4gK29wZXJhdGlvbiBvdmVyIGEgdGVtcGVyYXR1cmUgcmFuZ2Ugb2Yg4oCTNDDC\n" - "sEMgdG8gKzEyNcKwQy4KPj4+ICsKPj4+ICtSZXNvbHV0aW9uOiA4IEJpdHMKPj4+ICtBY2N1cmFj\n" - "eTogwrExwrBDIFR5cCAo4oCTMTDCsEMgdG8gKzEwMMKwQykKPj4+ICsKPj4+ICtUaGUgZHJpdmVy\n" - "IHByb3ZpZGVzIHRoZSBjb21tb24gc3lzZnMtaW50ZXJmYWNlIGZvciB0ZW1wZXJhdHVyZXMgKHNl\n" - "ZQo+Pj4gK0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIHVuZGVyIFRlbXBlcmF0\n" - "dXJlcykuCj4+PiArCj4+PiArUGxlYXNlIHJlZmVyIGhvdyB0byBpbnN0YW50aWF0ZSB0aGlzIGRy\n" - "aXZlcjoKPj4+ICtEb2N1bWVudGF0aW9uL2kyYy9pbnN0YW50aWF0aW5nLWRldmljZXMKPj4+IGRp\n" - "ZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcK\n" - "Pj4+IGluZGV4IDA4NTMxYTEuLmM4ODJkNGIgMTAwNjQ0Cj4+PiAtLS0gYS9kcml2ZXJzL2h3bW9u\n" - "L0tjb25maWcKPj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+Pj4gQEAgLTEzOTEsNiAr\n" - "MTM5MSwxNiBAQCBjb25maWcgU0VOU09SU19UTVAxMDIKPj4+ICAgICAgICAgVGhpcyBkcml2ZXIg\n" - "Y2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQo+Pj4gICAg\n" - "ICAgICB3aWxsIGJlIGNhbGxlZCB0bXAxMDIuCj4+PiArY29uZmlnIFNFTlNPUlNfVE1QMTAzCj4+\n" - "PiArICAgIHRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMiCj4+PiArICAgIGRlcGVu\n" - "ZHMgb24gSTJDCj4+PiArICAgIGhlbHAKPj4+ICsgICAgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlv\n" - "dSBnZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+PiArICAgICAgc2Vu\n" - "c29yIGNoaXBzLgo+Pj4gKwo+Pj4gKyAgICAgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0\n" - "IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKPj4+ICsgICAgICB3aWxsIGJlIGNhbGxl\n" - "ZCB0bXAxMDMuCj4+PiArCj4+PiAgIGNvbmZpZyBTRU5TT1JTX1RNUDQwMQo+Pj4gICAgICAgdHJp\n" - "c3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRNUDQwMSBhbmQgY29tcGF0aWJsZXMiCj4+PiAgICAg\n" - "ICBkZXBlbmRzIG9uIEkyQwo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUg\n" - "Yi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+PiBpbmRleCAzZGMwZjAyLi5jYzBkZjFlZiAxMDA2\n" - "NDQKPj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4+ICsrKyBiL2RyaXZlcnMvaHdt\n" - "b24vTWFrZWZpbGUKPj4+IEBAIC0xMzUsNiArMTM1LDcgQEAgb2JqLSQoQ09ORklHX1NFTlNPUlNf\n" - "U01TQzQ3TTE5MikrPSBzbXNjNDdtMTkyLm8KPj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfQU1D\n" - "NjgyMSkgICAgKz0gYW1jNjgyMS5vCj4+PiAgIG9iai0kKENPTkZJR19TRU5TT1JTX1RITUM1MCkg\n" - "ICAgKz0gdGhtYzUwLm8KPj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QMTAyKSAgICArPSB0\n" - "bXAxMDIubwo+Pj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEwMykgICAgKz0gdG1wMTAzLm8K\n" - "Pj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDAxKSAgICArPSB0bXA0MDEubwo+Pj4gICBv\n" - "YmotJChDT05GSUdfU0VOU09SU19UTVA0MjEpICAgICs9IHRtcDQyMS5vCj4+PiAgIG9iai0kKENP\n" - "TkZJR19TRU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMtaHdtb24ubwo+Pj4gZGlm\n" - "ZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5j\n" - "Cj4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZTY5ZGJjYQo+Pj4g\n" - "LS0tIC9kZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy9od21vbi90bXAxMDMuYwo+Pj4gQEAgLTAs\n" - "MCArMSwyMDUgQEAKPj4+ICsvKgo+Pj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMyBTTUJ1\n" - "cyB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCj4+PiArICogQ29weXJpZ2h0IChDKSAyMDE0IEhl\n" - "aWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKyAqCj4+PiArICogQmFzZWQgb246Cj4+PiAr\n" - "ICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2\n" - "ZXIKPj4+ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxMCBTdGV2ZW4gS2luZyA8c2ZraW5n\n" - "QGZkd2RjLmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl\n" - "OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCj4+PiBtb2RpZnkKPj4+ICsgKiBpdCB1\n" - "bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAo+Pj4g\n" - "cHVibGlzaGVkIGJ5Cj4+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy\n" - "IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFu\n" - "eSBsYXRlciB2ZXJzaW9uLgo+Pj4gKyAqCj4+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1\n" - "dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+PiArICogYnV0IFdJVEhP\n" - "VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPj4+\n" - "ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu\n" - "ICBTZWUgdGhlCj4+PiArICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0\n" - "YWlscy4KPj4+ICsgKgo+Pj4gKyAqLwo+Pj4gKwo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu\n" - "aD4KPj4+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9zbGFi\n" - "Lmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9od21v\n" - "bi5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgo+Pj4gKyNpbmNsdWRlIDxs\n" - "aW51eC9lcnIuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPj4+ICsjaW5jbHVkZSA8\n" - "bGludXgvZGV2aWNlLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KPj4+ICsjaW5j\n" - "bHVkZSA8bGludXgvcmVnbWFwLmg+Cj4+PiArCj4+PiArI2RlZmluZSBUTVAxMDNfVEVNUF9SRUcg\n" - "ICAgICAgIDB4MDAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX1JFRyAgICAgICAgMHgwMQo+Pj4g\n" - "KyNkZWZpbmUgVE1QMTAzX1RMT1dfUkVHICAgICAgICAweDAyCj4+PiArI2RlZmluZSBUTVAxMDNf\n" - "VEhJR0hfUkVHICAgIDB4MDMKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX00wICAgICAg\n" - "ICAweDAxCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9NMSAgICAgICAgMHgwMgo+Pj4gKyNkZWZp\n" - "bmUgVE1QMTAzX0NPTkZfTEMgICAgICAgIDB4MDQKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0ZM\n" - "ICAgICAgICAweDA4Cj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9GSCAgICAgICAgMHgxMAo+Pj4g\n" - "KyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwICAgICAgICAweDIwCj4+PiArI2RlZmluZSBUTVAxMDNf\n" - "Q09ORl9DUjEgICAgICAgIDB4NDAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0lEICAgICAgICAw\n" - "eDgwCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAgICAgICAgKFRNUDEwM19DT05GX00xKQo+\n" - "Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfU0RfTUFTSyAgICAoVE1QMTAzX0NPTkZfTTAgfCBUTVAx\n" - "MDNfQ09ORl9NMSkKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUcgICAgICAgIChUTVAx\n" - "MDNfQ09ORl9DUjEgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUdf\n" - "TUFTSyAgICAoVE1QMTAzX0NPTkZfQ1IwIHwgVE1QMTAzX0NPTkZfQ1IxIHwgXAo+Pj4gKyAgICAg\n" - "ICAgICAgICAgICAgVE1QMTAzX0NPTkZfTTAgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsKPj4+ICtz\n" - "dGF0aWMgaW5saW5lIGludCB0bXAxMDNfcmVnX3RvX21jKHM4IHZhbCkKPj4+ICt7Cj4+PiArICAg\n" - "IHJldHVybiB2YWwgKiAxMDAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW5saW5lIHU4IHRt\n" - "cDEwM19tY190b19yZWcoaW50IHZhbCkKPj4+ICt7Cj4+PiArICAgIHJldHVybiBESVZfUk9VTkRf\n" - "Q0xPU0VTVCh2YWwsIDEwMDApOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAx\n" - "MDNfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAgc3Ry\n" - "dWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+PiArICAgICAgICAgICAgICAgIGNoYXIgKmJ1\n" - "ZikKPj4+ICt7Cj4+PiArICAgIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2RhID0g\n" - "dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+Pj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAg\n" - "PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4+ICsgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPj4+\n" - "ICsgICAgaW50IHJldDsKPj4+ICsKPj4+ICsgICAgcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBz\n" - "ZGEtPmluZGV4LCAmcmVndmFsKTsKPj4+ICsgICAgaWYgKHJldCA8IDApCj4+PiArICAgICAgICBy\n" - "ZXR1cm4gcmV0Owo+Pj4gKwo+Pj4gKyAgICByZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1w\n" - "MTAzX3JlZ190b19tYyhyZWd2YWwpKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIHNzaXplX3Qg\n" - "dG1wMTAzX3NldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgICAgICAgICAgICAgICAg\n" - "ICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+PiArICAgICAgICAgICAgICAgICAg\n" - "IGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQo+Pj4gK3sKPj4+ICsgICAgc3RydWN0IHNl\n" - "bnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZGEgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7Cj4+\n" - "PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4g\n" - "KyAgICBsb25nIHZhbDsKPj4+ICsgICAgaW50IHJldDsKPj4+ICsKPj4+ICsgICAgaWYgKGtzdHJ0\n" - "b2woYnVmLCAxMCwgJnZhbCkgPCAwKQo+Pj4gKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4+PiAr\n" - "Cj4+PiArICAgIHZhbCA9IGNsYW1wX3ZhbCh2YWwsIC01NTAwMCwgMTI3MDAwKTsKPj4+ICsgICAg\n" - "cmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgc2RhLT5pbmRleCwgdG1wMTAzX21jX3RvX3JlZyh2\n" - "YWwpKTsKPj4+ICsgICAgcmV0dXJuIHJldCA/IHJldCA6IGNvdW50Owo+Pj4gK30KPj4+ICsKPj4+\n" - "ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCB0bXAxMDNf\n" - "c2hvd190ZW1wLCAKPj4+IE5VTEwgLAo+Pj4gKyAgICAgICAgICAgICAgVE1QMTAzX1RFTVBfUkVH\n" - "KTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JV1VT\n" - "UiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3Nob3dfdGVtcCwKPj4+ICsgICAgICAgICAgICAgIHRt\n" - "cDEwM19zZXRfdGVtcCwgVE1QMTAzX1RMT1dfUkVHKTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09S\n" - "X0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3No\n" - "b3dfdGVtcCwKPj4+ICsgICAgICAgICAgICAgIHRtcDEwM19zZXRfdGVtcCwgVE1QMTAzX1RISUdI\n" - "X1JFRyk7Cj4+PiArCj4+PiArc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRtcDEwM19hdHRyc1td\n" - "ID0gewo+Pj4gKyAgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIs\n" - "Cj4+PiArICAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCj4+PiAr\n" - "ICAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyLmF0dHIsCj4+PiArICAgIE5V\n" - "TEwKPj4+ICt9Owo+Pj4gK0FUVFJJQlVURV9HUk9VUFModG1wMTAzKTsKPj4+ICsKPj4+ICtzdGF0\n" - "aWMgYm9vbCB0bXAxMDNfcmVnbWFwX2lzX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5z\n" - "aWduZWQgCj4+PiBpbnQgcmVnKQo+Pj4gK3sKPj4+ICsgICAgcmV0dXJuIHJlZyA9PSBUTVAxMDNf\n" - "VEVNUF9SRUc7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0\n" - "bXAxMDNfcmVnbWFwX2NvbmZpZyA9IHsKPj4+ICsgICAgLnJlZ19iaXRzID0gOCwKPj4+ICsgICAg\n" - "LnZhbF9iaXRzID0gOCwKPj4+ICsgICAgLm1heF9yZWdpc3RlciA9IFRNUDEwM19USElHSF9SRUcs\n" - "Cj4+PiArICAgIC52b2xhdGlsZV9yZWcgPSB0bXAxMDNfcmVnbWFwX2lzX3ZvbGF0aWxlLAo+Pj4g\n" - "K307Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQg\n" - "KmNsaWVudCwKPj4+ICsgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQp\n" - "Cj4+PiArewo+Pj4gKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Cj4+PiAr\n" - "ICAgIHN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKPj4+ICsgICAgc3RydWN0IHJlZ21hcCAqcmVn\n" - "bWFwOwo+Pj4gKyAgICBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyAgICBpZiAoIWkyY19jaGVja19mdW5j\n" - "dGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKPj4+ICsgICAgICAgICAgICAgICAgICAgICBJMkNf\n" - "RlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7Cj4+PiArICAgICAgICBkZXZfZXJyKCZjbGllbnQtPmRl\n" - "diwKPj4+ICsgICAgICAgICAgICAiYWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgU01CdXMgYnl0ZSB0\n" - "cmFuc2FjdGlvbnNcbiIpOwo+Pj4gKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4+PiArICAgIH0K\n" - "Pj4+ICsKPj4+ICsgICAgcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmdG1w\n" - "MTAzX3JlZ21hcF9jb25maWcpOwo+Pj4gKyAgICBpZiAoSVNfRVJSKHJlZ21hcCkpIHsKPj4+ICsg\n" - "ICAgICAgIGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7\n" - "Cj4+PiArICAgICAgICByZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+Pj4gKyAgICB9Cj4+PiArCj4+\n" - "PiArICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JFRywg\n" - "Cj4+PiBUTVAxMDNfQ09ORklHX01BU0ssCj4+PiArICAgICAgICAgICAgICAgICBUTVAxMDNfQ09O\n" - "RklHKTsKPj4+ICsgICAgaWYgKHJldCA8IDApIHsKPj4+ICsgICAgICAgIGRldl9lcnIoJmNsaWVu\n" - "dC0+ZGV2LCAiZXJyb3Igd3JpdGluZyBjb25maWcgcmVnaXN0ZXJcbiIpOwo+Pj4gKyAgICAgICAg\n" - "cmV0dXJuIHJldDsKPj4+ICsgICAgfQo+Pj4gKwo+Pj4gKyAgICBod21vbl9kZXYgPSBod21vbl9k\n" - "ZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCj4+PiArICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgcmVnbWFwLCB0bXAxMDNfZ3JvdXBzKTsKPj4+ICsgICAg\n" - "cmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwo+Pj4gK30KPj4+ICsKPj4+ICsjaWZk\n" - "ZWYgQ09ORklHX1BNCj4+PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNl\n" - "ICpkZXYpCj4+PiArewo+Pj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkZXZfZ2V0X2Ry\n" - "dmRhdGEoZGV2KTsKPj4+ICsKPj4+ICsgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZWdt\n" - "YXAsIFRNUDEwM19DT05GX1JFRywKPj4+ICsgICAgICAgICAgICAgICAgICBUTVAxMDNfQ09ORl9T\n" - "RF9NQVNLLCAwKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcmVzdW1lKHN0\n" - "cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9\n" - "IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0\n" - "ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyAgICAgICAgICAgICAgICAgIFRN\n" - "UDEwM19DT05GX1NEX01BU0ssIFRNUDEwM19DT05GX1NEKTsKPj4+ICt9Cj4+PiArCj4+PiArc3Rh\n" - "dGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRtcDEwM19kZXZfcG1fb3BzID0gewo+Pj4gKyAg\n" - "ICAuc3VzcGVuZCAgICA9IHRtcDEwM19zdXNwZW5kLAo+Pj4gKyAgICAucmVzdW1lICAgICAgICA9\n" - "IHRtcDEwM19yZXN1bWUsCj4+PiArfTsKPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19ERVZfUE1f\n" - "T1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+PiArI2Vsc2UKPj4+ICsjZGVmaW5lICAgIFRNUDEw\n" - "M19ERVZfUE1fT1BTIE5VTEwKPj4+ICsjZW5kaWYgLyogQ09ORklHX1BNICovCj4+PiArCj4+PiAr\n" - "c3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRtcDEwM19pZFtdID0gewo+Pj4gKyAg\n" - "ICB7ICJ0bXAxMDMiLCAwIH0sCj4+PiArICAgIHsgfQo+Pj4gK307Cj4+Cj4+IEluIHRoZSBiaW5k\n" - "aW5ncyB5b3UgYXJlIGdpdmluZyB0aGUgY29tcGF0aWJsZSBwcm9wZXJ0eSBhcyA6IAo+PiB0aSx0\n" - "bXAxMDMsIGJ1dCBoZXJlIG9ubHkgdG1wMTAzLgo+Pgo+PiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBp\n" - "MmNfZGV2aWNlX2lkIHN0cnVjdCAsIHVzZSBvZl9kZXZpY2VfaWQgc3RydWN0IAo+PiBmb3IgZ2l2\n" - "aW5nIHRoZQo+PiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+PiBjb21wYXRibGUgPSAiPG1h\n" - "bnVmYWN0dXJlcj4sPG1vZGVsPiIKPj4KPgo+IE5vLiBXZSBkb24ndCBkbyB0aGF0IGZvciBvdGhl\n" - "ciBpMmMgZHJpdmVycywgYW5kIHRoZSBpMmMgc3Vic3lzdGVtIGhhbmRsZXMKPiB0aGlzIGNhc2Us\n" - "IHNvIGl0IGRvZXMgbm90IHNlbnNlIHRvIHN0YXJ0IHRoYXQgd2l0aCB0aGlzIGRyaXZlciBqdXN0\n" - "Cj4gZm9yIHRoZSBzYWtlIG9mIG1ha2luZyB0aGUgY29kZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4g\n" - "aXQgaGFzIHRvIGJlLgo+Cj4gVGhhbmtzLAo+IEd1ZW50ZXIKPgoKCl9fX19fX19fX19fX19fX19f\n" - "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxtLXNlbnNvcnMgbWFpbGluZyBsaXN0Cmxt\n" - "LXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKaHR0cDovL2xpc3RzLmxtLXNlbnNvcnMub3JnL21haWxt\n" - YW4vbGlzdGluZm8vbG0tc2Vuc29ycw= + "On 06/18/2014 11:42 AM, Guenter Roeck wrote:\n" + "> On 06/17/2014 10:46 PM, Varka Bhadram wrote:\n" + ">> Hi,\n" + ">>\n" + ">> On 06/18/2014 11:07 AM, Heiko Schocher wrote:\n" + ">>> Driver for the TI TMP103.\n" + ">>>\n" + ">>> The TI TMP103 is similar to the TMP102. It differs from the TMP102\n" + ">>> by having only 8 bit registers.\n" + ">>>\n" + ">>> Signed-off-by: Heiko Schocher <hs@denx.de>\n" + ">>>\n" + ">>> ---\n" + ">>>\n" + ">>> Cc: Jean Delvare <khali@linux-fr.org>\n" + ">>> Cc: Guenter Roeck <linux@roeck-us.net>\n" + ">>> Cc: linux-kernel@vger.kernel.org\n" + ">>> Cc: devicetree@vger.kernel.org\n" + ">>> Cc: linux-doc@vger.kernel.org\n" + ">>> Cc: Mark Rutland <mark.rutland@arm.com>\n" + ">>>\n" + ">>> - change for v2:\n" + ">>> - add comments from GuenterRoeck:\n" + ">>> - remove Cc from commit subject\n" + ">>> - add devicetree maintainer\n" + ">>> - move Documentation to Documentation/hwmon/tmp103\n" + ">>> - remove devicetree bindings from Documentation\n" + ">>> - add compatible string to\n" + ">>> \"Documentation/devicetree/bindings/i2c/trivial-devices.txt\"\n" + ">>> - remove CamelCase\n" + ">>> - fix Codingstyle issues\n" + ">>> - use ATTRIBUTE_GROUPS and \n" + ">>> devm_hwmon_device_register_with_groups()\n" + ">>> - remove unsused define TMP103_CONFIG_RD_ONLY\n" + ">>> - restore config register when exit()\n" + ">>> - use regmap\n" + ">>> - changes for v3:\n" + ">>> again a lot of fantastic tips how to use regmap efficiently\n" + ">>> from Guenter Roeck:\n" + ">>> - get rid of \"struct tmp103\"\n" + ">>> - get rid of \"static const u8 tmp103_reg[]\"\n" + ">>> - get rid of mutex lock\n" + ">>> - drop config_orig entirely\n" + ">>> - use regmap_update_bits()\n" + ">>> - changes for v4:\n" + ">>> - add comment from Guenter Roeck:\n" + ">>> define TMP103_CONFIG_MASK and TMP103_CONF_SD_MASK\n" + ">>> separately to ensure you catch all the to-be-cleared bits.\n" + ">>> - changes for v5:\n" + ">>> add comment from Guenter Roeck:\n" + ">>> - use \"#define TMP103_CONF_SD TMP103_CONF_M1\"\n" + ">>> add comment from Mark Rutland:\n" + ">>> - use full string for DT compatible string matching, instead of\n" + ">>> DRIVER_NAME. Get rid complete of DRIVER_NAME define.\n" + ">>>\n" + ">>> .../devicetree/bindings/i2c/trivial-devices.txt | 1 +\n" + ">>> Documentation/hwmon/tmp103 | 28 +++\n" + ">>> drivers/hwmon/Kconfig | 10 +\n" + ">>> drivers/hwmon/Makefile | 1 +\n" + ">>> drivers/hwmon/tmp103.c | 205 \n" + ">>> +++++++++++++++++++++\n" + ">>> 5 files changed, 245 insertions(+)\n" + ">>> create mode 100644 Documentation/hwmon/tmp103\n" + ">>> create mode 100644 drivers/hwmon/tmp103.c\n" + ">>>\n" + ">>> diff --git \n" + ">>> a/Documentation/devicetree/bindings/i2c/trivial-devices.txt \n" + ">>> b/Documentation/devicetree/bindings/i2c/trivial-devices.txt\n" + ">>> index bef86e5..fc944e0 100644\n" + ">>> --- a/Documentation/devicetree/bindings/i2c/trivial-devices.txt\n" + ">>> +++ b/Documentation/devicetree/bindings/i2c/trivial-devices.txt\n" + ">>> @@ -83,5 +83,6 @@ stm,m41t80 M41T80 - SERIAL ACCESS RTC WITH \n" + ">>> ALARMS\n" + ">>> taos,tsl2550 Ambient Light Sensor with SMBUS/Two Wire \n" + ">>> Serial Interface\n" + ">>> ti,tsc2003 I2C Touch-Screen Controller\n" + ">>> ti,tmp102 Low Power Digital Temperature Sensor with \n" + ">>> SMBUS/Two Wire Serial Interface\n" + ">>> +ti,tmp103 Low Power Digital Temperature Sensor with \n" + ">>> SMBUS/Two Wire Serial Interface\n" + "May i know about this binding compatible property ?\n" + ">>> ti,tmp275 Digital Temperature Sensor\n" + ">>> winbond,wpct301 i2c trusted platform module (TPM)\n" + ">>> diff --git a/Documentation/hwmon/tmp103 b/Documentation/hwmon/tmp103\n" + ">>> new file mode 100644\n" + ">>> index 0000000..ec00a15\n" + ">>> --- /dev/null\n" + ">>> +++ b/Documentation/hwmon/tmp103\n" + ">>> @@ -0,0 +1,28 @@\n" + ">>> +Kernel driver tmp103\n" + ">>> +====================\n" + ">>> +\n" + ">>> +Supported chips:\n" + ">>> + * Texas Instruments TMP103\n" + ">>> + Prefix: 'tmp103'\n" + ">>> + Addresses scanned: none\n" + ">>> + Product info and datasheet: http://www.ti.com/product/tmp103\n" + ">>> +\n" + ">>> +Author:\n" + ">>> + Heiko Schocher <hs@denx.de>\n" + ">>> +\n" + ">>> +Description\n" + ">>> +-----------\n" + ">>> +\n" + ">>> +The TMP103 is a digital output temperature sensor in a four-ball\n" + ">>> +wafer chip-scale package (WCSP). The TMP103 is capable of reading\n" + ">>> +temperatures to a resolution of 1\302\260C. The TMP103 is specified for\n" + ">>> +operation over a temperature range of \342\200\22340\302\260C to +125\302\260C.\n" + ">>> +\n" + ">>> +Resolution: 8 Bits\n" + ">>> +Accuracy: \302\2611\302\260C Typ (\342\200\22310\302\260C to +100\302\260C)\n" + ">>> +\n" + ">>> +The driver provides the common sysfs-interface for temperatures (see\n" + ">>> +Documentation/hwmon/sysfs-interface under Temperatures).\n" + ">>> +\n" + ">>> +Please refer how to instantiate this driver:\n" + ">>> +Documentation/i2c/instantiating-devices\n" + ">>> diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig\n" + ">>> index 08531a1..c882d4b 100644\n" + ">>> --- a/drivers/hwmon/Kconfig\n" + ">>> +++ b/drivers/hwmon/Kconfig\n" + ">>> @@ -1391,6 +1391,16 @@ config SENSORS_TMP102\n" + ">>> This driver can also be built as a module. If so, the module\n" + ">>> will be called tmp102.\n" + ">>> +config SENSORS_TMP103\n" + ">>> + tristate \"Texas Instruments TMP103\"\n" + ">>> + depends on I2C\n" + ">>> + help\n" + ">>> + If you say yes here you get support for Texas Instruments TMP103\n" + ">>> + sensor chips.\n" + ">>> +\n" + ">>> + This driver can also be built as a module. If so, the module\n" + ">>> + will be called tmp103.\n" + ">>> +\n" + ">>> config SENSORS_TMP401\n" + ">>> tristate \"Texas Instruments TMP401 and compatibles\"\n" + ">>> depends on I2C\n" + ">>> diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile\n" + ">>> index 3dc0f02..cc0df1ef 100644\n" + ">>> --- a/drivers/hwmon/Makefile\n" + ">>> +++ b/drivers/hwmon/Makefile\n" + ">>> @@ -135,6 +135,7 @@ obj-$(CONFIG_SENSORS_SMSC47M192)+= smsc47m192.o\n" + ">>> obj-$(CONFIG_SENSORS_AMC6821) += amc6821.o\n" + ">>> obj-$(CONFIG_SENSORS_THMC50) += thmc50.o\n" + ">>> obj-$(CONFIG_SENSORS_TMP102) += tmp102.o\n" + ">>> +obj-$(CONFIG_SENSORS_TMP103) += tmp103.o\n" + ">>> obj-$(CONFIG_SENSORS_TMP401) += tmp401.o\n" + ">>> obj-$(CONFIG_SENSORS_TMP421) += tmp421.o\n" + ">>> obj-$(CONFIG_SENSORS_TWL4030_MADC)+= twl4030-madc-hwmon.o\n" + ">>> diff --git a/drivers/hwmon/tmp103.c b/drivers/hwmon/tmp103.c\n" + ">>> new file mode 100644\n" + ">>> index 0000000..e69dbca\n" + ">>> --- /dev/null\n" + ">>> +++ b/drivers/hwmon/tmp103.c\n" + ">>> @@ -0,0 +1,205 @@\n" + ">>> +/*\n" + ">>> + * Texas Instruments TMP103 SMBus temperature sensor driver\n" + ">>> + * Copyright (C) 2014 Heiko Schocher <hs@denx.de>\n" + ">>> + *\n" + ">>> + * Based on:\n" + ">>> + * Texas Instruments TMP102 SMBus temperature sensor driver\n" + ">>> + *\n" + ">>> + * Copyright (C) 2010 Steven King <sfking@fdwdc.com>\n" + ">>> + *\n" + ">>> + * This program is free software; you can redistribute it and/or \n" + ">>> modify\n" + ">>> + * it under the terms of the GNU General Public License as \n" + ">>> published by\n" + ">>> + * the Free Software Foundation; either version 2 of the License, or\n" + ">>> + * (at your option) any later version.\n" + ">>> + *\n" + ">>> + * This program is distributed in the hope that it will be useful,\n" + ">>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + ">>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + ">>> + * GNU General Public License for more details.\n" + ">>> + *\n" + ">>> + */\n" + ">>> +\n" + ">>> +#include <linux/module.h>\n" + ">>> +#include <linux/init.h>\n" + ">>> +#include <linux/slab.h>\n" + ">>> +#include <linux/i2c.h>\n" + ">>> +#include <linux/hwmon.h>\n" + ">>> +#include <linux/hwmon-sysfs.h>\n" + ">>> +#include <linux/err.h>\n" + ">>> +#include <linux/mutex.h>\n" + ">>> +#include <linux/device.h>\n" + ">>> +#include <linux/jiffies.h>\n" + ">>> +#include <linux/regmap.h>\n" + ">>> +\n" + ">>> +#define TMP103_TEMP_REG 0x00\n" + ">>> +#define TMP103_CONF_REG 0x01\n" + ">>> +#define TMP103_TLOW_REG 0x02\n" + ">>> +#define TMP103_THIGH_REG 0x03\n" + ">>> +\n" + ">>> +#define TMP103_CONF_M0 0x01\n" + ">>> +#define TMP103_CONF_M1 0x02\n" + ">>> +#define TMP103_CONF_LC 0x04\n" + ">>> +#define TMP103_CONF_FL 0x08\n" + ">>> +#define TMP103_CONF_FH 0x10\n" + ">>> +#define TMP103_CONF_CR0 0x20\n" + ">>> +#define TMP103_CONF_CR1 0x40\n" + ">>> +#define TMP103_CONF_ID 0x80\n" + ">>> +#define TMP103_CONF_SD (TMP103_CONF_M1)\n" + ">>> +#define TMP103_CONF_SD_MASK (TMP103_CONF_M0 | TMP103_CONF_M1)\n" + ">>> +\n" + ">>> +#define TMP103_CONFIG (TMP103_CONF_CR1 | TMP103_CONF_M1)\n" + ">>> +#define TMP103_CONFIG_MASK (TMP103_CONF_CR0 | TMP103_CONF_CR1 | \\\n" + ">>> + TMP103_CONF_M0 | TMP103_CONF_M1)\n" + ">>> +\n" + ">>> +static inline int tmp103_reg_to_mc(s8 val)\n" + ">>> +{\n" + ">>> + return val * 1000;\n" + ">>> +}\n" + ">>> +\n" + ">>> +static inline u8 tmp103_mc_to_reg(int val)\n" + ">>> +{\n" + ">>> + return DIV_ROUND_CLOSEST(val, 1000);\n" + ">>> +}\n" + ">>> +\n" + ">>> +static ssize_t tmp103_show_temp(struct device *dev,\n" + ">>> + struct device_attribute *attr,\n" + ">>> + char *buf)\n" + ">>> +{\n" + ">>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);\n" + ">>> + struct regmap *regmap = dev_get_drvdata(dev);\n" + ">>> + unsigned int regval;\n" + ">>> + int ret;\n" + ">>> +\n" + ">>> + ret = regmap_read(regmap, sda->index, ®val);\n" + ">>> + if (ret < 0)\n" + ">>> + return ret;\n" + ">>> +\n" + ">>> + return sprintf(buf, \"%d\\n\", tmp103_reg_to_mc(regval));\n" + ">>> +}\n" + ">>> +\n" + ">>> +static ssize_t tmp103_set_temp(struct device *dev,\n" + ">>> + struct device_attribute *attr,\n" + ">>> + const char *buf, size_t count)\n" + ">>> +{\n" + ">>> + struct sensor_device_attribute *sda = to_sensor_dev_attr(attr);\n" + ">>> + struct regmap *regmap = dev_get_drvdata(dev);\n" + ">>> + long val;\n" + ">>> + int ret;\n" + ">>> +\n" + ">>> + if (kstrtol(buf, 10, &val) < 0)\n" + ">>> + return -EINVAL;\n" + ">>> +\n" + ">>> + val = clamp_val(val, -55000, 127000);\n" + ">>> + ret = regmap_write(regmap, sda->index, tmp103_mc_to_reg(val));\n" + ">>> + return ret ? ret : count;\n" + ">>> +}\n" + ">>> +\n" + ">>> +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, tmp103_show_temp, \n" + ">>> NULL ,\n" + ">>> + TMP103_TEMP_REG);\n" + ">>> +\n" + ">>> +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, \n" + ">>> tmp103_show_temp,\n" + ">>> + tmp103_set_temp, TMP103_TLOW_REG);\n" + ">>> +\n" + ">>> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, \n" + ">>> tmp103_show_temp,\n" + ">>> + tmp103_set_temp, TMP103_THIGH_REG);\n" + ">>> +\n" + ">>> +static struct attribute *tmp103_attrs[] = {\n" + ">>> + &sensor_dev_attr_temp1_input.dev_attr.attr,\n" + ">>> + &sensor_dev_attr_temp1_min.dev_attr.attr,\n" + ">>> + &sensor_dev_attr_temp1_max.dev_attr.attr,\n" + ">>> + NULL\n" + ">>> +};\n" + ">>> +ATTRIBUTE_GROUPS(tmp103);\n" + ">>> +\n" + ">>> +static bool tmp103_regmap_is_volatile(struct device *dev, unsigned \n" + ">>> int reg)\n" + ">>> +{\n" + ">>> + return reg == TMP103_TEMP_REG;\n" + ">>> +}\n" + ">>> +\n" + ">>> +static struct regmap_config tmp103_regmap_config = {\n" + ">>> + .reg_bits = 8,\n" + ">>> + .val_bits = 8,\n" + ">>> + .max_register = TMP103_THIGH_REG,\n" + ">>> + .volatile_reg = tmp103_regmap_is_volatile,\n" + ">>> +};\n" + ">>> +\n" + ">>> +static int tmp103_probe(struct i2c_client *client,\n" + ">>> + const struct i2c_device_id *id)\n" + ">>> +{\n" + ">>> + struct device *dev = &client->dev;\n" + ">>> + struct device *hwmon_dev;\n" + ">>> + struct regmap *regmap;\n" + ">>> + int ret;\n" + ">>> +\n" + ">>> + if (!i2c_check_functionality(client->adapter,\n" + ">>> + I2C_FUNC_SMBUS_BYTE_DATA)) {\n" + ">>> + dev_err(&client->dev,\n" + ">>> + \"adapter doesn't support SMBus byte transactions\\n\");\n" + ">>> + return -ENODEV;\n" + ">>> + }\n" + ">>> +\n" + ">>> + regmap = devm_regmap_init_i2c(client, &tmp103_regmap_config);\n" + ">>> + if (IS_ERR(regmap)) {\n" + ">>> + dev_err(dev, \"failed to allocate register map\\n\");\n" + ">>> + return PTR_ERR(regmap);\n" + ">>> + }\n" + ">>> +\n" + ">>> + ret = regmap_update_bits(regmap, TMP103_CONF_REG, \n" + ">>> TMP103_CONFIG_MASK,\n" + ">>> + TMP103_CONFIG);\n" + ">>> + if (ret < 0) {\n" + ">>> + dev_err(&client->dev, \"error writing config register\\n\");\n" + ">>> + return ret;\n" + ">>> + }\n" + ">>> +\n" + ">>> + hwmon_dev = hwmon_device_register_with_groups(dev, client->name,\n" + ">>> + regmap, tmp103_groups);\n" + ">>> + return PTR_ERR_OR_ZERO(hwmon_dev);\n" + ">>> +}\n" + ">>> +\n" + ">>> +#ifdef CONFIG_PM\n" + ">>> +static int tmp103_suspend(struct device *dev)\n" + ">>> +{\n" + ">>> + struct regmap *regmap = dev_get_drvdata(dev);\n" + ">>> +\n" + ">>> + return regmap_update_bits(regmap, TMP103_CONF_REG,\n" + ">>> + TMP103_CONF_SD_MASK, 0);\n" + ">>> +}\n" + ">>> +\n" + ">>> +static int tmp103_resume(struct device *dev)\n" + ">>> +{\n" + ">>> + struct regmap *regmap = dev_get_drvdata(dev);\n" + ">>> +\n" + ">>> + return regmap_update_bits(regmap, TMP103_CONF_REG,\n" + ">>> + TMP103_CONF_SD_MASK, TMP103_CONF_SD);\n" + ">>> +}\n" + ">>> +\n" + ">>> +static const struct dev_pm_ops tmp103_dev_pm_ops = {\n" + ">>> + .suspend = tmp103_suspend,\n" + ">>> + .resume = tmp103_resume,\n" + ">>> +};\n" + ">>> +\n" + ">>> +#define TMP103_DEV_PM_OPS (&tmp103_dev_pm_ops)\n" + ">>> +#else\n" + ">>> +#define TMP103_DEV_PM_OPS NULL\n" + ">>> +#endif /* CONFIG_PM */\n" + ">>> +\n" + ">>> +static const struct i2c_device_id tmp103_id[] = {\n" + ">>> + { \"tmp103\", 0 },\n" + ">>> + { }\n" + ">>> +};\n" + ">>\n" + ">> In the bindings you are giving the compatible property as : \n" + ">> ti,tmp103, but here only tmp103.\n" + ">>\n" + ">> Instead of using the i2c_device_id struct , use of_device_id struct \n" + ">> for giving the\n" + ">> compatible property value.\n" + ">> compatble = \"<manufacturer>,<model>\"\n" + ">>\n" + ">\n" + "> No. We don't do that for other i2c drivers, and the i2c subsystem handles\n" + "> this case, so it does not sense to start that with this driver just\n" + "> for the sake of making the code more complicated than it has to be.\n" + ">\n" + "> Thanks,\n" + "> Guenter\n" + > -48803b913d9c0031eef0af3bcac91635f6e1f7e5180f7eafbb3fc0510636d823 +c31fb60410785520566a7bec928fbf0c871c4f2b2629376b478d0790f85a20b9
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.