[PATCH 2/2] board/freescale/vid: Add support for LTC7132 voltage regulator
Wasim Khan
wasim.khan at nxp.com
Wed Aug 12 22:41:49 CEST 2020
Add support for LTC7132 voltage regulator
Signed-off-by: Wasim Khan <wasim.khan at nxp.com>
Reviewed-by: Heinz Wrobel <Heinz.Wrobel at nxp.com>
---
board/freescale/common/vid.c | 121 ++++++++++++++++++++++++-------------------
board/freescale/common/vid.h | 32 ++++++------
2 files changed, 85 insertions(+), 68 deletions(-)
diff --git a/board/freescale/common/vid.c b/board/freescale/common/vid.c
index 0ba672d..095781f 100644
--- a/board/freescale/common/vid.c
+++ b/board/freescale/common/vid.c
@@ -92,7 +92,9 @@ static int find_vid_chip_on_i2c(void)
}
#endif
#if defined(CONFIG_VOL_MONITOR_LTC3882_READ) || \
- defined(CONFIG_VOL_MONITOR_LTC3882_SET)
+ defined(CONFIG_VOL_MONITOR_LTC7132_READ) || \
+ defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_SET)
int i2caddress = I2C_VOL_MONITOR_ADDR;
int ret;
u8 buf[8];
@@ -102,27 +104,35 @@ static int find_vid_chip_on_i2c(void)
#ifndef CONFIG_DM_I2C
ret = i2c_read(i2caddress,
- LTC3882_MFR_ID, 1, (void *)&buf[0],
+ LTC_MFR_ID, 1, (void *)&buf[0],
4);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
- ret = dm_i2c_read(dev, LTC3882_MFR_ID,
+ ret = dm_i2c_read(dev, LTC_MFR_ID,
(void *)&buf[0], 4);
#endif
if (!ret && memcmp(buf, "\3LTC", 4) == 0) {
#ifndef CONFIG_DM_I2C
ret = i2c_read(i2caddress,
- LTC3882_MFR_MODEL, 1, (void *)&buf[0],
+ LTC_MFR_MODEL, 1, (void *)&buf[0],
8);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
- ret = dm_i2c_read(dev, LTC3882_MFR_MODEL,
+ ret = dm_i2c_read(dev, LTC_MFR_MODEL,
(void *)&buf[0], 8);
#endif
- if (!ret && memcmp(buf, "\7LTC3882", 8) == 0)
- return i2caddress;
+ if (!ret) {
+#if defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC3882_READ)
+ if (memcmp(buf, "\7LTC3882", 8) == 0)
+#elif defined(CONFIG_VOL_MONITOR_LTC7132_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_READ)
+ if (memcmp(buf, "\7LTC7132", 8) == 0)
+#endif
+ return i2caddress;
+ }
}
#endif
return -1;
@@ -148,7 +158,8 @@ static int find_vid_chip_on_i2c(void)
#define VDD_STEP_UP IR_VDD_STEP_UP
#define VDD_STEP_DOWN IR_VDD_STEP_DOWN
#endif
-#ifdef CONFIG_VOL_MONITOR_LTC3882_READ
+#if defined(CONFIG_VOL_MONITOR_LTC3882_READ) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_READ)
#define WAIT_FOR_ADC 0
#define ADC_MIN_ACCURACY LTC_ADC_MIN_ACCURACY
#define VDD_STEP_UP LTC_VDD_STEP_UP
@@ -253,14 +264,15 @@ static int read_voltage_from_IR(int i2caddress)
}
#endif
-#ifdef CONFIG_VOL_MONITOR_LTC3882_READ
+#if defined(CONFIG_VOL_MONITOR_LTC3882_READ) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_READ)
/* read the current value of the LTC Regulator Voltage.
* This will only read the first channel for dual channel setups
*/
static int read_voltage_from_LTC(int i2caddress)
{
int ret, vcode = 0;
- u8 chan = LTC3882_VID_CHANNEL;
+ u8 chan = LTC_VID_CHANNEL;
u8 buf[2];
#ifdef CONFIG_DM_I2C
struct udevice *dev;
@@ -269,11 +281,11 @@ static int read_voltage_from_LTC(int i2caddress)
/* select the PAGE 0 using PMBus commands PAGE for VDD*/
#ifndef CONFIG_DM_I2C
ret = i2c_write(i2caddress,
- LTC3882_PAGE, 1, &chan, 1);
+ LTC_PAGE, 1, &chan, 1);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
- ret = dm_i2c_write(dev, LTC3882_PAGE, &chan, 1);
+ ret = dm_i2c_write(dev, LTC_PAGE, &chan, 1);
#endif
if (ret) {
printf("VID: failed to select VDD Page\n");
@@ -283,11 +295,11 @@ static int read_voltage_from_LTC(int i2caddress)
/*read the output voltage using PMBus command READ_VOUT*/
#ifndef CONFIG_DM_I2C
ret = i2c_read(i2caddress,
- LTC3882_READ_VOUT, 1, (void *)&buf[0], 2);
+ LTC_READ_VOUT, 1, (void *)&buf[0], 2);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
- ret = dm_i2c_read(dev, LTC3882_READ_VOUT,
+ ret = dm_i2c_read(dev, LTC_READ_VOUT,
(void *)&buf[0], 2);
#endif
if (ret) {
@@ -310,7 +322,8 @@ static int read_voltage(int i2caddress)
voltage_read = read_voltage_from_INA220(I2C_VOL_MONITOR_ADDR);
#elif defined CONFIG_VOL_MONITOR_IR36021_READ
voltage_read = read_voltage_from_IR(i2caddress);
-#elif defined CONFIG_VOL_MONITOR_LTC3882_READ
+#elif defined(CONFIG_VOL_MONITOR_LTC3882_READ) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_READ)
voltage_read = read_voltage_from_LTC(i2caddress);
#else
voltage_read = -1;
@@ -452,11 +465,12 @@ static int set_voltage_to_IR(int i2caddress, int vdd)
}
#endif
-#if defined(CONFIG_VOL_MONITOR_LTC3882_SET)
+#if defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_SET)
/* Helper function to write a mV value as LTC L16 into the chip,
* returning a boolean for success
*/
-static int write_l16_mV_LTC3882(int i2caddress, int cmd, int mv)
+static int write_l16_mV_LTC(int i2caddress, int cmd, int mv)
{
int l16;
int ret;
@@ -471,7 +485,7 @@ static int write_l16_mV_LTC3882(int i2caddress, int cmd, int mv)
l16 /= 1000;
debug("VID: cmd 0x%02x voltage write 0x%04x\n", cmd, l16);
buf[0] = 4;
- buf[1] = LTC3882_VID_CHANNEL;
+ buf[1] = LTC_VID_CHANNEL;
buf[2] = cmd;
buf[3] = (l16 & 0xff);
buf[4] = (l16 >> 8);
@@ -483,23 +497,23 @@ static int write_l16_mV_LTC3882(int i2caddress, int cmd, int mv)
*/
#ifndef CONFIG_DM_I2C
ret = i2c_write(i2caddress,
- LTC3882_PAGE_PLUS_WRITE, 1, (void *)&buf, 5);
+ LTC_PAGE_PLUS_WRITE, 1, (void *)&buf, 5);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
ret = dm_i2c_write(dev,
- LTC3882_PAGE_PLUS_WRITE, (void *)&buf, 5);
+ LTC_PAGE_PLUS_WRITE, (void *)&buf, 5);
#endif
-#ifdef LTC3882_VID_CHANNEL2
+#ifdef LTC_VID_CHANNEL2
if (!ret) {
- buf[1] = LTC3882_VID_CHANNEL2;
+ buf[1] = LTC_VID_CHANNEL2;
#ifndef CONFIG_DM_I2C
ret = i2c_write(i2caddress,
- LTC3882_PAGE_PLUS_WRITE, 1, (void *)&buf, 5);
+ LTC_PAGE_PLUS_WRITE, 1, (void *)&buf, 5);
#else
ret = i2c_get_chip_for_busnum(0, i2caddress, 1, &dev);
if (!ret)
- ret = dm_i2c_write(dev, LTC3882_PAGE_PLUS_WRITE,
+ ret = dm_i2c_write(dev, LTC_PAGE_PLUS_WRITE,
(void *)&buf, 5);
#endif
}
@@ -508,16 +522,17 @@ static int write_l16_mV_LTC3882(int i2caddress, int cmd, int mv)
}
#endif
-#ifdef CONFIG_VOL_MONITOR_LTC3882_SET
+#if defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_SET)
/* this function sets the VDD and returns the value set */
static int set_voltage_to_LTC(int i2caddress, int vdd)
{
int wait, ret, vdd_last;
/* Write the desired voltage code to the regulator */
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_COMMAND,
- vdd);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_COMMAND,
+ vdd);
if (ret) {
printf("VID: I2C failed to write to the voltage regulator\n");
return -1;
@@ -545,7 +560,8 @@ static int set_voltage(int i2caddress, int vdd)
vdd += board_vdd_drop_compensation();
#ifdef CONFIG_VOL_MONITOR_IR36021_SET
vdd_last = set_voltage_to_IR(i2caddress, vdd);
-#elif defined CONFIG_VOL_MONITOR_LTC3882_SET
+#elif defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_SET)
vdd_last = set_voltage_to_LTC(i2caddress, vdd);
#else
#error Specific voltage monitor must be defined
@@ -589,49 +605,50 @@ int vid_set_mv_limits(int absmax,
}
i2caddress = find_vid_chip_on_i2c();
-#if defined(CONFIG_VOL_MONITOR_LTC3882_SET)
+#if defined(CONFIG_VOL_MONITOR_LTC3882_SET) || \
+ defined(CONFIG_VOL_MONITOR_LTC7132_SET)
if (i2caddress >= 0) {
/* We need to program the voltage limits
* properly, or the chip may freak out on
* VID changes.
*/
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_MAX,
- absmax);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_MAX,
+ absmax);
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_MARGIN_HIGH,
- marginhigh);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_MARGIN_HIGH,
+ marginhigh);
}
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_MARGIN_LOW,
- marginlow);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_MARGIN_LOW,
+ marginlow);
}
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_OV_FAULT_LIMIT,
- ovfault);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_OV_FAULT_LIMIT,
+ ovfault);
}
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_OV_WARN_LIMIT,
- ovwarn);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_OV_WARN_LIMIT,
+ ovwarn);
}
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_UV_WARN_LIMIT,
- uvwarn);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_UV_WARN_LIMIT,
+ uvwarn);
}
if (!ret) {
- ret = write_l16_mV_LTC3882(i2caddress,
- LTC3882_VOUT_UV_FAULT_LIMIT,
- uvfault);
+ ret = write_l16_mV_LTC(i2caddress,
+ LTC_VOUT_UV_FAULT_LIMIT,
+ uvfault);
}
} else {
ret = -1;
}
-#endif /* CONFIG_VOL_MONITOR_LTC3882_SET */
+#endif /* CONFIG_VOL_MONITOR_LTC3882_SET || CONFIG_VOL_MONITOR_LTC7132_SET*/
if (ret)
printf("VID: Setting voltage limits failed! VID regulation may not be stable!\n");
diff --git a/board/freescale/common/vid.h b/board/freescale/common/vid.h
index 09dca78..d506e7f 100644
--- a/board/freescale/common/vid.h
+++ b/board/freescale/common/vid.h
@@ -22,21 +22,21 @@
#define IR_VDD_STEP_UP 5 /* mV */
#define IR_ADC_MIN_ACCURACY 8 /* mV */
-/* Declarations for the LTC3882 */
-#define LTC3882_PAGE 0x00
-#define LTC3882_PAGE_PLUS_WRITE 0x05
-#define LTC3882_PAGE_PLUS_READ 0x06
-#define LTC3882_VOUT_COMMAND 0x21
-#define LTC3882_VOUT_MAX 0x24
-#define LTC3882_VOUT_MARGIN_HIGH 0x25
-#define LTC3882_VOUT_MARGIN_LOW 0x26
-#define LTC3882_VOUT_OV_FAULT_LIMIT 0x40
-#define LTC3882_VOUT_OV_WARN_LIMIT 0x42
-#define LTC3882_VOUT_UV_WARN_LIMIT 0x43
-#define LTC3882_VOUT_UV_FAULT_LIMIT 0x44
-#define LTC3882_READ_VOUT 0x8B
-#define LTC3882_MFR_ID 0x99
-#define LTC3882_MFR_MODEL 0x9A
+/* Declarations for the LTC regulator */
+#define LTC_PAGE 0x00
+#define LTC_PAGE_PLUS_WRITE 0x05
+#define LTC_PAGE_PLUS_READ 0x06
+#define LTC_VOUT_COMMAND 0x21
+#define LTC_VOUT_MAX 0x24
+#define LTC_VOUT_MARGIN_HIGH 0x25
+#define LTC_VOUT_MARGIN_LOW 0x26
+#define LTC_VOUT_OV_FAULT_LIMIT 0x40
+#define LTC_VOUT_OV_WARN_LIMIT 0x42
+#define LTC_VOUT_UV_WARN_LIMIT 0x43
+#define LTC_VOUT_UV_FAULT_LIMIT 0x44
+#define LTC_READ_VOUT 0x8B
+#define LTC_MFR_ID 0x99
+#define LTC_MFR_MODEL 0x9A
/* step the LTC regulator in 1mV increments */
#define LTC_VDD_STEP_DOWN 1 /* mV */
@@ -45,7 +45,7 @@
/* This is a compatibility setting for existing board configs */
#ifdef PWM_CHANNEL0
-#define LTC3882_VID_CHANNEL PWM_CHANNEL0
+#define LTC_VID_CHANNEL PWM_CHANNEL0
#endif
int vid_set_mv_limits(int absmax,
--
2.7.4
More information about the U-Boot
mailing list