Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/blackfin/mach-bf533/boards/ezkit.c
15126 views
1
/*
2
* Copyright 2004-2009 Analog Devices Inc.
3
* 2005 National ICT Australia (NICTA)
4
* Aidan Williams <[email protected]>
5
*
6
* Licensed under the GPL-2 or later.
7
*/
8
9
#include <linux/device.h>
10
#include <linux/platform_device.h>
11
#include <linux/mtd/mtd.h>
12
#include <linux/mtd/partitions.h>
13
#include <linux/mtd/plat-ram.h>
14
#include <linux/mtd/physmap.h>
15
#include <linux/spi/spi.h>
16
#include <linux/spi/flash.h>
17
#if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE)
18
#include <linux/usb/isp1362.h>
19
#endif
20
#include <linux/irq.h>
21
#include <linux/i2c.h>
22
#include <asm/dma.h>
23
#include <asm/bfin5xx_spi.h>
24
#include <asm/portmux.h>
25
#include <asm/dpmc.h>
26
27
/*
28
* Name the Board for the /proc/cpuinfo
29
*/
30
const char bfin_board_name[] = "ADI BF533-EZKIT";
31
32
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
33
static struct platform_device rtc_device = {
34
.name = "rtc-bfin",
35
.id = -1,
36
};
37
#endif
38
39
/*
40
* USB-LAN EzExtender board
41
* Driver needs to know address, irq and flag pin.
42
*/
43
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
44
#include <linux/smc91x.h>
45
46
static struct smc91x_platdata smc91x_info = {
47
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
48
.leda = RPC_LED_100_10,
49
.ledb = RPC_LED_TX_RX,
50
};
51
52
static struct resource smc91x_resources[] = {
53
{
54
.name = "smc91x-regs",
55
.start = 0x20310300,
56
.end = 0x20310300 + 16,
57
.flags = IORESOURCE_MEM,
58
}, {
59
.start = IRQ_PF9,
60
.end = IRQ_PF9,
61
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
62
},
63
};
64
static struct platform_device smc91x_device = {
65
.name = "smc91x",
66
.id = 0,
67
.num_resources = ARRAY_SIZE(smc91x_resources),
68
.resource = smc91x_resources,
69
.dev = {
70
.platform_data = &smc91x_info,
71
},
72
};
73
#endif
74
75
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
76
static struct mtd_partition ezkit_partitions_a[] = {
77
{
78
.name = "bootloader(nor a)",
79
.size = 0x40000,
80
.offset = 0,
81
}, {
82
.name = "linux kernel(nor a)",
83
.size = MTDPART_SIZ_FULL,
84
.offset = MTDPART_OFS_APPEND,
85
},
86
};
87
88
static struct physmap_flash_data ezkit_flash_data_a = {
89
.width = 2,
90
.parts = ezkit_partitions_a,
91
.nr_parts = ARRAY_SIZE(ezkit_partitions_a),
92
};
93
94
static struct resource ezkit_flash_resource_a = {
95
.start = 0x20000000,
96
.end = 0x200fffff,
97
.flags = IORESOURCE_MEM,
98
};
99
100
static struct platform_device ezkit_flash_device_a = {
101
.name = "physmap-flash",
102
.id = 0,
103
.dev = {
104
.platform_data = &ezkit_flash_data_a,
105
},
106
.num_resources = 1,
107
.resource = &ezkit_flash_resource_a,
108
};
109
110
static struct mtd_partition ezkit_partitions_b[] = {
111
{
112
.name = "file system(nor b)",
113
.size = MTDPART_SIZ_FULL,
114
.offset = MTDPART_OFS_APPEND,
115
},
116
};
117
118
static struct physmap_flash_data ezkit_flash_data_b = {
119
.width = 2,
120
.parts = ezkit_partitions_b,
121
.nr_parts = ARRAY_SIZE(ezkit_partitions_b),
122
};
123
124
static struct resource ezkit_flash_resource_b = {
125
.start = 0x20100000,
126
.end = 0x201fffff,
127
.flags = IORESOURCE_MEM,
128
};
129
130
static struct platform_device ezkit_flash_device_b = {
131
.name = "physmap-flash",
132
.id = 4,
133
.dev = {
134
.platform_data = &ezkit_flash_data_b,
135
},
136
.num_resources = 1,
137
.resource = &ezkit_flash_resource_b,
138
};
139
#endif
140
141
#if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE)
142
static struct platdata_mtd_ram sram_data_a = {
143
.mapname = "Flash A SRAM",
144
.bankwidth = 2,
145
};
146
147
static struct resource sram_resource_a = {
148
.start = 0x20240000,
149
.end = 0x2024ffff,
150
.flags = IORESOURCE_MEM,
151
};
152
153
static struct platform_device sram_device_a = {
154
.name = "mtd-ram",
155
.id = 8,
156
.dev = {
157
.platform_data = &sram_data_a,
158
},
159
.num_resources = 1,
160
.resource = &sram_resource_a,
161
};
162
163
static struct platdata_mtd_ram sram_data_b = {
164
.mapname = "Flash B SRAM",
165
.bankwidth = 2,
166
};
167
168
static struct resource sram_resource_b = {
169
.start = 0x202c0000,
170
.end = 0x202cffff,
171
.flags = IORESOURCE_MEM,
172
};
173
174
static struct platform_device sram_device_b = {
175
.name = "mtd-ram",
176
.id = 9,
177
.dev = {
178
.platform_data = &sram_data_b,
179
},
180
.num_resources = 1,
181
.resource = &sram_resource_b,
182
};
183
#endif
184
185
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
186
static struct mtd_partition bfin_spi_flash_partitions[] = {
187
{
188
.name = "bootloader(spi)",
189
.size = 0x00020000,
190
.offset = 0,
191
.mask_flags = MTD_CAP_ROM
192
}, {
193
.name = "linux kernel(spi)",
194
.size = 0xe0000,
195
.offset = MTDPART_OFS_APPEND,
196
}, {
197
.name = "file system(spi)",
198
.size = MTDPART_SIZ_FULL,
199
.offset = MTDPART_OFS_APPEND,
200
}
201
};
202
203
static struct flash_platform_data bfin_spi_flash_data = {
204
.name = "m25p80",
205
.parts = bfin_spi_flash_partitions,
206
.nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
207
.type = "m25p64",
208
};
209
210
/* SPI flash chip (m25p64) */
211
static struct bfin5xx_spi_chip spi_flash_chip_info = {
212
.enable_dma = 0, /* use dma transfer with this chip*/
213
.bits_per_word = 8,
214
};
215
#endif
216
217
#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE)
218
/* SPI ADC chip */
219
static struct bfin5xx_spi_chip spi_adc_chip_info = {
220
.enable_dma = 1, /* use dma transfer with this chip*/
221
.bits_per_word = 16,
222
};
223
#endif
224
225
#if defined(CONFIG_SND_BF5XX_SOC_AD183X) || defined(CONFIG_SND_BF5XX_SOC_AD183X_MODULE)
226
static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
227
.enable_dma = 0,
228
.bits_per_word = 16,
229
};
230
#endif
231
232
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
233
static struct bfin5xx_spi_chip spidev_chip_info = {
234
.enable_dma = 0,
235
.bits_per_word = 8,
236
};
237
#endif
238
239
static struct spi_board_info bfin_spi_board_info[] __initdata = {
240
#if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE)
241
{
242
/* the modalias must be the same as spi device driver name */
243
.modalias = "m25p80", /* Name of spi_driver for this device */
244
.max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
245
.bus_num = 0, /* Framework bus number */
246
.chip_select = 2, /* Framework chip select. On STAMP537 it is SPISSEL2*/
247
.platform_data = &bfin_spi_flash_data,
248
.controller_data = &spi_flash_chip_info,
249
.mode = SPI_MODE_3,
250
},
251
#endif
252
253
#if defined(CONFIG_BFIN_SPI_ADC) || defined(CONFIG_BFIN_SPI_ADC_MODULE)
254
{
255
.modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
256
.max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
257
.bus_num = 0, /* Framework bus number */
258
.chip_select = 1, /* Framework chip select. */
259
.platform_data = NULL, /* No spi_driver specific config */
260
.controller_data = &spi_adc_chip_info,
261
},
262
#endif
263
264
#if defined(CONFIG_SND_BF5XX_SOC_AD183X) || defined(CONFIG_SND_BF5XX_SOC_AD183X_MODULE)
265
{
266
.modalias = "ad183x",
267
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
268
.bus_num = 0,
269
.chip_select = 4,
270
.controller_data = &ad1836_spi_chip_info,
271
},
272
#endif
273
#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
274
{
275
.modalias = "spidev",
276
.max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
277
.bus_num = 0,
278
.chip_select = 1,
279
.controller_data = &spidev_chip_info,
280
},
281
#endif
282
};
283
284
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
285
/* SPI (0) */
286
static struct resource bfin_spi0_resource[] = {
287
[0] = {
288
.start = SPI0_REGBASE,
289
.end = SPI0_REGBASE + 0xFF,
290
.flags = IORESOURCE_MEM,
291
},
292
[1] = {
293
.start = CH_SPI,
294
.end = CH_SPI,
295
.flags = IORESOURCE_DMA,
296
},
297
[2] = {
298
.start = IRQ_SPI,
299
.end = IRQ_SPI,
300
.flags = IORESOURCE_IRQ,
301
}
302
};
303
304
/* SPI controller data */
305
static struct bfin5xx_spi_master bfin_spi0_info = {
306
.num_chipselect = 8,
307
.enable_dma = 1, /* master has the ability to do dma transfer */
308
.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
309
};
310
311
static struct platform_device bfin_spi0_device = {
312
.name = "bfin-spi",
313
.id = 0, /* Bus number */
314
.num_resources = ARRAY_SIZE(bfin_spi0_resource),
315
.resource = bfin_spi0_resource,
316
.dev = {
317
.platform_data = &bfin_spi0_info, /* Passed to driver */
318
},
319
};
320
#endif /* spi master and devices */
321
322
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
323
#ifdef CONFIG_SERIAL_BFIN_UART0
324
static struct resource bfin_uart0_resources[] = {
325
{
326
.start = BFIN_UART_THR,
327
.end = BFIN_UART_GCTL+2,
328
.flags = IORESOURCE_MEM,
329
},
330
{
331
.start = IRQ_UART0_RX,
332
.end = IRQ_UART0_RX + 1,
333
.flags = IORESOURCE_IRQ,
334
},
335
{
336
.start = IRQ_UART0_ERROR,
337
.end = IRQ_UART0_ERROR,
338
.flags = IORESOURCE_IRQ,
339
},
340
{
341
.start = CH_UART0_TX,
342
.end = CH_UART0_TX,
343
.flags = IORESOURCE_DMA,
344
},
345
{
346
.start = CH_UART0_RX,
347
.end = CH_UART0_RX,
348
.flags = IORESOURCE_DMA,
349
},
350
};
351
352
static unsigned short bfin_uart0_peripherals[] = {
353
P_UART0_TX, P_UART0_RX, 0
354
};
355
356
static struct platform_device bfin_uart0_device = {
357
.name = "bfin-uart",
358
.id = 0,
359
.num_resources = ARRAY_SIZE(bfin_uart0_resources),
360
.resource = bfin_uart0_resources,
361
.dev = {
362
.platform_data = &bfin_uart0_peripherals, /* Passed to driver */
363
},
364
};
365
#endif
366
#endif
367
368
#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
369
#ifdef CONFIG_BFIN_SIR0
370
static struct resource bfin_sir0_resources[] = {
371
{
372
.start = 0xFFC00400,
373
.end = 0xFFC004FF,
374
.flags = IORESOURCE_MEM,
375
},
376
{
377
.start = IRQ_UART0_RX,
378
.end = IRQ_UART0_RX+1,
379
.flags = IORESOURCE_IRQ,
380
},
381
{
382
.start = CH_UART0_RX,
383
.end = CH_UART0_RX+1,
384
.flags = IORESOURCE_DMA,
385
},
386
};
387
388
static struct platform_device bfin_sir0_device = {
389
.name = "bfin_sir",
390
.id = 0,
391
.num_resources = ARRAY_SIZE(bfin_sir0_resources),
392
.resource = bfin_sir0_resources,
393
};
394
#endif
395
#endif
396
397
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
398
#include <linux/input.h>
399
#include <linux/gpio_keys.h>
400
401
static struct gpio_keys_button bfin_gpio_keys_table[] = {
402
{BTN_0, GPIO_PF7, 1, "gpio-keys: BTN0"},
403
{BTN_1, GPIO_PF8, 1, "gpio-keys: BTN1"},
404
{BTN_2, GPIO_PF9, 1, "gpio-keys: BTN2"},
405
{BTN_3, GPIO_PF10, 1, "gpio-keys: BTN3"},
406
};
407
408
static struct gpio_keys_platform_data bfin_gpio_keys_data = {
409
.buttons = bfin_gpio_keys_table,
410
.nbuttons = ARRAY_SIZE(bfin_gpio_keys_table),
411
};
412
413
static struct platform_device bfin_device_gpiokeys = {
414
.name = "gpio-keys",
415
.dev = {
416
.platform_data = &bfin_gpio_keys_data,
417
},
418
};
419
#endif
420
421
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
422
#include <linux/i2c-gpio.h>
423
424
static struct i2c_gpio_platform_data i2c_gpio_data = {
425
.sda_pin = GPIO_PF1,
426
.scl_pin = GPIO_PF0,
427
.sda_is_open_drain = 0,
428
.scl_is_open_drain = 0,
429
.udelay = 40,
430
};
431
432
static struct platform_device i2c_gpio_device = {
433
.name = "i2c-gpio",
434
.id = 0,
435
.dev = {
436
.platform_data = &i2c_gpio_data,
437
},
438
};
439
#endif
440
441
static const unsigned int cclk_vlev_datasheet[] =
442
{
443
VRPAIR(VLEV_085, 250000000),
444
VRPAIR(VLEV_090, 376000000),
445
VRPAIR(VLEV_095, 426000000),
446
VRPAIR(VLEV_100, 426000000),
447
VRPAIR(VLEV_105, 476000000),
448
VRPAIR(VLEV_110, 476000000),
449
VRPAIR(VLEV_115, 476000000),
450
VRPAIR(VLEV_120, 600000000),
451
VRPAIR(VLEV_125, 600000000),
452
VRPAIR(VLEV_130, 600000000),
453
};
454
455
static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
456
.tuple_tab = cclk_vlev_datasheet,
457
.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
458
.vr_settling_time = 25 /* us */,
459
};
460
461
static struct platform_device bfin_dpmc = {
462
.name = "bfin dpmc",
463
.dev = {
464
.platform_data = &bfin_dmpc_vreg_data,
465
},
466
};
467
468
static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
469
#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
470
{
471
I2C_BOARD_INFO("bfin-adv7393", 0x2B),
472
},
473
#endif
474
};
475
476
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
477
static struct platform_device bfin_i2s = {
478
.name = "bfin-i2s",
479
.id = CONFIG_SND_BF5XX_SPORT_NUM,
480
/* TODO: add platform data here */
481
};
482
#endif
483
484
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
485
static struct platform_device bfin_tdm = {
486
.name = "bfin-tdm",
487
.id = CONFIG_SND_BF5XX_SPORT_NUM,
488
/* TODO: add platform data here */
489
};
490
#endif
491
492
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
493
static struct platform_device bfin_ac97 = {
494
.name = "bfin-ac97",
495
.id = CONFIG_SND_BF5XX_SPORT_NUM,
496
/* TODO: add platform data here */
497
};
498
#endif
499
500
static struct platform_device *ezkit_devices[] __initdata = {
501
502
&bfin_dpmc,
503
504
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
505
&ezkit_flash_device_a,
506
&ezkit_flash_device_b,
507
#endif
508
509
#if defined(CONFIG_MTD_PLATRAM) || defined(CONFIG_MTD_PLATRAM_MODULE)
510
&sram_device_a,
511
&sram_device_b,
512
#endif
513
514
#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
515
&smc91x_device,
516
#endif
517
518
#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
519
&bfin_spi0_device,
520
#endif
521
522
#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
523
&rtc_device,
524
#endif
525
526
#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
527
#ifdef CONFIG_SERIAL_BFIN_UART0
528
&bfin_uart0_device,
529
#endif
530
#endif
531
532
#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
533
#ifdef CONFIG_BFIN_SIR0
534
&bfin_sir0_device,
535
#endif
536
#endif
537
538
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
539
&bfin_device_gpiokeys,
540
#endif
541
542
#if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE)
543
&i2c_gpio_device,
544
#endif
545
546
#if defined(CONFIG_SND_BF5XX_I2S) || defined(CONFIG_SND_BF5XX_I2S_MODULE)
547
&bfin_i2s,
548
#endif
549
550
#if defined(CONFIG_SND_BF5XX_TDM) || defined(CONFIG_SND_BF5XX_TDM_MODULE)
551
&bfin_tdm,
552
#endif
553
554
#if defined(CONFIG_SND_BF5XX_AC97) || defined(CONFIG_SND_BF5XX_AC97_MODULE)
555
&bfin_ac97,
556
#endif
557
};
558
559
static int __init ezkit_init(void)
560
{
561
printk(KERN_INFO "%s(): registering device resources\n", __func__);
562
platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices));
563
spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
564
i2c_register_board_info(0, bfin_i2c_board_info,
565
ARRAY_SIZE(bfin_i2c_board_info));
566
return 0;
567
}
568
569
arch_initcall(ezkit_init);
570
571
static struct platform_device *ezkit_early_devices[] __initdata = {
572
#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
573
#ifdef CONFIG_SERIAL_BFIN_UART0
574
&bfin_uart0_device,
575
#endif
576
#endif
577
};
578
579
void __init native_machine_early_platform_add_devices(void)
580
{
581
printk(KERN_INFO "register early platform devices\n");
582
early_platform_add_devices(ezkit_early_devices,
583
ARRAY_SIZE(ezkit_early_devices));
584
}
585
586