Blame view

arch/ppc/platforms/85xx/sbc8560.c 6.27 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
   * Wind River SBC8560 board specific routines
   * 
4c8d3d997   Kumar Gala   [PATCH] Update em...
4
   * Maintainer: Kumar Gala
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
   *
   * Copyright 2004 Freescale Semiconductor Inc.
   * 
   * This program is free software; you can redistribute  it and/or modify it
   * under  the terms of  the GNU General  Public License as published by the
   * Free Software Foundation;  either version 2 of the  License, or (at your
   * option) any later version.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
20
21
22
  #include <linux/stddef.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/errno.h>
  #include <linux/reboot.h>
  #include <linux/pci.h>
  #include <linux/kdev_t.h>
  #include <linux/major.h>
  #include <linux/console.h>
  #include <linux/delay.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
  #include <linux/seq_file.h>
  #include <linux/root_dev.h>
  #include <linux/serial.h>
  #include <linux/tty.h>	/* for linux/serial_core.h */
  #include <linux/serial_core.h>
b187f180c   Yinghai Lu   serial: add early...
28
  #include <linux/serial_8250.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
30
31
32
33
34
35
36
37
38
39
  #include <linux/initrd.h>
  #include <linux/module.h>
  #include <linux/fsl_devices.h>
  
  #include <asm/system.h>
  #include <asm/pgtable.h>
  #include <asm/page.h>
  #include <asm/atomic.h>
  #include <asm/time.h>
  #include <asm/io.h>
  #include <asm/machdep.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  #include <asm/open_pic.h>
  #include <asm/bootinfo.h>
  #include <asm/pci-bridge.h>
  #include <asm/mpc85xx.h>
  #include <asm/irq.h>
  #include <asm/immap_85xx.h>
  #include <asm/kgdb.h>
  #include <asm/ppc_sys.h>
  #include <mm/mmu_decl.h>
  
  #include <syslib/ppc85xx_common.h>
  #include <syslib/ppc85xx_setup.h>
  
  #ifdef CONFIG_SERIAL_8250
  static void __init
  sbc8560_early_serial_map(void)
  {
          struct uart_port uart_req;
   
          /* Setup serial port access */
          memset(&uart_req, 0, sizeof (uart_req));
  	uart_req.irq = MPC85xx_IRQ_EXT9;
  	uart_req.flags = STD_COM_FLAGS;
  	uart_req.uartclk = BASE_BAUD * 16;
9b4a16177   Russell King   [SERIAL] uart_por...
64
          uart_req.iotype = UPIO_MEM;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
          uart_req.mapbase = UARTA_ADDR;
          uart_req.membase = ioremap(uart_req.mapbase, MPC85xx_UART0_SIZE);
  	uart_req.type = PORT_16650;
  
  #if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
          gen550_init(0, &uart_req);
  #endif
   
          if (early_serial_setup(&uart_req) != 0)
                  printk("Early serial init of port 0 failed
  ");
   
          /* Assume early_serial_setup() doesn't modify uart_req */
  	uart_req.line = 1;
          uart_req.mapbase = UARTB_ADDR;
          uart_req.membase = ioremap(uart_req.mapbase, MPC85xx_UART1_SIZE);
  	uart_req.irq = MPC85xx_IRQ_EXT10;
   
  #if defined(CONFIG_SERIAL_TEXT_DEBUG) || defined(CONFIG_KGDB)
          gen550_init(1, &uart_req);
  #endif
   
          if (early_serial_setup(&uart_req) != 0)
                  printk("Early serial init of port 1 failed
  ");
  }
  #endif
  
  /* ************************************************************************
   *
   * Setup the architecture
   *
   */
  static void __init
  sbc8560_setup_arch(void)
  {
  	bd_t *binfo = (bd_t *) __res;
  	unsigned int freq;
  	struct gianfar_platform_data *pdata;
b37665e0b   Andy Fleming   [PATCH] ppc32: 85...
104
  	struct gianfar_mdio_data *mdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
  
  	/* get the core frequency */
  	freq = binfo->bi_intfreq;
  
  	if (ppc_md.progress)
  		ppc_md.progress("sbc8560_setup_arch()", 0);
  
  	/* Set loops_per_jiffy to a half-way reasonable value,
  	   for use until calibrate_delay gets called. */
  	loops_per_jiffy = freq / HZ;
  
  #ifdef CONFIG_PCI
  	/* setup PCI host bridges */
  	mpc85xx_setup_hose();
  #endif
  #ifdef CONFIG_SERIAL_8250
  	sbc8560_early_serial_map();
  #endif
  #ifdef CONFIG_SERIAL_TEXT_DEBUG
  	/* Invalidate the entry we stole earlier the serial ports
  	 * should be properly mapped */ 
5be061eee   Kumar Gala   [PATCH] ppc32: Cl...
126
  	invalidate_tlbcam_entry(num_tlbcam_entries - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
  #endif
b37665e0b   Andy Fleming   [PATCH] ppc32: 85...
128
129
130
131
132
  	/* setup the board related info for the MDIO bus */
  	mdata = (struct gianfar_mdio_data *) ppc_sys_get_pdata(MPC85xx_MDIO);
  
  	mdata->irq[25] = MPC85xx_IRQ_EXT6;
  	mdata->irq[26] = MPC85xx_IRQ_EXT7;
a9b14973a   Andy Fleming   [PATCH] Slight re...
133
  	mdata->irq[31] = PHY_POLL;
b37665e0b   Andy Fleming   [PATCH] ppc32: 85...
134

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
136
  	/* setup the board related information for the enet controllers */
  	pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
62aa751d1   Kumar Gala   [PATCH] ppc32: Ch...
137
138
  	if (pdata) {
  		pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
7e78e5e50   Kumar Gala   [PATCH] powerpc: ...
139
140
  		pdata->bus_id = 0;
  		pdata->phy_id = 25;
62aa751d1   Kumar Gala   [PATCH] ppc32: Ch...
141
142
  		memcpy(pdata->mac_addr, binfo->bi_enetaddr, 6);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
144
  
  	pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC2);
62aa751d1   Kumar Gala   [PATCH] ppc32: Ch...
145
146
  	if (pdata) {
  		pdata->board_flags = FSL_GIANFAR_BRD_HAS_PHY_INTR;
7e78e5e50   Kumar Gala   [PATCH] powerpc: ...
147
148
  		pdata->bus_id = 0;
  		pdata->phy_id = 26;
62aa751d1   Kumar Gala   [PATCH] ppc32: Ch...
149
150
  		memcpy(pdata->mac_addr, binfo->bi_enet1addr, 6);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  
  #ifdef CONFIG_BLK_DEV_INITRD
  	if (initrd_start)
  		ROOT_DEV = Root_RAM0;
  	else
  #endif
  #ifdef  CONFIG_ROOT_NFS
  		ROOT_DEV = Root_NFS;
  #else
  		ROOT_DEV = Root_HDA1;
  #endif
  }
  
  /* ************************************************************************ */
  void __init
  platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
  	      unsigned long r6, unsigned long r7)
  {
  	/* parse_bootinfo must always be called first */
  	parse_bootinfo(find_bootinfo());
  
  	/*
  	 * If we were passed in a board information, copy it into the
  	 * residual data area.
  	 */
  	if (r3) {
  		memcpy((void *) __res, (void *) (r3 + KERNELBASE),
  		       sizeof (bd_t));
  	}
  
  #ifdef CONFIG_SERIAL_TEXT_DEBUG
  	/* Use the last TLB entry to map CCSRBAR to allow access to DUART regs */
5be061eee   Kumar Gala   [PATCH] ppc32: Cl...
183
  	settlbcam(num_tlbcam_entries - 1, UARTA_ADDR,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  		  UARTA_ADDR, 0x1000, _PAGE_IO, 0);
  #endif
  
  #if defined(CONFIG_BLK_DEV_INITRD)
  	/*
  	 * If the init RAM disk has been configured in, and there's a valid
  	 * starting address for it, set it up.
  	 */
  	if (r4) {
  		initrd_start = r4 + KERNELBASE;
  		initrd_end = r5 + KERNELBASE;
  	}
  #endif				/* CONFIG_BLK_DEV_INITRD */
  
  	/* Copy the kernel command line arguments to a safe place. */
  
  	if (r6) {
  		*(char *) (r7 + KERNELBASE) = 0;
  		strcpy(cmd_line, (char *) (r6 + KERNELBASE));
  	}
  
  	identify_ppc_sys_by_id(mfspr(SPRN_SVR));
  
  	/* setup the PowerPC module struct */
  	ppc_md.setup_arch = sbc8560_setup_arch;
  	ppc_md.show_cpuinfo = sbc8560_show_cpuinfo;
  
  	ppc_md.init_IRQ = sbc8560_init_IRQ;
  	ppc_md.get_irq = openpic_get_irq;
  
  	ppc_md.restart = mpc85xx_restart;
  	ppc_md.power_off = mpc85xx_power_off;
  	ppc_md.halt = mpc85xx_halt;
  
  	ppc_md.find_end_of_memory = mpc85xx_find_end_of_memory;
  
  	ppc_md.time_init = NULL;
  	ppc_md.set_rtc_time = NULL;
  	ppc_md.get_rtc_time = NULL;
  	ppc_md.calibrate_decr = mpc85xx_calibrate_decr;
  
  #if defined(CONFIG_SERIAL_8250) && defined(CONFIG_SERIAL_TEXT_DEBUG)
  	ppc_md.progress = gen550_progress;
  #endif	/* CONFIG_SERIAL_8250 && CONFIG_SERIAL_TEXT_DEBUG */
252fcaed4   Kumar Gala   [PATCH] ppc32: Fi...
228
229
230
  #if defined(CONFIG_SERIAL_8250) && defined(CONFIG_KGDB)
  	ppc_md.early_serial_map = sbc8560_early_serial_map;
  #endif	/* CONFIG_SERIAL_8250 && CONFIG_KGDB */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231
232
233
234
  
  	if (ppc_md.progress)
  		ppc_md.progress("sbc8560_init(): exit", 0);
  }