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