[PATCH v2 3/3] staging: iio: light: isl29018: Use standard sysfs attributes for range and scale

Roberta Dobrescu roberta.dobrescu at gmail.com
Fri Feb 20 14:56:24 EET 2015


On 20.02.2015 14:32, Daniel Baluta wrote:
>
>
> On 02/19/2015 04:44 PM, Roberta Dobrescu wrote:
>> This patch refactors the isl29018 driver code in order to use standard
>> sysfs attributes for range and scale.
>>
>> ISL29018 light sensor uses four ranges and four ADC's resolutions
>> which influence the calculated lux.
>>
>> This patch eliminates the resolution (adc bits) and introduces scale.
>> Each range (1k, 4k, 16k or 64k) has a corresponding set of 4 scales
>> (for 16, 12, 8 or 4 bits). Both range and scale can be changed by the
>> user according to the corresponding set of values (exposed by the
>> attributes
>> in_illuminance_range_available and in_illuminance_scale_available).
>>
>> When the range is changed, the set of available scales is set
>> accordingly and
>> by default the scale used is the one for 16 adc bits. Scale can be
>> changed
>> anytime with one of the available values.
>>
>
> We should mention here that this patch renames lux_scale to calibscale
> and lux_uscale to ucalibscale.
>
> Perhaps, we could do the renaming in a separate patch preceding this one.

Maybe it's more clear like that. I'll do another patch for the renaming.

>>
>> -static int isl29018_set_range(struct isl29018_chip *chip, unsigned
>> long range,
>> -        unsigned int *new_range)
>> +/* when range is set, resolution is set by default at 16 bits */
>> +static int isl29018_set_range(struct isl29018_chip *chip, unsigned
>> long range)
>>   {
>> -    static const unsigned long supp_ranges[] = {1000, 4000, 16000,
>> 64000};
>> -    int i;
>> -
>> -    for (i = 0; i < ARRAY_SIZE(supp_ranges); ++i) {
>> -        if (range <= supp_ranges[i]) {
>> -            *new_range = (unsigned int)supp_ranges[i];
>> +    int i, ret;
>> +    unsigned long new_range;
>> +    struct isl29018_scale new_scale;
>> +
>> +    for (i = 0; i < ARRAY_SIZE(isl29018_ranges); ++i) {
>> +        if (range == isl29018_ranges[i]) {
>> +            new_range = i;
>> +            new_scale = isl29018_scales[i][0];
>>               break;
>>           }
>>       }
>>
>> -    if (i >= ARRAY_SIZE(supp_ranges))
>> +    if (i >= ARRAY_SIZE(isl29018_ranges))
>>           return -EINVAL;
>>
>> -    return regmap_update_bits(chip->regmap, ISL29018_REG_ADD_COMMANDII,
>> -            COMMANDII_RANGE_MASK, i << COMMANDII_RANGE_SHIFT);
>> +    ret = regmap_update_bits(chip->regmap, ISL29018_REG_ADD_COMMANDII,
>> +                             COMMANDII_RESOLUTION_MASK |
>> COMMANDII_RANGE_MASK,
>> +                             i << COMMANDII_RANGE_SHIFT);
>> +    if (ret < 0)
>> +        return ret;
>> +
>> +    chip->range = new_range;
>> +    chip->scale = new_scale;
>> +
>> +    return 0;
>>   }
>>
>> -static int isl29018_set_resolution(struct isl29018_chip *chip,
>> -            unsigned long adcbit, unsigned int *conf_adc_bit)
>> +static int isl29018_set_scale(struct isl29018_chip *chip, int scale,
>> int uscale)
>>   {
>> -    static const unsigned long supp_adcbit[] = {16, 12, 8, 4};
>> -    int i;
>> +    int i, ret;
>> +    struct isl29018_scale new_scale;
>>
>> -    for (i = 0; i < ARRAY_SIZE(supp_adcbit); ++i) {
>> -        if (adcbit >= supp_adcbit[i]) {
>> -            *conf_adc_bit = (unsigned int)supp_adcbit[i];
>> +    for (i = 0; i < ARRAY_SIZE(isl29018_scales[chip->range]); ++i) {
>> +        if (scale == isl29018_scales[chip->range][i].scale &&
>> +            uscale == isl29018_scales[chip->range][i].uscale) {
>> +            new_scale = isl29018_scales[chip->range][i];
>>               break;
>>           }
>>       }
>>
>> -    if (i >= ARRAY_SIZE(supp_adcbit))
>> +    if (i >= ARRAY_SIZE(isl29018_scales[chip->range]))
>>           return -EINVAL;
>>
>> -    return regmap_update_bits(chip->regmap, ISL29018_REG_ADD_COMMANDII,
>> -            COMMANDII_RESOLUTION_MASK,
>> -            i << COMMANDII_RESOLUTION_SHIFT);
>> +    ret = regmap_update_bits(chip->regmap, ISL29018_REG_ADD_COMMANDII,
>> +                             COMMANDII_RESOLUTION_MASK,
>> +                             i << COMMANDII_RESOLUTION_SHIFT);
>> +    if (ret < 0)
>> +        return ret;
>> +
>> +    chip->scale = new_scale;
>> +
>> +    return 0;
>>   }
>>
>
>>
>> @@ -321,10 +386,23 @@ static int isl29018_read_raw(struct iio_dev
>> *indio_dev,
>>           if (!ret)
>>               ret = IIO_VAL_INT;
>>           break;
>> +    case IIO_CHAN_INFO_RANGE:
>> +        if (chan->type == IIO_LIGHT) {
>> +            *val = 1000 << (chip->range * 2);
> I don't understand this shouldn't this be:
> *val = isl29018_ranges [chip->range] ?

You're right. It forgot to change it.

>> +            ret = IIO_VAL_INT;
>> +        }
>> +        break;
>
> <snip>
>
> 22,8 +509,6 @@ enum {
>>   static int isl29018_chip_init(struct isl29018_chip *chip)
>>   {
>>       int status;
>> -    unsigned int new_adc_bit;
>> -    unsigned int new_range;
>>
>>       if (chip->type == isl29035) {
>>           status = isl29035_detect(chip);
>> @@ -472,15 +557,12 @@ static int isl29018_chip_init(struct
>> isl29018_chip *chip)
>>       usleep_range(1000, 2000);    /* per data sheet, page 10 */
>>
>>       /* set defaults */
>> -    status = isl29018_set_range(chip, chip->range, &new_range);
>> +    status = isl29018_set_range(chip, 1000 << (chip->range * 2));
>
> The same here.
>
>
> thanks,
> Daniel.



More information about the firefly mailing list