diff options
-rw-r--r-- | src/mainboard/google/rush_ryu/pmic.c | 34 | ||||
-rw-r--r-- | src/mainboard/google/rush_ryu/pmic.h | 87 | ||||
-rw-r--r-- | src/mainboard/google/rush_ryu/romstage.c | 9 |
3 files changed, 89 insertions, 41 deletions
diff --git a/src/mainboard/google/rush_ryu/pmic.c b/src/mainboard/google/rush_ryu/pmic.c index a816e8ac14..00d1ab476f 100644 --- a/src/mainboard/google/rush_ryu/pmic.c +++ b/src/mainboard/google/rush_ryu/pmic.c @@ -27,30 +27,38 @@ #include "pmic.h" #include "reset.h" -/* A44/Ryu has a TI 65913 PMIC on bus 4 (PWR_I2C) */ - -enum { - TI65913_I2C_ADDR = 0x58 -}; +#define PAGE_ADDR(reg) ((reg >> 8) & 0xff) +#define PAGE_OFFSET(reg) (reg & 0xff) struct ti65913_init_reg { - u8 reg; + u16 reg; u8 val; u8 delay; }; static struct ti65913_init_reg init_list[] = { //TODO(twarren@nvidia.com): Add slams back to defaults -// {TI65913_SMPS12_CTRL, 0x01, 0}, // {TI65913_SMPS12_VOLTAGE, 0x38, 0}, +// {TI65913_SMPS12_CTRL, 0x01, 1}, //etc. }; -void pmic_write_reg(unsigned bus, uint8_t reg, uint8_t val, int delay) +int pmic_read_reg(unsigned bus, uint16_t reg, uint8_t *data) { - if (i2c_writeb(bus, TI65913_I2C_ADDR, reg, val)) { - printk(BIOS_ERR, "%s: reg = 0x%02X, value = 0x%02X failed!\n", - __func__, reg, val); + if (i2c_readb(bus, PAGE_ADDR(reg), PAGE_OFFSET(reg), data)) { + printk(BIOS_ERR, "%s: page = 0x%02X, reg = 0x%02X failed!\n", + __func__, PAGE_ADDR(reg), PAGE_OFFSET(reg)); + return -1; + } + return 0; +} + +void pmic_write_reg(unsigned bus, uint16_t reg, uint8_t val, int delay) +{ + if (i2c_writeb(bus, PAGE_ADDR(reg), PAGE_OFFSET(reg), val)) { + printk(BIOS_ERR, "%s: page = 0x%02X, reg = 0x%02X, " + "value = 0x%02X failed!\n", + __func__, PAGE_ADDR(reg), PAGE_OFFSET(reg), val); /* Reset the SoC on any PMIC write error */ cpu_reset(); } else { @@ -71,14 +79,12 @@ static void pmic_slam_defaults(unsigned bus) void pmic_init(unsigned bus) { - /* Don't need to set up VDD_CORE - already done - by EC ?? */ - /* Restore PMIC POR defaults, in case kernel changed 'em */ pmic_slam_defaults(bus); /* A44: Set VDD_CPU to 1.0V. */ - pmic_write_reg(bus, TI65913_SMPS12_CTRL, 0x01, 1); pmic_write_reg(bus, TI65913_SMPS12_VOLTAGE, 0x38, 0); + pmic_write_reg(bus, TI65913_SMPS12_CTRL, 0x01, 1); printk(BIOS_DEBUG, "PMIC init done\n"); } diff --git a/src/mainboard/google/rush_ryu/pmic.h b/src/mainboard/google/rush_ryu/pmic.h index 83afc4ecbe..b32211e650 100644 --- a/src/mainboard/google/rush_ryu/pmic.h +++ b/src/mainboard/google/rush_ryu/pmic.h @@ -22,41 +22,47 @@ #include <stdint.h> -/* A44/Ryu has a TI 65913 PMIC */ +/* A44/Ryu has a TI 65913 PMIC on bus 4 (PWR_I2C) */ enum { - TI65913_SMPS12_CTRL = 0x20, + TI65913_I2C_ADDR_PAGE1 = 0x58, + TI65913_I2C_ADDR_PAGE2 = 0x59 +}; + +enum { + /* Registers in PAGE1 */ + TI65913_SMPS12_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x20, TI65913_SMPS12_TSTEP, TI65913_SMPS12_FORCE, TI65913_SMPS12_VOLTAGE, TI65913_SMPS3_CTRL, - TI65913_SMPS3_VOLTAGE = 0x27, + TI65913_SMPS3_VOLTAGE = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x27, - TI65913_SMPS45_CTRL = 0x28, + TI65913_SMPS45_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x28, TI65913_SMPS45_TSTEP, TI65913_SMPS45_FORCE, TI65913_SMPS45_VOLTAGE, - TI65913_SMPS6_CTRL = 0x2C, + TI65913_SMPS6_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x2C, TI65913_SMPS6_TSTEP, TI65913_SMPS6_FORCE, TI65913_SMPS6_VOLTAGE, - TI65913_SMPS7_CTRL = 0x30, - TI65913_SMPS7_VOLTAGE = 0x33, + TI65913_SMPS7_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x30, + TI65913_SMPS7_VOLTAGE = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x33, - TI65913_SMPS8_CTRL = 0x34, + TI65913_SMPS8_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x34, TI65913_SMPS8_TSTEP, TI65913_SMPS8_FORCE, TI65913_SMPS8_VOLTAGE, - TI65913_SMPS9_CTRL = 0x38, - TI65913_SMPS9_VOLTAGE = 0x3B, + TI65913_SMPS9_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x38, + TI65913_SMPS9_VOLTAGE = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x3B, - TI65913_SMPS10_CTRL = 0x3C, - TI65913_SMPS10_STATUS = 0x3F, + TI65913_SMPS10_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x3C, + TI65913_SMPS10_STATUS = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x3F, - TI65913_LDO1_CTRL = 0x50, + TI65913_LDO1_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x50, TI65913_LDO1_VOLTAGE, TI65913_LDO2_CTRL, TI65913_LDO2_VOLTAGE, @@ -75,24 +81,55 @@ enum { TI65913_LDO9_CTRL, TI65913_LDO9_VOLTAGE, - TI65913_LDOLN_CTRL = 0x62, - TI65913_LDOLN_VOLTAGE = 0x63, - TI65913_LDOUSB_CTRL = 0x64, - TI65913_LDOUSB_VOLTAGE = 0x65, + TI65913_LDOLN_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x62, + TI65913_LDOLN_VOLTAGE, + TI65913_LDOUSB_CTRL, + TI65913_LDOUSB_VOLTAGE, + + TI65913_LDO_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x6A, + TI65913_LDO_PD_CTRL1, + TI65913_LDO_PD_CTRL2, - TI65913_LDO_CTRL = 0x6A, - TI65913_LDO_PD_CTRL1 = 0x6B, - TI65913_LDO_PD_CTRL2 = 0x6C, + TI65913_LDO_SHORT_STATUS1 = (TI65913_I2C_ADDR_PAGE1 << 8) | 0x6D, + TI65913_LDO_SHORT_STATUS2, - TI65913_LDO_SHORT_STATUS1 = 0x6D, - TI65913_LDO_SHORT_STATUS2 = 0x6E, + TI65913_CLK32KGAUDIO_CTRL = (TI65913_I2C_ADDR_PAGE1 << 8) | 0xD5, - TI65913_CLK32KGAUDIO_CTRL = 0xD5, + TI65913_PAD2 = (TI65913_I2C_ADDR_PAGE1 << 8) | 0xFB, - TI65913_PRIMARY_SECONDARY_PAD2 = 0xFB, + /* Registers in PAGE2 */ + TI65913_GPIO_DATA_IN = (TI65913_I2C_ADDR_PAGE2 << 8) | 0x80, + TI65913_GPIO_DATA_DIR, + TI65913_GPIO_DATA_OUT, }; -void pmic_write_reg(unsigned bus, uint8_t reg, uint8_t val, int delay); +/* Voltage selection */ +enum { + VSEL_1200 = 0x07, +}; + +/* + * TI65913_LDO5_CTRL + * TI65913_CLK32KGAUDIO_CTRL + */ +#define TI65913_MODE_ACTIVE_ON (1 << 0) + +/* + * select PRIMARY or SECONDARY function on PAD2 + */ +#define PAD2_GPIO_6_PRIMARY(data) \ + ((data) & ~(1 << 3)) /* clear bit 3 */ +#define PAD2_GPIO_5_SEC_CLK32KGAUDIO(data) \ + (((data) & ~(0x03 << 1)) | (0x01 << 1)) /* bit 2:1 = 01 */ + +/* TI65913_GPIO_DATA_DIR */ +#define TI65913_GPIO_6_OUTPUT (1 << 6) + +/* TI65913_GPIO_DATA_OUT */ +#define TI65913_GPIO_6_HIGH (1 << 6) + +int pmic_read_reg(unsigned bus, uint16_t reg, uint8_t *data); +void pmic_write_reg(unsigned bus, uint16_t reg, uint8_t val, int delay); void pmic_init(unsigned bus); #endif /* __MAINBOARD_GOOGLE_RUSH_RYU_PMIC_H__ */ diff --git a/src/mainboard/google/rush_ryu/romstage.c b/src/mainboard/google/rush_ryu/romstage.c index 4a13b898c4..a54a5cac2f 100644 --- a/src/mainboard/google/rush_ryu/romstage.c +++ b/src/mainboard/google/rush_ryu/romstage.c @@ -19,6 +19,7 @@ #include <delay.h> #include <soc/addressmap.h> +#include <device/i2c.h> #include <soc/clock.h> #include <soc/funitcfg.h> #include <soc/nvidia/tegra/i2c.h> @@ -67,6 +68,7 @@ static const struct funit_cfg funits[] = { static void lte_modem_init(void) { int mdm_det; + uint8_t data; /* A LTE modem is present if MDM_DET is pulled down by the modem */ mdm_det = gpio_get(MDM_DET); @@ -76,8 +78,11 @@ static void lte_modem_init(void) printk(BIOS_DEBUG, "Found LTE modem\n"); /* Enable PMIC CLK32KGAUDIO to drive CLK_MDM_32K */ - pmic_write_reg(I2CPWR_BUS, TI65913_PRIMARY_SECONDARY_PAD2, 0x02, 0); - pmic_write_reg(I2CPWR_BUS, TI65913_CLK32KGAUDIO_CTRL, 0x01, 0); + pmic_read_reg(I2CPWR_BUS, TI65913_PAD2, &data); + pmic_write_reg(I2CPWR_BUS, TI65913_PAD2, + PAD2_GPIO_5_SEC_CLK32KGAUDIO(data), 0); + pmic_write_reg(I2CPWR_BUS, TI65913_CLK32KGAUDIO_CTRL, + TI65913_MODE_ACTIVE_ON, 0); /* FULL_CARD_POWER_OFF# (A44: MODEM_PWR_ON) and RESET# * (A44: MODEM_RESET) of the LTE modem are actively low and initially |