diff mbox

[U-Boot,V2] OMAP5: Power: Add more functionality to Palmas driver

Message ID 5193A101.80002@mm-sol.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Lubomir Popov May 15, 2013, 2:51 p.m. UTC
Add some useful functions, and the corresponding definitions.

Signed-off-by: Lubomir Popov <lpopov@mm-sol.com>
---
V2 aligns to changed PMIC name (and file names accordingly)
from twl6035 to Palmas and is based on current u-boot-ti
master.

 drivers/power/palmas.c |  108 ++++++++++++++++++++++++++++++++++++++++++------
 include/palmas.h       |   81 +++++++++++++++++++++++++++++++++---
 2 files changed, 171 insertions(+), 18 deletions(-)

Comments

Nishanth Menon May 16, 2013, 6:29 p.m. UTC | #1
On Wed, May 15, 2013 at 9:51 AM, Lubomir Popov <lpopov@mm-sol.com> wrote:
> Add some useful functions, and the corresponding definitions.

Could you please split these into patches that introduce a function at a time?

I am at a loss why one would need twl6040 powered on in u-boot.

>
> Signed-off-by: Lubomir Popov <lpopov@mm-sol.com>
> ---
> V2 aligns to changed PMIC name (and file names accordingly)
> from twl6035 to Palmas and is based on current u-boot-ti
> master.
>
>  drivers/power/palmas.c |  108 ++++++++++++++++++++++++++++++++++++++++++------
>  include/palmas.h       |   81 +++++++++++++++++++++++++++++++++---
>  2 files changed, 171 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/power/palmas.c b/drivers/power/palmas.c
> index 09c832d..1f9bd7e 100644
> --- a/drivers/power/palmas.c
> +++ b/drivers/power/palmas.c
> @@ -25,28 +25,112 @@
>
>  void palmas_init_settings(void)
>  {
> -       return;
> +#ifdef CONFIG_PALMAS_SMPS7_FPWM
> +       int err;
> +       /*
> +        * Set SMPS7 (1.8 V I/O supply) to forced PWM mode.
> +        * This reduces noise (but affects efficiency).
> +        */
> +       u8 val = SMPS_MODE_SLP_FPWM | SMPS_MODE_ACT_FPWM;
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS7_CTRL, val)))
> +               printf("palmas: Could not force PWM for SMPS7: err = %d\n", err);
> +#endif
>  }
>
>  int palmas_mmc1_poweron_ldo(void)
>  {
>         u8 val = 0;
>
> -       /* set LDO9 TWL6035 to 3V */
> -       val = 0x2b; /* (3 -.9)*28 +1 */
> -
> -       if (palmas_i2c_write_u8(0x48, LDO9_VOLTAGE, val)) {
> -               printf("twl6035: could not set LDO9 voltage.\n");
> +       /* Set Palmas LDO9 to 3.0 V */
> +       val = LDO_VOLT_3V0;
> +       if (palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_VOLTAGE, val)) {
> +               printf("palmas: could not set LDO9 voltage.\n");
>                 return 1;
>         }
> -
>         /* TURN ON LDO9 */
> -       val = LDO_ON | LDO_MODE_SLEEP | LDO_MODE_ACTIVE;
> -
> -       if (palmas_i2c_write_u8(0x48, LDO9_CTRL, val)) {
> -               printf("twl6035: could not turn on LDO9.\n");
> +       val = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
> +       if (palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_CTRL, val)) {
> +               printf("palmas: could not turn on LDO9.\n");
>                 return 1;
>         }
> -
>         return 0;
>  }
> +
> +/*
> + * On some hardware the SD card socket and LDO9_IN are powered by an
> + * external 3.3 V regulator, while the output of LDO9 delivers VDDS_SDCARD
> + * for the OMAP interface only. This implies that LDO9 could be set to
> + * 'bypass' mode when required (e.g. for 3.3 V cards).
> + */
> +int palmas_mmc1_set_ldo9(u8 vsel)
> +{
> +       u8 cval=0, vval=0;      /* Off by default */
> +       int err;
> +
> +       if (vsel) {
> +               /* Turn on */
> +               if (vsel > LDO_VOLT_3V3) {
> +                       /* Put LDO9 in bypass */
> +                       cval = LDO9_BYP_EN | RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
> +                       vval = LDO_VOLT_3V3;
> +               }
> +               else {
> +                       cval = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
> +                       vval = vsel & 0x3f;
> +               }
> +       }
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_VOLTAGE, vval))) {
> +               printf("palmas: could not set LDO9 %s: err = %d\n",
> +                       vsel > LDO_VOLT_3V3 ? "bypass" : "voltage", err);
> +               return err;
> +       }
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_CTRL, cval)))
> +               printf("palmas: could not turn %s LDO9: err = %d\n",
> +                       cval ? "on" : "off", err);
> +       return err;
> +}
> +
> +/* Turn audio codec power and 32 kHz clock on/off. Use for TWL604x only. */
> +int palmas_audio_power(u8 on)
> +{
> +       u8 cval=0, vval=0, c32k=0;
> +       int err;
> +
> +       if (on) {
> +               vval = SMPS_VOLT_2V1;
> +               cval = SMPS_MODE_SLP_AUTO | SMPS_MODE_ACT_AUTO;
> +               c32k = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
> +       }
> +       /* Set SMPS9 to 2.1 V (for TWL604x), or to 0 (off) */
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS9_VOLTAGE, vval))) {
> +               printf("palmas: could not set SMPS9 voltage: err = %d\n", err);
> +               return err;
> +       }
> +       /* Turn on or off SMPS9 */
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS9_CTRL, cval))) {
> +               printf("palmas: could not turn SMPS9 %s: err = %d\n",
> +                       cval ? "on" : "off", err);
> +               return err;
> +       }
> +       /* Output 32 kHz clock on or off */
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, CLK32KGAUDIO_CTRL, c32k)))
> +               printf("palmas: could not turn CLK32KGAUDIO %s: err = %d\n",
> +                       c32k ? "on" : "off", err);
> +       return err;
> +}
> +
> +/*
> + * Enable/disable back-up battery (or super cap) charging.
> + * Please use defined BB_xxx values.
> + */
> +int palmas_enable_bb_charge(u8 bb_fields)
> +{
> +       u8 val = bb_fields & 0x0f;
> +       int err;
> +
> +       val |= (VRTC_EN_SLP | VRTC_EN_OFF | VRTC_PWEN);
> +       if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, BB_VRTC_CTRL, val)))
> +               printf("palmas: could not set BB_VRTC_CTRL to 0x%02x: err = %d\n", val, err);
> +       return err;
> +}
> +
> diff --git a/include/palmas.h b/include/palmas.h
> index 3b18589..7becb97 100644
> --- a/include/palmas.h
> +++ b/include/palmas.h
> @@ -27,16 +27,82 @@
>  #include <i2c.h>
>
>  /* I2C chip addresses */
> -#define PALMAS_CHIP_ADDR       0x48
> +#define PALMAS_CHIP_P1         0x48    /* Page 1 */
> +#define PALMAS_CHIP_P2         0x49    /* Page 2 */
> +#define PALMAS_CHIP_P3         0x4a    /* Page 3 */
>
> -/* 0x1XY translates to page 1, register address 0xXY */
> +/* Page 1 registers (0x1XY translates to page 1, reg addr 0xXY): */
> +
> +/* LDO9_CTRL */
>  #define LDO9_CTRL              0x60
>  #define LDO9_VOLTAGE           0x61
>
> -/* Bit field definitions for LDOx_CTRL */
> -#define LDO_ON                 (1 << 4)
> -#define LDO_MODE_SLEEP         (1 << 2)
> -#define LDO_MODE_ACTIVE                (1 << 0)
> +/* LDOUSB_CTRL */
> +#define LDOUSB_CTRL            0x64
> +#define LDOUSB_VOLTAGE         0x65
> +
> +/* Control of 32 kHz audio clock */
> +#define CLK32KGAUDIO_CTRL      0xd5
> +
> +/* SYSEN2_CTRL for VCC_3v3_AUX supply on the sEVM */
> +#define SYSEN2_CTRL            0xd9
> +
> +/*
> + * Bit field definitions for LDOx_CTRL, SYSENx_CTRL
> + * and some other xxx_CTRL resources:
> + */
> +#define LDO9_BYP_EN            (1 << 6)        /* LDO9 only! */
> +#define RSC_STAT_ON            (1 << 4)        /* RO bit! */
> +#define RSC_MODE_SLEEP         (1 << 2)
> +#define RSC_MODE_ACTIVE                (1 << 0)
> +
> +/* Some LDO voltage values */
> +#define LDO_VOLT_OFF           0
> +#define LDO_VOLT_1V8           0x13
> +#define LDO_VOLT_3V0           0x2b
> +#define LDO_VOLT_3V3           0x31
> +/* Request bypass, LDO9 only */
> +#define LDO9_BYPASS            0x3f
> +
> +/* SMPS7_CTRL */
> +#define SMPS7_CTRL             0x30
> +
> +/* SMPS9_CTRL */
> +#define SMPS9_CTRL             0x38
> +#define SMPS9_VOLTAGE          0x3b
> +
> +/* Bit field definitions for SMPSx_CTRL */
> +#define SMPS_MODE_ACT_AUTO     1
> +#define SMPS_MODE_ACT_ECO      2
> +#define SMPS_MODE_ACT_FPWM     3
> +#define SMPS_MODE_SLP_AUTO     (1 << 2)
> +#define SMPS_MODE_SLP_ECO      (2 << 2)
> +#define SMPS_MODE_SLP_FPWM     (3 << 2)
> +
> +/*
> + * Some popular SMPS voltages, all with RANGE=1; note
> + * that RANGE cannot be changed on the fly
> + */
> +#define SMPS_VOLT_OFF          0
> +#define SMPS_VOLT_1V2          0x90
> +#define SMPS_VOLT_1V8          0xae
> +#define SMPS_VOLT_2V1          0xbd
> +#define SMPS_VOLT_3V0          0xea
> +#define SMPS_VOLT_3V3          0xf9
> +
> +/* Backup Battery & VRTC Control */
> +#define BB_VRTC_CTRL           0xa8
> +/* Bit definitions for BB_VRTC_CTRL */
> +#define VRTC_EN_SLP            (1 << 6)
> +#define VRTC_EN_OFF            (1 << 5)
> +#define VRTC_PWEN              (1 << 4)
> +#define BB_LOW_ICHRG           (1 << 3)
> +#define BB_HIGH_ICHRG          (0 << 3)
> +#define BB_VSEL_3V0            (0 << 1)
> +#define BB_VSEL_2V5            (1 << 1)
> +#define BB_VSEL_3V15           (2 << 1)
> +#define BB_VSEL_VBAT           (3 << 1)
> +#define BB_CHRG_EN             (1 << 0)
>
>  /*
>   * Functions to read and write from TPS659038/TWL6035/TWL6037
> @@ -54,5 +120,8 @@ static inline int palmas_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
>
>  void palmas_init_settings(void);
>  int palmas_mmc1_poweron_ldo(void);
> +int palmas_mmc1_set_ldo9(u8 vsel);
> +int palmas_audio_power(u8 on);
> +int palmas_enable_bb_charge(u8 bb_fields);
>
>  #endif /* PALMAS_H */
> --
> 1.7.9.5
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Lubomir Popov May 16, 2013, 7:03 p.m. UTC | #2
Hello,

> On Wed, May 15, 2013 at 9:51 AM, Lubomir Popov <lpopov@mm-sol.com> wrote:
>> Add some useful functions, and the corresponding definitions.
>
> Could you please split these into patches that introduce a function at a
> time?
Sure, I could, but for such simple stuff...? Moreover it is currently
used by my board only.
>
> I am at a loss why one would need twl6040 powered on in u-boot.
Well, I needed it when bringing up the board ;) - to validate the
supplies, clocks, etc. Right, this function should be embraced within a
#ifdef CONFIG_PALSMAS_AUDPWR and not compile in the general case (my code
calling it is #ifdef-ed anyway).
>
>>
>> Signed-off-by: Lubomir Popov <lpopov@mm-sol.com>
>> ---
>> V2 aligns to changed PMIC name (and file names accordingly)
>> from twl6035 to Palmas and is based on current u-boot-ti
>> master.

Regards,
Lubomir
Nishanth Menon May 16, 2013, 7:19 p.m. UTC | #3
On Thu, May 16, 2013 at 2:03 PM, Lubomir Popov <lpopov@mm-sol.com> wrote:
> Well, I needed it when bringing up the board ;) - to validate the
> supplies, clocks, etc. Right, this function should be embraced within a
> #ifdef CONFIG_PALSMAS_AUDPWR and not compile in the general case (my code
> calling it is #ifdef-ed anyway).
Right, and you need u-boot modified to do validation? I think either
such code should stay out of tree, or be validated by expicit i2c
commands (which already is supported) OR tested by virtual regulator
consumer in linux ;)

I dont think we should make u-boot an OS. just my 2 cents. my rule of
thumb is: if it is not needed for boot, do it elsewhere other than
bootloader.
Regards,
NM
Lubomir Popov May 16, 2013, 8:14 p.m. UTC | #4
> On Thu, May 16, 2013 at 2:03 PM, Lubomir Popov <lpopov@mm-sol.com> wrote:
>> Well, I needed it when bringing up the board ;) - to validate the
>> supplies, clocks, etc. Right, this function should be embraced within a
>> #ifdef CONFIG_PALSMAS_AUDPWR and not compile in the general case (my
>> code
>> calling it is #ifdef-ed anyway).
> Right, and you need u-boot modified to do validation? I think either
> such code should stay out of tree, or be validated by expicit i2c
> commands (which already is supported) OR tested by virtual regulator
> consumer in linux ;)
>
> I dont think we should make u-boot an OS. just my 2 cents. my rule of
> thumb is: if it is not needed for boot, do it elsewhere other than
> bootloader.
Yes, TI has omapboot, just a bootloader. I think that U-Boot, on the other
hand,
has become a quite powerfull tool, with a lot of useful functionality, at
least for
me as a hardware guy. But of course, if the community thinks of it as of a
bootloader only, I give up. ;)
> Regards,
> NM
>
Best regards,
Lubo
Nishanth Menon May 16, 2013, 8:45 p.m. UTC | #5
On Thu, May 16, 2013 at 3:14 PM, Lubomir Popov <lpopov@mm-sol.com> wrote:
>> On Thu, May 16, 2013 at 2:03 PM, Lubomir Popov <lpopov@mm-sol.com> wrote:
>>> Well, I needed it when bringing up the board ;) - to validate the
>>> supplies, clocks, etc. Right, this function should be embraced within a
>>> #ifdef CONFIG_PALSMAS_AUDPWR and not compile in the general case (my
>>> code
>>> calling it is #ifdef-ed anyway).
>> Right, and you need u-boot modified to do validation? I think either
>> such code should stay out of tree, or be validated by expicit i2c
>> commands (which already is supported) OR tested by virtual regulator
>> consumer in linux ;)
>>
>> I dont think we should make u-boot an OS. just my 2 cents. my rule of
>> thumb is: if it is not needed for boot, do it elsewhere other than
>> bootloader.
> Yes, TI has omapboot, just a bootloader. I think that U-Boot, on the other
> hand,
> has become a quite powerfull tool, with a lot of useful functionality, at
> least for
> me as a hardware guy. But of course, if the community thinks of it as of a
> bootloader only, I give up. ;)
Lets not forget it is a bootloader. there are gazillion options -
barebox, uboot, vendor specific ones like omapboot etc.
U-boot is primarily a bootloader. It provides excellent testing
interfaces which are useful for preliminary testing. However stuff
like Audio power chip LDO supply enable when not really used, makes no
real sense in my opinion.

Sure you can use u-boot to validate with the i2c commands available -
hell, you can even write your own uEnv.txt or bootcmd which will do a
bunch of validation at boot.. but why have it in mainline u-boot is
beyond me.

Regards,
Nishanth Menon
diff mbox

Patch

diff --git a/drivers/power/palmas.c b/drivers/power/palmas.c
index 09c832d..1f9bd7e 100644
--- a/drivers/power/palmas.c
+++ b/drivers/power/palmas.c
@@ -25,28 +25,112 @@ 
 
 void palmas_init_settings(void)
 {
-	return;
+#ifdef CONFIG_PALMAS_SMPS7_FPWM
+	int err;
+	/*
+	 * Set SMPS7 (1.8 V I/O supply) to forced PWM mode.
+	 * This reduces noise (but affects efficiency).
+	 */
+	u8 val = SMPS_MODE_SLP_FPWM | SMPS_MODE_ACT_FPWM;
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS7_CTRL, val)))
+		printf("palmas: Could not force PWM for SMPS7: err = %d\n", err);
+#endif
 }
 
 int palmas_mmc1_poweron_ldo(void)
 {
 	u8 val = 0;
 
-	/* set LDO9 TWL6035 to 3V */
-	val = 0x2b; /* (3 -.9)*28 +1 */
-
-	if (palmas_i2c_write_u8(0x48, LDO9_VOLTAGE, val)) {
-		printf("twl6035: could not set LDO9 voltage.\n");
+	/* Set Palmas LDO9 to 3.0 V */
+	val = LDO_VOLT_3V0;
+	if (palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_VOLTAGE, val)) {
+		printf("palmas: could not set LDO9 voltage.\n");
 		return 1;
 	}
-
 	/* TURN ON LDO9 */
-	val = LDO_ON | LDO_MODE_SLEEP | LDO_MODE_ACTIVE;
-
-	if (palmas_i2c_write_u8(0x48, LDO9_CTRL, val)) {
-		printf("twl6035: could not turn on LDO9.\n");
+	val = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+	if (palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_CTRL, val)) {
+		printf("palmas: could not turn on LDO9.\n");
 		return 1;
 	}
-
 	return 0;
 }
+
+/*
+ * On some hardware the SD card socket and LDO9_IN are powered by an
+ * external 3.3 V regulator, while the output of LDO9 delivers VDDS_SDCARD
+ * for the OMAP interface only. This implies that LDO9 could be set to
+ * 'bypass' mode when required (e.g. for 3.3 V cards).
+ */
+int palmas_mmc1_set_ldo9(u8 vsel)
+{
+	u8 cval=0, vval=0;	/* Off by default */
+	int err;
+
+	if (vsel) {
+		/* Turn on */
+		if (vsel > LDO_VOLT_3V3) {
+			/* Put LDO9 in bypass */
+			cval = LDO9_BYP_EN | RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+			vval = LDO_VOLT_3V3;
+		}
+		else {
+			cval = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+			vval = vsel & 0x3f;
+		}
+	}
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_VOLTAGE, vval))) {
+		printf("palmas: could not set LDO9 %s: err = %d\n", 
+			vsel > LDO_VOLT_3V3 ? "bypass" : "voltage", err);
+		return err;
+	}
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, LDO9_CTRL, cval)))
+		printf("palmas: could not turn %s LDO9: err = %d\n",
+			cval ? "on" : "off", err);
+	return err;
+}
+
+/* Turn audio codec power and 32 kHz clock on/off. Use for TWL604x only. */
+int palmas_audio_power(u8 on)
+{
+	u8 cval=0, vval=0, c32k=0;
+	int err;
+
+	if (on) {
+		vval = SMPS_VOLT_2V1;
+		cval = SMPS_MODE_SLP_AUTO | SMPS_MODE_ACT_AUTO;
+		c32k = RSC_MODE_SLEEP | RSC_MODE_ACTIVE;
+	}
+	/* Set SMPS9 to 2.1 V (for TWL604x), or to 0 (off) */
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS9_VOLTAGE, vval))) {
+		printf("palmas: could not set SMPS9 voltage: err = %d\n", err);
+		return err;
+	}
+	/* Turn on or off SMPS9 */
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, SMPS9_CTRL, cval))) {
+		printf("palmas: could not turn SMPS9 %s: err = %d\n",
+			cval ? "on" : "off", err);
+		return err;
+	}
+	/* Output 32 kHz clock on or off */
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, CLK32KGAUDIO_CTRL, c32k)))
+		printf("palmas: could not turn CLK32KGAUDIO %s: err = %d\n",
+			c32k ? "on" : "off", err);
+	return err;
+}
+
+/*
+ * Enable/disable back-up battery (or super cap) charging.
+ * Please use defined BB_xxx values.
+ */
+int palmas_enable_bb_charge(u8 bb_fields)
+{
+	u8 val = bb_fields & 0x0f;
+	int err;
+
+	val |= (VRTC_EN_SLP | VRTC_EN_OFF | VRTC_PWEN);
+	if ((err = palmas_i2c_write_u8(PALMAS_CHIP_P1, BB_VRTC_CTRL, val)))
+		printf("palmas: could not set BB_VRTC_CTRL to 0x%02x: err = %d\n", val, err);
+	return err;
+}
+
diff --git a/include/palmas.h b/include/palmas.h
index 3b18589..7becb97 100644
--- a/include/palmas.h
+++ b/include/palmas.h
@@ -27,16 +27,82 @@ 
 #include <i2c.h>
 
 /* I2C chip addresses */
-#define PALMAS_CHIP_ADDR	0x48
+#define PALMAS_CHIP_P1		0x48	/* Page 1 */
+#define PALMAS_CHIP_P2		0x49	/* Page 2 */
+#define PALMAS_CHIP_P3		0x4a	/* Page 3 */
 
-/* 0x1XY translates to page 1, register address 0xXY */
+/* Page 1 registers (0x1XY translates to page 1, reg addr 0xXY): */
+
+/* LDO9_CTRL */
 #define LDO9_CTRL		0x60
 #define LDO9_VOLTAGE		0x61
 
-/* Bit field definitions for LDOx_CTRL */
-#define LDO_ON			(1 << 4)
-#define LDO_MODE_SLEEP		(1 << 2)
-#define LDO_MODE_ACTIVE		(1 << 0)
+/* LDOUSB_CTRL */
+#define LDOUSB_CTRL		0x64
+#define LDOUSB_VOLTAGE		0x65
+
+/* Control of 32 kHz audio clock */
+#define CLK32KGAUDIO_CTRL	0xd5
+
+/* SYSEN2_CTRL for VCC_3v3_AUX supply on the sEVM */
+#define SYSEN2_CTRL		0xd9
+
+/*
+ * Bit field definitions for LDOx_CTRL, SYSENx_CTRL 
+ * and some other xxx_CTRL resources:
+ */
+#define LDO9_BYP_EN		(1 << 6)	/* LDO9 only! */
+#define RSC_STAT_ON		(1 << 4)	/* RO bit! */
+#define RSC_MODE_SLEEP		(1 << 2)
+#define RSC_MODE_ACTIVE		(1 << 0)
+
+/* Some LDO voltage values */
+#define LDO_VOLT_OFF		0
+#define LDO_VOLT_1V8		0x13
+#define LDO_VOLT_3V0		0x2b
+#define LDO_VOLT_3V3		0x31
+/* Request bypass, LDO9 only */
+#define LDO9_BYPASS		0x3f
+
+/* SMPS7_CTRL */
+#define SMPS7_CTRL		0x30
+
+/* SMPS9_CTRL */
+#define SMPS9_CTRL		0x38
+#define SMPS9_VOLTAGE		0x3b
+
+/* Bit field definitions for SMPSx_CTRL */
+#define SMPS_MODE_ACT_AUTO	1
+#define SMPS_MODE_ACT_ECO	2
+#define SMPS_MODE_ACT_FPWM	3
+#define SMPS_MODE_SLP_AUTO	(1 << 2)
+#define SMPS_MODE_SLP_ECO	(2 << 2)
+#define SMPS_MODE_SLP_FPWM	(3 << 2)
+
+/*
+ * Some popular SMPS voltages, all with RANGE=1; note
+ * that RANGE cannot be changed on the fly
+ */
+#define SMPS_VOLT_OFF		0
+#define SMPS_VOLT_1V2		0x90
+#define SMPS_VOLT_1V8		0xae
+#define SMPS_VOLT_2V1		0xbd
+#define SMPS_VOLT_3V0		0xea
+#define SMPS_VOLT_3V3		0xf9
+
+/* Backup Battery & VRTC Control */
+#define BB_VRTC_CTRL		0xa8
+/* Bit definitions for BB_VRTC_CTRL */
+#define VRTC_EN_SLP		(1 << 6)
+#define VRTC_EN_OFF		(1 << 5)
+#define VRTC_PWEN		(1 << 4)
+#define BB_LOW_ICHRG		(1 << 3)
+#define BB_HIGH_ICHRG		(0 << 3)
+#define BB_VSEL_3V0		(0 << 1)
+#define BB_VSEL_2V5		(1 << 1)
+#define BB_VSEL_3V15		(2 << 1)
+#define BB_VSEL_VBAT		(3 << 1)
+#define BB_CHRG_EN		(1 << 0)
 
 /*
  * Functions to read and write from TPS659038/TWL6035/TWL6037
@@ -54,5 +120,8 @@  static inline int palmas_i2c_read_u8(u8 chip_no, u8 reg, u8 *val)
 
 void palmas_init_settings(void);
 int palmas_mmc1_poweron_ldo(void);
+int palmas_mmc1_set_ldo9(u8 vsel);
+int palmas_audio_power(u8 on);
+int palmas_enable_bb_charge(u8 bb_fields);
 
 #endif /* PALMAS_H */