From 52e7362d2da04f57b5fd867ffcb6e51e59072725 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lothar=20Wa=C3=9Fmann?= Date: Mon, 4 Nov 2013 09:56:45 +0100 Subject: [PATCH] karo: tx6: setup PMIC to use BURST mode for better efficiency --- board/karo/tx6/tx6qdl.c | 79 ++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/board/karo/tx6/tx6qdl.c b/board/karo/tx6/tx6qdl.c index 59e0e023b4..c41f0d46d3 100644 --- a/board/karo/tx6/tx6qdl.c +++ b/board/karo/tx6/tx6qdl.c @@ -225,23 +225,54 @@ static void tx6qdl_print_cpuinfo(void) check_cpu_temperature(1); } +#define LTC3676_BUCK1 0x01 +#define LTC3676_BUCK2 0x02 +#define LTC3676_BUCK3 0x03 +#define LTC3676_BUCK4 0x04 #define LTC3676_DVB2A 0x0C #define LTC3676_DVB2B 0x0D #define LTC3676_DVB4A 0x10 #define LTC3676_DVB4B 0x11 +#define LTC3676_CLIRQ 0x1f #define VDD_SOC_mV (1375 + 50) #define VDD_CORE_mV (1375 + 50) +#define LTC3676_BUCK_DVDT_FAST (1 << 0) +#define LTC3676_BUCK_KEEP_ALIVE (1 << 1) +#define LTC3676_BUCK_CLK_RATE_LOW (1 << 2) +#define LTC3676_BUCK_PHASE_SEL (1 << 3) +#define LTC3676_BUCK_ENABLE_300 (1 << 4) +#define LTC3676_BUCK_PULSE_SKIP (0 << 5) +#define LTC3676_BUCK_BURST_MODE (1 << 5) +#define LTC3676_BUCK_CONTINUOUS (2 << 5) +#define LTC3676_BUCK_ENABLE (1 << 7) + +#define LTC3676_PGOOD_MASK (1 << 5) + #define mV_to_regval(mV) (((mV) * 360 / 330 - 825 + 1) / 25) #define regval_to_mV(v) (((v) * 25 + 825) * 330 / 360) +static struct pmic_regs { + u8 addr; + u8 val; +} ltc3676_regs[] = { + { LTC3676_DVB2B, mV_to_regval(900) | LTC3676_PGOOD_MASK, }, + { LTC3676_DVB4B, mV_to_regval(900) | LTC3676_PGOOD_MASK, }, + { LTC3676_DVB2A, mV_to_regval(VDD_SOC_mV), }, + { LTC3676_DVB4A, mV_to_regval(VDD_CORE_mV), }, + { LTC3676_BUCK1, LTC3676_BUCK_BURST_MODE | LTC3676_BUCK_CLK_RATE_LOW, }, + { LTC3676_BUCK2, LTC3676_BUCK_BURST_MODE | LTC3676_BUCK_CLK_RATE_LOW, }, + { LTC3676_BUCK3, LTC3676_BUCK_BURST_MODE | LTC3676_BUCK_CLK_RATE_LOW, }, + { LTC3676_BUCK4, LTC3676_BUCK_BURST_MODE | LTC3676_BUCK_CLK_RATE_LOW, }, + { LTC3676_CLIRQ, 0, }, /* clear interrupt status */ +}; + static int setup_pmic_voltages(void) { int ret; unsigned char value; - - i2c_init(CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); + int i; ret = i2c_probe(CONFIG_SYS_I2C_SLAVE); if (ret != 0) { @@ -255,41 +286,17 @@ static int setup_pmic_voltages(void) return ret; } - /* VDDCORE/VDDSOC default 1.375V is not enough, considering - pfuze tolerance and IR drop and ripple, need increase - to 1.425V for SabreSD */ - - value = 0x39; /* VB default value & PGOOD not forced when slewing */ - ret = i2c_write(CONFIG_SYS_I2C_SLAVE, LTC3676_DVB2B, 1, &value, 1); - if (ret) { - printf("%s: failed to write PMIC DVB2B register: %d\n", - __func__, ret); - return ret; - } - ret = i2c_write(CONFIG_SYS_I2C_SLAVE, LTC3676_DVB4B, 1, &value, 1); - if (ret) { - printf("%s: failed to write PMIC DVB4B register: %d\n", - __func__, ret); - return ret; - } - - value = mV_to_regval(VDD_SOC_mV); - ret = i2c_write(CONFIG_SYS_I2C_SLAVE, LTC3676_DVB2A, 1, &value, 1); - if (ret) { - printf("%s: failed to write PMIC DVB2A register: %d\n", - __func__, ret); - return ret; - } - printf("VDDSOC set to %dmV\n", regval_to_mV(value)); - - value = mV_to_regval(VDD_CORE_mV); - ret = i2c_write(CONFIG_SYS_I2C_SLAVE, LTC3676_DVB4A, 1, &value, 1); - if (ret) { - printf("%s: failed to write PMIC DVB4A register: %d\n", - __func__, ret); - return ret; + for (i = 0; i < ARRAY_SIZE(ltc3676_regs); i++) { + ret = i2c_write(CONFIG_SYS_I2C_SLAVE, ltc3676_regs[i].addr, 1, + <c3676_regs[i].val, 1); + if (ret) { + printf("%s: failed to write PMIC register %02x: %d\n", + __func__, ltc3676_regs[i].addr, ret); + return ret; + } } - printf("VDDCORE set to %dmV\n", regval_to_mV(value)); + printf("VDDCORE set to %dmV\n", VDD_CORE_mV); + printf("VDDSOC set to %dmV\n", VDD_SOC_mV); return 0; } -- 2.39.2