15051ff5fSYe.Li /*
25051ff5fSYe.Li * Copyright 2014 Freescale Semiconductor, Inc.
35051ff5fSYe.Li *
45051ff5fSYe.Li * SPDX-License-Identifier: GPL-2.0+
55051ff5fSYe.Li */
65051ff5fSYe.Li
75051ff5fSYe.Li #include <common.h>
87428f55cSPeng Fan #include <errno.h>
95051ff5fSYe.Li #include <power/pmic.h>
105051ff5fSYe.Li #include <power/pfuze100_pmic.h>
115051ff5fSYe.Li
12125914d4SPeng Fan #ifndef CONFIG_DM_PMIC_PFUZE100
pfuze_mode_init(struct pmic * p,u32 mode)137428f55cSPeng Fan int pfuze_mode_init(struct pmic *p, u32 mode)
147428f55cSPeng Fan {
157428f55cSPeng Fan unsigned char offset, i, switch_num;
16*7ea191aaSYe.Li u32 id;
17*7ea191aaSYe.Li int ret;
187428f55cSPeng Fan
197428f55cSPeng Fan pmic_reg_read(p, PFUZE100_DEVICEID, &id);
207428f55cSPeng Fan id = id & 0xf;
217428f55cSPeng Fan
227428f55cSPeng Fan if (id == 0) {
237428f55cSPeng Fan switch_num = 6;
247428f55cSPeng Fan offset = PFUZE100_SW1CMODE;
257428f55cSPeng Fan } else if (id == 1) {
267428f55cSPeng Fan switch_num = 4;
277428f55cSPeng Fan offset = PFUZE100_SW2MODE;
287428f55cSPeng Fan } else {
297428f55cSPeng Fan printf("Not supported, id=%d\n", id);
307428f55cSPeng Fan return -EINVAL;
317428f55cSPeng Fan }
327428f55cSPeng Fan
337428f55cSPeng Fan ret = pmic_reg_write(p, PFUZE100_SW1ABMODE, mode);
347428f55cSPeng Fan if (ret < 0) {
357428f55cSPeng Fan printf("Set SW1AB mode error!\n");
367428f55cSPeng Fan return ret;
377428f55cSPeng Fan }
387428f55cSPeng Fan
397428f55cSPeng Fan for (i = 0; i < switch_num - 1; i++) {
407428f55cSPeng Fan ret = pmic_reg_write(p, offset + i * SWITCH_SIZE, mode);
417428f55cSPeng Fan if (ret < 0) {
427428f55cSPeng Fan printf("Set switch 0x%x mode error!\n",
437428f55cSPeng Fan offset + i * SWITCH_SIZE);
447428f55cSPeng Fan return ret;
457428f55cSPeng Fan }
467428f55cSPeng Fan }
477428f55cSPeng Fan
487428f55cSPeng Fan return ret;
497428f55cSPeng Fan }
507428f55cSPeng Fan
pfuze_common_init(unsigned char i2cbus)515051ff5fSYe.Li struct pmic *pfuze_common_init(unsigned char i2cbus)
525051ff5fSYe.Li {
535051ff5fSYe.Li struct pmic *p;
545051ff5fSYe.Li int ret;
555051ff5fSYe.Li unsigned int reg;
565051ff5fSYe.Li
575051ff5fSYe.Li ret = power_pfuze100_init(i2cbus);
585051ff5fSYe.Li if (ret)
595051ff5fSYe.Li return NULL;
605051ff5fSYe.Li
615051ff5fSYe.Li p = pmic_get("PFUZE100");
625051ff5fSYe.Li ret = pmic_probe(p);
635051ff5fSYe.Li if (ret)
645051ff5fSYe.Li return NULL;
655051ff5fSYe.Li
665051ff5fSYe.Li pmic_reg_read(p, PFUZE100_DEVICEID, ®);
675051ff5fSYe.Li printf("PMIC: PFUZE100 ID=0x%02x\n", reg);
685051ff5fSYe.Li
695051ff5fSYe.Li /* Set SW1AB stanby volage to 0.975V */
705051ff5fSYe.Li pmic_reg_read(p, PFUZE100_SW1ABSTBY, ®);
715051ff5fSYe.Li reg &= ~SW1x_STBY_MASK;
725051ff5fSYe.Li reg |= SW1x_0_975V;
735051ff5fSYe.Li pmic_reg_write(p, PFUZE100_SW1ABSTBY, reg);
745051ff5fSYe.Li
755051ff5fSYe.Li /* Set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */
763fd10f3eSPeng Fan pmic_reg_read(p, PFUZE100_SW1ABCONF, ®);
775051ff5fSYe.Li reg &= ~SW1xCONF_DVSSPEED_MASK;
785051ff5fSYe.Li reg |= SW1xCONF_DVSSPEED_4US;
793fd10f3eSPeng Fan pmic_reg_write(p, PFUZE100_SW1ABCONF, reg);
805051ff5fSYe.Li
815051ff5fSYe.Li /* Set SW1C standby voltage to 0.975V */
825051ff5fSYe.Li pmic_reg_read(p, PFUZE100_SW1CSTBY, ®);
835051ff5fSYe.Li reg &= ~SW1x_STBY_MASK;
845051ff5fSYe.Li reg |= SW1x_0_975V;
855051ff5fSYe.Li pmic_reg_write(p, PFUZE100_SW1CSTBY, reg);
865051ff5fSYe.Li
875051ff5fSYe.Li /* Set SW1C/VDDSOC step ramp up time from 16us to 4us/25mV */
885051ff5fSYe.Li pmic_reg_read(p, PFUZE100_SW1CCONF, ®);
895051ff5fSYe.Li reg &= ~SW1xCONF_DVSSPEED_MASK;
905051ff5fSYe.Li reg |= SW1xCONF_DVSSPEED_4US;
915051ff5fSYe.Li pmic_reg_write(p, PFUZE100_SW1CCONF, reg);
925051ff5fSYe.Li
935051ff5fSYe.Li return p;
945051ff5fSYe.Li }
95125914d4SPeng Fan #endif
96