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