staging: iio: ad7780: pattern generation and gain update
Subsystems (4)
cover staging: iio: ad7780: pattern generation and gain update
This series of patches fixes a bug in ad717x chips where the PAT2 bit was wrongly read as a GAIN bit. It also refactors the pattern_mask generation with the PAT bits.
Giuliano Belinassi (3):
staging: iio: ad7780: Add is_ad778x flag chip info
staging: iio: ad7780: check if ad778x before gain update
staging: iio: ad7780: generates pattern_mask from PAT bits
drivers/staging/iio/adc/ad7780.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
Signature · 1 line
2.19.1
PATCH 1/3 staging: iio: ad7780: Add is_ad778x flag chip info
This patch allows further checking of whatever the chip is (ad778x or ad717x).
--- drivers/staging/iio/adc/ad7780.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/staging/iio/adc/ad7780.c +5 -0
@@ -35,6 +35,7 @@ struct ad7780_chip_info {struct iio_chan_spec channel;unsigned int pattern_mask;unsigned int pattern; +u8 is_ad778x; };struct ad7780_state {
@@ -135,21 +136,25 @@ static const struct ad7780_chip_info ad7780_chip_info_tbl[] = { .channel = AD7780_CHANNEL(12, 24), .pattern = 0x5, .pattern_mask = 0x7, + .is_ad778x = false, }, [ID_AD7171] = { .channel = AD7780_CHANNEL(16, 24), .pattern = 0x5, .pattern_mask = 0x7, + .is_ad778x = false, }, [ID_AD7780] = { .channel = AD7780_CHANNEL(24, 32), .pattern = 0x1, .pattern_mask = 0x3, + .is_ad778x = true, }, [ID_AD7781] = { .channel = AD7780_CHANNEL(20, 32), .pattern = 0x1, .pattern_mask = 0x3, + .is_ad778x = true, }, };
Signature · 1 line
2.19.1
Re: [PATCH 1/3] staging: iio: ad7780: Add is_ad778x flag chip info
T24gV2VkLCAyMDE4LTExLTA3IGF0IDE2OjQ5IC0wMjAwLCBHaXVsaWFubyBCZWxpbmFzc2kgd3Jv dGU6DQo+IFRoaXMgcGF0Y2ggYWxsb3dzIGZ1cnRoZXIgY2hlY2tpbmcgb2Ygd2hhdGV2ZXIgdGhl IGNoaXAgaXMgKGFkNzc4eCBvcg0KPiBhZDcxN3gpLg0KDQpIZXksDQoNClRoZSBwYXRjaCBsb29r cyBnb29kIG92ZXJhbGwuDQpJIG9ubHkgaGF2ZSBvbmUgbml0cGljayBmb3IgdGhpcyBwYXRjaC4g U2VlIGlubGluZS4NCg0KQW5kIHlvdSBjYW4gc3F1YXNoIHRoaXMgcGF0Y2ggd2l0aCBwYXRjaCBg W1BBVENIIDIvM10gc3RhZ2luZzogaWlvOiBhZDc3ODA6DQpjaGVjayBpZiBhZDc3OHggYmVmb3Jl IGdhaW4gdXBkYXRlYC4NCkluIGZhY3QsIHRoZSB0aXRsZSBvZiB0aGUgc3F1YXNoZWQgcGF0Y2gg Y2FuIGp1c3QgYmUgYHN0YWdpbmc6IGlpbzogYWQ3NzgwOg0KY2hlY2sgaWYgYWQ3Nzh4IGJlZm9y ZSBnYWluIHVwZGF0ZWAgOyBiZWNhdXNlIHRoZSBjb2RlIGluIHRoaXMgcGF0Y2gNCmltcGxpZXMg dGhhdCBpdCdzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGRldmljZSBpcyBhbiBhZDc3OHggY2hpcC4N Cg0KVGhpcyBwYXRjaCBkb2Vzbid0IGhhdmUgbXVjaCB2YWx1ZSBvbiBpdCdzIG93biB3aXRob3V0 IHRoZSAybmQgcGF0Y2gsIGFuZA0KeW91IGNhbiBkbyB0aGVtIGluIGEgc2luZ2xlIGdvLg0KDQov Kg0KICogTm90ZTogeWVzLCBJIGtub3cgdGhhdCB0aGVzZSBzdWJ0bGUgc2VtYW50aWNzIGJldHdl ZW4gcGF0Y2ggDQogKiBzcGxpdHRpbmcgJiBzcXVhc2hpbmcgY2FuIGJlIGEgYml0IGFubm95aW5n IDsgSSBkb24ndCBoYXZlIGEgZ2VuZXJhbA0KICogcmVjb21tZW5kYXRpb24gZm9yIHRoZW0sIG90 aGVyIHRoYW4ganVzdCB0byBrZWVwIHNlbmRpbmcgcGF0Y2hlcw0KICovDQoNClRoYW5rcw0KQWxl eA0KDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBHaXVsaWFubyBCZWxpbmFzc2kgPGdpdWxpYW5vLmJl bGluYXNzaUB1c3AuYnI+DQo+IC0tLQ0KPiAgZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Nzgw LmMgfCA1ICsrKysrDQo+ICAxIGZpbGUgY2hhbmdlZCwgNSBpbnNlcnRpb25zKCspDQo+IA0KPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMNCj4gYi9kcml2ZXJz L3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYw0KPiBpbmRleCA5MWUwMTZkNTM0ZWQuLjZlNTFiZmRi MDc2YSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMNCj4g KysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMNCj4gQEAgLTM1LDYgKzM1LDcg QEAgc3RydWN0IGFkNzc4MF9jaGlwX2luZm8gew0KPiAgCXN0cnVjdCBpaW9fY2hhbl9zcGVjCWNo YW5uZWw7DQo+ICAJdW5zaWduZWQgaW50CQlwYXR0ZXJuX21hc2s7DQo+ICAJdW5zaWduZWQgaW50 CQlwYXR0ZXJuOw0KPiArCXU4CQkJaXNfYWQ3Nzh4Ow0KWW91IGNvdWxkIG1ha2UgdGhpcyBgYm9v bGAgdHlwZSBzaW5jZSB5b3UgYXJlIGFzc2lnbmluZyBgdHJ1ZS9mYWxzZWAgdmFsdWVzDQp0byB0 aGlzIGZpZWxkLiBJdCdzIGdlbmVyYWxseSBnb29kIHRvIGJlIGNvbnNpc3RlbnQgYmV0d2VlbiB0 eXBlIG5hbWVzICYNCnR5cGUgdmFsdWVzIHdoZW4gdXNpbmcgdGhlbSBbZXZlbiB0aG91Z2ggaW4g QywgdGhlc2UgYXJlIHByZXR0eSBtdWNoIHRoZQ0Kc2FtZV0uDQoNCj4gIH07DQo+ICANCj4gIHN0 cnVjdCBhZDc3ODBfc3RhdGUgew0KPiBAQCAtMTM1LDIxICsxMzYsMjUgQEAgc3RhdGljIGNvbnN0 IHN0cnVjdCBhZDc3ODBfY2hpcF9pbmZvDQo+IGFkNzc4MF9jaGlwX2luZm9fdGJsW10gPSB7DQo+ ICAJCS5jaGFubmVsID0gQUQ3NzgwX0NIQU5ORUwoMTIsIDI0KSwNCj4gIAkJLnBhdHRlcm4gPSAw eDUsDQo+ICAJCS5wYXR0ZXJuX21hc2sgPSAweDcsDQo+ICsJCS5pc19hZDc3OHggPSBmYWxzZSwN Cj4gIAl9LA0KPiAgCVtJRF9BRDcxNzFdID0gew0KPiAgCQkuY2hhbm5lbCA9IEFENzc4MF9DSEFO TkVMKDE2LCAyNCksDQo+ICAJCS5wYXR0ZXJuID0gMHg1LA0KPiAgCQkucGF0dGVybl9tYXNrID0g MHg3LA0KPiArCQkuaXNfYWQ3Nzh4ID0gZmFsc2UsDQo+ICAJfSwNCj4gIAlbSURfQUQ3NzgwXSA9 IHsNCj4gIAkJLmNoYW5uZWwgPSBBRDc3ODBfQ0hBTk5FTCgyNCwgMzIpLA0KPiAgCQkucGF0dGVy biA9IDB4MSwNCj4gIAkJLnBhdHRlcm5fbWFzayA9IDB4MywNCj4gKwkJLmlzX2FkNzc4eCA9IHRy dWUsDQo+ICAJfSwNCj4gIAlbSURfQUQ3NzgxXSA9IHsNCj4gIAkJLmNoYW5uZWwgPSBBRDc3ODBf Q0hBTk5FTCgyMCwgMzIpLA0KPiAgCQkucGF0dGVybiA9IDB4MSwNCj4gIAkJLnBhdHRlcm5fbWFz ayA9IDB4MywNCj4gKwkJLmlzX2FkNzc4eCA9IHRydWUsDQo+ICAJfSwNCj4gIH07DQo+ICANCg==
PATCH 2/3 staging: iio: ad7780: check if ad778x before gain update
In reply to Giuliano BelinassiOnly the ad778x have the 'gain' status bit. Check it before updating.
--- drivers/staging/iio/adc/ad7780.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/staging/iio/adc/ad7780.c +6 -4
@@ -114,10 +114,12 @@ static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta, ((raw_sample & chip_info->pattern_mask) != chip_info->pattern)) return -EIO; -if (raw_sample &AD7780_GAIN ) - st->gain =1 ; -else - st->gain =128 ; +if (chip_info->is_ad778x) { +if (raw_sample &AD7780_GAIN ) + st->gain =1 ; +else + st->gain =128 ; + }return 0 ; }
Signature · 1 line
2.19.1
Re: [PATCH 2/3] staging: iio: ad7780: check if ad778x before gain update
Quoted 2 lines · Giuliano Belinassi
Only the ad778x have the 'gain' status bit. Check it before updating.
This looks good.
The only note is that it can be squashed with the 1st patch (which I noted on the 1st patch).
Quoted 28 lines
Signed-off-by Giuliano Belinassi <[email protected]>--- drivers/staging/iio/adc/ad7780.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)drivers/staging/iio/adc/ad7780.c +6
-4@@ -114,10 +114,12 @@ static int ad7780_postprocess_sample(struct ad_sigma_delta *sigma_delta, ((raw_sample & chip_info->pattern_mask) != chip_info->pattern))return -EIO ; -if (raw_sample &AD7780_GAIN ) - st->gain =1 ; -else - st->gain =128 ; +if (chip_info->is_ad778x) { +if (raw_sample &AD7780_GAIN ) + st->gain =1 ; +else + st->gain =128 ; + }return 0 ;}
PATCH 3/3 staging: iio: ad7780: generates pattern_mask from PAT bits
In reply to Giuliano BelinassiPreviously, all pattern_masks in the chip_info table were hardcoded. Now they are generated using the PAT macros, as described in the datasheets.
--- drivers/staging/iio/adc/ad7780.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/staging/iio/adc/ad7780.c +6 -4
@@ -31,6 +31,8 @@#define AD7780_PAT1 BIT(1)#define AD7780_PAT0 BIT(0) +#define AD7170_PAT2 BIT(2) +struct ad7780_chip_info {struct iio_chan_spec channel;unsigned int pattern_mask;
@@ -137,25 +139,25 @@ static const struct ad7780_chip_info ad7780_chip_info_tbl[] = { [ID_AD7170 ] = { .channel =AD7780_CHANNEL (12 ,24 ), .pattern =0x5 , - .pattern_mask =0x7 , + .pattern_mask =AD7780_PAT0 |AD7780_PAT1 |AD7170_PAT2 , .is_ad778x = false, }, [ID_AD7171 ] = { .channel =AD7780_CHANNEL (16 ,24 ), .pattern =0x5 , - .pattern_mask =0x7 , + .pattern_mask =AD7780_PAT0 |AD7780_PAT1 |AD7170_PAT2 , .is_ad778x = false, }, [ID_AD7780 ] = { .channel =AD7780_CHANNEL (24 ,32 ), .pattern =0x1 , - .pattern_mask =0x3 , + .pattern_mask =AD7780_PAT0 |AD7780_PAT1 , .is_ad778x = true, }, [ID_AD7781 ] = { .channel =AD7780_CHANNEL (20 ,32 ), .pattern =0x1 , - .pattern_mask =0x3 , + .pattern_mask =AD7780_PAT0 |AD7780_PAT1 , .is_ad778x = true, }, };
Signature · 1 line
2.19.1
Re: [PATCH 3/3] staging: iio: ad7780: generates pattern_mask from PAT bits
Quoted 4 lines · Giuliano Belinassi
Previously, all
pattern_masksin thechip_infotable were hardcoded. Now they
are generated using the PAT macros, as described in the datasheets.
I like this change :)
I only have nitpicks.
See inline.
Quoted 20 lines
Signed-off-by Giuliano Belinassi <[email protected]>--- drivers/staging/iio/adc/ad7780.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)drivers/staging/iio/adc/ad7780.c +2
-0@@ -31,6 +31,8 @@#define AD7780_PAT1 BIT(1)#define AD7780_PAT0 BIT(0) +#define AD7170_PAT2 BIT(2) +struct ad7780_chip_info {struct iio_chan_spec channel;unsigned int pattern_mask;
drivers/staging/iio/adc/ad7780.c static const struct ad7780_chip_info · line 143
Quoted 6 lines
drivers/staging/iio/adc/ad7780.c +1
-1@@ -137,25 +139,25 @@ static const struct ad7780_chip_info ad7780_chip_info_tbl[] = { [ID_AD7170] = { .channel = AD7780_CHANNEL(12, 24), .pattern = 0x5, - .pattern_mask = 0x7, + .pattern_mask = AD7780_PAT0 | AD7780_PAT1 | AD7170_PAT2,
If you are updating these pattern masks, you should update the default patterns as well with the macros to be consistent.
And to be a bit more compact, you could define:
#define AD7170_PATTERN_MASK (AD7780_PAT0 | AD7780_PAT1 | AD7170_PAT2)
#d
efine AD7780_PATTERN_MASK (AD7780_PAT0 | AD7780_PAT1)
#define AD7170_PATTERN (AD7780_PAT1 | AD7170_PAT2)
#define AD7780_PATTERN (AD7780_PAT0)
Then you can assign AD7170_PATTERN[_MASK] to AD7170/AD7171 & AD7780_PATTERN[_MASK] to AD7780/AD7781.
Quoted 24 lines
drivers/staging/iio/adc/ad7780.c +3
-3.is_ad778x = false, }, [ID_AD7171] = { .channel = AD7780_CHANNEL(16, 24), .pattern = 0x5, - .pattern_mask = 0x7, + .pattern_mask = AD7780_PAT0 | AD7780_PAT1 | AD7170_PAT2, .is_ad778x = false, }, [ID_AD7780] = { .channel = AD7780_CHANNEL(24, 32), .pattern = 0x1, - .pattern_mask = 0x3, + .pattern_mask = AD7780_PAT0 | AD7780_PAT1, .is_ad778x = true, }, [ID_AD7781] = { .channel = AD7780_CHANNEL(20, 32), .pattern = 0x1, - .pattern_mask = 0x3, + .pattern_mask = AD7780_PAT0 | AD7780_PAT1, .is_ad778x = true, },};