diff for duplicates of <53A138A0.4010704@gmail.com> diff --git a/a/1.txt b/N1/1.txt index 3f90fd2..ae02348 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,228 +1,394 @@ -T24gMDYvMTgvMjAxNCAxMTo0NiBBTSwgSGVpa28gU2Nob2NoZXIgd3JvdGU6Cj4gSGVsbG8gVmFy -a2EsCj4KPiBBbSAxOC4wNi4yMDE0IDA3OjQ2LCBzY2hyaWViIFZhcmthIEJoYWRyYW06Cj4+IEhp -LAo+Pgo+PiBPbiAwNi8xOC8yMDE0IDExOjA3IEFNLCBIZWlrbyBTY2hvY2hlciB3cm90ZToKPj4+ -IERyaXZlciBmb3IgdGhlIFRJIFRNUDEwMy4KPj4+Cj4+PiBUaGUgVEkgVE1QMTAzIGlzIHNpbWls -YXIgdG8gdGhlIFRNUDEwMi4gSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4+IGJ5IGhhdmlu -ZyBvbmx5IDggYml0IHJlZ2lzdGVycy4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hv -Y2hlciA8aHNAZGVueC5kZT4KPj4+Cj4+PiAtLS0KPj4+Cj4+PiBDYzogSmVhbiBEZWx2YXJlIDxr -aGFsaUBsaW51eC1mci5vcmc+Cj4+PiBDYzogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMu -bmV0Pgo+Pj4gQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKPj4+IENjOiBkZXZpY2V0 -cmVlQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IGxpbnV4LWRvY0B2Z2VyLmtlcm5lbC5vcmcKPj4+ -IENjOiBNYXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPgo+Pj4KPj4+IC0gY2hhbmdl -IGZvciB2MjoKPj4+IC0gYWRkIGNvbW1lbnRzIGZyb20gR3VlbnRlclJvZWNrOgo+Pj4gLSByZW1v -dmUgQ2MgZnJvbSBjb21taXQgc3ViamVjdAo+Pj4gLSBhZGQgZGV2aWNldHJlZSBtYWludGFpbmVy -Cj4+PiAtIG1vdmUgRG9jdW1lbnRhdGlvbiB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+ -Pj4gLSByZW1vdmUgZGV2aWNldHJlZSBiaW5kaW5ncyBmcm9tIERvY3VtZW50YXRpb24KPj4+IC0g -YWRkIGNvbXBhdGlibGUgc3RyaW5nIHRvCj4+PiAiRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2Jp -bmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0Igo+Pj4gLSByZW1vdmUgQ2FtZWxDYXNlCj4+ -PiAtIGZpeCBDb2RpbmdzdHlsZSBpc3N1ZXMKPj4+IC0gdXNlIEFUVFJJQlVURV9HUk9VUFMgYW5k -IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCkKPj4+IC0gcmVtb3ZlIHVu -c3VzZWQgZGVmaW5lIFRNUDEwM19DT05GSUdfUkRfT05MWQo+Pj4gLSByZXN0b3JlIGNvbmZpZyBy -ZWdpc3RlciB3aGVuIGV4aXQoKQo+Pj4gLSB1c2UgcmVnbWFwCj4+PiAtIGNoYW5nZXMgZm9yIHYz -Ogo+Pj4gYWdhaW4gYSBsb3Qgb2YgZmFudGFzdGljIHRpcHMgaG93IHRvIHVzZSByZWdtYXAgZWZm -aWNpZW50bHkKPj4+IGZyb20gR3VlbnRlciBSb2VjazoKPj4+IC0gZ2V0IHJpZCBvZiAic3RydWN0 -IHRtcDEwMyIKPj4+IC0gZ2V0IHJpZCBvZiAic3RhdGljIGNvbnN0IHU4IHRtcDEwM19yZWdbXSIK -Pj4+IC0gZ2V0IHJpZCBvZiBtdXRleCBsb2NrCj4+PiAtIGRyb3AgY29uZmlnX29yaWcgZW50aXJl -bHkKPj4+IC0gdXNlIHJlZ21hcF91cGRhdGVfYml0cygpCj4+PiAtIGNoYW5nZXMgZm9yIHY0Ogo+ -Pj4gLSBhZGQgY29tbWVudCBmcm9tIEd1ZW50ZXIgUm9lY2s6Cj4+PiBkZWZpbmUgVE1QMTAzX0NP -TkZJR19NQVNLIGFuZCBUTVAxMDNfQ09ORl9TRF9NQVNLCj4+PiBzZXBhcmF0ZWx5IHRvIGVuc3Vy -ZSB5b3UgY2F0Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVkIGJpdHMuCj4+PiAtIGNoYW5nZXMgZm9y -IHY1Ogo+Pj4gYWRkIGNvbW1lbnQgZnJvbSBHdWVudGVyIFJvZWNrOgo+Pj4gLSB1c2UgIiNkZWZp -bmUgVE1QMTAzX0NPTkZfU0QgVE1QMTAzX0NPTkZfTTEiCj4+PiBhZGQgY29tbWVudCBmcm9tIE1h -cmsgUnV0bGFuZDoKPj4+IC0gdXNlIGZ1bGwgc3RyaW5nIGZvciBEVCBjb21wYXRpYmxlIHN0cmlu -ZyBtYXRjaGluZywgaW5zdGVhZCBvZgo+Pj4gRFJJVkVSX05BTUUuIEdldCByaWQgY29tcGxldGUg -b2YgRFJJVkVSX05BTUUgZGVmaW5lLgo+Pj4KPj4+IC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ky -Yy90cml2aWFsLWRldmljZXMudHh0IHwgMSArCj4+PiBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEw -MyB8IDI4ICsrKwo+Pj4gZHJpdmVycy9od21vbi9LY29uZmlnIHwgMTAgKwo+Pj4gZHJpdmVycy9o -d21vbi9NYWtlZmlsZSB8IDEgKwo+Pj4gZHJpdmVycy9od21vbi90bXAxMDMuYyB8IDIwNSArKysr -KysrKysrKysrKysrKysrKysKPj4+IDUgZmlsZXMgY2hhbmdlZCwgMjQ1IGluc2VydGlvbnMoKykK -Pj4+IGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+Pj4gY3Jl -YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4+Cj4+PiBkaWZmIC0tZ2l0 -IAo+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2 -aWNlcy50eHQgCj4+PiBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJp -dmlhbC1kZXZpY2VzLnR4dAo+Pj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2NDQKPj4+IC0t -LSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2Vz -LnR4dAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2 -aWFsLWRldmljZXMudHh0Cj4+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgwIE00MVQ4MCAt -IFNFUklBTCBBQ0NFU1MgUlRDIFdJVEggQUxBUk1TCj4+PiB0YW9zLHRzbDI1NTAgQW1iaWVudCBM -aWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJmYWNlCj4+PiB0aSx0 -c2MyMDAzIEkyQyBUb3VjaC1TY3JlZW4gQ29udHJvbGxlcgo+Pj4gdGksdG1wMTAyIExvdyBQb3dl -ciBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvciB3aXRoIFNNQlVTL1R3byBXaXJlIAo+Pj4gU2Vy -aWFsIEludGVyZmFjZQo+Pj4gK3RpLHRtcDEwMyBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJhdHVy -ZSBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSAKPj4+IFNlcmlhbCBJbnRlcmZhY2UKPj4+IHRp -LHRtcDI3NSBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvcgo+Pj4gd2luYm9uZCx3cGN0MzAxIGky -YyB0cnVzdGVkIHBsYXRmb3JtIG1vZHVsZSAoVFBNKQo+Pj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50 -YXRpb24vaHdtb24vdG1wMTAzIGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMKPj4+IG5ldyBm -aWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAwMDAwLi5lYzAwYTE1Cj4+PiAtLS0gL2Rldi9u -dWxsCj4+PiArKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+Pj4gQEAgLTAsMCArMSwy -OCBAQAo+Pj4gK0tlcm5lbCBkcml2ZXIgdG1wMTAzCj4+PiArPT09PT09PT09PT09PT09PT09PT0K -Pj4+ICsKPj4+ICtTdXBwb3J0ZWQgY2hpcHM6Cj4+PiArICogVGV4YXMgSW5zdHJ1bWVudHMgVE1Q -MTAzCj4+PiArIFByZWZpeDogJ3RtcDEwMycKPj4+ICsgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUK -Pj4+ICsgUHJvZHVjdCBpbmZvIGFuZCBkYXRhc2hlZXQ6IGh0dHA6Ly93d3cudGkuY29tL3Byb2R1 -Y3QvdG1wMTAzCj4+PiArCj4+PiArQXV0aG9yOgo+Pj4gKyBIZWlrbyBTY2hvY2hlciA8aHNAZGVu -eC5kZT4KPj4+ICsKPj4+ICtEZXNjcmlwdGlvbgo+Pj4gKy0tLS0tLS0tLS0tCj4+PiArCj4+PiAr -VGhlIFRNUDEwMyBpcyBhIGRpZ2l0YWwgb3V0cHV0IHRlbXBlcmF0dXJlIHNlbnNvciBpbiBhIGZv -dXItYmFsbAo+Pj4gK3dhZmVyIGNoaXAtc2NhbGUgcGFja2FnZSAoV0NTUCkuIFRoZSBUTVAxMDMg -aXMgY2FwYWJsZSBvZiByZWFkaW5nCj4+PiArdGVtcGVyYXR1cmVzIHRvIGEgcmVzb2x1dGlvbiBv -ZiAxwrBDLiBUaGUgVE1QMTAzIGlzIHNwZWNpZmllZCBmb3IKPj4+ICtvcGVyYXRpb24gb3ZlciBh -IHRlbXBlcmF0dXJlIHJhbmdlIG9mIOKAkzQwwrBDIHRvICsxMjXCsEMuCj4+PiArCj4+PiArUmVz -b2x1dGlvbjogOCBCaXRzCj4+PiArQWNjdXJhY3k6IMKxMcKwQyBUeXAgKOKAkzEwwrBDIHRvICsx -MDDCsEMpCj4+PiArCj4+PiArVGhlIGRyaXZlciBwcm92aWRlcyB0aGUgY29tbW9uIHN5c2ZzLWlu -dGVyZmFjZSBmb3IgdGVtcGVyYXR1cmVzIChzZWUKPj4+ICtEb2N1bWVudGF0aW9uL2h3bW9uL3N5 -c2ZzLWludGVyZmFjZSB1bmRlciBUZW1wZXJhdHVyZXMpLgo+Pj4gKwo+Pj4gK1BsZWFzZSByZWZl -ciBob3cgdG8gaW5zdGFudGlhdGUgdGhpcyBkcml2ZXI6Cj4+PiArRG9jdW1lbnRhdGlvbi9pMmMv -aW5zdGFudGlhdGluZy1kZXZpY2VzCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29u -ZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCj4+PiBpbmRleCAwODUzMWExLi5jODgyZDRiIDEw -MDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCj4+PiArKysgYi9kcml2ZXJzL2h3 -bW9uL0tjb25maWcKPj4+IEBAIC0xMzkxLDYgKzEzOTEsMTYgQEAgY29uZmlnIFNFTlNPUlNfVE1Q -MTAyCj4+PiBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28s -IHRoZSBtb2R1bGUKPj4+IHdpbGwgYmUgY2FsbGVkIHRtcDEwMi4KPj4+ICtjb25maWcgU0VOU09S -U19UTVAxMDMKPj4+ICsgdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRNUDEwMyIKPj4+ICsg -ZGVwZW5kcyBvbiBJMkMKPj4+ICsgaGVscAo+Pj4gKyBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBn -ZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+PiArIHNlbnNvciBjaGlw -cy4KPj4+ICsKPj4+ICsgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUu -IElmIHNvLCB0aGUgbW9kdWxlCj4+PiArIHdpbGwgYmUgY2FsbGVkIHRtcDEwMy4KPj4+ICsKPj4+ -IGNvbmZpZyBTRU5TT1JTX1RNUDQwMQo+Pj4gdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRN -UDQwMSBhbmQgY29tcGF0aWJsZXMiCj4+PiBkZXBlbmRzIG9uIEkyQwo+Pj4gZGlmZiAtLWdpdCBh -L2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+PiBpbmRl -eCAzZGMwZjAyLi5jYzBkZjFlZiAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZp -bGUKPj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4+IEBAIC0xMzUsNiArMTM1LDcg -QEAgb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MikrPSBzbXNjNDdtMTkyLm8KPj4+IG9i -ai0kKENPTkZJR19TRU5TT1JTX0FNQzY4MjEpICs9IGFtYzY4MjEubwo+Pj4gb2JqLSQoQ09ORklH -X1NFTlNPUlNfVEhNQzUwKSArPSB0aG1jNTAubwo+Pj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1Q -MTAyKSArPSB0bXAxMDIubwo+Pj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEwMykgKz0gdG1w -MTAzLm8KPj4+IG9iai0kKENPTkZJR19TRU5TT1JTX1RNUDQwMSkgKz0gdG1wNDAxLm8KPj4+IG9i -ai0kKENPTkZJR19TRU5TT1JTX1RNUDQyMSkgKz0gdG1wNDIxLm8KPj4+IG9iai0kKENPTkZJR19T -RU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMtaHdtb24ubwo+Pj4gZGlmZiAtLWdp -dCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+PiBu -ZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZTY5ZGJjYQo+Pj4gLS0tIC9k -ZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy9od21vbi90bXAxMDMuYwo+Pj4gQEAgLTAsMCArMSwy -MDUgQEAKPj4+ICsvKgo+Pj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMyBTTUJ1cyB0ZW1w -ZXJhdHVyZSBzZW5zb3IgZHJpdmVyCj4+PiArICogQ29weXJpZ2h0IChDKSAyMDE0IEhlaWtvIFNj -aG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKyAqCj4+PiArICogQmFzZWQgb246Cj4+PiArICogVGV4 -YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKPj4+ -ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxMCBTdGV2ZW4gS2luZyA8c2ZraW5nQGZkd2Rj -LmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug -Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCj4+PiBtb2RpZnkKPj4+ICsgKiBpdCB1bmRlciB0 -aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAo+Pj4gcHVibGlz -aGVkIGJ5Cj4+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp -b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl -ciB2ZXJzaW9uLgo+Pj4gKyAqCj4+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu -IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+PiArICogYnV0IFdJVEhPVVQgQU5Z -IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPj4+ICsgKiBN -RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0 -aGUKPj4+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ -Pj4gKyAqCj4+PiArICovCj4+PiArCj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4g -KyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4+ -ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Cj4+ -PiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2Vy -ci5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9k -ZXZpY2UuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgo+Pj4gKyNpbmNsdWRlIDxs -aW51eC9yZWdtYXAuaD4KPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19URU1QX1JFRyAweDAwCj4+ -PiArI2RlZmluZSBUTVAxMDNfQ09ORl9SRUcgMHgwMQo+Pj4gKyNkZWZpbmUgVE1QMTAzX1RMT1df -UkVHIDB4MDIKPj4+ICsjZGVmaW5lIFRNUDEwM19USElHSF9SRUcgMHgwMwo+Pj4gKwo+Pj4gKyNk -ZWZpbmUgVE1QMTAzX0NPTkZfTTAgMHgwMQo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTTEgMHgw -Mgo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTEMgMHgwNAo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NP -TkZfRkwgMHgwOAo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfRkggMHgxMAo+Pj4gKyNkZWZpbmUg -VE1QMTAzX0NPTkZfQ1IwIDB4MjAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0NSMSAweDQwCj4+ -PiArI2RlZmluZSBUTVAxMDNfQ09ORl9JRCAweDgwCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9T -RCAoVE1QMTAzX0NPTkZfTTEpCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRF9NQVNLIChUTVAx -MDNfQ09ORl9NMCB8IFRNUDEwM19DT05GX00xKQo+Pj4gKwo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NP -TkZJRyAoVE1QMTAzX0NPTkZfQ1IxIHwgVE1QMTAzX0NPTkZfTTEpCj4+PiArI2RlZmluZSBUTVAx -MDNfQ09ORklHX01BU0sgKFRNUDEwM19DT05GX0NSMCB8IFRNUDEwM19DT05GX0NSMSB8IFwKPj4+ -ICsgVE1QMTAzX0NPTkZfTTAgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsKPj4+ICtzdGF0aWMgaW5s -aW5lIGludCB0bXAxMDNfcmVnX3RvX21jKHM4IHZhbCkKPj4+ICt7Cj4+PiArIHJldHVybiB2YWwg -KiAxMDAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW5saW5lIHU4IHRtcDEwM19tY190b19y -ZWcoaW50IHZhbCkKPj4+ICt7Cj4+PiArIHJldHVybiBESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDEw -MDApOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2hvd190ZW1wKHN0 -cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+ -PiArIGNoYXIgKmJ1ZikKPj4+ICt7Cj4+PiArIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0 -ZSAqc2RhID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+Pj4gKyBzdHJ1Y3QgcmVnbWFwICpy -ZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4+ICsgdW5zaWduZWQgaW50IHJlZ3ZhbDsK -Pj4+ICsgaW50IHJldDsKPj4+ICsKPj4+ICsgcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBzZGEt -PmluZGV4LCAmcmVndmFsKTsKPj4+ICsgaWYgKHJldCA8IDApCj4+PiArIHJldHVybiByZXQ7Cj4+ -PiArCj4+PiArIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0bXAxMDNfcmVnX3RvX21jKHJl -Z3ZhbCkpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2V0X3RlbXAo -c3RydWN0IGRldmljZSAqZGV2LAo+Pj4gKyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwK -Pj4+ICsgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCj4+PiArewo+Pj4gKyBzdHJ1Y3Qg -c2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsK -Pj4+ICsgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+PiAr -IGxvbmcgdmFsOwo+Pj4gKyBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyBpZiAoa3N0cnRvbChidWYsIDEw -LCAmdmFsKSA8IDApCj4+PiArIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyB2YWwgPSBjbGFt -cF92YWwodmFsLCAtNTUwMDAsIDEyNzAwMCk7Cj4+PiArIHJldCA9IHJlZ21hcF93cml0ZShyZWdt -YXAsIHNkYS0+aW5kZXgsIHRtcDEwM19tY190b19yZWcodmFsKSk7Cj4+PiArIHJldHVybiByZXQg -PyByZXQgOiBjb3VudDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU -Uih0ZW1wMV9pbnB1dCwgU19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwgCj4+PiBOVUxMICwKPj4+ -ICsgVE1QMTAzX1RFTVBfUkVHKTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS -KHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3Nob3dfdGVtcCwKPj4+ -ICsgdG1wMTAzX3NldF90ZW1wLCBUTVAxMDNfVExPV19SRUcpOwo+Pj4gKwo+Pj4gK3N0YXRpYyBT -RU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgCj4+PiB0bXAx -MDNfc2hvd190ZW1wLAo+Pj4gKyB0bXAxMDNfc2V0X3RlbXAsIFRNUDEwM19USElHSF9SRUcpOwo+ -Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDNfYXR0cnNbXSA9IHsKPj4+ -ICsgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAo+Pj4gKyAmc2Vu -c29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAo+Pj4gKyAmc2Vuc29yX2Rldl9h -dHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAo+Pj4gKyBOVUxMCj4+PiArfTsKPj4+ICtBVFRS -SUJVVEVfR1JPVVBTKHRtcDEwMyk7Cj4+PiArCj4+PiArc3RhdGljIGJvb2wgdG1wMTAzX3JlZ21h -cF9pc192b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIAo+Pj4gaW50IHJlZykK -Pj4+ICt7Cj4+PiArIHJldHVybiByZWcgPT0gVE1QMTAzX1RFTVBfUkVHOwo+Pj4gK30KPj4+ICsK -Pj4+ICtzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgdG1wMTAzX3JlZ21hcF9jb25maWcgPSB7 -Cj4+PiArIC5yZWdfYml0cyA9IDgsCj4+PiArIC52YWxfYml0cyA9IDgsCj4+PiArIC5tYXhfcmVn -aXN0ZXIgPSBUTVAxMDNfVEhJR0hfUkVHLAo+Pj4gKyAudm9sYXRpbGVfcmVnID0gdG1wMTAzX3Jl -Z21hcF9pc192b2xhdGlsZSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdG1wMTAzX3By -b2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCj4+PiArIGNvbnN0IHN0cnVjdCBpMmNfZGV2 -aWNlX2lkICppZCkKPj4+ICt7Cj4+PiArIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRl -djsKPj4+ICsgc3RydWN0IGRldmljZSAqaHdtb25fZGV2Owo+Pj4gKyBzdHJ1Y3QgcmVnbWFwICpy -ZWdtYXA7Cj4+PiArIGludCByZXQ7Cj4+PiArCj4+PiArIGlmICghaTJjX2NoZWNrX2Z1bmN0aW9u -YWxpdHkoY2xpZW50LT5hZGFwdGVyLAo+Pj4gKyBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7 -Cj4+PiArIGRldl9lcnIoJmNsaWVudC0+ZGV2LAo+Pj4gKyAiYWRhcHRlciBkb2Vzbid0IHN1cHBv -cnQgU01CdXMgYnl0ZSB0cmFuc2FjdGlvbnNcbiIpOwo+Pj4gKyByZXR1cm4gLUVOT0RFVjsKPj4+ -ICsgfQo+Pj4gKwo+Pj4gKyByZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ0 -bXAxMDNfcmVnbWFwX2NvbmZpZyk7Cj4+PiArIGlmIChJU19FUlIocmVnbWFwKSkgewo+Pj4gKyBk -ZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOwo+Pj4gKyBy -ZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+Pj4gKyB9Cj4+PiArCj4+PiArIHJldCA9IHJlZ21hcF91 -cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JFRywgVE1QMTAzX0NPTkZJR19NQVNLLAo+ -Pj4gKyBUTVAxMDNfQ09ORklHKTsKPj4+ICsgaWYgKHJldCA8IDApIHsKPj4+ICsgZGV2X2Vycigm -Y2xpZW50LT5kZXYsICJlcnJvciB3cml0aW5nIGNvbmZpZyByZWdpc3RlclxuIik7Cj4+PiArIHJl -dHVybiByZXQ7Cj4+PiArIH0KPj4+ICsKPj4+ICsgaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3Jl -Z2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAo+Pj4gKyByZWdtYXAsIHRtcDEw -M19ncm91cHMpOwo+Pj4gKyByZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cj4+PiAr -fQo+Pj4gKwo+Pj4gKyNpZmRlZiBDT05GSUdfUE0KPj4+ICtzdGF0aWMgaW50IHRtcDEwM19zdXNw -ZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArIHN0cnVjdCByZWdtYXAgKnJlZ21h -cCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyByZXR1cm4gcmVnbWFwX3VwZGF0 -ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyBUTVAxMDNfQ09ORl9TRF9NQVNL -LCAwKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcmVzdW1lKHN0cnVjdCBk -ZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRf -ZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21h -cCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyBUTVAxMDNfQ09ORl9TRF9NQVNLLCBUTVAxMDNfQ09O -Rl9TRCk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0 -bXAxMDNfZGV2X3BtX29wcyA9IHsKPj4+ICsgLnN1c3BlbmQgPSB0bXAxMDNfc3VzcGVuZCwKPj4+ -ICsgLnJlc3VtZSA9IHRtcDEwM19yZXN1bWUsCj4+PiArfTsKPj4+ICsKPj4+ICsjZGVmaW5lIFRN -UDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+PiArI2Vsc2UKPj4+ICsjZGVm -aW5lIFRNUDEwM19ERVZfUE1fT1BTIE5VTEwKPj4+ICsjZW5kaWYgLyogQ09ORklHX1BNICovCj4+ -PiArCj4+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRtcDEwM19pZFtdID0g -ewo+Pj4gKyB7ICJ0bXAxMDMiLCAwIH0sCj4+PiArIHsgfQo+Pj4gK307Cj4+Cj4+IEluIHRoZSBi -aW5kaW5ncyB5b3UgYXJlIGdpdmluZyB0aGUgY29tcGF0aWJsZSBwcm9wZXJ0eSBhcyA6IAo+PiB0 -aSx0bXAxMDMsIGJ1dCBoZXJlIG9ubHkgdG1wMTAzLgo+Pgo+PiBJbnN0ZWFkIG9mIHVzaW5nIHRo -ZSBpMmNfZGV2aWNlX2lkIHN0cnVjdCAsIHVzZSBvZl9kZXZpY2VfaWQgc3RydWN0IAo+PiBmb3Ig -Z2l2aW5nIHRoZQo+PiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+PiBjb21wYXRibGUgPSAi -PG1hbnVmYWN0dXJlcj4sPG1vZGVsPiIKPgo+IFRoZXJlIGFyZSBhIGxvdCBvZiBkcml2ZXJzIGlu -IGRyaXZlcnMvaHdtb24gd2hpY2ggdXNlICJpMmNfZGV2aWNlX2lkIAo+IHN0cnVjdCIsCj4gYW5k -IGZvciB0aGVtIG9ubHkgIm1vZGVsIiBpcyBuZWNlc3NhcnkgLi4uCj4KPiBBcyB0aGlzIGlzIG5v -dCBhIHBsYXRmb3JtIGRyaXZlciwgSSBkbyBub3Qga25vdywgaWYgIm9mX2RldmljZV9pZCBzdHJ1 -Y3QiCj4gaXMgcG9zc2libGUgdG8gdXNlLiBGb3IgdGhhdCwgaXQgbXVzdCBiZSBjb252ZXJ0ZWQg -dG8gYSBwbGF0Zm9ybQo+IGRldmljZSBkcml2ZXIgLi4uCj4KSSB0aG91Z2h0IHlvdXIgYXJlIHVz -aW5nIHRoZSBkZXZpY2V0cmVlIHNvdXJjZSB0byBsb2FkIHRoZSBkcml2ZXIuIEluIAp0aGF0IGNh -c2UgaXQgbmVlZCBub3QgdG8gYmUgcGxhdGZvcm0gZHJpdmVyLgp3ZSBjYW4gdXNlICJvZl9kZXZp -Y2VfaWQgc3RydWN0IiB3aGljaCBtYXRjaGVzIHRoZSBiaW5kaW5ncyBpbiB5b3VyIAp0cml2aWFs -LWRldmljZXMudHh0CgpUaGFua3MKVmFya2EgQmhhZHJhbQo+IGJ5ZSwKPiBIZWlrbwo+Pgo+Pj4g -K01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bXAxMDNfaWQpOwo+Pj4gKytzdGF0aWMgc3RydWN0 -IGkyY19kcml2ZXIgdG1wMTAzX2RyaXZlciA9IHsKPj4+ICsgLmRyaXZlciA9IHsKPj4+ICsgLm5h -bWUgPSAidG1wMTAzIiwKPj4+ICsgLnBtID0gVE1QMTAzX0RFVl9QTV9PUFMsCj4+PiArIH0sCj4+ -PiArIC5wcm9iZSA9IHRtcDEwM19wcm9iZSwKPj4+ICsgLmlkX3RhYmxlID0gdG1wMTAzX2lkLAo+ -Pj4gK307Cj4+PiArCj4+PiArbW9kdWxlX2kyY19kcml2ZXIodG1wMTAzX2RyaXZlcik7Cj4+PiAr -Cj4+PiArTU9EVUxFX0FVVEhPUigiSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+Iik7Cj4+PiAr -TU9EVUxFX0RFU0NSSVBUSU9OKCJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMgdGVtcGVyYXR1cmUg -c2Vuc29yIAo+Pj4gZHJpdmVyIik7Cj4+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+Pgo+Pgo+ -Pgo+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0t -c2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlz -dHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz +On 06/18/2014 11:46 AM, Heiko Schocher wrote: +> Hello Varka, +> +> Am 18.06.2014 07:46, schrieb Varka Bhadram: +>> 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 +>>> 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>" +> +> There are a lot of drivers in drivers/hwmon which use "i2c_device_id +> struct", +> and for them only "model" is necessary ... +> +> As this is not a platform driver, I do not know, if "of_device_id struct" +> is possible to use. For that, it must be converted to a platform +> device driver ... +> +I thought your are using the devicetree source to load the driver. In +that case it need not to be platform driver. +we can use "of_device_id struct" which matches the bindings in your +trivial-devices.txt + +Thanks +Varka Bhadram +> bye, +> Heiko +>> +>>> +MODULE_DEVICE_TABLE(i2c, tmp103_id); +>>> ++static struct i2c_driver tmp103_driver = { +>>> + .driver = { +>>> + .name = "tmp103", +>>> + .pm = TMP103_DEV_PM_OPS, +>>> + }, +>>> + .probe = tmp103_probe, +>>> + .id_table = tmp103_id, +>>> +}; +>>> + +>>> +module_i2c_driver(tmp103_driver); +>>> + +>>> +MODULE_AUTHOR("Heiko Schocher <hs@denx.de>"); +>>> +MODULE_DESCRIPTION("Texas Instruments TMP103 temperature sensor +>>> driver"); +>>> +MODULE_LICENSE("GPL"); +>> +>> +>> +> diff --git a/a/content_digest b/N1/content_digest index dcd7b47..de42e4a 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,8 +2,8 @@ "ref\053A127BB.7090802@gmail.com\0" "ref\053A12ED2.4080004@denx.de\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 07:10:40 +0000\0" + "Subject\0Re: [PATCH v5] hwmon: Driver for TI TMP103 temperature sensor\0" + "Date\0Wed, 18 Jun 2014 12:28:40 +0530\0" "To\0hs@denx.de\0" "Cc\0lm-sensors@lm-sensors.org" Jean Delvare <khali@linux-fr.org> @@ -14,233 +14,399 @@ " Mark Rutland <mark.rutland@arm.com>\0" "\00:1\0" "b\0" - "T24gMDYvMTgvMjAxNCAxMTo0NiBBTSwgSGVpa28gU2Nob2NoZXIgd3JvdGU6Cj4gSGVsbG8gVmFy\n" - "a2EsCj4KPiBBbSAxOC4wNi4yMDE0IDA3OjQ2LCBzY2hyaWViIFZhcmthIEJoYWRyYW06Cj4+IEhp\n" - "LAo+Pgo+PiBPbiAwNi8xOC8yMDE0IDExOjA3IEFNLCBIZWlrbyBTY2hvY2hlciB3cm90ZToKPj4+\n" - "IERyaXZlciBmb3IgdGhlIFRJIFRNUDEwMy4KPj4+Cj4+PiBUaGUgVEkgVE1QMTAzIGlzIHNpbWls\n" - "YXIgdG8gdGhlIFRNUDEwMi4gSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4+IGJ5IGhhdmlu\n" - "ZyBvbmx5IDggYml0IHJlZ2lzdGVycy4KPj4+Cj4+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hv\n" - "Y2hlciA8aHNAZGVueC5kZT4KPj4+Cj4+PiAtLS0KPj4+Cj4+PiBDYzogSmVhbiBEZWx2YXJlIDxr\n" - "aGFsaUBsaW51eC1mci5vcmc+Cj4+PiBDYzogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMu\n" - "bmV0Pgo+Pj4gQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKPj4+IENjOiBkZXZpY2V0\n" - "cmVlQHZnZXIua2VybmVsLm9yZwo+Pj4gQ2M6IGxpbnV4LWRvY0B2Z2VyLmtlcm5lbC5vcmcKPj4+\n" - "IENjOiBNYXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPgo+Pj4KPj4+IC0gY2hhbmdl\n" - "IGZvciB2MjoKPj4+IC0gYWRkIGNvbW1lbnRzIGZyb20gR3VlbnRlclJvZWNrOgo+Pj4gLSByZW1v\n" - "dmUgQ2MgZnJvbSBjb21taXQgc3ViamVjdAo+Pj4gLSBhZGQgZGV2aWNldHJlZSBtYWludGFpbmVy\n" - "Cj4+PiAtIG1vdmUgRG9jdW1lbnRhdGlvbiB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+\n" - "Pj4gLSByZW1vdmUgZGV2aWNldHJlZSBiaW5kaW5ncyBmcm9tIERvY3VtZW50YXRpb24KPj4+IC0g\n" - "YWRkIGNvbXBhdGlibGUgc3RyaW5nIHRvCj4+PiAiRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2Jp\n" - "bmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0Igo+Pj4gLSByZW1vdmUgQ2FtZWxDYXNlCj4+\n" - "PiAtIGZpeCBDb2RpbmdzdHlsZSBpc3N1ZXMKPj4+IC0gdXNlIEFUVFJJQlVURV9HUk9VUFMgYW5k\n" - "IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCkKPj4+IC0gcmVtb3ZlIHVu\n" - "c3VzZWQgZGVmaW5lIFRNUDEwM19DT05GSUdfUkRfT05MWQo+Pj4gLSByZXN0b3JlIGNvbmZpZyBy\n" - "ZWdpc3RlciB3aGVuIGV4aXQoKQo+Pj4gLSB1c2UgcmVnbWFwCj4+PiAtIGNoYW5nZXMgZm9yIHYz\n" - "Ogo+Pj4gYWdhaW4gYSBsb3Qgb2YgZmFudGFzdGljIHRpcHMgaG93IHRvIHVzZSByZWdtYXAgZWZm\n" - "aWNpZW50bHkKPj4+IGZyb20gR3VlbnRlciBSb2VjazoKPj4+IC0gZ2V0IHJpZCBvZiAic3RydWN0\n" - "IHRtcDEwMyIKPj4+IC0gZ2V0IHJpZCBvZiAic3RhdGljIGNvbnN0IHU4IHRtcDEwM19yZWdbXSIK\n" - "Pj4+IC0gZ2V0IHJpZCBvZiBtdXRleCBsb2NrCj4+PiAtIGRyb3AgY29uZmlnX29yaWcgZW50aXJl\n" - "bHkKPj4+IC0gdXNlIHJlZ21hcF91cGRhdGVfYml0cygpCj4+PiAtIGNoYW5nZXMgZm9yIHY0Ogo+\n" - "Pj4gLSBhZGQgY29tbWVudCBmcm9tIEd1ZW50ZXIgUm9lY2s6Cj4+PiBkZWZpbmUgVE1QMTAzX0NP\n" - "TkZJR19NQVNLIGFuZCBUTVAxMDNfQ09ORl9TRF9NQVNLCj4+PiBzZXBhcmF0ZWx5IHRvIGVuc3Vy\n" - "ZSB5b3UgY2F0Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVkIGJpdHMuCj4+PiAtIGNoYW5nZXMgZm9y\n" - "IHY1Ogo+Pj4gYWRkIGNvbW1lbnQgZnJvbSBHdWVudGVyIFJvZWNrOgo+Pj4gLSB1c2UgIiNkZWZp\n" - "bmUgVE1QMTAzX0NPTkZfU0QgVE1QMTAzX0NPTkZfTTEiCj4+PiBhZGQgY29tbWVudCBmcm9tIE1h\n" - "cmsgUnV0bGFuZDoKPj4+IC0gdXNlIGZ1bGwgc3RyaW5nIGZvciBEVCBjb21wYXRpYmxlIHN0cmlu\n" - "ZyBtYXRjaGluZywgaW5zdGVhZCBvZgo+Pj4gRFJJVkVSX05BTUUuIEdldCByaWQgY29tcGxldGUg\n" - "b2YgRFJJVkVSX05BTUUgZGVmaW5lLgo+Pj4KPj4+IC4uLi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ky\n" - "Yy90cml2aWFsLWRldmljZXMudHh0IHwgMSArCj4+PiBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEw\n" - "MyB8IDI4ICsrKwo+Pj4gZHJpdmVycy9od21vbi9LY29uZmlnIHwgMTAgKwo+Pj4gZHJpdmVycy9o\n" - "d21vbi9NYWtlZmlsZSB8IDEgKwo+Pj4gZHJpdmVycy9od21vbi90bXAxMDMuYyB8IDIwNSArKysr\n" - "KysrKysrKysrKysrKysrKysKPj4+IDUgZmlsZXMgY2hhbmdlZCwgMjQ1IGluc2VydGlvbnMoKykK\n" - "Pj4+IGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+Pj4gY3Jl\n" - "YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvaHdtb24vdG1wMTAzLmMKPj4+Cj4+PiBkaWZmIC0tZ2l0\n" - "IAo+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2\n" - "aWNlcy50eHQgCj4+PiBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJp\n" - "dmlhbC1kZXZpY2VzLnR4dAo+Pj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2NDQKPj4+IC0t\n" - "LSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2Vz\n" - "LnR4dAo+Pj4gKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2\n" - "aWFsLWRldmljZXMudHh0Cj4+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgwIE00MVQ4MCAt\n" - "IFNFUklBTCBBQ0NFU1MgUlRDIFdJVEggQUxBUk1TCj4+PiB0YW9zLHRzbDI1NTAgQW1iaWVudCBM\n" - "aWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJmYWNlCj4+PiB0aSx0\n" - "c2MyMDAzIEkyQyBUb3VjaC1TY3JlZW4gQ29udHJvbGxlcgo+Pj4gdGksdG1wMTAyIExvdyBQb3dl\n" - "ciBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvciB3aXRoIFNNQlVTL1R3byBXaXJlIAo+Pj4gU2Vy\n" - "aWFsIEludGVyZmFjZQo+Pj4gK3RpLHRtcDEwMyBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJhdHVy\n" - "ZSBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSAKPj4+IFNlcmlhbCBJbnRlcmZhY2UKPj4+IHRp\n" - "LHRtcDI3NSBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvcgo+Pj4gd2luYm9uZCx3cGN0MzAxIGky\n" - "YyB0cnVzdGVkIHBsYXRmb3JtIG1vZHVsZSAoVFBNKQo+Pj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50\n" - "YXRpb24vaHdtb24vdG1wMTAzIGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMKPj4+IG5ldyBm\n" - "aWxlIG1vZGUgMTAwNjQ0Cj4+PiBpbmRleCAwMDAwMDAwLi5lYzAwYTE1Cj4+PiAtLS0gL2Rldi9u\n" - "dWxsCj4+PiArKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+Pj4gQEAgLTAsMCArMSwy\n" - "OCBAQAo+Pj4gK0tlcm5lbCBkcml2ZXIgdG1wMTAzCj4+PiArPT09PT09PT09PT09PT09PT09PT0K\n" - "Pj4+ICsKPj4+ICtTdXBwb3J0ZWQgY2hpcHM6Cj4+PiArICogVGV4YXMgSW5zdHJ1bWVudHMgVE1Q\n" - "MTAzCj4+PiArIFByZWZpeDogJ3RtcDEwMycKPj4+ICsgQWRkcmVzc2VzIHNjYW5uZWQ6IG5vbmUK\n" - "Pj4+ICsgUHJvZHVjdCBpbmZvIGFuZCBkYXRhc2hlZXQ6IGh0dHA6Ly93d3cudGkuY29tL3Byb2R1\n" - "Y3QvdG1wMTAzCj4+PiArCj4+PiArQXV0aG9yOgo+Pj4gKyBIZWlrbyBTY2hvY2hlciA8aHNAZGVu\n" - "eC5kZT4KPj4+ICsKPj4+ICtEZXNjcmlwdGlvbgo+Pj4gKy0tLS0tLS0tLS0tCj4+PiArCj4+PiAr\n" - "VGhlIFRNUDEwMyBpcyBhIGRpZ2l0YWwgb3V0cHV0IHRlbXBlcmF0dXJlIHNlbnNvciBpbiBhIGZv\n" - "dXItYmFsbAo+Pj4gK3dhZmVyIGNoaXAtc2NhbGUgcGFja2FnZSAoV0NTUCkuIFRoZSBUTVAxMDMg\n" - "aXMgY2FwYWJsZSBvZiByZWFkaW5nCj4+PiArdGVtcGVyYXR1cmVzIHRvIGEgcmVzb2x1dGlvbiBv\n" - "ZiAxwrBDLiBUaGUgVE1QMTAzIGlzIHNwZWNpZmllZCBmb3IKPj4+ICtvcGVyYXRpb24gb3ZlciBh\n" - "IHRlbXBlcmF0dXJlIHJhbmdlIG9mIOKAkzQwwrBDIHRvICsxMjXCsEMuCj4+PiArCj4+PiArUmVz\n" - "b2x1dGlvbjogOCBCaXRzCj4+PiArQWNjdXJhY3k6IMKxMcKwQyBUeXAgKOKAkzEwwrBDIHRvICsx\n" - "MDDCsEMpCj4+PiArCj4+PiArVGhlIGRyaXZlciBwcm92aWRlcyB0aGUgY29tbW9uIHN5c2ZzLWlu\n" - "dGVyZmFjZSBmb3IgdGVtcGVyYXR1cmVzIChzZWUKPj4+ICtEb2N1bWVudGF0aW9uL2h3bW9uL3N5\n" - "c2ZzLWludGVyZmFjZSB1bmRlciBUZW1wZXJhdHVyZXMpLgo+Pj4gKwo+Pj4gK1BsZWFzZSByZWZl\n" - "ciBob3cgdG8gaW5zdGFudGlhdGUgdGhpcyBkcml2ZXI6Cj4+PiArRG9jdW1lbnRhdGlvbi9pMmMv\n" - "aW5zdGFudGlhdGluZy1kZXZpY2VzCj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29u\n" - "ZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCj4+PiBpbmRleCAwODUzMWExLi5jODgyZDRiIDEw\n" - "MDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCj4+PiArKysgYi9kcml2ZXJzL2h3\n" - "bW9uL0tjb25maWcKPj4+IEBAIC0xMzkxLDYgKzEzOTEsMTYgQEAgY29uZmlnIFNFTlNPUlNfVE1Q\n" - "MTAyCj4+PiBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28s\n" - "IHRoZSBtb2R1bGUKPj4+IHdpbGwgYmUgY2FsbGVkIHRtcDEwMi4KPj4+ICtjb25maWcgU0VOU09S\n" - "U19UTVAxMDMKPj4+ICsgdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRNUDEwMyIKPj4+ICsg\n" - "ZGVwZW5kcyBvbiBJMkMKPj4+ICsgaGVscAo+Pj4gKyBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBn\n" - "ZXQgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+PiArIHNlbnNvciBjaGlw\n" - "cy4KPj4+ICsKPj4+ICsgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUu\n" - "IElmIHNvLCB0aGUgbW9kdWxlCj4+PiArIHdpbGwgYmUgY2FsbGVkIHRtcDEwMy4KPj4+ICsKPj4+\n" - "IGNvbmZpZyBTRU5TT1JTX1RNUDQwMQo+Pj4gdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFRN\n" - "UDQwMSBhbmQgY29tcGF0aWJsZXMiCj4+PiBkZXBlbmRzIG9uIEkyQwo+Pj4gZGlmZiAtLWdpdCBh\n" - "L2RyaXZlcnMvaHdtb24vTWFrZWZpbGUgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCj4+PiBpbmRl\n" - "eCAzZGMwZjAyLi5jYzBkZjFlZiAxMDA2NDQKPj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZp\n" - "bGUKPj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4+IEBAIC0xMzUsNiArMTM1LDcg\n" - "QEAgb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MikrPSBzbXNjNDdtMTkyLm8KPj4+IG9i\n" - "ai0kKENPTkZJR19TRU5TT1JTX0FNQzY4MjEpICs9IGFtYzY4MjEubwo+Pj4gb2JqLSQoQ09ORklH\n" - "X1NFTlNPUlNfVEhNQzUwKSArPSB0aG1jNTAubwo+Pj4gb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1Q\n" - "MTAyKSArPSB0bXAxMDIubwo+Pj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEwMykgKz0gdG1w\n" - "MTAzLm8KPj4+IG9iai0kKENPTkZJR19TRU5TT1JTX1RNUDQwMSkgKz0gdG1wNDAxLm8KPj4+IG9i\n" - "ai0kKENPTkZJR19TRU5TT1JTX1RNUDQyMSkgKz0gdG1wNDIxLm8KPj4+IG9iai0kKENPTkZJR19T\n" - "RU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMtaHdtb24ubwo+Pj4gZGlmZiAtLWdp\n" - "dCBhL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+PiBu\n" - "ZXcgZmlsZSBtb2RlIDEwMDY0NAo+Pj4gaW5kZXggMDAwMDAwMC4uZTY5ZGJjYQo+Pj4gLS0tIC9k\n" - "ZXYvbnVsbAo+Pj4gKysrIGIvZHJpdmVycy9od21vbi90bXAxMDMuYwo+Pj4gQEAgLTAsMCArMSwy\n" - "MDUgQEAKPj4+ICsvKgo+Pj4gKyAqIFRleGFzIEluc3RydW1lbnRzIFRNUDEwMyBTTUJ1cyB0ZW1w\n" - "ZXJhdHVyZSBzZW5zb3IgZHJpdmVyCj4+PiArICogQ29weXJpZ2h0IChDKSAyMDE0IEhlaWtvIFNj\n" - "aG9jaGVyIDxoc0BkZW54LmRlPgo+Pj4gKyAqCj4+PiArICogQmFzZWQgb246Cj4+PiArICogVGV4\n" - "YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKPj4+\n" - "ICsgKgo+Pj4gKyAqIENvcHlyaWdodCAoQykgMjAxMCBTdGV2ZW4gS2luZyA8c2ZraW5nQGZkd2Rj\n" - "LmNvbT4KPj4+ICsgKgo+Pj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug\n" - "Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCj4+PiBtb2RpZnkKPj4+ICsgKiBpdCB1bmRlciB0\n" - "aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAo+Pj4gcHVibGlz\n" - "aGVkIGJ5Cj4+PiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp\n" - "b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKPj4+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl\n" - "ciB2ZXJzaW9uLgo+Pj4gKyAqCj4+PiArICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu\n" - "IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4+PiArICogYnV0IFdJVEhPVVQgQU5Z\n" - "IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPj4+ICsgKiBN\n" - "RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0\n" - "aGUKPj4+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+\n" - "Pj4gKyAqCj4+PiArICovCj4+PiArCj4+PiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4g\n" - "KyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4+\n" - "ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Cj4+\n" - "PiArI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+Cj4+PiArI2luY2x1ZGUgPGxpbnV4L2Vy\n" - "ci5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+Pj4gKyNpbmNsdWRlIDxsaW51eC9k\n" - "ZXZpY2UuaD4KPj4+ICsjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgo+Pj4gKyNpbmNsdWRlIDxs\n" - "aW51eC9yZWdtYXAuaD4KPj4+ICsKPj4+ICsjZGVmaW5lIFRNUDEwM19URU1QX1JFRyAweDAwCj4+\n" - "PiArI2RlZmluZSBUTVAxMDNfQ09ORl9SRUcgMHgwMQo+Pj4gKyNkZWZpbmUgVE1QMTAzX1RMT1df\n" - "UkVHIDB4MDIKPj4+ICsjZGVmaW5lIFRNUDEwM19USElHSF9SRUcgMHgwMwo+Pj4gKwo+Pj4gKyNk\n" - "ZWZpbmUgVE1QMTAzX0NPTkZfTTAgMHgwMQo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTTEgMHgw\n" - "Mgo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTEMgMHgwNAo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NP\n" - "TkZfRkwgMHgwOAo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfRkggMHgxMAo+Pj4gKyNkZWZpbmUg\n" - "VE1QMTAzX0NPTkZfQ1IwIDB4MjAKPj4+ICsjZGVmaW5lIFRNUDEwM19DT05GX0NSMSAweDQwCj4+\n" - "PiArI2RlZmluZSBUTVAxMDNfQ09ORl9JRCAweDgwCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9T\n" - "RCAoVE1QMTAzX0NPTkZfTTEpCj4+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRF9NQVNLIChUTVAx\n" - "MDNfQ09ORl9NMCB8IFRNUDEwM19DT05GX00xKQo+Pj4gKwo+Pj4gKyNkZWZpbmUgVE1QMTAzX0NP\n" - "TkZJRyAoVE1QMTAzX0NPTkZfQ1IxIHwgVE1QMTAzX0NPTkZfTTEpCj4+PiArI2RlZmluZSBUTVAx\n" - "MDNfQ09ORklHX01BU0sgKFRNUDEwM19DT05GX0NSMCB8IFRNUDEwM19DT05GX0NSMSB8IFwKPj4+\n" - "ICsgVE1QMTAzX0NPTkZfTTAgfCBUTVAxMDNfQ09ORl9NMSkKPj4+ICsKPj4+ICtzdGF0aWMgaW5s\n" - "aW5lIGludCB0bXAxMDNfcmVnX3RvX21jKHM4IHZhbCkKPj4+ICt7Cj4+PiArIHJldHVybiB2YWwg\n" - "KiAxMDAwOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgaW5saW5lIHU4IHRtcDEwM19tY190b19y\n" - "ZWcoaW50IHZhbCkKPj4+ICt7Cj4+PiArIHJldHVybiBESVZfUk9VTkRfQ0xPU0VTVCh2YWwsIDEw\n" - "MDApOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2hvd190ZW1wKHN0\n" - "cnVjdCBkZXZpY2UgKmRldiwKPj4+ICsgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4+\n" - "PiArIGNoYXIgKmJ1ZikKPj4+ICt7Cj4+PiArIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0\n" - "ZSAqc2RhID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwo+Pj4gKyBzdHJ1Y3QgcmVnbWFwICpy\n" - "ZWdtYXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4+ICsgdW5zaWduZWQgaW50IHJlZ3ZhbDsK\n" - "Pj4+ICsgaW50IHJldDsKPj4+ICsKPj4+ICsgcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBzZGEt\n" - "PmluZGV4LCAmcmVndmFsKTsKPj4+ICsgaWYgKHJldCA8IDApCj4+PiArIHJldHVybiByZXQ7Cj4+\n" - "PiArCj4+PiArIHJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0bXAxMDNfcmVnX3RvX21jKHJl\n" - "Z3ZhbCkpOwo+Pj4gK30KPj4+ICsKPj4+ICtzdGF0aWMgc3NpemVfdCB0bXAxMDNfc2V0X3RlbXAo\n" - "c3RydWN0IGRldmljZSAqZGV2LAo+Pj4gKyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwK\n" - "Pj4+ICsgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCj4+PiArewo+Pj4gKyBzdHJ1Y3Qg\n" - "c2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsK\n" - "Pj4+ICsgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+PiAr\n" - "IGxvbmcgdmFsOwo+Pj4gKyBpbnQgcmV0Owo+Pj4gKwo+Pj4gKyBpZiAoa3N0cnRvbChidWYsIDEw\n" - "LCAmdmFsKSA8IDApCj4+PiArIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyB2YWwgPSBjbGFt\n" - "cF92YWwodmFsLCAtNTUwMDAsIDEyNzAwMCk7Cj4+PiArIHJldCA9IHJlZ21hcF93cml0ZShyZWdt\n" - "YXAsIHNkYS0+aW5kZXgsIHRtcDEwM19tY190b19yZWcodmFsKSk7Cj4+PiArIHJldHVybiByZXQg\n" - "PyByZXQgOiBjb3VudDsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRU\n" - "Uih0ZW1wMV9pbnB1dCwgU19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwgCj4+PiBOVUxMICwKPj4+\n" - "ICsgVE1QMTAzX1RFTVBfUkVHKTsKPj4+ICsKPj4+ICtzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRS\n" - "KHRlbXAxX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIAo+Pj4gdG1wMTAzX3Nob3dfdGVtcCwKPj4+\n" - "ICsgdG1wMTAzX3NldF90ZW1wLCBUTVAxMDNfVExPV19SRUcpOwo+Pj4gKwo+Pj4gK3N0YXRpYyBT\n" - "RU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgCj4+PiB0bXAx\n" - "MDNfc2hvd190ZW1wLAo+Pj4gKyB0bXAxMDNfc2V0X3RlbXAsIFRNUDEwM19USElHSF9SRUcpOwo+\n" - "Pj4gKwo+Pj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDNfYXR0cnNbXSA9IHsKPj4+\n" - "ICsgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAo+Pj4gKyAmc2Vu\n" - "c29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAo+Pj4gKyAmc2Vuc29yX2Rldl9h\n" - "dHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAo+Pj4gKyBOVUxMCj4+PiArfTsKPj4+ICtBVFRS\n" - "SUJVVEVfR1JPVVBTKHRtcDEwMyk7Cj4+PiArCj4+PiArc3RhdGljIGJvb2wgdG1wMTAzX3JlZ21h\n" - "cF9pc192b2xhdGlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIAo+Pj4gaW50IHJlZykK\n" - "Pj4+ICt7Cj4+PiArIHJldHVybiByZWcgPT0gVE1QMTAzX1RFTVBfUkVHOwo+Pj4gK30KPj4+ICsK\n" - "Pj4+ICtzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgdG1wMTAzX3JlZ21hcF9jb25maWcgPSB7\n" - "Cj4+PiArIC5yZWdfYml0cyA9IDgsCj4+PiArIC52YWxfYml0cyA9IDgsCj4+PiArIC5tYXhfcmVn\n" - "aXN0ZXIgPSBUTVAxMDNfVEhJR0hfUkVHLAo+Pj4gKyAudm9sYXRpbGVfcmVnID0gdG1wMTAzX3Jl\n" - "Z21hcF9pc192b2xhdGlsZSwKPj4+ICt9Owo+Pj4gKwo+Pj4gK3N0YXRpYyBpbnQgdG1wMTAzX3By\n" - "b2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCj4+PiArIGNvbnN0IHN0cnVjdCBpMmNfZGV2\n" - "aWNlX2lkICppZCkKPj4+ICt7Cj4+PiArIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRl\n" - "djsKPj4+ICsgc3RydWN0IGRldmljZSAqaHdtb25fZGV2Owo+Pj4gKyBzdHJ1Y3QgcmVnbWFwICpy\n" - "ZWdtYXA7Cj4+PiArIGludCByZXQ7Cj4+PiArCj4+PiArIGlmICghaTJjX2NoZWNrX2Z1bmN0aW9u\n" - "YWxpdHkoY2xpZW50LT5hZGFwdGVyLAo+Pj4gKyBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7\n" - "Cj4+PiArIGRldl9lcnIoJmNsaWVudC0+ZGV2LAo+Pj4gKyAiYWRhcHRlciBkb2Vzbid0IHN1cHBv\n" - "cnQgU01CdXMgYnl0ZSB0cmFuc2FjdGlvbnNcbiIpOwo+Pj4gKyByZXR1cm4gLUVOT0RFVjsKPj4+\n" - "ICsgfQo+Pj4gKwo+Pj4gKyByZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ0\n" - "bXAxMDNfcmVnbWFwX2NvbmZpZyk7Cj4+PiArIGlmIChJU19FUlIocmVnbWFwKSkgewo+Pj4gKyBk\n" - "ZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXBcbiIpOwo+Pj4gKyBy\n" - "ZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+Pj4gKyB9Cj4+PiArCj4+PiArIHJldCA9IHJlZ21hcF91\n" - "cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JFRywgVE1QMTAzX0NPTkZJR19NQVNLLAo+\n" - "Pj4gKyBUTVAxMDNfQ09ORklHKTsKPj4+ICsgaWYgKHJldCA8IDApIHsKPj4+ICsgZGV2X2Vycigm\n" - "Y2xpZW50LT5kZXYsICJlcnJvciB3cml0aW5nIGNvbmZpZyByZWdpc3RlclxuIik7Cj4+PiArIHJl\n" - "dHVybiByZXQ7Cj4+PiArIH0KPj4+ICsKPj4+ICsgaHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3Jl\n" - "Z2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAo+Pj4gKyByZWdtYXAsIHRtcDEw\n" - "M19ncm91cHMpOwo+Pj4gKyByZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7Cj4+PiAr\n" - "fQo+Pj4gKwo+Pj4gKyNpZmRlZiBDT05GSUdfUE0KPj4+ICtzdGF0aWMgaW50IHRtcDEwM19zdXNw\n" - "ZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArIHN0cnVjdCByZWdtYXAgKnJlZ21h\n" - "cCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyByZXR1cm4gcmVnbWFwX3VwZGF0\n" - "ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyBUTVAxMDNfQ09ORl9TRF9NQVNL\n" - "LCAwKTsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCB0bXAxMDNfcmVzdW1lKHN0cnVjdCBk\n" - "ZXZpY2UgKmRldikKPj4+ICt7Cj4+PiArIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRf\n" - "ZHJ2ZGF0YShkZXYpOwo+Pj4gKwo+Pj4gKyByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21h\n" - "cCwgVE1QMTAzX0NPTkZfUkVHLAo+Pj4gKyBUTVAxMDNfQ09ORl9TRF9NQVNLLCBUTVAxMDNfQ09O\n" - "Rl9TRCk7Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB0\n" - "bXAxMDNfZGV2X3BtX29wcyA9IHsKPj4+ICsgLnN1c3BlbmQgPSB0bXAxMDNfc3VzcGVuZCwKPj4+\n" - "ICsgLnJlc3VtZSA9IHRtcDEwM19yZXN1bWUsCj4+PiArfTsKPj4+ICsKPj4+ICsjZGVmaW5lIFRN\n" - "UDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+PiArI2Vsc2UKPj4+ICsjZGVm\n" - "aW5lIFRNUDEwM19ERVZfUE1fT1BTIE5VTEwKPj4+ICsjZW5kaWYgLyogQ09ORklHX1BNICovCj4+\n" - "PiArCj4+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHRtcDEwM19pZFtdID0g\n" - "ewo+Pj4gKyB7ICJ0bXAxMDMiLCAwIH0sCj4+PiArIHsgfQo+Pj4gK307Cj4+Cj4+IEluIHRoZSBi\n" - "aW5kaW5ncyB5b3UgYXJlIGdpdmluZyB0aGUgY29tcGF0aWJsZSBwcm9wZXJ0eSBhcyA6IAo+PiB0\n" - "aSx0bXAxMDMsIGJ1dCBoZXJlIG9ubHkgdG1wMTAzLgo+Pgo+PiBJbnN0ZWFkIG9mIHVzaW5nIHRo\n" - "ZSBpMmNfZGV2aWNlX2lkIHN0cnVjdCAsIHVzZSBvZl9kZXZpY2VfaWQgc3RydWN0IAo+PiBmb3Ig\n" - "Z2l2aW5nIHRoZQo+PiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+PiBjb21wYXRibGUgPSAi\n" - "PG1hbnVmYWN0dXJlcj4sPG1vZGVsPiIKPgo+IFRoZXJlIGFyZSBhIGxvdCBvZiBkcml2ZXJzIGlu\n" - "IGRyaXZlcnMvaHdtb24gd2hpY2ggdXNlICJpMmNfZGV2aWNlX2lkIAo+IHN0cnVjdCIsCj4gYW5k\n" - "IGZvciB0aGVtIG9ubHkgIm1vZGVsIiBpcyBuZWNlc3NhcnkgLi4uCj4KPiBBcyB0aGlzIGlzIG5v\n" - "dCBhIHBsYXRmb3JtIGRyaXZlciwgSSBkbyBub3Qga25vdywgaWYgIm9mX2RldmljZV9pZCBzdHJ1\n" - "Y3QiCj4gaXMgcG9zc2libGUgdG8gdXNlLiBGb3IgdGhhdCwgaXQgbXVzdCBiZSBjb252ZXJ0ZWQg\n" - "dG8gYSBwbGF0Zm9ybQo+IGRldmljZSBkcml2ZXIgLi4uCj4KSSB0aG91Z2h0IHlvdXIgYXJlIHVz\n" - "aW5nIHRoZSBkZXZpY2V0cmVlIHNvdXJjZSB0byBsb2FkIHRoZSBkcml2ZXIuIEluIAp0aGF0IGNh\n" - "c2UgaXQgbmVlZCBub3QgdG8gYmUgcGxhdGZvcm0gZHJpdmVyLgp3ZSBjYW4gdXNlICJvZl9kZXZp\n" - "Y2VfaWQgc3RydWN0IiB3aGljaCBtYXRjaGVzIHRoZSBiaW5kaW5ncyBpbiB5b3VyIAp0cml2aWFs\n" - "LWRldmljZXMudHh0CgpUaGFua3MKVmFya2EgQmhhZHJhbQo+IGJ5ZSwKPiBIZWlrbwo+Pgo+Pj4g\n" - "K01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB0bXAxMDNfaWQpOwo+Pj4gKytzdGF0aWMgc3RydWN0\n" - "IGkyY19kcml2ZXIgdG1wMTAzX2RyaXZlciA9IHsKPj4+ICsgLmRyaXZlciA9IHsKPj4+ICsgLm5h\n" - "bWUgPSAidG1wMTAzIiwKPj4+ICsgLnBtID0gVE1QMTAzX0RFVl9QTV9PUFMsCj4+PiArIH0sCj4+\n" - "PiArIC5wcm9iZSA9IHRtcDEwM19wcm9iZSwKPj4+ICsgLmlkX3RhYmxlID0gdG1wMTAzX2lkLAo+\n" - "Pj4gK307Cj4+PiArCj4+PiArbW9kdWxlX2kyY19kcml2ZXIodG1wMTAzX2RyaXZlcik7Cj4+PiAr\n" - "Cj4+PiArTU9EVUxFX0FVVEhPUigiSGVpa28gU2Nob2NoZXIgPGhzQGRlbnguZGU+Iik7Cj4+PiAr\n" - "TU9EVUxFX0RFU0NSSVBUSU9OKCJUZXhhcyBJbnN0cnVtZW50cyBUTVAxMDMgdGVtcGVyYXR1cmUg\n" - "c2Vuc29yIAo+Pj4gZHJpdmVyIik7Cj4+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwo+Pgo+Pgo+\n" - "Pgo+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbG0t\n" - "c2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZwpodHRwOi8vbGlz\n" - dHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3Jz + "On 06/18/2014 11:46 AM, Heiko Schocher wrote:\n" + "> Hello Varka,\n" + ">\n" + "> Am 18.06.2014 07:46, schrieb Varka Bhadram:\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 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" + ">>> 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 ALARMS\n" + ">>> taos,tsl2550 Ambient Light Sensor with SMBUS/Two Wire Serial Interface\n" + ">>> ti,tsc2003 I2C Touch-Screen Controller\n" + ">>> ti,tmp102 Low Power Digital Temperature Sensor with SMBUS/Two Wire \n" + ">>> Serial Interface\n" + ">>> +ti,tmp103 Low Power Digital Temperature Sensor with SMBUS/Two Wire \n" + ">>> Serial Interface\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, 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" + "> There are a lot of drivers in drivers/hwmon which use \"i2c_device_id \n" + "> struct\",\n" + "> and for them only \"model\" is necessary ...\n" + ">\n" + "> As this is not a platform driver, I do not know, if \"of_device_id struct\"\n" + "> is possible to use. For that, it must be converted to a platform\n" + "> device driver ...\n" + ">\n" + "I thought your are using the devicetree source to load the driver. In \n" + "that case it need not to be platform driver.\n" + "we can use \"of_device_id struct\" which matches the bindings in your \n" + "trivial-devices.txt\n" + "\n" + "Thanks\n" + "Varka Bhadram\n" + "> bye,\n" + "> Heiko\n" + ">>\n" + ">>> +MODULE_DEVICE_TABLE(i2c, tmp103_id);\n" + ">>> ++static struct i2c_driver tmp103_driver = {\n" + ">>> + .driver = {\n" + ">>> + .name = \"tmp103\",\n" + ">>> + .pm = TMP103_DEV_PM_OPS,\n" + ">>> + },\n" + ">>> + .probe = tmp103_probe,\n" + ">>> + .id_table = tmp103_id,\n" + ">>> +};\n" + ">>> +\n" + ">>> +module_i2c_driver(tmp103_driver);\n" + ">>> +\n" + ">>> +MODULE_AUTHOR(\"Heiko Schocher <hs@denx.de>\");\n" + ">>> +MODULE_DESCRIPTION(\"Texas Instruments TMP103 temperature sensor \n" + ">>> driver\");\n" + ">>> +MODULE_LICENSE(\"GPL\");\n" + ">>\n" + ">>\n" + ">>\n" + > -a31a3b2feed4da2f89ddcb0fd4ba003be2b737bc49f016ce8472ddad60e00bcb +a8e88671a6fc3eba42645c56dfe6789fdc4de286bd4319a71d1e6f0bc2f98d81
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.