Blame view

board/udoo/udoo.c 7.52 KB
0c5e26678   Fabio Estevam   udoo: Add initial...
1
2
3
4
5
6
7
8
9
10
11
  /*
   * Copyright (C) 2013 Freescale Semiconductor, Inc.
   *
   * Author: Fabio Estevam <fabio.estevam@freescale.com>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  
  #include <asm/arch/clock.h>
  #include <asm/arch/imx-regs.h>
  #include <asm/arch/iomux.h>
078813d21   Giuseppe Pagano   udoo: Add etherne...
12
  #include <malloc.h>
0c5e26678   Fabio Estevam   udoo: Add initial...
13
  #include <asm/arch/mx6-pins.h>
1221ce459   Masahiro Yamada   treewide: replace...
14
  #include <linux/errno.h>
0c5e26678   Fabio Estevam   udoo: Add initial...
15
  #include <asm/gpio.h>
552a848e4   Stefano Babic   imx: reorganize I...
16
17
  #include <asm/mach-imx/iomux-v3.h>
  #include <asm/mach-imx/sata.h>
0c5e26678   Fabio Estevam   udoo: Add initial...
18
19
20
21
22
  #include <mmc.h>
  #include <fsl_esdhc.h>
  #include <asm/arch/crm_regs.h>
  #include <asm/io.h>
  #include <asm/arch/sys_proto.h>
078813d21   Giuseppe Pagano   udoo: Add etherne...
23
24
25
  #include <micrel.h>
  #include <miiphy.h>
  #include <netdev.h>
0c5e26678   Fabio Estevam   udoo: Add initial...
26
27
28
29
30
31
  
  DECLARE_GLOBAL_DATA_PTR;
  
  #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |			\
  	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |			\
  	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
078813d21   Giuseppe Pagano   udoo: Add etherne...
32
33
  #define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                   \
  	PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
0c5e26678   Fabio Estevam   udoo: Add initial...
34
35
36
37
38
39
40
41
42
  #define USDHC_PAD_CTRL (PAD_CTL_PUS_47K_UP |			\
  	PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |			\
  	PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
  
  #define WDT_EN		IMX_GPIO_NR(5, 4)
  #define WDT_TRG		IMX_GPIO_NR(3, 19)
  
  int dram_init(void)
  {
78506c2f8   vpeter4   udoo: Switch to S...
43
  	gd->ram_size = imx_ddr_size();
0c5e26678   Fabio Estevam   udoo: Add initial...
44
45
46
47
48
  
  	return 0;
  }
  
  static iomux_v3_cfg_t const uart2_pads[] = {
78506c2f8   vpeter4   udoo: Switch to S...
49
50
  	IOMUX_PADS(PAD_EIM_D26__UART2_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
  	IOMUX_PADS(PAD_EIM_D27__UART2_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL)),
0c5e26678   Fabio Estevam   udoo: Add initial...
51
52
53
  };
  
  static iomux_v3_cfg_t const usdhc3_pads[] = {
78506c2f8   vpeter4   udoo: Switch to S...
54
55
56
57
58
59
  	IOMUX_PADS(PAD_SD3_CLK__SD3_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  	IOMUX_PADS(PAD_SD3_CMD__SD3_CMD    | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  	IOMUX_PADS(PAD_SD3_DAT0__SD3_DATA0 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  	IOMUX_PADS(PAD_SD3_DAT1__SD3_DATA1 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  	IOMUX_PADS(PAD_SD3_DAT2__SD3_DATA2 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
  	IOMUX_PADS(PAD_SD3_DAT3__SD3_DATA3 | MUX_PAD_CTRL(USDHC_PAD_CTRL)),
0c5e26678   Fabio Estevam   udoo: Add initial...
60
61
62
  };
  
  static iomux_v3_cfg_t const wdog_pads[] = {
78506c2f8   vpeter4   udoo: Switch to S...
63
64
  	IOMUX_PADS(PAD_EIM_A24__GPIO5_IO04 | MUX_PAD_CTRL(NO_PAD_CTRL)),
  	IOMUX_PADS(PAD_EIM_D19__GPIO3_IO19),
0c5e26678   Fabio Estevam   udoo: Add initial...
65
  };
078813d21   Giuseppe Pagano   udoo: Add etherne...
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
  int mx6_rgmii_rework(struct phy_device *phydev)
  {
  	/*
  	 * Bug: Apparently uDoo does not works with Gigabit switches...
  	 * Limiting speed to 10/100Mbps, and setting master mode, seems to
  	 * be the only way to have a successfull PHY auto negotiation.
  	 * How to fix: Understand why Linux kernel do not have this issue.
  	 */
  	phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, 0x1c00);
  
  	/* control data pad skew - devaddr = 0x02, register = 0x04 */
  	ksz9031_phy_extended_write(phydev, 0x02,
  				   MII_KSZ9031_EXT_RGMII_CTRL_SIG_SKEW,
  				   MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
  	/* rx data pad skew - devaddr = 0x02, register = 0x05 */
  	ksz9031_phy_extended_write(phydev, 0x02,
  				   MII_KSZ9031_EXT_RGMII_RX_DATA_SKEW,
  				   MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
  	/* tx data pad skew - devaddr = 0x02, register = 0x05 */
  	ksz9031_phy_extended_write(phydev, 0x02,
  				   MII_KSZ9031_EXT_RGMII_TX_DATA_SKEW,
  				   MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x0000);
  	/* gtx and rx clock pad skew - devaddr = 0x02, register = 0x08 */
  	ksz9031_phy_extended_write(phydev, 0x02,
  				   MII_KSZ9031_EXT_RGMII_CLOCK_SKEW,
  				   MII_KSZ9031_MOD_DATA_NO_POST_INC, 0x03FF);
  	return 0;
  }
  
  static iomux_v3_cfg_t const enet_pads1[] = {
78506c2f8   vpeter4   udoo: Switch to S...
96
97
98
99
100
101
102
103
104
105
  	IOMUX_PADS(PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_ENET_MDC__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TXC__RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TD0__RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TD1__RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TD2__RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TD3__RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_RXC__RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
106
  	/* RGMII reset */
78506c2f8   vpeter4   udoo: Switch to S...
107
  	IOMUX_PADS(PAD_EIM_D23__GPIO3_IO23		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
108
  	/* Ethernet power supply */
78506c2f8   vpeter4   udoo: Switch to S...
109
  	IOMUX_PADS(PAD_EIM_EB3__GPIO2_IO31		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
110
  	/* pin 32 - 1 - (MODE0) all */
78506c2f8   vpeter4   udoo: Switch to S...
111
  	IOMUX_PADS(PAD_RGMII_RD0__GPIO6_IO25		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
112
  	/* pin 31 - 1 - (MODE1) all */
78506c2f8   vpeter4   udoo: Switch to S...
113
  	IOMUX_PADS(PAD_RGMII_RD1__GPIO6_IO27		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
114
  	/* pin 28 - 1 - (MODE2) all */
78506c2f8   vpeter4   udoo: Switch to S...
115
  	IOMUX_PADS(PAD_RGMII_RD2__GPIO6_IO28		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
116
  	/* pin 27 - 1 - (MODE3) all */
78506c2f8   vpeter4   udoo: Switch to S...
117
  	IOMUX_PADS(PAD_RGMII_RD3__GPIO6_IO29		| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
118
  	/* pin 33 - 1 - (CLK125_EN) 125Mhz clockout enabled */
78506c2f8   vpeter4   udoo: Switch to S...
119
  	IOMUX_PADS(PAD_RGMII_RX_CTL__GPIO6_IO24	| MUX_PAD_CTRL(NO_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
120
121
122
  };
  
  static iomux_v3_cfg_t const enet_pads2[] = {
78506c2f8   vpeter4   udoo: Switch to S...
123
124
125
126
127
  	IOMUX_PADS(PAD_RGMII_RD0__RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_RD1__RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_RD2__RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_RD3__RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
  	IOMUX_PADS(PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL)),
078813d21   Giuseppe Pagano   udoo: Add etherne...
128
129
130
131
  };
  
  static void setup_iomux_enet(void)
  {
78506c2f8   vpeter4   udoo: Switch to S...
132
  	SETUP_IOMUX_PADS(enet_pads1);
078813d21   Giuseppe Pagano   udoo: Add etherne...
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
  	udelay(20);
  	gpio_direction_output(IMX_GPIO_NR(2, 31), 1); /* Power supply on */
  
  	gpio_direction_output(IMX_GPIO_NR(3, 23), 0); /* assert PHY rst */
  
  	gpio_direction_output(IMX_GPIO_NR(6, 24), 1);
  	gpio_direction_output(IMX_GPIO_NR(6, 25), 1);
  	gpio_direction_output(IMX_GPIO_NR(6, 27), 1);
  	gpio_direction_output(IMX_GPIO_NR(6, 28), 1);
  	gpio_direction_output(IMX_GPIO_NR(6, 29), 1);
  	udelay(1000);
  
  	gpio_set_value(IMX_GPIO_NR(3, 23), 1); /* deassert PHY rst */
  
  	/* Need 100ms delay to exit from reset. */
  	udelay(1000 * 100);
  
  	gpio_free(IMX_GPIO_NR(6, 24));
  	gpio_free(IMX_GPIO_NR(6, 25));
  	gpio_free(IMX_GPIO_NR(6, 27));
  	gpio_free(IMX_GPIO_NR(6, 28));
  	gpio_free(IMX_GPIO_NR(6, 29));
78506c2f8   vpeter4   udoo: Switch to S...
155
  	SETUP_IOMUX_PADS(enet_pads2);
078813d21   Giuseppe Pagano   udoo: Add etherne...
156
  }
0c5e26678   Fabio Estevam   udoo: Add initial...
157
158
  static void setup_iomux_uart(void)
  {
78506c2f8   vpeter4   udoo: Switch to S...
159
  	SETUP_IOMUX_PADS(uart2_pads);
0c5e26678   Fabio Estevam   udoo: Add initial...
160
161
162
163
  }
  
  static void setup_iomux_wdog(void)
  {
78506c2f8   vpeter4   udoo: Switch to S...
164
  	SETUP_IOMUX_PADS(wdog_pads);
0c5e26678   Fabio Estevam   udoo: Add initial...
165
166
  	gpio_direction_output(WDT_TRG, 0);
  	gpio_direction_output(WDT_EN, 1);
db6801dec   Giuseppe Pagano   udoo: Fix watchdo...
167
  	gpio_direction_input(WDT_TRG);
0c5e26678   Fabio Estevam   udoo: Add initial...
168
169
170
171
172
173
174
175
  }
  
  static struct fsl_esdhc_cfg usdhc_cfg = { USDHC3_BASE_ADDR };
  
  int board_mmc_getcd(struct mmc *mmc)
  {
  	return 1; /* Always present */
  }
078813d21   Giuseppe Pagano   udoo: Add etherne...
176
177
178
179
180
181
182
183
184
185
186
187
  int board_eth_init(bd_t *bis)
  {
  	uint32_t base = IMX_FEC_BASE;
  	struct mii_dev *bus = NULL;
  	struct phy_device *phydev = NULL;
  	int ret;
  
  	setup_iomux_enet();
  
  #ifdef CONFIG_FEC_MXC
  	bus = fec_get_miibus(base, -1);
  	if (!bus)
84c311f28   Fabio Estevam   udoo: Fix the err...
188
  		return -EINVAL;
078813d21   Giuseppe Pagano   udoo: Add etherne...
189
190
191
192
  	/* scan phy 4,5,6,7 */
  	phydev = phy_find_by_mask(bus, (0xf << 4), PHY_INTERFACE_MODE_RGMII);
  
  	if (!phydev) {
84c311f28   Fabio Estevam   udoo: Fix the err...
193
194
  		ret = -EINVAL;
  		goto free_bus;
078813d21   Giuseppe Pagano   udoo: Add etherne...
195
196
197
198
  	}
  	printf("using phy at %d
  ", phydev->addr);
  	ret  = fec_probe(bis, -1, base, bus, phydev);
84c311f28   Fabio Estevam   udoo: Fix the err...
199
200
  	if (ret)
  		goto free_phydev;
078813d21   Giuseppe Pagano   udoo: Add etherne...
201
202
  #endif
  	return 0;
84c311f28   Fabio Estevam   udoo: Fix the err...
203
204
205
206
207
208
  
  free_phydev:
  	free(phydev);
  free_bus:
  	free(bus);
  	return ret;
078813d21   Giuseppe Pagano   udoo: Add etherne...
209
  }
0c5e26678   Fabio Estevam   udoo: Add initial...
210
211
  int board_mmc_init(bd_t *bis)
  {
78506c2f8   vpeter4   udoo: Switch to S...
212
  	SETUP_IOMUX_PADS(usdhc3_pads);
0c5e26678   Fabio Estevam   udoo: Add initial...
213
214
215
216
217
218
219
220
221
222
223
224
225
  	usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
  	usdhc_cfg.max_bus_width = 4;
  
  	return fsl_esdhc_initialize(bis, &usdhc_cfg);
  }
  
  int board_early_init_f(void)
  {
  	setup_iomux_wdog();
  	setup_iomux_uart();
  
  	return 0;
  }
078813d21   Giuseppe Pagano   udoo: Add etherne...
226
227
228
229
230
231
232
233
  int board_phy_config(struct phy_device *phydev)
  {
  	mx6_rgmii_rework(phydev);
  	if (phydev->drv->config)
  		phydev->drv->config(phydev);
  
  	return 0;
  }
0c5e26678   Fabio Estevam   udoo: Add initial...
234
235
236
237
  int board_init(void)
  {
  	/* address of boot parameters */
  	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
10e40d54b   Simon Glass   Kconfig: Add CONF...
238
  #ifdef CONFIG_SATA
0d6a41edb   Fabio Estevam   udoo: Remove cpu ...
239
  	setup_sata();
78506c2f8   vpeter4   udoo: Switch to S...
240
241
242
243
244
245
246
247
  #endif
  	return 0;
  }
  
  int board_late_init(void)
  {
  #ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
  	if (is_cpu_type(MXC_CPU_MX6Q))
382bee57f   Simon Glass   env: Rename seten...
248
  		env_set("board_rev", "MX6Q");
78506c2f8   vpeter4   udoo: Switch to S...
249
  	else
382bee57f   Simon Glass   env: Rename seten...
250
  		env_set("board_rev", "MX6DL");
98d012292   Giuseppe Pagano   udoo: Add SATA su...
251
  #endif
0c5e26678   Fabio Estevam   udoo: Add initial...
252
253
254
255
256
  	return 0;
  }
  
  int checkboard(void)
  {
78506c2f8   vpeter4   udoo: Switch to S...
257
258
259
260
261
262
  	if (is_cpu_type(MXC_CPU_MX6Q))
  		puts("Board: Udoo Quad
  ");
  	else
  		puts("Board: Udoo DualLite
  ");
0c5e26678   Fabio Estevam   udoo: Add initial...
263
264
265
  
  	return 0;
  }