1cd782635STom Rix /* 2cd782635STom Rix * Copyright (c) 2009 Wind River Systems, Inc. 3cd782635STom Rix * Tom Rix <Tom.Rix at windriver.com> 4cd782635STom Rix * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6cd782635STom Rix * 72c155130STom Rix * twl4030_power_reset_init is derived from code on omapzoom, 82c155130STom Rix * git://git.omapzoom.com/repo/u-boot.git 9cd782635STom Rix * 10cd782635STom Rix * Copyright (C) 2007-2009 Texas Instruments, Inc. 112c155130STom Rix * 122c155130STom Rix * twl4030_power_init is from cpu/omap3/common.c, power_init_r 132c155130STom Rix * 142c155130STom Rix * (C) Copyright 2004-2008 152c155130STom Rix * Texas Instruments, <www.ti.com> 162c155130STom Rix * 172c155130STom Rix * Author : 182c155130STom Rix * Sunil Kumar <sunilsaini05 at gmail.com> 192c155130STom Rix * Shashi Ranjan <shashiranjanmca05 at gmail.com> 202c155130STom Rix * 212c155130STom Rix * Derived from Beagle Board and 3430 SDP code by 222c155130STom Rix * Richard Woodruff <r-woodruff2 at ti.com> 232c155130STom Rix * Syed Mohammed Khasim <khasim at ti.com> 24cd782635STom Rix */ 25cd782635STom Rix 26cd782635STom Rix #include <twl4030.h> 27cd782635STom Rix 28cd782635STom Rix /* 29cd782635STom Rix * Power Reset 30cd782635STom Rix */ 31cd782635STom Rix void twl4030_power_reset_init(void) 32cd782635STom Rix { 33cd782635STom Rix u8 val = 0; 34b29c2f0cSNishanth Menon if (twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 35b29c2f0cSNishanth Menon TWL4030_PM_MASTER_P1_SW_EVENTS, &val)) { 36cd782635STom Rix printf("Error:TWL4030: failed to read the power register\n"); 37cd782635STom Rix printf("Could not initialize hardware reset\n"); 38cd782635STom Rix } else { 39cd782635STom Rix val |= TWL4030_PM_MASTER_SW_EVENTS_STOPON_PWRON; 400208aaf6SNishanth Menon if (twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 410208aaf6SNishanth Menon TWL4030_PM_MASTER_P1_SW_EVENTS, val)) { 42cd782635STom Rix printf("Error:TWL4030: failed to write the power register\n"); 43cd782635STom Rix printf("Could not initialize hardware reset\n"); 44cd782635STom Rix } 45cd782635STom Rix } 46cd782635STom Rix } 47cd782635STom Rix 482c155130STom Rix /* 49*6dc443e6SPaul Kocialkowski * Power off 50*6dc443e6SPaul Kocialkowski */ 51*6dc443e6SPaul Kocialkowski void twl4030_power_off(void) 52*6dc443e6SPaul Kocialkowski { 53*6dc443e6SPaul Kocialkowski u8 data; 54*6dc443e6SPaul Kocialkowski 55*6dc443e6SPaul Kocialkowski /* PM master unlock (CFG and TST keys) */ 56*6dc443e6SPaul Kocialkowski 57*6dc443e6SPaul Kocialkowski data = 0xCE; 58*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 59*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_PROTECT_KEY, data); 60*6dc443e6SPaul Kocialkowski data = 0xEC; 61*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 62*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_PROTECT_KEY, data); 63*6dc443e6SPaul Kocialkowski 64*6dc443e6SPaul Kocialkowski /* VBAT start disable */ 65*6dc443e6SPaul Kocialkowski 66*6dc443e6SPaul Kocialkowski twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 67*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P1_TRANSITION, &data); 68*6dc443e6SPaul Kocialkowski data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; 69*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 70*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P1_TRANSITION, data); 71*6dc443e6SPaul Kocialkowski 72*6dc443e6SPaul Kocialkowski twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 73*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P2_TRANSITION, &data); 74*6dc443e6SPaul Kocialkowski data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; 75*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 76*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P2_TRANSITION, data); 77*6dc443e6SPaul Kocialkowski 78*6dc443e6SPaul Kocialkowski twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 79*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P3_TRANSITION, &data); 80*6dc443e6SPaul Kocialkowski data &= ~TWL4030_PM_MASTER_CFG_TRANSITION_STARTON_VBAT; 81*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 82*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_P3_TRANSITION, data); 83*6dc443e6SPaul Kocialkowski 84*6dc443e6SPaul Kocialkowski /* High jitter for PWRANA2 */ 85*6dc443e6SPaul Kocialkowski 86*6dc443e6SPaul Kocialkowski twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 87*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_PWRANA2, &data); 88*6dc443e6SPaul Kocialkowski data &= ~(TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT0_LOWV | 89*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_PWRANA2_LOJIT1_LOWV); 90*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 91*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_CFG_PWRANA2, data); 92*6dc443e6SPaul Kocialkowski 93*6dc443e6SPaul Kocialkowski /* PM master lock */ 94*6dc443e6SPaul Kocialkowski 95*6dc443e6SPaul Kocialkowski data = 0xFF; 96*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 97*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_PROTECT_KEY, data); 98*6dc443e6SPaul Kocialkowski 99*6dc443e6SPaul Kocialkowski /* Power off */ 100*6dc443e6SPaul Kocialkowski 101*6dc443e6SPaul Kocialkowski twl4030_i2c_read_u8(TWL4030_CHIP_PM_MASTER, 102*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_P1_SW_EVENTS, &data); 103*6dc443e6SPaul Kocialkowski data |= TWL4030_PM_MASTER_SW_EVENTS_DEVOFF; 104*6dc443e6SPaul Kocialkowski twl4030_i2c_write_u8(TWL4030_CHIP_PM_MASTER, 105*6dc443e6SPaul Kocialkowski TWL4030_PM_MASTER_P1_SW_EVENTS, data); 106*6dc443e6SPaul Kocialkowski } 107*6dc443e6SPaul Kocialkowski 108*6dc443e6SPaul Kocialkowski /* 1095a0a82f4SSteve Sakoman * Set Device Group and Voltage 1102c155130STom Rix */ 1115a0a82f4SSteve Sakoman void twl4030_pmrecv_vsel_cfg(u8 vsel_reg, u8 vsel_val, 1125a0a82f4SSteve Sakoman u8 dev_grp, u8 dev_grp_sel) 1135a0a82f4SSteve Sakoman { 11461712bcaSGrazvydas Ignotas int ret; 1155a0a82f4SSteve Sakoman 1165a0a82f4SSteve Sakoman /* Select the Voltage */ 1170208aaf6SNishanth Menon ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, vsel_reg, 1180208aaf6SNishanth Menon vsel_val); 11961712bcaSGrazvydas Ignotas if (ret != 0) { 120dfe36109SPeter Meerwald printf("Could not write vsel to reg %02x (%d)\n", 12161712bcaSGrazvydas Ignotas vsel_reg, ret); 12261712bcaSGrazvydas Ignotas return; 12361712bcaSGrazvydas Ignotas } 12461712bcaSGrazvydas Ignotas 12561712bcaSGrazvydas Ignotas /* Select the Device Group (enable the supply if dev_grp_sel != 0) */ 1260208aaf6SNishanth Menon ret = twl4030_i2c_write_u8(TWL4030_CHIP_PM_RECEIVER, dev_grp, 1270208aaf6SNishanth Menon dev_grp_sel); 12861712bcaSGrazvydas Ignotas if (ret != 0) 129dfe36109SPeter Meerwald printf("Could not write grp_sel to reg %02x (%d)\n", 13061712bcaSGrazvydas Ignotas dev_grp, ret); 1315a0a82f4SSteve Sakoman } 1322c155130STom Rix 1332c155130STom Rix void twl4030_power_init(void) 1342c155130STom Rix { 1352c155130STom Rix /* set VAUX3 to 2.8V */ 1365a0a82f4SSteve Sakoman twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VAUX3_DEDICATED, 1375a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VAUX3_VSEL_28, 1385a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VAUX3_DEV_GRP, 1395a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_DEV_GRP_P1); 1402c155130STom Rix 1412c155130STom Rix /* set VPLL2 to 1.8V */ 1425a0a82f4SSteve Sakoman twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VPLL2_DEDICATED, 1435a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VPLL2_VSEL_18, 1445a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VPLL2_DEV_GRP, 1455a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_DEV_GRP_ALL); 1462c155130STom Rix 1472c155130STom Rix /* set VDAC to 1.8V */ 1485a0a82f4SSteve Sakoman twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VDAC_DEDICATED, 1495a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VDAC_VSEL_18, 1505a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VDAC_DEV_GRP, 1515a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_DEV_GRP_P1); 1522c155130STom Rix } 1532c155130STom Rix 154f3e85e48SPaul Kocialkowski void twl4030_power_mmc_init(int dev_index) 155fccc0fcaSTom Rix { 156f3e85e48SPaul Kocialkowski if (dev_index == 0) { 157528cdcaaSAsh Charles /* Set VMMC1 to 3.15 Volts */ 1585a0a82f4SSteve Sakoman twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VMMC1_DEDICATED, 159528cdcaaSAsh Charles TWL4030_PM_RECEIVER_VMMC1_VSEL_32, 1605a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_VMMC1_DEV_GRP, 1615a0a82f4SSteve Sakoman TWL4030_PM_RECEIVER_DEV_GRP_P1); 1622ed8c878SPaul Kocialkowski 163f3e85e48SPaul Kocialkowski mdelay(100); /* ramp-up delay from Linux code */ 164f3e85e48SPaul Kocialkowski } else if (dev_index == 1) { 1652ed8c878SPaul Kocialkowski /* Set VMMC2 to 3.15 Volts */ 1662ed8c878SPaul Kocialkowski twl4030_pmrecv_vsel_cfg(TWL4030_PM_RECEIVER_VMMC2_DEDICATED, 1672ed8c878SPaul Kocialkowski TWL4030_PM_RECEIVER_VMMC2_VSEL_32, 1682ed8c878SPaul Kocialkowski TWL4030_PM_RECEIVER_VMMC2_DEV_GRP, 1692ed8c878SPaul Kocialkowski TWL4030_PM_RECEIVER_DEV_GRP_P1); 170f3e85e48SPaul Kocialkowski 171f3e85e48SPaul Kocialkowski mdelay(100); /* ramp-up delay from Linux code */ 172f3e85e48SPaul Kocialkowski } 173fccc0fcaSTom Rix } 174