1cb199102SNishanth Menon /* 2cb199102SNishanth Menon * (C) Copyright 2012-2013 3cb199102SNishanth Menon * Texas Instruments, <www.ti.com> 4cb199102SNishanth Menon * 5cb199102SNishanth Menon * See file CREDITS for list of people who contributed to this 6cb199102SNishanth Menon * project. 7cb199102SNishanth Menon * 8cb199102SNishanth Menon * This program is free software; you can redistribute it and/or 9cb199102SNishanth Menon * modify it under the terms of the GNU General Public License as 10cb199102SNishanth Menon * published by the Free Software Foundation; either version 2 of 11cb199102SNishanth Menon * the License, or (at your option) any later version. 12cb199102SNishanth Menon * 13cb199102SNishanth Menon * This program is distributed in the hope that it will be useful, 14cb199102SNishanth Menon * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cb199102SNishanth Menon * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16cb199102SNishanth Menon * GNU General Public License for more details. 17cb199102SNishanth Menon * 18cb199102SNishanth Menon * You should have received a copy of the GNU General Public License 19cb199102SNishanth Menon * along with this program; if not, write to the Free Software 20cb199102SNishanth Menon * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21cb199102SNishanth Menon * MA 02111-1307 USA 22cb199102SNishanth Menon */ 23cb199102SNishanth Menon #include <config.h> 24cb199102SNishanth Menon #include <palmas.h> 25cb199102SNishanth Menon 2612733881SNishanth Menon void palmas_init_settings(void) 27cb199102SNishanth Menon { 28*e9090fa4SLubomir Popov #ifdef CONFIG_PALMAS_SMPS7_FPWM 29*e9090fa4SLubomir Popov int err; 30*e9090fa4SLubomir Popov /* 31*e9090fa4SLubomir Popov * Set SMPS7 (1.8 V I/O supply on platforms with TWL6035/37) to 32*e9090fa4SLubomir Popov * forced PWM mode. This reduces noise (but affects efficiency). 33*e9090fa4SLubomir Popov */ 34*e9090fa4SLubomir Popov u8 val = SMPS_MODE_SLP_FPWM | SMPS_MODE_ACT_FPWM; 35*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS7_CTRL, val); 36*e9090fa4SLubomir Popov if (err) 37*e9090fa4SLubomir Popov printf("palmas: could not force PWM for SMPS7: err = %d\n", 38*e9090fa4SLubomir Popov err); 39*e9090fa4SLubomir Popov #endif 40cb199102SNishanth Menon } 41cb199102SNishanth Menon 42384bcae0SNishanth Menon int palmas_mmc1_poweron_ldo(void) 43cb199102SNishanth Menon { 44cb199102SNishanth Menon u8 val = 0; 45cb199102SNishanth Menon 46*e9090fa4SLubomir Popov #if defined(CONFIG_DRA7XX) 47*e9090fa4SLubomir Popov /* 48*e9090fa4SLubomir Popov * Currently valid for the dra7xx_evm board: 49*e9090fa4SLubomir Popov * Set TPS659038 LDO1 to 3.0 V 50*e9090fa4SLubomir Popov */ 51*e9090fa4SLubomir Popov val = LDO_VOLT_3V0; 52*e9090fa4SLubomir Popov if (palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_VOLTAGE, val)) { 53*e9090fa4SLubomir Popov printf("tps65903x: could not set LDO1 voltage.\n"); 54cb199102SNishanth Menon return 1; 55cb199102SNishanth Menon } 56*e9090fa4SLubomir Popov /* TURN ON LDO1 */ 57*e9090fa4SLubomir Popov val = RSC_MODE_SLEEP | RSC_MODE_ACTIVE; 58*e9090fa4SLubomir Popov if (palmas_i2c_write_u8(TPS65903X_CHIP_P1, LDO1_CTRL, val)) { 59*e9090fa4SLubomir Popov printf("tps65903x: could not turn on LDO1.\n"); 60cb199102SNishanth Menon return 1; 61cb199102SNishanth Menon } 62cb199102SNishanth Menon return 0; 63*e9090fa4SLubomir Popov #else 64*e9090fa4SLubomir Popov /* 65*e9090fa4SLubomir Popov * We assume that this is a OMAP543X + TWL603X board: 66*e9090fa4SLubomir Popov * Set TWL6035/37 LDO9 to 3.0 V 67*e9090fa4SLubomir Popov */ 68*e9090fa4SLubomir Popov val = LDO_VOLT_3V0; 69*e9090fa4SLubomir Popov return twl603x_mmc1_set_ldo9(val); 70*e9090fa4SLubomir Popov #endif 71*e9090fa4SLubomir Popov } 72*e9090fa4SLubomir Popov 73*e9090fa4SLubomir Popov /* 74*e9090fa4SLubomir Popov * On some OMAP5 + TWL603X hardware the SD card socket and LDO9_IN are 75*e9090fa4SLubomir Popov * powered by an external 3.3 V regulator, while the output of LDO9 76*e9090fa4SLubomir Popov * supplies VDDS_SDCARD for the OMAP5 interface only. This implies that 77*e9090fa4SLubomir Popov * LDO9 could be set to 'bypass' mode when required (e.g. for 3.3 V cards). 78*e9090fa4SLubomir Popov */ 79*e9090fa4SLubomir Popov int twl603x_mmc1_set_ldo9(u8 vsel) 80*e9090fa4SLubomir Popov { 81*e9090fa4SLubomir Popov u8 cval = 0, vval = 0; /* Off by default */ 82*e9090fa4SLubomir Popov int err; 83*e9090fa4SLubomir Popov 84*e9090fa4SLubomir Popov if (vsel) { 85*e9090fa4SLubomir Popov /* Turn on */ 86*e9090fa4SLubomir Popov if (vsel > LDO_VOLT_3V3) { 87*e9090fa4SLubomir Popov /* Put LDO9 in bypass */ 88*e9090fa4SLubomir Popov cval = LDO9_BYP_EN | RSC_MODE_SLEEP | RSC_MODE_ACTIVE; 89*e9090fa4SLubomir Popov vval = LDO_VOLT_3V3; 90*e9090fa4SLubomir Popov } else { 91*e9090fa4SLubomir Popov cval = RSC_MODE_SLEEP | RSC_MODE_ACTIVE; 92*e9090fa4SLubomir Popov vval = vsel & 0x3f; 93*e9090fa4SLubomir Popov } 94*e9090fa4SLubomir Popov } 95*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, LDO9_VOLTAGE, vval); 96*e9090fa4SLubomir Popov if (err) { 97*e9090fa4SLubomir Popov printf("twl603x: could not set LDO9 %s: err = %d\n", 98*e9090fa4SLubomir Popov vsel > LDO_VOLT_3V3 ? "bypass" : "voltage", err); 99*e9090fa4SLubomir Popov return err; 100*e9090fa4SLubomir Popov } 101*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, LDO9_CTRL, cval); 102*e9090fa4SLubomir Popov if (err) 103*e9090fa4SLubomir Popov printf("twl603x: could not turn %s LDO9: err = %d\n", 104*e9090fa4SLubomir Popov cval ? "on" : "off", err); 105*e9090fa4SLubomir Popov return err; 106*e9090fa4SLubomir Popov } 107*e9090fa4SLubomir Popov 108*e9090fa4SLubomir Popov #ifdef CONFIG_PALMAS_AUDPWR 109*e9090fa4SLubomir Popov /* 110*e9090fa4SLubomir Popov * Turn audio codec power and 32 kHz clock on/off. Use for 111*e9090fa4SLubomir Popov * testing OMAP543X + TWL603X + TWL604X boards only. 112*e9090fa4SLubomir Popov */ 113*e9090fa4SLubomir Popov int twl603x_audio_power(u8 on) 114*e9090fa4SLubomir Popov { 115*e9090fa4SLubomir Popov u8 cval = 0, vval = 0, c32k = 0; 116*e9090fa4SLubomir Popov int err; 117*e9090fa4SLubomir Popov 118*e9090fa4SLubomir Popov if (on) { 119*e9090fa4SLubomir Popov vval = SMPS_VOLT_2V1; 120*e9090fa4SLubomir Popov cval = SMPS_MODE_SLP_AUTO | SMPS_MODE_ACT_AUTO; 121*e9090fa4SLubomir Popov c32k = RSC_MODE_SLEEP | RSC_MODE_ACTIVE; 122*e9090fa4SLubomir Popov } 123*e9090fa4SLubomir Popov /* Set SMPS9 to 2.1 V (for TWL604x), or to 0 (off) */ 124*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS9_VOLTAGE, vval); 125*e9090fa4SLubomir Popov if (err) { 126*e9090fa4SLubomir Popov printf("twl603x: could not set SMPS9 voltage: err = %d\n", 127*e9090fa4SLubomir Popov err); 128*e9090fa4SLubomir Popov return err; 129*e9090fa4SLubomir Popov } 130*e9090fa4SLubomir Popov /* Turn on or off SMPS9 */ 131*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, SMPS9_CTRL, cval); 132*e9090fa4SLubomir Popov if (err) { 133*e9090fa4SLubomir Popov printf("twl603x: could not turn SMPS9 %s: err = %d\n", 134*e9090fa4SLubomir Popov cval ? "on" : "off", err); 135*e9090fa4SLubomir Popov return err; 136*e9090fa4SLubomir Popov } 137*e9090fa4SLubomir Popov /* Output 32 kHz clock on or off */ 138*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, CLK32KGAUDIO_CTRL, c32k); 139*e9090fa4SLubomir Popov if (err) 140*e9090fa4SLubomir Popov printf("twl603x: could not turn CLK32KGAUDIO %s: err = %d\n", 141*e9090fa4SLubomir Popov c32k ? "on" : "off", err); 142*e9090fa4SLubomir Popov return err; 143*e9090fa4SLubomir Popov } 144*e9090fa4SLubomir Popov #endif 145*e9090fa4SLubomir Popov 146*e9090fa4SLubomir Popov /* 147*e9090fa4SLubomir Popov * Enable/disable back-up battery (or super cap) charging on TWL6035/37. 148*e9090fa4SLubomir Popov * Please use defined BB_xxx values. 149*e9090fa4SLubomir Popov */ 150*e9090fa4SLubomir Popov int twl603x_enable_bb_charge(u8 bb_fields) 151*e9090fa4SLubomir Popov { 152*e9090fa4SLubomir Popov u8 val = bb_fields & 0x0f; 153*e9090fa4SLubomir Popov int err; 154*e9090fa4SLubomir Popov 155*e9090fa4SLubomir Popov val |= (VRTC_EN_SLP | VRTC_EN_OFF | VRTC_PWEN); 156*e9090fa4SLubomir Popov err = palmas_i2c_write_u8(TWL603X_CHIP_P1, BB_VRTC_CTRL, val); 157*e9090fa4SLubomir Popov if (err) 158*e9090fa4SLubomir Popov printf("twl603x: could not set BB_VRTC_CTRL to 0x%02x: err = %d\n", 159*e9090fa4SLubomir Popov val, err); 160*e9090fa4SLubomir Popov return err; 161cb199102SNishanth Menon } 162