xref: /openbmc/u-boot/board/gumstix/duovero/duovero.c (revision 92a1babf)
1ffe16911SAsh Charles /*
2ffe16911SAsh Charles  * (C) Copyright 2013
3ffe16911SAsh Charles  * Gumstix Inc. <www.gumstix.com>
4ffe16911SAsh Charles  * Maintainer: Ash Charles  <ash@gumstix.com>
5ffe16911SAsh Charles  *
6ffe16911SAsh Charles  * SPDX-License-Identifier:     GPL-2.0+
7ffe16911SAsh Charles  */
8ffe16911SAsh Charles #include <common.h>
9ffe16911SAsh Charles #include <netdev.h>
10ffe16911SAsh Charles #include <asm/arch/sys_proto.h>
11ffe16911SAsh Charles #include <asm/arch/mmc_host_def.h>
12ffe16911SAsh Charles #include <twl6030.h>
13ffe16911SAsh Charles #include <asm/emif.h>
14ffe16911SAsh Charles #include <asm/arch/clock.h>
15ffe16911SAsh Charles #include <asm/arch/gpio.h>
16ffe16911SAsh Charles #include <asm/gpio.h>
17ffe16911SAsh Charles 
18ffe16911SAsh Charles #include "duovero_mux_data.h"
19ffe16911SAsh Charles 
20ffe16911SAsh Charles #define WIFI_EN	43
21ffe16911SAsh Charles 
22ffe16911SAsh Charles #if defined(CONFIG_CMD_NET)
23ffe16911SAsh Charles #define SMSC_NRESET	45
24ffe16911SAsh Charles static void setup_net_chip(void);
25ffe16911SAsh Charles #endif
26ffe16911SAsh Charles 
27ffe16911SAsh Charles #ifdef CONFIG_USB_EHCI
28ffe16911SAsh Charles #include <usb.h>
29ffe16911SAsh Charles #include <asm/arch/ehci.h>
30ffe16911SAsh Charles #include <asm/ehci-omap.h>
31ffe16911SAsh Charles #endif
32ffe16911SAsh Charles 
33ffe16911SAsh Charles DECLARE_GLOBAL_DATA_PTR;
34ffe16911SAsh Charles 
35ffe16911SAsh Charles const struct omap_sysinfo sysinfo = {
36ffe16911SAsh Charles 	"Board: duovero\n"
37ffe16911SAsh Charles };
38ffe16911SAsh Charles 
39ffe16911SAsh Charles struct omap4_scrm_regs *const scrm = (struct omap4_scrm_regs *)0x4a30a000;
40ffe16911SAsh Charles 
41ffe16911SAsh Charles /**
42ffe16911SAsh Charles  * @brief board_init
43ffe16911SAsh Charles  *
44ffe16911SAsh Charles  * @return 0
45ffe16911SAsh Charles  */
46ffe16911SAsh Charles int board_init(void)
47ffe16911SAsh Charles {
48ffe16911SAsh Charles 	gpmc_init();
49ffe16911SAsh Charles 
50*92a1babfSTom Rini 	gd->bd->bi_arch_number = MACH_TYPE_DUOVERO;
51ffe16911SAsh Charles 	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
52ffe16911SAsh Charles 
53ffe16911SAsh Charles 	return 0;
54ffe16911SAsh Charles }
55ffe16911SAsh Charles 
56ffe16911SAsh Charles /**
57ffe16911SAsh Charles  * @brief misc_init_r - Configure board specific configurations
58ffe16911SAsh Charles  * such as power configurations, ethernet initialization as phase2 of
59ffe16911SAsh Charles  * boot sequence
60ffe16911SAsh Charles  *
61ffe16911SAsh Charles  * @return 0
62ffe16911SAsh Charles  */
63ffe16911SAsh Charles int misc_init_r(void)
64ffe16911SAsh Charles {
65ffe16911SAsh Charles 	int ret = 0;
66ffe16911SAsh Charles 	u8 val;
67ffe16911SAsh Charles 
68ffe16911SAsh Charles 	/* wifi setup: first enable 32Khz clock from 6030 pmic */
69ffe16911SAsh Charles 	val = 0xe1;
70ffe16911SAsh Charles 	ret = i2c_write(TWL6030_CHIP_PM, 0xbe, 1, &val, 1);
71ffe16911SAsh Charles 	if (ret)
72ffe16911SAsh Charles 		printf("Failed to enable 32Khz clock to wifi module\n");
73ffe16911SAsh Charles 
74ffe16911SAsh Charles 	/* then setup WIFI_EN as an output pin and send reset pulse */
75ffe16911SAsh Charles 	if (!gpio_request(WIFI_EN, "")) {
76ffe16911SAsh Charles 		gpio_direction_output(WIFI_EN, 0);
77ffe16911SAsh Charles 		gpio_set_value(WIFI_EN, 1);
78ffe16911SAsh Charles 		udelay(1);
79ffe16911SAsh Charles 		gpio_set_value(WIFI_EN, 0);
80ffe16911SAsh Charles 		udelay(1);
81ffe16911SAsh Charles 		gpio_set_value(WIFI_EN, 1);
82ffe16911SAsh Charles 	}
83ffe16911SAsh Charles 
84ffe16911SAsh Charles #if defined(CONFIG_CMD_NET)
85ffe16911SAsh Charles 	setup_net_chip();
86ffe16911SAsh Charles #endif
87ffe16911SAsh Charles 	return 0;
88ffe16911SAsh Charles }
89ffe16911SAsh Charles 
903ef56e61SPaul Kocialkowski void set_muxconf_regs(void)
91ffe16911SAsh Charles {
92ffe16911SAsh Charles 	do_set_mux((*ctrl)->control_padconf_core_base,
93ffe16911SAsh Charles 		   core_padconf_array_essential,
94ffe16911SAsh Charles 		   sizeof(core_padconf_array_essential) /
95ffe16911SAsh Charles 		   sizeof(struct pad_conf_entry));
96ffe16911SAsh Charles 
97ffe16911SAsh Charles 	do_set_mux((*ctrl)->control_padconf_wkup_base,
98ffe16911SAsh Charles 		   wkup_padconf_array_essential,
99ffe16911SAsh Charles 		   sizeof(wkup_padconf_array_essential) /
100ffe16911SAsh Charles 		   sizeof(struct pad_conf_entry));
101ffe16911SAsh Charles 
102ffe16911SAsh Charles 	do_set_mux((*ctrl)->control_padconf_core_base,
103ffe16911SAsh Charles 		   core_padconf_array_non_essential,
104ffe16911SAsh Charles 		   sizeof(core_padconf_array_non_essential) /
105ffe16911SAsh Charles 		   sizeof(struct pad_conf_entry));
106ffe16911SAsh Charles 
107ffe16911SAsh Charles 	do_set_mux((*ctrl)->control_padconf_wkup_base,
108ffe16911SAsh Charles 		   wkup_padconf_array_non_essential,
109ffe16911SAsh Charles 		   sizeof(wkup_padconf_array_non_essential) /
110ffe16911SAsh Charles 		   sizeof(struct pad_conf_entry));
111ffe16911SAsh Charles }
112ffe16911SAsh Charles 
113ffe16911SAsh Charles #if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
114ffe16911SAsh Charles int board_mmc_init(bd_t *bis)
115ffe16911SAsh Charles {
116ffe16911SAsh Charles 	return omap_mmc_init(0, 0, 0, -1, -1);
117ffe16911SAsh Charles }
118ffe16911SAsh Charles 
119fbf1b08aSPaul Kocialkowski void board_mmc_power_init(void)
120fbf1b08aSPaul Kocialkowski {
121fbf1b08aSPaul Kocialkowski 	twl6030_power_mmc_init(0);
122fbf1b08aSPaul Kocialkowski }
123fbf1b08aSPaul Kocialkowski #endif
124ffe16911SAsh Charles 
125ffe16911SAsh Charles #if defined(CONFIG_CMD_NET)
126ffe16911SAsh Charles 
127ffe16911SAsh Charles #define GPMC_SIZE_16M	0xF
128ffe16911SAsh Charles #define GPMC_BASEADDR_MASK	0x3F
129ffe16911SAsh Charles #define GPMC_CS_ENABLE		0x1
130ffe16911SAsh Charles 
1310568dd06SLadislav Michl static void enable_gpmc_net_config(const u32 *gpmc_config, const struct gpmc_cs *cs,
132ffe16911SAsh Charles 		u32 base, u32 size)
133ffe16911SAsh Charles {
134ffe16911SAsh Charles 	writel(0, &cs->config7);
135ffe16911SAsh Charles 	sdelay(1000);
136ffe16911SAsh Charles 	/* Delay for settling */
137ffe16911SAsh Charles 	writel(gpmc_config[0], &cs->config1);
138ffe16911SAsh Charles 	writel(gpmc_config[1], &cs->config2);
139ffe16911SAsh Charles 	writel(gpmc_config[2], &cs->config3);
140ffe16911SAsh Charles 	writel(gpmc_config[3], &cs->config4);
141ffe16911SAsh Charles 	writel(gpmc_config[4], &cs->config5);
142ffe16911SAsh Charles 	writel(gpmc_config[5], &cs->config6);
143ffe16911SAsh Charles 
144ffe16911SAsh Charles 	/*
145ffe16911SAsh Charles 	 * Enable the config.  size is the CS size and goes in
146ffe16911SAsh Charles 	 * bits 11:8.  We set bit 6 to enable this CS and the base
147ffe16911SAsh Charles 	 * address goes into bits 5:0.
148ffe16911SAsh Charles 	 */
149ffe16911SAsh Charles 	writel((size << 8) | (GPMC_CS_ENABLE << 6) |
150ffe16911SAsh Charles 				 ((base >> 24) & GPMC_BASEADDR_MASK),
151ffe16911SAsh Charles 				 &cs->config7);
152ffe16911SAsh Charles 
153ffe16911SAsh Charles 	sdelay(2000);
154ffe16911SAsh Charles }
155ffe16911SAsh Charles 
156ffe16911SAsh Charles /* GPMC CS configuration for an SMSC LAN9221 ethernet controller */
157ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG1    0x2a001203
158ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG2    0x000a0a02
159ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG3    0x00020200
160ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG4    0x0a030a03
161ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG5    0x000a0a0a
162ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG6    0x8a070707
163ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG7    0x00000f6c
164ffe16911SAsh Charles 
165ffe16911SAsh Charles /* GPMC definitions for LAN9221 chips on expansion boards */
166ffe16911SAsh Charles static const u32 gpmc_lan_config[] = {
167ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG1,
168ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG2,
169ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG3,
170ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG4,
171ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG5,
172ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG6,
173ffe16911SAsh Charles 	/*CONFIG7- computed as params */
174ffe16911SAsh Charles };
175ffe16911SAsh Charles 
176ffe16911SAsh Charles /*
177ffe16911SAsh Charles  * Routine: setup_net_chip
178ffe16911SAsh Charles  * Description: Setting up the configuration GPMC registers specific to the
179ffe16911SAsh Charles  *	      Ethernet hardware.
180ffe16911SAsh Charles  */
181ffe16911SAsh Charles static void setup_net_chip(void)
182ffe16911SAsh Charles {
183ffe16911SAsh Charles 	enable_gpmc_net_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000,
184ffe16911SAsh Charles 			      GPMC_SIZE_16M);
185ffe16911SAsh Charles 
186ffe16911SAsh Charles 	/* Make GPIO SMSC_NRESET as output pin and send reset pulse */
187ffe16911SAsh Charles 	if (!gpio_request(SMSC_NRESET, "")) {
188ffe16911SAsh Charles 		gpio_direction_output(SMSC_NRESET, 0);
189ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 1);
190ffe16911SAsh Charles 		udelay(1);
191ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 0);
192ffe16911SAsh Charles 		udelay(1);
193ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 1);
194ffe16911SAsh Charles 	}
195ffe16911SAsh Charles }
196ffe16911SAsh Charles #endif
197ffe16911SAsh Charles 
198ffe16911SAsh Charles int board_eth_init(bd_t *bis)
199ffe16911SAsh Charles {
200ffe16911SAsh Charles 	int rc = 0;
201ffe16911SAsh Charles #ifdef CONFIG_SMC911X
202ffe16911SAsh Charles 	rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
203ffe16911SAsh Charles #endif
204ffe16911SAsh Charles 	return rc;
205ffe16911SAsh Charles }
206ffe16911SAsh Charles 
207ffe16911SAsh Charles #ifdef CONFIG_USB_EHCI
208ffe16911SAsh Charles 
209ffe16911SAsh Charles static struct omap_usbhs_board_data usbhs_bdata = {
210ffe16911SAsh Charles 	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
211ffe16911SAsh Charles 	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
212ffe16911SAsh Charles 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
213ffe16911SAsh Charles };
214ffe16911SAsh Charles 
215ffe16911SAsh Charles int ehci_hcd_init(int index, enum usb_init_type init,
216ffe16911SAsh Charles 		struct ehci_hccr **hccr, struct ehci_hcor **hcor)
217ffe16911SAsh Charles {
218ffe16911SAsh Charles 	int ret;
219ffe16911SAsh Charles 	unsigned int utmi_clk;
220ffe16911SAsh Charles 	u32 auxclk, altclksrc;
221ffe16911SAsh Charles 
222ffe16911SAsh Charles 	/* Now we can enable our port clocks */
223ffe16911SAsh Charles 	utmi_clk = readl((void *)CM_L3INIT_HSUSBHOST_CLKCTRL);
224ffe16911SAsh Charles 	utmi_clk |= HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK;
225ffe16911SAsh Charles 	setbits_le32((void *)CM_L3INIT_HSUSBHOST_CLKCTRL, utmi_clk);
226ffe16911SAsh Charles 
227ffe16911SAsh Charles 	auxclk = readl(&scrm->auxclk3);
228ffe16911SAsh Charles 	/* Select sys_clk */
229ffe16911SAsh Charles 	auxclk &= ~AUXCLK_SRCSELECT_MASK;
230ffe16911SAsh Charles 	auxclk |=  AUXCLK_SRCSELECT_SYS_CLK << AUXCLK_SRCSELECT_SHIFT;
231ffe16911SAsh Charles 	/* Set the divisor to 2 */
232ffe16911SAsh Charles 	auxclk &= ~AUXCLK_CLKDIV_MASK;
233ffe16911SAsh Charles 	auxclk |= AUXCLK_CLKDIV_2 << AUXCLK_CLKDIV_SHIFT;
234ffe16911SAsh Charles 	/* Request auxilary clock #3 */
235ffe16911SAsh Charles 	auxclk |= AUXCLK_ENABLE_MASK;
236ffe16911SAsh Charles 	writel(auxclk, &scrm->auxclk3);
237ffe16911SAsh Charles 
238ffe16911SAsh Charles 	altclksrc = readl(&scrm->altclksrc);
239ffe16911SAsh Charles 
240ffe16911SAsh Charles 	/* Activate alternate system clock supplier */
241ffe16911SAsh Charles 	altclksrc &= ~ALTCLKSRC_MODE_MASK;
242ffe16911SAsh Charles 	altclksrc |= ALTCLKSRC_MODE_ACTIVE;
243ffe16911SAsh Charles 
244ffe16911SAsh Charles 	/* enable clocks */
245ffe16911SAsh Charles 	altclksrc |= ALTCLKSRC_ENABLE_INT_MASK | ALTCLKSRC_ENABLE_EXT_MASK;
246ffe16911SAsh Charles 
247ffe16911SAsh Charles 	writel(altclksrc, &scrm->altclksrc);
248ffe16911SAsh Charles 
249ffe16911SAsh Charles 	ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
250ffe16911SAsh Charles 	if (ret < 0)
251ffe16911SAsh Charles 		return ret;
252ffe16911SAsh Charles 
253ffe16911SAsh Charles 	return 0;
254ffe16911SAsh Charles }
255ffe16911SAsh Charles 
256ffe16911SAsh Charles int ehci_hcd_stop(int index)
257ffe16911SAsh Charles {
258ffe16911SAsh Charles 	return omap_ehci_hcd_stop();
259ffe16911SAsh Charles }
260ffe16911SAsh Charles #endif
261ffe16911SAsh Charles 
262ffe16911SAsh Charles /*
263ffe16911SAsh Charles  * get_board_rev() - get board revision
264ffe16911SAsh Charles  */
265ffe16911SAsh Charles u32 get_board_rev(void)
266ffe16911SAsh Charles {
267ffe16911SAsh Charles 	return 0x20;
268ffe16911SAsh Charles }
269