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.