hw/i2c: Added linear mode translation for pmbus devices

Signed-off-by: Shengtan Mao <stmao@google.com>
Reviewed-by: Titus Rwantare <titusr@google.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Acked-by: Corey Minyard <cminyard@mvista.com>
Message-Id: <20220307200605.4001451-7-titusr@google.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
Shengtan Mao 2022-03-07 12:06:02 -08:00 committed by Philippe Mathieu-Daudé
parent bf0e0c7092
commit 648a488216
2 changed files with 37 additions and 1 deletions

View File

@ -28,6 +28,24 @@ uint32_t pmbus_direct_mode2data(PMBusCoefficients c, uint16_t value)
return x;
}
uint16_t pmbus_data2linear_mode(uint16_t value, int exp)
{
/* L = D * 2^(-e) */
if (exp < 0) {
return value << (-exp);
}
return value >> exp;
}
uint16_t pmbus_linear_mode2data(uint16_t value, int exp)
{
/* D = L * 2^e */
if (exp < 0) {
return value >> (-exp);
}
return value << exp;
}
void pmbus_send(PMBusDevice *pmdev, const uint8_t *data, uint16_t len)
{
if (pmdev->out_buf_len + len > SMBUS_DATA_MAX_LEN) {

View File

@ -448,7 +448,7 @@ typedef struct PMBusCoefficients {
*
* Y = (m * x - b) * 10^R
*
* @return uint32_t
* @return uint16_t
*/
uint16_t pmbus_data2direct_mode(PMBusCoefficients c, uint32_t value);
@ -461,6 +461,24 @@ uint16_t pmbus_data2direct_mode(PMBusCoefficients c, uint32_t value);
*/
uint32_t pmbus_direct_mode2data(PMBusCoefficients c, uint16_t value);
/**
* Convert sensor values to linear mode format
*
* L = D * 2^(-e)
*
* @return uint16
*/
uint16_t pmbus_data2linear_mode(uint16_t value, int exp);
/**
* Convert linear mode formatted data into sensor reading
*
* D = L * 2^e
*
* @return uint16
*/
uint16_t pmbus_linear_mode2data(uint16_t value, int exp);
/**
* @brief Send a block of data over PMBus
* Assumes that the bytes in the block are already ordered correctly,