All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1542884458.30645.22.camel@analog.com>

diff --git a/a/1.txt b/N1/1.txt
index 0dd4ad3..822c91a 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,111 +1,185 @@
-T24gTWksIDIwMTgtMTEtMjEgYXQgMTY6MDQgLTAyMDAsIEdpdWxpYW5vIEJlbGluYXNzaSB3cm90
-ZToNCj4gUHJldmlvdXNseSwgdGhlIEFENzc4MCBkcml2ZXIgb25seSBzdXBwb3J0ZWQgZ3BpbyBm
-b3IgdGhlICdwb3dlcmRvd24nDQo+IHBpbi4gVGhpcyBjb21taXQgYWRkcyBzdXBwcG9ydCBmb3Ig
-dGhlICdnYWluJyBhbmQgJ2ZpbHRlcicgcGluLg0KSGV5LA0KDQpDb21tZW50cyBpbmxpbmUuDQo+
-IA0KPiBTaWduZWQtb2ZmLWJ5OiBHaXVsaWFubyBCZWxpbmFzc2kgPGdpdWxpYW5vLmJlbGluYXNz
-aUB1c3AuYnI+DQo+IC0tLQ0KPiDCoGRyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc4MC5jwqDC
-oMKgwqDCoMKgwqB8IDYxICsrKysrKysrKysrKysrKysrKysrKysrKy0tDQo+IMKgaW5jbHVkZS9s
-aW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmggfMKgwqA1ICsrKw0KPiDCoDIgZmlsZXMgY2hh
-bmdlZCwgNjIgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQg
-YS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiBiL2RyaXZlcnMvc3RhZ2luZy9p
-aW8vYWRjL2FkNzc4MC5jDQo+IGluZGV4IGM0YTg1Nzg5YzJkYi4uNjk3OTRmMDZkYmNkIDEwMDY0
-NA0KPiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiArKysgYi9kcml2
-ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiBAQCAtMzksNiArMzksOSBAQA0KPiDCoCNk
-ZWZpbmUgQUQ3MTcwX1BBVFRFUk4JCShBRDc3ODBfUEFUMCB8IEFENzE3MF9QQVQyKQ0KPiDCoCNk
-ZWZpbmUgQUQ3MTcwX1BBVFRFUk5fTUFTSwkoQUQ3NzgwX1BBVDAgfCBBRDc3ODBfUEFUMSB8DQo+
-IEFENzE3MF9QQVQyKQ0KPiDCoA0KPiArI2RlZmluZSBBRDc3ODBfR0FJTl9HUElPCTANCj4gKyNk
-ZWZpbmUgQUQ3NzgwX0ZJTFRFUl9HUElPCTENCj4gKw0KPiDCoHN0cnVjdCBhZDc3ODBfY2hpcF9p
-bmZvIHsNCj4gwqAJc3RydWN0IGlpb19jaGFuX3NwZWMJY2hhbm5lbDsNCj4gwqAJdW5zaWduZWQg
-aW50CQlwYXR0ZXJuX21hc2s7DQo+IEBAIC01MCw2ICs1Myw4IEBAIHN0cnVjdCBhZDc3ODBfc3Rh
-dGUgew0KPiDCoAljb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbwkqY2hpcF9pbmZvOw0KPiDC
-oAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOw0KPiDCoAlzdHJ1Y3QgZ3Bpb19kZXNjCQkqcG93ZXJk
-b3duX2dwaW87DQo+ICsJc3RydWN0IGdwaW9fZGVzYwkJKmdhaW5fZ3BpbzsNCj4gKwlzdHJ1Y3Qg
-Z3Bpb19kZXNjCQkqZmlsdGVyX2dwaW87DQo+IMKgCXVuc2lnbmVkIGludAlnYWluOw0KPiDCoA0K
-PiDCoAlzdHJ1Y3QgYWRfc2lnbWFfZGVsdGEgc2Q7DQo+IEBAIC0xMTUsMTggKzEyMCw1MSBAQCBz
-dGF0aWMgaW50IGFkNzc4MF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2Rldg0KPiAqaW5kaW9fZGV2LA0K
-PiDCoAlyZXR1cm4gLUVJTlZBTDsNCj4gwqB9DQo+IMKgDQo+ICtzdGF0aWMgaW50IGFkNzc4MF93
-cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCcKgwqDCoMKgc3RydWN0
-IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sDQo+ICsJCQnCoMKgwqDCoGludCB2YWwsDQo+ICsJ
-CQnCoMKgwqDCoGludCB2YWwyLA0KPiArCQkJwqDCoMKgwqBsb25nIG0pDQo+ICt7DQo+ICsJc3Ry
-dWN0IGFkNzc4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOw0KPiArDQo+ICsJaWYg
-KG0gIT0gSUlPX0NIQU5fSU5GT19SQVcpDQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsJ
-aWYgKHN0LT5jaGlwX2luZm8tPmlzX2FkNzc4eCkgew0KPiArCQlzd2l0Y2godmFsKSB7DQo+ICsJ
-CWNhc2UgQUQ3NzgwX0dBSU5fR1BJTzoNCg0KSSB0aGluayB0aGF0IGluc3RlYWQgb2Ygc2V0dGlu
-ZyB0aGUgZ2FpbiBkaXJlY3RseSwgd2Ugc2hvdWxkIHVzZQ0KdGhlwqBJSU9fQ0hBTl9JTkZPX1ND
-QUxFIGF0dHJpYnV0ZS4gQXQgcGFnZSAxMiBvZiB0aGUgYWQ3NzgwIGRhdGFzaGVldCB0aGVyZQ0K
-aXMgYSBmb3JtdWxhIGZyb20gd2hpY2ggdGhlIG91dHB1dCBjb2RlIGNhbiBiZSBjYWxjdWxhdGVk
-Og0KQ29kZSA9IDJeKE4g4oiSIDEpDQrDlyBbKEFJTiDDlyBHYWluIC9WUkVGKSArIDFdLiBTbywg
-Ynkgc2V0dGluZyB0aGUgc2NhbGUgZnJvbSB1c2VyIHNwYWNlLCB0aGUNCmRyaXZlciBjYW4gY2Fs
-Y3VsYXRlIHRoZSBjb3JyZWN0IGdhaW4gYnkgdXNpbmcgdGhlIGZvcm11bGEgYWJvdmUuIEFsc28s
-IGl0DQp3b3VsZCBiZSB1c2VmdWwgdG8gaW50cm9kdWNlIHNjYWxlIGF2YWlsYWJsZS4NCkZ1cnRo
-ZXJtb3JlLCB0aGVyZSBpcyBhIG5ldw0KYWQ3MTI0IGFkYyBkcml2ZXIgd2hpY2ggZG9lcyB0aGlz
-IGV4YWN0IHRoaW5nLiBUYWtlIGEgbG9vayBoZXJlOsKgaHR0cHM6Ly9naQ0KdGh1Yi5jb20vYW5h
-bG9nZGV2aWNlc2luYy9saW51eC9ibG9iL21hc3Rlci9kcml2ZXJzL2lpby9hZGMvYWQ3MTI0LmMj
-TDMzNy4NCg0KPiArCQkJZ3Bpb2Rfc2V0X3ZhbHVlKHN0LT5nYWluX2dwaW8sIHZhbDIpOw0KPiAr
-CQlicmVhazsNCj4gKwkJY2FzZSBBRDc3ODBfRklMVEVSX0dQSU86DQoNClRoZSBhdHRyaWJ1dGUg
-dGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGZpbHRlciBncGlvIGlzDQpJSU9f
-Q0hBTl9JTkZPX1NBTVBfRlJFUS4gU28sIHdlIHNob3VsZCBoYXZlIDEwIEh6IGFuZCAxNi43IEh6
-IGF2YWlsYWJsZQ0Kc2FtcGxpbmcgZnJlcXVlbmNpZXMuIElmIGZyb20gdXNlciBzcGFjZSB0aGUg
-MTAgSHogc2FtcGxpbmcgZnJlcSBpcw0KcmVxdWVzdGVkLCB0aGVuIHdlIHNldCB0aGUgRklMVEVS
-IHBpbiBoaWdoLCB3aGlsZSBmb3IgMTYuNyBIeiB0aGUgRklMVEVSDQpwaW4gd2lsbCBiZSBsb3cu
-DQoNCj4gKwkJCWdwaW9kX3NldF92YWx1ZShzdC0+ZmlsdGVyX2dwaW8sIHZhbDIpOw0KPiArCQli
-cmVhazsNCj4gKwkJZGVmYXVsdDoNCj4gKwkJCXJldHVybiAtRUlOVkFMOw0KPiArCQl9DQo+ICsJ
-fQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gwqBzdGF0aWMgaW50IGFkNzc4MF9w
-b3N0cHJvY2Vzc19zYW1wbGUoc3RydWN0IGFkX3NpZ21hX2RlbHRhICpzaWdtYV9kZWx0YSwNCj4g
-wqAJCQkJwqDCoMKgwqDCoHVuc2lnbmVkIGludCByYXdfc2FtcGxlKQ0KPiDCoHsNCj4gwqAJc3Ry
-dWN0IGFkNzc4MF9zdGF0ZSAqc3QgPSBhZF9zaWdtYV9kZWx0YV90b19hZDc3ODAoc2lnbWFfZGVs
-dGEpOw0KPiDCoAljb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbyAqY2hpcF9pbmZvID0gc3Qt
-PmNoaXBfaW5mbzsNCj4gKwlpbnQgdmFsOw0KPiDCoA0KPiDCoAlpZiAoKHJhd19zYW1wbGUgJiBB
-RDc3ODBfRVJSKSB8fA0KPiDCoAnCoMKgwqDCoCgocmF3X3NhbXBsZSAmIGNoaXBfaW5mby0+cGF0
-dGVybl9tYXNrKSAhPSBjaGlwX2luZm8tDQo+ID5wYXR0ZXJuKSkNCj4gwqAJCXJldHVybiAtRUlP
-Ow0KPiDCoA0KPiDCoAlpZiAoY2hpcF9pbmZvLT5pc19hZDc3OHgpIHsNCj4gLQkJaWYgKHJhd19z
-YW1wbGUgJiBBRDc3ODBfR0FJTikNCj4gKwkJdmFsID0gcmF3X3NhbXBsZSAmIEFENzc4MF9HQUlO
-Ow0KPiArDQo+ICsJCWlmICh2YWwgIT0gZ3Bpb2RfZ2V0X3ZhbHVlKHN0LT5nYWluX2dwaW8pKQ0K
-PiArCQkJcmV0dXJuIC1FSU87DQo+ICsNCj4gKwkJaWYgKHZhbCkNCj4gwqAJCQlzdC0+Z2FpbiA9
-IDE7DQo+IMKgCQllbHNlDQo+IMKgCQkJc3QtPmdhaW4gPSAxMjg7DQo+IEBAIC0xNDEsMTggKzE3
-OSwyMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFkX3NpZ21hX2RlbHRhX2luZm8NCj4gYWQ3Nzgw
-X3NpZ21hX2RlbHRhX2luZm8gPSB7DQo+IMKgCS5oYXNfcmVnaXN0ZXJzID0gZmFsc2UsDQo+IMKg
-fTsNCj4gwqANCj4gLSNkZWZpbmUgQUQ3NzgwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4g
-KyNkZWZpbmUgQUQ3MTcwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4gwqAJQURfU0RfQ0hB
-Tk5FTF9OT19TQU1QX0ZSRVEoMSwgMCwgMCwgYml0cywgMzIsIHdvcmRzaXplIC0gYml0cykNCj4g
-KyNkZWZpbmUgQUQ3NzgwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4gKwlBRF9TRF9DSEFO
-TkVMX0dBSU5fRklMVEVSKDEsIDAsIDAsIGJpdHMsIDMyLCB3b3Jkc2l6ZSAtIGJpdHMpDQo+IMKg
-DQo+IMKgc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc3ODBfY2hpcF9pbmZvIGFkNzc4MF9jaGlwX2lu
-Zm9fdGJsW10gPSB7DQo+IMKgCVtJRF9BRDcxNzBdID0gew0KPiAtCQkuY2hhbm5lbCA9IEFENzc4
-MF9DSEFOTkVMKDEyLCAyNCksDQo+ICsJCS5jaGFubmVsID0gQUQ3MTcwX0NIQU5ORUwoMTIsIDI0
-KSwNCj4gwqAJCS5wYXR0ZXJuID0gQUQ3MTcwX1BBVFRFUk4sDQo+IMKgCQkucGF0dGVybl9tYXNr
-ID0gQUQ3MTcwX1BBVFRFUk5fTUFTSywNCj4gwqAJCS5pc19hZDc3OHggPSBmYWxzZSwNCj4gwqAJ
-fSwNCj4gwqAJW0lEX0FENzE3MV0gPSB7DQo+IC0JCS5jaGFubmVsID0gQUQ3NzgwX0NIQU5ORUwo
-MTYsIDI0KSwNCj4gKwkJLmNoYW5uZWwgPSBBRDcxNzBfQ0hBTk5FTCgxNiwgMjQpLA0KPiDCoAkJ
-LnBhdHRlcm4gPSBBRDcxNzBfUEFUVEVSTiwNCj4gwqAJCS5wYXR0ZXJuX21hc2sgPSBBRDcxNzBf
-UEFUVEVSTl9NQVNLLA0KPiDCoAkJLmlzX2FkNzc4eCA9IGZhbHNlLA0KPiBAQCAtMTczLDYgKzIx
-Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbw0KPiBhZDc3ODBfY2hp
-cF9pbmZvX3RibFtdID0gew0KPiDCoA0KPiDCoHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8g
-YWQ3NzgwX2luZm8gPSB7DQo+IMKgCS5yZWFkX3JhdyA9IGFkNzc4MF9yZWFkX3JhdywNCj4gKwku
-d3JpdGVfcmF3ID0gYWQ3NzgwX3dyaXRlX3JhdywNCj4gwqB9Ow0KPiDCoA0KPiDCoHN0YXRpYyBp
-bnQgYWQ3NzgwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+IEBAIC0yMjIsNiArMjYz
-LDE4IEBAIHN0YXRpYyBpbnQgYWQ3NzgwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+
-IMKgCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOw0KPiDCoAl9DQo+IMKgDQo+ICsJaWYgKHN0LT5j
-aGlwX2luZm8tPmlzX2FkNzc4eCkgew0KPiArCQlzdC0+Z2Fpbl9ncGlvID0gZGV2bV9ncGlvZF9n
-ZXRfb3B0aW9uYWwoJnNwaS0+ZGV2LA0KPiArCQkJCQkJCSJnYWluIiwNCj4gKwkJCQkJCQlHUElP
-RF9PVVRfSElHSCk7DQo+ICsJCWlmIChJU19FUlIoc3QtPmdhaW5fZ3BpbykpIHsNCj4gKwkJCXJl
-dCA9IFBUUl9FUlIoc3QtPmdhaW5fZ3Bpbyk7DQo+ICsJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZh
-aWxlZCB0byByZXF1ZXN0IGdhaW4gR1BJTzoNCj4gJWRcbiIsDQo+ICsJCQkJcmV0KTsNCj4gKwkJ
-CWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gwqAJcmV0ID0g
-YWRfc2Rfc2V0dXBfYnVmZmVyX2FuZF90cmlnZ2VyKGluZGlvX2Rldik7DQo+IMKgCWlmIChyZXQp
-DQo+IMKgCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOw0KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s
-aW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gYi9pbmNsdWRlL2xpbnV4L2lpby9hZGMv
-YWRfc2lnbWFfZGVsdGEuaA0KPiBpbmRleCA3MzBlYWQxYTQ2ZGYuLjZjYWRhYjZmZDVmZCAxMDA2
-NDQNCj4gLS0tIGEvaW5jbHVkZS9saW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gKysr
-IGIvaW5jbHVkZS9saW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gQEAgLTE3Myw2ICsx
-NzMsMTEgQEAgaW50IGFkX3NkX3ZhbGlkYXRlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYNCj4gKmlu
-ZGlvX2Rldiwgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsNCj4gwqAJX19BRF9TRF9DSEFOTkVM
-KF9zaSwgX2NoYW5uZWwsIC0xLCBfYWRkcmVzcywgX2JpdHMsIFwNCj4gwqAJCV9zdG9yYWdlYml0
-cywgX3NoaWZ0LCBOVUxMLCBJSU9fVk9MVEFHRSwgMCkNCj4gwqANCj4gKyNkZWZpbmUgQURfU0Rf
-Q0hBTk5FTF9HQUlOX0ZJTFRFUihfc2ksIF9jaGFubmVsLCBfYWRkcmVzcywgX2JpdHMsIFwNCj4g
-Kwlfc3RvcmFnZWJpdHMsIF9zaGlmdCkgXA0KPiArCV9fQURfU0RfQ0hBTk5FTChfc2ksIF9jaGFu
-bmVsLCAtMSwgX2FkZHJlc3MsIF9iaXRzLCBcDQo+ICsJCV9zdG9yYWdlYml0cywgX3NoaWZ0LCBO
-VUxMLCBJSU9fVk9MVEFHRSwNCj4gQklUKElJT19DSEFOX0lORk9fUkFXKSkNCj4gKw0KPiDCoCNk
-ZWZpbmUgQURfU0RfVEVNUF9DSEFOTkVMKF9zaSwgX2FkZHJlc3MsIF9iaXRzLCBfc3RvcmFnZWJp
-dHMsIF9zaGlmdCkgXA0KPiDCoAlfX0FEX1NEX0NIQU5ORUwoX3NpLCAwLCAtMSwgX2FkZHJlc3Ms
-IF9iaXRzLCBcDQo+IMKgCQlfc3RvcmFnZWJpdHMsIF9zaGlmdCwgTlVMTCwgSUlPX1RFTVAsIFw=
+On Mi, 2018-11-21 at 16:04 -0200, Giuliano Belinassi wrote:
+> Previously, the AD7780 driver only supported gpio for the 'powerdown'
+> pin. This commit adds suppport for the 'gain' and 'filter' pin.
+Hey,
+
+Comments inline.
+> 
+> Signed-off-by: Giuliano Belinassi <giuliano.belinassi@usp.br>
+> ---
+>  drivers/staging/iio/adc/ad7780.c       | 61 ++++++++++++++++++++++++--
+>  include/linux/iio/adc/ad_sigma_delta.h |  5 +++
+>  2 files changed, 62 insertions(+), 4 deletions(-)
+> 
+> diff --git a/drivers/staging/iio/adc/ad7780.c
+> b/drivers/staging/iio/adc/ad7780.c
+> index c4a85789c2db..69794f06dbcd 100644
+> --- a/drivers/staging/iio/adc/ad7780.c
+> +++ b/drivers/staging/iio/adc/ad7780.c
+> @@ -39,6 +39,9 @@
+>  #define AD7170_PATTERN		(AD7780_PAT0 | AD7170_PAT2)
+>  #define AD7170_PATTERN_MASK	(AD7780_PAT0 | AD7780_PAT1 |
+> AD7170_PAT2)
+>  
+> +#define AD7780_GAIN_GPIO	0
+> +#define AD7780_FILTER_GPIO	1
+> +
+>  struct ad7780_chip_info {
+>  	struct iio_chan_spec	channel;
+>  	unsigned int		pattern_mask;
+> @@ -50,6 +53,8 @@ struct ad7780_state {
+>  	const struct ad7780_chip_info	*chip_info;
+>  	struct regulator		*reg;
+>  	struct gpio_desc		*powerdown_gpio;
+> +	struct gpio_desc		*gain_gpio;
+> +	struct gpio_desc		*filter_gpio;
+>  	unsigned int	gain;
+>  
+>  	struct ad_sigma_delta sd;
+> @@ -115,18 +120,51 @@ static int ad7780_read_raw(struct iio_dev
+> *indio_dev,
+>  	return -EINVAL;
+>  }
+>  
+> +static int ad7780_write_raw(struct iio_dev *indio_dev,
+> +			    struct iio_chan_spec const *chan,
+> +			    int val,
+> +			    int val2,
+> +			    long m)
+> +{
+> +	struct ad7780_state *st = iio_priv(indio_dev);
+> +
+> +	if (m != IIO_CHAN_INFO_RAW)
+> +		return -EINVAL;
+> +
+> +	if (st->chip_info->is_ad778x) {
+> +		switch(val) {
+> +		case AD7780_GAIN_GPIO:
+
+I think that instead of setting the gain directly, we should use
+the IIO_CHAN_INFO_SCALE attribute. At page 12 of the ad7780 datasheet there
+is a formula from which the output code can be calculated:
+Code = 2^(N − 1)
+× [(AIN × Gain /VREF) + 1]. So, by setting the scale from user space, the
+driver can calculate the correct gain by using the formula above. Also, it
+would be useful to introduce scale available.
+Furthermore, there is a new
+ad7124 adc driver which does this exact thing. Take a look here: https://gi
+thub.com/analogdevicesinc/linux/blob/master/drivers/iio/adc/ad7124.c#L337.
+
+> +			gpiod_set_value(st->gain_gpio, val2);
+> +		break;
+> +		case AD7780_FILTER_GPIO:
+
+The attribute that should be used to configure the filter gpio is
+IIO_CHAN_INFO_SAMP_FREQ. So, we should have 10 Hz and 16.7 Hz available
+sampling frequencies. If from user space the 10 Hz sampling freq is
+requested, then we set the FILTER pin high, while for 16.7 Hz the FILTER
+pin will be low.
+
+> +			gpiod_set_value(st->filter_gpio, val2);
+> +		break;
+> +		default:
+> +			return -EINVAL;
+> +		}
+> +	}
+> +
+> +	return 0;
+> +}
+> +
+>  static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta,
+>  				     unsigned int raw_sample)
+>  {
+>  	struct ad7780_state *st = ad_sigma_delta_to_ad7780(sigma_delta);
+>  	const struct ad7780_chip_info *chip_info = st->chip_info;
+> +	int val;
+>  
+>  	if ((raw_sample & AD7780_ERR) ||
+>  	    ((raw_sample & chip_info->pattern_mask) != chip_info-
+> >pattern))
+>  		return -EIO;
+>  
+>  	if (chip_info->is_ad778x) {
+> -		if (raw_sample & AD7780_GAIN)
+> +		val = raw_sample & AD7780_GAIN;
+> +
+> +		if (val != gpiod_get_value(st->gain_gpio))
+> +			return -EIO;
+> +
+> +		if (val)
+>  			st->gain = 1;
+>  		else
+>  			st->gain = 128;
+> @@ -141,18 +179,20 @@ static const struct ad_sigma_delta_info
+> ad7780_sigma_delta_info = {
+>  	.has_registers = false,
+>  };
+>  
+> -#define AD7780_CHANNEL(bits, wordsize) \
+> +#define AD7170_CHANNEL(bits, wordsize) \
+>  	AD_SD_CHANNEL_NO_SAMP_FREQ(1, 0, 0, bits, 32, wordsize - bits)
+> +#define AD7780_CHANNEL(bits, wordsize) \
+> +	AD_SD_CHANNEL_GAIN_FILTER(1, 0, 0, bits, 32, wordsize - bits)
+>  
+>  static const struct ad7780_chip_info ad7780_chip_info_tbl[] = {
+>  	[ID_AD7170] = {
+> -		.channel = AD7780_CHANNEL(12, 24),
+> +		.channel = AD7170_CHANNEL(12, 24),
+>  		.pattern = AD7170_PATTERN,
+>  		.pattern_mask = AD7170_PATTERN_MASK,
+>  		.is_ad778x = false,
+>  	},
+>  	[ID_AD7171] = {
+> -		.channel = AD7780_CHANNEL(16, 24),
+> +		.channel = AD7170_CHANNEL(16, 24),
+>  		.pattern = AD7170_PATTERN,
+>  		.pattern_mask = AD7170_PATTERN_MASK,
+>  		.is_ad778x = false,
+> @@ -173,6 +213,7 @@ static const struct ad7780_chip_info
+> ad7780_chip_info_tbl[] = {
+>  
+>  static const struct iio_info ad7780_info = {
+>  	.read_raw = ad7780_read_raw,
+> +	.write_raw = ad7780_write_raw,
+>  };
+>  
+>  static int ad7780_probe(struct spi_device *spi)
+> @@ -222,6 +263,18 @@ static int ad7780_probe(struct spi_device *spi)
+>  		goto error_disable_reg;
+>  	}
+>  
+> +	if (st->chip_info->is_ad778x) {
+> +		st->gain_gpio = devm_gpiod_get_optional(&spi->dev,
+> +							"gain",
+> +							GPIOD_OUT_HIGH);
+> +		if (IS_ERR(st->gain_gpio)) {
+> +			ret = PTR_ERR(st->gain_gpio);
+> +			dev_err(&spi->dev, "Failed to request gain GPIO:
+> %d\n",
+> +				ret);
+> +			goto error_disable_reg;
+> +		}
+> +	}
+> +
+>  	ret = ad_sd_setup_buffer_and_trigger(indio_dev);
+>  	if (ret)
+>  		goto error_disable_reg;
+> diff --git a/include/linux/iio/adc/ad_sigma_delta.h
+> b/include/linux/iio/adc/ad_sigma_delta.h
+> index 730ead1a46df..6cadab6fd5fd 100644
+> --- a/include/linux/iio/adc/ad_sigma_delta.h
+> +++ b/include/linux/iio/adc/ad_sigma_delta.h
+> @@ -173,6 +173,11 @@ int ad_sd_validate_trigger(struct iio_dev
+> *indio_dev, struct iio_trigger *trig);
+>  	__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \
+>  		_storagebits, _shift, NULL, IIO_VOLTAGE, 0)
+>  
+> +#define AD_SD_CHANNEL_GAIN_FILTER(_si, _channel, _address, _bits, \
+> +	_storagebits, _shift) \
+> +	__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \
+> +		_storagebits, _shift, NULL, IIO_VOLTAGE,
+> BIT(IIO_CHAN_INFO_RAW))
+> +
+>  #define AD_SD_TEMP_CHANNEL(_si, _address, _bits, _storagebits, _shift) \
+>  	__AD_SD_CHANNEL(_si, 0, -1, _address, _bits, \
+>  		_storagebits, _shift, NULL, IIO_TEMP, \
diff --git a/a/content_digest b/N1/content_digest
index 8d638f7..d32aaa1 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -18,116 +18,190 @@
  " kernel-usp@googlegroups.com <kernel-usp@googlegroups.com>\0"
  "\00:1\0"
  "b\0"
- "T24gTWksIDIwMTgtMTEtMjEgYXQgMTY6MDQgLTAyMDAsIEdpdWxpYW5vIEJlbGluYXNzaSB3cm90\n"
- "ZToNCj4gUHJldmlvdXNseSwgdGhlIEFENzc4MCBkcml2ZXIgb25seSBzdXBwb3J0ZWQgZ3BpbyBm\n"
- "b3IgdGhlICdwb3dlcmRvd24nDQo+IHBpbi4gVGhpcyBjb21taXQgYWRkcyBzdXBwcG9ydCBmb3Ig\n"
- "dGhlICdnYWluJyBhbmQgJ2ZpbHRlcicgcGluLg0KSGV5LA0KDQpDb21tZW50cyBpbmxpbmUuDQo+\n"
- "IA0KPiBTaWduZWQtb2ZmLWJ5OiBHaXVsaWFubyBCZWxpbmFzc2kgPGdpdWxpYW5vLmJlbGluYXNz\n"
- "aUB1c3AuYnI+DQo+IC0tLQ0KPiDCoGRyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc4MC5jwqDC\n"
- "oMKgwqDCoMKgwqB8IDYxICsrKysrKysrKysrKysrKysrKysrKysrKy0tDQo+IMKgaW5jbHVkZS9s\n"
- "aW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmggfMKgwqA1ICsrKw0KPiDCoDIgZmlsZXMgY2hh\n"
- "bmdlZCwgNjIgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQg\n"
- "YS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiBiL2RyaXZlcnMvc3RhZ2luZy9p\n"
- "aW8vYWRjL2FkNzc4MC5jDQo+IGluZGV4IGM0YTg1Nzg5YzJkYi4uNjk3OTRmMDZkYmNkIDEwMDY0\n"
- "NA0KPiAtLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiArKysgYi9kcml2\n"
- "ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiBAQCAtMzksNiArMzksOSBAQA0KPiDCoCNk\n"
- "ZWZpbmUgQUQ3MTcwX1BBVFRFUk4JCShBRDc3ODBfUEFUMCB8IEFENzE3MF9QQVQyKQ0KPiDCoCNk\n"
- "ZWZpbmUgQUQ3MTcwX1BBVFRFUk5fTUFTSwkoQUQ3NzgwX1BBVDAgfCBBRDc3ODBfUEFUMSB8DQo+\n"
- "IEFENzE3MF9QQVQyKQ0KPiDCoA0KPiArI2RlZmluZSBBRDc3ODBfR0FJTl9HUElPCTANCj4gKyNk\n"
- "ZWZpbmUgQUQ3NzgwX0ZJTFRFUl9HUElPCTENCj4gKw0KPiDCoHN0cnVjdCBhZDc3ODBfY2hpcF9p\n"
- "bmZvIHsNCj4gwqAJc3RydWN0IGlpb19jaGFuX3NwZWMJY2hhbm5lbDsNCj4gwqAJdW5zaWduZWQg\n"
- "aW50CQlwYXR0ZXJuX21hc2s7DQo+IEBAIC01MCw2ICs1Myw4IEBAIHN0cnVjdCBhZDc3ODBfc3Rh\n"
- "dGUgew0KPiDCoAljb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbwkqY2hpcF9pbmZvOw0KPiDC\n"
- "oAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOw0KPiDCoAlzdHJ1Y3QgZ3Bpb19kZXNjCQkqcG93ZXJk\n"
- "b3duX2dwaW87DQo+ICsJc3RydWN0IGdwaW9fZGVzYwkJKmdhaW5fZ3BpbzsNCj4gKwlzdHJ1Y3Qg\n"
- "Z3Bpb19kZXNjCQkqZmlsdGVyX2dwaW87DQo+IMKgCXVuc2lnbmVkIGludAlnYWluOw0KPiDCoA0K\n"
- "PiDCoAlzdHJ1Y3QgYWRfc2lnbWFfZGVsdGEgc2Q7DQo+IEBAIC0xMTUsMTggKzEyMCw1MSBAQCBz\n"
- "dGF0aWMgaW50IGFkNzc4MF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2Rldg0KPiAqaW5kaW9fZGV2LA0K\n"
- "PiDCoAlyZXR1cm4gLUVJTlZBTDsNCj4gwqB9DQo+IMKgDQo+ICtzdGF0aWMgaW50IGFkNzc4MF93\n"
- "cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwNCj4gKwkJCcKgwqDCoMKgc3RydWN0\n"
- "IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sDQo+ICsJCQnCoMKgwqDCoGludCB2YWwsDQo+ICsJ\n"
- "CQnCoMKgwqDCoGludCB2YWwyLA0KPiArCQkJwqDCoMKgwqBsb25nIG0pDQo+ICt7DQo+ICsJc3Ry\n"
- "dWN0IGFkNzc4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOw0KPiArDQo+ICsJaWYg\n"
- "KG0gIT0gSUlPX0NIQU5fSU5GT19SQVcpDQo+ICsJCXJldHVybiAtRUlOVkFMOw0KPiArDQo+ICsJ\n"
- "aWYgKHN0LT5jaGlwX2luZm8tPmlzX2FkNzc4eCkgew0KPiArCQlzd2l0Y2godmFsKSB7DQo+ICsJ\n"
- "CWNhc2UgQUQ3NzgwX0dBSU5fR1BJTzoNCg0KSSB0aGluayB0aGF0IGluc3RlYWQgb2Ygc2V0dGlu\n"
- "ZyB0aGUgZ2FpbiBkaXJlY3RseSwgd2Ugc2hvdWxkIHVzZQ0KdGhlwqBJSU9fQ0hBTl9JTkZPX1ND\n"
- "QUxFIGF0dHJpYnV0ZS4gQXQgcGFnZSAxMiBvZiB0aGUgYWQ3NzgwIGRhdGFzaGVldCB0aGVyZQ0K\n"
- "aXMgYSBmb3JtdWxhIGZyb20gd2hpY2ggdGhlIG91dHB1dCBjb2RlIGNhbiBiZSBjYWxjdWxhdGVk\n"
- "Og0KQ29kZSA9IDJeKE4g4oiSIDEpDQrDlyBbKEFJTiDDlyBHYWluIC9WUkVGKSArIDFdLiBTbywg\n"
- "Ynkgc2V0dGluZyB0aGUgc2NhbGUgZnJvbSB1c2VyIHNwYWNlLCB0aGUNCmRyaXZlciBjYW4gY2Fs\n"
- "Y3VsYXRlIHRoZSBjb3JyZWN0IGdhaW4gYnkgdXNpbmcgdGhlIGZvcm11bGEgYWJvdmUuIEFsc28s\n"
- "IGl0DQp3b3VsZCBiZSB1c2VmdWwgdG8gaW50cm9kdWNlIHNjYWxlIGF2YWlsYWJsZS4NCkZ1cnRo\n"
- "ZXJtb3JlLCB0aGVyZSBpcyBhIG5ldw0KYWQ3MTI0IGFkYyBkcml2ZXIgd2hpY2ggZG9lcyB0aGlz\n"
- "IGV4YWN0IHRoaW5nLiBUYWtlIGEgbG9vayBoZXJlOsKgaHR0cHM6Ly9naQ0KdGh1Yi5jb20vYW5h\n"
- "bG9nZGV2aWNlc2luYy9saW51eC9ibG9iL21hc3Rlci9kcml2ZXJzL2lpby9hZGMvYWQ3MTI0LmMj\n"
- "TDMzNy4NCg0KPiArCQkJZ3Bpb2Rfc2V0X3ZhbHVlKHN0LT5nYWluX2dwaW8sIHZhbDIpOw0KPiAr\n"
- "CQlicmVhazsNCj4gKwkJY2FzZSBBRDc3ODBfRklMVEVSX0dQSU86DQoNClRoZSBhdHRyaWJ1dGUg\n"
- "dGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGZpbHRlciBncGlvIGlzDQpJSU9f\n"
- "Q0hBTl9JTkZPX1NBTVBfRlJFUS4gU28sIHdlIHNob3VsZCBoYXZlIDEwIEh6IGFuZCAxNi43IEh6\n"
- "IGF2YWlsYWJsZQ0Kc2FtcGxpbmcgZnJlcXVlbmNpZXMuIElmIGZyb20gdXNlciBzcGFjZSB0aGUg\n"
- "MTAgSHogc2FtcGxpbmcgZnJlcSBpcw0KcmVxdWVzdGVkLCB0aGVuIHdlIHNldCB0aGUgRklMVEVS\n"
- "IHBpbiBoaWdoLCB3aGlsZSBmb3IgMTYuNyBIeiB0aGUgRklMVEVSDQpwaW4gd2lsbCBiZSBsb3cu\n"
- "DQoNCj4gKwkJCWdwaW9kX3NldF92YWx1ZShzdC0+ZmlsdGVyX2dwaW8sIHZhbDIpOw0KPiArCQli\n"
- "cmVhazsNCj4gKwkJZGVmYXVsdDoNCj4gKwkJCXJldHVybiAtRUlOVkFMOw0KPiArCQl9DQo+ICsJ\n"
- "fQ0KPiArDQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gwqBzdGF0aWMgaW50IGFkNzc4MF9w\n"
- "b3N0cHJvY2Vzc19zYW1wbGUoc3RydWN0IGFkX3NpZ21hX2RlbHRhICpzaWdtYV9kZWx0YSwNCj4g\n"
- "wqAJCQkJwqDCoMKgwqDCoHVuc2lnbmVkIGludCByYXdfc2FtcGxlKQ0KPiDCoHsNCj4gwqAJc3Ry\n"
- "dWN0IGFkNzc4MF9zdGF0ZSAqc3QgPSBhZF9zaWdtYV9kZWx0YV90b19hZDc3ODAoc2lnbWFfZGVs\n"
- "dGEpOw0KPiDCoAljb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbyAqY2hpcF9pbmZvID0gc3Qt\n"
- "PmNoaXBfaW5mbzsNCj4gKwlpbnQgdmFsOw0KPiDCoA0KPiDCoAlpZiAoKHJhd19zYW1wbGUgJiBB\n"
- "RDc3ODBfRVJSKSB8fA0KPiDCoAnCoMKgwqDCoCgocmF3X3NhbXBsZSAmIGNoaXBfaW5mby0+cGF0\n"
- "dGVybl9tYXNrKSAhPSBjaGlwX2luZm8tDQo+ID5wYXR0ZXJuKSkNCj4gwqAJCXJldHVybiAtRUlP\n"
- "Ow0KPiDCoA0KPiDCoAlpZiAoY2hpcF9pbmZvLT5pc19hZDc3OHgpIHsNCj4gLQkJaWYgKHJhd19z\n"
- "YW1wbGUgJiBBRDc3ODBfR0FJTikNCj4gKwkJdmFsID0gcmF3X3NhbXBsZSAmIEFENzc4MF9HQUlO\n"
- "Ow0KPiArDQo+ICsJCWlmICh2YWwgIT0gZ3Bpb2RfZ2V0X3ZhbHVlKHN0LT5nYWluX2dwaW8pKQ0K\n"
- "PiArCQkJcmV0dXJuIC1FSU87DQo+ICsNCj4gKwkJaWYgKHZhbCkNCj4gwqAJCQlzdC0+Z2FpbiA9\n"
- "IDE7DQo+IMKgCQllbHNlDQo+IMKgCQkJc3QtPmdhaW4gPSAxMjg7DQo+IEBAIC0xNDEsMTggKzE3\n"
- "OSwyMCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGFkX3NpZ21hX2RlbHRhX2luZm8NCj4gYWQ3Nzgw\n"
- "X3NpZ21hX2RlbHRhX2luZm8gPSB7DQo+IMKgCS5oYXNfcmVnaXN0ZXJzID0gZmFsc2UsDQo+IMKg\n"
- "fTsNCj4gwqANCj4gLSNkZWZpbmUgQUQ3NzgwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4g\n"
- "KyNkZWZpbmUgQUQ3MTcwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4gwqAJQURfU0RfQ0hB\n"
- "Tk5FTF9OT19TQU1QX0ZSRVEoMSwgMCwgMCwgYml0cywgMzIsIHdvcmRzaXplIC0gYml0cykNCj4g\n"
- "KyNkZWZpbmUgQUQ3NzgwX0NIQU5ORUwoYml0cywgd29yZHNpemUpIFwNCj4gKwlBRF9TRF9DSEFO\n"
- "TkVMX0dBSU5fRklMVEVSKDEsIDAsIDAsIGJpdHMsIDMyLCB3b3Jkc2l6ZSAtIGJpdHMpDQo+IMKg\n"
- "DQo+IMKgc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc3ODBfY2hpcF9pbmZvIGFkNzc4MF9jaGlwX2lu\n"
- "Zm9fdGJsW10gPSB7DQo+IMKgCVtJRF9BRDcxNzBdID0gew0KPiAtCQkuY2hhbm5lbCA9IEFENzc4\n"
- "MF9DSEFOTkVMKDEyLCAyNCksDQo+ICsJCS5jaGFubmVsID0gQUQ3MTcwX0NIQU5ORUwoMTIsIDI0\n"
- "KSwNCj4gwqAJCS5wYXR0ZXJuID0gQUQ3MTcwX1BBVFRFUk4sDQo+IMKgCQkucGF0dGVybl9tYXNr\n"
- "ID0gQUQ3MTcwX1BBVFRFUk5fTUFTSywNCj4gwqAJCS5pc19hZDc3OHggPSBmYWxzZSwNCj4gwqAJ\n"
- "fSwNCj4gwqAJW0lEX0FENzE3MV0gPSB7DQo+IC0JCS5jaGFubmVsID0gQUQ3NzgwX0NIQU5ORUwo\n"
- "MTYsIDI0KSwNCj4gKwkJLmNoYW5uZWwgPSBBRDcxNzBfQ0hBTk5FTCgxNiwgMjQpLA0KPiDCoAkJ\n"
- "LnBhdHRlcm4gPSBBRDcxNzBfUEFUVEVSTiwNCj4gwqAJCS5wYXR0ZXJuX21hc2sgPSBBRDcxNzBf\n"
- "UEFUVEVSTl9NQVNLLA0KPiDCoAkJLmlzX2FkNzc4eCA9IGZhbHNlLA0KPiBAQCAtMTczLDYgKzIx\n"
- "Myw3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3NzgwX2NoaXBfaW5mbw0KPiBhZDc3ODBfY2hp\n"
- "cF9pbmZvX3RibFtdID0gew0KPiDCoA0KPiDCoHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8g\n"
- "YWQ3NzgwX2luZm8gPSB7DQo+IMKgCS5yZWFkX3JhdyA9IGFkNzc4MF9yZWFkX3JhdywNCj4gKwku\n"
- "d3JpdGVfcmF3ID0gYWQ3NzgwX3dyaXRlX3JhdywNCj4gwqB9Ow0KPiDCoA0KPiDCoHN0YXRpYyBp\n"
- "bnQgYWQ3NzgwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+IEBAIC0yMjIsNiArMjYz\n"
- "LDE4IEBAIHN0YXRpYyBpbnQgYWQ3NzgwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpDQo+\n"
- "IMKgCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOw0KPiDCoAl9DQo+IMKgDQo+ICsJaWYgKHN0LT5j\n"
- "aGlwX2luZm8tPmlzX2FkNzc4eCkgew0KPiArCQlzdC0+Z2Fpbl9ncGlvID0gZGV2bV9ncGlvZF9n\n"
- "ZXRfb3B0aW9uYWwoJnNwaS0+ZGV2LA0KPiArCQkJCQkJCSJnYWluIiwNCj4gKwkJCQkJCQlHUElP\n"
- "RF9PVVRfSElHSCk7DQo+ICsJCWlmIChJU19FUlIoc3QtPmdhaW5fZ3BpbykpIHsNCj4gKwkJCXJl\n"
- "dCA9IFBUUl9FUlIoc3QtPmdhaW5fZ3Bpbyk7DQo+ICsJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZh\n"
- "aWxlZCB0byByZXF1ZXN0IGdhaW4gR1BJTzoNCj4gJWRcbiIsDQo+ICsJCQkJcmV0KTsNCj4gKwkJ\n"
- "CWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gwqAJcmV0ID0g\n"
- "YWRfc2Rfc2V0dXBfYnVmZmVyX2FuZF90cmlnZ2VyKGluZGlvX2Rldik7DQo+IMKgCWlmIChyZXQp\n"
- "DQo+IMKgCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOw0KPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s\n"
- "aW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gYi9pbmNsdWRlL2xpbnV4L2lpby9hZGMv\n"
- "YWRfc2lnbWFfZGVsdGEuaA0KPiBpbmRleCA3MzBlYWQxYTQ2ZGYuLjZjYWRhYjZmZDVmZCAxMDA2\n"
- "NDQNCj4gLS0tIGEvaW5jbHVkZS9saW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gKysr\n"
- "IGIvaW5jbHVkZS9saW51eC9paW8vYWRjL2FkX3NpZ21hX2RlbHRhLmgNCj4gQEAgLTE3Myw2ICsx\n"
- "NzMsMTEgQEAgaW50IGFkX3NkX3ZhbGlkYXRlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYNCj4gKmlu\n"
- "ZGlvX2Rldiwgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsNCj4gwqAJX19BRF9TRF9DSEFOTkVM\n"
- "KF9zaSwgX2NoYW5uZWwsIC0xLCBfYWRkcmVzcywgX2JpdHMsIFwNCj4gwqAJCV9zdG9yYWdlYml0\n"
- "cywgX3NoaWZ0LCBOVUxMLCBJSU9fVk9MVEFHRSwgMCkNCj4gwqANCj4gKyNkZWZpbmUgQURfU0Rf\n"
- "Q0hBTk5FTF9HQUlOX0ZJTFRFUihfc2ksIF9jaGFubmVsLCBfYWRkcmVzcywgX2JpdHMsIFwNCj4g\n"
- "Kwlfc3RvcmFnZWJpdHMsIF9zaGlmdCkgXA0KPiArCV9fQURfU0RfQ0hBTk5FTChfc2ksIF9jaGFu\n"
- "bmVsLCAtMSwgX2FkZHJlc3MsIF9iaXRzLCBcDQo+ICsJCV9zdG9yYWdlYml0cywgX3NoaWZ0LCBO\n"
- "VUxMLCBJSU9fVk9MVEFHRSwNCj4gQklUKElJT19DSEFOX0lORk9fUkFXKSkNCj4gKw0KPiDCoCNk\n"
- "ZWZpbmUgQURfU0RfVEVNUF9DSEFOTkVMKF9zaSwgX2FkZHJlc3MsIF9iaXRzLCBfc3RvcmFnZWJp\n"
- "dHMsIF9zaGlmdCkgXA0KPiDCoAlfX0FEX1NEX0NIQU5ORUwoX3NpLCAwLCAtMSwgX2FkZHJlc3Ms\n"
- IF9iaXRzLCBcDQo+IMKgCQlfc3RvcmFnZWJpdHMsIF9zaGlmdCwgTlVMTCwgSUlPX1RFTVAsIFw=
+ "On Mi, 2018-11-21 at 16:04 -0200, Giuliano Belinassi wrote:\n"
+ "> Previously, the AD7780 driver only supported gpio for the 'powerdown'\n"
+ "> pin. This commit adds suppport for the 'gain' and 'filter' pin.\n"
+ "Hey,\n"
+ "\n"
+ "Comments inline.\n"
+ "> \n"
+ "> Signed-off-by: Giuliano Belinassi <giuliano.belinassi@usp.br>\n"
+ "> ---\n"
+ "> \302\240drivers/staging/iio/adc/ad7780.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240| 61 ++++++++++++++++++++++++--\n"
+ "> \302\240include/linux/iio/adc/ad_sigma_delta.h |\302\240\302\2405 +++\n"
+ "> \302\2402 files changed, 62 insertions(+), 4 deletions(-)\n"
+ "> \n"
+ "> diff --git a/drivers/staging/iio/adc/ad7780.c\n"
+ "> b/drivers/staging/iio/adc/ad7780.c\n"
+ "> index c4a85789c2db..69794f06dbcd 100644\n"
+ "> --- a/drivers/staging/iio/adc/ad7780.c\n"
+ "> +++ b/drivers/staging/iio/adc/ad7780.c\n"
+ "> @@ -39,6 +39,9 @@\n"
+ "> \302\240#define AD7170_PATTERN\t\t(AD7780_PAT0 | AD7170_PAT2)\n"
+ "> \302\240#define AD7170_PATTERN_MASK\t(AD7780_PAT0 | AD7780_PAT1 |\n"
+ "> AD7170_PAT2)\n"
+ "> \302\240\n"
+ "> +#define AD7780_GAIN_GPIO\t0\n"
+ "> +#define AD7780_FILTER_GPIO\t1\n"
+ "> +\n"
+ "> \302\240struct ad7780_chip_info {\n"
+ "> \302\240\tstruct iio_chan_spec\tchannel;\n"
+ "> \302\240\tunsigned int\t\tpattern_mask;\n"
+ "> @@ -50,6 +53,8 @@ struct ad7780_state {\n"
+ "> \302\240\tconst struct ad7780_chip_info\t*chip_info;\n"
+ "> \302\240\tstruct regulator\t\t*reg;\n"
+ "> \302\240\tstruct gpio_desc\t\t*powerdown_gpio;\n"
+ "> +\tstruct gpio_desc\t\t*gain_gpio;\n"
+ "> +\tstruct gpio_desc\t\t*filter_gpio;\n"
+ "> \302\240\tunsigned int\tgain;\n"
+ "> \302\240\n"
+ "> \302\240\tstruct ad_sigma_delta sd;\n"
+ "> @@ -115,18 +120,51 @@ static int ad7780_read_raw(struct iio_dev\n"
+ "> *indio_dev,\n"
+ "> \302\240\treturn -EINVAL;\n"
+ "> \302\240}\n"
+ "> \302\240\n"
+ "> +static int ad7780_write_raw(struct iio_dev *indio_dev,\n"
+ "> +\t\t\t\302\240\302\240\302\240\302\240struct iio_chan_spec const *chan,\n"
+ "> +\t\t\t\302\240\302\240\302\240\302\240int val,\n"
+ "> +\t\t\t\302\240\302\240\302\240\302\240int val2,\n"
+ "> +\t\t\t\302\240\302\240\302\240\302\240long m)\n"
+ "> +{\n"
+ "> +\tstruct ad7780_state *st = iio_priv(indio_dev);\n"
+ "> +\n"
+ "> +\tif (m != IIO_CHAN_INFO_RAW)\n"
+ "> +\t\treturn -EINVAL;\n"
+ "> +\n"
+ "> +\tif (st->chip_info->is_ad778x) {\n"
+ "> +\t\tswitch(val) {\n"
+ "> +\t\tcase AD7780_GAIN_GPIO:\n"
+ "\n"
+ "I think that instead of setting the gain directly, we should use\n"
+ "the\302\240IIO_CHAN_INFO_SCALE attribute. At page 12 of the ad7780 datasheet there\n"
+ "is a formula from which the output code can be calculated:\n"
+ "Code = 2^(N \342\210\222 1)\n"
+ "\303\227 [(AIN \303\227 Gain /VREF) + 1]. So, by setting the scale from user space, the\n"
+ "driver can calculate the correct gain by using the formula above. Also, it\n"
+ "would be useful to introduce scale available.\n"
+ "Furthermore, there is a new\n"
+ "ad7124 adc driver which does this exact thing. Take a look here:\302\240https://gi\n"
+ "thub.com/analogdevicesinc/linux/blob/master/drivers/iio/adc/ad7124.c#L337.\n"
+ "\n"
+ "> +\t\t\tgpiod_set_value(st->gain_gpio, val2);\n"
+ "> +\t\tbreak;\n"
+ "> +\t\tcase AD7780_FILTER_GPIO:\n"
+ "\n"
+ "The attribute that should be used to configure the filter gpio is\n"
+ "IIO_CHAN_INFO_SAMP_FREQ. So, we should have 10 Hz and 16.7 Hz available\n"
+ "sampling frequencies. If from user space the 10 Hz sampling freq is\n"
+ "requested, then we set the FILTER pin high, while for 16.7 Hz the FILTER\n"
+ "pin will be low.\n"
+ "\n"
+ "> +\t\t\tgpiod_set_value(st->filter_gpio, val2);\n"
+ "> +\t\tbreak;\n"
+ "> +\t\tdefault:\n"
+ "> +\t\t\treturn -EINVAL;\n"
+ "> +\t\t}\n"
+ "> +\t}\n"
+ "> +\n"
+ "> +\treturn 0;\n"
+ "> +}\n"
+ "> +\n"
+ "> \302\240static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta,\n"
+ "> \302\240\t\t\t\t\302\240\302\240\302\240\302\240\302\240unsigned int raw_sample)\n"
+ "> \302\240{\n"
+ "> \302\240\tstruct ad7780_state *st = ad_sigma_delta_to_ad7780(sigma_delta);\n"
+ "> \302\240\tconst struct ad7780_chip_info *chip_info = st->chip_info;\n"
+ "> +\tint val;\n"
+ "> \302\240\n"
+ "> \302\240\tif ((raw_sample & AD7780_ERR) ||\n"
+ "> \302\240\t\302\240\302\240\302\240\302\240((raw_sample & chip_info->pattern_mask) != chip_info-\n"
+ "> >pattern))\n"
+ "> \302\240\t\treturn -EIO;\n"
+ "> \302\240\n"
+ "> \302\240\tif (chip_info->is_ad778x) {\n"
+ "> -\t\tif (raw_sample & AD7780_GAIN)\n"
+ "> +\t\tval = raw_sample & AD7780_GAIN;\n"
+ "> +\n"
+ "> +\t\tif (val != gpiod_get_value(st->gain_gpio))\n"
+ "> +\t\t\treturn -EIO;\n"
+ "> +\n"
+ "> +\t\tif (val)\n"
+ "> \302\240\t\t\tst->gain = 1;\n"
+ "> \302\240\t\telse\n"
+ "> \302\240\t\t\tst->gain = 128;\n"
+ "> @@ -141,18 +179,20 @@ static const struct ad_sigma_delta_info\n"
+ "> ad7780_sigma_delta_info = {\n"
+ "> \302\240\t.has_registers = false,\n"
+ "> \302\240};\n"
+ "> \302\240\n"
+ "> -#define AD7780_CHANNEL(bits, wordsize) \\\n"
+ "> +#define AD7170_CHANNEL(bits, wordsize) \\\n"
+ "> \302\240\tAD_SD_CHANNEL_NO_SAMP_FREQ(1, 0, 0, bits, 32, wordsize - bits)\n"
+ "> +#define AD7780_CHANNEL(bits, wordsize) \\\n"
+ "> +\tAD_SD_CHANNEL_GAIN_FILTER(1, 0, 0, bits, 32, wordsize - bits)\n"
+ "> \302\240\n"
+ "> \302\240static const struct ad7780_chip_info ad7780_chip_info_tbl[] = {\n"
+ "> \302\240\t[ID_AD7170] = {\n"
+ "> -\t\t.channel = AD7780_CHANNEL(12, 24),\n"
+ "> +\t\t.channel = AD7170_CHANNEL(12, 24),\n"
+ "> \302\240\t\t.pattern = AD7170_PATTERN,\n"
+ "> \302\240\t\t.pattern_mask = AD7170_PATTERN_MASK,\n"
+ "> \302\240\t\t.is_ad778x = false,\n"
+ "> \302\240\t},\n"
+ "> \302\240\t[ID_AD7171] = {\n"
+ "> -\t\t.channel = AD7780_CHANNEL(16, 24),\n"
+ "> +\t\t.channel = AD7170_CHANNEL(16, 24),\n"
+ "> \302\240\t\t.pattern = AD7170_PATTERN,\n"
+ "> \302\240\t\t.pattern_mask = AD7170_PATTERN_MASK,\n"
+ "> \302\240\t\t.is_ad778x = false,\n"
+ "> @@ -173,6 +213,7 @@ static const struct ad7780_chip_info\n"
+ "> ad7780_chip_info_tbl[] = {\n"
+ "> \302\240\n"
+ "> \302\240static const struct iio_info ad7780_info = {\n"
+ "> \302\240\t.read_raw = ad7780_read_raw,\n"
+ "> +\t.write_raw = ad7780_write_raw,\n"
+ "> \302\240};\n"
+ "> \302\240\n"
+ "> \302\240static int ad7780_probe(struct spi_device *spi)\n"
+ "> @@ -222,6 +263,18 @@ static int ad7780_probe(struct spi_device *spi)\n"
+ "> \302\240\t\tgoto error_disable_reg;\n"
+ "> \302\240\t}\n"
+ "> \302\240\n"
+ "> +\tif (st->chip_info->is_ad778x) {\n"
+ "> +\t\tst->gain_gpio = devm_gpiod_get_optional(&spi->dev,\n"
+ "> +\t\t\t\t\t\t\t\"gain\",\n"
+ "> +\t\t\t\t\t\t\tGPIOD_OUT_HIGH);\n"
+ "> +\t\tif (IS_ERR(st->gain_gpio)) {\n"
+ "> +\t\t\tret = PTR_ERR(st->gain_gpio);\n"
+ "> +\t\t\tdev_err(&spi->dev, \"Failed to request gain GPIO:\n"
+ "> %d\\n\",\n"
+ "> +\t\t\t\tret);\n"
+ "> +\t\t\tgoto error_disable_reg;\n"
+ "> +\t\t}\n"
+ "> +\t}\n"
+ "> +\n"
+ "> \302\240\tret = ad_sd_setup_buffer_and_trigger(indio_dev);\n"
+ "> \302\240\tif (ret)\n"
+ "> \302\240\t\tgoto error_disable_reg;\n"
+ "> diff --git a/include/linux/iio/adc/ad_sigma_delta.h\n"
+ "> b/include/linux/iio/adc/ad_sigma_delta.h\n"
+ "> index 730ead1a46df..6cadab6fd5fd 100644\n"
+ "> --- a/include/linux/iio/adc/ad_sigma_delta.h\n"
+ "> +++ b/include/linux/iio/adc/ad_sigma_delta.h\n"
+ "> @@ -173,6 +173,11 @@ int ad_sd_validate_trigger(struct iio_dev\n"
+ "> *indio_dev, struct iio_trigger *trig);\n"
+ "> \302\240\t__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \\\n"
+ "> \302\240\t\t_storagebits, _shift, NULL, IIO_VOLTAGE, 0)\n"
+ "> \302\240\n"
+ "> +#define AD_SD_CHANNEL_GAIN_FILTER(_si, _channel, _address, _bits, \\\n"
+ "> +\t_storagebits, _shift) \\\n"
+ "> +\t__AD_SD_CHANNEL(_si, _channel, -1, _address, _bits, \\\n"
+ "> +\t\t_storagebits, _shift, NULL, IIO_VOLTAGE,\n"
+ "> BIT(IIO_CHAN_INFO_RAW))\n"
+ "> +\n"
+ "> \302\240#define AD_SD_TEMP_CHANNEL(_si, _address, _bits, _storagebits, _shift) \\\n"
+ "> \302\240\t__AD_SD_CHANNEL(_si, 0, -1, _address, _bits, \\\n"
+ "> \302\240\t\t_storagebits, _shift, NULL, IIO_TEMP, \\"
 
-162e0899dfa1f1f7fd0e9eff694338e22a50b9c3bc58fa131c13b1ad913f4ff6
+c9a021d6f0b6d4a1ce4f68d490aee1d048e0a4647fb7b23b33280caa5e51ca9a

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.