Blame view

board/matrix_vision/mvbc_p/mvbc_p.c 5.89 KB
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
1
2
3
4
5
6
7
8
9
10
  /*
   * (C) Copyright 2003
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
   * (C) Copyright 2004
   * Mark Jonas, Freescale Semiconductor, mark.jonas@motorola.com.
   *
   * (C) Copyright 2005-2007
   * Andre Schwarz, Matrix Vision GmbH, andre.schwarz@matrix-vision.de
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
11
   * SPDX-License-Identifier:	GPL-2.0+
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
12
13
14
15
16
17
18
   */
  
  #include <common.h>
  #include <mpc5xxx.h>
  #include <malloc.h>
  #include <pci.h>
  #include <i2c.h>
f2302d443   Stefan Roese   Fix merge problems
19
  #include <fpga.h>
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
20
21
  #include <environment.h>
  #include <fdt_support.h>
e1d7480b5   Ben Warren   Moved initializat...
22
  #include <netdev.h>
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
23
24
25
  #include <asm/io.h>
  #include "fpga.h"
  #include "mvbc_p.h"
28887d831   André Schwarz   Use common code f...
26
  #include "../common/mv_common.h"
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
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
  
  #define SDRAM_MODE	0x00CD0000
  #define SDRAM_CONTROL	0x504F0000
  #define SDRAM_CONFIG1	0xD2322800
  #define SDRAM_CONFIG2	0x8AD70000
  
  DECLARE_GLOBAL_DATA_PTR;
  
  static void sdram_start (int hi_addr)
  {
  	long hi_bit = hi_addr ? 0x01000000 : 0;
  
  	/* unlock mode register */
  	out_be32((u32*)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000000 | hi_bit);
  
  	/* precharge all banks */
  	out_be32((u32*)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 | hi_bit);
  
  	/* precharge all banks */
  	out_be32((u32*)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000002 | hi_bit);
  
  	/* auto refresh */
  	out_be32((u32*)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | 0x80000004 | hi_bit);
  
  	/* set mode register */
  	out_be32((u32*)MPC5XXX_SDRAM_MODE, SDRAM_MODE);
  
  	/* normal operation */
  	out_be32((u32*)MPC5XXX_SDRAM_CTRL, SDRAM_CONTROL | hi_bit);
  }
  
  phys_addr_t initdram (int board_type)
  {
  	ulong dramsize = 0;
  	ulong test1,
  	      test2;
  
  	/* setup SDRAM chip selects */
  	out_be32((u32*)MPC5XXX_SDRAM_CS0CFG, 0x0000001e);
  
  	/* setup config registers */
  	out_be32((u32*)MPC5XXX_SDRAM_CONFIG1, SDRAM_CONFIG1);
  	out_be32((u32*)MPC5XXX_SDRAM_CONFIG2, SDRAM_CONFIG2);
  
  	/* find RAM size using SDRAM CS0 only */
  	sdram_start(0);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
73
  	test1 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
74
  	sdram_start(1);
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
75
  	test2 = get_ram_size((long *)CONFIG_SYS_SDRAM_BASE, 0x80000000);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  	if (test1 > test2) {
  		sdram_start(0);
  		dramsize = test1;
  	} else
  		dramsize = test2;
  
  	if (dramsize < (1 << 20))
  		dramsize = 0;
  
  	if (dramsize > 0)
  		out_be32((u32*)MPC5XXX_SDRAM_CS0CFG, 0x13 +
  			__builtin_ffs(dramsize >> 20) - 1);
  	else
  		out_be32((u32*)MPC5XXX_SDRAM_CS0CFG, 0);
  
  	return dramsize;
  }
  
  void mvbc_init_gpio(void)
  {
  	struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio*)MPC5XXX_GPIO;
  
  	printf("Ports : 0x%08x
  ", gpio->port_config);
f2302d443   Stefan Roese   Fix merge problems
100
101
  	printf("PORCFG: 0x%08lx
  ", *(vu_long*)MPC5XXX_CDM_PORCFG);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
102
103
104
105
106
  
  	out_be32(&gpio->simple_ddr, SIMPLE_DDR);
  	out_be32(&gpio->simple_dvo, SIMPLE_DVO);
  	out_be32(&gpio->simple_ode, SIMPLE_ODE);
  	out_be32(&gpio->simple_gpioe, SIMPLE_GPIOEN);
a928d0df2   Andre Schwarz   fix mvbc_p board ...
107
108
109
110
111
112
  	out_8(&gpio->sint_ode, SINT_ODE);
  	out_8(&gpio->sint_ddr, SINT_DDR);
  	out_8(&gpio->sint_dvo, SINT_DVO);
  	out_8(&gpio->sint_inten, SINT_INTEN);
  	out_be16(&gpio->sint_itype, SINT_ITYPE);
  	out_8(&gpio->sint_gpioe, SINT_GPIOEN);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
113
114
115
116
117
118
119
120
121
122
123
  
  	out_8((u8*)MPC5XXX_WU_GPIO_ODE, WKUP_ODE);
  	out_8((u8*)MPC5XXX_WU_GPIO_DIR, WKUP_DIR);
  	out_8((u8*)MPC5XXX_WU_GPIO_DATA_O, WKUP_DO);
  	out_8((u8*)MPC5XXX_WU_GPIO_ENABLE, WKUP_EN);
  
  	printf("simple_gpioe: 0x%08x
  ", gpio->simple_gpioe);
  	printf("sint_gpioe  : 0x%08x
  ", gpio->sint_gpioe);
  }
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  int misc_init_r(void)
  {
  	char *s = getenv("reset_env");
  
  	if (!s) {
  		if (in_8((u8*)MPC5XXX_WU_GPIO_DATA_I) & MPC5XXX_GPIO_WKUP_6)
  			return 0;
  		udelay(50000);
  		if (in_8((u8*)MPC5XXX_WU_GPIO_DATA_I) & MPC5XXX_GPIO_WKUP_6)
  			return 0;
  		udelay(50000);
  		if (in_8((u8*)MPC5XXX_WU_GPIO_DATA_I) & MPC5XXX_GPIO_WKUP_6)
  			return 0;
  	}
  	printf(" === FACTORY RESET ===
  ");
28887d831   André Schwarz   Use common code f...
140
  	mv_reset_environment();
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
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
  	saveenv();
  
  	return -1;
  }
  
  int checkboard(void)
  {
  	mvbc_init_gpio();
  	printf("Board: Matrix Vision mvBlueCOUGAR-P
  ");
  
  	return 0;
  }
  
  void flash_preinit(void)
  {
  	/*
  	 * Now, when we are in RAM, enable flash write
  	 * access for detection process.
  	 * Note that CS_BOOT cannot be cleared when
  	 * executing in flash.
  	 */
  	clrbits_be32((u32*)MPC5XXX_BOOTCS_CFG, 0x1);
  }
  
  void flash_afterinit(ulong size)
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
168
  	out_be32((u32*)MPC5XXX_BOOTCS_START, START_REG(CONFIG_SYS_BOOTCS_START |
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
169
  		size));
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
170
  	out_be32((u32*)MPC5XXX_CS0_START, START_REG(CONFIG_SYS_BOOTCS_START |
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
171
  		size));
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
172
  	out_be32((u32*)MPC5XXX_BOOTCS_STOP, STOP_REG(CONFIG_SYS_BOOTCS_START | size,
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
173
  		size));
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
174
  	out_be32((u32*)MPC5XXX_CS0_STOP, STOP_REG(CONFIG_SYS_BOOTCS_START | size,
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
175
176
177
178
179
180
  		size));
  }
  
  void pci_mvbc_fixup_irq(struct pci_controller *hose, pci_dev_t dev)
  {
  	unsigned char line = 0xff;
28887d831   André Schwarz   Use common code f...
181
  	char *s = getenv("pci_latency");
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
182
  	u32 base;
28887d831   André Schwarz   Use common code f...
183
184
185
186
  	u8 val = 0;
  
  	if (s)
  		val = simple_strtoul(s, NULL, 16);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
187
188
189
190
191
192
  
  	if (PCI_BUS(dev) == 0) {
  		switch (PCI_DEV (dev)) {
  		case 0xa: /* FPGA */
  			line = 3;
  			pci_hose_read_config_dword(hose, dev, PCI_BASE_ADDRESS_0, &base);
28887d831   André Schwarz   Use common code f...
193
194
  			printf("found FPGA - enable arbitration
  ");
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
195
196
  			writel(0x03, (u32*)(base + 0x80c0));
  			writel(0xf0, (u32*)(base + 0x8080));
28887d831   André Schwarz   Use common code f...
197
198
  			if (val)
  				pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, val);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
199
200
201
  			break;
  		case 0xb: /* LAN */
  			line = 2;
28887d831   André Schwarz   Use common code f...
202
203
  			if (val)
  				pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, val);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  			break;
  		case 0x1a:
  			break;
  		default:
  			printf ("***pci_scan: illegal dev = 0x%08x
  ", PCI_DEV (dev));
  			break;
  		}
  		pci_hose_write_config_byte(hose, dev, PCI_INTERRUPT_LINE, line);
  	}
  }
  
  struct pci_controller hose = {
  	fixup_irq:pci_mvbc_fixup_irq
  };
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
219
220
221
222
  extern void pci_mpc5xxx_init(struct pci_controller *);
  
  void pci_init_board(void)
  {
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
223
  	mvbc_p_init_fpga();
28887d831   André Schwarz   Use common code f...
224
  	mv_load_fpga();
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
225
226
  	pci_mpc5xxx_init(&hose);
  }
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
227
228
229
230
231
  void show_boot_progress(int val)
  {
  	struct mpc5xxx_gpio *gpio = (struct mpc5xxx_gpio*)MPC5XXX_GPIO;
  
  	switch(val) {
5dc887164   Simon Glass   bootstage: Conver...
232
  	case BOOTSTAGE_ID_START: /* FPGA ok */
28887d831   André Schwarz   Use common code f...
233
  		setbits_be32(&gpio->simple_dvo, LED_G0);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
234
  		break;
c8e66db78   Simon Glass   bootstage: Conver...
235
  	case BOOTSTAGE_ID_NET_ETH_INIT:
28887d831   André Schwarz   Use common code f...
236
  		setbits_be32(&gpio->simple_dvo, LED_G1);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
237
  		break;
5e4108836   Simon Glass   bootstage: Conver...
238
  	case BOOTSTAGE_ID_COPY_RAMDISK:
28887d831   André Schwarz   Use common code f...
239
  		setbits_be32(&gpio->simple_dvo, LED_Y);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
240
  		break;
578ac1e9b   Simon Glass   bootstage: Make u...
241
  	case BOOTSTAGE_ID_RUN_OS:
28887d831   André Schwarz   Use common code f...
242
  		setbits_be32(&gpio->simple_dvo, LED_R);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
243
244
245
246
247
248
249
250
251
252
  		break;
  	default:
  		break;
  	}
  
  }
  
  void ft_board_setup(void *blob, bd_t *bd)
  {
  	ft_cpu_setup(blob, bd);
5e0de0e21   Andre Schwarz   mpc5xxx: Add MVBC...
253
  }
e1d7480b5   Ben Warren   Moved initializat...
254
255
256
  
  int board_eth_init(bd_t *bis)
  {
ad3381cf4   Ben Warren   Moved initializat...
257
258
  	cpu_eth_init(bis); /* Built in FEC comes first */
  	return pci_eth_init(bis);
e1d7480b5   Ben Warren   Moved initializat...
259
  }