Re: [PATCH 2/2] ARM: imx: vf610-adc: Add temperature sensor support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>> Vybrid ADC module includes a temperature sensor which
>> is connected to channel number 26. This patch adds
>> support for the sensor. The raw value is read and the
>> temperature calculated in degree Celsius which is
>> returned using the IIO_CHAN_INFO_PROCESSED option.
>
> the description is wrong, should be 'milli degree Celsius'

Agreed.

>
> more comments inline
>
>> Signed-off-by: Sanchayan Maity <maitysanchayan@xxxxxxxxx>
>> ---
>>  drivers/iio/adc/vf610_adc.c |   34 +++++++++++++++++++++++++++++++---
>>  1 file changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
>> index 44799eb5..aa682aa 100644
>> --- a/drivers/iio/adc/vf610_adc.c
>> +++ b/drivers/iio/adc/vf610_adc.c
>> @@ -91,7 +91,7 @@
>>  #define VF610_ADC_CAL                        0x80
>>
>>  /* Other field define */
>> -#define VF610_ADC_ADCHC(x)           ((x) & 0xF)
>> +#define VF610_ADC_ADCHC(x)           ((x) & 0x1F)
>>  #define VF610_ADC_AIEN                       (0x1 << 7)
>>  #define VF610_ADC_CONV_DISABLE               0x1F
>>  #define VF610_ADC_HS_COCO0           0x1
>> @@ -137,7 +137,7 @@ struct vf610_adc {
>>       struct clk *clk;
>>
>>       u32 vref_uv;
>> -     u32 value;
>> +     int value;
>>       struct regulator *vref;
>>       struct vf610_adc_feature adc_feature;
>>
>> @@ -153,6 +153,15 @@ struct vf610_adc {
>>                               BIT(IIO_CHAN_INFO_SAMP_FREQ),   \
>>  }
>>
>> +#define VF610_ADC_TEMPERATURE_CHAN(_idx, _chan_type) {               \
> there is just one temperature channel, so not indexed
>> +     .type = (_chan_type),                                   \
>> +     .indexed = 1,                                                   \
>> +     .channel = (_idx),                                              \
>> +     .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED),             \
>> +     .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |  \
>> +                             BIT(IIO_CHAN_INFO_SAMP_FREQ),   \
>
> no need for SCALE since temperature it is PROCESSED;
> maybe it would be better to expose RAW + offset/scale

I believe it would be a better option to return the processed
temperature value through sysfs for the user. I will remove the
info scale for this.

>
> I don't see how the sampling freq. can be separately controlled for the
> temperature channel

Yes, independent sampling frequency control is not available. Will
purge this as well.

>
>> +}
>> +
>>  static const struct iio_chan_spec vf610_adc_iio_channels[] = {
>>       VF610_ADC_CHAN(0, IIO_VOLTAGE),
>>       VF610_ADC_CHAN(1, IIO_VOLTAGE),
>> @@ -170,6 +179,7 @@ static const struct iio_chan_spec vf610_adc_iio_channels[] = {
>>       VF610_ADC_CHAN(13, IIO_VOLTAGE),
>>       VF610_ADC_CHAN(14, IIO_VOLTAGE),
>>       VF610_ADC_CHAN(15, IIO_VOLTAGE),
>> +     VF610_ADC_TEMPERATURE_CHAN(26, IIO_TEMP),
>>       /* sentinel */
>>  };
>>
>> @@ -451,6 +461,7 @@ static int vf610_read_raw(struct iio_dev *indio_dev,
>>
>>       switch (mask) {
>>       case IIO_CHAN_INFO_RAW:
>> +     case IIO_CHAN_INFO_PROCESSED:
>>               mutex_lock(&indio_dev->mlock);
>>               reinit_completion(&info->completion);
>>
>> @@ -468,7 +479,24 @@ static int vf610_read_raw(struct iio_dev *indio_dev,
>>                       return ret;
>>               }
>>
>> -             *val = info->value;
>> +             switch (chan->type)     {
>> +             case IIO_VOLTAGE:
>> +                     *val = info->value;
>> +                     break;
>> +             case IIO_TEMP:
>> +                     /*
>> +                     * Calculate in degree celsius times 1000
>> +                     * Using sensor slope of 1.84 mV/°C and
>> +                     * V at 25°C of 696mv
>> +                     */
>> +                     info->value -= 864;
>> +                     info->value = 25000 - info->value * 1000000 / 1840;
>
> why write info->value?
> I'd leave value u32 and only read value here

The temperature sensor in VF61 module has a negative temperature
co-efficient. Using a signed integer allowed me to preserve the sign,
which was required for the correct calculation of temperature. Will
leave info->value at u32 and only do the read as suggested.

>
> *val = 25000 - (info->value - 864) * 1000000 / 1840;
>
>> +                     *val = info->value;
>> +                     break;
>> +             default:
>
> this should return an error

Ok.

>
>> +                     break;
>> +             }
>> +
>>               mutex_unlock(&indio_dev->mlock);
>>               return IIO_VAL_INT;
>>
>>
>
> --
>
> Peter Meerwald
> +43-664-2444418 (mobile)
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux