Good to hear!
We are exactly working right now on the same problem, that's why I was able to respond so quickly.
So I assume you are using the internal LDO of the i.MX6, and not use LDO-bypass for voltage generation?
Explanation of ldo-enabled vs. ldo-bypass: ventana/power – Gateworks
The setpoints above are only applied to the internal LDO. Besides power consumption, a major problem for us with the internal LDO is the additional heat it produces.
Good for you that we are already one step further: we are testing stability with LDO-bypass configuration. With LDO bypass we were able to reduce the temperature by around 15%.
LDO-Bypass:
SCM-i.MX6D has the PF0100 PMIC built in, so if you decide to use LDO bypass:
- Enable fsl,ldo-bypass flag in kernel dts config
- Fix the VDD_ARM_IN / VDD_SOC_IN mismatch in U-boot (at least it's wrong for the evaluation board)
- Rebuild and verify stability, enjoy the reduced heat and power consumption :-)
Detailled explanation:
How to Enable LDO Bypass Based on i.MX6 Android ICS
Set ldo-bypass flag your dtsi file: kernel//arch/arm/boot/dts/imx6dscm-freeX.dts
fsl,ldo-bypass = <1>;
There is an important change which is required in the U-Boot: Fix the inverted mapping of VDD_ARM_IN and VDD_SOC_IN to the PMIC outputs (double check with your custom hardware, at least for the evaluation board it's wrong): u-boot/board/freescale/mx6dqscmqwks/mx6dqscmqwks.c
Bug: The schematics of the evaluation board does not match the code (inverted)!
Schematics evaluation board:
PFUZE100_SW1ABVOL = VDD_SOC_IN
PFUZE100_SW1CVOL = VDD_ARM_IN
Code:
PFUZE100_SW1ABVOL = VDD_ARM_IN
PFUZE100_SW1CVOL = VDD_SOC_IN
We are currently running the following config and testing the stability (1.175V VDD_ARM_IN, 1.20V VDD_SOC_IN):
u-boot/board/freescale/mx6dqscmqwks/mx6dqscmqwks.c
void ldo_mode_set(int ldo_bypass) {
...
/* set SW1C to 1.175V (VDD_ARM_IN) to compensate ripple */
pmic_reg_read(pfuze, PFUZE100_SW1CVOL, &value);
value &= ~0x3f;
value |= 0x23;
pmic_reg_write(pfuze, PFUZE100_SW1CVOL, value);
/* set SW1AB to 1.20V (VDD_SOC_IN) to compensate ripple */
pmic_reg_read(pfuze, PFUZE100_SW1ABVOL, &value);
value &= ~0x3f;
value |= 0x24;
pmic_reg_write(pfuze, PFUZE100_SW1ABVOL, value);
...
FYI: depending on your hardware setup, you might have to increase SW1C and SW1AB to compensate for ripple (it should NEVER get below 1.15V)