xref: /netbsd-src/sys/arch/evbarm/stand/bootimx23/bootimx23.c (revision 94de07308fa702688d56949a9efc73b223f72255)
1 /* $Id: bootimx23.c,v 1.1 2013/10/07 17:36:40 matt Exp $ */
2 
3 /*
4  * Copyright (c) 2013 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Petri Laakso.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/param.h>
33 #include <sys/cdefs.h>
34 
35 #include <arm/imx/imx23_digctlreg.h>
36 #include <arm/imx/imx23_powerreg.h>
37 #include <arm/imx/imx23_clkctrlreg.h>
38 
39 #include <lib/libsa/stand.h>
40 
41 #include "common.h"
42 
43 #define DRAM_REGS 41
44 #define HBUS_DIV 2
45 #define CPU_FRAC 22
46 #define EMI_DIV 2
47 #define EMI_FRAC 33
48 #define SSP_DIV 2
49 #define IO_FRAC 27
50 
51 /*
52  * Initialize i.MX233
53  */
54 int
_start(void)55 _start(void)
56 {
57 
58 	volatile uint32_t *digctl_ctrl_rs;
59 	volatile uint32_t *digctl_ctrl_rc;
60 	volatile uint32_t *digctl_id_r;
61 	volatile uint32_t *pwr_status_r;
62 	uint8_t boot_reason;
63 	int on_batt;
64 
65 	digctl_ctrl_rs = (uint32_t *)(HW_DIGCTL_BASE + HW_DIGCTL_CTRL_SET);
66 	digctl_ctrl_rc = (uint32_t *)(HW_DIGCTL_BASE + HW_DIGCTL_CTRL_CLR);
67 	pwr_status_r = (uint32_t *)(HW_POWER_BASE + HW_POWER_STS);
68 	digctl_id_r = (uint32_t *)(HW_DIGCTL_BASE + HW_DIGCTL_CHIPID);
69 
70 	/* Enable SJTAG. */
71 	*digctl_ctrl_rs = HW_DIGCTL_CTRL_USE_SERIAL_JTAG;
72 
73 	/* Enable microseconds timer. */
74 	*digctl_ctrl_rc = HW_DIGCTL_CTRL_XTAL24M_GATE;
75 
76 	if (*pwr_status_r & HW_POWER_STS_VDD5V_GT_VDDIO)
77 		on_batt = 0;
78 	else
79 		on_batt = 1;
80 
81 	printf("\r\nbootimx23: ");
82 	printf("HW revision TA%d, ",
83 	   (uint8_t)__SHIFTOUT(*digctl_id_r, HW_DIGCTL_CHIPID_REVISION) + 1);
84 	printf("boot reason ");
85 	boot_reason =
86 		(uint8_t) __SHIFTOUT(*pwr_status_r, HW_POWER_STS_PWRUP_SOURCE);
87 
88 	switch (boot_reason)
89 	{
90 		case 0x20:
91 			printf("5V, ");
92 			break;
93 		case 0x10:
94 			printf("RTC, ");
95 			break;
96 		case 0x02:
97 			printf("high pswitch, ");
98 			break;
99 		case 0x01:
100 			printf("mid pswitch, ");
101 			break;
102 		default:
103 			printf("UNKNOWN, ");
104 	}
105 
106 	printf("power source ");
107 	if (on_batt)
108 		printf("battery");
109 	else
110 		printf("5V");
111 	printf("\r\n");
112 
113 	/* Power. */
114 	en_vbusvalid();
115 	if (!vbusvalid())
116 		printf("WARNING: !VBUSVALID\r\n");
117 
118 	printf("Enabling 4P2 regulator...");
119 	en_4p2_reg();
120 	printf("done\r\n");
121 
122 	power_tune();
123 
124 	printf("Enabling 4P2 regulator output to DCDC...");
125 	en_4p2_to_dcdc();
126 	printf("done\r\n");
127 
128 	printf("Enabling VDDMEM...");
129 	power_vddmem(2500);
130 	printf("done\r\n");
131 
132 	printf("Powering VDDD from DCDC...");
133 	/* Boot fails if I set here TRG to +1500mV, do it later. */
134 	power_vddd_from_dcdc(1400, 1075);
135 	printf("done\r\n");
136 
137 	printf("Powering VDDA from DCDC...");
138 	power_vdda_from_dcdc(1800, 1625);
139 	printf("done\r\n");
140 
141 	/*
142 	 * VDDIO and thus SSP_CLK setup is postponed to
143 	 * imx23_olinuxino_machdep.c because SB is not able to load kernel if
144 	 * clocks are changed now.
145 	 */
146 	printf("Powering VDDIO from DCDC...");
147 	power_vddio_from_dcdc(3100, 2925);
148 	printf("done\r\n");
149 
150 	/* Clocks */
151 	printf("Enabling clocks...");
152 	en_pll();
153 	bypass_saif(); /* Always set to zero bit. */
154 	set_cpu_frac(CPU_FRAC);
155 	set_hbus_div(HBUS_DIV);
156 	bypass_cpu();
157 	power_vddd_from_dcdc(1475, 1375);
158 	set_emi_div(EMI_DIV);
159 	set_emi_frac(EMI_FRAC);
160 	bypass_emi();
161 	printf("done\r\n");
162 
163 	printf("Configuring pins...");
164 	pinctrl_prep();
165 	printf("done\r\n");
166 	printf("Configuring EMI...");
167 	emi_prep();
168 	printf("done\r\n");
169 	args_prep();
170 
171 	return 0;
172 }
173