/** * scale_vcore_omap4470() - Scale for OMAP4470 * @rev: OMAP chip revision * * PMIC assumed to be used is TWL6032 */ static void scale_vcore_omap4470(unsigned int rev) { /* vdd_core - SMPS 2 - OPP100-OV - 1.25V */ omap_vc_bypass_send_value(TWL6032_SRI2C_SLAVE_ADDR, TWL6032_SRI2C_REG_ADDR_SMPS2, 0x2C); /* vdd_mpu - SMPS 1 - OPP100 - 1.2027V */ omap_vc_bypass_send_value(TWL6032_SRI2C_SLAVE_ADDR, TWL6032_SRI2C_REG_ADDR_SMPS1, 0x28); /* vdd_iva - SMPS 5 - OPP50 - 0.950V */ omap_vc_bypass_send_value(TWL6032_SRI2C_SLAVE_ADDR, TWL6032_SRI2C_REG_ADDR_SMPS5, 0x14); }
void do_scale_vcore(u32 vcore_reg, u32 volt_mv, struct pmic_data *pmic) { u32 offset_code; u32 offset = volt_mv; int ret = 0; /* See if we can first get the GPIO if needed */ if (pmic->gpio_en) ret = gpio_request(pmic->gpio, "PMIC_GPIO"); if (ret < 0) { printf("%s: gpio %d request failed %d\n", __func__, pmic->gpio, ret); return; } /* Pull the GPIO low to select SET0 register, while we program SET1 */ if (pmic->gpio_en) gpio_direction_output(pmic->gpio, 0); /* convert to uV for better accuracy in the calculations */ offset *= 1000; offset_code = get_offset_code(offset, pmic); debug("do_scale_vcore: volt - %d offset_code - 0x%x\n", volt_mv, offset_code); if (omap_vc_bypass_send_value(SMPS_I2C_SLAVE_ADDR, vcore_reg, offset_code)) printf("Scaling voltage failed for 0x%x\n", vcore_reg); if (pmic->gpio_en) gpio_direction_output(pmic->gpio, 1); }
/** * scale_vcore_omap4430() - Scale for OMAP4430 * @rev: OMAP chip revision * * PMIC assumed to be used is TWL6030 */ static void scale_vcore_omap4430(unsigned int rev) { u8 vsel; /* vdd_core - VCORE 3 - OPP100 - ES2+: 1.127 */ vsel = (rev == OMAP_4430_ES1_DOT_0) ? 0x31 : 0x22; omap_vc_bypass_send_value(TWL6030_SRI2C_SLAVE_ADDR, TWL6030_SRI2C_REG_ADDR_VCORE3, vsel); /* vdd_mpu - VCORE 1 - OPP100 - ES2+: 1.2027 */ vsel = (rev == OMAP_4430_ES1_DOT_0) ? 0x3B : 0x28; omap_vc_bypass_send_value(TWL6030_SRI2C_SLAVE_ADDR, TWL6030_SRI2C_REG_ADDR_VCORE1, vsel); /* vdd_iva - VCORE 2 - OPP50 - ES2+: 0.950V */ vsel = (rev == OMAP_4430_ES1_DOT_0) ? 0x31 : 0x14; omap_vc_bypass_send_value(TWL6030_SRI2C_SLAVE_ADDR, TWL6030_SRI2C_REG_ADDR_VCORE2, vsel); }
/** * scale_vcore_omap4460() - Scale for OMAP4460 * @rev: OMAP chip revision * * PMIC assumed to be used is TWL6030 + TPS62361 */ static void scale_vcore_omap4460(unsigned int rev) { u32 volt; /* vdd_core - TWL6030 VCORE 1 - OPP100 - 1.127V */ omap_vc_bypass_send_value(TWL6030_SRI2C_SLAVE_ADDR, TWL6030_SRI2C_REG_ADDR_VCORE1, 0x22); /* WKUP clocks */ set_modify(CM_WKUP_GPIO1_CLKCTRL, 0x00000000, 0x1); check_loop(BIT17|BIT16, 0, CM_WKUP_GPIO1_CLKCTRL); /* vdd_mpu - TPS62361 - OPP100 - 1.210V (roundup from 1.2V) */ volt = 1210; volt -= TPS62361_BASE_VOLT_MV; volt /= 10; do_scale_tps62361(TPS62361_REG_ADDR_SET1, volt); /* vdd_iva - TWL6030 VCORE 2 - OPP50 - 0.950V */ omap_vc_bypass_send_value(TWL6030_SRI2C_SLAVE_ADDR, TWL6030_SRI2C_REG_ADDR_VCORE2, 0x14); }
static void do_scale_tps62361(u32 reg, u32 val) { u32 l = 0; /* * Select SET1 in TPS62361: * VSEL1 is grounded on board. So the following selects * VSEL1 = 0 and VSEL0 = 1 */ /* set GPIO-7 direction as output */ l = readl(0x4A310134); l &= ~(1 << TPS62361_VSEL0_GPIO); writel(l, 0x4A310134); omap_vc_bypass_send_value(TPS62361_I2C_SLAVE_ADDR, reg, val); /* set GPIO-7 data-out */ l = 1 << TPS62361_VSEL0_GPIO; writel(l, 0x4A310194); }