Skip to content

Commit eba9589

Browse files
authored
Merge pull request hardkernel#42 from yan-wyb/khadas-vims-4.9.y
Add fan trigger temperatures setting nodes
2 parents 6dd351a + 0cf38ef commit eba9589

File tree

2 files changed

+213
-0
lines changed

2 files changed

+213
-0
lines changed

drivers/misc/khadas-fan.c

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,114 @@ static ssize_t fan_temp_store(struct device *dev, struct device_attribute *attr,
251251
}
252252
#endif
253253

254+
static void fan_set_func(struct khadas_fan_data *fan_data)
255+
{
256+
int temp = -EINVAL;
257+
258+
temp = get_cpu_temp();
259+
260+
if(temp != -EINVAL){
261+
if(temp < fan_data->trig_temp_level0 ){
262+
khadas_fan_level_set(fan_data,0);
263+
264+
}else if(temp < fan_data->trig_temp_level1 ){
265+
khadas_fan_level_set(fan_data,1);
266+
267+
}else if(temp < fan_data->trig_temp_level2 ){
268+
khadas_fan_level_set(fan_data,2);
269+
270+
}else{
271+
khadas_fan_level_set(fan_data,3);
272+
}
273+
}
274+
275+
}
276+
277+
static ssize_t fan_trigger_low_show(struct class *cls,
278+
struct class_attribute *attr, char *buf){
279+
280+
return sprintf(buf, "Fan trigger low speed temperature:%d\n", fan_data->trig_temp_level0);
281+
}
282+
283+
static ssize_t fan_trigger_low_store(struct class *cls, struct class_attribute *attr,
284+
const char *buf, size_t count){
285+
286+
int trigger;
287+
288+
if (kstrtoint(buf, 0, &trigger))
289+
return -EINVAL;
290+
291+
if (trigger >= g_mcu_data->fan_data.trig_temp_level1){
292+
pr_err("Invalid parameter\n");
293+
return -EINVAL;
294+
}
295+
296+
fan_data->trig_temp_level0 = trigger;
297+
298+
fan_set_func(fan_data);
299+
300+
return count;
301+
}
302+
303+
static ssize_t fan_trigger_mid_show(struct class *cls,
304+
struct class_attribute *attr, char *buf){
305+
306+
return sprintf(buf, "Fan trigger mid speed temperature:%d\n", fan_data->trig_temp_level1);
307+
}
308+
309+
static ssize_t fan_trigger_mid_store(struct class *cls, struct class_attribute *attr,
310+
const char *buf, size_t count){
311+
312+
int trigger;
313+
314+
if (kstrtoint(buf, 0, &trigger))
315+
return -EINVAL;
316+
317+
if (trigger >= g_mcu_data->fan_data.trig_temp_level2 || trigger <= g_mcu_data->fan_data.trig_temp_level0){
318+
pr_err("Invalid parameter\n");
319+
return -EINVAL;
320+
}
321+
322+
fan_data->trig_temp_level1 = trigger;
323+
324+
fan_set_func(fan_data);
325+
326+
return count;
327+
}
328+
329+
static ssize_t fan_trigger_high_show(struct class *cls,
330+
struct class_attribute *attr, char *buf){
331+
332+
return sprintf(buf, "Fan trigger high speed temperature:%d\n", fan_data->trig_temp_level2);
333+
}
334+
335+
static ssize_t fan_trigger_high_store(struct class *cls, struct class_attribute *attr,
336+
const char *buf, size_t count){
337+
338+
int trigger;
339+
340+
if (kstrtoint(buf, 0, &trigger))
341+
return -EINVAL;
342+
343+
if (trigger <= g_mcu_data->fan_data.trig_temp_level1){
344+
pr_err("Invalid parameter\n");
345+
return -EINVAL;
346+
}
347+
348+
fan_data->trig_temp_level2 = trigger;
349+
350+
fan_set_func(fan_data);
351+
352+
return count;
353+
}
354+
254355
static struct class_attribute fan_class_attrs[] = {
255356
__ATTR(enable, 0644, fan_enable_show, fan_enable_store),
256357
__ATTR(mode, 0644, fan_mode_show, fan_mode_store),
257358
__ATTR(level, 0644, fan_level_show, fan_level_store),
359+
__ATTR(trigger_low, 0644, fan_trigger_low_show, fan_trigger_low_store),
360+
__ATTR(trigger_mid, 0644, fan_trigger_mid_show, fan_trigger_mid_store),
361+
__ATTR(trigger_high, 0644, fan_trigger_high_show, fan_trigger_high_store),
258362
__ATTR(temp, 0644, fan_temp_show, NULL),
259363
};
260364

drivers/misc/khadas-mcu.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ static ssize_t store_fan_mode(struct class *cls, struct class_attribute *attr,
364364
return count;
365365
}
366366

367+
367368
static ssize_t show_fan_level(struct class *cls,
368369
struct class_attribute *attr, char *buf)
369370
{
@@ -400,6 +401,111 @@ static ssize_t show_fan_temp(struct class *cls,
400401
return sprintf(buf, "cpu_temp:%d\nFan trigger temperature: level0:%d level1:%d level2:%d\n", temp, g_mcu_data->fan_data.trig_temp_level0, g_mcu_data->fan_data.trig_temp_level1, g_mcu_data->fan_data.trig_temp_level2);
401402
}
402403

404+
405+
void fan_level_set(struct mcu_data *ug_mcu_data){
406+
407+
struct mcu_fan_data *fan_data = &g_mcu_data->fan_data;
408+
int temp = -EINVAL;
409+
410+
if ((KHADAS_BOARD_VIM1 == ug_mcu_data->board) ||
411+
(KHADAS_BOARD_VIM2 == ug_mcu_data->board))
412+
temp = get_cpu_temp();
413+
else if (KHADAS_BOARD_VIM3 == ug_mcu_data->board)
414+
temp = meson_get_temperature();
415+
416+
if(temp != -EINVAL){
417+
if(temp < ug_mcu_data->fan_data.trig_temp_level0 ) {
418+
mcu_fan_level_set(fan_data, 0);
419+
}else if(temp < ug_mcu_data->fan_data.trig_temp_level1 ) {
420+
mcu_fan_level_set(fan_data, 1);
421+
}else if(temp < ug_mcu_data->fan_data.trig_temp_level2 ) {
422+
mcu_fan_level_set(fan_data, 2);
423+
}else{
424+
mcu_fan_level_set(fan_data, 3);
425+
}
426+
}
427+
}
428+
429+
430+
static ssize_t show_fan_trigger_low(struct class *cls,
431+
struct class_attribute *attr, char *buf){
432+
433+
return sprintf(buf, "Fan trigger low speed temperature:%d\n", g_mcu_data->fan_data.trig_temp_level0);
434+
}
435+
436+
static ssize_t store_fan_trigger_low(struct class *cls, struct class_attribute *attr,
437+
const char *buf, size_t count){
438+
439+
int trigger;
440+
441+
if (kstrtoint(buf, 0, &trigger))
442+
return -EINVAL;
443+
444+
if (trigger >= g_mcu_data->fan_data.trig_temp_level1){
445+
pr_err("Invalid parameter\n");
446+
return -EINVAL;
447+
}
448+
449+
g_mcu_data->fan_data.trig_temp_level0 = trigger;
450+
451+
fan_level_set(g_mcu_data);
452+
453+
return count;
454+
}
455+
456+
static ssize_t show_fan_trigger_mid(struct class *cls,
457+
struct class_attribute *attr, char *buf){
458+
459+
return sprintf(buf, "Fan trigger mid speed temperature:%d\n", g_mcu_data->fan_data.trig_temp_level1);
460+
}
461+
462+
static ssize_t store_fan_trigger_mid(struct class *cls, struct class_attribute *attr,
463+
const char *buf, size_t count){
464+
465+
int trigger;
466+
467+
if (kstrtoint(buf, 0, &trigger))
468+
return -EINVAL;
469+
470+
if (trigger >= g_mcu_data->fan_data.trig_temp_level2 || trigger <= g_mcu_data->fan_data.trig_temp_level0){
471+
pr_err("Invalid parameter\n");
472+
return -EINVAL;
473+
}
474+
475+
g_mcu_data->fan_data.trig_temp_level1 = trigger;
476+
477+
fan_level_set(g_mcu_data);
478+
479+
return count;
480+
}
481+
482+
static ssize_t show_fan_trigger_high(struct class *cls,
483+
struct class_attribute *attr, char *buf){
484+
485+
return sprintf(buf, "Fan trigger high speed temperature:%d\n", g_mcu_data->fan_data.trig_temp_level2);
486+
}
487+
488+
static ssize_t store_fan_trigger_high(struct class *cls, struct class_attribute *attr,
489+
const char *buf, size_t count){
490+
491+
int trigger;
492+
493+
if (kstrtoint(buf, 0, &trigger))
494+
return -EINVAL;
495+
496+
if (trigger <= g_mcu_data->fan_data.trig_temp_level1 ){
497+
pr_err("Invalid parameter\n");
498+
return -EINVAL;
499+
}
500+
501+
g_mcu_data->fan_data.trig_temp_level2 = trigger;
502+
503+
fan_level_set(g_mcu_data);
504+
505+
return count;
506+
}
507+
508+
403509
static ssize_t store_wol_enable(struct class *cls, struct class_attribute *attr,
404510
const char *buf, size_t count)
405511
{
@@ -525,6 +631,9 @@ static struct class_attribute fan_class_attrs[] = {
525631
__ATTR(enable, 0644, show_fan_enable, store_fan_enable),
526632
__ATTR(mode, 0644, show_fan_mode, store_fan_mode),
527633
__ATTR(level, 0644, show_fan_level, store_fan_level),
634+
__ATTR(trigger_temp_low, 0644, show_fan_trigger_low, store_fan_trigger_low),
635+
__ATTR(trigger_temp_mid, 0644, show_fan_trigger_mid, store_fan_trigger_mid),
636+
__ATTR(trigger_temp_high, 0644, show_fan_trigger_high, store_fan_trigger_high),
528637
__ATTR(temp, 0644, show_fan_temp, NULL),
529638
};
530639

0 commit comments

Comments
 (0)