Blame view

arch/arm/mach-iop32x/glantank.c 4.75 KB
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
1
2
3
4
5
  /*
   * arch/arm/mach-iop32x/glantank.c
   *
   * Board support code for the GLAN Tank.
   *
bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
6
   * Copyright (C) 2006, 2007 Martin Michlmayr <tbm@cyrius.com>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
7
8
9
10
11
12
13
14
15
16
   * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
   *
   * 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.
   */
  
  #include <linux/mm.h>
  #include <linux/init.h>
4e7ffb6ab   Gordon Farquharson   [ARM] 4865/1: Reg...
17
  #include <linux/f75375s.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
18
19
  #include <linux/kernel.h>
  #include <linux/pci.h>
4e7ffb6ab   Gordon Farquharson   [ARM] 4865/1: Reg...
20
  #include <linux/pm.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
21
  #include <linux/string.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
22
23
24
  #include <linux/serial_core.h>
  #include <linux/serial_8250.h>
  #include <linux/mtd/physmap.h>
bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
25
  #include <linux/i2c.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
26
  #include <linux/platform_device.h>
fced80c73   Russell King   [ARM] Convert asm...
27
  #include <linux/io.h>
a09e64fbc   Russell King   [ARM] Move includ...
28
  #include <mach/hardware.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
29
30
31
32
33
34
35
  #include <asm/irq.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/pci.h>
  #include <asm/mach/time.h>
  #include <asm/mach-types.h>
  #include <asm/page.h>
a09e64fbc   Russell King   [ARM] Move includ...
36
  #include <mach/time.h>
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
37
38
39
40
41
42
43
  
  /*
   * GLAN Tank timer tick configuration.
   */
  static void __init glantank_timer_init(void)
  {
  	/* 33.333 MHz crystal.  */
3668b45d4   Dan Williams   [ARM] 4187/1: iop...
44
  	iop_init_time(200000000);
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
45
46
47
48
  }
  
  static struct sys_timer glantank_timer = {
  	.init		= glantank_timer_init,
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
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
  };
  
  
  /*
   * GLAN Tank I/O.
   */
  static struct map_desc glantank_io_desc[] __initdata = {
  	{	/* on-board devices */
  		.virtual	= GLANTANK_UART,
  		.pfn		= __phys_to_pfn(GLANTANK_UART),
  		.length		= 0x00100000,
  		.type		= MT_DEVICE
  	},
  };
  
  void __init glantank_map_io(void)
  {
  	iop3xx_map_io();
  	iotable_init(glantank_io_desc, ARRAY_SIZE(glantank_io_desc));
  }
  
  
  /*
   * GLAN Tank PCI.
   */
  #define INTA	IRQ_IOP32X_XINT0
  #define INTB	IRQ_IOP32X_XINT1
  #define INTC	IRQ_IOP32X_XINT2
  #define INTD	IRQ_IOP32X_XINT3
d73d80117   Dan Williams   [ARM] 4383/1: iop...
78
  static int __init
d5341942d   Ralf Baechle   PCI: Make the str...
79
  glantank_pci_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
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
  {
  	static int pci_irq_table[][4] = {
  		/*
  		 * PCI IDSEL/INTPIN->INTLINE
  		 * A       B       C       D
  		 */
  		{INTD, INTD, INTD, INTD}, /* UART (8250) */
  		{INTA, INTA, INTA, INTA}, /* Ethernet (E1000) */
  		{INTB, INTB, INTB, INTB}, /* IDE (AEC6280R) */
  		{INTC, INTC, INTC, INTC}, /* USB (NEC) */
  	};
  
  	BUG_ON(pin < 1 || pin > 4);
  
  	return pci_irq_table[slot % 4][pin - 1];
  }
  
  static struct hw_pci glantank_pci __initdata = {
  	.swizzle	= pci_std_swizzle,
  	.nr_controllers = 1,
  	.setup		= iop3xx_pci_setup,
  	.preinit	= iop3xx_pci_preinit,
  	.scan		= iop3xx_pci_scan_bus,
  	.map_irq	= glantank_pci_map_irq,
  };
  
  static int __init glantank_pci_init(void)
  {
  	if (machine_is_glantank())
  		pci_common_init(&glantank_pci);
  
  	return 0;
  }
  
  subsys_initcall(glantank_pci_init);
  
  
  /*
   * GLAN Tank machine initialization.
   */
  static struct physmap_flash_data glantank_flash_data = {
b696b6b44   Gordon Farquharson   [ARM] 4770/1: GLA...
121
  	.width		= 2,
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
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
  };
  
  static struct resource glantank_flash_resource = {
  	.start		= 0xf0000000,
  	.end		= 0xf007ffff,
  	.flags		= IORESOURCE_MEM,
  };
  
  static struct platform_device glantank_flash_device = {
  	.name		= "physmap-flash",
  	.id		= 0,
  	.dev		= {
  		.platform_data	= &glantank_flash_data,
  	},
  	.num_resources	= 1,
  	.resource	= &glantank_flash_resource,
  };
  
  static struct plat_serial8250_port glantank_serial_port[] = {
  	{
  		.mapbase	= GLANTANK_UART,
  		.membase	= (char *)GLANTANK_UART,
  		.irq		= IRQ_IOP32X_XINT3,
  		.flags		= UPF_SKIP_TEST,
  		.iotype		= UPIO_MEM,
  		.regshift	= 0,
  		.uartclk	= 1843200,
  	},
  	{ },
  };
  
  static struct resource glantank_uart_resource = {
  	.start		= GLANTANK_UART,
  	.end		= GLANTANK_UART + 7,
  	.flags		= IORESOURCE_MEM,
  };
  
  static struct platform_device glantank_serial_device = {
  	.name		= "serial8250",
  	.id		= PLAT8250_DEV_PLATFORM,
  	.dev		= {
  		.platform_data		= glantank_serial_port,
  	},
  	.num_resources	= 1,
  	.resource	= &glantank_uart_resource,
  };
4e7ffb6ab   Gordon Farquharson   [ARM] 4865/1: Reg...
168
169
170
171
  static struct f75375s_platform_data glantank_f75375s = {
  	.pwm		= { 255, 255 },
  	.pwm_enable	= { 0, 0 },
  };
bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
172
173
  static struct i2c_board_info __initdata glantank_i2c_devices[] = {
  	{
3760f7367   Jean Delvare   i2c: Convert most...
174
  		I2C_BOARD_INFO("rs5c372a", 0x32),
bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
175
  	},
4e7ffb6ab   Gordon Farquharson   [ARM] 4865/1: Reg...
176
177
  	{
  		I2C_BOARD_INFO("f75375", 0x2e),
4e7ffb6ab   Gordon Farquharson   [ARM] 4865/1: Reg...
178
179
  		.platform_data = &glantank_f75375s,
  	},
bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
180
  };
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  static void glantank_power_off(void)
  {
  	__raw_writeb(0x01, 0xfe8d0004);
  
  	while (1)
  		;
  }
  
  static void __init glantank_init_machine(void)
  {
  	platform_device_register(&iop3xx_i2c0_device);
  	platform_device_register(&iop3xx_i2c1_device);
  	platform_device_register(&glantank_flash_device);
  	platform_device_register(&glantank_serial_device);
2492c8451   Dan Williams   iop3xx: surface t...
195
196
  	platform_device_register(&iop3xx_dma_0_channel);
  	platform_device_register(&iop3xx_dma_1_channel);
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
197

bd7b88586   Martin Michlmayr   [ARM] 4732/1: GLA...
198
199
  	i2c_register_board_info(0, glantank_i2c_devices,
  		ARRAY_SIZE(glantank_i2c_devices));
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
200
201
202
203
204
  	pm_power_off = glantank_power_off;
  }
  
  MACHINE_START(GLANTANK, "GLAN Tank")
  	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
1896746de   Nicolas Pitre   ARM: mach-iop32x:...
205
  	.atag_offset	= 0x100,
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
206
207
208
209
  	.map_io		= glantank_map_io,
  	.init_irq	= iop32x_init_irq,
  	.timer		= &glantank_timer,
  	.init_machine	= glantank_init_machine,
bec92b1ec   Russell King   ARM: restart: iop...
210
  	.restart	= iop3xx_restart,
0c92e830b   Lennert Buytenhek   [ARM] 3851/1: iop...
211
  MACHINE_END