Signed-off-by: Titus Rwantare <[email protected]>
---
hw/i2c/pmbus_device.c | 12 +++++++++
include/hw/i2c/pmbus_device.h | 46 +++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+)
diff --git a/hw/i2c/pmbus_device.c b/hw/i2c/pmbus_device.c
index 8befc27895..5039975520 100644
--- a/hw/i2c/pmbus_device.c
+++ b/hw/i2c/pmbus_device.c
@@ -39,6 +39,12 @@ uint16_t pmbus_data2linear_mode(uint16_t value, int exp)
return value >> exp;
}
+uint16_t pmbus_data2linear11(uint16_t value, int exp)
+{
+ return (uint16_t)((exp & 0x1F) << 11 |
+ (pmbus_data2linear_mode(value, exp) & 0x7FF));
+}
+
uint16_t pmbus_milliunits2linear_mode(uint32_t value, int exp)
{
uint32_t ret;
@@ -58,6 +64,12 @@ uint16_t pmbus_milliunits2linear_mode(uint32_t value, int
exp)
return ret;
}
+uint16_t pmbus_milliunits2linear11(uint32_t value, int exp)
+{
+ return (uint16_t)((exp & 0x1F) << 11 |
+ (pmbus_milliunits2linear_mode(value, exp) & 0x7FF));
+}
+
uint16_t pmbus_linear_mode2data(uint16_t value, int exp)
{
/* D = L * 2^e */
diff --git a/include/hw/i2c/pmbus_device.h b/include/hw/i2c/pmbus_device.h
index 9f3569e997..44cd908fe7 100644
--- a/include/hw/i2c/pmbus_device.h
+++ b/include/hw/i2c/pmbus_device.h
@@ -477,10 +477,56 @@ uint32_t pmbus_direct_mode2data(PMBusCoefficients c,
uint16_t value);
*
* L = D * 2^(-e)
*
+ * Exponent is retrieved from VOUT_MODE register
+ *
+ * 7 6 5 4 3 2 1 0
+ * +---+---+---+---+---+---+---+---+
+ * | 0 | 0 | 0 | N |
+ * +---+---+---+---+---+---+---+---+
+ * |_______| |_______________|
+ * Mode Exponent (N)
+ * = 000b
+ *
* @return uint16
*/
uint16_t pmbus_data2linear_mode(uint16_t value, int exp);
+/**
+ * Convert sensor values to linear11 format
+ *
+ * L = e << 11 | D * 2^(-e)
+ *
+ * | Data Byte High | Data Byte Low |
+ * +---+---+---+---+---+ +---+---+---+---+---+---+---+---+---+---+---+
+ * | 7 | 6 | 5 | 4 | 3 | | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * +---+---+---+---+---+ +---+---+---+---+---+---+---+---+---+---+---+
+ * | MSB | | MSB |
+ * |_________ _________| |_____________________ _____________________|
+ * N Y
+ * Exponent Mantissa
+ *
+ * @return uint16
+ */
+uint16_t pmbus_data2linear11(uint16_t value, int exp);
+
+/**
+ * Convert sensor values in milliunits to linear11 format
+ *
+ * L = e << 11 | D * 2^(-e)
+ *
+ * | Data Byte High | Data Byte Low |
+ * +---+---+---+---+---+ +---+---+---+---+---+---+---+---+---+---+---+
+ * | 7 | 6 | 5 | 4 | 3 | | 2 | 1 | 0 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * +---+---+---+---+---+ +---+---+---+---+---+---+---+---+---+---+---+
+ * | MSB | | MSB |
+ * |_________ _________| |_____________________ _____________________|
+ * N Y
+ * Exponent Mantissa
+ *
+ * @return uint16
+ */
+uint16_t pmbus_milliunits2linear11(uint32_t value, int exp);
+
/**
* Convert milliunit sensor value to linear mode format
*
--
2.55.0.rc2.803.g1fd1e6609c-goog