Blame view

board/freescale/mx7dsabresd/mx7dsabresd.c 8.58 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
2
3
  /*
   * Copyright (C) 2015 Freescale Semiconductor, Inc.
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
4
   */
5255932f0   Simon Glass   common: Move some...
5
  #include <init.h>
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
6
7
8
9
10
  #include <asm/arch/clock.h>
  #include <asm/arch/imx-regs.h>
  #include <asm/arch/mx7-pins.h>
  #include <asm/arch/sys_proto.h>
  #include <asm/gpio.h>
552a848e4   Stefano Babic   imx: reorganize I...
11
  #include <asm/mach-imx/iomux-v3.h>
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
12
13
14
  #include <asm/io.h>
  #include <linux/sizes.h>
  #include <common.h>
e37ac717d   Yangbo Lu   Convert to use fs...
15
  #include <fsl_esdhc_imx.h>
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
16
17
  #include <mmc.h>
  #include <miiphy.h>
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
18
19
20
21
  #include <power/pmic.h>
  #include <power/pfuze3000_pmic.h>
  #include "../common/pfuze.h"
  #include <i2c.h>
552a848e4   Stefano Babic   imx: reorganize I...
22
  #include <asm/mach-imx/mxc_i2c.h>
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
23
24
25
26
27
28
  #include <asm/arch/crm_regs.h>
  
  DECLARE_GLOBAL_DATA_PTR;
  
  #define UART_PAD_CTRL  (PAD_CTL_DSE_3P3V_49OHM | \
  	PAD_CTL_PUS_PU100KOHM | PAD_CTL_HYS)
ebe517b63   Peng Fan   imx: mx7dsabresd:...
29
30
  #define LCD_PAD_CTRL    (PAD_CTL_HYS | PAD_CTL_PUS_PU100KOHM | \
  	PAD_CTL_DSE_3P3V_49OHM)
6e1a41cd6   Peng Fan   imx: mx7dsabresd:...
31
  #define NAND_PAD_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_SLOW | PAD_CTL_HYS)
9cd37b02a   Angus Ainslie   imx7: SPI: add su...
32
33
  #define SPI_PAD_CTRL \
    (PAD_CTL_HYS | PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_SRE_FAST)
6e1a41cd6   Peng Fan   imx: mx7dsabresd:...
34
  #define NAND_PAD_READY0_CTRL (PAD_CTL_DSE_3P3V_49OHM | PAD_CTL_PUS_PU5KOHM)
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
35

6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
36
  #ifdef CONFIG_MXC_SPI
9cd37b02a   Angus Ainslie   imx7: SPI: add su...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  static iomux_v3_cfg_t const ecspi3_pads[] = {
      MX7D_PAD_SAI2_RX_DATA__ECSPI3_SCLK | MUX_PAD_CTRL(SPI_PAD_CTRL),
      MX7D_PAD_SAI2_TX_SYNC__ECSPI3_MISO | MUX_PAD_CTRL(SPI_PAD_CTRL),
      MX7D_PAD_SAI2_TX_BCLK__ECSPI3_MOSI | MUX_PAD_CTRL(SPI_PAD_CTRL),
      MX7D_PAD_SAI2_TX_DATA__GPIO6_IO22 | MUX_PAD_CTRL(NO_PAD_CTRL),
  };
  
  int board_spi_cs_gpio(unsigned bus, unsigned cs)
  {
           return (bus == 2 && cs == 0) ? (IMX_GPIO_NR(6, 22)) : -1;
  }
  
  static void setup_spi(void)
  {
           imx_iomux_v3_setup_multiple_pads(ecspi3_pads, ARRAY_SIZE(ecspi3_pads));
  }
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
53
  #endif
9cd37b02a   Angus Ainslie   imx7: SPI: add su...
54

1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  int dram_init(void)
  {
  	gd->ram_size = PHYS_SDRAM_SIZE;
  
  	return 0;
  }
  
  static iomux_v3_cfg_t const wdog_pads[] = {
  	MX7D_PAD_GPIO1_IO00__WDOG1_WDOG_B | MUX_PAD_CTRL(NO_PAD_CTRL),
  };
  
  static iomux_v3_cfg_t const uart1_pads[] = {
  	MX7D_PAD_UART1_TX_DATA__UART1_DCE_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
  	MX7D_PAD_UART1_RX_DATA__UART1_DCE_RX | MUX_PAD_CTRL(UART_PAD_CTRL),
  };
6e1a41cd6   Peng Fan   imx: mx7dsabresd:...
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
  #ifdef CONFIG_NAND_MXS
  static iomux_v3_cfg_t const gpmi_pads[] = {
  	MX7D_PAD_SD3_DATA0__NAND_DATA00 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA1__NAND_DATA01 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA2__NAND_DATA02 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA3__NAND_DATA03 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA4__NAND_DATA04 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA5__NAND_DATA05 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA6__NAND_DATA06 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_DATA7__NAND_DATA07 | MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_CLK__NAND_CLE	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_CMD__NAND_ALE	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_STROBE__NAND_RE_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SD3_RESET_B__NAND_WE_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_MCLK__NAND_WP_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_RX_BCLK__NAND_CE3_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_RX_SYNC__NAND_CE2_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_RX_DATA__NAND_CE1_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_TX_BCLK__NAND_CE0_B	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_TX_SYNC__NAND_DQS	| MUX_PAD_CTRL(NAND_PAD_CTRL),
  	MX7D_PAD_SAI1_TX_DATA__NAND_READY_B	| MUX_PAD_CTRL(NAND_PAD_READY0_CTRL),
  };
  
  static void setup_gpmi_nand(void)
  {
  	imx_iomux_v3_setup_multiple_pads(gpmi_pads, ARRAY_SIZE(gpmi_pads));
  
  	/* NAND_USDHC_BUS_CLK is set in rom */
  	set_clk_nand();
  }
  #endif
ebe517b63   Peng Fan   imx: mx7dsabresd:...
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
  #ifdef CONFIG_VIDEO_MXS
  static iomux_v3_cfg_t const lcd_pads[] = {
  	MX7D_PAD_LCD_CLK__LCD_CLK | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_ENABLE__LCD_ENABLE | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_HSYNC__LCD_HSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_VSYNC__LCD_VSYNC | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA00__LCD_DATA0 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA01__LCD_DATA1 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA02__LCD_DATA2 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA03__LCD_DATA3 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA04__LCD_DATA4 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA05__LCD_DATA5 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA06__LCD_DATA6 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA07__LCD_DATA7 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA08__LCD_DATA8 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA09__LCD_DATA9 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA10__LCD_DATA10 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA11__LCD_DATA11 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA12__LCD_DATA12 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA13__LCD_DATA13 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA14__LCD_DATA14 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA15__LCD_DATA15 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA16__LCD_DATA16 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA17__LCD_DATA17 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA18__LCD_DATA18 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA19__LCD_DATA19 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA20__LCD_DATA20 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA21__LCD_DATA21 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA22__LCD_DATA22 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  	MX7D_PAD_LCD_DATA23__LCD_DATA23 | MUX_PAD_CTRL(LCD_PAD_CTRL),
  
  	MX7D_PAD_LCD_RESET__GPIO3_IO4	| MUX_PAD_CTRL(LCD_PAD_CTRL),
  };
  
  static iomux_v3_cfg_t const pwm_pads[] = {
  	/* Use GPIO for Brightness adjustment, duty cycle = period */
  	MX7D_PAD_GPIO1_IO01__GPIO1_IO1 | MUX_PAD_CTRL(NO_PAD_CTRL),
  };
  
  static int setup_lcd(void)
  {
  	imx_iomux_v3_setup_multiple_pads(lcd_pads, ARRAY_SIZE(lcd_pads));
  
  	imx_iomux_v3_setup_multiple_pads(pwm_pads, ARRAY_SIZE(pwm_pads));
  
  	/* Reset LCD */
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
147
  	gpio_request(IMX_GPIO_NR(3, 4), "lcd reset");
ebe517b63   Peng Fan   imx: mx7dsabresd:...
148
149
150
151
152
  	gpio_direction_output(IMX_GPIO_NR(3, 4) , 0);
  	udelay(500);
  	gpio_direction_output(IMX_GPIO_NR(3, 4) , 1);
  
  	/* Set Brightness to high */
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
153
  	gpio_request(IMX_GPIO_NR(1, 1), "lcd backlight");
ebe517b63   Peng Fan   imx: mx7dsabresd:...
154
155
156
157
158
  	gpio_direction_output(IMX_GPIO_NR(1, 1) , 1);
  
  	return 0;
  }
  #endif
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
159
160
161
162
  static void setup_iomux_uart(void)
  {
  	imx_iomux_v3_setup_multiple_pads(uart1_pads, ARRAY_SIZE(uart1_pads));
  }
62d8cce9f   Peng Fan   imx: mx7dsabresd:...
163
  int board_mmc_get_env_dev(int devno)
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
164
  {
62d8cce9f   Peng Fan   imx: mx7dsabresd:...
165
166
  	if (devno == 2)
  		devno--;
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
167

62d8cce9f   Peng Fan   imx: mx7dsabresd:...
168
  	return devno;
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
169
  }
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
170
  int mmc_map_to_kernel_blk(int dev_no)
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
171
172
173
174
175
176
  {
  	if (dev_no == 1)
  		dev_no++;
  
  	return dev_no;
  }
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
177
  #ifdef CONFIG_FEC_MXC
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
178
179
180
181
182
183
184
185
186
  static int setup_fec(void)
  {
  	struct iomuxc_gpr_base_regs *const iomuxc_gpr_regs
  		= (struct iomuxc_gpr_base_regs *) IOMUXC_GPR_BASE_ADDR;
  
  	/* Use 125M anatop REF_CLK1 for ENET1, clear gpr1[13], gpr1[17]*/
  	clrsetbits_le32(&iomuxc_gpr_regs->gpr[1],
  		(IOMUXC_GPR_GPR1_GPR_ENET1_TX_CLK_SEL_MASK |
  		 IOMUXC_GPR_GPR1_GPR_ENET1_CLK_DIR_MASK), 0);
8590786ac   Eric Nelson   imx: imx7d: remov...
187
  	return set_clk_enet(ENET_125MHZ);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
188
  }
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
189
190
191
192
193
194
195
196
197
198
199
200
201
  int board_phy_config(struct phy_device *phydev)
  {
  	/* enable rgmii rxc skew and phy mode select to RGMII copper */
  	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x21);
  	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x7ea8);
  	phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, 0x2f);
  	phy_write(phydev, MDIO_DEVAD_NONE, 0x1f, 0x71b7);
  
  	if (phydev->drv->config)
  		phydev->drv->config(phydev);
  	return 0;
  }
  #endif
53cc647dc   Peng Fan   imx: mx7dsabresd:...
202
  #ifdef CONFIG_FSL_QSPI
53cc647dc   Peng Fan   imx: mx7dsabresd:...
203
204
  int board_qspi_init(void)
  {
53cc647dc   Peng Fan   imx: mx7dsabresd:...
205
206
207
208
209
210
  	/* Set the clock */
  	set_clk_qspi();
  
  	return 0;
  }
  #endif
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
211
212
213
  int board_early_init_f(void)
  {
  	setup_iomux_uart();
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
214
215
216
217
218
219
220
  	return 0;
  }
  
  int board_init(void)
  {
  	/* address of boot parameters */
  	gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
221
222
223
  #ifdef CONFIG_FEC_MXC
  	setup_fec();
  #endif
6e1a41cd6   Peng Fan   imx: mx7dsabresd:...
224
225
226
  #ifdef CONFIG_NAND_MXS
  	setup_gpmi_nand();
  #endif
ebe517b63   Peng Fan   imx: mx7dsabresd:...
227
228
229
  #ifdef CONFIG_VIDEO_MXS
  	setup_lcd();
  #endif
53cc647dc   Peng Fan   imx: mx7dsabresd:...
230
231
232
  #ifdef CONFIG_FSL_QSPI
  	board_qspi_init();
  #endif
9cd37b02a   Angus Ainslie   imx7: SPI: add su...
233
234
235
  #ifdef CONFIG_MXC_SPI
         setup_spi();
  #endif
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
236
237
  	return 0;
  }
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
238
  #ifdef CONFIG_DM_PMIC
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
239
240
  int power_init_board(void)
  {
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
241
242
  	struct udevice *dev;
  	int ret, dev_id, rev_id;
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
243

e2b14bf4b   Joris Offouga   mx7dsabre: Fix dm...
244
  	ret = pmic_get("pfuze3000@8", &dev);
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
245
246
247
  	if (ret == -ENODEV)
  		return 0;
  	if (ret != 0)
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
248
  		return ret;
6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
249
250
251
252
  	dev_id = pmic_reg_read(dev, PFUZE3000_DEVICEID);
  	rev_id = pmic_reg_read(dev, PFUZE3000_REVID);
  	printf("PMIC: PFUZE3000 DEV_ID=0x%x REV_ID=0x%x
  ", dev_id, rev_id);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
253

6fbbcfdf0   Peng Fan   imx: mx7dsabresd:...
254
  	pmic_clrsetbits(dev, PFUZE3000_LDOGCTL, 0, 1);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
255

d8fab10cb   Gautam Bhat   mx7dsabresd: Set ...
256
257
258
259
260
  	/*
  	 * Set the voltage of VLDO4 output to 2.8V which feeds
  	 * the MIPI DSI and MIPI CSI inputs.
  	 */
  	pmic_clrsetbits(dev, PFUZE3000_VLD4CTL, 0xF, 0xA);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
261
262
263
264
265
266
  	return 0;
  }
  #endif
  
  int board_late_init(void)
  {
4fae48e8a   Peng Fan   imx: mx7dsabresd ...
267
  	struct wdog_regs *wdog = (struct wdog_regs *)WDOG1_BASE_ADDR;
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
268

1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
269
  	imx_iomux_v3_setup_multiple_pads(wdog_pads, ARRAY_SIZE(wdog_pads));
4fae48e8a   Peng Fan   imx: mx7dsabresd ...
270
271
272
273
274
275
276
  	set_wdog_reset(wdog);
  
  	/*
  	 * Do not assert internal WDOG_RESET_B_DEB(controlled by bit 4),
  	 * since we use PMIC_PWRON to reset the board.
  	 */
  	clrsetbits_le16(&wdog->wcr, 0, 0x10);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
277
278
279
  
  	return 0;
  }
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
280
281
  int checkboard(void)
  {
76b21efd5   Fabio Estevam   mx7dsabresd: Prin...
282
283
284
285
286
287
288
289
290
  	char *mode;
  
  	if (IS_ENABLED(CONFIG_ARMV7_BOOT_SEC_DEFAULT))
  		mode = "secure";
  	else
  		mode = "non-secure";
  
  	printf("Board: i.MX7D SABRESD in %s mode
  ", mode);
1a8150d4b   Adrian Alonso   imx: mx7dsabresd:...
291
292
293
  
  	return 0;
  }