xref: /rk3399_rockchip-uboot/board/freescale/common/pfuze.c (revision b685c7348c521b14591a49ec6b78a2ad28a176e0)
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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, &reg);
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