@@ -222,16 +222,21 @@ static int sun50i_h6_ths_calibrate(struct ths_device *tmdev,
222
222
struct device * dev = tmdev -> dev ;
223
223
int i , ft_temp ;
224
224
225
- if (!caldata [0 ] || callen < 2 + 2 * tmdev -> chip -> sensor_num )
225
+ if (!caldata [0 ])
226
226
return - EINVAL ;
227
227
228
228
/*
229
229
* efuse layout:
230
230
*
231
- * 0 11 16 32
232
- * +-------+-------+-------+
233
- * |temp| |sensor0|sensor1|
234
- * +-------+-------+-------+
231
+ * 0 11 16 27 32 43 48 57
232
+ * +----------+-----------+-----------+-----------+
233
+ * | temp | |sensor0| |sensor1| |sensor2| |
234
+ * +----------+-----------+-----------+-----------+
235
+ * ^ ^ ^
236
+ * | | |
237
+ * | | sensor3[11:8]
238
+ * | sensor3[7:4]
239
+ * sensor3[3:0]
235
240
*
236
241
* The calibration data on the H6 is the ambient temperature and
237
242
* sensor values that are filled during the factory test stage.
@@ -244,9 +249,16 @@ static int sun50i_h6_ths_calibrate(struct ths_device *tmdev,
244
249
ft_temp = (caldata [0 ] & FT_TEMP_MASK ) * 100 ;
245
250
246
251
for (i = 0 ; i < tmdev -> chip -> sensor_num ; i ++ ) {
247
- int sensor_reg = caldata [i + 1 ] & TEMP_CALIB_MASK ;
248
- int cdata , offset ;
249
- int sensor_temp = tmdev -> chip -> calc_temp (tmdev , i , sensor_reg );
252
+ int sensor_reg , sensor_temp , cdata , offset ;
253
+
254
+ if (i == 3 )
255
+ sensor_reg = (caldata [1 ] >> 12 )
256
+ | ((caldata [2 ] >> 12 ) << 4 )
257
+ | ((caldata [3 ] >> 12 ) << 8 );
258
+ else
259
+ sensor_reg = caldata [i + 1 ] & TEMP_CALIB_MASK ;
260
+
261
+ sensor_temp = tmdev -> chip -> calc_temp (tmdev , i , sensor_reg );
250
262
251
263
/*
252
264
* Calibration data is CALIBRATE_DEFAULT - (calculated
0 commit comments