qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 3/3] hw/sensor: max31785 : update the tach input based on the tac


From: Maheswara Kurapati
Subject: [PATCH 3/3] hw/sensor: max31785 : update the tach input based on the tach margin percentage
Date: Wed, 13 Jul 2022 20:56:37 -0500

Update the tach input based on the percentage of tach target.  The tach margin
could be a +ve or -ve margin of the target tach rpm.

Signed-off-by: Maheswara Kurapati <quic_mkurapat@quicinc.com>
---
 hw/sensor/max31785.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/hw/sensor/max31785.c b/hw/sensor/max31785.c
index 1cb31c2e82..c37b154130 100644
--- a/hw/sensor/max31785.c
+++ b/hw/sensor/max31785.c
@@ -71,7 +71,7 @@
 /* FAN_CONFIG_1_2 */
 #define MAX31785_MFR_FAN_CONFIG                0xF1
 #define MAX31785_FAN_CONFIG_ENABLE             BIT(7)
-#define MAX31785_FAN_CONFIG_RPM_PWM            BIT(6)
+#define MAX31785_FAN_CONFIG_FAN_MODE_RPM       BIT(6)
 #define MAX31785_FAN_CONFIG_PULSE(pulse)       (pulse << 4)
 #define MAX31785_DEFAULT_FAN_CONFIG_1_2(pulse)                                 
\
     (MAX31785_FAN_CONFIG_ENABLE | MAX31785_FAN_CONFIG_PULSE(pulse))
@@ -316,6 +316,8 @@ static int max31785_write_data(PMBusDevice *pmdev, const 
uint8_t *buf,
                                uint8_t len)
 {
     MAX31785State *s = MAX31785(pmdev);
+    int16_t   tach_margin = 0;
+
     if (len == 0) {
         qemu_log_mask(LOG_GUEST_ERROR, "%s: writing empty data\n", __func__);
         return -1;
@@ -342,9 +344,23 @@ static int max31785_write_data(PMBusDevice *pmdev, const 
uint8_t *buf,
     case PMBUS_FAN_COMMAND_1:
         if (pmdev->page <= MAX31785_MAX_FAN_PAGE) {
             pmdev->pages[pmdev->page].fan_command_1 = pmbus_receive16(pmdev);
-            pmdev->pages[pmdev->page].read_fan_speed_1 =
-                ((MAX31785_DEFAULT_FAN_SPEED / MAX31785_DEFAULT_FAN_MAX_PWM) *
-                pmdev->pages[pmdev->page].fan_command_1);
+            if ((pmdev->pages[pmdev->page].fan_config_1_2 &
+                 MAX31785_FAN_CONFIG_FAN_MODE_RPM)
+                  == MAX31785_FAN_CONFIG_FAN_MODE_RPM) {
+                /* calculate the tach margin (+ve or -ve) */
+                tach_margin = (int16_t)pmdev->pages[pmdev->page].fan_command_1 
*
+                        ((float)s->tach_margin_percent[pmdev->page] / 100.0);
+
+                /* set the tach */
+                pmdev->pages[pmdev->page].read_fan_speed_1 =
+                 (uint16_t)(pmdev->pages[pmdev->page].fan_command_1 +
+                            tach_margin);
+            } else {
+                /* pwm mode */
+                pmdev->pages[pmdev->page].read_fan_speed_1 =
+                  ((MAX31785_DEFAULT_FAN_SPEED / MAX31785_DEFAULT_FAN_MAX_PWM) 
*
+                   pmdev->pages[pmdev->page].fan_command_1);
+            }
         }
         break;
 
-- 
2.25.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]