diff --git a/src/board/system76/common/dgpu.c b/src/board/system76/common/dgpu.c index 063ed14d3..5d7ec7a22 100644 --- a/src/board/system76/common/dgpu.c +++ b/src/board/system76/common/dgpu.c @@ -59,23 +59,33 @@ void dgpu_init(void) { i2c_reset(&I2C_DGPU, true); } -uint8_t dgpu_get_fan_duty(void) { - uint8_t duty; - if (power_state == POWER_STATE_S0 && gpio_get(&DGPU_PWR_EN) && !gpio_get(&GC6_FB_EN)) { - // Use I2CS if in S0 state +bool dgpu_get_temp(int16_t *const data) { + if (gpio_get(&DGPU_PWR_EN) && !gpio_get(&GC6_FB_EN)) { int8_t rlts; int16_t res = i2c_get(&I2C_DGPU, 0x4F, 0x00, &rlts, 1); if (res == 1) { - dgpu_temp = (int16_t)rlts; - duty = fan_duty(&FAN, dgpu_temp); + *data = (int16_t)rlts; + return true; } else { DEBUG("DGPU temp error: %d\n", res); - // Default to 50% if there is an error - dgpu_temp = 0; + *data = 0; + return false; + } + } + + *data = 0; + return true; +} + +uint8_t dgpu_get_fan_duty(void) { + uint8_t duty; + if (power_state == POWER_STATE_S0) { + if (dgpu_get_temp(&dgpu_temp)) { + duty = fan_duty(&FAN, dgpu_temp); + } else { duty = PWM_DUTY(50); } } else { - // Turn fan off if not in S0 state or GPU power not on dgpu_temp = 0; duty = PWM_DUTY(0); } diff --git a/src/board/system76/common/include/board/dgpu.h b/src/board/system76/common/include/board/dgpu.h index 7bdf309ed..212958306 100644 --- a/src/board/system76/common/include/board/dgpu.h +++ b/src/board/system76/common/include/board/dgpu.h @@ -3,6 +3,7 @@ #ifndef _BOARD_DGPU_H #define _BOARD_DGPU_H +#include #include #if CONFIG_HAVE_DGPU @@ -10,12 +11,18 @@ extern int16_t dgpu_temp; void dgpu_init(void); +bool dgpu_get_temp(int16_t *const data); uint8_t dgpu_get_fan_duty(void); #else static inline void dgpu_init(void) {} +static inline bool dgpu_get_temp(int16_t *const data) { + *data = 0; + return true; +} + static inline uint8_t dgpu_get_fan_duty(void) { return 0; }