@@ -178,17 +178,52 @@ static u8 emc1403_temp_regs[][4] = {
178
178
},
179
179
};
180
180
181
+ static s8 emc1403_temp_regs_low [][4 ] = {
182
+ [0 ] = {
183
+ [temp_min ] = -1 ,
184
+ [temp_max ] = -1 ,
185
+ [temp_crit ] = -1 ,
186
+ [temp_input ] = 0x29 ,
187
+ },
188
+ [1 ] = {
189
+ [temp_min ] = 0x14 ,
190
+ [temp_max ] = 0x13 ,
191
+ [temp_crit ] = -1 ,
192
+ [temp_input ] = 0x10 ,
193
+ },
194
+ [2 ] = {
195
+ [temp_min ] = 0x18 ,
196
+ [temp_max ] = 0x17 ,
197
+ [temp_crit ] = -1 ,
198
+ [temp_input ] = 0x24 ,
199
+ },
200
+ [3 ] = {
201
+ [temp_min ] = 0x2f ,
202
+ [temp_max ] = 0x2e ,
203
+ [temp_crit ] = -1 ,
204
+ [temp_input ] = 0x2b ,
205
+ },
206
+ };
207
+
181
208
static int __emc1403_get_temp (struct thermal_data * data , int channel ,
182
209
enum emc1403_reg_map map , long * val )
183
210
{
184
211
unsigned int regval ;
185
212
int ret ;
213
+ s8 reg ;
186
214
187
215
ret = regmap_read (data -> regmap , emc1403_temp_regs [channel ][map ], & regval );
188
216
if (ret < 0 )
189
217
return ret ;
190
218
* val = regval * 1000 ;
191
219
220
+ reg = emc1403_temp_regs_low [channel ][map ];
221
+ if (reg >= 0 ) {
222
+ ret = regmap_read (data -> regmap , reg , & regval );
223
+ if (ret < 0 )
224
+ return ret ;
225
+ * val += (regval >> 5 ) * 125 ;
226
+ }
192
227
return 0 ;
193
228
}
194
229
@@ -336,12 +371,26 @@ static int emc1403_set_temp(struct thermal_data *data, int channel,
336
371
{
337
372
unsigned int regval ;
338
373
int ret ;
374
+ u8 regh ;
375
+ s8 regl ;
339
376
340
- val = clamp_val (val , 0 , 255000 );
377
+ regh = emc1403_temp_regs [channel ][map ];
378
+ regl = emc1403_temp_regs_low [channel ][map ];
341
379
342
380
mutex_lock (& data -> mutex );
343
- regval = DIV_ROUND_CLOSEST (val , 1000 );
344
- ret = regmap_write (data -> regmap , emc1403_temp_regs [channel ][map ], regval );
381
+ if (regl >= 0 ) {
382
+ val = clamp_val (val , 0 , 255875 );
383
+ regval = DIV_ROUND_CLOSEST (val , 125 );
384
+ ret = regmap_write (data -> regmap , regh , regval >> 3 );
385
+ if (ret < 0 )
386
+ goto unlock ;
387
+ ret = regmap_write (data -> regmap , regl , (regval & 0x07 ) << 5 );
388
+ } else {
389
+ val = clamp_val (val , 0 , 255000 );
390
+ regval = DIV_ROUND_CLOSEST (val , 1000 );
391
+ ret = regmap_write (data -> regmap , regh , regval );
392
+ }
393
+ unlock :
345
394
mutex_unlock (& data -> mutex );
346
395
return ret ;
347
396
}
0 commit comments