[U-Boot-Users] [PATCH 07/10] [ARM] TQMA31: adjust voltage regulators in PMIC MC13738

Jens Gehrlein
2008-07-04T14:50:11Z

VRFDIG: 1.875 V -> 1.8 V
VGEN: 1.5 V -> 1.8 V
VDIG: 1.5 V -> 1.3 V
Unused PMIC switchers and regulators are disabled

Signed-off-by: Jens Gehrlein <sew_s@tqs.de>
---

board/tqc/tqma31/tqma31.c | 142 +++++++++++++++++++++++++++++++++++++++++++++
include/configs/TQMA31.h | 2 +
2 files changed, 144 insertions(+), 0 deletions(-)

diff --git a/board/tqc/tqma31/tqma31.c b/board/tqc/tqma31/tqma31.c
index c704c41..abb8db0 100644
--- a/board/tqc/tqma31/tqma31.c
+++ b/board/tqc/tqma31/tqma31.c
@@ -22,6 +22,7 @@

#include <common.h>
#include <asm/io.h>
+#include <spi.h>
#include <asm/arch/mx31.h>
#include <asm/arch/mx31-regs.h>

@@ -70,6 +71,132 @@ static void setup_iomux (void)
mx31_pad_ctl (PAD_CTL_CSPI2_MOSI, 0);
}

+static int adjust_voltages (void)
+{
+ u32 reg;
+ u32 val;
+ static struct spi_slave *slave = NULL;
+
+ slave = spi_setup_slave(1, 0, 1000000,
+ SPI_MODE_2 | SPI_CS_HIGH);
+ if (!slave)
+ return -1;
+
+ if (spi_claim_bus(slave))
+ return -1;
+
+ /* Set PMIC arbitration switchers */
+ val = 0x000020;
+ reg = 0x14000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ /* Set PMIC regulator enable to 0x0 */
+ val = 0x000000;
+ reg = 0x20000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ /*
+ * Set PMIC regulator setting 0
+ * VRFDIG = 1,8V / reset value = 1,875V
+ * VGEN = 1,8V / reset value = 1,5V
+ * VDIG = 1,3V / reset value = 1,5V
+ */
+ val = 0x63cdc;
+ reg = 0x3c000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ /*
+ * Set PMIC regulator mode 0 to 0x24924
+ * VAUDIO = on
+ * VIOH = off
+ * VIOLO = on
+ * VDIG = on
+ * VGEN = on
+ * VRFDIG = on
+ * VRFREF = on
+ * VRFCP = on
+ */
+ val = 0x249241;
+ reg = 0x40000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ /*
+ * Set PMIC regulator mode 1 to 0x0
+ * VSIM = off
+ * VESIM = off
+ * VCAM = off
+ * VRFBG = off
+ * VVIB = off
+ * VRF1 = off
+ * VRF2 = off
+ * VMMC1 = off
+ * VMMC2 = off
+ */
+ val = 0x0;
+ reg = 0x42000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ /*
+ * FIXME: switcher settings 0 and 1.
+ * Kernel hangs when unpacking itself.
+ * Workaround:
+ * Up to now CPU can operate at maximum allowed voltage 1.6 V.
+ */
+ /*
+ * Set PMIC switcher setting 0
+ * SW1A = 1,2V / reset value = 1,6V
+ * SW1ADVS = 1,6V / reset value = 1,6V
+ * SW1ASTBY = 1,2V / reset value = 1,6V
+ */
+ /*
+ val = 0xc70c;
+ reg = 0x30000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+ */
+
+ /*
+ * Set PMIC switcher setting 1
+ * SW1A = 1,2V / reset value = 1,6V
+ * SW1ADVS = 1,6V / reset value = 1,6V
+ * SW1ASTBY = 1,2V / reset value = 1,6V
+ */
+ /*
+ val = 0xc70c;
+ reg = 0x32000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+ */
+
+ /*
+ * Set PMIC switcher setting 5
+ * SW5 = 5V
+ * SW5 = off
+ */
+ val = 0x021605;
+ reg = 0x3A000000 | val | 0x80000000;
+ if (spi_xfer(slave, 32, (uchar *)&reg, (uchar *)&val,
+ SPI_XFER_BEGIN | SPI_XFER_END))
+ return -1;
+
+ spi_release_bus(slave);
+ spi_free_slave(slave);
+
+ return 0;
+}
+
int dram_init (void)
{
gd->bd->bi_dram[0].start = PHYS_SDRAM_1;
@@ -112,3 +239,18 @@ int checkboard (void)
printf ("Board: TQMA31\n");
return 0;
}
+
+int board_late_init(void)
+{
+ /*
+ * Must call this function in late init stage, because the SPI driver,
+ * required by this function, uses malloc(). The malloc space has not
+ * been setup in the board_init() stage.
+ */
+ if (adjust_voltages ()) {
+ printf ("Adjusting voltages failed!\n");
+ return -1;
+ }
+ return 0;
+}
+
diff --git a/include/configs/TQMA31.h b/include/configs/TQMA31.h
index ac81a32..a174940 100644
--- a/include/configs/TQMA31.h
+++ b/include/configs/TQMA31.h
@@ -299,6 +299,8 @@
* Miscellaneous
******************************************************************************/

+#define BOARD_LATE_INIT
+
/* Total available space for malloc in bytes */
#define CFG_MALLOC_LEN (CFG_ENV_SIZE + 128 * 1024)