Module Name:    src
Committed By:   jkunz
Date:           Sun Dec 16 19:08:45 UTC 2012

Modified Files:
        src/sys/arch/evbarm/stand/bootimx23: boot_prep.c bootimx23.bd
            clock_prep.c common.c common.h emi_prep.c pinctrl_prep.c
            power_prep.c

Log Message:
Contribution from Petri Laakso.
Refactoring of bootimx23:
- Code style clean up.
- Don't do DCDC initialization in bootimx23. This has proven to be
  unreliable. DCDC initialization will be done in kernel later.
  Use linear regulators while booting to make bootimx23 reliable.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/stand/bootimx23/boot_prep.c \
    src/sys/arch/evbarm/stand/bootimx23/clock_prep.c \
    src/sys/arch/evbarm/stand/bootimx23/common.c \
    src/sys/arch/evbarm/stand/bootimx23/common.h \
    src/sys/arch/evbarm/stand/bootimx23/emi_prep.c \
    src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd \
    src/sys/arch/evbarm/stand/bootimx23/power_prep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/evbarm/stand/bootimx23/boot_prep.c
diff -u src/sys/arch/evbarm/stand/bootimx23/boot_prep.c:1.1 src/sys/arch/evbarm/stand/bootimx23/boot_prep.c:1.2
--- src/sys/arch/evbarm/stand/bootimx23/boot_prep.c:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/boot_prep.c	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: boot_prep.c,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: boot_prep.c,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -39,15 +39,15 @@
 #include "common.h"
 
 /*
- * Initialize i.MX23 power, clock and DRAM.
+ * Initialize i.MX23 power, clocks and DRAM.
  */
 int
 _start(void)
 {
 
-	/* Make sure timer is running */
-	REG_WRITE(HW_DIGCTL_BASE + HW_DIGCTL_CTRL_CLR,
-		HW_DIGCTL_CTRL_XTAL24M_GATE);
+	/* Make sure timer is running. */
+	REG_WR(HW_DIGCTL_BASE + HW_DIGCTL_CTRL_CLR,
+	    HW_DIGCTL_CTRL_XTAL24M_GATE);
 
 	printf("\n\rBooting");
 
@@ -58,7 +58,6 @@ _start(void)
 	putchar('.');
 
 	pinctrl_prep();
-	delay_us(1000);
 	putchar('.');
 	
 	emi_prep();
Index: src/sys/arch/evbarm/stand/bootimx23/clock_prep.c
diff -u src/sys/arch/evbarm/stand/bootimx23/clock_prep.c:1.1 src/sys/arch/evbarm/stand/bootimx23/clock_prep.c:1.2
--- src/sys/arch/evbarm/stand/bootimx23/clock_prep.c:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/clock_prep.c	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: clock_prep.c,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: clock_prep.c,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -39,26 +39,28 @@
 
 #include "common.h"
 
-void enable_pll(void);
-void enable_ref_cpu(int);
-void enable_ref_emi(int);
-void enable_ref_io(int);
-void use_ref_cpu(void);
-void use_ref_emi(void);
-void use_ref_io(void);
-void set_hbus_div(int);
-void set_emi_div(int);
-void set_ssp_div(int);
-
-/* Clock frequences after clock_prep() */
-#define CPU_FRAC 0x13		/* CPUCLK @ 454.74 MHz */
-#define HBUS_DIV 0x3		/* AHBCLK @ 151.58 MHz */
-#define EMI_FRAC 0x21		/* EMICLK @ 130.91 MHz */
-#define EMI_DIV 0x2
-#define IO_FRAC 0x12		/* IOCLK  @ 480.00 MHz */
-#define SSP_DIV 0x5		/* SSPCLK @  96.00 MHz */
+static void enable_pll(void);
+static void enable_ref_cpu(int);
+static void enable_ref_emi(int);
+static void enable_ref_io(int);
+static void use_ref_cpu(void);
+static void use_ref_emi(void);
+static void use_ref_io(void);
+static void set_hbus_div(int);
+static void set_emi_div(int);
+static void set_ssp_div(int);
+
+/*
+ * Clock frequences set by clock_prep()
+ */
+#define CPU_FRAC	0x13		/* CPUCLK @ 454.74 MHz */
+#define HBUS_DIV	0x3		/* AHBCLK @ 151.58 MHz */
+#define EMI_FRAC	0x21		/* EMICLK @ 130.91 MHz */
+#define EMI_DIV		0x2
+#define IO_FRAC		0x12		/* IOCLK  @ 480.00 MHz */
+#define SSP_DIV		0x5		/* SSPCLK @  96.00 MHz */
 
-/* Offset to frac register for byte store instructions. (strb) */
+/* Offset to frac register for CLKCTRL_WR_BYTE macro. */
 #define HW_CLKCTRL_FRAC_CPU (HW_CLKCTRL_FRAC+0)
 #define HW_CLKCTRL_FRAC_EMI (HW_CLKCTRL_FRAC+1)
 #define HW_CLKCTRL_FRAC_IO (HW_CLKCTRL_FRAC+3)
@@ -86,9 +88,7 @@ clock_prep(void)
 	enable_ref_io(IO_FRAC);
 	set_emi_div(EMI_DIV);
 	set_hbus_div(HBUS_DIV);
-	delay_us(1000);
 	use_ref_cpu();
-	//delay_us(1000);
 	use_ref_emi();
 	use_ref_io();
 	set_ssp_div(SSP_DIV);
@@ -99,7 +99,7 @@ clock_prep(void)
 /*
  * Turn PLL on and wait until it's locked to 480 MHz.
  */
-void
+static void
 enable_pll(void)
 {
 
@@ -112,7 +112,7 @@ enable_pll(void)
 /*
  * Enable fractional divider clock ref_cpu with divide value "frac".
  */
-void
+static void
 enable_ref_cpu(int frac)
 {
 	uint32_t reg;
@@ -128,7 +128,7 @@ enable_ref_cpu(int frac)
 /*
  * Enable fractional divider clock ref_emi with divide value "frac".
  */
-void
+static void
 enable_ref_emi(int frac)
 {
 	uint32_t reg;
@@ -144,7 +144,7 @@ enable_ref_emi(int frac)
 /*
  * Enable fractional divider clock ref_io with divide value "frac".
  */
-void
+static void
 enable_ref_io(int frac)
 {
 	uint32_t reg;
@@ -160,7 +160,7 @@ enable_ref_io(int frac)
 /*
  * Divide CLK_P by "div" to get CLK_H frequency.
  */
-void
+static void
 set_hbus_div(int div)
 {
 	uint32_t reg;
@@ -177,7 +177,7 @@ set_hbus_div(int div)
 /*
  * ref_emi is divied "div" to get CLK_EMI.
  */
-void
+static void
 set_emi_div(int div)
 {
 	uint32_t reg;
@@ -193,7 +193,7 @@ set_emi_div(int div)
 /*
  * ref_io is divied "div" to get CLK_SSP.
  */
-void
+static void
 set_ssp_div(int div)
 {
 	uint32_t reg;
@@ -209,7 +209,7 @@ set_ssp_div(int div)
 /*
  * Transition from ref_xtal to use ref_cpu.
  */
-void
+static void
 use_ref_cpu(void)
 {
 	CLKCTRL_WR(HW_CLKCTRL_CLKSEQ_CLR, HW_CLKCTRL_CLKSEQ_BYPASS_CPU);
@@ -219,7 +219,7 @@ use_ref_cpu(void)
 /*
  * Transition from ref_xtal to use ref_emi and source CLK_EMI from ref_emi.
  */
-void
+static void
 use_ref_emi(void)
 {
 	uint32_t reg;
@@ -238,7 +238,7 @@ use_ref_emi(void)
 /*
  * Transition from ref_xtal to use ref_io and source CLK_SSP from ref_io.
  */
-void
+static void
 use_ref_io(void)
 {
 	uint32_t reg;
Index: src/sys/arch/evbarm/stand/bootimx23/common.c
diff -u src/sys/arch/evbarm/stand/bootimx23/common.c:1.1 src/sys/arch/evbarm/stand/bootimx23/common.c:1.2
--- src/sys/arch/evbarm/stand/bootimx23/common.c:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/common.c	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: common.c,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: common.c,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,6 +30,7 @@
  */
 
 #include <sys/param.h>
+#include <sys/types.h>
 #include <sys/cdefs.h>
 
 #include <arm/imx/imx23_digctlreg.h>
@@ -38,16 +39,33 @@
 #include "common.h"
 
 /*
- * Delay "delay" microseconds.
+ * Delay us microseconds.
  */
 void
-delay_us(unsigned int delay)
+delay(unsigned int us)
 {
+	uint32_t start;
+	uint32_t now;
+	uint32_t elapsed;
+	uint32_t total;
+	uint32_t last;
+
+	total = 0;
+	last = 0;
+	start = REG_RD(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS);
+
+	do {
+		now = REG_RD(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS);
+
+		if (start <= now)
+			elapsed = now - start;
+		else	/* Take care of overflow. */
+			elapsed = (UINT32_MAX - start) + 1 + now;
 
-	/* Set microsecond timer to 0 */
-	REG_WRITE(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS_CLR, 0xFFFFFFFF);
+		total += elapsed - last;
+		last = elapsed;
 
-	while (REG_READ(HW_DIGCTL_BASE + HW_DIGCTL_MICROSECONDS) < delay);
+	} while (total < us);
 
 	return;
 }
@@ -60,10 +78,14 @@ putchar(int ch)
 {
 
 	/* Wait until transmit FIFO has space for the new character. */
-	while (REG_READ(HW_UARTDBG_BASE + HW_UARTDBGFR) & HW_UARTDBGFR_TXFF);
+	while (REG_RD(HW_UARTDBG_BASE + HW_UARTDBGFR) & HW_UARTDBGFR_TXFF);
 
-	REG_WRITE_BYTE(HW_UARTDBG_BASE + HW_UARTDBGDR,
+	REG_WR_BYTE(HW_UARTDBG_BASE + HW_UARTDBGDR,
 	    __SHIFTIN(ch, HW_UARTDBGDR_DATA));
+#ifdef DEBUG
+	/* Flush: Wait until transmit FIFO contents are written to UART. */
+	while (!(REG_RD(HW_UARTDBG_BASE + HW_UARTDBGFR) & HW_UARTDBGFR_TXFE));
+#endif
 
 	return;
 }
Index: src/sys/arch/evbarm/stand/bootimx23/common.h
diff -u src/sys/arch/evbarm/stand/bootimx23/common.h:1.1 src/sys/arch/evbarm/stand/bootimx23/common.h:1.2
--- src/sys/arch/evbarm/stand/bootimx23/common.h:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/common.h	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: common.h,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: common.h,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -32,12 +32,12 @@
 #ifndef _BOOTIMX23_COMMON_
 #define _BOOTIMX23_COMMON_
 
-#define REG_READ(reg) *(volatile uint32_t *)(reg)
-#define REG_WRITE(reg, val)						\
+#define REG_RD(reg) *(volatile uint32_t *)(reg)
+#define REG_WR(reg, val)						\
 do {									\
 	*(volatile uint32_t *)((reg)) = val;				\
 } while (0)
-#define REG_WRITE_BYTE(reg, val)					\
+#define REG_WR_BYTE(reg, val)						\
 do {									\
 	*(volatile uint8_t *)((reg)) = val;				\
 } while (0)
@@ -46,7 +46,7 @@ int clock_prep(void);
 int emi_prep(void);
 int pinctrl_prep(void);
 int power_prep(void);
-void delay_us(unsigned int);
+void delay(unsigned int);
 void putchar(int);
 
 #endif /* !_BOOTIMX23_COMMON_ */
Index: src/sys/arch/evbarm/stand/bootimx23/emi_prep.c
diff -u src/sys/arch/evbarm/stand/bootimx23/emi_prep.c:1.1 src/sys/arch/evbarm/stand/bootimx23/emi_prep.c:1.2
--- src/sys/arch/evbarm/stand/bootimx23/emi_prep.c:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/emi_prep.c	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: emi_prep.c,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: emi_prep.c,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -39,9 +39,9 @@
 
 #include "common.h"
 
-void init_dram_registers(void);
-void start_dram(void);
-uint32_t get_dram_int_status(void);
+static void init_dram_registers(void);
+static void start_dram(void);
+static uint32_t get_dram_int_status(void);
 
 /*
  * Initialize external DRAM memory.
@@ -64,58 +64,58 @@ emi_prep(void)
  * settings were to HW_DRAM_CTL19_DQS_OUT_SHIFT which was set to 16 as a result
  * from trial and error.
  */
-void
+static void
 init_dram_registers(void)
 {
 	uint32_t reg;
 
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL00, 0x01010001);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL01, 0x00010100);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL02, 0x01000101);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL03, 0x00000001);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL04, 0x00000101);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL05, 0x00000000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL06, 0x00010000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL07, 0x01000001);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL00, 0x01010001);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL01, 0x00010100);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL02, 0x01000101);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL03, 0x00000001);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL04, 0x00000101);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL05, 0x00000000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL06, 0x00010000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL07, 0x01000001);
 	// HW_DRAM_CTL08 initialized last.
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL09, 0x00000001);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL10, 0x07000200);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL11, 0x00070202);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL12, 0x02020000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL13, 0x04040a01);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL14, 0x00000201);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL15, 0x02040000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL16, 0x02000000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL17, 0x19000f08);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL18, 0x0d0d0000);
-//	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL19, 0x02021313);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL09, 0x00000001);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL10, 0x07000200);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL11, 0x00070202);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL12, 0x02020000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL13, 0x04040a01);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL14, 0x00000201);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL15, 0x02040000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, 0x02000000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL17, 0x19000f08);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL18, 0x0d0d0000);
+//	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL19, 0x02021313);
 	reg = __SHIFTIN(2, HW_DRAM_CTL19_DQS_OUT_SHIFT_BYPASS) |
 	    __SHIFTIN(16, HW_DRAM_CTL19_DQS_OUT_SHIFT) |
 	    __SHIFTIN(19, HW_DRAM_CTL19_DLL_DQS_DELAY_BYPASS_1) |
 	    __SHIFTIN(19, HW_DRAM_CTL19_DLL_DQS_DELAY_BYPASS_0);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL19, reg);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL20, 0x02061521);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL21, 0x0000000a);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL22, 0x00080008);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL23, 0x00200020);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL24, 0x00200020);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL25, 0x00200020);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL26, 0x000003f7);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL19, reg);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL20, 0x02061521);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL21, 0x0000000a);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL22, 0x00080008);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL23, 0x00200020);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL24, 0x00200020);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL25, 0x00200020);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL26, 0x000003f7);
 	// HW_DRAM_CTL27 
 	// HW_DRAM_CTL28 
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL29, 0x00000020);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL30, 0x00000020);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL31, 0x00c80000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL32, 0x000a23cd);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL33, 0x000000c8);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL34, 0x00006665);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL29, 0x00000020);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL30, 0x00000020);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL31, 0x00c80000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL32, 0x000a23cd);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL33, 0x000000c8);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL34, 0x00006665);
 	// HW_DRAM_CTL35 is read only register
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL36, 0x00000101);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL37, 0x00040001);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL38, 0x00000000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL39, 0x00000000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL40, 0x00010000);
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL08, 0x01000000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL36, 0x00000101);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL37, 0x00040001);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL38, 0x00000000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL39, 0x00000000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL40, 0x00010000);
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, 0x01000000);
 
 	return;
 }
@@ -123,15 +123,15 @@ init_dram_registers(void)
 /*
  * Start DRAM module. After return DRAM is ready to use.
  */
-void
+static void
 start_dram(void)
 {
 	uint32_t reg;
 
-	reg = REG_READ(HW_DRAM_BASE + HW_DRAM_CTL08);
+	reg = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08);
 	reg |= HW_DRAM_CTL08_START;
-	REG_WRITE(HW_DRAM_BASE + HW_DRAM_CTL08, reg);
-	
+	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, reg);
+
 	/* Wait until DRAM initialization is complete. */
 	while(!(get_dram_int_status() & (1<<2)));
 
@@ -141,11 +141,11 @@ start_dram(void)
 /*
  * Return DRAM controller interrupt status register.
  */
-uint32_t
+static uint32_t
 get_dram_int_status(void)
 {
 	uint32_t reg;
-	
-	reg = REG_READ(HW_DRAM_BASE + HW_DRAM_CTL18);
+
+	reg = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL18);
 	return __SHIFTOUT(reg, HW_DRAM_CTL18_INT_STATUS);
 }
Index: src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c
diff -u src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c:1.1 src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c:1.2
--- src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c:1.1	Tue Nov 20 19:08:46 2012
+++ src/sys/arch/evbarm/stand/bootimx23/pinctrl_prep.c	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: pinctrl_prep.c,v 1.1 2012/11/20 19:08:46 jkunz Exp $ */
+/* $Id: pinctrl_prep.c,v 1.2 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -39,12 +39,12 @@
 
 #include "common.h"
 
-void configure_emi_mux(void);
-void configure_emi_drive(int);
-void disable_emi_padkeepers(void);
-void configure_ssp_mux();
-void configure_ssp_drive(int);
-void configure_ssp_pullups(void);
+static void configure_emi_mux(void);
+static void configure_emi_drive(int);
+static void disable_emi_padkeepers(void);
+static void configure_ssp_mux();
+static void configure_ssp_drive(int);
+static void configure_ssp_pullups(void);
 
 /* EMI pins output drive strengths */
 #define DRIVE_04_MA	0x0	/* 4 mA */
@@ -59,7 +59,7 @@ int
 pinctrl_prep(void)
 {
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_CTRL_CLR,
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_CTRL_CLR,
 	    (HW_PINCTRL_CTRL_SFTRST | HW_PINCTRL_CTRL_CLKGATE));
 
 	/* EMI. */
@@ -78,21 +78,21 @@ pinctrl_prep(void)
 /*
  * Configure external EMI pins to be used for DRAM.
  */
-void
+static void
 configure_emi_mux(void)
 {
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL4_CLR, (
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL4_CLR, (
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN15 |	/* Pin 108, EMI_A06 */
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN14 |	/* Pin 107, EMI_A05 */
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN13 |	/* Pin 109, EMI_A04 */
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN12 |	/* Pin 110, EMI_A03 */
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN11 |	/* Pin 111, EMI_A02 */
 	    HW_PINCTRL_MUXSEL4_BANK2_PIN10 |	/* Pin 112, EMI_A01 */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN09)		/* Pin 113, EMI_A00 */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN09)	/* Pin 113, EMI_A00 */
 	);
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL5_CLR, (
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL5_CLR, (
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN31 |	/* Pin 114, EMI_WEN  */
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN30 |	/* Pin  98, EMI_RASN */
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN29 |	/* Pin 115, EMI_CKE  */
@@ -109,10 +109,10 @@ configure_emi_mux(void)
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN19 |	/* Pin 104, EMI_A10  */
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN18 |	/* Pin 103, EMI_A09  */
 	    HW_PINCTRL_MUXSEL5_BANK2_PIN17 |	/* Pin 106, EMI_A08  */
-	    HW_PINCTRL_MUXSEL5_BANK2_PIN16)		/* Pin 105, EMI_A07  */
+	    HW_PINCTRL_MUXSEL5_BANK2_PIN16)	/* Pin 105, EMI_A07  */
 	);
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL6_CLR, (
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL6_CLR, (
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN15 |	/* Pin 95, EMI_D15 */
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN14 |	/* Pin 96, EMI_D14 */
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN13 |	/* Pin 94, EMI_D13 */
@@ -128,16 +128,16 @@ configure_emi_mux(void)
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN03 |	/* Pin 79, EMI_D03 */
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN02 |	/* Pin 77, EMI_D02 */
 	    HW_PINCTRL_MUXSEL6_BANK3_PIN01 |	/* Pin 76, EMI_D01 */
-	    HW_PINCTRL_MUXSEL6_BANK3_PIN00)		/* Pin 75, EMI_D00 */
+	    HW_PINCTRL_MUXSEL6_BANK3_PIN00)	/* Pin 75, EMI_D00 */
 	);
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL7_CLR, (
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL7_CLR, (
 	    HW_PINCTRL_MUXSEL7_BANK3_PIN21 |	/* Pin 72, EMI_CLKN */
 	    HW_PINCTRL_MUXSEL7_BANK3_PIN20 |	/* Pin 70, EMI_CLK  */
 	    HW_PINCTRL_MUXSEL7_BANK3_PIN19 |	/* Pin 74, EMI_DQS1 */
 	    HW_PINCTRL_MUXSEL7_BANK3_PIN18 |	/* Pin 73, EMI_DQS0 */
 	    HW_PINCTRL_MUXSEL7_BANK3_PIN17 |	/* Pin 92, EMI_DQM1 */
-	    HW_PINCTRL_MUXSEL7_BANK3_PIN16)		/* Pin 81, EMI_DQM0 */
+	    HW_PINCTRL_MUXSEL7_BANK3_PIN16)	/* Pin 81, EMI_DQM0 */
 	);
 
 	return;
@@ -147,13 +147,13 @@ configure_emi_mux(void)
  * Configure EMI pins voltages to 1.8/2.5V operation and drive strength
  * to "ma".
  */
-void
+static void
 configure_emi_drive(int ma)
 {
 	uint32_t drive;
 
 	/* DRIVE 9 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE9);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE9);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE9_BANK2_PIN15_V |	/* Pin 108, EMI_A06 */
 	    HW_PINCTRL_DRIVE9_BANK2_PIN15_MA |
@@ -169,7 +169,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE9_BANK2_PIN10_MA |
 	    HW_PINCTRL_DRIVE9_BANK2_PIN09_V |	/* Pin 113, EMI_A00 */
 	    HW_PINCTRL_DRIVE9_BANK2_PIN09_MA |
-	    HW_PINCTRL_DRIVE9_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE9_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE9_RSRVD5 |
 	    HW_PINCTRL_DRIVE9_RSRVD4 |
 	    HW_PINCTRL_DRIVE9_RSRVD3 |
@@ -186,10 +186,10 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE9_BANK2_PIN10_MA) |	/* EMI_A01 */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE9_BANK2_PIN09_MA)	/* EMI_A00 */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE9, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE9, drive);
 
 	/* DRIVE 10 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE10);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE10);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE10_BANK2_PIN23_V |	/* Pin 117, EMI_BA1 */
 	    HW_PINCTRL_DRIVE10_BANK2_PIN23_MA |
@@ -207,7 +207,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE10_BANK2_PIN17_MA |
 	    HW_PINCTRL_DRIVE10_BANK2_PIN16_V |	/* Pin 105, EMI_A07 */
 	    HW_PINCTRL_DRIVE10_BANK2_PIN16_MA |
-	    HW_PINCTRL_DRIVE10_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE10_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE10_RSRVD5 |
 	    HW_PINCTRL_DRIVE10_RSRVD4 |
 	    HW_PINCTRL_DRIVE10_RSRVD3 |
@@ -225,10 +225,10 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE10_BANK2_PIN17_MA) |	/* EMI_A08 */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE10_BANK2_PIN16_MA)	/* EMI_A07 */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE10, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE10, drive);
 
 	/* DRIVE 11 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE11);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE11);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE11_BANK2_PIN31_V |	/* Pin 114, EMI_WEN */
 	    HW_PINCTRL_DRIVE11_BANK2_PIN31_MA |
@@ -245,7 +245,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE11_BANK2_PIN25_MA |
 	    HW_PINCTRL_DRIVE11_BANK2_PIN24_V |	/* Pin 97, EMI_CASN */
 	    HW_PINCTRL_DRIVE11_BANK2_PIN24_MA |
-	    HW_PINCTRL_DRIVE11_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE11_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE11_RSRVD5 |
 	    HW_PINCTRL_DRIVE11_RSRVD4 |
 	    HW_PINCTRL_DRIVE11_RSRVD3 |
@@ -257,16 +257,17 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN31_MA) |	/* EMI_WEN  */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN30_MA) |	/* EMI_RASN */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN29_MA) |	/* EMI_CKE  */
-#if 0				/* 169-Pin BGA Package */
+#if 0
+	/* 169-Pin BGA Package */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN26_MA) |	/* EMI_CE1N */
 #endif
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN25_MA) |	/* EMI_CE0N */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE11_BANK2_PIN24_MA)	/* EMI_CASN */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE11, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE11, drive);
 
 	/* DRIVE 12 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE12);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE12);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE12_BANK3_PIN07_V |	/* Pin 85, EMI_D07 */
 	    HW_PINCTRL_DRIVE12_BANK3_PIN07_MA |
@@ -284,7 +285,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE12_BANK3_PIN01_MA |
 	    HW_PINCTRL_DRIVE12_BANK3_PIN00_V |	/* Pin 75, EMI_D00 */
 	    HW_PINCTRL_DRIVE12_BANK3_PIN00_MA |
-	    HW_PINCTRL_DRIVE12_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE12_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE12_RSRVD5 |
 	    HW_PINCTRL_DRIVE12_RSRVD4 |
 	    HW_PINCTRL_DRIVE12_RSRVD3 |
@@ -302,10 +303,10 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE12_BANK3_PIN01_MA) |	/* EMI_D01 */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE12_BANK3_PIN00_MA)	/* EMI_D00 */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE12, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE12, drive);
 
 	/* DRIVE 13 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE13);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE13);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE13_BANK3_PIN15_V |	/* Pin 95, EMI_D15 */
 	    HW_PINCTRL_DRIVE13_BANK3_PIN15_MA |
@@ -323,7 +324,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE13_BANK3_PIN09_MA |
 	    HW_PINCTRL_DRIVE13_BANK3_PIN08_V |	/* Pin 86, EMI_D08 */
 	    HW_PINCTRL_DRIVE13_BANK3_PIN08_MA |
-	    HW_PINCTRL_DRIVE13_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE13_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE13_RSRVD5 |
 	    HW_PINCTRL_DRIVE13_RSRVD4 |
 	    HW_PINCTRL_DRIVE13_RSRVD3 |
@@ -341,10 +342,10 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE13_BANK3_PIN09_MA) |	/* EMI_D09 */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE13_BANK3_PIN08_MA)	/* EMI_D08 */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE13, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE13, drive);
 
 	/* DRIVE 14 */
-	drive = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE14);
+	drive = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE14);
 	drive &= ~(
 	    HW_PINCTRL_DRIVE14_BANK3_PIN21_V |	/* Pin 72, EMI_CLKN */
 	    HW_PINCTRL_DRIVE14_BANK3_PIN21_MA |
@@ -358,7 +359,7 @@ configure_emi_drive(int ma)
 	    HW_PINCTRL_DRIVE14_BANK3_PIN17_MA |
 	    HW_PINCTRL_DRIVE14_BANK3_PIN16_V |	/* Pin 81, EMI_DQM0 */
 	    HW_PINCTRL_DRIVE14_BANK3_PIN16_MA |
-	    HW_PINCTRL_DRIVE14_RSRVD6 |	/* Always write zeroes */
+	    HW_PINCTRL_DRIVE14_RSRVD6 |		/* Always write zeroes */
 	    HW_PINCTRL_DRIVE14_RSRVD5 |
 	    HW_PINCTRL_DRIVE14_RSRVD4 |
 	    HW_PINCTRL_DRIVE14_RSRVD3 |
@@ -374,7 +375,7 @@ configure_emi_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE14_BANK3_PIN17_MA) |	/* EMI_DQM1 */
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE14_BANK3_PIN16_MA)	/* EMI_DQM0 */
 	);
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE14, drive);
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE14, drive);
 
 	return;
 }
@@ -382,11 +383,11 @@ configure_emi_drive(int ma)
 /*
  * Disable internal gate keepers on EMI pins.
  */
-void
+static void
 disable_emi_padkeepers(void)
 {
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_PULL3_SET, (
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_PULL3_SET, (
 	    HW_PINCTRL_PULL3_BANK3_PIN17 |	/* EMI_DQM1 */
 	    HW_PINCTRL_PULL3_BANK3_PIN16 |	/* EMI_DQM0 */
 	    HW_PINCTRL_PULL3_BANK3_PIN15 |	/* EMI_D15 */
@@ -413,16 +414,16 @@ disable_emi_padkeepers(void)
 /*
  * Configure external SSP pins to be used for SD/MMC.
  */
-void
+static void
 configure_ssp_mux(void)
 {
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL4_CLR, (
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN00 | /* Pin 121, SSP1_CMD */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN02 | /* Pin 122, SSP1_DATA0 */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN03 | /* Pin 123, SSP1_DATA1 */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN04 | /* Pin 124, SSP1_DATA2 */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN05 | /* Pin 125, SSP1_DATA3 */
-	    HW_PINCTRL_MUXSEL4_BANK2_PIN06)  /* Pin 127, SSP1_SCK */
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_MUXSEL4_CLR, (
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN00 |	/* Pin 121, SSP1_CMD */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN02 |	/* Pin 122, SSP1_DATA0 */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN03 |	/* Pin 123, SSP1_DATA1 */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN04 |	/* Pin 124, SSP1_DATA2 */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN05 |	/* Pin 125, SSP1_DATA3 */
+	    HW_PINCTRL_MUXSEL4_BANK2_PIN06)	/* Pin 127, SSP1_SCK */
 	);
 
 	return;
@@ -432,20 +433,20 @@ configure_ssp_mux(void)
  * Configure SSP pins drive strength to "ma".
  * Out of reset, all non-EMI pins are configured as 3.3 V.
  */
-void
+static void
 configure_ssp_drive(int ma)
 {
-	uint32_t reg = REG_READ(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE8);
-	reg &=	~(
-	    HW_PINCTRL_DRIVE8_BANK2_PIN06_MA | /* Pin 127, SSP1_SCK */
-	    HW_PINCTRL_DRIVE8_BANK2_PIN05_MA | /* Pin 125, SSP1_DATA3 */
-	    HW_PINCTRL_DRIVE8_BANK2_PIN04_MA | /* Pin 124, SSP1_DATA2 */
-	    HW_PINCTRL_DRIVE8_BANK2_PIN03_MA | /* Pin 123, SSP1_DATA1 */
-	    HW_PINCTRL_DRIVE8_BANK2_PIN02_MA | /* Pin 122, SSP1_DATA0 */
-	    HW_PINCTRL_DRIVE8_BANK2_PIN00_MA   /* Pin 121, SSP1_CMD */
+	uint32_t reg = REG_RD(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE8);
+	reg &= ~(
+	    HW_PINCTRL_DRIVE8_BANK2_PIN06_MA |	/* Pin 127, SSP1_SCK */
+	    HW_PINCTRL_DRIVE8_BANK2_PIN05_MA |	/* Pin 125, SSP1_DATA3 */
+	    HW_PINCTRL_DRIVE8_BANK2_PIN04_MA |	/* Pin 124, SSP1_DATA2 */
+	    HW_PINCTRL_DRIVE8_BANK2_PIN03_MA |	/* Pin 123, SSP1_DATA1 */
+	    HW_PINCTRL_DRIVE8_BANK2_PIN02_MA |	/* Pin 122, SSP1_DATA0 */
+	    HW_PINCTRL_DRIVE8_BANK2_PIN00_MA	/* Pin 121, SSP1_CMD */
 	);
 
-	reg |=	__SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN06_MA) |
+	reg |= __SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN06_MA) |
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN05_MA) |
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN04_MA) |
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN03_MA) |
@@ -453,32 +454,32 @@ configure_ssp_drive(int ma)
 	    __SHIFTIN(ma, HW_PINCTRL_DRIVE8_BANK2_PIN00_MA
 	);
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE8, reg);
-	
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_DRIVE8, reg);
+
 	return;
 }
 
 /*
  * Configure SSP pull ups.
  */
-void
+static void
 configure_ssp_pullups(void)
 {
 	/* Disable pull ups for SSP and let HW take care of them. */
-//	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_PULL2_CLR, (
-//	    HW_PINCTRL_PULL2_BANK2_PIN05 |/* Pin 125, SSP1_DATA3 */
-//	    HW_PINCTRL_PULL2_BANK2_PIN04 | /* Pin 124, SSP1_DATA2 */
-//	    HW_PINCTRL_PULL2_BANK2_PIN03 | /* Pin 123, SSP1_DATA1 */
-//	    HW_PINCTRL_PULL2_BANK2_PIN02 | /* Pin 122, SSP1_DATA0 */
-//	    HW_PINCTRL_PULL2_BANK2_PIN00   /* Pin 121, SSP1_CMD */
+//	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_PULL2_CLR, (
+//	    HW_PINCTRL_PULL2_BANK2_PIN05 |	/* Pin 125, SSP1_DATA3 */
+//	    HW_PINCTRL_PULL2_BANK2_PIN04 |	/* Pin 124, SSP1_DATA2 */
+//	    HW_PINCTRL_PULL2_BANK2_PIN03 |	/* Pin 123, SSP1_DATA1 */
+//	    HW_PINCTRL_PULL2_BANK2_PIN02 |	/* Pin 122, SSP1_DATA0 */
+//	    HW_PINCTRL_PULL2_BANK2_PIN00	/* Pin 121, SSP1_CMD */
 //	));
 
-	REG_WRITE(HW_PINCTRL_BASE + HW_PINCTRL_PULL2_SET, (
-	    HW_PINCTRL_PULL2_BANK2_PIN05 |/* Pin 125, SSP1_DATA3 */
-	    HW_PINCTRL_PULL2_BANK2_PIN04 | /* Pin 124, SSP1_DATA2 */
-	    HW_PINCTRL_PULL2_BANK2_PIN03 | /* Pin 123, SSP1_DATA1 */
-	    HW_PINCTRL_PULL2_BANK2_PIN02 | /* Pin 122, SSP1_DATA0 */
-	    HW_PINCTRL_PULL2_BANK2_PIN00   /* Pin 121, SSP1_CMD */
+	REG_WR(HW_PINCTRL_BASE + HW_PINCTRL_PULL2_SET, (
+	    HW_PINCTRL_PULL2_BANK2_PIN05 |	/* Pin 125, SSP1_DATA3 */
+	    HW_PINCTRL_PULL2_BANK2_PIN04 |	/* Pin 124, SSP1_DATA2 */
+	    HW_PINCTRL_PULL2_BANK2_PIN03 |	/* Pin 123, SSP1_DATA1 */
+	    HW_PINCTRL_PULL2_BANK2_PIN02 |	/* Pin 122, SSP1_DATA0 */
+	    HW_PINCTRL_PULL2_BANK2_PIN00	/* Pin 121, SSP1_CMD */
 	));
 
 	return;

Index: src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd
diff -u src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd:1.2 src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd:1.3
--- src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd:1.2	Tue Nov 20 21:36:35 2012
+++ src/sys/arch/evbarm/stand/bootimx23/bootimx23.bd	Sun Dec 16 19:08:44 2012
@@ -1,4 +1,4 @@
-/* $Id: bootimx23.bd,v 1.2 2012/11/20 21:36:35 jkunz Exp $ */
+/* $Id: bootimx23.bd,v 1.3 2012/12/16 19:08:44 jkunz Exp $ */
 
 /*
  * elftosb command file.
@@ -25,7 +25,7 @@ section (0) {
 	load boot_prep;
 	call boot_prep;
 
-	// Load and start NetBSD kernel.
+	// Load kernel to DRAM.
 	load netbsd;
 	jump netbsd;
 }
Index: src/sys/arch/evbarm/stand/bootimx23/power_prep.c
diff -u src/sys/arch/evbarm/stand/bootimx23/power_prep.c:1.2 src/sys/arch/evbarm/stand/bootimx23/power_prep.c:1.3
--- src/sys/arch/evbarm/stand/bootimx23/power_prep.c:1.2	Tue Nov 20 23:39:33 2012
+++ src/sys/arch/evbarm/stand/bootimx23/power_prep.c	Sun Dec 16 19:08:45 2012
@@ -1,4 +1,4 @@
-/* $Id: power_prep.c,v 1.2 2012/11/20 23:39:33 jkunz Exp $ */
+/* $Id: power_prep.c,v 1.3 2012/12/16 19:08:45 jkunz Exp $ */
 
 /*
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,8 +30,8 @@
  */
 
 #include <sys/param.h>
-#include <sys/cdefs.h>
 #include <sys/types.h>
+#include <sys/cdefs.h>
 
 #include <arm/imx/imx23_powerreg.h>
 
@@ -39,542 +39,221 @@
 
 #include "common.h"
 
-void charge_4p2_capacitance(void);
-void enable_4p2_linreg(void);
-void enable_dcdc(void);
-void enable_vbusvalid_comparator(void);
-void set_targets(void);
-void dcdc4p2_enable_dcdc(void);
-void p5vctrl_enable_dcdc(void);
-void enable_vddmem(void);
-
-/*
- * Power rail voltage targets, brownout levels and linear regulator
- * offsets from the target.
- *
- * Supply	Target	BO	LinReg offset
- * ------------------------------------------
- * VDDD		1.550 V	1.450 V	-25 mV
- * VDDA		1.750 V	1.575 V	-25 mV
- * VDDIO	3.100 V	2.925 V	-25 mV
- * VDDMEM	2.500 V <na>	<na>
- *
- * BO = Brownout level below target.
- */
-#define VDDD_TARGET 0x1e
-#define VDDD_BO_OFFSET 0x4
-#define VDDD_LINREG_OFFSET 0x02
-
-#define VDDA_TARGET 0x0A
-#define VDDA_BO_OFFSET 0x07
-#define VDDA_LINREG_OFFSET 0x02
-
-#define VDDIO_TARGET 0x0C
-#define VDDIO_BO_OFFSET 0x07
-#define VDDIO_LINREG_OFFSET 0x02
-
-#define VDDMEM_TARGET 0x10
-
-/*
- * Threshold voltage for the VBUSVALID comparator.
- * Always make sure that the VDD5V voltage level is higher.
- */
-#define VBUSVALID_TRSH 0x02	/* 4.1 V */
-
-/* Limits for BATT charger + 4P2 current */
-#define P4P2_ILIMIT_MIN 0x01	/* 10 mA */
-#define P4P2_ILIMIT_MAX 0x3f	/* 780 mA */
+static void set_vddd_target(uint8_t);
+static void set_vdda_target(uint8_t);
+static void set_vddio_target(uint8_t);
+static void set_vddmem_target(uint8_t);
+#ifdef DEBUG
+static void print_regs(void);
+#endif
+
+#define VDDD_TARGET	0x1e	/* 1550 mV */
+#define VDDA_TARGET	0x0a	/* 1750 mV */
+#define VDDIO_TARGET	0x0c	/* 3100 mV */
+#define VDDMEM_TARGET	0x10	/* 2500 mV */
 
-/*
- * Trip point for the comparison between the DCDC_4P2 and BATTERY pin.
- * If this voltage comparation is true then 5 V originated power will supply
- * the DCDC. Otherwise battery will be used.
- */
-#define DCDC4P2_CMPTRIP 0x00	/* DCDC_4P2 pin > 0.85 * BATTERY pin */
+static int five_volts = 0;
 
 /*
- * Adjust the behavior of the DCDC and 4.2 V circuit.
- * Two MSBs control the VDD4P2 brownout below the DCDC4P2_TRG before the
- * regulation circuit steals battery charge. Two LSBs control which power
- * source is selected by the DCDC.
- */
-#define DCDC4P2_DROPOUT_CTRL_BO_200 0x0C
-#define DCDC4P2_DROPOUT_CTRL_BO_100 0x08
-#define DCDC4P2_DROPOUT_CTRL_BO_050 0x04
-#define DCDC4P2_DROPOUT_CTRL_BO_025 0x00
-
-#define DCDC4P2_DROPOUT_CTRL_SEL_4P2 0x00	/* Don't use battery at all. */
-#define DCDC4P2_DROPOUT_CTRL_SEL_BATT_IF_GT_4P2 0x01	/* BATT if 4P2 < BATT */
-#define DCDC4P2_DROPOUT_CTRL_SEL_HIGHER 0x02	/* Selects which ever is
-						 * higher. */
-
-#define DCDC4P2_DROPOUT_CTRL (DCDC4P2_DROPOUT_CTRL_BO_200 |\
-	    DCDC4P2_DROPOUT_CTRL_SEL_4P2)
-
-/*
- * Prepare system for a 5 V operation.
+ * If 5V is present, all power rails are powered from the LinRegs.
  *
- * The system uses inefficient linear regulators as a power source after boot.
- * This code enables the use of more energy efficient DC-DC converter as a
- * power source.
+ * If powered from the battery, the DC-DC converter starts when battery power
+ * is detected and the PSWITCH button is pressed. In this state, the VDDA and
+ * VDDIO rails are powered on from DC-DC, but the VDDD rail is powered from its
+ * LinReg.
  */
 int
 power_prep(void)
 {
-
-	/* Enable clocks to the power block */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR, HW_POWER_CTRL_CLKGATE);
-
-	set_targets();
-	enable_vbusvalid_comparator();
-	enable_4p2_linreg();
-	charge_4p2_capacitance();
-	enable_dcdc();
-	enable_vddmem();
-
+	if (REG_RD(HW_POWER_BASE + HW_POWER_STS) & HW_POWER_STS_VDD5V_GT_VDDIO)
+		five_volts = 1;
+#ifdef DEBUG
+	if (five_volts)
+		printf("Powered from 5V\n\r");
+	else
+		printf("Powered from the battery.\n\r");
+	print_regs();
+#endif
+	set_vddd_target(VDDD_TARGET);
+	set_vdda_target(VDDA_TARGET);
+	set_vddio_target(VDDIO_TARGET);
+	set_vddmem_target(VDDMEM_TARGET);
+#ifdef DEBUG
+	print_regs();
+#endif
 	return 0;
 }
 
 /*
- * Set switching converter voltage targets, brownout levels and linear
- * regulator output offsets.
+ * Set VDDD target voltage.
  */
-void
-set_targets(void)
+static void
+set_vddd_target(uint8_t target)
 {
-	uint32_t vddctrl;
-
-	/* VDDD */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDDCTRL);
-
-	vddctrl &= ~(HW_POWER_VDDDCTRL_LINREG_OFFSET |
-	    HW_POWER_VDDDCTRL_BO_OFFSET |
-	    HW_POWER_VDDDCTRL_TRG);
-	vddctrl |=
-	    __SHIFTIN(VDDD_LINREG_OFFSET, HW_POWER_VDDDCTRL_LINREG_OFFSET) |
-	    __SHIFTIN(VDDD_BO_OFFSET, HW_POWER_VDDDCTRL_BO_OFFSET) |
-	    __SHIFTIN(VDDD_TARGET, HW_POWER_VDDDCTRL_TRG);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDDCTRL, vddctrl);
-
-	/* VDDA */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDACTRL);
-
-	vddctrl &= ~(HW_POWER_VDDACTRL_LINREG_OFFSET |
-	    HW_POWER_VDDACTRL_BO_OFFSET |
-	    HW_POWER_VDDACTRL_TRG);
-	vddctrl |=
-	    __SHIFTIN(VDDA_LINREG_OFFSET, HW_POWER_VDDACTRL_LINREG_OFFSET) |
-	    __SHIFTIN(VDDA_BO_OFFSET, HW_POWER_VDDACTRL_BO_OFFSET) |
-	    __SHIFTIN(VDDA_TARGET, HW_POWER_VDDACTRL_TRG);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDACTRL, vddctrl);
-
-	/* VDDIO */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDIOCTRL);
-
-	vddctrl &= ~(HW_POWER_VDDIOCTRL_LINREG_OFFSET |
-	    HW_POWER_VDDIOCTRL_BO_OFFSET |
-	    HW_POWER_VDDIOCTRL_TRG);
-	vddctrl |=
-	    __SHIFTIN(VDDIO_LINREG_OFFSET, HW_POWER_VDDACTRL_LINREG_OFFSET) |
-	    __SHIFTIN(VDDIO_BO_OFFSET, HW_POWER_VDDACTRL_BO_OFFSET) |
-	    __SHIFTIN(VDDIO_TARGET, HW_POWER_VDDACTRL_TRG);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDIOCTRL, vddctrl);
-
-	/* VDDMEM */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDMEMCTRL);
-	vddctrl &= ~(HW_POWER_VDDMEMCTRL_TRG);
-	vddctrl |= __SHIFTIN(VDDMEM_TARGET, HW_POWER_VDDMEMCTRL_TRG);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddctrl);
-
-	return;
-}
-
-/*
- * VBUSVALID comparator is accurate method to determine the presence of 5 V.
- * Turn on the comparator, set its voltage treshold and instruct DC-DC to
- * use it.
- */
-void
-enable_vbusvalid_comparator()
-{
-	uint32_t p5vctrl;
+	uint32_t vddd;
+	uint8_t curtrg;
 
+	vddd = REG_RD(HW_POWER_BASE + HW_POWER_VDDDCTRL);
+	
 	/*
-	 * Disable 5 V brownout detection temporarily because setting
-	 * VBUSVALID_5VDETECT can cause false brownout.
+	 * VDDD is always powered from the linear regulator.
+	 *
+	 * Setting LINREG_OFFSET to 0 is recommended when powering VDDD from
+	 * the linear regulator. It is also recommended to set DISABLE_STEPPING
+	 * when powering VDDD from the linear regulators.
 	 */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_PWDN_5VBRNOUT);
+	vddd &= ~(HW_POWER_VDDDCTRL_LINREG_OFFSET);
+	vddd |= HW_POWER_VDDDCTRL_DISABLE_STEPPING;
 
-	p5vctrl = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
+	REG_WR(HW_POWER_BASE + HW_POWER_VDDDCTRL, vddd);
+	delay(1000);
 
-	p5vctrl &= ~HW_POWER_5VCTRL_VBUSVALID_TRSH;
-	p5vctrl |=
-	    /* Turn on VBUS comparators. */
-	    (HW_POWER_5VCTRL_PWRUP_VBUS_CMPS |
-	    /* Set treshold for VBUSVALID comparator. */
-	    __SHIFTIN(VBUSVALID_TRSH, HW_POWER_5VCTRL_VBUSVALID_TRSH) |
-	    /* Set DC-DC to use VBUSVALID comparator. */
-	    HW_POWER_5VCTRL_VBUSVALID_5VDETECT);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL, p5vctrl);
-
-	/* Enable temporarily disabled 5 V brownout detection. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_PWDN_5VBRNOUT);
+	curtrg = __SHIFTOUT(vddd, HW_POWER_VDDDCTRL_TRG);
 
-	return;
-}
-
-/*
- * Enable 4P2 linear regulator.
- */
-void
-enable_4p2_linreg(void)
-{
-	uint32_t dcdc4p2;
-	uint32_t p5vctrl;
-
-	dcdc4p2 = REG_READ(HW_POWER_BASE + HW_POWER_DCDC4P2);
-	/* Set the 4P2 target to 4.2 V and BO to 3.6V by clearing TRG and BO
-	 * field. */
-	dcdc4p2 &= ~(HW_POWER_DCDC4P2_TRG | HW_POWER_DCDC4P2_BO);
-	/* Enable the 4P2 circuitry to control the LinReg. */
-	dcdc4p2 |= HW_POWER_DCDC4P2_ENABLE_4P2;
-	REG_WRITE(HW_POWER_BASE + HW_POWER_DCDC4P2, dcdc4p2);
-
-	/* The 4P2 LinReg needs a static load to operate correctly. Since the
-	 * DC-DC is not yet loading the LinReg, another load must be used. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CHARGE_SET,
-	    HW_POWER_CHARGE_ENABLE_LOAD);
-
-	p5vctrl = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-	p5vctrl &= ~(HW_POWER_5VCTRL_CHARGE_4P2_ILIMIT |
-	    /* Power on the 4P2 LinReg. ON = 0x0, OFF = 0x1 */
-	    HW_POWER_5VCTRL_PWD_CHARGE_4P2);
-	p5vctrl |=
-	    /* Provide an initial current limit for the 4P2 LinReg with the
-	     * smallest value possible. */
-	    __SHIFTIN(P4P2_ILIMIT_MIN, HW_POWER_5VCTRL_CHARGE_4P2_ILIMIT);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL, p5vctrl);
-
-	/* Ungate the path from 4P2 LinReg to DC-DC. */
-	dcdc4p2_enable_dcdc();
+	/* Because HW stepping is disabled, raise voltage to target slowly. */
+	for (curtrg++; curtrg <= target; curtrg++) {
+		vddd = REG_RD(HW_POWER_BASE + HW_POWER_VDDDCTRL);
+		vddd &= ~(HW_POWER_VDDDCTRL_TRG);
+		vddd |= __SHIFTIN(curtrg, HW_POWER_VDDDCTRL_TRG);
+		REG_WR(HW_POWER_BASE + HW_POWER_VDDDCTRL, vddd);
+		delay(1000);
+	}
 
 	return;
 }
 
-/*
- * There is capacitor on the 4P2 output which must be charged before powering
- * on the 4P2 linear regulator to avoid brownouts on the 5 V source.
- * Charging is done by slowly increasing current limit until it reaches
- * P4P2_ILIMIT_MAX.
- */
-void
-charge_4p2_capacitance(void)
+static void
+set_vdda_target(uint8_t target)
 {
-	uint32_t ilimit;
-	uint32_t p5vctrl;
+	uint32_t vdda;
+	uint8_t curtrg;
 
-	p5vctrl = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-	ilimit = __SHIFTOUT(p5vctrl, HW_POWER_5VCTRL_CHARGE_4P2_ILIMIT);
+	vdda = REG_RD(HW_POWER_BASE + HW_POWER_VDDACTRL);
 
-	/* Increment current limit slowly. */
-	while (ilimit < P4P2_ILIMIT_MAX) {
-		ilimit++;
-		p5vctrl &= ~(HW_POWER_5VCTRL_CHARGE_4P2_ILIMIT);
-		p5vctrl |= __SHIFTIN(ilimit, HW_POWER_5VCTRL_CHARGE_4P2_ILIMIT);
-		REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL, p5vctrl);
-		delay_us(10000);
+	/*
+	 * Setting LINREG_OFFSET to 0 is recommended when powering VDDA from
+	 * the linear regulator. It is also recommended to set DISABLE_STEPPING
+	 * when powering VDDA from the linear regulators.
+	 */
+	if (five_volts) {
+		vdda &= ~(HW_POWER_VDDACTRL_LINREG_OFFSET);
+		vdda |= HW_POWER_VDDACTRL_DISABLE_STEPPING;
+		REG_WR(HW_POWER_BASE + HW_POWER_VDDACTRL, vdda);
+		delay(1000);
+
+		curtrg = __SHIFTOUT(vdda, HW_POWER_VDDACTRL_TRG);
+
+		/*
+		 * Because HW stepping is disabled, raise voltage to target
+		 * slowly.
+		 */
+		for (curtrg++; curtrg <= target; curtrg++) {
+			vdda = REG_RD(HW_POWER_BASE + HW_POWER_VDDACTRL);
+			vdda &= ~(HW_POWER_VDDACTRL_TRG);
+			vdda |= __SHIFTIN(curtrg, HW_POWER_VDDACTRL_TRG);
+			REG_WR(HW_POWER_BASE + HW_POWER_VDDACTRL, vdda);
+			delay(1000);
+		}
+	} else {
+		vdda |= __SHIFTIN(target, HW_POWER_VDDACTRL_TRG);
+		REG_WR(HW_POWER_BASE + HW_POWER_VDDACTRL, vdda);
 	}
 
 	return;
 }
 
-/*
- * Enable DCDC to use 4P2 regulator and set its power source selection logic.
- */
-void
-enable_dcdc(void)
+static void
+set_vddio_target(uint8_t target)
 {
-	uint32_t dcdc4p2;
-	uint32_t vddctrl;
+	uint32_t vddio;
+	uint8_t curtrg;
 
-	dcdc4p2 = REG_READ(HW_POWER_BASE + HW_POWER_DCDC4P2);
-	dcdc4p2 &= ~(HW_POWER_DCDC4P2_CMPTRIP | HW_POWER_DCDC4P2_DROPOUT_CTRL);
-	/* Comparison between the DCDC_4P2 pin and BATTERY pin to choose which
-	 * will supply the DCDC. */
-	dcdc4p2 |= __SHIFTIN(DCDC4P2_CMPTRIP, HW_POWER_DCDC4P2_CMPTRIP);
-	/* DC-DC brownout and select logic. */
-	dcdc4p2 |= __SHIFTIN(DCDC4P2_DROPOUT_CTRL,
-	    HW_POWER_DCDC4P2_DROPOUT_CTRL);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_DCDC4P2, dcdc4p2);
-
-	/* Disable the automatic DC-DC startup when 5 V is lost (it is on
-	 * already) */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_DCDC_XFER);
-
-	p5vctrl_enable_dcdc();
-
-	/* Enable switching converter outputs and disable linear regulators
-	 * for VDDD, VDDIO and VDDA. */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDDCTRL);
-	vddctrl &= ~(HW_POWER_VDDDCTRL_DISABLE_FET |
-	    HW_POWER_VDDDCTRL_ENABLE_LINREG);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDDCTRL, vddctrl);
-
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDIOCTRL);
-	vddctrl &= ~HW_POWER_VDDIOCTRL_DISABLE_FET;
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDIOCTRL, vddctrl);
-
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDACTRL);
-	vddctrl &= ~(HW_POWER_VDDACTRL_DISABLE_FET |
-	    HW_POWER_VDDACTRL_ENABLE_LINREG);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDACTRL, vddctrl);
-
-	/* The 4P2 LinReg needs a static load to operate correctly. Since the
-	 * DC-DC is already running we can remove extra 100 ohm load enabled
-	 * before. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CHARGE_CLR,
-	    HW_POWER_CHARGE_ENABLE_LOAD);
+	vddio = REG_RD(HW_POWER_BASE + HW_POWER_VDDIOCTRL);
 
-	return;
-}
-
-/*
- * DCDC4P2 DCDC enable sequence according to errata #5837
- */
-void
-dcdc4p2_enable_dcdc(void)
-{
-	uint32_t dcdc4p2;
-	uint32_t p5vctrl;
-	uint32_t p5vctrl_saved;
-	uint32_t pctrl;
-	uint32_t pctrl_saved;
-
-	pctrl_saved = REG_READ(HW_POWER_BASE + HW_POWER_CTRL);
-	p5vctrl_saved = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-
-	/* Disable the power rail brownout interrupts. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-	    (HW_POWER_CTRL_ENIRQ_VDDA_BO |
-	    HW_POWER_CTRL_ENIRQ_VDDD_BO |
-	    HW_POWER_CTRL_ENIRQ_VDDIO_BO));
-
-	/* Set the HW_POWER_5VCTRL PWRUP_VBUS_CMPS bit (may already be set) */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_PWRUP_VBUS_CMPS);
-
-	/* Set the HW_POWER_5VCTRL VBUSVALID_5VDETECT bit to 0 */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_VBUSVALID_5VDETECT);
-
-	/* Set the HW_POWER_5VCTRL VBUSVALID_TRSH to 0x0 (2.9 V) */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_VBUSVALID_TRSH);
-
-	/* Disable VBUSDROOP status and interrupt. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-	    (HW_POWER_CTRL_VDD5V_DROOP_IRQ | HW_POWER_CTRL_ENIRQ_VDD5V_DROOP));
-
-	/* Set the ENABLE_DCDC bit in HW_POWER_DCDC4P2. */
-	dcdc4p2 = REG_READ(HW_POWER_BASE + HW_POWER_DCDC4P2);
-	dcdc4p2 |= HW_POWER_DCDC4P2_ENABLE_DCDC;
-	REG_WRITE(HW_POWER_BASE + HW_POWER_DCDC4P2, dcdc4p2);
-
-	delay_us(100);
-
-	pctrl = REG_READ(HW_POWER_BASE + HW_POWER_CTRL);
-	/* VBUSVALID_IRQ is set. */
-	if (__SHIFTOUT(pctrl, HW_POWER_CTRL_VBUSVALID_IRQ)) {
-		/* Set and clear the PWD_CHARGE_4P2 bit to repower on the 4P2
-		 * regulator because it is automatically shut off on a
-		 * VBUSVALID false condition. */
-		REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-		    HW_POWER_5VCTRL_PWD_CHARGE_4P2);
-		REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-		    HW_POWER_5VCTRL_PWD_CHARGE_4P2);
-		/* Ramp up the CHARGE_4P2_ILIMIT value at this point. */
-		charge_4p2_capacitance();
+	/*
+	 * Setting LINREG_OFFSET to 0 is recommended when powering VDDIO from
+	 * the linear regulator. It is also recommended to set DISABLE_STEPPING
+	 * when powering VDDIO from the linear regulators.
+	 */
+	if (five_volts) {
+		vddio &= ~(HW_POWER_VDDIOCTRL_LINREG_OFFSET);
+		vddio |= HW_POWER_VDDIOCTRL_DISABLE_STEPPING;
+		REG_WR(HW_POWER_BASE + HW_POWER_VDDIOCTRL, vddio);
+		delay(1000);
+
+		curtrg = __SHIFTOUT(vddio, HW_POWER_VDDIOCTRL_TRG);
+
+		/*
+		 * Because HW stepping is disabled, raise voltage to target
+		 * slowly.
+		 */
+		for (curtrg++; curtrg <= target; curtrg++) {
+			vddio = REG_RD(HW_POWER_BASE + HW_POWER_VDDIOCTRL);
+			vddio &= ~(HW_POWER_VDDIOCTRL_TRG);
+			vddio |= __SHIFTIN(curtrg, HW_POWER_VDDIOCTRL_TRG);
+			REG_WR(HW_POWER_BASE + HW_POWER_VDDIOCTRL, vddio);
+			delay(1000);
+		}
+	} else {
+		vddio |= __SHIFTIN(target, HW_POWER_VDDIOCTRL_TRG);
+		REG_WR(HW_POWER_BASE + HW_POWER_VDDIOCTRL, vddio);
 	}
 
-	/* Restore modified bits back to HW_POWER_CTRL. */
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDA_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDA_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDA_BO);
-
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDD_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDD_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDD_BO);
-
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDIO_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDIO_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDIO_BO);
-
-	if (pctrl_saved & HW_POWER_CTRL_VDD5V_DROOP_IRQ)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_VDD5V_DROOP_IRQ);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_VDD5V_DROOP_IRQ);
-
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDD5V_DROOP)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDD5V_DROOP);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDD5V_DROOP);
-
-	/* Restore modified bits back to HW_POWER_5VCTRL. */
-	p5vctrl = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-	p5vctrl &= ~(HW_POWER_5VCTRL_PWRUP_VBUS_CMPS |
-	    HW_POWER_5VCTRL_VBUSVALID_5VDETECT |
-	    HW_POWER_5VCTRL_VBUSVALID_TRSH);
-	p5vctrl |= __SHIFTOUT(p5vctrl_saved, HW_POWER_5VCTRL_VBUSVALID_TRSH) |
-	    (p5vctrl_saved & HW_POWER_5VCTRL_PWRUP_VBUS_CMPS) |
-	    (p5vctrl_saved & HW_POWER_5VCTRL_VBUSVALID_5VDETECT);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL, p5vctrl);
-
 	return;
 }
 
-/*
- * 5VCTRL DCDC enable sequence according to errata #5837
- */
-void
-p5vctrl_enable_dcdc(void)
+static void
+set_vddmem_target(uint8_t target)
 {
-	uint32_t p5vctrl;
-	uint32_t p5vctrl_saved;
-	uint32_t pctrl;
-	uint32_t pctrl_saved;
-
-	pctrl_saved = REG_READ(HW_POWER_BASE + HW_POWER_CTRL);
-	p5vctrl_saved = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-
-	/* Disable the power rail brownout interrupts. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-	    HW_POWER_CTRL_ENIRQ_VDDA_BO |
-	    HW_POWER_CTRL_ENIRQ_VDDD_BO |
-	    HW_POWER_CTRL_ENIRQ_VDDIO_BO);
-
-	/* Set the HW_POWER_5VCTRL PWRUP_VBUS_CMPS bit (may already be set) */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_PWRUP_VBUS_CMPS);
-
-	/* Set the HW_POWER_5VCTRL VBUSVALID_5VDETECT bit to 1 */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_VBUSVALID_5VDETECT);
-
-	/* Set the HW_POWER_5VCTRL VBUSVALID_TRSH to 0x0 (2.9 V) */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_VBUSVALID_TRSH);
-
-	/* Disable VBUSDROOP status and interrupt. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-	    (HW_POWER_CTRL_VDD5V_DROOP_IRQ | HW_POWER_CTRL_ENIRQ_VDD5V_DROOP));
-
-	/* Work over errata #2816 by disabling 5 V brownout while modifying
-	 * ENABLE_DCDC. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_CLR,
-	    HW_POWER_5VCTRL_PWDN_5VBRNOUT);
-
-	/* Set the ENABLE_DCDC bit in HW_POWER_5VCTRL. */
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_ENABLE_DCDC);
-
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL_SET,
-	    HW_POWER_5VCTRL_PWDN_5VBRNOUT);
- 
-	delay_us(100);
-
-	pctrl = REG_READ(HW_POWER_BASE + HW_POWER_CTRL);
-	/* VBUSVALID_IRQ is set. */
-	if (__SHIFTOUT(pctrl, HW_POWER_CTRL_VBUSVALID_IRQ)) {
-		/* repeat the sequence for enabling the 4P2 regulator and DCDC
-		 * from 4P2. */
-		enable_4p2_linreg();
-	}
-	/* Restore modified bits back to HW_POWER_CTRL. */
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDA_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDA_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDA_BO);
+	uint32_t vddmem;
 
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDD_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDD_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDD_BO);
-
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDDIO_BO)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDDIO_BO);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDDIO_BO);
-
-	if (pctrl_saved & HW_POWER_CTRL_VDD5V_DROOP_IRQ)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_VDD5V_DROOP_IRQ);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_VDD5V_DROOP_IRQ);
-
-	if (pctrl_saved & HW_POWER_CTRL_ENIRQ_VDD5V_DROOP)
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_SET,
-		    HW_POWER_CTRL_ENIRQ_VDD5V_DROOP);
-	else
-		REG_WRITE(HW_POWER_BASE + HW_POWER_CTRL_CLR,
-		    HW_POWER_CTRL_ENIRQ_VDD5V_DROOP);
-
-	/* Restore modified bits back to HW_POWER_5VCTRL. */
-	p5vctrl = REG_READ(HW_POWER_BASE + HW_POWER_5VCTRL);
-	p5vctrl &= ~(HW_POWER_5VCTRL_PWRUP_VBUS_CMPS |
-	    HW_POWER_5VCTRL_VBUSVALID_5VDETECT |
-	    HW_POWER_5VCTRL_VBUSVALID_TRSH);
-	p5vctrl |= __SHIFTOUT(p5vctrl_saved, HW_POWER_5VCTRL_VBUSVALID_TRSH) |
-	    (p5vctrl_saved & HW_POWER_5VCTRL_PWRUP_VBUS_CMPS) |
-	    (p5vctrl_saved & HW_POWER_5VCTRL_VBUSVALID_5VDETECT);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_5VCTRL, p5vctrl);
+	/* Set target. */
+	vddmem = REG_RD(HW_POWER_BASE + HW_POWER_VDDMEMCTRL);
+	vddmem &= ~(HW_POWER_VDDMEMCTRL_TRG);
+	vddmem |= __SHIFTIN(target, HW_POWER_VDDMEMCTRL_TRG);
+	REG_WR(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddmem);
+	delay(1000);
+
+	/* Enable VDDMEM */
+	vddmem = REG_RD(HW_POWER_BASE + HW_POWER_VDDMEMCTRL);
+	vddmem |= (HW_POWER_VDDMEMCTRL_PULLDOWN_ACTIVE |
+	    HW_POWER_VDDMEMCTRL_ENABLE_ILIMIT |
+	    HW_POWER_VDDMEMCTRL_ENABLE_LINREG);
+	REG_WR(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddmem);
+	delay(500);
+	vddmem &= ~(HW_POWER_VDDMEMCTRL_PULLDOWN_ACTIVE |
+	    HW_POWER_VDDMEMCTRL_ENABLE_ILIMIT);
+	REG_WR(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddmem);
 
 	return;
 }
+#ifdef DEBUG
+#define PRINT_REG(REG)							\
+	printf(#REG "\t%x\n\r", REG_RD(HW_POWER_BASE + REG));
 
-void
-enable_vddmem(void)
+static void
+print_regs(void)
 {
-	uint32_t vddctrl;
-
-	/* VDDMEM */
-	vddctrl = REG_READ(HW_POWER_BASE + HW_POWER_VDDMEMCTRL);
-	vddctrl |= (HW_POWER_VDDMEMCTRL_PULLDOWN_ACTIVE |
-	    HW_POWER_VDDMEMCTRL_ENABLE_ILIMIT |
-	    HW_POWER_VDDMEMCTRL_ENABLE_LINREG);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddctrl);
-	delay_us(500);
-	vddctrl &= ~(HW_POWER_VDDMEMCTRL_PULLDOWN_ACTIVE |
-	    HW_POWER_VDDMEMCTRL_ENABLE_ILIMIT);
-	REG_WRITE(HW_POWER_BASE + HW_POWER_VDDMEMCTRL, vddctrl);
-	delay_us(10000);
+	PRINT_REG(HW_POWER_CTRL);
+	PRINT_REG(HW_POWER_5VCTRL);
+	PRINT_REG(HW_POWER_MINPWR);
+	PRINT_REG(HW_POWER_CHARGE);
+	PRINT_REG(HW_POWER_VDDDCTRL);
+	PRINT_REG(HW_POWER_VDDACTRL);
+	PRINT_REG(HW_POWER_VDDIOCTRL);
+	PRINT_REG(HW_POWER_VDDMEMCTRL);
+	PRINT_REG(HW_POWER_DCDC4P2);
+	PRINT_REG(HW_POWER_MISC);
+	PRINT_REG(HW_POWER_DCLIMITS);
+	PRINT_REG(HW_POWER_LOOPCTRL);
+	PRINT_REG(HW_POWER_STS);
+	PRINT_REG(HW_POWER_SPEED);
+	PRINT_REG(HW_POWER_BATTMONITOR);
+	PRINT_REG(HW_POWER_RESET);
+	PRINT_REG(HW_POWER_DEBUG);
+	PRINT_REG(HW_POWER_SPECIAL);
+	PRINT_REG(HW_POWER_VERSION);
 
 	return;
 }
+#endif

Reply via email to