1242b2f0cSPeter Griffin /* 2242b2f0cSPeter Griffin * Copyright (C) 2015 Linaro 3242b2f0cSPeter Griffin * Peter Griffin <peter.griffin@linaro.org> 4242b2f0cSPeter Griffin * 5242b2f0cSPeter Griffin * SPDX-License-Identifier: GPL-2.0+ 6242b2f0cSPeter Griffin */ 7242b2f0cSPeter Griffin #include <asm/io.h> 8242b2f0cSPeter Griffin #include <common.h> 9242b2f0cSPeter Griffin #include <power/pmic.h> 10242b2f0cSPeter Griffin #include <power/max8997_muic.h> 11242b2f0cSPeter Griffin #include <power/hi6553_pmic.h> 12242b2f0cSPeter Griffin #include <errno.h> 13242b2f0cSPeter Griffin 14242b2f0cSPeter Griffin u8 *pmussi_base; 15242b2f0cSPeter Griffin 16242b2f0cSPeter Griffin uint8_t hi6553_readb(u32 offset) 17242b2f0cSPeter Griffin { 18242b2f0cSPeter Griffin return readb(pmussi_base + (offset << 2)); 19242b2f0cSPeter Griffin } 20242b2f0cSPeter Griffin 21242b2f0cSPeter Griffin void hi6553_writeb(u32 offset, uint8_t value) 22242b2f0cSPeter Griffin { 23242b2f0cSPeter Griffin writeb(value, pmussi_base + (offset << 2)); 24242b2f0cSPeter Griffin } 25242b2f0cSPeter Griffin 26242b2f0cSPeter Griffin int pmic_reg_write(struct pmic *p, u32 reg, u32 val) 27242b2f0cSPeter Griffin { 28242b2f0cSPeter Griffin if (check_reg(p, reg)) 29*505cf475SJaehoon Chung return -EINVAL; 30242b2f0cSPeter Griffin 31242b2f0cSPeter Griffin hi6553_writeb(reg, (uint8_t)val); 32242b2f0cSPeter Griffin 33242b2f0cSPeter Griffin return 0; 34242b2f0cSPeter Griffin } 35242b2f0cSPeter Griffin 36242b2f0cSPeter Griffin int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) 37242b2f0cSPeter Griffin { 38242b2f0cSPeter Griffin if (check_reg(p, reg)) 39*505cf475SJaehoon Chung return -EINVAL; 40242b2f0cSPeter Griffin 41242b2f0cSPeter Griffin *val = (u32)hi6553_readb(reg); 42242b2f0cSPeter Griffin 43242b2f0cSPeter Griffin return 0; 44242b2f0cSPeter Griffin } 45242b2f0cSPeter Griffin 46242b2f0cSPeter Griffin static void hi6553_init(void) 47242b2f0cSPeter Griffin { 48242b2f0cSPeter Griffin int data; 49242b2f0cSPeter Griffin 50242b2f0cSPeter Griffin hi6553_writeb(HI6553_PERI_EN_MARK, 0x1e); 51242b2f0cSPeter Griffin hi6553_writeb(HI6553_NP_REG_ADJ1, 0); 52242b2f0cSPeter Griffin data = HI6553_DISABLE6_XO_CLK_CONN | HI6553_DISABLE6_XO_CLK_NFC | 53242b2f0cSPeter Griffin HI6553_DISABLE6_XO_CLK_RF1 | HI6553_DISABLE6_XO_CLK_RF2; 54242b2f0cSPeter Griffin hi6553_writeb(HI6553_DISABLE6_XO_CLK, data); 55242b2f0cSPeter Griffin 56242b2f0cSPeter Griffin /* configure BUCK0 & BUCK1 */ 57242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK01_CTRL2, 0x5e); 58242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK0_CTRL7, 0x10); 59242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK1_CTRL7, 0x10); 60242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK0_CTRL5, 0x1e); 61242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK1_CTRL5, 0x1e); 62242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK0_CTRL1, 0xfc); 63242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK1_CTRL1, 0xfc); 64242b2f0cSPeter Griffin 65242b2f0cSPeter Griffin /* configure BUCK2 */ 66242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK2_REG1, 0x4f); 67242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK2_REG5, 0x99); 68242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK2_REG6, 0x45); 69242b2f0cSPeter Griffin mdelay(1); 70242b2f0cSPeter Griffin hi6553_writeb(HI6553_VSET_BUCK2_ADJ, 0x22); 71242b2f0cSPeter Griffin mdelay(1); 72242b2f0cSPeter Griffin 73242b2f0cSPeter Griffin /* configure BUCK3 */ 74242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK3_REG3, 0x02); 75242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK3_REG5, 0x99); 76242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK3_REG6, 0x41); 77242b2f0cSPeter Griffin hi6553_writeb(HI6553_VSET_BUCK3_ADJ, 0x02); 78242b2f0cSPeter Griffin mdelay(1); 79242b2f0cSPeter Griffin 80242b2f0cSPeter Griffin /* configure BUCK4 */ 81242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK4_REG2, 0x9a); 82242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK4_REG5, 0x99); 83242b2f0cSPeter Griffin hi6553_writeb(HI6553_BUCK4_REG6, 0x45); 84242b2f0cSPeter Griffin 85242b2f0cSPeter Griffin /* configure LDO20 */ 86242b2f0cSPeter Griffin hi6553_writeb(HI6553_LDO20_REG_ADJ, 0x50); 87242b2f0cSPeter Griffin 88242b2f0cSPeter Griffin hi6553_writeb(HI6553_NP_REG_CHG, 0x0f); 89242b2f0cSPeter Griffin hi6553_writeb(HI6553_CLK_TOP0, 0x06); 90242b2f0cSPeter Griffin hi6553_writeb(HI6553_CLK_TOP3, 0xc0); 91242b2f0cSPeter Griffin hi6553_writeb(HI6553_CLK_TOP4, 0x00); 92242b2f0cSPeter Griffin 93242b2f0cSPeter Griffin /* configure LDO7 & LDO10 for SD slot */ 94242b2f0cSPeter Griffin data = hi6553_readb(HI6553_LDO7_REG_ADJ); 95242b2f0cSPeter Griffin data = (data & 0xf8) | 0x2; 96242b2f0cSPeter Griffin hi6553_writeb(HI6553_LDO7_REG_ADJ, data); 97242b2f0cSPeter Griffin mdelay(5); 98242b2f0cSPeter Griffin /* enable LDO7 */ 99242b2f0cSPeter Griffin hi6553_writeb(HI6553_ENABLE2_LDO1_8, 1 << 6); 100242b2f0cSPeter Griffin mdelay(5); 101242b2f0cSPeter Griffin data = hi6553_readb(HI6553_LDO10_REG_ADJ); 102242b2f0cSPeter Griffin data = (data & 0xf8) | 0x5; 103242b2f0cSPeter Griffin hi6553_writeb(HI6553_LDO10_REG_ADJ, data); 104242b2f0cSPeter Griffin mdelay(5); 105242b2f0cSPeter Griffin /* enable LDO10 */ 106242b2f0cSPeter Griffin hi6553_writeb(HI6553_ENABLE3_LDO9_16, 1 << 1); 107242b2f0cSPeter Griffin mdelay(5); 108242b2f0cSPeter Griffin 109242b2f0cSPeter Griffin /* select 32.764KHz */ 110242b2f0cSPeter Griffin hi6553_writeb(HI6553_CLK19M2_600_586_EN, 0x01); 111242b2f0cSPeter Griffin } 112242b2f0cSPeter Griffin 113242b2f0cSPeter Griffin int power_hi6553_init(u8 *base) 114242b2f0cSPeter Griffin { 115242b2f0cSPeter Griffin static const char name[] = "HI6553 PMIC"; 116242b2f0cSPeter Griffin struct pmic *p = pmic_alloc(); 117242b2f0cSPeter Griffin 118242b2f0cSPeter Griffin if (!p) { 119242b2f0cSPeter Griffin printf("%s: POWER allocation error!\n", __func__); 120242b2f0cSPeter Griffin return -ENOMEM; 121242b2f0cSPeter Griffin } 122242b2f0cSPeter Griffin 123242b2f0cSPeter Griffin p->name = name; 124242b2f0cSPeter Griffin p->interface = PMIC_NONE; 125242b2f0cSPeter Griffin p->number_of_regs = 44; 126242b2f0cSPeter Griffin pmussi_base = base; 127242b2f0cSPeter Griffin 128242b2f0cSPeter Griffin hi6553_init(); 129242b2f0cSPeter Griffin 130242b2f0cSPeter Griffin puts("HI6553 PMIC init\n"); 131242b2f0cSPeter Griffin 132242b2f0cSPeter Griffin return 0; 133242b2f0cSPeter Griffin } 134