diff for duplicates of <53A12DBB.50704@roeck-us.net> diff --git a/a/1.txt b/N1/1.txt index fc9c826..c103d5c 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,224 +1,348 @@ -T24gMDYvMTcvMjAxNCAxMDo0NiBQTSwgVmFya2EgQmhhZHJhbSB3cm90ZToKPiBIaSwKPgo+IE9u -IDA2LzE4LzIwMTQgMTE6MDcgQU0sIEhlaWtvIFNjaG9jaGVyIHdyb3RlOgo+PiBEcml2ZXIgZm9y -IHRoZSBUSSBUTVAxMDMuCj4+Cj4+IFRoZSBUSSBUTVAxMDMgaXMgc2ltaWxhciB0byB0aGUgVE1Q -MTAyLiAgSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4gYnkgaGF2aW5nIG9ubHkgOCBiaXQg -cmVnaXN0ZXJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5k -ZT4KPj4KPj4gLS0tCj4+Cj4+IENjOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4K -Pj4gQ2M6IEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KPj4gQ2M6IGxpbnV4LWtl -cm5lbEB2Z2VyLmtlcm5lbC5vcmcKPj4gQ2M6IGRldmljZXRyZWVAdmdlci5rZXJuZWwub3JnCj4+ -IENjOiBsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCj4+IENjOiBNYXJrIFJ1dGxhbmQgPG1hcmsu -cnV0bGFuZEBhcm0uY29tPgo+Pgo+PiAtIGNoYW5nZSBmb3IgdjI6Cj4+ICAgIC0gYWRkIGNvbW1l -bnRzIGZyb20gR3VlbnRlclJvZWNrOgo+PiAgICAgIC0gcmVtb3ZlIENjIGZyb20gY29tbWl0IHN1 -YmplY3QKPj4gICAgICAtIGFkZCBkZXZpY2V0cmVlIG1haW50YWluZXIKPj4gICAgICAtIG1vdmUg -RG9jdW1lbnRhdGlvbiB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+PiAgICAgIC0gcmVt -b3ZlIGRldmljZXRyZWUgYmluZGluZ3MgZnJvbSBEb2N1bWVudGF0aW9uCj4+ICAgICAgLSBhZGQg -Y29tcGF0aWJsZSBzdHJpbmcgdG8KPj4gICAgICAgICJEb2N1bWVudGF0aW9uL2RldmljZXRyZWUv -YmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQiCj4+ICAgICAgLSByZW1vdmUgQ2FtZWxD -YXNlCj4+ICAgICAgLSBmaXggQ29kaW5nc3R5bGUgaXNzdWVzCj4+ICAgICAgLSB1c2UgQVRUUklC -VVRFX0dST1VQUyBhbmQgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoKQo+ -PiAgICAgIC0gcmVtb3ZlIHVuc3VzZWQgZGVmaW5lIFRNUDEwM19DT05GSUdfUkRfT05MWQo+PiAg -ICAgIC0gcmVzdG9yZSBjb25maWcgcmVnaXN0ZXIgd2hlbiBleGl0KCkKPj4gICAgICAtIHVzZSBy -ZWdtYXAKPj4gLSBjaGFuZ2VzIGZvciB2MzoKPj4gICAgYWdhaW4gYSBsb3Qgb2YgZmFudGFzdGlj -IHRpcHMgaG93IHRvIHVzZSByZWdtYXAgZWZmaWNpZW50bHkKPj4gICAgZnJvbSBHdWVudGVyIFJv -ZWNrOgo+PiAgICAtIGdldCByaWQgb2YgInN0cnVjdCB0bXAxMDMiCj4+ICAgIC0gZ2V0IHJpZCBv -ZiAic3RhdGljIGNvbnN0IHU4IHRtcDEwM19yZWdbXSIKPj4gICAgLSBnZXQgcmlkIG9mIG11dGV4 -IGxvY2sKPj4gICAgLSBkcm9wIGNvbmZpZ19vcmlnIGVudGlyZWx5Cj4+ICAgIC0gdXNlIHJlZ21h -cF91cGRhdGVfYml0cygpCj4+IC0gY2hhbmdlcyBmb3IgdjQ6Cj4+ICAgIC0gYWRkIGNvbW1lbnQg -ZnJvbSBHdWVudGVyIFJvZWNrOgo+PiAgICAgIGRlZmluZSBUTVAxMDNfQ09ORklHX01BU0sgYW5k -IFRNUDEwM19DT05GX1NEX01BU0sKPj4gICAgICBzZXBhcmF0ZWx5IHRvIGVuc3VyZSB5b3UgY2F0 -Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVkIGJpdHMuCj4+IC0gY2hhbmdlcyBmb3IgdjU6Cj4+ICAg -IGFkZCBjb21tZW50IGZyb20gR3VlbnRlciBSb2VjazoKPj4gICAgLSB1c2UgIiNkZWZpbmUgVE1Q -MTAzX0NPTkZfU0QgVE1QMTAzX0NPTkZfTTEiCj4+ICAgIGFkZCBjb21tZW50IGZyb20gTWFyayBS -dXRsYW5kOgo+PiAgICAtIHVzZSBmdWxsIHN0cmluZyBmb3IgRFQgY29tcGF0aWJsZSBzdHJpbmcg -bWF0Y2hpbmcsIGluc3RlYWQgb2YKPj4gICAgICBEUklWRVJfTkFNRS4gR2V0IHJpZCBjb21wbGV0 -ZSBvZiBEUklWRVJfTkFNRSBkZWZpbmUuCj4+Cj4+ICAgLi4uL2RldmljZXRyZWUvYmluZGluZ3Mv -aTJjL3RyaXZpYWwtZGV2aWNlcy50eHQgICAgfCAgIDEgKwo+PiAgIERvY3VtZW50YXRpb24vaHdt -b24vdG1wMTAzICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI4ICsrKwo+PiAgIGRyaXZlcnMv -aHdtb24vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEwICsKPj4gICBk -cml2ZXJzL2h3bW9uL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSAr -Cj4+ICAgZHJpdmVycy9od21vbi90bXAxMDMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -fCAyMDUgKysrKysrKysrKysrKysrKysrKysrCj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCAyNDUgaW5z -ZXJ0aW9ucygrKQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2h3bW9uL3Rt -cDEwMwo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+Cj4+ -IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZp -YWwtZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3Ry -aXZpYWwtZGV2aWNlcy50eHQKPj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2NDQKPj4gLS0t -IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMu -dHh0Cj4+ICsrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlh -bC1kZXZpY2VzLnR4dAo+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgwICAgICAgICBNNDFU -ODAgLSBTRVJJQUwgQUNDRVNTIFJUQyBXSVRIIEFMQVJNUwo+PiAgIHRhb3MsdHNsMjU1MCAgICAg -ICAgQW1iaWVudCBMaWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJm -YWNlCj4+ICAgdGksdHNjMjAwMyAgICAgICAgSTJDIFRvdWNoLVNjcmVlbiBDb250cm9sbGVyCj4+ -ICAgdGksdG1wMTAyICAgICAgICBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJhdHVyZSBTZW5zb3Ig -d2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJmYWNlCj4+ICt0aSx0bXAxMDMgICAgICAg -IExvdyBQb3dlciBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvciB3aXRoIFNNQlVTL1R3byBXaXJl -IFNlcmlhbCBJbnRlcmZhY2UKPj4gICB0aSx0bXAyNzUgICAgICAgIERpZ2l0YWwgVGVtcGVyYXR1 -cmUgU2Vuc29yCj4+ICAgd2luYm9uZCx3cGN0MzAxICAgICAgICBpMmMgdHJ1c3RlZCBwbGF0Zm9y -bSBtb2R1bGUgKFRQTSkKPj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdG1wMTAz -IGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4g -aW5kZXggMDAwMDAwMC4uZWMwMGExNQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL0RvY3VtZW50 -YXRpb24vaHdtb24vdG1wMTAzCj4+IEBAIC0wLDAgKzEsMjggQEAKPj4gK0tlcm5lbCBkcml2ZXIg -dG1wMTAzCj4+ICs9PT09PT09PT09PT09PT09PT09PQo+PiArCj4+ICtTdXBwb3J0ZWQgY2hpcHM6 -Cj4+ICsgICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+ICsgICAgUHJlZml4OiAndG1wMTAz -Jwo+PiArICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lCj4+ICsgICAgUHJvZHVjdCBpbmZvIGFu -ZCBkYXRhc2hlZXQ6IGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvdG1wMTAzCj4+ICsKPj4gK0F1 -dGhvcjoKPj4gKyAgICBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KPj4gKwo+PiArRGVzY3Jp -cHRpb24KPj4gKy0tLS0tLS0tLS0tCj4+ICsKPj4gK1RoZSBUTVAxMDMgaXMgYSBkaWdpdGFsIG91 -dHB1dCB0ZW1wZXJhdHVyZSBzZW5zb3IgaW4gYSBmb3VyLWJhbGwKPj4gK3dhZmVyIGNoaXAtc2Nh -bGUgcGFja2FnZSAoV0NTUCkuIFRoZSBUTVAxMDMgaXMgY2FwYWJsZSBvZiByZWFkaW5nCj4+ICt0 -ZW1wZXJhdHVyZXMgdG8gYSByZXNvbHV0aW9uIG9mIDHCsEMuIFRoZSBUTVAxMDMgaXMgc3BlY2lm -aWVkIGZvcgo+PiArb3BlcmF0aW9uIG92ZXIgYSB0ZW1wZXJhdHVyZSByYW5nZSBvZiDigJM0MMKw -QyB0byArMTI1wrBDLgo+PiArCj4+ICtSZXNvbHV0aW9uOiA4IEJpdHMKPj4gK0FjY3VyYWN5OiDC -sTHCsEMgVHlwICjigJMxMMKwQyB0byArMTAwwrBDKQo+PiArCj4+ICtUaGUgZHJpdmVyIHByb3Zp -ZGVzIHRoZSBjb21tb24gc3lzZnMtaW50ZXJmYWNlIGZvciB0ZW1wZXJhdHVyZXMgKHNlZQo+PiAr -RG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgdW5kZXIgVGVtcGVyYXR1cmVzKS4K -Pj4gKwo+PiArUGxlYXNlIHJlZmVyIGhvdyB0byBpbnN0YW50aWF0ZSB0aGlzIGRyaXZlcjoKPj4g -K0RvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcwo+PiBkaWZmIC0tZ2l0IGEv -ZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCj4+IGluZGV4IDA4 -NTMxYTEuLmM4ODJkNGIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+PiAr -KysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKPj4gQEAgLTEzOTEsNiArMTM5MSwxNiBAQCBjb25m -aWcgU0VOU09SU19UTVAxMDIKPj4gICAgICAgICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWls -dCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCj4+ICAgICAgICAgd2lsbCBiZSBjYWxs -ZWQgdG1wMTAyLgo+PiArY29uZmlnIFNFTlNPUlNfVE1QMTAzCj4+ICsgICAgdHJpc3RhdGUgIlRl -eGFzIEluc3RydW1lbnRzIFRNUDEwMyIKPj4gKyAgICBkZXBlbmRzIG9uIEkyQwo+PiArICAgIGhl -bHAKPj4gKyAgICAgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhh -cyBJbnN0cnVtZW50cyBUTVAxMDMKPj4gKyAgICAgIHNlbnNvciBjaGlwcy4KPj4gKwo+PiArICAg -ICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhl -IG1vZHVsZQo+PiArICAgICAgd2lsbCBiZSBjYWxsZWQgdG1wMTAzLgo+PiArCj4+ICAgY29uZmln -IFNFTlNPUlNfVE1QNDAxCj4+ICAgICAgIHRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVA0 -MDEgYW5kIGNvbXBhdGlibGVzIgo+PiAgICAgICBkZXBlbmRzIG9uIEkyQwo+PiBkaWZmIC0tZ2l0 -IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4gaW5k -ZXggM2RjMGYwMi4uY2MwZGYxZWYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZp -bGUKPj4gKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQo+PiBAQCAtMTM1LDYgKzEzNSw3IEBA -IG9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIpKz0gc21zYzQ3bTE5Mi5vCj4+ICAgb2Jq -LSQoQ09ORklHX1NFTlNPUlNfQU1DNjgyMSkgICAgKz0gYW1jNjgyMS5vCj4+ICAgb2JqLSQoQ09O -RklHX1NFTlNPUlNfVEhNQzUwKSAgICArPSB0aG1jNTAubwo+PiAgIG9iai0kKENPTkZJR19TRU5T -T1JTX1RNUDEwMikgICAgKz0gdG1wMTAyLm8KPj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEw -MykgICAgKz0gdG1wMTAzLm8KPj4gICBvYmotJChDT05GSUdfU0VOU09SU19UTVA0MDEpICAgICs9 -IHRtcDQwMS5vCj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDIxKSAgICArPSB0bXA0MjEu -bwo+PiAgIG9iai0kKENPTkZJR19TRU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMt -aHdtb24ubwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXAxMDMuYyBiL2RyaXZlcnMv -aHdtb24vdG1wMTAzLmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4u -ZTY5ZGJjYQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMK -Pj4gQEAgLTAsMCArMSwyMDUgQEAKPj4gKy8qCj4+ICsgKiBUZXhhcyBJbnN0cnVtZW50cyBUTVAx -MDMgU01CdXMgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlcgo+PiArICogQ29weXJpZ2h0IChDKSAy -MDE0IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+PiArICoKPj4gKyAqIEJhc2VkIG9uOgo+ -PiArICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBk -cml2ZXIKPj4gKyAqCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU3RldmVuIEtpbmcgPHNma2lu -Z0BmZHdkYy5jb20+Cj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 -IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPj4gKyAqIGl0IHVuZGVyIHRo -ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 -Cj4+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9m -IHRoZSBMaWNlbnNlLCBvcgo+PiArICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv -bi4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg -dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg -d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4+ICsgKiBNRVJDSEFOVEFCSUxJ -VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4+ICsgKiBH -TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiArICoKPj4gKyAq -Lwo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgv -aW5pdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9p -MmMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2h3 -bW9uLXN5c2ZzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+Cj4+ICsjaW5jbHVkZSA8bGlu -dXgvbXV0ZXguaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4gKyNpbmNsdWRlIDxs -aW51eC9qaWZmaWVzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Cj4+ICsKPj4gKyNk -ZWZpbmUgVE1QMTAzX1RFTVBfUkVHICAgICAgICAweDAwCj4+ICsjZGVmaW5lIFRNUDEwM19DT05G -X1JFRyAgICAgICAgMHgwMQo+PiArI2RlZmluZSBUTVAxMDNfVExPV19SRUcgICAgICAgIDB4MDIK -Pj4gKyNkZWZpbmUgVE1QMTAzX1RISUdIX1JFRyAgICAweDAzCj4+ICsKPj4gKyNkZWZpbmUgVE1Q -MTAzX0NPTkZfTTAgICAgICAgIDB4MDEKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTTEgICAgICAg -IDB4MDIKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTEMgICAgICAgIDB4MDQKPj4gKyNkZWZpbmUg -VE1QMTAzX0NPTkZfRkwgICAgICAgIDB4MDgKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfRkggICAg -ICAgIDB4MTAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwICAgICAgICAweDIwCj4+ICsjZGVm -aW5lIFRNUDEwM19DT05GX0NSMSAgICAgICAgMHg0MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9J -RCAgICAgICAgMHg4MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAgICAgICAgKFRNUDEwM19D -T05GX00xKQo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRF9NQVNLICAgIChUTVAxMDNfQ09ORl9N -MCB8IFRNUDEwM19DT05GX00xKQo+PiArCj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUcgICAgICAg -IChUTVAxMDNfQ09ORl9DUjEgfCBUTVAxMDNfQ09ORl9NMSkKPj4gKyNkZWZpbmUgVE1QMTAzX0NP -TkZJR19NQVNLICAgIChUTVAxMDNfQ09ORl9DUjAgfCBUTVAxMDNfQ09ORl9DUjEgfCBcCj4+ICsg -ICAgICAgICAgICAgICAgIFRNUDEwM19DT05GX00wIHwgVE1QMTAzX0NPTkZfTTEpCj4+ICsKPj4g -K3N0YXRpYyBpbmxpbmUgaW50IHRtcDEwM19yZWdfdG9fbWMoczggdmFsKQo+PiArewo+PiArICAg -IHJldHVybiB2YWwgKiAxMDAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHU4IHRtcDEw -M19tY190b19yZWcoaW50IHZhbCkKPj4gK3sKPj4gKyAgICByZXR1cm4gRElWX1JPVU5EX0NMT1NF -U1QodmFsLCAxMDAwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHNzaXplX3QgdG1wMTAzX3Nob3df -dGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+ICsgICAgICAgICAgICAgICAgc3RydWN0IGRldmlj -ZV9hdHRyaWJ1dGUgKmF0dHIsCj4+ICsgICAgICAgICAgICAgICAgY2hhciAqYnVmKQo+PiArewo+ -PiArICAgIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2RhID0gdG9fc2Vuc29yX2Rl -dl9hdHRyKGF0dHIpOwo+PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2 -ZGF0YShkZXYpOwo+PiArICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4+ICsgICAgaW50IHJldDsK -Pj4gKwo+PiArICAgIHJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgc2RhLT5pbmRleCwgJnJlZ3Zh -bCk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIHJldHVybiByZXQ7Cj4+ICsKPj4g -KyAgICByZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1wMTAzX3JlZ190b19tYyhyZWd2YWwp -KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHNzaXplX3QgdG1wMTAzX3NldF90ZW1wKHN0cnVjdCBk -ZXZpY2UgKmRldiwKPj4gKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0 -ZSAqYXR0ciwKPj4gKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBj -b3VudCkKPj4gK3sKPj4gKyAgICBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9 -IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKPj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAg -PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4gKyAgICBsb25nIHZhbDsKPj4gKyAgICBpbnQgcmV0 -Owo+PiArCj4+ICsgICAgaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQo+PiArICAgICAg -ICByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArICAgIHZhbCA9IGNsYW1wX3ZhbCh2YWwsIC01NTAw -MCwgMTI3MDAwKTsKPj4gKyAgICByZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBzZGEtPmluZGV4 -LCB0bXAxMDNfbWNfdG9fcmVnKHZhbCkpOwo+PiArICAgIHJldHVybiByZXQgPyByZXQgOiBjb3Vu -dDsKPj4gK30KPj4gKwo+PiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwg -U19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwgTlVMTCAsCj4+ICsgICAgICAgICAgICAgIFRNUDEw -M19URU1QX1JFRyk7Cj4+ICsKPj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWlu -LCBTX0lXVVNSIHwgU19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwKPj4gKyAgICAgICAgICAgICAg -dG1wMTAzX3NldF90ZW1wLCBUTVAxMDNfVExPV19SRUcpOwo+PiArCj4+ICtzdGF0aWMgU0VOU09S -X0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHRtcDEwM19zaG93X3Rl -bXAsCj4+ICsgICAgICAgICAgICAgIHRtcDEwM19zZXRfdGVtcCwgVE1QMTAzX1RISUdIX1JFRyk7 -Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDNfYXR0cnNbXSA9IHsKPj4g -KyAgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCj4+ICsgICAg -JnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKPj4gKyAgICAmc2Vuc29y -X2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAo+PiArICAgIE5VTEwKPj4gK307Cj4+ -ICtBVFRSSUJVVEVfR1JPVVBTKHRtcDEwMyk7Cj4+ICsKPj4gK3N0YXRpYyBib29sIHRtcDEwM19y -ZWdtYXBfaXNfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQo+ -PiArewo+PiArICAgIHJldHVybiByZWcgPT0gVE1QMTAzX1RFTVBfUkVHOwo+PiArfQo+PiArCj4+ -ICtzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgdG1wMTAzX3JlZ21hcF9jb25maWcgPSB7Cj4+ -ICsgICAgLnJlZ19iaXRzID0gOCwKPj4gKyAgICAudmFsX2JpdHMgPSA4LAo+PiArICAgIC5tYXhf -cmVnaXN0ZXIgPSBUTVAxMDNfVEhJR0hfUkVHLAo+PiArICAgIC52b2xhdGlsZV9yZWcgPSB0bXAx -MDNfcmVnbWFwX2lzX3ZvbGF0aWxlLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGludCB0bXAxMDNf -cHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPj4gKyAgICAgICAgICAgIGNvbnN0IHN0 -cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPj4gK3sKPj4gKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYg -PSAmY2xpZW50LT5kZXY7Cj4+ICsgICAgc3RydWN0IGRldmljZSAqaHdtb25fZGV2Owo+PiArICAg -IHN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPj4gKyAgICBpbnQgcmV0Owo+PiArCj4+ICsgICAgaWYg -KCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCj4+ICsgICAgICAgICAg -ICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7Cj4+ICsgICAgICAgIGRldl9l -cnIoJmNsaWVudC0+ZGV2LAo+PiArICAgICAgICAgICAgImFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0 -IFNNQnVzIGJ5dGUgdHJhbnNhY3Rpb25zXG4iKTsKPj4gKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7 -Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xp -ZW50LCAmdG1wMTAzX3JlZ21hcF9jb25maWcpOwo+PiArICAgIGlmIChJU19FUlIocmVnbWFwKSkg -ewo+PiArICAgICAgICBkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBt -YXBcbiIpOwo+PiArICAgICAgICByZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+PiArICAgIH0KPj4g -Kwo+PiArICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JF -RywgVE1QMTAzX0NPTkZJR19NQVNLLAo+PiArICAgICAgICAgICAgICAgICBUTVAxMDNfQ09ORklH -KTsKPj4gKyAgICBpZiAocmV0IDwgMCkgewo+PiArICAgICAgICBkZXZfZXJyKCZjbGllbnQtPmRl -diwgImVycm9yIHdyaXRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyAgICAgICAgcmV0dXJu -IHJldDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgICBod21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVn -aXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCj4+ICsgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICByZWdtYXAsIHRtcDEwM19ncm91cHMpOwo+PiArICAgIHJldHVybiBQVFJf -RVJSX09SX1pFUk8oaHdtb25fZGV2KTsKPj4gK30KPj4gKwo+PiArI2lmZGVmIENPTkZJR19QTQo+ -PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7Cj4+ -ICsgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsK -Pj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVH -LAo+PiArICAgICAgICAgICAgICAgICAgVE1QMTAzX0NPTkZfU0RfTUFTSywgMCk7Cj4+ICt9Cj4+ -ICsKPj4gK3N0YXRpYyBpbnQgdG1wMTAzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7 -Cj4+ICsgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ -ICsKPj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZf -UkVHLAo+PiArICAgICAgICAgICAgICAgICAgVE1QMTAzX0NPTkZfU0RfTUFTSywgVE1QMTAzX0NP -TkZfU0QpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdG1w -MTAzX2Rldl9wbV9vcHMgPSB7Cj4+ICsgICAgLnN1c3BlbmQgICAgPSB0bXAxMDNfc3VzcGVuZCwK -Pj4gKyAgICAucmVzdW1lICAgICAgICA9IHRtcDEwM19yZXN1bWUsCj4+ICt9Owo+PiArCj4+ICsj -ZGVmaW5lIFRNUDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+ICsjZWxzZQo+ -PiArI2RlZmluZSAgICBUTVAxMDNfREVWX1BNX09QUyBOVUxMCj4+ICsjZW5kaWYgLyogQ09ORklH -X1BNICovCj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0bXAxMDNf -aWRbXSA9IHsKPj4gKyAgICB7ICJ0bXAxMDMiLCAwIH0sCj4+ICsgICAgeyB9Cj4+ICt9Owo+Cj4g -SW4gdGhlIGJpbmRpbmdzIHlvdSBhcmUgZ2l2aW5nIHRoZSBjb21wYXRpYmxlIHByb3BlcnR5IGFz -IDogdGksdG1wMTAzLCBidXQgaGVyZSBvbmx5IHRtcDEwMy4KPgo+IEluc3RlYWQgb2YgdXNpbmcg -dGhlIGkyY19kZXZpY2VfaWQgc3RydWN0ICwgdXNlIG9mX2RldmljZV9pZCBzdHJ1Y3QgZm9yIGdp -dmluZyB0aGUKPiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+IGNvbXBhdGJsZSA9ICI8bWFu -dWZhY3R1cmVyPiw8bW9kZWw+Igo+CgpOby4gV2UgZG9uJ3QgZG8gdGhhdCBmb3Igb3RoZXIgaTJj -IGRyaXZlcnMsIGFuZCB0aGUgaTJjIHN1YnN5c3RlbSBoYW5kbGVzCnRoaXMgY2FzZSwgc28gaXQg -ZG9lcyBub3Qgc2Vuc2UgdG8gc3RhcnQgdGhhdCB3aXRoIHRoaXMgZHJpdmVyIGp1c3QKZm9yIHRo -ZSBzYWtlIG9mIG1ha2luZyB0aGUgY29kZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgaGFzIHRv -IGJlLgoKVGhhbmtzLApHdWVudGVyCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f -X19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5z -b3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1z -ZW5zb3Jz +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 +>> 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 5a8a37e..fb30767 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -1,8 +1,8 @@ "ref\01403069837-15651-1-git-send-email-hs@denx.de\0" "ref\053A127BB.7090802@gmail.com\0" "From\0Guenter Roeck <linux@roeck-us.net>\0" - "Subject\0Re: [lm-sensors] [PATCH v5] hwmon: Driver for TI TMP103 temperature sensor\0" - "Date\0Wed, 18 Jun 2014 06:12:11 +0000\0" + "Subject\0Re: [PATCH v5] hwmon: Driver for TI TMP103 temperature sensor\0" + "Date\0Tue, 17 Jun 2014 23:12:11 -0700\0" "To\0Varka Bhadram <varkabhadram@gmail.com>" Heiko Schocher <hs@denx.de> " lm-sensors@lm-sensors.org\0" @@ -13,229 +13,353 @@ " Mark Rutland <mark.rutland@arm.com>\0" "\00:1\0" "b\0" - "T24gMDYvMTcvMjAxNCAxMDo0NiBQTSwgVmFya2EgQmhhZHJhbSB3cm90ZToKPiBIaSwKPgo+IE9u\n" - "IDA2LzE4LzIwMTQgMTE6MDcgQU0sIEhlaWtvIFNjaG9jaGVyIHdyb3RlOgo+PiBEcml2ZXIgZm9y\n" - "IHRoZSBUSSBUTVAxMDMuCj4+Cj4+IFRoZSBUSSBUTVAxMDMgaXMgc2ltaWxhciB0byB0aGUgVE1Q\n" - "MTAyLiAgSXQgZGlmZmVycyBmcm9tIHRoZSBUTVAxMDIKPj4gYnkgaGF2aW5nIG9ubHkgOCBiaXQg\n" - "cmVnaXN0ZXJzLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5k\n" - "ZT4KPj4KPj4gLS0tCj4+Cj4+IENjOiBKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4K\n" - "Pj4gQ2M6IEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVzLm5ldD4KPj4gQ2M6IGxpbnV4LWtl\n" - "cm5lbEB2Z2VyLmtlcm5lbC5vcmcKPj4gQ2M6IGRldmljZXRyZWVAdmdlci5rZXJuZWwub3JnCj4+\n" - "IENjOiBsaW51eC1kb2NAdmdlci5rZXJuZWwub3JnCj4+IENjOiBNYXJrIFJ1dGxhbmQgPG1hcmsu\n" - "cnV0bGFuZEBhcm0uY29tPgo+Pgo+PiAtIGNoYW5nZSBmb3IgdjI6Cj4+ICAgIC0gYWRkIGNvbW1l\n" - "bnRzIGZyb20gR3VlbnRlclJvZWNrOgo+PiAgICAgIC0gcmVtb3ZlIENjIGZyb20gY29tbWl0IHN1\n" - "YmplY3QKPj4gICAgICAtIGFkZCBkZXZpY2V0cmVlIG1haW50YWluZXIKPj4gICAgICAtIG1vdmUg\n" - "RG9jdW1lbnRhdGlvbiB0byBEb2N1bWVudGF0aW9uL2h3bW9uL3RtcDEwMwo+PiAgICAgIC0gcmVt\n" - "b3ZlIGRldmljZXRyZWUgYmluZGluZ3MgZnJvbSBEb2N1bWVudGF0aW9uCj4+ICAgICAgLSBhZGQg\n" - "Y29tcGF0aWJsZSBzdHJpbmcgdG8KPj4gICAgICAgICJEb2N1bWVudGF0aW9uL2RldmljZXRyZWUv\n" - "YmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQiCj4+ICAgICAgLSByZW1vdmUgQ2FtZWxD\n" - "YXNlCj4+ICAgICAgLSBmaXggQ29kaW5nc3R5bGUgaXNzdWVzCj4+ICAgICAgLSB1c2UgQVRUUklC\n" - "VVRFX0dST1VQUyBhbmQgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoKQo+\n" - "PiAgICAgIC0gcmVtb3ZlIHVuc3VzZWQgZGVmaW5lIFRNUDEwM19DT05GSUdfUkRfT05MWQo+PiAg\n" - "ICAgIC0gcmVzdG9yZSBjb25maWcgcmVnaXN0ZXIgd2hlbiBleGl0KCkKPj4gICAgICAtIHVzZSBy\n" - "ZWdtYXAKPj4gLSBjaGFuZ2VzIGZvciB2MzoKPj4gICAgYWdhaW4gYSBsb3Qgb2YgZmFudGFzdGlj\n" - "IHRpcHMgaG93IHRvIHVzZSByZWdtYXAgZWZmaWNpZW50bHkKPj4gICAgZnJvbSBHdWVudGVyIFJv\n" - "ZWNrOgo+PiAgICAtIGdldCByaWQgb2YgInN0cnVjdCB0bXAxMDMiCj4+ICAgIC0gZ2V0IHJpZCBv\n" - "ZiAic3RhdGljIGNvbnN0IHU4IHRtcDEwM19yZWdbXSIKPj4gICAgLSBnZXQgcmlkIG9mIG11dGV4\n" - "IGxvY2sKPj4gICAgLSBkcm9wIGNvbmZpZ19vcmlnIGVudGlyZWx5Cj4+ICAgIC0gdXNlIHJlZ21h\n" - "cF91cGRhdGVfYml0cygpCj4+IC0gY2hhbmdlcyBmb3IgdjQ6Cj4+ICAgIC0gYWRkIGNvbW1lbnQg\n" - "ZnJvbSBHdWVudGVyIFJvZWNrOgo+PiAgICAgIGRlZmluZSBUTVAxMDNfQ09ORklHX01BU0sgYW5k\n" - "IFRNUDEwM19DT05GX1NEX01BU0sKPj4gICAgICBzZXBhcmF0ZWx5IHRvIGVuc3VyZSB5b3UgY2F0\n" - "Y2ggYWxsIHRoZSB0by1iZS1jbGVhcmVkIGJpdHMuCj4+IC0gY2hhbmdlcyBmb3IgdjU6Cj4+ICAg\n" - "IGFkZCBjb21tZW50IGZyb20gR3VlbnRlciBSb2VjazoKPj4gICAgLSB1c2UgIiNkZWZpbmUgVE1Q\n" - "MTAzX0NPTkZfU0QgVE1QMTAzX0NPTkZfTTEiCj4+ICAgIGFkZCBjb21tZW50IGZyb20gTWFyayBS\n" - "dXRsYW5kOgo+PiAgICAtIHVzZSBmdWxsIHN0cmluZyBmb3IgRFQgY29tcGF0aWJsZSBzdHJpbmcg\n" - "bWF0Y2hpbmcsIGluc3RlYWQgb2YKPj4gICAgICBEUklWRVJfTkFNRS4gR2V0IHJpZCBjb21wbGV0\n" - "ZSBvZiBEUklWRVJfTkFNRSBkZWZpbmUuCj4+Cj4+ICAgLi4uL2RldmljZXRyZWUvYmluZGluZ3Mv\n" - "aTJjL3RyaXZpYWwtZGV2aWNlcy50eHQgICAgfCAgIDEgKwo+PiAgIERvY3VtZW50YXRpb24vaHdt\n" - "b24vdG1wMTAzICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDI4ICsrKwo+PiAgIGRyaXZlcnMv\n" - "aHdtb24vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEwICsKPj4gICBk\n" - "cml2ZXJzL2h3bW9uL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMSAr\n" - "Cj4+ICAgZHJpdmVycy9od21vbi90bXAxMDMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "fCAyMDUgKysrKysrKysrKysrKysrKysrKysrCj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCAyNDUgaW5z\n" - "ZXJ0aW9ucygrKQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBEb2N1bWVudGF0aW9uL2h3bW9uL3Rt\n" - "cDEwMwo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2h3bW9uL3RtcDEwMy5jCj4+Cj4+\n" - "IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZp\n" - "YWwtZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3Ry\n" - "aXZpYWwtZGV2aWNlcy50eHQKPj4gaW5kZXggYmVmODZlNS4uZmM5NDRlMCAxMDA2NDQKPj4gLS0t\n" - "IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMu\n" - "dHh0Cj4+ICsrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlh\n" - "bC1kZXZpY2VzLnR4dAo+PiBAQCAtODMsNSArODMsNiBAQCBzdG0sbTQxdDgwICAgICAgICBNNDFU\n" - "ODAgLSBTRVJJQUwgQUNDRVNTIFJUQyBXSVRIIEFMQVJNUwo+PiAgIHRhb3MsdHNsMjU1MCAgICAg\n" - "ICAgQW1iaWVudCBMaWdodCBTZW5zb3Igd2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJm\n" - "YWNlCj4+ICAgdGksdHNjMjAwMyAgICAgICAgSTJDIFRvdWNoLVNjcmVlbiBDb250cm9sbGVyCj4+\n" - "ICAgdGksdG1wMTAyICAgICAgICBMb3cgUG93ZXIgRGlnaXRhbCBUZW1wZXJhdHVyZSBTZW5zb3Ig\n" - "d2l0aCBTTUJVUy9Ud28gV2lyZSBTZXJpYWwgSW50ZXJmYWNlCj4+ICt0aSx0bXAxMDMgICAgICAg\n" - "IExvdyBQb3dlciBEaWdpdGFsIFRlbXBlcmF0dXJlIFNlbnNvciB3aXRoIFNNQlVTL1R3byBXaXJl\n" - "IFNlcmlhbCBJbnRlcmZhY2UKPj4gICB0aSx0bXAyNzUgICAgICAgIERpZ2l0YWwgVGVtcGVyYXR1\n" - "cmUgU2Vuc29yCj4+ICAgd2luYm9uZCx3cGN0MzAxICAgICAgICBpMmMgdHJ1c3RlZCBwbGF0Zm9y\n" - "bSBtb2R1bGUgKFRQTSkKPj4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdG1wMTAz\n" - "IGIvRG9jdW1lbnRhdGlvbi9od21vbi90bXAxMDMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4g\n" - "aW5kZXggMDAwMDAwMC4uZWMwMGExNQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL0RvY3VtZW50\n" - "YXRpb24vaHdtb24vdG1wMTAzCj4+IEBAIC0wLDAgKzEsMjggQEAKPj4gK0tlcm5lbCBkcml2ZXIg\n" - "dG1wMTAzCj4+ICs9PT09PT09PT09PT09PT09PT09PQo+PiArCj4+ICtTdXBwb3J0ZWQgY2hpcHM6\n" - "Cj4+ICsgICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAzCj4+ICsgICAgUHJlZml4OiAndG1wMTAz\n" - "Jwo+PiArICAgIEFkZHJlc3NlcyBzY2FubmVkOiBub25lCj4+ICsgICAgUHJvZHVjdCBpbmZvIGFu\n" - "ZCBkYXRhc2hlZXQ6IGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvdG1wMTAzCj4+ICsKPj4gK0F1\n" - "dGhvcjoKPj4gKyAgICBIZWlrbyBTY2hvY2hlciA8aHNAZGVueC5kZT4KPj4gKwo+PiArRGVzY3Jp\n" - "cHRpb24KPj4gKy0tLS0tLS0tLS0tCj4+ICsKPj4gK1RoZSBUTVAxMDMgaXMgYSBkaWdpdGFsIG91\n" - "dHB1dCB0ZW1wZXJhdHVyZSBzZW5zb3IgaW4gYSBmb3VyLWJhbGwKPj4gK3dhZmVyIGNoaXAtc2Nh\n" - "bGUgcGFja2FnZSAoV0NTUCkuIFRoZSBUTVAxMDMgaXMgY2FwYWJsZSBvZiByZWFkaW5nCj4+ICt0\n" - "ZW1wZXJhdHVyZXMgdG8gYSByZXNvbHV0aW9uIG9mIDHCsEMuIFRoZSBUTVAxMDMgaXMgc3BlY2lm\n" - "aWVkIGZvcgo+PiArb3BlcmF0aW9uIG92ZXIgYSB0ZW1wZXJhdHVyZSByYW5nZSBvZiDigJM0MMKw\n" - "QyB0byArMTI1wrBDLgo+PiArCj4+ICtSZXNvbHV0aW9uOiA4IEJpdHMKPj4gK0FjY3VyYWN5OiDC\n" - "sTHCsEMgVHlwICjigJMxMMKwQyB0byArMTAwwrBDKQo+PiArCj4+ICtUaGUgZHJpdmVyIHByb3Zp\n" - "ZGVzIHRoZSBjb21tb24gc3lzZnMtaW50ZXJmYWNlIGZvciB0ZW1wZXJhdHVyZXMgKHNlZQo+PiAr\n" - "RG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UgdW5kZXIgVGVtcGVyYXR1cmVzKS4K\n" - "Pj4gKwo+PiArUGxlYXNlIHJlZmVyIGhvdyB0byBpbnN0YW50aWF0ZSB0aGlzIGRyaXZlcjoKPj4g\n" - "K0RvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcwo+PiBkaWZmIC0tZ2l0IGEv\n" - "ZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCj4+IGluZGV4IDA4\n" - "NTMxYTEuLmM4ODJkNGIgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZwo+PiAr\n" - "KysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKPj4gQEAgLTEzOTEsNiArMTM5MSwxNiBAQCBjb25m\n" - "aWcgU0VOU09SU19UTVAxMDIKPj4gICAgICAgICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWls\n" - "dCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCj4+ICAgICAgICAgd2lsbCBiZSBjYWxs\n" - "ZWQgdG1wMTAyLgo+PiArY29uZmlnIFNFTlNPUlNfVE1QMTAzCj4+ICsgICAgdHJpc3RhdGUgIlRl\n" - "eGFzIEluc3RydW1lbnRzIFRNUDEwMyIKPj4gKyAgICBkZXBlbmRzIG9uIEkyQwo+PiArICAgIGhl\n" - "bHAKPj4gKyAgICAgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhh\n" - "cyBJbnN0cnVtZW50cyBUTVAxMDMKPj4gKyAgICAgIHNlbnNvciBjaGlwcy4KPj4gKwo+PiArICAg\n" - "ICAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhl\n" - "IG1vZHVsZQo+PiArICAgICAgd2lsbCBiZSBjYWxsZWQgdG1wMTAzLgo+PiArCj4+ICAgY29uZmln\n" - "IFNFTlNPUlNfVE1QNDAxCj4+ICAgICAgIHRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBUTVA0\n" - "MDEgYW5kIGNvbXBhdGlibGVzIgo+PiAgICAgICBkZXBlbmRzIG9uIEkyQwo+PiBkaWZmIC0tZ2l0\n" - "IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKPj4gaW5k\n" - "ZXggM2RjMGYwMi4uY2MwZGYxZWYgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZlcnMvaHdtb24vTWFrZWZp\n" - "bGUKPj4gKysrIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQo+PiBAQCAtMTM1LDYgKzEzNSw3IEBA\n" - "IG9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N00xOTIpKz0gc21zYzQ3bTE5Mi5vCj4+ICAgb2Jq\n" - "LSQoQ09ORklHX1NFTlNPUlNfQU1DNjgyMSkgICAgKz0gYW1jNjgyMS5vCj4+ICAgb2JqLSQoQ09O\n" - "RklHX1NFTlNPUlNfVEhNQzUwKSAgICArPSB0aG1jNTAubwo+PiAgIG9iai0kKENPTkZJR19TRU5T\n" - "T1JTX1RNUDEwMikgICAgKz0gdG1wMTAyLm8KPj4gK29iai0kKENPTkZJR19TRU5TT1JTX1RNUDEw\n" - "MykgICAgKz0gdG1wMTAzLm8KPj4gICBvYmotJChDT05GSUdfU0VOU09SU19UTVA0MDEpICAgICs9\n" - "IHRtcDQwMS5vCj4+ICAgb2JqLSQoQ09ORklHX1NFTlNPUlNfVE1QNDIxKSAgICArPSB0bXA0MjEu\n" - "bwo+PiAgIG9iai0kKENPTkZJR19TRU5TT1JTX1RXTDQwMzBfTUFEQykrPSB0d2w0MDMwLW1hZGMt\n" - "aHdtb24ubwo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi90bXAxMDMuYyBiL2RyaXZlcnMv\n" - "aHdtb24vdG1wMTAzLmMKPj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPj4gaW5kZXggMDAwMDAwMC4u\n" - "ZTY5ZGJjYQo+PiAtLS0gL2Rldi9udWxsCj4+ICsrKyBiL2RyaXZlcnMvaHdtb24vdG1wMTAzLmMK\n" - "Pj4gQEAgLTAsMCArMSwyMDUgQEAKPj4gKy8qCj4+ICsgKiBUZXhhcyBJbnN0cnVtZW50cyBUTVAx\n" - "MDMgU01CdXMgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlcgo+PiArICogQ29weXJpZ2h0IChDKSAy\n" - "MDE0IEhlaWtvIFNjaG9jaGVyIDxoc0BkZW54LmRlPgo+PiArICoKPj4gKyAqIEJhc2VkIG9uOgo+\n" - "PiArICogVGV4YXMgSW5zdHJ1bWVudHMgVE1QMTAyIFNNQnVzIHRlbXBlcmF0dXJlIHNlbnNvciBk\n" - "cml2ZXIKPj4gKyAqCj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU3RldmVuIEtpbmcgPHNma2lu\n" - "Z0BmZHdkYy5jb20+Cj4+ICsgKgo+PiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7\n" - "IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPj4gKyAqIGl0IHVuZGVyIHRo\n" - "ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5\n" - "Cj4+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9m\n" - "IHRoZSBMaWNlbnNlLCBvcgo+PiArICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv\n" - "bi4KPj4gKyAqCj4+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg\n" - "dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPj4gKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg\n" - "d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4+ICsgKiBNRVJDSEFOVEFCSUxJ\n" - "VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4+ICsgKiBH\n" - "TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+PiArICoKPj4gKyAq\n" - "Lwo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgv\n" - "aW5pdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9p\n" - "MmMuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2h3\n" - "bW9uLXN5c2ZzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZXJyLmg+Cj4+ICsjaW5jbHVkZSA8bGlu\n" - "dXgvbXV0ZXguaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KPj4gKyNpbmNsdWRlIDxs\n" - "aW51eC9qaWZmaWVzLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Cj4+ICsKPj4gKyNk\n" - "ZWZpbmUgVE1QMTAzX1RFTVBfUkVHICAgICAgICAweDAwCj4+ICsjZGVmaW5lIFRNUDEwM19DT05G\n" - "X1JFRyAgICAgICAgMHgwMQo+PiArI2RlZmluZSBUTVAxMDNfVExPV19SRUcgICAgICAgIDB4MDIK\n" - "Pj4gKyNkZWZpbmUgVE1QMTAzX1RISUdIX1JFRyAgICAweDAzCj4+ICsKPj4gKyNkZWZpbmUgVE1Q\n" - "MTAzX0NPTkZfTTAgICAgICAgIDB4MDEKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTTEgICAgICAg\n" - "IDB4MDIKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfTEMgICAgICAgIDB4MDQKPj4gKyNkZWZpbmUg\n" - "VE1QMTAzX0NPTkZfRkwgICAgICAgIDB4MDgKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfRkggICAg\n" - "ICAgIDB4MTAKPj4gKyNkZWZpbmUgVE1QMTAzX0NPTkZfQ1IwICAgICAgICAweDIwCj4+ICsjZGVm\n" - "aW5lIFRNUDEwM19DT05GX0NSMSAgICAgICAgMHg0MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9J\n" - "RCAgICAgICAgMHg4MAo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRCAgICAgICAgKFRNUDEwM19D\n" - "T05GX00xKQo+PiArI2RlZmluZSBUTVAxMDNfQ09ORl9TRF9NQVNLICAgIChUTVAxMDNfQ09ORl9N\n" - "MCB8IFRNUDEwM19DT05GX00xKQo+PiArCj4+ICsjZGVmaW5lIFRNUDEwM19DT05GSUcgICAgICAg\n" - "IChUTVAxMDNfQ09ORl9DUjEgfCBUTVAxMDNfQ09ORl9NMSkKPj4gKyNkZWZpbmUgVE1QMTAzX0NP\n" - "TkZJR19NQVNLICAgIChUTVAxMDNfQ09ORl9DUjAgfCBUTVAxMDNfQ09ORl9DUjEgfCBcCj4+ICsg\n" - "ICAgICAgICAgICAgICAgIFRNUDEwM19DT05GX00wIHwgVE1QMTAzX0NPTkZfTTEpCj4+ICsKPj4g\n" - "K3N0YXRpYyBpbmxpbmUgaW50IHRtcDEwM19yZWdfdG9fbWMoczggdmFsKQo+PiArewo+PiArICAg\n" - "IHJldHVybiB2YWwgKiAxMDAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIHU4IHRtcDEw\n" - "M19tY190b19yZWcoaW50IHZhbCkKPj4gK3sKPj4gKyAgICByZXR1cm4gRElWX1JPVU5EX0NMT1NF\n" - "U1QodmFsLCAxMDAwKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHNzaXplX3QgdG1wMTAzX3Nob3df\n" - "dGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCj4+ICsgICAgICAgICAgICAgICAgc3RydWN0IGRldmlj\n" - "ZV9hdHRyaWJ1dGUgKmF0dHIsCj4+ICsgICAgICAgICAgICAgICAgY2hhciAqYnVmKQo+PiArewo+\n" - "PiArICAgIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2RhID0gdG9fc2Vuc29yX2Rl\n" - "dl9hdHRyKGF0dHIpOwo+PiArICAgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2\n" - "ZGF0YShkZXYpOwo+PiArICAgIHVuc2lnbmVkIGludCByZWd2YWw7Cj4+ICsgICAgaW50IHJldDsK\n" - "Pj4gKwo+PiArICAgIHJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgc2RhLT5pbmRleCwgJnJlZ3Zh\n" - "bCk7Cj4+ICsgICAgaWYgKHJldCA8IDApCj4+ICsgICAgICAgIHJldHVybiByZXQ7Cj4+ICsKPj4g\n" - "KyAgICByZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1wMTAzX3JlZ190b19tYyhyZWd2YWwp\n" - "KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHNzaXplX3QgdG1wMTAzX3NldF90ZW1wKHN0cnVjdCBk\n" - "ZXZpY2UgKmRldiwKPj4gKyAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0\n" - "ZSAqYXR0ciwKPj4gKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBj\n" - "b3VudCkKPj4gK3sKPj4gKyAgICBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9\n" - "IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKPj4gKyAgICBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAg\n" - "PSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPj4gKyAgICBsb25nIHZhbDsKPj4gKyAgICBpbnQgcmV0\n" - "Owo+PiArCj4+ICsgICAgaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQo+PiArICAgICAg\n" - "ICByZXR1cm4gLUVJTlZBTDsKPj4gKwo+PiArICAgIHZhbCA9IGNsYW1wX3ZhbCh2YWwsIC01NTAw\n" - "MCwgMTI3MDAwKTsKPj4gKyAgICByZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBzZGEtPmluZGV4\n" - "LCB0bXAxMDNfbWNfdG9fcmVnKHZhbCkpOwo+PiArICAgIHJldHVybiByZXQgPyByZXQgOiBjb3Vu\n" - "dDsKPj4gK30KPj4gKwo+PiArc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwg\n" - "U19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwgTlVMTCAsCj4+ICsgICAgICAgICAgICAgIFRNUDEw\n" - "M19URU1QX1JFRyk7Cj4+ICsKPj4gK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWlu\n" - "LCBTX0lXVVNSIHwgU19JUlVHTywgdG1wMTAzX3Nob3dfdGVtcCwKPj4gKyAgICAgICAgICAgICAg\n" - "dG1wMTAzX3NldF90ZW1wLCBUTVAxMDNfVExPV19SRUcpOwo+PiArCj4+ICtzdGF0aWMgU0VOU09S\n" - "X0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHRtcDEwM19zaG93X3Rl\n" - "bXAsCj4+ICsgICAgICAgICAgICAgIHRtcDEwM19zZXRfdGVtcCwgVE1QMTAzX1RISUdIX1JFRyk7\n" - "Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXAxMDNfYXR0cnNbXSA9IHsKPj4g\n" - "KyAgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCj4+ICsgICAg\n" - "JnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKPj4gKyAgICAmc2Vuc29y\n" - "X2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAo+PiArICAgIE5VTEwKPj4gK307Cj4+\n" - "ICtBVFRSSUJVVEVfR1JPVVBTKHRtcDEwMyk7Cj4+ICsKPj4gK3N0YXRpYyBib29sIHRtcDEwM19y\n" - "ZWdtYXBfaXNfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQo+\n" - "PiArewo+PiArICAgIHJldHVybiByZWcgPT0gVE1QMTAzX1RFTVBfUkVHOwo+PiArfQo+PiArCj4+\n" - "ICtzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgdG1wMTAzX3JlZ21hcF9jb25maWcgPSB7Cj4+\n" - "ICsgICAgLnJlZ19iaXRzID0gOCwKPj4gKyAgICAudmFsX2JpdHMgPSA4LAo+PiArICAgIC5tYXhf\n" - "cmVnaXN0ZXIgPSBUTVAxMDNfVEhJR0hfUkVHLAo+PiArICAgIC52b2xhdGlsZV9yZWcgPSB0bXAx\n" - "MDNfcmVnbWFwX2lzX3ZvbGF0aWxlLAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGludCB0bXAxMDNf\n" - "cHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKPj4gKyAgICAgICAgICAgIGNvbnN0IHN0\n" - "cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKPj4gK3sKPj4gKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYg\n" - "PSAmY2xpZW50LT5kZXY7Cj4+ICsgICAgc3RydWN0IGRldmljZSAqaHdtb25fZGV2Owo+PiArICAg\n" - "IHN0cnVjdCByZWdtYXAgKnJlZ21hcDsKPj4gKyAgICBpbnQgcmV0Owo+PiArCj4+ICsgICAgaWYg\n" - "KCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCj4+ICsgICAgICAgICAg\n" - "ICAgICAgICAgICBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7Cj4+ICsgICAgICAgIGRldl9l\n" - "cnIoJmNsaWVudC0+ZGV2LAo+PiArICAgICAgICAgICAgImFkYXB0ZXIgZG9lc24ndCBzdXBwb3J0\n" - "IFNNQnVzIGJ5dGUgdHJhbnNhY3Rpb25zXG4iKTsKPj4gKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7\n" - "Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xp\n" - "ZW50LCAmdG1wMTAzX3JlZ21hcF9jb25maWcpOwo+PiArICAgIGlmIChJU19FUlIocmVnbWFwKSkg\n" - "ewo+PiArICAgICAgICBkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBt\n" - "YXBcbiIpOwo+PiArICAgICAgICByZXR1cm4gUFRSX0VSUihyZWdtYXApOwo+PiArICAgIH0KPj4g\n" - "Kwo+PiArICAgIHJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFRNUDEwM19DT05GX1JF\n" - "RywgVE1QMTAzX0NPTkZJR19NQVNLLAo+PiArICAgICAgICAgICAgICAgICBUTVAxMDNfQ09ORklH\n" - "KTsKPj4gKyAgICBpZiAocmV0IDwgMCkgewo+PiArICAgICAgICBkZXZfZXJyKCZjbGllbnQtPmRl\n" - "diwgImVycm9yIHdyaXRpbmcgY29uZmlnIHJlZ2lzdGVyXG4iKTsKPj4gKyAgICAgICAgcmV0dXJu\n" - "IHJldDsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgICBod21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVn\n" - "aXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCj4+ICsgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICByZWdtYXAsIHRtcDEwM19ncm91cHMpOwo+PiArICAgIHJldHVybiBQVFJf\n" - "RVJSX09SX1pFUk8oaHdtb25fZGV2KTsKPj4gK30KPj4gKwo+PiArI2lmZGVmIENPTkZJR19QTQo+\n" - "PiArc3RhdGljIGludCB0bXAxMDNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7Cj4+\n" - "ICsgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+ICsK\n" - "Pj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZfUkVH\n" - "LAo+PiArICAgICAgICAgICAgICAgICAgVE1QMTAzX0NPTkZfU0RfTUFTSywgMCk7Cj4+ICt9Cj4+\n" - "ICsKPj4gK3N0YXRpYyBpbnQgdG1wMTAzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7\n" - "Cj4+ICsgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4+\n" - "ICsKPj4gKyAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgVE1QMTAzX0NPTkZf\n" - "UkVHLAo+PiArICAgICAgICAgICAgICAgICAgVE1QMTAzX0NPTkZfU0RfTUFTSywgVE1QMTAzX0NP\n" - "TkZfU0QpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdG1w\n" - "MTAzX2Rldl9wbV9vcHMgPSB7Cj4+ICsgICAgLnN1c3BlbmQgICAgPSB0bXAxMDNfc3VzcGVuZCwK\n" - "Pj4gKyAgICAucmVzdW1lICAgICAgICA9IHRtcDEwM19yZXN1bWUsCj4+ICt9Owo+PiArCj4+ICsj\n" - "ZGVmaW5lIFRNUDEwM19ERVZfUE1fT1BTICgmdG1wMTAzX2Rldl9wbV9vcHMpCj4+ICsjZWxzZQo+\n" - "PiArI2RlZmluZSAgICBUTVAxMDNfREVWX1BNX09QUyBOVUxMCj4+ICsjZW5kaWYgLyogQ09ORklH\n" - "X1BNICovCj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0bXAxMDNf\n" - "aWRbXSA9IHsKPj4gKyAgICB7ICJ0bXAxMDMiLCAwIH0sCj4+ICsgICAgeyB9Cj4+ICt9Owo+Cj4g\n" - "SW4gdGhlIGJpbmRpbmdzIHlvdSBhcmUgZ2l2aW5nIHRoZSBjb21wYXRpYmxlIHByb3BlcnR5IGFz\n" - "IDogdGksdG1wMTAzLCBidXQgaGVyZSBvbmx5IHRtcDEwMy4KPgo+IEluc3RlYWQgb2YgdXNpbmcg\n" - "dGhlIGkyY19kZXZpY2VfaWQgc3RydWN0ICwgdXNlIG9mX2RldmljZV9pZCBzdHJ1Y3QgZm9yIGdp\n" - "dmluZyB0aGUKPiBjb21wYXRpYmxlIHByb3BlcnR5IHZhbHVlLgo+IGNvbXBhdGJsZSA9ICI8bWFu\n" - "dWZhY3R1cmVyPiw8bW9kZWw+Igo+CgpOby4gV2UgZG9uJ3QgZG8gdGhhdCBmb3Igb3RoZXIgaTJj\n" - "IGRyaXZlcnMsIGFuZCB0aGUgaTJjIHN1YnN5c3RlbSBoYW5kbGVzCnRoaXMgY2FzZSwgc28gaXQg\n" - "ZG9lcyBub3Qgc2Vuc2UgdG8gc3RhcnQgdGhhdCB3aXRoIHRoaXMgZHJpdmVyIGp1c3QKZm9yIHRo\n" - "ZSBzYWtlIG9mIG1ha2luZyB0aGUgY29kZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgaGFzIHRv\n" - "IGJlLgoKVGhhbmtzLApHdWVudGVyCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f\n" - "X19fX19fX19fX19fX18KbG0tc2Vuc29ycyBtYWlsaW5nIGxpc3QKbG0tc2Vuc29yc0BsbS1zZW5z\n" - "b3JzLm9yZwpodHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1z\n" - ZW5zb3Jz + "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 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 a/Documentation/devicetree/bindings/i2c/trivial-devices.txt 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 Serial Interface\n" + ">> +ti,tmp103 Low Power Digital Temperature Sensor with SMBUS/Two Wire 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 modify\n" + ">> + * it under the terms of the GNU General Public License as published by\n" + ">> + * the Free Software Foundation; either version 2 of the License, or\n" + ">> + * (at your option) any later version.\n" + ">> + *\n" + ">> + * This program is distributed in the hope that it will be useful,\n" + ">> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + ">> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + ">> + * GNU General Public License for more details.\n" + ">> + *\n" + ">> + */\n" + ">> +\n" + ">> +#include <linux/module.h>\n" + ">> +#include <linux/init.h>\n" + ">> +#include <linux/slab.h>\n" + ">> +#include <linux/i2c.h>\n" + ">> +#include <linux/hwmon.h>\n" + ">> +#include <linux/hwmon-sysfs.h>\n" + ">> +#include <linux/err.h>\n" + ">> +#include <linux/mutex.h>\n" + ">> +#include <linux/device.h>\n" + ">> +#include <linux/jiffies.h>\n" + ">> +#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, NULL ,\n" + ">> + TMP103_TEMP_REG);\n" + ">> +\n" + ">> +static SENSOR_DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, tmp103_show_temp,\n" + ">> + tmp103_set_temp, TMP103_TLOW_REG);\n" + ">> +\n" + ">> +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, 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 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 : ti,tmp103, but here only tmp103.\n" + ">\n" + "> Instead of using the i2c_device_id struct , use of_device_id struct 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 -0ee3bf9b9306184d3d0323d334491028cee2ff75fed0d042d0a4fb2e95a1fcd4 +2bd9bf97a0f09d607a47b96c4019e6a2a90bd0cfc6956d67fb4332a66f0a5618
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.