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