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 */
54int
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