
This patch is to implement pmic_mode_init function, and add prototype in header file.
This function is to set switching mode for pmic buck regulators to improve system efficiency.
Mode: OFF: The regulator is switched off and the output voltage is discharged. PFM: In this mode, the regulator is always in PFM mode, which is useful at light loads for optimized efficiency. PWM: In this mode, the regulator is always in PWM mode operation regardless of load conditions. APS: In this mode, the regulator moves automatically between pulse skipping mode and PWM mode depending on load conditions.
Signed-off-by: Peng Fan Peng.Fan@freescale.com Acked-by: Przemyslaw Marczak p.marczak@samsung.com ---
Changes v5: Add Acked-by: Przemyslaw Marczak p.marczak@samsung.com replace the constant 7 using macro SWITCH_SIZE which defined in header file. Include "errno.h" to avoid compile error.
Changes v4: Take Fabio's comments, fix return value using -EINVAL when error.
Changes v3: delete the new feature, it is fine to use the original v1 patch version
Changes v2: implement new feature to configure one regulator
board/freescale/common/pfuze.c | 38 ++++++++++++++++++++++++++++++++++++++ board/freescale/common/pfuze.h | 1 + 2 files changed, 39 insertions(+)
diff --git a/board/freescale/common/pfuze.c b/board/freescale/common/pfuze.c index 2cd1794..4980bf7 100644 --- a/board/freescale/common/pfuze.c +++ b/board/freescale/common/pfuze.c @@ -5,9 +5,47 @@ */
#include <common.h> +#include <errno.h> #include <power/pmic.h> #include <power/pfuze100_pmic.h>
+int pfuze_mode_init(struct pmic *p, u32 mode) +{ + unsigned char offset, i, switch_num; + u32 id, ret; + + pmic_reg_read(p, PFUZE100_DEVICEID, &id); + id = id & 0xf; + + if (id == 0) { + switch_num = 6; + offset = PFUZE100_SW1CMODE; + } else if (id == 1) { + switch_num = 4; + offset = PFUZE100_SW2MODE; + } else { + printf("Not supported, id=%d\n", id); + return -EINVAL; + } + + ret = pmic_reg_write(p, PFUZE100_SW1ABMODE, mode); + if (ret < 0) { + printf("Set SW1AB mode error!\n"); + return ret; + } + + for (i = 0; i < switch_num - 1; i++) { + ret = pmic_reg_write(p, offset + i * SWITCH_SIZE, mode); + if (ret < 0) { + printf("Set switch 0x%x mode error!\n", + offset + i * SWITCH_SIZE); + return ret; + } + } + + return ret; +} + struct pmic *pfuze_common_init(unsigned char i2cbus) { struct pmic *p; diff --git a/board/freescale/common/pfuze.h b/board/freescale/common/pfuze.h index 7a4126c..53cfc99 100644 --- a/board/freescale/common/pfuze.h +++ b/board/freescale/common/pfuze.h @@ -8,5 +8,6 @@ #define __PFUZE_BOARD_HELPER__
struct pmic *pfuze_common_init(unsigned char i2cbus); +int pfuze_mode_init(struct pmic *p, u32 mode);
#endif