summaryrefslogtreecommitdiff
path: root/board
diff options
context:
space:
mode:
authorFabien Quatravaux <fabien.quatravaux-nonst@stericsson.com>2010-08-10 17:05:51 +0200
committerMichael BRANDT <michael.brandt@stericsson.com>2010-10-05 09:22:34 +0200
commite403f41d8d22b2a15f20d83b6359dc9cdf0b76db (patch)
tree92e97ade3e2abf3ce2cbbdbe4d87a894de940a4e /board
parent92f109e1fb271ca9ca81e3d50435f17bea9004b2 (diff)
Regulators: Fixup AUX3 regulator settings in MMC init
VAUX3 and VRF1 voltage selection are located in the same register. Read-modify-write is performed to avoid interfering with the VRF1 regulator. ST-Ericsson ID: CAP_3984_001 ST-Ericsson ID: CR 270150 Change-Id: Ia3756f72790e45225e46418a1ec2490aec92250f Signed-off-by: Bengt Jonsson <bengt.g.jonsson@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/5384 Reviewed-by: Michael BRANDT <michael.brandt@stericsson.com>
Diffstat (limited to 'board')
-rw-r--r--board/st/u8500/u8500.c66
1 files changed, 40 insertions, 26 deletions
diff --git a/board/st/u8500/u8500.c b/board/st/u8500/u8500.c
index 10b79f08b..078dadfa2 100644
--- a/board/st/u8500/u8500.c
+++ b/board/st/u8500/u8500.c
@@ -330,20 +330,30 @@ unsigned int addr_vall_arr[] = {
#ifdef BOARD_LATE_INIT
#ifdef CONFIG_MMC
-#define LDO_VAUX3_MASK 0x3
-#define LDO_VAUX3_ENABLE 0x1
-#define VAUX3_VOLTAGE_2_9V 0xd
-#define VAUX3_V2_VOLTAGE_2_91V 0x7
+#define LDO_VAUX3_ENABLE_MASK 0x3
+#define LDO_VAUX3_ENABLE_VAL 0x1
+#define LDO_VAUX3_SEL_MASK 0xf
+#define LDO_VAUX3_SEL_2V9 0xd
+#define LDO_VAUX3_V2_SEL_MASK 0x7
+#define LDO_VAUX3_V2_SEL_2V91 0x7
static int hrefplus_mmc_power_init(void)
{
int ret;
- int val;
- int rev;
+ int voltage_regval;
+ int enable_regval;
+ int ab8500_revision;
if (!cpu_is_u8500v11() && !cpu_is_u8500v2())
return 0;
+ /* Get AB8500 revision */
+ ret = ab8500_read(AB8500_MISC, AB8500_REV_REG);
+ if (ret < 0)
+ goto out;
+
+ ab8500_revision = ret;
+
/*
* On v1.1 HREF boards (HREF+) and v2 boards, Vaux3 needs to be
* enabled for the SD card to work. This is done by enabling
@@ -355,43 +365,47 @@ static int hrefplus_mmc_power_init(void)
* Turn off and delay is required to have it work across soft reboots.
*/
- ret = ab8500_read(AB8500_MISC, AB8500_REV_REG);
+ /* Turn off (read-modify-write) */
+ ret = ab8500_read(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_REGU_REG);
if (ret < 0)
goto out;
- rev = ret;
+ enable_regval = ret;
- ret = ab8500_read(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_REGU_REG);
+ ret = ab8500_write(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_REGU_REG,
+ enable_regval & ~LDO_VAUX3_ENABLE_MASK);
if (ret < 0)
goto out;
- val = ret;
+ /* Delay */
+ udelay(10 * 1000);
- /* Turn off */
- ret = ab8500_write(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_REGU_REG,
- val & ~LDO_VAUX3_MASK);
+ /* Set the voltage to 2.91 V or 2.9 V without overriding VRF1 value */
+ ret = ab8500_read(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_SEL_REG);
if (ret < 0)
goto out;
- udelay(10 * 1000);
+ voltage_regval = ret;
- /* Set the voltage to 2.9V */
- if (rev >= 0x20)
- ret = ab8500_write(AB8500_REGU_CTRL2,
- AB8500_REGU_VRF1VAUX3_SEL_REG, VAUX3_V2_VOLTAGE_2_91V);
- else
- ret = ab8500_write(AB8500_REGU_CTRL2,
- AB8500_REGU_VRF1VAUX3_SEL_REG, VAUX3_VOLTAGE_2_9V);
+ if (ab8500_revision < 0x20) {
+ voltage_regval &= ~LDO_VAUX3_SEL_MASK;
+ voltage_regval |= LDO_VAUX3_SEL_2V9;
+ } else {
+ voltage_regval &= ~LDO_VAUX3_V2_SEL_MASK;
+ voltage_regval |= LDO_VAUX3_V2_SEL_2V91;
+ }
+ ret = ab8500_write(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_SEL_REG,
+ voltage_regval);
if (ret < 0)
goto out;
- val = val & ~LDO_VAUX3_MASK;
- val = val | LDO_VAUX3_ENABLE;
-
/* Turn on the supply */
- ret = ab8500_write(AB8500_REGU_CTRL2,
- AB8500_REGU_VRF1VAUX3_REGU_REG, val);
+ enable_regval &= ~LDO_VAUX3_ENABLE_MASK;
+ enable_regval |= LDO_VAUX3_ENABLE_VAL;
+
+ ret = ab8500_write(AB8500_REGU_CTRL2, AB8500_REGU_VRF1VAUX3_REGU_REG,
+ enable_regval);
out:
return ret;