@@ -870,6 +870,27 @@ static const struct iio_chan_spec ad4170_channel_template = {
870
870
},
871
871
};
872
872
873
+ static const struct iio_chan_spec ad4170_temp_channel_template = {
874
+ .type = IIO_TEMP ,
875
+ .indexed = 0 ,
876
+ .channel = 17 ,
877
+ .channel2 = 17 ,
878
+ .info_mask_separate = BIT (IIO_CHAN_INFO_RAW ) |
879
+ BIT (IIO_CHAN_INFO_SCALE ) |
880
+ BIT (IIO_CHAN_INFO_OFFSET ) |
881
+ BIT (IIO_CHAN_INFO_CALIBSCALE ) |
882
+ BIT (IIO_CHAN_INFO_CALIBBIAS ) |
883
+ BIT (IIO_CHAN_INFO_SAMP_FREQ ),
884
+ .info_mask_separate_available = BIT (IIO_CHAN_INFO_SAMP_FREQ ),
885
+ .scan_type = {
886
+ .sign = 's' ,
887
+ .realbits = 24 ,
888
+ .storagebits = 32 ,
889
+ .shift = 8 ,
890
+ .endianness = IIO_BE ,
891
+ },
892
+ };
893
+
873
894
/*
874
895
* Receives the number of a multiplexed AD4170 input (ain_n), and stores the
875
896
* voltage (in µV) of the specified input into ain_voltage. If the input number
@@ -1172,9 +1193,27 @@ static int ad4170_read_raw(struct iio_dev *indio_dev,
1172
1193
return ret ;
1173
1194
case IIO_CHAN_INFO_SCALE :
1174
1195
pga = FIELD_GET (AD4170_AFE_PGA_GAIN_MSK , setup -> afe );
1175
- * val = chan_info -> scale_tbl [pga ][0 ];
1176
- * val2 = chan_info -> scale_tbl [pga ][1 ];
1177
- return IIO_VAL_INT_PLUS_NANO ;
1196
+ switch (chan -> type ) {
1197
+ case IIO_VOLTAGE :
1198
+ * val = chan_info -> scale_tbl [pga ][0 ];
1199
+ * val2 = chan_info -> scale_tbl [pga ][1 ];
1200
+ return IIO_VAL_INT_PLUS_NANO ;
1201
+
1202
+ case IIO_TEMP :
1203
+ /*
1204
+ * The scale_tbl converts output codes to mV units so
1205
+ * multiply by MILLI to make the factor convert to µV.
1206
+ * Then, apply the temperature sensor change sensitivity
1207
+ * of 477 μV/K. Finally, multiply the result by MILLI
1208
+ * again to comply with milli degrees Celsius IIO ABI.
1209
+ */
1210
+ * val = 0 ;
1211
+ * val2 = DIV_ROUND_CLOSEST (chan_info -> scale_tbl [pga ][1 ] * MILLI , 477 ) *
1212
+ MILLI ;
1213
+ return IIO_VAL_INT_PLUS_NANO ;
1214
+ default :
1215
+ return - EINVAL ;
1216
+ }
1178
1217
case IIO_CHAN_INFO_OFFSET :
1179
1218
pga = FIELD_GET (AD4170_AFE_PGA_GAIN_MSK , setup -> afe );
1180
1219
* val = chan_info -> offset_tbl [pga ];
@@ -1842,13 +1881,40 @@ static int ad4170_parse_channels(struct iio_dev *indio_dev)
1842
1881
if (num_channels > AD4170_MAX_CHANNELS )
1843
1882
return dev_err_probe (dev , - EINVAL , "Too many channels\n" );
1844
1883
1884
+ /* Add one for temperature */
1885
+ num_channels = min (num_channels + 1 , AD4170_MAX_CHANNELS );
1886
+
1845
1887
chan_num = 0 ;
1846
1888
device_for_each_child_node_scoped (dev , child ) {
1847
1889
ret = ad4170_parse_channel_node (indio_dev , child , chan_num ++ );
1848
1890
if (ret )
1849
1891
return ret ;
1850
1892
}
1851
1893
1894
+ /*
1895
+ * Add internal temperature sensor channel if the maximum number of
1896
+ * channels has not been reached.
1897
+ */
1898
+ if (num_channels < AD4170_MAX_CHANNELS ) {
1899
+ struct ad4170_setup * setup = & st -> chan_infos [chan_num ].setup ;
1900
+
1901
+ st -> chans [chan_num ] = ad4170_temp_channel_template ;
1902
+ st -> chans [chan_num ].address = chan_num ;
1903
+ st -> chans [chan_num ].scan_index = chan_num ;
1904
+
1905
+ st -> chan_infos [chan_num ].setup_num = AD4170_INVALID_SETUP ;
1906
+ st -> chan_infos [chan_num ].initialized = true;
1907
+
1908
+ setup -> afe |= FIELD_PREP (AD4170_AFE_REF_SELECT_MSK ,
1909
+ AD4170_REF_AVDD );
1910
+
1911
+ ret = ad4170_get_input_range (st , & st -> chans [chan_num ], chan_num ,
1912
+ AD4170_REF_AVDD );
1913
+ if (ret < 0 )
1914
+ return dev_err_probe (dev , ret , "Invalid input config\n" );
1915
+
1916
+ st -> chan_infos [chan_num ].input_range_uv = ret ;
1917
+ }
1852
1918
indio_dev -> num_channels = num_channels ;
1853
1919
indio_dev -> channels = st -> chans ;
1854
1920
0 commit comments