xref: /openbmc/u-boot/board/gumstix/duovero/duovero.c (revision e8f80a5a)
1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2ffe16911SAsh Charles /*
3ffe16911SAsh Charles  * (C) Copyright 2013
4ffe16911SAsh Charles  * Gumstix Inc. <www.gumstix.com>
5ffe16911SAsh Charles  * Maintainer: Ash Charles  <ash@gumstix.com>
6ffe16911SAsh Charles  */
7ffe16911SAsh Charles #include <common.h>
8ffe16911SAsh Charles #include <netdev.h>
9ffe16911SAsh Charles #include <asm/arch/sys_proto.h>
10ffe16911SAsh Charles #include <asm/arch/mmc_host_def.h>
11ffe16911SAsh Charles #include <twl6030.h>
12ffe16911SAsh Charles #include <asm/emif.h>
13ffe16911SAsh Charles #include <asm/arch/clock.h>
14ffe16911SAsh Charles #include <asm/arch/gpio.h>
15ffe16911SAsh Charles #include <asm/gpio.h>
16c62db35dSSimon Glass #include <asm/mach-types.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 
278850c5d5STom Rini #ifdef CONFIG_USB_EHCI_HCD
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  */
board_init(void)46ffe16911SAsh Charles int board_init(void)
47ffe16911SAsh Charles {
48ffe16911SAsh Charles 	gpmc_init();
49ffe16911SAsh Charles 
5092a1babfSTom 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  */
misc_init_r(void)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 
set_muxconf_regs(void)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 
1134aa2ba3aSMasahiro Yamada #if defined(CONFIG_MMC)
board_mmc_init(bd_t * bis)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 
119d5abcf94SJean-Jacques Hiblot #if !defined(CONFIG_SPL_BUILD)
board_mmc_power_init(void)120fbf1b08aSPaul Kocialkowski void board_mmc_power_init(void)
121fbf1b08aSPaul Kocialkowski {
122fbf1b08aSPaul Kocialkowski 	twl6030_power_mmc_init(0);
123fbf1b08aSPaul Kocialkowski }
124fbf1b08aSPaul Kocialkowski #endif
125d5abcf94SJean-Jacques Hiblot #endif
126ffe16911SAsh Charles 
127ffe16911SAsh Charles #if defined(CONFIG_CMD_NET)
128ffe16911SAsh Charles 
129ffe16911SAsh Charles #define GPMC_SIZE_16M	0xF
130ffe16911SAsh Charles #define GPMC_BASEADDR_MASK	0x3F
131ffe16911SAsh Charles #define GPMC_CS_ENABLE		0x1
132ffe16911SAsh Charles 
enable_gpmc_net_config(const u32 * gpmc_config,const struct gpmc_cs * cs,u32 base,u32 size)1330568dd06SLadislav Michl static void enable_gpmc_net_config(const u32 *gpmc_config, const struct gpmc_cs *cs,
134ffe16911SAsh Charles 		u32 base, u32 size)
135ffe16911SAsh Charles {
136ffe16911SAsh Charles 	writel(0, &cs->config7);
137ffe16911SAsh Charles 	sdelay(1000);
138ffe16911SAsh Charles 	/* Delay for settling */
139ffe16911SAsh Charles 	writel(gpmc_config[0], &cs->config1);
140ffe16911SAsh Charles 	writel(gpmc_config[1], &cs->config2);
141ffe16911SAsh Charles 	writel(gpmc_config[2], &cs->config3);
142ffe16911SAsh Charles 	writel(gpmc_config[3], &cs->config4);
143ffe16911SAsh Charles 	writel(gpmc_config[4], &cs->config5);
144ffe16911SAsh Charles 	writel(gpmc_config[5], &cs->config6);
145ffe16911SAsh Charles 
146ffe16911SAsh Charles 	/*
147ffe16911SAsh Charles 	 * Enable the config.  size is the CS size and goes in
148ffe16911SAsh Charles 	 * bits 11:8.  We set bit 6 to enable this CS and the base
149ffe16911SAsh Charles 	 * address goes into bits 5:0.
150ffe16911SAsh Charles 	 */
151ffe16911SAsh Charles 	writel((size << 8) | (GPMC_CS_ENABLE << 6) |
152ffe16911SAsh Charles 				 ((base >> 24) & GPMC_BASEADDR_MASK),
153ffe16911SAsh Charles 				 &cs->config7);
154ffe16911SAsh Charles 
155ffe16911SAsh Charles 	sdelay(2000);
156ffe16911SAsh Charles }
157ffe16911SAsh Charles 
158ffe16911SAsh Charles /* GPMC CS configuration for an SMSC LAN9221 ethernet controller */
159ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG1    0x2a001203
160ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG2    0x000a0a02
161ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG3    0x00020200
162ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG4    0x0a030a03
163ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG5    0x000a0a0a
164ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG6    0x8a070707
165ffe16911SAsh Charles #define NET_LAN9221_GPMC_CONFIG7    0x00000f6c
166ffe16911SAsh Charles 
167ffe16911SAsh Charles /* GPMC definitions for LAN9221 chips on expansion boards */
168ffe16911SAsh Charles static const u32 gpmc_lan_config[] = {
169ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG1,
170ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG2,
171ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG3,
172ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG4,
173ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG5,
174ffe16911SAsh Charles 	NET_LAN9221_GPMC_CONFIG6,
175ffe16911SAsh Charles 	/*CONFIG7- computed as params */
176ffe16911SAsh Charles };
177ffe16911SAsh Charles 
178ffe16911SAsh Charles /*
179ffe16911SAsh Charles  * Routine: setup_net_chip
180ffe16911SAsh Charles  * Description: Setting up the configuration GPMC registers specific to the
181ffe16911SAsh Charles  *	      Ethernet hardware.
182ffe16911SAsh Charles  */
setup_net_chip(void)183ffe16911SAsh Charles static void setup_net_chip(void)
184ffe16911SAsh Charles {
185ffe16911SAsh Charles 	enable_gpmc_net_config(gpmc_lan_config, &gpmc_cfg->cs[5], 0x2C000000,
186ffe16911SAsh Charles 			      GPMC_SIZE_16M);
187ffe16911SAsh Charles 
188ffe16911SAsh Charles 	/* Make GPIO SMSC_NRESET as output pin and send reset pulse */
189ffe16911SAsh Charles 	if (!gpio_request(SMSC_NRESET, "")) {
190ffe16911SAsh Charles 		gpio_direction_output(SMSC_NRESET, 0);
191ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 1);
192ffe16911SAsh Charles 		udelay(1);
193ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 0);
194ffe16911SAsh Charles 		udelay(1);
195ffe16911SAsh Charles 		gpio_set_value(SMSC_NRESET, 1);
196ffe16911SAsh Charles 	}
197ffe16911SAsh Charles }
198ffe16911SAsh Charles #endif
199ffe16911SAsh Charles 
board_eth_init(bd_t * bis)200ffe16911SAsh Charles int board_eth_init(bd_t *bis)
201ffe16911SAsh Charles {
202ffe16911SAsh Charles 	int rc = 0;
203ffe16911SAsh Charles #ifdef CONFIG_SMC911X
204ffe16911SAsh Charles 	rc = smc911x_initialize(0, CONFIG_SMC911X_BASE);
205ffe16911SAsh Charles #endif
206ffe16911SAsh Charles 	return rc;
207ffe16911SAsh Charles }
208ffe16911SAsh Charles 
2098850c5d5STom Rini #ifdef CONFIG_USB_EHCI_HCD
210ffe16911SAsh Charles 
211ffe16911SAsh Charles static struct omap_usbhs_board_data usbhs_bdata = {
212ffe16911SAsh Charles 	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
213ffe16911SAsh Charles 	.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
214ffe16911SAsh Charles 	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
215ffe16911SAsh Charles };
216ffe16911SAsh Charles 
ehci_hcd_init(int index,enum usb_init_type init,struct ehci_hccr ** hccr,struct ehci_hcor ** hcor)217ffe16911SAsh Charles int ehci_hcd_init(int index, enum usb_init_type init,
218ffe16911SAsh Charles 		struct ehci_hccr **hccr, struct ehci_hcor **hcor)
219ffe16911SAsh Charles {
220ffe16911SAsh Charles 	int ret;
221ffe16911SAsh Charles 	unsigned int utmi_clk;
222ffe16911SAsh Charles 	u32 auxclk, altclksrc;
223ffe16911SAsh Charles 
224ffe16911SAsh Charles 	/* Now we can enable our port clocks */
225ffe16911SAsh Charles 	utmi_clk = readl((void *)CM_L3INIT_HSUSBHOST_CLKCTRL);
226ffe16911SAsh Charles 	utmi_clk |= HSUSBHOST_CLKCTRL_CLKSEL_UTMI_P1_MASK;
227ffe16911SAsh Charles 	setbits_le32((void *)CM_L3INIT_HSUSBHOST_CLKCTRL, utmi_clk);
228ffe16911SAsh Charles 
229ffe16911SAsh Charles 	auxclk = readl(&scrm->auxclk3);
230ffe16911SAsh Charles 	/* Select sys_clk */
231ffe16911SAsh Charles 	auxclk &= ~AUXCLK_SRCSELECT_MASK;
232ffe16911SAsh Charles 	auxclk |=  AUXCLK_SRCSELECT_SYS_CLK << AUXCLK_SRCSELECT_SHIFT;
233ffe16911SAsh Charles 	/* Set the divisor to 2 */
234ffe16911SAsh Charles 	auxclk &= ~AUXCLK_CLKDIV_MASK;
235ffe16911SAsh Charles 	auxclk |= AUXCLK_CLKDIV_2 << AUXCLK_CLKDIV_SHIFT;
236ffe16911SAsh Charles 	/* Request auxilary clock #3 */
237ffe16911SAsh Charles 	auxclk |= AUXCLK_ENABLE_MASK;
238ffe16911SAsh Charles 	writel(auxclk, &scrm->auxclk3);
239ffe16911SAsh Charles 
240ffe16911SAsh Charles 	altclksrc = readl(&scrm->altclksrc);
241ffe16911SAsh Charles 
242ffe16911SAsh Charles 	/* Activate alternate system clock supplier */
243ffe16911SAsh Charles 	altclksrc &= ~ALTCLKSRC_MODE_MASK;
244ffe16911SAsh Charles 	altclksrc |= ALTCLKSRC_MODE_ACTIVE;
245ffe16911SAsh Charles 
246ffe16911SAsh Charles 	/* enable clocks */
247ffe16911SAsh Charles 	altclksrc |= ALTCLKSRC_ENABLE_INT_MASK | ALTCLKSRC_ENABLE_EXT_MASK;
248ffe16911SAsh Charles 
249ffe16911SAsh Charles 	writel(altclksrc, &scrm->altclksrc);
250ffe16911SAsh Charles 
251ffe16911SAsh Charles 	ret = omap_ehci_hcd_init(index, &usbhs_bdata, hccr, hcor);
252ffe16911SAsh Charles 	if (ret < 0)
253ffe16911SAsh Charles 		return ret;
254ffe16911SAsh Charles 
255ffe16911SAsh Charles 	return 0;
256ffe16911SAsh Charles }
257ffe16911SAsh Charles 
ehci_hcd_stop(int index)258ffe16911SAsh Charles int ehci_hcd_stop(int index)
259ffe16911SAsh Charles {
260ffe16911SAsh Charles 	return omap_ehci_hcd_stop();
261ffe16911SAsh Charles }
262ffe16911SAsh Charles #endif
263ffe16911SAsh Charles 
264ffe16911SAsh Charles /*
265ffe16911SAsh Charles  * get_board_rev() - get board revision
266ffe16911SAsh Charles  */
get_board_rev(void)267ffe16911SAsh Charles u32 get_board_rev(void)
268ffe16911SAsh Charles {
269ffe16911SAsh Charles 	return 0x20;
270ffe16911SAsh Charles }
271