Blame view

arch/arm/mach-at91/board-usb-a926x.c 8.82 KB
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
1
  /*
6939fd497   Nico Erfurth   at91: merge board...
2
   * linux/arch/arm/mach-at91/board-usb-a926x.c
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
3
4
5
6
   *
   *  Copyright (C) 2005 SAN People
   *  Copyright (C) 2007 Atmel Corporation.
   *  Copyright (C) 2007 Calao-systems
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
7
   *  Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   *
   * 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.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #include <linux/types.h>
  #include <linux/init.h>
  #include <linux/mm.h>
  #include <linux/module.h>
  #include <linux/platform_device.h>
  #include <linux/spi/spi.h>
  #include <linux/gpio_keys.h>
335332770   Arnd Bergmann   Merge branch 'dep...
31
  #include <linux/gpio.h>
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
32
  #include <linux/input.h>
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
33
  #include <linux/spi/mmc_spi.h>
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
34

ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
35
36
37
38
39
40
41
  #include <asm/setup.h>
  #include <asm/mach-types.h>
  #include <asm/irq.h>
  
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/irq.h>
e505240b6   Andrew Victor   [ARM] 5257/2: [AT...
42
  #include <mach/hardware.h>
a09e64fbc   Russell King   [ARM] Move includ...
43
  #include <mach/board.h>
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
44
  #include <mach/at91sam9_smc.h>
a09e64fbc   Russell King   [ARM] Move includ...
45
  #include <mach/at91_shdwc.h>
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
46

8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
47
  #include "sam9_smc.h"
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
48
  #include "generic.h"
1b021a3b2   Jean-Christophe PLAGNIOL-VILLARD   at91: fix map_io ...
49
  static void __init ek_init_early(void)
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
50
51
  {
  	/* Initialize processor: 12.00 MHz crystal */
21d08b9d5   Jean-Christophe PLAGNIOL-VILLARD   at91: introduce c...
52
  	at91_initialize(12000000);
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
53

4f37940d6   Samuel R. C. Vale   trivial: fix typo...
54
  	/* DBGU on ttyS0. (Rx & Tx only) */
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
55
56
57
58
59
  	at91_register_uart(0, 0, 0);
  
  	/* set serial console to ttyS0 (ie, DBGU) */
  	at91_set_serial_console(0);
  }
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
60
61
62
63
64
  /*
   * USB Host port
   */
  static struct at91_usbh_data __initdata ek_usbh_data = {
  	.ports		= 2,
63b4c2967   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/boards:...
65
66
  	.vbus_pin	= {-EINVAL, -EINVAL},
  	.overcurrent_pin= {-EINVAL, -EINVAL},
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
67
68
69
70
71
72
73
  };
  
  /*
   * USB Device port
   */
  static struct at91_udc_data __initdata ek_udc_data = {
  	.vbus_pin	= AT91_PIN_PB11,
63b4c2967   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/boards:...
74
  	.pullup_pin	= -EINVAL,		/* pull-up driven by UDC */
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
75
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
76
  static void __init ek_add_device_udc(void)
6939fd497   Nico Erfurth   at91: merge board...
77
  {
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
78
  	if (machine_is_usb_a9260() || machine_is_usb_a9g20())
6939fd497   Nico Erfurth   at91: merge board...
79
80
81
82
  		ek_udc_data.vbus_pin = AT91_PIN_PC5;
  
  	at91_add_device_udc(&ek_udc_data);
  }
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  #if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
  #define MMC_SPI_CARD_DETECT_INT AT91_PIN_PC4
  static int at91_mmc_spi_init(struct device *dev,
  	irqreturn_t (*detect_int)(int, void *), void *data)
  {
  	/* Configure Interrupt pin as input, no pull-up */
  	at91_set_gpio_input(MMC_SPI_CARD_DETECT_INT, 0);
  	return request_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), detect_int,
  		IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
  		"mmc-spi-detect", data);
  }
  
  static void at91_mmc_spi_exit(struct device *dev, void *data)
  {
  	free_irq(gpio_to_irq(MMC_SPI_CARD_DETECT_INT), data);
  }
  
  static struct mmc_spi_platform_data at91_mmc_spi_pdata = {
  	.init = at91_mmc_spi_init,
  	.exit = at91_mmc_spi_exit,
  	.detect_delay = 100, /* msecs */
  };
  #endif
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
106
107
108
  /*
   * SPI devices.
   */
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
109
  static struct spi_board_info usb_a9263_spi_devices[] = {
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
110
111
112
113
114
115
116
117
118
  #if !defined(CONFIG_MMC_AT91)
  	{	/* DataFlash chip */
  		.modalias	= "mtd_dataflash",
  		.chip_select	= 0,
  		.max_speed_hz	= 15 * 1000 * 1000,
  		.bus_num	= 0,
  	}
  #endif
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  static struct spi_board_info usb_a9g20_spi_devices[] = {
  #if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
  	{
  		.modalias = "mmc_spi",
  		.max_speed_hz = 20000000,	/* max spi clock (SCK) speed in HZ */
  		.bus_num = 1,
  		.chip_select = 0,
  		.platform_data = &at91_mmc_spi_pdata,
  		.mode = SPI_MODE_3,
  	},
  #endif
  };
  
  static void __init ek_add_device_spi(void)
6939fd497   Nico Erfurth   at91: merge board...
133
134
  {
  	if (machine_is_usb_a9263())
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
135
136
137
  		at91_add_device_spi(usb_a9263_spi_devices, ARRAY_SIZE(usb_a9263_spi_devices));
  	else if (machine_is_usb_a9g20())
  		at91_add_device_spi(usb_a9g20_spi_devices, ARRAY_SIZE(usb_a9g20_spi_devices));
6939fd497   Nico Erfurth   at91: merge board...
138
  }
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
139
140
141
  /*
   * MACB Ethernet device
   */
84e0cdb0a   Jamie Iles   macb: unify at91 ...
142
  static struct macb_platform_data __initdata ek_macb_data = {
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
143
144
145
  	.phy_irq_pin	= AT91_PIN_PE31,
  	.is_rmii	= 1,
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
146
  static void __init ek_add_device_eth(void)
6939fd497   Nico Erfurth   at91: merge board...
147
  {
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
148
  	if (machine_is_usb_a9260() || machine_is_usb_a9g20())
6939fd497   Nico Erfurth   at91: merge board...
149
150
151
152
  		ek_macb_data.phy_irq_pin = AT91_PIN_PA31;
  
  	at91_add_device_eth(&ek_macb_data);
  }
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
153
154
155
156
157
  /*
   * NAND flash
   */
  static struct mtd_partition __initdata ek_nand_partition[] = {
  	{
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
158
  		.name	= "barebox",
e505240b6   Andrew Victor   [ARM] 5257/2: [AT...
159
  		.offset	= 0,
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
160
161
162
  		.size	= 3 * SZ_128K,
  	}, {
  		.name	= "bareboxenv",
e505240b6   Andrew Victor   [ARM] 5257/2: [AT...
163
  		.offset	= MTDPART_OFS_NXTBLK,
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
164
165
166
167
168
169
170
171
172
173
174
  		.size	= SZ_128K,
  	}, {
  		.name	= "bareboxenv2",
  		.offset	= MTDPART_OFS_NXTBLK,
  		.size	= SZ_128K,
  	}, {
  		.name	= "kernel",
  		.offset	= MTDPART_OFS_NXTBLK,
  		.size	= 4 * SZ_1M,
  	}, {
  		.name	= "rootfs",
e505240b6   Andrew Victor   [ARM] 5257/2: [AT...
175
176
  		.offset	= MTDPART_OFS_NXTBLK,
  		.size	= 120 * SZ_1M,
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
177
178
179
180
  	}, {
  		.name	= "data",
  		.offset	= MTDPART_OFS_NXTBLK,
  		.size	= MTDPART_SIZ_FULL,
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
181
182
  	}
  };
7c8968347   Haavard Skinnemoen   [ARM] 5180/1: at9...
183
  static struct atmel_nand_data __initdata ek_nand_data = {
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
184
185
  	.ale		= 21,
  	.cle		= 22,
63b4c2967   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/boards:...
186
  	.det_pin	= -EINVAL,
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
187
188
  	.rdy_pin	= AT91_PIN_PA22,
  	.enable_pin	= AT91_PIN_PD15,
1754aab9b   Dmitry Eremin-Solenikov   mtd: ATMEL, AVR32...
189
190
  	.parts		= ek_nand_partition,
  	.num_parts	= ARRAY_SIZE(ek_nand_partition),
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
191
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
192
  static struct sam9_smc_config __initdata usb_a9260_nand_smc_config = {
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
  	.ncs_read_setup		= 0,
  	.nrd_setup		= 1,
  	.ncs_write_setup	= 0,
  	.nwe_setup		= 1,
  
  	.ncs_read_pulse		= 3,
  	.nrd_pulse		= 3,
  	.ncs_write_pulse	= 3,
  	.nwe_pulse		= 3,
  
  	.read_cycle		= 5,
  	.write_cycle		= 5,
  
  	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
  	.tdf_cycles		= 2,
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
  static struct sam9_smc_config __initdata usb_a9g20_nand_smc_config = {
  	.ncs_read_setup		= 0,
  	.nrd_setup		= 2,
  	.ncs_write_setup	= 0,
  	.nwe_setup		= 2,
  
  	.ncs_read_pulse		= 4,
  	.nrd_pulse		= 4,
  	.ncs_write_pulse	= 4,
  	.nwe_pulse		= 4,
  
  	.read_cycle		= 7,
  	.write_cycle		= 7,
  
  	.mode			= AT91_SMC_READMODE | AT91_SMC_WRITEMODE | AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_DBW_8,
  	.tdf_cycles		= 3,
  };
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
226
227
  static void __init ek_add_device_nand(void)
  {
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
228
  	if (machine_is_usb_a9260() || machine_is_usb_a9g20()) {
6939fd497   Nico Erfurth   at91: merge board...
229
230
231
  		ek_nand_data.rdy_pin	= AT91_PIN_PC13;
  		ek_nand_data.enable_pin	= AT91_PIN_PC14;
  	}
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
232
  	/* configure chip-select 3 (NAND) */
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
233
  	if (machine_is_usb_a9g20())
faee0cc33   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make s...
234
  		sam9_smc_configure(0, 3, &usb_a9g20_nand_smc_config);
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
235
  	else
faee0cc33   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make s...
236
  		sam9_smc_configure(0, 3, &usb_a9260_nand_smc_config);
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
237
238
239
  
  	at91_add_device_nand(&ek_nand_data);
  }
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
  /*
   * GPIO Buttons
   */
  #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
  static struct gpio_keys_button ek_buttons[] = {
  	{	/* USER PUSH BUTTON */
  		.code		= KEY_ENTER,
  		.gpio		= AT91_PIN_PB10,
  		.active_low	= 1,
  		.desc		= "user_pb",
  		.wakeup		= 1,
  	}
  };
  
  static struct gpio_keys_platform_data ek_button_data = {
  	.buttons	= ek_buttons,
  	.nbuttons	= ARRAY_SIZE(ek_buttons),
  };
  
  static struct platform_device ek_button_device = {
  	.name		= "gpio-keys",
  	.id		= -1,
  	.num_resources	= 0,
  	.dev		= {
  		.platform_data	= &ek_button_data,
  	}
  };
  
  static void __init ek_add_device_buttons(void)
  {
  	at91_set_GPIO_periph(AT91_PIN_PB10, 1);	/* user push button, pull up enabled */
  	at91_set_deglitch(AT91_PIN_PB10, 1);
  
  	platform_device_register(&ek_button_device);
  }
  #else
  static void __init ek_add_device_buttons(void) {}
  #endif
  
  /*
   * LEDs
   */
  static struct gpio_led ek_leds[] = {
  	{	/* user_led (green) */
  		.name			= "user_led",
  		.gpio			= AT91_PIN_PB21,
  		.active_low		= 1,
  		.default_trigger	= "heartbeat",
  	}
  };
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
290
291
292
293
294
295
296
  static struct i2c_board_info __initdata ek_i2c_devices[] = {
  	{
  		I2C_BOARD_INFO("rv3029c2", 0x56),
  	},
  };
  
  static void __init ek_add_device_leds(void)
6939fd497   Nico Erfurth   at91: merge board...
297
  {
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
298
  	if (machine_is_usb_a9260() || machine_is_usb_a9g20())
6939fd497   Nico Erfurth   at91: merge board...
299
300
301
302
  		ek_leds[0].active_low = 0;
  
  	at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
  }
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
303
304
305
306
307
308
309
  static void __init ek_board_init(void)
  {
  	/* Serial */
  	at91_add_device_serial();
  	/* USB Host */
  	at91_add_device_usbh(&ek_usbh_data);
  	/* USB Device */
6939fd497   Nico Erfurth   at91: merge board...
310
  	ek_add_device_udc();
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
311
  	/* SPI */
6939fd497   Nico Erfurth   at91: merge board...
312
  	ek_add_device_spi();
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
313
  	/* Ethernet */
6939fd497   Nico Erfurth   at91: merge board...
314
  	ek_add_device_eth();
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
315
  	/* NAND */
8cdae51aa   Andrew Victor   [ARM] 5289/1: [AT...
316
  	ek_add_device_nand();
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
317
318
319
  	/* Push Buttons */
  	ek_add_device_buttons();
  	/* LEDs */
6939fd497   Nico Erfurth   at91: merge board...
320
  	ek_add_device_leds();
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
321
322
323
324
325
326
327
328
  
  	if (machine_is_usb_a9g20()) {
  		/* I2C */
  		at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
  	} else {
  		/* I2C */
  		at91_add_device_i2c(NULL, 0);
  		/* shutdown controller, wakeup button (5 msec low) */
f22deee52   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make s...
329
  		at91_shdwc_write(AT91_SHDW_MR, AT91_SHDW_CPTWK0_(10)
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
330
  				| AT91_SHDW_WKMODE0_LOW
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
331
  				| AT91_SHDW_RTTWKEN);
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
332
  	}
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
333
334
335
336
  }
  
  MACHINE_START(USB_A9263, "CALAO USB_A9263")
  	/* Maintainer: calao-systems */
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
337
  	.timer		= &at91sam926x_timer,
21d08b9d5   Jean-Christophe PLAGNIOL-VILLARD   at91: introduce c...
338
  	.map_io		= at91_map_io,
1b021a3b2   Jean-Christophe PLAGNIOL-VILLARD   at91: fix map_io ...
339
  	.init_early	= ek_init_early,
92100c12c   Jean-Christophe PLAGNIOL-VILLARD   at91: factorize a...
340
  	.init_irq	= at91_init_irq_default,
ca0a789ab   Andrew Victor   [ARM] 5057/1: [AT...
341
342
  	.init_machine	= ek_board_init,
  MACHINE_END
6939fd497   Nico Erfurth   at91: merge board...
343
344
345
346
347
348
349
350
351
  
  MACHINE_START(USB_A9260, "CALAO USB_A9260")
  	/* Maintainer: calao-systems */
  	.timer		= &at91sam926x_timer,
  	.map_io		= at91_map_io,
  	.init_early	= ek_init_early,
  	.init_irq	= at91_init_irq_default,
  	.init_machine	= ek_board_init,
  MACHINE_END
0a072a247   Jean-Christophe PLAGNIOL-VILLARD   at91: USB-A9G20 C...
352
353
354
355
356
357
358
359
360
  
  MACHINE_START(USB_A9G20, "CALAO USB_A92G0")
  	/* Maintainer: Jean-Christophe PLAGNIOL-VILLARD */
  	.timer		= &at91sam926x_timer,
  	.map_io		= at91_map_io,
  	.init_early	= ek_init_early,
  	.init_irq	= at91_init_irq_default,
  	.init_machine	= ek_board_init,
  MACHINE_END