Blame view

arch/arm/mach-at91/at91sam9261_devices.c 26.6 KB
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
1
  /*
9d0412680   Andrew Victor   [ARM] 4124/1: Ren...
2
   * arch/arm/mach-at91/at91sam9261_devices.c
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
3
4
5
6
7
8
9
10
11
12
13
14
   *
   *  Copyright (C) 2005 Thibaut VARENE <varenet@parisc-linux.org>
   *  Copyright (C) 2005 David Brownell
   *
   * 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 <asm/mach/arch.h>
  #include <asm/mach/map.h>
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
15
  #include <linux/dma-mapping.h>
2f8163baa   Russell King   ARM: gpio: conver...
16
  #include <linux/gpio.h>
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
17
  #include <linux/platform_device.h>
f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
18
  #include <linux/i2c-gpio.h>
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
19

f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
20
  #include <linux/fb.h>
b8b786098   Jan Altenberg   [ARM] 4542/1: AT9...
21
  #include <video/atmel_lcdc.h>
a09e64fbc   Russell King   [ARM] Move includ...
22
  #include <mach/board.h>
a09e64fbc   Russell King   [ARM] Move includ...
23
24
25
  #include <mach/at91sam9261.h>
  #include <mach/at91sam9261_matrix.h>
  #include <mach/at91sam9_smc.h>
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
26
27
  
  #include "generic.h"
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
28
29
30
31
32
33
  
  /* --------------------------------------------------------------------
   *  USB Host
   * -------------------------------------------------------------------- */
  
  #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
34
  static u64 ohci_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
  static struct at91_usbh_data usbh_data;
  
  static struct resource usbh_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_UHP_BASE,
  		.end	= AT91SAM9261_UHP_BASE + SZ_1M - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_UHP,
  		.end	= AT91SAM9261_ID_UHP,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_usbh_device = {
  	.name		= "at91_ohci",
  	.id		= -1,
  	.dev		= {
  				.dma_mask		= &ohci_dmamask,
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
55
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
56
57
58
59
60
61
62
63
  				.platform_data		= &usbh_data,
  	},
  	.resource	= usbh_resources,
  	.num_resources	= ARRAY_SIZE(usbh_resources),
  };
  
  void __init at91_add_device_usbh(struct at91_usbh_data *data)
  {
1fcaea7e4   Thomas Petazzoni   at91: at91-ohci: ...
64
  	int i;
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
65
66
  	if (!data)
  		return;
1fcaea7e4   Thomas Petazzoni   at91: at91-ohci: ...
67
68
69
70
71
  	/* Enable overcurrent notification */
  	for (i = 0; i < data->ports; i++) {
  		if (data->overcurrent_pin[i])
  			at91_set_gpio_input(data->overcurrent_pin[i], 1);
  	}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
72
73
74
75
76
77
78
79
80
81
82
  	usbh_data = *data;
  	platform_device_register(&at91sam9261_usbh_device);
  }
  #else
  void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
  #endif
  
  
  /* --------------------------------------------------------------------
   *  USB Device (Gadget)
   * -------------------------------------------------------------------- */
0e934e22f   Anders Darander   ARM: at91: Fix US...
83
  #ifdef CONFIG_USB_AT91
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
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
  static struct at91_udc_data udc_data;
  
  static struct resource udc_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_UDP,
  		.end	= AT91SAM9261_BASE_UDP + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_UDP,
  		.end	= AT91SAM9261_ID_UDP,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_udc_device = {
  	.name		= "at91_udc",
  	.id		= -1,
  	.dev		= {
  				.platform_data		= &udc_data,
  	},
  	.resource	= udc_resources,
  	.num_resources	= ARRAY_SIZE(udc_resources),
  };
  
  void __init at91_add_device_udc(struct at91_udc_data *data)
  {
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
111
112
  	if (!data)
  		return;
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
113
  	if (gpio_is_valid(data->vbus_pin)) {
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
114
115
116
  		at91_set_gpio_input(data->vbus_pin, 0);
  		at91_set_deglitch(data->vbus_pin, 1);
  	}
da7a42d60   Christian Glindkamp   [ARM] 4738/1: at9...
117
  	/* Pullup pin is handled internally by USB device peripheral */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
118
119
120
121
122
123
124
125
126
127
128
129
130
  
  	udc_data = *data;
  	platform_device_register(&at91sam9261_udc_device);
  }
  #else
  void __init at91_add_device_udc(struct at91_udc_data *data) {}
  #endif
  
  /* --------------------------------------------------------------------
   *  MMC / SD
   * -------------------------------------------------------------------- */
  
  #if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
131
  static u64 mmc_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  static struct at91_mmc_data mmc_data;
  
  static struct resource mmc_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_MCI,
  		.end	= AT91SAM9261_BASE_MCI + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_MCI,
  		.end	= AT91SAM9261_ID_MCI,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_mmc_device = {
  	.name		= "at91_mci",
  	.id		= -1,
  	.dev		= {
  				.dma_mask		= &mmc_dmamask,
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
152
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
153
154
155
156
157
  				.platform_data		= &mmc_data,
  	},
  	.resource	= mmc_resources,
  	.num_resources	= ARRAY_SIZE(mmc_resources),
  };
d0760b3bc   Andrew Victor   [ARM] 4143/1: AT9...
158
  void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
159
160
161
162
163
  {
  	if (!data)
  		return;
  
  	/* input/irq */
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
164
  	if (gpio_is_valid(data->det_pin)) {
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
165
166
167
  		at91_set_gpio_input(data->det_pin, 1);
  		at91_set_deglitch(data->det_pin, 1);
  	}
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
168
  	if (gpio_is_valid(data->wp_pin))
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
169
  		at91_set_gpio_input(data->wp_pin, 1);
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
170
  	if (gpio_is_valid(data->vcc_pin))
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  		at91_set_gpio_output(data->vcc_pin, 0);
  
  	/* CLK */
  	at91_set_B_periph(AT91_PIN_PA2, 0);
  
  	/* CMD */
  	at91_set_B_periph(AT91_PIN_PA1, 1);
  
  	/* DAT0, maybe DAT1..DAT3 */
  	at91_set_B_periph(AT91_PIN_PA0, 1);
  	if (data->wire4) {
  		at91_set_B_periph(AT91_PIN_PA4, 1);
  		at91_set_B_periph(AT91_PIN_PA5, 1);
  		at91_set_B_periph(AT91_PIN_PA6, 1);
  	}
  
  	mmc_data = *data;
  	platform_device_register(&at91sam9261_mmc_device);
  }
  #else
d0760b3bc   Andrew Victor   [ARM] 4143/1: AT9...
191
  void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
192
193
194
195
196
197
  #endif
  
  
  /* --------------------------------------------------------------------
   *  NAND / SmartMedia
   * -------------------------------------------------------------------- */
f6ed6f78d   Pieter du Preez   Fix rename of at9...
198
  #if defined(CONFIG_MTD_NAND_ATMEL) || defined(CONFIG_MTD_NAND_ATMEL_MODULE)
3c3796cc3   Håvard Skinnemoen   [MTD] [NAND] rena...
199
  static struct atmel_nand_data nand_data;
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
200
201
202
203
204
205
206
207
208
209
  
  #define NAND_BASE	AT91_CHIPSELECT_3
  
  static struct resource nand_resources[] = {
  	{
  		.start	= NAND_BASE,
  		.end	= NAND_BASE + SZ_256M - 1,
  		.flags	= IORESOURCE_MEM,
  	}
  };
3c3796cc3   Håvard Skinnemoen   [MTD] [NAND] rena...
210
211
  static struct platform_device atmel_nand_device = {
  	.name		= "atmel_nand",
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
212
213
214
215
216
217
218
  	.id		= -1,
  	.dev		= {
  				.platform_data	= &nand_data,
  	},
  	.resource	= nand_resources,
  	.num_resources	= ARRAY_SIZE(nand_resources),
  };
3c3796cc3   Håvard Skinnemoen   [MTD] [NAND] rena...
219
  void __init at91_add_device_nand(struct atmel_nand_data *data)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
220
  {
461d3b4dc   Andrew Victor   [ARM] 5288/1: [AT...
221
  	unsigned long csa;
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
222
223
224
225
226
  
  	if (!data)
  		return;
  
  	csa = at91_sys_read(AT91_MATRIX_EBICSA);
228235584   Andrew Victor   [ARM] 4755/1: [AT...
227
  	at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
228

86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
229
  	/* enable pin */
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
230
  	if (gpio_is_valid(data->enable_pin))
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
231
232
233
  		at91_set_gpio_output(data->enable_pin, 1);
  
  	/* ready/busy pin */
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
234
  	if (gpio_is_valid(data->rdy_pin))
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
235
236
237
  		at91_set_gpio_input(data->rdy_pin, 1);
  
  	/* card detect pin */
cc9f9aef6   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91/soc: us...
238
  	if (gpio_is_valid(data->det_pin))
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
239
240
241
242
243
244
  		at91_set_gpio_input(data->det_pin, 1);
  
  	at91_set_A_periph(AT91_PIN_PC0, 0);		/* NANDOE */
  	at91_set_A_periph(AT91_PIN_PC1, 0);		/* NANDWE */
  
  	nand_data = *data;
3c3796cc3   Håvard Skinnemoen   [MTD] [NAND] rena...
245
  	platform_device_register(&atmel_nand_device);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
246
247
248
  }
  
  #else
3c3796cc3   Håvard Skinnemoen   [MTD] [NAND] rena...
249
  void __init at91_add_device_nand(struct atmel_nand_data *data) {}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
250
251
252
253
254
255
  #endif
  
  
  /* --------------------------------------------------------------------
   *  TWI (i2c)
   * -------------------------------------------------------------------- */
f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
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
  /*
   * Prefer the GPIO code since the TWI controller isn't robust
   * (gets overruns and underruns under load) and can only issue
   * repeated STARTs in one scenario (the driver doesn't yet handle them).
   */
  #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
  
  static struct i2c_gpio_platform_data pdata = {
  	.sda_pin		= AT91_PIN_PA7,
  	.sda_is_open_drain	= 1,
  	.scl_pin		= AT91_PIN_PA8,
  	.scl_is_open_drain	= 1,
  	.udelay			= 2,		/* ~100 kHz */
  };
  
  static struct platform_device at91sam9261_twi_device = {
  	.name			= "i2c-gpio",
  	.id			= -1,
  	.dev.platform_data	= &pdata,
  };
  
  void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
  {
  	at91_set_GPIO_periph(AT91_PIN_PA7, 1);		/* TWD (SDA) */
  	at91_set_multi_drive(AT91_PIN_PA7, 1);
  
  	at91_set_GPIO_periph(AT91_PIN_PA8, 1);		/* TWCK (SCL) */
  	at91_set_multi_drive(AT91_PIN_PA8, 1);
  
  	i2c_register_board_info(0, devices, nr_devices);
  	platform_device_register(&at91sam9261_twi_device);
  }
  
  #elif defined(CONFIG_I2C_AT91) || defined(CONFIG_I2C_AT91_MODULE)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
  
  static struct resource twi_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_TWI,
  		.end	= AT91SAM9261_BASE_TWI + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_TWI,
  		.end	= AT91SAM9261_ID_TWI,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_twi_device = {
  	.name		= "at91_i2c",
  	.id		= -1,
  	.resource	= twi_resources,
  	.num_resources	= ARRAY_SIZE(twi_resources),
  };
f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
310
  void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
311
312
313
314
315
316
317
  {
  	/* pins used for TWI interface */
  	at91_set_A_periph(AT91_PIN_PA7, 0);		/* TWD */
  	at91_set_multi_drive(AT91_PIN_PA7, 1);
  
  	at91_set_A_periph(AT91_PIN_PA8, 0);		/* TWCK */
  	at91_set_multi_drive(AT91_PIN_PA8, 1);
f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
318
  	i2c_register_board_info(0, devices, nr_devices);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
319
320
321
  	platform_device_register(&at91sam9261_twi_device);
  }
  #else
f230d3f53   Andrew Victor   [ARM] 4650/1: AT9...
322
  void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) {}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
323
324
325
326
327
328
329
330
  #endif
  
  
  /* --------------------------------------------------------------------
   *  SPI
   * -------------------------------------------------------------------- */
  
  #if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
331
  static u64 spi_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
  
  static struct resource spi0_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_SPI0,
  		.end	= AT91SAM9261_BASE_SPI0 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_SPI0,
  		.end	= AT91SAM9261_ID_SPI0,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_spi0_device = {
  	.name		= "atmel_spi",
  	.id		= 0,
  	.dev		= {
  				.dma_mask		= &spi_dmamask,
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
351
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
  	},
  	.resource	= spi0_resources,
  	.num_resources	= ARRAY_SIZE(spi0_resources),
  };
  
  static const unsigned spi0_standard_cs[4] = { AT91_PIN_PA3, AT91_PIN_PA4, AT91_PIN_PA5, AT91_PIN_PA6 };
  
  static struct resource spi1_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_SPI1,
  		.end	= AT91SAM9261_BASE_SPI1 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_SPI1,
  		.end	= AT91SAM9261_ID_SPI1,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_spi1_device = {
  	.name		= "atmel_spi",
  	.id		= 1,
  	.dev		= {
  				.dma_mask		= &spi_dmamask,
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
377
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
  	},
  	.resource	= spi1_resources,
  	.num_resources	= ARRAY_SIZE(spi1_resources),
  };
  
  static const unsigned spi1_standard_cs[4] = { AT91_PIN_PB28, AT91_PIN_PA24, AT91_PIN_PA25, AT91_PIN_PA26 };
  
  void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
  {
  	int i;
  	unsigned long cs_pin;
  	short enable_spi0 = 0;
  	short enable_spi1 = 0;
  
  	/* Choose SPI chip-selects */
  	for (i = 0; i < nr_devices; i++) {
  		if (devices[i].controller_data)
  			cs_pin = (unsigned long) devices[i].controller_data;
  		else if (devices[i].bus_num == 0)
  			cs_pin = spi0_standard_cs[devices[i].chip_select];
  		else
  			cs_pin = spi1_standard_cs[devices[i].chip_select];
  
  		if (devices[i].bus_num == 0)
  			enable_spi0 = 1;
  		else
  			enable_spi1 = 1;
  
  		/* enable chip-select pin */
  		at91_set_gpio_output(cs_pin, 1);
  
  		/* pass chip-select pin to driver */
  		devices[i].controller_data = (void *) cs_pin;
  	}
  
  	spi_register_board_info(devices, nr_devices);
  
  	/* Configure SPI bus(es) */
  	if (enable_spi0) {
  		at91_set_A_periph(AT91_PIN_PA0, 0);	/* SPI0_MISO */
  		at91_set_A_periph(AT91_PIN_PA1, 0);	/* SPI0_MOSI */
  		at91_set_A_periph(AT91_PIN_PA2, 0);	/* SPI0_SPCK */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
420
421
422
423
424
425
  		platform_device_register(&at91sam9261_spi0_device);
  	}
  	if (enable_spi1) {
  		at91_set_A_periph(AT91_PIN_PB30, 0);	/* SPI1_MISO */
  		at91_set_A_periph(AT91_PIN_PB31, 0);	/* SPI1_MOSI */
  		at91_set_A_periph(AT91_PIN_PB29, 0);	/* SPI1_SPCK */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
426
427
428
429
430
431
432
433
434
435
436
  		platform_device_register(&at91sam9261_spi1_device);
  	}
  }
  #else
  void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) {}
  #endif
  
  
  /* --------------------------------------------------------------------
   *  LCD Controller
   * -------------------------------------------------------------------- */
7776a94c3   Andrew Victor   [ARM] 4352/1: AT9...
437
  #if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
438
  static u64 lcdc_dmamask = DMA_BIT_MASK(32);
7776a94c3   Andrew Victor   [ARM] 4352/1: AT9...
439
  static struct atmel_lcdfb_info lcdc_data;
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
  
  static struct resource lcdc_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_LCDC_BASE,
  		.end	= AT91SAM9261_LCDC_BASE + SZ_4K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_LCDC,
  		.end	= AT91SAM9261_ID_LCDC,
  		.flags	= IORESOURCE_IRQ,
  	},
  #if defined(CONFIG_FB_INTSRAM)
  	[2] = {
  		.start	= AT91SAM9261_SRAM_BASE,
  		.end	= AT91SAM9261_SRAM_BASE + AT91SAM9261_SRAM_SIZE - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  #endif
  };
  
  static struct platform_device at91_lcdc_device = {
7776a94c3   Andrew Victor   [ARM] 4352/1: AT9...
462
  	.name		= "atmel_lcdfb",
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
463
464
465
  	.id		= 0,
  	.dev		= {
  				.dma_mask		= &lcdc_dmamask,
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
466
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
467
468
469
470
471
  				.platform_data		= &lcdc_data,
  	},
  	.resource	= lcdc_resources,
  	.num_resources	= ARRAY_SIZE(lcdc_resources),
  };
7776a94c3   Andrew Victor   [ARM] 4352/1: AT9...
472
  void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
473
474
475
476
  {
  	if (!data) {
  		return;
  	}
f06e656fb   Andrew Victor   [ARM] 4750/1: [AT...
477
478
479
480
481
482
483
484
485
486
487
  #if defined(CONFIG_FB_ATMEL_STN)
  	at91_set_A_periph(AT91_PIN_PB0, 0);     /* LCDVSYNC */
  	at91_set_A_periph(AT91_PIN_PB1, 0);     /* LCDHSYNC */
  	at91_set_A_periph(AT91_PIN_PB2, 0);     /* LCDDOTCK */
  	at91_set_A_periph(AT91_PIN_PB3, 0);     /* LCDDEN */
  	at91_set_A_periph(AT91_PIN_PB4, 0);     /* LCDCC */
  	at91_set_A_periph(AT91_PIN_PB5, 0);     /* LCDD0 */
  	at91_set_A_periph(AT91_PIN_PB6, 0);     /* LCDD1 */
  	at91_set_A_periph(AT91_PIN_PB7, 0);     /* LCDD2 */
  	at91_set_A_periph(AT91_PIN_PB8, 0);     /* LCDD3 */
  #else
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
  	at91_set_A_periph(AT91_PIN_PB1, 0);	/* LCDHSYNC */
  	at91_set_A_periph(AT91_PIN_PB2, 0);	/* LCDDOTCK */
  	at91_set_A_periph(AT91_PIN_PB3, 0);	/* LCDDEN */
  	at91_set_A_periph(AT91_PIN_PB4, 0);	/* LCDCC */
  	at91_set_A_periph(AT91_PIN_PB7, 0);	/* LCDD2 */
  	at91_set_A_periph(AT91_PIN_PB8, 0);	/* LCDD3 */
  	at91_set_A_periph(AT91_PIN_PB9, 0);	/* LCDD4 */
  	at91_set_A_periph(AT91_PIN_PB10, 0);	/* LCDD5 */
  	at91_set_A_periph(AT91_PIN_PB11, 0);	/* LCDD6 */
  	at91_set_A_periph(AT91_PIN_PB12, 0);	/* LCDD7 */
  	at91_set_A_periph(AT91_PIN_PB15, 0);	/* LCDD10 */
  	at91_set_A_periph(AT91_PIN_PB16, 0);	/* LCDD11 */
  	at91_set_A_periph(AT91_PIN_PB17, 0);	/* LCDD12 */
  	at91_set_A_periph(AT91_PIN_PB18, 0);	/* LCDD13 */
  	at91_set_A_periph(AT91_PIN_PB19, 0);	/* LCDD14 */
  	at91_set_A_periph(AT91_PIN_PB20, 0);	/* LCDD15 */
  	at91_set_B_periph(AT91_PIN_PB23, 0);	/* LCDD18 */
  	at91_set_B_periph(AT91_PIN_PB24, 0);	/* LCDD19 */
  	at91_set_B_periph(AT91_PIN_PB25, 0);	/* LCDD20 */
  	at91_set_B_periph(AT91_PIN_PB26, 0);	/* LCDD21 */
  	at91_set_B_periph(AT91_PIN_PB27, 0);	/* LCDD22 */
  	at91_set_B_periph(AT91_PIN_PB28, 0);	/* LCDD23 */
f06e656fb   Andrew Victor   [ARM] 4750/1: [AT...
510
  #endif
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
511

01d3a5e7f   Haavard Skinnemoen   atmel_lcdfb: don'...
512
513
514
  	if (ARRAY_SIZE(lcdc_resources) > 2) {
  		void __iomem *fb;
  		struct resource *fb_res = &lcdc_resources[2];
28f65c11f   Joe Perches   treewide: Convert...
515
  		size_t fb_len = resource_size(fb_res);
01d3a5e7f   Haavard Skinnemoen   atmel_lcdfb: don'...
516

90898709d   Nicolas Ferre   atmel_lcdfb: fix ...
517
  		fb = ioremap(fb_res->start, fb_len);
01d3a5e7f   Haavard Skinnemoen   atmel_lcdfb: don'...
518
519
  		if (fb) {
  			memset(fb, 0, fb_len);
90898709d   Nicolas Ferre   atmel_lcdfb: fix ...
520
  			iounmap(fb);
01d3a5e7f   Haavard Skinnemoen   atmel_lcdfb: don'...
521
522
  		}
  	}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
523
524
525
526
  	lcdc_data = *data;
  	platform_device_register(&at91_lcdc_device);
  }
  #else
7776a94c3   Andrew Victor   [ARM] 4352/1: AT9...
527
  void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
528
529
530
531
  #endif
  
  
  /* --------------------------------------------------------------------
e5f40bfaf   Andrew Victor   [ARM] 4909/1: [AT...
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
   *  Timer/Counter block
   * -------------------------------------------------------------------- */
  
  #ifdef CONFIG_ATMEL_TCLIB
  
  static struct resource tcb_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_TCB0,
  		.end	= AT91SAM9261_BASE_TCB0 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_TC0,
  		.end	= AT91SAM9261_ID_TC0,
  		.flags	= IORESOURCE_IRQ,
  	},
  	[2] = {
  		.start	= AT91SAM9261_ID_TC1,
  		.end	= AT91SAM9261_ID_TC1,
  		.flags	= IORESOURCE_IRQ,
  	},
  	[3] = {
  		.start	= AT91SAM9261_ID_TC2,
  		.end	= AT91SAM9261_ID_TC2,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_tcb_device = {
  	.name		= "atmel_tcb",
  	.id		= 0,
  	.resource	= tcb_resources,
  	.num_resources	= ARRAY_SIZE(tcb_resources),
  };
  
  static void __init at91_add_device_tc(void)
  {
e5f40bfaf   Andrew Victor   [ARM] 4909/1: [AT...
569
570
571
572
573
574
575
576
  	platform_device_register(&at91sam9261_tcb_device);
  }
  #else
  static void __init at91_add_device_tc(void) { }
  #endif
  
  
  /* --------------------------------------------------------------------
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
577
578
579
580
581
   *  RTT
   * -------------------------------------------------------------------- */
  
  static struct resource rtt_resources[] = {
  	{
eab5fd67d   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make r...
582
583
  		.start	= AT91SAM9261_BASE_RTT,
  		.end	= AT91SAM9261_BASE_RTT + SZ_16 - 1,
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
584
585
586
587
588
589
  		.flags	= IORESOURCE_MEM,
  	}
  };
  
  static struct platform_device at91sam9261_rtt_device = {
  	.name		= "at91_rtt",
4fd9212cb   Andrew Victor   [ARM] 4908/1: [AT...
590
  	.id		= 0,
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
591
592
593
594
595
596
597
598
599
600
601
602
603
  	.resource	= rtt_resources,
  	.num_resources	= ARRAY_SIZE(rtt_resources),
  };
  
  static void __init at91_add_device_rtt(void)
  {
  	platform_device_register(&at91sam9261_rtt_device);
  }
  
  
  /* --------------------------------------------------------------------
   *  Watchdog
   * -------------------------------------------------------------------- */
2af29b786   Andrew Victor   [ARM] 5390/1: AT9...
604
  #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE)
c1c30a29d   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make w...
605
606
607
608
609
610
611
  static struct resource wdt_resources[] = {
  	{
  		.start	= AT91SAM9261_BASE_WDT,
  		.end	= AT91SAM9261_BASE_WDT + SZ_16 - 1,
  		.flags	= IORESOURCE_MEM,
  	}
  };
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
612
613
614
  static struct platform_device at91sam9261_wdt_device = {
  	.name		= "at91_wdt",
  	.id		= -1,
c1c30a29d   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make w...
615
616
  	.resource	= wdt_resources,
  	.num_resources	= ARRAY_SIZE(wdt_resources),
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
617
618
619
620
621
622
623
624
625
626
627
628
  };
  
  static void __init at91_add_device_watchdog(void)
  {
  	platform_device_register(&at91sam9261_wdt_device);
  }
  #else
  static void __init at91_add_device_watchdog(void) {}
  #endif
  
  
  /* --------------------------------------------------------------------
bfbc32663   Andrew Victor   [ARM] 4754/1: [AT...
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
   *  SSC -- Synchronous Serial Controller
   * -------------------------------------------------------------------- */
  
  #if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
  static u64 ssc0_dmamask = DMA_BIT_MASK(32);
  
  static struct resource ssc0_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_SSC0,
  		.end	= AT91SAM9261_BASE_SSC0 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_SSC0,
  		.end	= AT91SAM9261_ID_SSC0,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_ssc0_device = {
  	.name	= "ssc",
  	.id	= 0,
  	.dev	= {
  		.dma_mask		= &ssc0_dmamask,
  		.coherent_dma_mask	= DMA_BIT_MASK(32),
  	},
  	.resource	= ssc0_resources,
  	.num_resources	= ARRAY_SIZE(ssc0_resources),
  };
  
  static inline void configure_ssc0_pins(unsigned pins)
  {
  	if (pins & ATMEL_SSC_TF)
  		at91_set_A_periph(AT91_PIN_PB21, 1);
  	if (pins & ATMEL_SSC_TK)
  		at91_set_A_periph(AT91_PIN_PB22, 1);
  	if (pins & ATMEL_SSC_TD)
  		at91_set_A_periph(AT91_PIN_PB23, 1);
  	if (pins & ATMEL_SSC_RD)
  		at91_set_A_periph(AT91_PIN_PB24, 1);
  	if (pins & ATMEL_SSC_RK)
  		at91_set_A_periph(AT91_PIN_PB25, 1);
  	if (pins & ATMEL_SSC_RF)
  		at91_set_A_periph(AT91_PIN_PB26, 1);
  }
  
  static u64 ssc1_dmamask = DMA_BIT_MASK(32);
  
  static struct resource ssc1_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_SSC1,
  		.end	= AT91SAM9261_BASE_SSC1 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_SSC1,
  		.end	= AT91SAM9261_ID_SSC1,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_ssc1_device = {
  	.name	= "ssc",
  	.id	= 1,
  	.dev	= {
  		.dma_mask		= &ssc1_dmamask,
  		.coherent_dma_mask	= DMA_BIT_MASK(32),
  	},
  	.resource	= ssc1_resources,
  	.num_resources	= ARRAY_SIZE(ssc1_resources),
  };
  
  static inline void configure_ssc1_pins(unsigned pins)
  {
  	if (pins & ATMEL_SSC_TF)
  		at91_set_B_periph(AT91_PIN_PA17, 1);
  	if (pins & ATMEL_SSC_TK)
  		at91_set_B_periph(AT91_PIN_PA18, 1);
  	if (pins & ATMEL_SSC_TD)
  		at91_set_B_periph(AT91_PIN_PA19, 1);
  	if (pins & ATMEL_SSC_RD)
  		at91_set_B_periph(AT91_PIN_PA20, 1);
  	if (pins & ATMEL_SSC_RK)
  		at91_set_B_periph(AT91_PIN_PA21, 1);
  	if (pins & ATMEL_SSC_RF)
  		at91_set_B_periph(AT91_PIN_PA22, 1);
  }
  
  static u64 ssc2_dmamask = DMA_BIT_MASK(32);
  
  static struct resource ssc2_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_SSC2,
  		.end	= AT91SAM9261_BASE_SSC2 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_SSC2,
  		.end	= AT91SAM9261_ID_SSC2,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device at91sam9261_ssc2_device = {
  	.name	= "ssc",
  	.id	= 2,
  	.dev	= {
  		.dma_mask		= &ssc2_dmamask,
  		.coherent_dma_mask	= DMA_BIT_MASK(32),
  	},
  	.resource	= ssc2_resources,
  	.num_resources	= ARRAY_SIZE(ssc2_resources),
  };
  
  static inline void configure_ssc2_pins(unsigned pins)
  {
  	if (pins & ATMEL_SSC_TF)
  		at91_set_B_periph(AT91_PIN_PC25, 1);
  	if (pins & ATMEL_SSC_TK)
  		at91_set_B_periph(AT91_PIN_PC26, 1);
  	if (pins & ATMEL_SSC_TD)
  		at91_set_B_periph(AT91_PIN_PC27, 1);
  	if (pins & ATMEL_SSC_RD)
  		at91_set_B_periph(AT91_PIN_PC28, 1);
  	if (pins & ATMEL_SSC_RK)
  		at91_set_B_periph(AT91_PIN_PC29, 1);
  	if (pins & ATMEL_SSC_RF)
  		at91_set_B_periph(AT91_PIN_PC30, 1);
  }
  
  /*
   * SSC controllers are accessed through library code, instead of any
   * kind of all-singing/all-dancing driver.  For example one could be
   * used by a particular I2S audio codec's driver, while another one
   * on the same system might be used by a custom data capture driver.
   */
  void __init at91_add_device_ssc(unsigned id, unsigned pins)
  {
  	struct platform_device *pdev;
  
  	/*
  	 * NOTE: caller is responsible for passing information matching
  	 * "pins" to whatever will be using each particular controller.
  	 */
  	switch (id) {
  	case AT91SAM9261_ID_SSC0:
  		pdev = &at91sam9261_ssc0_device;
  		configure_ssc0_pins(pins);
bfbc32663   Andrew Victor   [ARM] 4754/1: [AT...
777
778
779
780
  		break;
  	case AT91SAM9261_ID_SSC1:
  		pdev = &at91sam9261_ssc1_device;
  		configure_ssc1_pins(pins);
bfbc32663   Andrew Victor   [ARM] 4754/1: [AT...
781
782
783
784
  		break;
  	case AT91SAM9261_ID_SSC2:
  		pdev = &at91sam9261_ssc2_device;
  		configure_ssc2_pins(pins);
bfbc32663   Andrew Victor   [ARM] 4754/1: [AT...
785
786
787
788
789
790
791
792
793
794
795
796
797
798
  		break;
  	default:
  		return;
  	}
  
  	platform_device_register(pdev);
  }
  
  #else
  void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
  #endif
  
  
  /* --------------------------------------------------------------------
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
799
800
801
802
803
804
   *  UART
   * -------------------------------------------------------------------- */
  
  #if defined(CONFIG_SERIAL_ATMEL)
  static struct resource dbgu_resources[] = {
  	[0] = {
13079a733   Jean-Christophe PLAGNIOL-VILLARD   ARM: at91: make D...
805
806
  		.start	= AT91SAM9261_BASE_DBGU,
  		.end	= AT91SAM9261_BASE_DBGU + SZ_512 - 1,
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
807
808
809
810
811
812
813
814
815
816
817
818
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91_ID_SYS,
  		.end	= AT91_ID_SYS,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct atmel_uart_data dbgu_data = {
  	.use_dma_tx	= 0,
  	.use_dma_rx	= 0,		/* DBGU not capable of receive DMA */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
819
  };
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
820
  static u64 dbgu_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
821
822
823
824
  static struct platform_device at91sam9261_dbgu_device = {
  	.name		= "atmel_usart",
  	.id		= 0,
  	.dev		= {
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
825
826
827
  				.dma_mask		= &dbgu_dmamask,
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
  				.platform_data		= &dbgu_data,
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
  	},
  	.resource	= dbgu_resources,
  	.num_resources	= ARRAY_SIZE(dbgu_resources),
  };
  
  static inline void configure_dbgu_pins(void)
  {
  	at91_set_A_periph(AT91_PIN_PA9, 0);		/* DRXD */
  	at91_set_A_periph(AT91_PIN_PA10, 1);		/* DTXD */
  }
  
  static struct resource uart0_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_US0,
  		.end	= AT91SAM9261_BASE_US0 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_US0,
  		.end	= AT91SAM9261_ID_US0,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct atmel_uart_data uart0_data = {
  	.use_dma_tx	= 1,
  	.use_dma_rx	= 1,
  };
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
856
  static u64 uart0_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
857
858
859
860
  static struct platform_device at91sam9261_uart0_device = {
  	.name		= "atmel_usart",
  	.id		= 1,
  	.dev		= {
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
861
862
863
  				.dma_mask		= &uart0_dmamask,
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
  				.platform_data		= &uart0_data,
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
864
865
866
867
  	},
  	.resource	= uart0_resources,
  	.num_resources	= ARRAY_SIZE(uart0_resources),
  };
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
868
  static inline void configure_usart0_pins(unsigned pins)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
869
870
871
  {
  	at91_set_A_periph(AT91_PIN_PC8, 1);		/* TXD0 */
  	at91_set_A_periph(AT91_PIN_PC9, 0);		/* RXD0 */
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
872
873
874
875
876
  
  	if (pins & ATMEL_UART_RTS)
  		at91_set_A_periph(AT91_PIN_PC10, 0);	/* RTS0 */
  	if (pins & ATMEL_UART_CTS)
  		at91_set_A_periph(AT91_PIN_PC11, 0);	/* CTS0 */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
  }
  
  static struct resource uart1_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_US1,
  		.end	= AT91SAM9261_BASE_US1 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_US1,
  		.end	= AT91SAM9261_ID_US1,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct atmel_uart_data uart1_data = {
  	.use_dma_tx	= 1,
  	.use_dma_rx	= 1,
  };
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
896
  static u64 uart1_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
897
898
899
900
  static struct platform_device at91sam9261_uart1_device = {
  	.name		= "atmel_usart",
  	.id		= 2,
  	.dev		= {
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
901
902
903
  				.dma_mask		= &uart1_dmamask,
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
  				.platform_data		= &uart1_data,
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
904
905
906
907
  	},
  	.resource	= uart1_resources,
  	.num_resources	= ARRAY_SIZE(uart1_resources),
  };
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
908
  static inline void configure_usart1_pins(unsigned pins)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
909
910
911
  {
  	at91_set_A_periph(AT91_PIN_PC12, 1);		/* TXD1 */
  	at91_set_A_periph(AT91_PIN_PC13, 0);		/* RXD1 */
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
912
913
914
915
916
  
  	if (pins & ATMEL_UART_RTS)
  		at91_set_B_periph(AT91_PIN_PA12, 0);	/* RTS1 */
  	if (pins & ATMEL_UART_CTS)
  		at91_set_B_periph(AT91_PIN_PA13, 0);	/* CTS1 */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
  }
  
  static struct resource uart2_resources[] = {
  	[0] = {
  		.start	= AT91SAM9261_BASE_US2,
  		.end	= AT91SAM9261_BASE_US2 + SZ_16K - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= AT91SAM9261_ID_US2,
  		.end	= AT91SAM9261_ID_US2,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static struct atmel_uart_data uart2_data = {
  	.use_dma_tx	= 1,
  	.use_dma_rx	= 1,
  };
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
936
  static u64 uart2_dmamask = DMA_BIT_MASK(32);
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
937
938
939
940
  static struct platform_device at91sam9261_uart2_device = {
  	.name		= "atmel_usart",
  	.id		= 3,
  	.dev		= {
c6686ff9d   Andrew Victor   [ARM] 4753/1: [AT...
941
942
943
  				.dma_mask		= &uart2_dmamask,
  				.coherent_dma_mask	= DMA_BIT_MASK(32),
  				.platform_data		= &uart2_data,
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
944
945
946
947
  	},
  	.resource	= uart2_resources,
  	.num_resources	= ARRAY_SIZE(uart2_resources),
  };
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
948
  static inline void configure_usart2_pins(unsigned pins)
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
949
950
951
  {
  	at91_set_A_periph(AT91_PIN_PC15, 0);		/* RXD2 */
  	at91_set_A_periph(AT91_PIN_PC14, 1);		/* TXD2 */
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
952
953
954
955
956
  
  	if (pins & ATMEL_UART_RTS)
  		at91_set_B_periph(AT91_PIN_PA15, 0);	/* RTS2*/
  	if (pins & ATMEL_UART_CTS)
  		at91_set_B_periph(AT91_PIN_PA16, 0);	/* CTS2 */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
957
  }
11aadac4f   Andrew Victor   [ARM] 4982/1: [AT...
958
  static struct platform_device *__initdata at91_uarts[ATMEL_MAX_UART];	/* the UARTs to use */
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
959
  struct platform_device *atmel_default_console_device;	/* the serial console device */
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
960
961
962
  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
  {
  	struct platform_device *pdev;
2b348e2f8   Jean-Christophe PLAGNIOL-VILLARD   atmel_serial: kee...
963
  	struct atmel_uart_data *pdata;
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
964
965
966
967
968
  
  	switch (id) {
  		case 0:		/* DBGU */
  			pdev = &at91sam9261_dbgu_device;
  			configure_dbgu_pins();
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
969
970
971
972
  			break;
  		case AT91SAM9261_ID_US0:
  			pdev = &at91sam9261_uart0_device;
  			configure_usart0_pins(pins);
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
973
974
975
976
  			break;
  		case AT91SAM9261_ID_US1:
  			pdev = &at91sam9261_uart1_device;
  			configure_usart1_pins(pins);
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
977
978
979
980
  			break;
  		case AT91SAM9261_ID_US2:
  			pdev = &at91sam9261_uart2_device;
  			configure_usart2_pins(pins);
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
981
982
983
984
  			break;
  		default:
  			return;
  	}
2b348e2f8   Jean-Christophe PLAGNIOL-VILLARD   atmel_serial: kee...
985
986
  	pdata = pdev->dev.platform_data;
  	pdata->num = portnr;		/* update to mapped ID */
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
987
988
989
990
991
992
993
  
  	if (portnr < ATMEL_MAX_UART)
  		at91_uarts[portnr] = pdev;
  }
  
  void __init at91_set_serial_console(unsigned portnr)
  {
bd6029959   Jean-Christophe PLAGNIOL-VILLARD   at91: switch to C...
994
  	if (portnr < ATMEL_MAX_UART) {
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
995
  		atmel_default_console_device = at91_uarts[portnr];
5c1f96686   Jean-Christophe PLAGNIOL-VILLARD   at91: fix at91_se...
996
  		at91sam9261_set_console_clock(at91_uarts[portnr]->id);
bd6029959   Jean-Christophe PLAGNIOL-VILLARD   at91: switch to C...
997
  	}
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
998
  }
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
999
1000
1001
1002
1003
1004
1005
1006
  void __init at91_add_device_serial(void)
  {
  	int i;
  
  	for (i = 0; i < ATMEL_MAX_UART; i++) {
  		if (at91_uarts[i])
  			platform_device_register(at91_uarts[i]);
  	}
11aadac4f   Andrew Victor   [ARM] 4982/1: [AT...
1007
1008
1009
1010
  
  	if (!atmel_default_console_device)
  		printk(KERN_INFO "AT91: No default serial console defined.
  ");
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
1011
1012
  }
  #else
c8f385a63   Andrew Victor   [ARM] 4757/1: [AT...
1013
1014
  void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
  void __init at91_set_serial_console(unsigned portnr) {}
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
  void __init at91_add_device_serial(void) {}
  #endif
  
  
  /* -------------------------------------------------------------------- */
  
  /*
   * These devices are always present and don't need any board-specific
   * setup.
   */
  static int __init at91_add_standard_devices(void)
  {
884f5a6a8   Andrew Victor   [ARM] 4752/1: [AT...
1027
1028
  	at91_add_device_rtt();
  	at91_add_device_watchdog();
e5f40bfaf   Andrew Victor   [ARM] 4909/1: [AT...
1029
  	at91_add_device_tc();
86ad76bb2   Andrew Victor   [ARM] 3953/1: AT9...
1030
1031
1032
1033
  	return 0;
  }
  
  arch_initcall(at91_add_standard_devices);