summaryrefslogtreecommitdiffstats
path: root/board/compulab/cm_t3517/cm_t3517.c
blob: cac1ad9ef11d1ca5be5c100c6677a4795bac0b5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
 * (C) Copyright 2014 CompuLab, Ltd. <www.compulab.co.il>
 *
 * Authors: Igor Grinberg <grinberg@compulab.co.il>
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#include <common.h>
#include <status_led.h>
#include <net.h>
#include <netdev.h>
#include <usb.h>
#include <mmc.h>
#include <linux/compiler.h>
#include <linux/usb/musb.h>

#include <asm/io.h>
#include <asm/arch/mem.h>
#include <asm/arch/am35x_def.h>
#include <asm/arch/mmc_host_def.h>
#include <asm/arch/sys_proto.h>
#include <asm/arch/musb.h>
#include <asm/omap_musb.h>
#include <asm/ehci-omap.h>

#include "../common/common.h"
#include "../common/eeprom.h"

DECLARE_GLOBAL_DATA_PTR;

const omap3_sysinfo sysinfo = {
	DDR_DISCRETE,
	"CM-T3517 board",
	"NAND 128/512M",
};

#ifdef CONFIG_USB_MUSB_AM35X
static struct musb_hdrc_config cm_t3517_musb_config = {
	.multipoint     = 1,
	.dyn_fifo       = 1,
	.num_eps        = 16,
	.ram_bits       = 12,
};

static struct omap_musb_board_data cm_t3517_musb_board_data = {
	.set_phy_power		= am35x_musb_phy_power,
	.clear_irq		= am35x_musb_clear_irq,
	.reset			= am35x_musb_reset,
};

static struct musb_hdrc_platform_data cm_t3517_musb_pdata = {
#if defined(CONFIG_MUSB_HOST)
	.mode           = MUSB_HOST,
#elif defined(CONFIG_MUSB_GADGET)
	.mode		= MUSB_PERIPHERAL,
#else
#error "Please define either CONFIG_MUSB_HOST or CONFIG_MUSB_GADGET"
#endif
	.config         = &cm_t3517_musb_config,
	.power          = 250,
	.platform_ops	= &am35x_ops,
	.board_data	= &cm_t3517_musb_board_data,
};

static void cm_t3517_musb_init(void)
{
	/*
	 * Set up USB clock/mode in the DEVCONF2 register.
	 * USB2.0 PHY reference clock is 13 MHz
	 */
	clrsetbits_le32(&am35x_scm_general_regs->devconf2,
			CONF2_REFFREQ | CONF2_OTGMODE | CONF2_PHY_GPIOMODE,
			CONF2_REFFREQ_13MHZ | CONF2_SESENDEN |
			CONF2_VBDTCTEN | CONF2_DATPOL);

	if (musb_register(&cm_t3517_musb_pdata, &cm_t3517_musb_board_data,
			  (void *)AM35XX_IPSS_USBOTGSS_BASE))
		printf("Failed initializing AM35x MUSB!\n");
}
#else
static inline void am3517_evm_musb_init(void) {}
#endif

int board_init(void)
{
	gpmc_init(); /* in SRAM or SDRAM, finish GPMC */

	/* boot param addr */
	gd->bd->bi_boot_params = (OMAP34XX_SDRC_CS0 + 0x100);

#if defined(CONFIG_STATUS_LED) && defined(STATUS_LED_BOOT)
	status_led_set(STATUS_LED_BOOT, STATUS_LED_ON);
#endif

	cm_t3517_musb_init();

	return 0;
}

int misc_init_r(void)
{
	cl_print_pcb_info();
	dieid_num_r();

	return 0;
}

#if defined(CONFIG_GENERIC_MMC) && !defined(CONFIG_SPL_BUILD)
#define SB_T35_CD_GPIO 144
#define SB_T35_WP_GPIO 59

int board_mmc_init(bd_t *bis)
{
	return omap_mmc_init(0, 0, 0, SB_T35_CD_GPIO, SB_T35_WP_GPIO);
}
#endif

#ifdef CONFIG_DRIVER_TI_EMAC
#define CONTROL_EFUSE_EMAC_LSB  0x48002380
#define CONTROL_EFUSE_EMAC_MSB  0x48002384

static int am3517_get_efuse_enetaddr(u8 *enetaddr)
{
	u32 lsb = __raw_readl(CONTROL_EFUSE_EMAC_LSB);
	u32 msb = __raw_readl(CONTROL_EFUSE_EMAC_MSB);

	enetaddr[0] = (u8)((msb >> 16) & 0xff);
	enetaddr[1] = (u8)((msb >> 8)  & 0xff);
	enetaddr[2] = (u8)(msb & 0xff);
	enetaddr[3] = (u8)((lsb >> 16) & 0xff);
	enetaddr[4] = (u8)((lsb >> 8)  & 0xff);
	enetaddr[5] = (u8)(lsb & 0xff);

	return is_valid_ether_addr(enetaddr);
}

static inline int cm_t3517_init_emac(bd_t *bis)
{
	int ret = cpu_eth_init(bis);

	if (ret > 0)
		return ret;

	printf("Failed initializing EMAC! ");
	return 0;
}
#else /* !CONFIG_DRIVER_TI_EMAC */
static inline int am3517_get_efuse_enetaddr(u8 *enetaddr) { return 1; }
static inline int cm_t3517_init_emac(bd_t *bis) { return 0; }
#endif /* CONFIG_DRIVER_TI_EMAC */

/*
 * Routine: handle_mac_address
 * Description: prepare MAC address for on-board Ethernet.
 */
static int cm_t3517_handle_mac_address(void)
{
	unsigned char enetaddr[6];
	int ret;

	ret = eth_getenv_enetaddr("ethaddr", enetaddr);
	if (ret)
		return 0;

	ret = cl_eeprom_read_mac_addr(enetaddr);
	if (ret) {
		ret = am3517_get_efuse_enetaddr(enetaddr);
		if (ret)
			return ret;
	}

	if (!is_valid_ether_addr(enetaddr))
		return -1;

	return eth_setenv_enetaddr("ethaddr", enetaddr);
}

#define SB_T35_ETH_RST_GPIO 164

/*
 * Routine: board_eth_init
 * Description: initialize module and base-board Ethernet chips
 */
int board_eth_init(bd_t *bis)
{
	int rc = 0, rc1 = 0;

	rc1 = cm_t3517_handle_mac_address();
	if (rc1)
		printf("No MAC address found! ");

	rc1 = cm_t3517_init_emac(bis);
	if (rc1 > 0)
		rc++;

	rc1 = cl_omap3_smc911x_init(0, 4, CONFIG_SMC911X_BASE,
				    NULL, SB_T35_ETH_RST_GPIO);
	if (rc1 > 0)
		rc++;

	return rc;
}

#ifdef CONFIG_USB_EHCI_OMAP
static struct omap_usbhs_board_data cm_t3517_usbhs_bdata = {
	.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
	.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
	.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
};

#define CM_T3517_USB_HUB_RESET_GPIO	152
#define SB_T35_USB_HUB_RESET_GPIO	98

int ehci_hcd_init(int index, enum usb_init_type init,
			struct ehci_hccr **hccr, struct ehci_hcor **hcor)
{
	cl_usb_hub_init(CM_T3517_USB_HUB_RESET_GPIO, "cm-t3517 hub rst");
	cl_usb_hub_init(SB_T35_USB_HUB_RESET_GPIO, "sb-t35 hub rst");

	return omap_ehci_hcd_init(index, &cm_t3517_usbhs_bdata, hccr, hcor);
}

int ehci_hcd_stop(void)
{
	cl_usb_hub_deinit(CM_T3517_USB_HUB_RESET_GPIO);
	cl_usb_hub_deinit(SB_T35_USB_HUB_RESET_GPIO);

	return omap_ehci_hcd_stop();
}
#endif /* CONFIG_USB_EHCI_OMAP */
OpenPOWER on IntegriCloud