blob: 5294fdd207326fc716d5df787d849c8af33c7557 [file] [log] [blame]
Michael Hennerich59003142007-10-21 16:54:27 +08001/*
Robin Getz96f10502009-09-24 14:11:24 +00002 * Copyright 2004-2009 Analog Devices Inc.
3 * 2005 National ICT Australia (NICTA)
4 * Aidan Williams <aidan@nicta.com.au>
Michael Hennerich59003142007-10-21 16:54:27 +08005 *
Robin Getz96f10502009-09-24 14:11:24 +00006 * Licensed under the GPL-2 or later.
Michael Hennerich59003142007-10-21 16:54:27 +08007 */
8
9#include <linux/device.h>
10#include <linux/platform_device.h>
11#include <linux/mtd/mtd.h>
12#include <linux/mtd/partitions.h>
Michael Hennerichd7e5dd42008-05-07 11:41:26 +080013#include <linux/mtd/physmap.h>
Michael Hennerich59003142007-10-21 16:54:27 +080014#include <linux/spi/spi.h>
15#include <linux/spi/flash.h>
Bryan Wu72268682008-05-07 11:41:26 +080016#include <linux/i2c.h>
Michael Hennerich59003142007-10-21 16:54:27 +080017#include <linux/irq.h>
18#include <linux/interrupt.h>
Mike Frysinger632f6582007-11-15 21:25:47 +080019#include <linux/usb/sl811.h>
Michael Hennerich1089e222007-12-24 11:49:29 +080020#include <linux/usb/musb.h>
Michael Hennerich59003142007-10-21 16:54:27 +080021#include <asm/dma.h>
22#include <asm/bfin5xx_spi.h>
23#include <asm/reboot.h>
Michael Hennerich64307f72007-10-29 16:55:18 +080024#include <asm/nand.h>
Bryan Wu5d448dd2007-11-12 23:24:42 +080025#include <asm/portmux.h>
Michael Hennerich14b03202008-05-07 11:41:26 +080026#include <asm/dpmc.h>
Michael Hennerich59003142007-10-21 16:54:27 +080027#include <linux/spi/ad7877.h>
28
29/*
30 * Name the Board for the /proc/cpuinfo
31 */
Mike Frysingerfe85cad2008-11-18 17:48:22 +080032const char bfin_board_name[] = "ADI BF527-EZKIT";
Michael Hennerich59003142007-10-21 16:54:27 +080033
34/*
35 * Driver needs to know address, irq and flag pin.
36 */
37
Michael Hennerich59003142007-10-21 16:54:27 +080038#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
Michael Hennerich3f375692008-11-18 17:48:22 +080039#include <linux/usb/isp1760.h>
40static struct resource bfin_isp1760_resources[] = {
Michael Hennerich59003142007-10-21 16:54:27 +080041 [0] = {
Michael Hennerich3f375692008-11-18 17:48:22 +080042 .start = 0x203C0000,
43 .end = 0x203C0000 + 0x000fffff,
Michael Hennerich59003142007-10-21 16:54:27 +080044 .flags = IORESOURCE_MEM,
45 },
46 [1] = {
Michael Hennerich3f375692008-11-18 17:48:22 +080047 .start = IRQ_PF7,
48 .end = IRQ_PF7,
Michael Hennerich59003142007-10-21 16:54:27 +080049 .flags = IORESOURCE_IRQ,
50 },
51};
52
Michael Hennerich3f375692008-11-18 17:48:22 +080053static struct isp1760_platform_data isp1760_priv = {
54 .is_isp1761 = 0,
Michael Hennerich3f375692008-11-18 17:48:22 +080055 .bus_width_16 = 1,
56 .port1_otg = 0,
57 .analog_oc = 0,
58 .dack_polarity_high = 0,
59 .dreq_polarity_high = 0,
60};
61
62static struct platform_device bfin_isp1760_device = {
Michael Hennerichc6feb7682009-10-15 10:37:33 +000063 .name = "isp1760",
Michael Hennerich59003142007-10-21 16:54:27 +080064 .id = 0,
Michael Hennerich3f375692008-11-18 17:48:22 +080065 .dev = {
66 .platform_data = &isp1760_priv,
67 },
68 .num_resources = ARRAY_SIZE(bfin_isp1760_resources),
69 .resource = bfin_isp1760_resources,
Michael Hennerich59003142007-10-21 16:54:27 +080070};
Michael Hennerich59003142007-10-21 16:54:27 +080071#endif
72
Michael Hennerich1089e222007-12-24 11:49:29 +080073#if defined(CONFIG_USB_MUSB_HDRC) || defined(CONFIG_USB_MUSB_HDRC_MODULE)
74static struct resource musb_resources[] = {
75 [0] = {
76 .start = 0xffc03800,
77 .end = 0xffc03cff,
78 .flags = IORESOURCE_MEM,
79 },
80 [1] = { /* general IRQ */
81 .start = IRQ_USB_INT0,
82 .end = IRQ_USB_INT0,
83 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
84 },
85 [2] = { /* DMA IRQ */
86 .start = IRQ_USB_DMA,
87 .end = IRQ_USB_DMA,
88 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
89 },
90};
91
Bryan Wu50041ac2008-10-08 13:39:40 +080092static struct musb_hdrc_config musb_config = {
93 .multipoint = 0,
94 .dyn_fifo = 0,
95 .soft_con = 1,
96 .dma = 1,
Bryan Wufea05da2009-01-07 23:14:39 +080097 .num_eps = 8,
98 .dma_channels = 8,
Bryan Wu50041ac2008-10-08 13:39:40 +080099 .gpio_vrsel = GPIO_PG13,
100};
101
Michael Hennerich1089e222007-12-24 11:49:29 +0800102static struct musb_hdrc_platform_data musb_plat = {
103#if defined(CONFIG_USB_MUSB_OTG)
104 .mode = MUSB_OTG,
105#elif defined(CONFIG_USB_MUSB_HDRC_HCD)
106 .mode = MUSB_HOST,
107#elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
108 .mode = MUSB_PERIPHERAL,
109#endif
Bryan Wu50041ac2008-10-08 13:39:40 +0800110 .config = &musb_config,
Michael Hennerich1089e222007-12-24 11:49:29 +0800111};
112
113static u64 musb_dmamask = ~(u32)0;
114
115static struct platform_device musb_device = {
116 .name = "musb_hdrc",
117 .id = 0,
118 .dev = {
119 .dma_mask = &musb_dmamask,
120 .coherent_dma_mask = 0xffffffff,
121 .platform_data = &musb_plat,
122 },
123 .num_resources = ARRAY_SIZE(musb_resources),
124 .resource = musb_resources,
125};
126#endif
127
128#if defined(CONFIG_FB_BFIN_T350MCQB) || defined(CONFIG_FB_BFIN_T350MCQB_MODULE)
129
130static struct resource bf52x_t350mcqb_resources[] = {
131 {
132 .start = IRQ_PPI_ERROR,
133 .end = IRQ_PPI_ERROR,
134 .flags = IORESOURCE_IRQ,
135 },
136};
137
138static struct platform_device bf52x_t350mcqb_device = {
139 .name = "bfin-t350mcqb",
140 .id = -1,
141 .num_resources = ARRAY_SIZE(bf52x_t350mcqb_resources),
142 .resource = bf52x_t350mcqb_resources,
143};
144#endif
145
Michael Hennerichd7e5dd42008-05-07 11:41:26 +0800146#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
147static struct mtd_partition ezkit_partitions[] = {
148 {
Robin Getzaa582972008-08-05 17:47:29 +0800149 .name = "bootloader(nor)",
Michael Hennerichd7e5dd42008-05-07 11:41:26 +0800150 .size = 0x40000,
151 .offset = 0,
152 }, {
Robin Getzaa582972008-08-05 17:47:29 +0800153 .name = "linux kernel(nor)",
Michael Hennerichd7e5dd42008-05-07 11:41:26 +0800154 .size = 0x1C0000,
155 .offset = MTDPART_OFS_APPEND,
156 }, {
Robin Getzaa582972008-08-05 17:47:29 +0800157 .name = "file system(nor)",
Michael Hennerichd7e5dd42008-05-07 11:41:26 +0800158 .size = MTDPART_SIZ_FULL,
159 .offset = MTDPART_OFS_APPEND,
160 }
161};
162
163static struct physmap_flash_data ezkit_flash_data = {
164 .width = 2,
165 .parts = ezkit_partitions,
166 .nr_parts = ARRAY_SIZE(ezkit_partitions),
167};
168
169static struct resource ezkit_flash_resource = {
170 .start = 0x20000000,
171 .end = 0x203fffff,
172 .flags = IORESOURCE_MEM,
173};
174
175static struct platform_device ezkit_flash_device = {
176 .name = "physmap-flash",
177 .id = 0,
178 .dev = {
179 .platform_data = &ezkit_flash_data,
180 },
181 .num_resources = 1,
182 .resource = &ezkit_flash_resource,
183};
184#endif
185
Michael Hennerich64307f72007-10-29 16:55:18 +0800186#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
187static struct mtd_partition partition_info[] = {
188 {
Robin Getzaa582972008-08-05 17:47:29 +0800189 .name = "linux kernel(nand)",
Michael Hennerich64307f72007-10-29 16:55:18 +0800190 .offset = 0,
Mike Frysingerf4585a02008-10-13 14:45:21 +0800191 .size = 4 * 1024 * 1024,
Michael Hennerich64307f72007-10-29 16:55:18 +0800192 },
193 {
Robin Getzaa582972008-08-05 17:47:29 +0800194 .name = "file system(nand)",
Mike Frysingeredf05642008-02-25 11:38:11 +0800195 .offset = MTDPART_OFS_APPEND,
196 .size = MTDPART_SIZ_FULL,
Michael Hennerich64307f72007-10-29 16:55:18 +0800197 },
198};
199
200static struct bf5xx_nand_platform bf5xx_nand_platform = {
201 .page_size = NFC_PG_SIZE_256,
202 .data_width = NFC_NWIDTH_8,
203 .partitions = partition_info,
204 .nr_partitions = ARRAY_SIZE(partition_info),
205 .rd_dly = 3,
206 .wr_dly = 3,
207};
208
209static struct resource bf5xx_nand_resources[] = {
210 {
211 .start = NFC_CTL,
212 .end = NFC_DATA_RD + 2,
213 .flags = IORESOURCE_MEM,
214 },
215 {
216 .start = CH_NFC,
217 .end = CH_NFC,
218 .flags = IORESOURCE_IRQ,
219 },
220};
221
222static struct platform_device bf5xx_nand_device = {
223 .name = "bf5xx-nand",
224 .id = 0,
225 .num_resources = ARRAY_SIZE(bf5xx_nand_resources),
226 .resource = bf5xx_nand_resources,
227 .dev = {
228 .platform_data = &bf5xx_nand_platform,
229 },
230};
231#endif
232
Michael Hennerich59003142007-10-21 16:54:27 +0800233#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
234static struct resource bfin_pcmcia_cf_resources[] = {
235 {
236 .start = 0x20310000, /* IO PORT */
237 .end = 0x20312000,
238 .flags = IORESOURCE_MEM,
239 }, {
240 .start = 0x20311000, /* Attribute Memory */
241 .end = 0x20311FFF,
242 .flags = IORESOURCE_MEM,
243 }, {
244 .start = IRQ_PF4,
245 .end = IRQ_PF4,
246 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
247 }, {
248 .start = 6, /* Card Detect PF6 */
249 .end = 6,
250 .flags = IORESOURCE_IRQ,
251 },
252};
253
254static struct platform_device bfin_pcmcia_cf_device = {
255 .name = "bfin_cf_pcmcia",
256 .id = -1,
257 .num_resources = ARRAY_SIZE(bfin_pcmcia_cf_resources),
258 .resource = bfin_pcmcia_cf_resources,
259};
260#endif
261
262#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
263static struct platform_device rtc_device = {
264 .name = "rtc-bfin",
265 .id = -1,
266};
267#endif
268
269#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
Michael Hennerich61f09b52009-07-24 08:48:31 +0000270#include <linux/smc91x.h>
271
272static struct smc91x_platdata smc91x_info = {
273 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
274 .leda = RPC_LED_100_10,
275 .ledb = RPC_LED_TX_RX,
276};
277
Michael Hennerich59003142007-10-21 16:54:27 +0800278static struct resource smc91x_resources[] = {
279 {
280 .name = "smc91x-regs",
281 .start = 0x20300300,
282 .end = 0x20300300 + 16,
283 .flags = IORESOURCE_MEM,
284 }, {
285
286 .start = IRQ_PF7,
287 .end = IRQ_PF7,
288 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
289 },
290};
291static struct platform_device smc91x_device = {
292 .name = "smc91x",
293 .id = 0,
294 .num_resources = ARRAY_SIZE(smc91x_resources),
295 .resource = smc91x_resources,
Michael Hennerich61f09b52009-07-24 08:48:31 +0000296 .dev = {
297 .platform_data = &smc91x_info,
298 },
Michael Hennerich59003142007-10-21 16:54:27 +0800299};
300#endif
301
302#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
303static struct resource dm9000_resources[] = {
304 [0] = {
305 .start = 0x203FB800,
Laurent Pinchartda3854f2008-06-24 22:15:58 +0100306 .end = 0x203FB800 + 1,
Michael Hennerich59003142007-10-21 16:54:27 +0800307 .flags = IORESOURCE_MEM,
308 },
309 [1] = {
Laurent Pinchartda3854f2008-06-24 22:15:58 +0100310 .start = 0x203FB800 + 4,
311 .end = 0x203FB800 + 5,
312 .flags = IORESOURCE_MEM,
313 },
314 [2] = {
Michael Hennerich59003142007-10-21 16:54:27 +0800315 .start = IRQ_PF9,
316 .end = IRQ_PF9,
317 .flags = (IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE),
318 },
319};
320
321static struct platform_device dm9000_device = {
322 .name = "dm9000",
323 .id = -1,
324 .num_resources = ARRAY_SIZE(dm9000_resources),
325 .resource = dm9000_resources,
326};
327#endif
328
329#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
330static struct resource sl811_hcd_resources[] = {
331 {
332 .start = 0x20340000,
333 .end = 0x20340000,
334 .flags = IORESOURCE_MEM,
335 }, {
336 .start = 0x20340004,
337 .end = 0x20340004,
338 .flags = IORESOURCE_MEM,
339 }, {
340 .start = CONFIG_USB_SL811_BFIN_IRQ,
341 .end = CONFIG_USB_SL811_BFIN_IRQ,
342 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
343 },
344};
345
346#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
347void sl811_port_power(struct device *dev, int is_on)
348{
349 gpio_request(CONFIG_USB_SL811_BFIN_GPIO_VBUS, "usb:SL811_VBUS");
Michael Hennerichacbcd262008-01-22 18:36:20 +0800350 gpio_direction_output(CONFIG_USB_SL811_BFIN_GPIO_VBUS, is_on);
Michael Hennerich59003142007-10-21 16:54:27 +0800351}
352#endif
353
354static struct sl811_platform_data sl811_priv = {
355 .potpg = 10,
356 .power = 250, /* == 500mA */
357#if defined(CONFIG_USB_SL811_BFIN_USE_VBUS)
358 .port_power = &sl811_port_power,
359#endif
360};
361
362static struct platform_device sl811_hcd_device = {
363 .name = "sl811-hcd",
364 .id = 0,
365 .dev = {
366 .platform_data = &sl811_priv,
367 },
368 .num_resources = ARRAY_SIZE(sl811_hcd_resources),
369 .resource = sl811_hcd_resources,
370};
371#endif
372
Michael Hennerich59003142007-10-21 16:54:27 +0800373#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
Graf Yang65319622009-02-04 16:49:45 +0800374static struct platform_device bfin_mii_bus = {
375 .name = "bfin_mii_bus",
376};
377
Michael Hennerich59003142007-10-21 16:54:27 +0800378static struct platform_device bfin_mac_device = {
379 .name = "bfin_mac",
Graf Yang65319622009-02-04 16:49:45 +0800380 .dev.platform_data = &bfin_mii_bus,
Michael Hennerich59003142007-10-21 16:54:27 +0800381};
382#endif
383
384#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
385static struct resource net2272_bfin_resources[] = {
386 {
387 .start = 0x20300000,
388 .end = 0x20300000 + 0x100,
389 .flags = IORESOURCE_MEM,
390 }, {
391 .start = IRQ_PF7,
392 .end = IRQ_PF7,
393 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
394 },
395};
396
397static struct platform_device net2272_bfin_device = {
398 .name = "net2272",
399 .id = -1,
400 .num_resources = ARRAY_SIZE(net2272_bfin_resources),
401 .resource = net2272_bfin_resources,
402};
403#endif
404
Michael Hennerich59003142007-10-21 16:54:27 +0800405#if defined(CONFIG_MTD_M25P80) \
406 || defined(CONFIG_MTD_M25P80_MODULE)
407static struct mtd_partition bfin_spi_flash_partitions[] = {
408 {
Robin Getzaa582972008-08-05 17:47:29 +0800409 .name = "bootloader(spi)",
Grace Panac76d882008-04-24 06:33:56 +0800410 .size = 0x00040000,
Michael Hennerich59003142007-10-21 16:54:27 +0800411 .offset = 0,
412 .mask_flags = MTD_CAP_ROM
413 }, {
Robin Getzaa582972008-08-05 17:47:29 +0800414 .name = "linux kernel(spi)",
Mike Frysingeredf05642008-02-25 11:38:11 +0800415 .size = MTDPART_SIZ_FULL,
416 .offset = MTDPART_OFS_APPEND,
Michael Hennerich59003142007-10-21 16:54:27 +0800417 }
418};
419
420static struct flash_platform_data bfin_spi_flash_data = {
421 .name = "m25p80",
422 .parts = bfin_spi_flash_partitions,
423 .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
Michael Hennerichb9c9e782008-05-07 11:41:26 +0800424 .type = "m25p16",
Michael Hennerich59003142007-10-21 16:54:27 +0800425};
426
427/* SPI flash chip (m25p64) */
428static struct bfin5xx_spi_chip spi_flash_chip_info = {
429 .enable_dma = 0, /* use dma transfer with this chip*/
430 .bits_per_word = 8,
431};
432#endif
433
Mike Frysingera261eec2009-05-20 14:05:36 +0000434#if defined(CONFIG_BFIN_SPI_ADC) \
435 || defined(CONFIG_BFIN_SPI_ADC_MODULE)
Michael Hennerich59003142007-10-21 16:54:27 +0800436/* SPI ADC chip */
437static struct bfin5xx_spi_chip spi_adc_chip_info = {
438 .enable_dma = 1, /* use dma transfer with this chip*/
439 .bits_per_word = 16,
440};
441#endif
442
443#if defined(CONFIG_SND_BLACKFIN_AD1836) \
444 || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
445static struct bfin5xx_spi_chip ad1836_spi_chip_info = {
446 .enable_dma = 0,
447 .bits_per_word = 16,
448};
449#endif
450
Yi Liffdf3ec2009-03-31 10:36:51 +0000451#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
452static struct bfin5xx_spi_chip mmc_spi_chip_info = {
453 .enable_dma = 0,
454 .bits_per_word = 8,
455};
456#endif
457
Michael Hennerich59003142007-10-21 16:54:27 +0800458#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
459static struct bfin5xx_spi_chip spi_ad7877_chip_info = {
460 .enable_dma = 0,
461 .bits_per_word = 16,
462};
463
464static const struct ad7877_platform_data bfin_ad7877_ts_info = {
465 .model = 7877,
466 .vref_delay_usecs = 50, /* internal, no capacitor */
467 .x_plate_ohms = 419,
468 .y_plate_ohms = 486,
469 .pressure_max = 1000,
470 .pressure_min = 0,
471 .stopacq_polarity = 1,
472 .first_conversion_delay = 3,
473 .acquisition_time = 1,
474 .averaging = 1,
475 .pen_down_acc_interval = 1,
476};
477#endif
478
Michael Hennerich51054322009-01-07 23:14:38 +0800479#if defined(CONFIG_TOUCHSCREEN_AD7879) || defined(CONFIG_TOUCHSCREEN_AD7879_MODULE)
480#include <linux/spi/ad7879.h>
481static const struct ad7879_platform_data bfin_ad7879_ts_info = {
482 .model = 7879, /* Model = AD7879 */
483 .x_plate_ohms = 620, /* 620 Ohm from the touch datasheet */
484 .pressure_max = 10000,
485 .pressure_min = 0,
486 .first_conversion_delay = 3, /* wait 512us before do a first conversion */
487 .acquisition_time = 1, /* 4us acquisition time per sample */
488 .median = 2, /* do 8 measurements */
489 .averaging = 1, /* take the average of 4 middle samples */
490 .pen_down_acc_interval = 255, /* 9.4 ms */
491 .gpio_output = 1, /* configure AUX/VBAT/GPIO as GPIO output */
492 .gpio_default = 1, /* During initialization set GPIO = HIGH */
493};
494#endif
495
496#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
497static struct bfin5xx_spi_chip spi_ad7879_chip_info = {
498 .enable_dma = 0,
499 .bits_per_word = 16,
500};
501#endif
502
Michael Hennerichc7d48962007-11-15 21:33:31 +0800503#if defined(CONFIG_SND_SOC_WM8731) || defined(CONFIG_SND_SOC_WM8731_MODULE) \
Michael Hennerich0954f702007-11-13 00:16:19 +0800504 && defined(CONFIG_SND_SOC_WM8731_SPI)
505static struct bfin5xx_spi_chip spi_wm8731_chip_info = {
506 .enable_dma = 0,
507 .bits_per_word = 16,
508};
509#endif
Michael Hennerich6e668932008-02-09 01:54:09 +0800510
511#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
512static struct bfin5xx_spi_chip spidev_chip_info = {
513 .enable_dma = 0,
514 .bits_per_word = 8,
515};
516#endif
517
Michael Hennerich59003142007-10-21 16:54:27 +0800518static struct spi_board_info bfin_spi_board_info[] __initdata = {
519#if defined(CONFIG_MTD_M25P80) \
520 || defined(CONFIG_MTD_M25P80_MODULE)
521 {
522 /* the modalias must be the same as spi device driver name */
523 .modalias = "m25p80", /* Name of spi_driver for this device */
524 .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */
525 .bus_num = 0, /* Framework bus number */
526 .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/
527 .platform_data = &bfin_spi_flash_data,
528 .controller_data = &spi_flash_chip_info,
529 .mode = SPI_MODE_3,
530 },
531#endif
532
Mike Frysingera261eec2009-05-20 14:05:36 +0000533#if defined(CONFIG_BFIN_SPI_ADC) \
534 || defined(CONFIG_BFIN_SPI_ADC_MODULE)
Michael Hennerich59003142007-10-21 16:54:27 +0800535 {
536 .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */
537 .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */
538 .bus_num = 0, /* Framework bus number */
539 .chip_select = 1, /* Framework chip select. */
540 .platform_data = NULL, /* No spi_driver specific config */
541 .controller_data = &spi_adc_chip_info,
542 },
543#endif
544
545#if defined(CONFIG_SND_BLACKFIN_AD1836) \
546 || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE)
547 {
Barry Songdac98172009-08-13 21:07:37 +0000548 .modalias = "ad1836",
Michael Hennerich59003142007-10-21 16:54:27 +0800549 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
550 .bus_num = 0,
551 .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT,
552 .controller_data = &ad1836_spi_chip_info,
553 },
554#endif
Yi Liffdf3ec2009-03-31 10:36:51 +0000555#if defined(CONFIG_MMC_SPI) || defined(CONFIG_MMC_SPI_MODULE)
556 {
557 .modalias = "mmc_spi",
558 .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */
559 .bus_num = 0,
560 .chip_select = 3,
561 .controller_data = &mmc_spi_chip_info,
562 .mode = SPI_MODE_0,
563 },
564#endif
565
Michael Hennerich59003142007-10-21 16:54:27 +0800566#if defined(CONFIG_TOUCHSCREEN_AD7877) || defined(CONFIG_TOUCHSCREEN_AD7877_MODULE)
567 {
568 .modalias = "ad7877",
569 .platform_data = &bfin_ad7877_ts_info,
Bryan Wu2eb74ae2008-05-31 15:17:25 +0800570 .irq = IRQ_PF8,
Michael Hennerich59003142007-10-21 16:54:27 +0800571 .max_speed_hz = 12500000, /* max spi clock (SCK) speed in HZ */
Michael Hennerich0954f702007-11-13 00:16:19 +0800572 .bus_num = 0,
Bryan Wu2eb74ae2008-05-31 15:17:25 +0800573 .chip_select = 2,
Michael Hennerich59003142007-10-21 16:54:27 +0800574 .controller_data = &spi_ad7877_chip_info,
575 },
576#endif
Michael Hennerich51054322009-01-07 23:14:38 +0800577#if defined(CONFIG_TOUCHSCREEN_AD7879_SPI) || defined(CONFIG_TOUCHSCREEN_AD7879_SPI_MODULE)
578 {
579 .modalias = "ad7879",
580 .platform_data = &bfin_ad7879_ts_info,
581 .irq = IRQ_PF8,
582 .max_speed_hz = 5000000, /* max spi clock (SCK) speed in HZ */
583 .bus_num = 0,
584 .chip_select = 3,
585 .controller_data = &spi_ad7879_chip_info,
586 .mode = SPI_CPHA | SPI_CPOL,
587 },
588#endif
Michael Hennerichc7d48962007-11-15 21:33:31 +0800589#if defined(CONFIG_SND_SOC_WM8731) || defined(CONFIG_SND_SOC_WM8731_MODULE) \
Michael Hennerich0954f702007-11-13 00:16:19 +0800590 && defined(CONFIG_SND_SOC_WM8731_SPI)
591 {
592 .modalias = "wm8731",
593 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
594 .bus_num = 0,
595 .chip_select = 5,
596 .controller_data = &spi_wm8731_chip_info,
597 .mode = SPI_MODE_0,
598 },
599#endif
Michael Hennerich6e668932008-02-09 01:54:09 +0800600#if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE)
601 {
602 .modalias = "spidev",
603 .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */
604 .bus_num = 0,
605 .chip_select = 1,
606 .controller_data = &spidev_chip_info,
607 },
608#endif
Michael Hennerich59003142007-10-21 16:54:27 +0800609};
610
Mike Frysinger5bda2722008-06-07 15:03:01 +0800611#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
Michael Hennerich59003142007-10-21 16:54:27 +0800612/* SPI controller data */
613static struct bfin5xx_spi_master bfin_spi0_info = {
614 .num_chipselect = 8,
615 .enable_dma = 1, /* master has the ability to do dma transfer */
Bryan Wu5d448dd2007-11-12 23:24:42 +0800616 .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
Michael Hennerich59003142007-10-21 16:54:27 +0800617};
618
619/* SPI (0) */
620static struct resource bfin_spi0_resource[] = {
621 [0] = {
622 .start = SPI0_REGBASE,
623 .end = SPI0_REGBASE + 0xFF,
624 .flags = IORESOURCE_MEM,
625 },
626 [1] = {
627 .start = CH_SPI,
628 .end = CH_SPI,
Yi Li53122692009-06-05 12:11:11 +0000629 .flags = IORESOURCE_DMA,
630 },
631 [2] = {
632 .start = IRQ_SPI,
633 .end = IRQ_SPI,
Michael Hennerich59003142007-10-21 16:54:27 +0800634 .flags = IORESOURCE_IRQ,
635 },
636};
637
638static struct platform_device bfin_spi0_device = {
639 .name = "bfin-spi",
640 .id = 0, /* Bus number */
641 .num_resources = ARRAY_SIZE(bfin_spi0_resource),
642 .resource = bfin_spi0_resource,
643 .dev = {
644 .platform_data = &bfin_spi0_info, /* Passed to driver */
645 },
646};
647#endif /* spi master and devices */
648
Michael Hennerich59003142007-10-21 16:54:27 +0800649#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
650static struct resource bfin_uart_resources[] = {
651#ifdef CONFIG_SERIAL_BFIN_UART0
652 {
653 .start = 0xFFC00400,
654 .end = 0xFFC004FF,
655 .flags = IORESOURCE_MEM,
656 },
657#endif
658#ifdef CONFIG_SERIAL_BFIN_UART1
659 {
660 .start = 0xFFC02000,
661 .end = 0xFFC020FF,
662 .flags = IORESOURCE_MEM,
663 },
664#endif
665};
666
667static struct platform_device bfin_uart_device = {
668 .name = "bfin-uart",
669 .id = 1,
670 .num_resources = ARRAY_SIZE(bfin_uart_resources),
671 .resource = bfin_uart_resources,
672};
673#endif
674
Graf Yang5be36d22008-04-25 03:09:15 +0800675#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
Graf Yang5be36d22008-04-25 03:09:15 +0800676#ifdef CONFIG_BFIN_SIR0
Graf Yang42bd8bc2009-01-07 23:14:39 +0800677static struct resource bfin_sir0_resources[] = {
Graf Yang5be36d22008-04-25 03:09:15 +0800678 {
679 .start = 0xFFC00400,
680 .end = 0xFFC004FF,
681 .flags = IORESOURCE_MEM,
682 },
Graf Yang42bd8bc2009-01-07 23:14:39 +0800683 {
684 .start = IRQ_UART0_RX,
685 .end = IRQ_UART0_RX+1,
686 .flags = IORESOURCE_IRQ,
687 },
688 {
689 .start = CH_UART0_RX,
690 .end = CH_UART0_RX+1,
691 .flags = IORESOURCE_DMA,
692 },
693};
694
695static struct platform_device bfin_sir0_device = {
696 .name = "bfin_sir",
697 .id = 0,
698 .num_resources = ARRAY_SIZE(bfin_sir0_resources),
699 .resource = bfin_sir0_resources,
700};
Graf Yang5be36d22008-04-25 03:09:15 +0800701#endif
702#ifdef CONFIG_BFIN_SIR1
Graf Yang42bd8bc2009-01-07 23:14:39 +0800703static struct resource bfin_sir1_resources[] = {
Graf Yang5be36d22008-04-25 03:09:15 +0800704 {
705 .start = 0xFFC02000,
706 .end = 0xFFC020FF,
707 .flags = IORESOURCE_MEM,
708 },
Graf Yang42bd8bc2009-01-07 23:14:39 +0800709 {
710 .start = IRQ_UART1_RX,
711 .end = IRQ_UART1_RX+1,
712 .flags = IORESOURCE_IRQ,
713 },
714 {
715 .start = CH_UART1_RX,
716 .end = CH_UART1_RX+1,
717 .flags = IORESOURCE_DMA,
718 },
Graf Yang5be36d22008-04-25 03:09:15 +0800719};
720
Graf Yang42bd8bc2009-01-07 23:14:39 +0800721static struct platform_device bfin_sir1_device = {
Graf Yang5be36d22008-04-25 03:09:15 +0800722 .name = "bfin_sir",
Graf Yang42bd8bc2009-01-07 23:14:39 +0800723 .id = 1,
724 .num_resources = ARRAY_SIZE(bfin_sir1_resources),
725 .resource = bfin_sir1_resources,
Graf Yang5be36d22008-04-25 03:09:15 +0800726};
727#endif
Graf Yang42bd8bc2009-01-07 23:14:39 +0800728#endif
Graf Yang5be36d22008-04-25 03:09:15 +0800729
Michael Hennerich59003142007-10-21 16:54:27 +0800730#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
731static struct resource bfin_twi0_resource[] = {
732 [0] = {
733 .start = TWI0_REGBASE,
734 .end = TWI0_REGBASE,
735 .flags = IORESOURCE_MEM,
736 },
737 [1] = {
738 .start = IRQ_TWI,
739 .end = IRQ_TWI,
740 .flags = IORESOURCE_IRQ,
741 },
742};
743
744static struct platform_device i2c_bfin_twi_device = {
745 .name = "i2c-bfin-twi",
746 .id = 0,
747 .num_resources = ARRAY_SIZE(bfin_twi0_resource),
748 .resource = bfin_twi0_resource,
749};
750#endif
751
Bryan Wu72268682008-05-07 11:41:26 +0800752static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
Michael Hennerichebd58332009-07-02 11:00:38 +0000753#if defined(CONFIG_BFIN_TWI_LCD) || defined(CONFIG_BFIN_TWI_LCD_MODULE)
Bryan Wu72268682008-05-07 11:41:26 +0800754 {
755 I2C_BOARD_INFO("pcf8574_lcd", 0x22),
Bryan Wu72268682008-05-07 11:41:26 +0800756 },
757#endif
Michael Hennerich204844e2009-06-30 14:57:22 +0000758#if defined(CONFIG_INPUT_PCF8574) || defined(CONFIG_INPUT_PCF8574_MODULE)
Bryan Wu72268682008-05-07 11:41:26 +0800759 {
760 I2C_BOARD_INFO("pcf8574_keypad", 0x27),
Bryan Wu72268682008-05-07 11:41:26 +0800761 .irq = IRQ_PF8,
762 },
763#endif
Michael Hennerich50c4c082009-09-22 13:10:09 +0000764#if defined(CONFIG_FB_BFIN_7393) || defined(CONFIG_FB_BFIN_7393_MODULE)
765 {
766 I2C_BOARD_INFO("bfin-adv7393", 0x2B),
767 },
768#endif
Bryan Wu72268682008-05-07 11:41:26 +0800769};
Bryan Wu72268682008-05-07 11:41:26 +0800770
Michael Hennerich59003142007-10-21 16:54:27 +0800771#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
772static struct platform_device bfin_sport0_uart_device = {
773 .name = "bfin-sport-uart",
774 .id = 0,
775};
776
777static struct platform_device bfin_sport1_uart_device = {
778 .name = "bfin-sport-uart",
779 .id = 1,
780};
781#endif
782
Michael Hennerich1089e222007-12-24 11:49:29 +0800783#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
784#include <linux/input.h>
785#include <linux/gpio_keys.h>
786
787static struct gpio_keys_button bfin_gpio_keys_table[] = {
788 {BTN_0, GPIO_PG0, 1, "gpio-keys: BTN0"},
789 {BTN_1, GPIO_PG13, 1, "gpio-keys: BTN1"},
790};
791
792static struct gpio_keys_platform_data bfin_gpio_keys_data = {
793 .buttons = bfin_gpio_keys_table,
794 .nbuttons = ARRAY_SIZE(bfin_gpio_keys_table),
795};
796
797static struct platform_device bfin_device_gpiokeys = {
798 .name = "gpio-keys",
799 .dev = {
800 .platform_data = &bfin_gpio_keys_data,
801 },
802};
803#endif
804
Michael Hennerichadfc0462009-10-09 07:37:03 +0000805#if defined(CONFIG_INPUT_BFIN_ROTARY) || defined(CONFIG_INPUT_BFIN_ROTARY_MODULE)
Michael Hennerichaca5e4a2008-10-08 14:27:59 +0800806#include <linux/input.h>
807#include <asm/bfin_rotary.h>
808
809static struct bfin_rotary_platform_data bfin_rotary_data = {
810 /*.rotary_up_key = KEY_UP,*/
811 /*.rotary_down_key = KEY_DOWN,*/
812 .rotary_rel_code = REL_WHEEL,
813 .rotary_button_key = KEY_ENTER,
814 .debounce = 10, /* 0..17 */
815 .mode = ROT_QUAD_ENC | ROT_DEBE,
816};
817
818static struct resource bfin_rotary_resources[] = {
819 {
820 .start = IRQ_CNT,
821 .end = IRQ_CNT,
822 .flags = IORESOURCE_IRQ,
823 },
824};
825
826static struct platform_device bfin_rotary_device = {
827 .name = "bfin-rotary",
828 .id = -1,
829 .num_resources = ARRAY_SIZE(bfin_rotary_resources),
830 .resource = bfin_rotary_resources,
831 .dev = {
832 .platform_data = &bfin_rotary_data,
833 },
834};
835#endif
836
Michael Hennerich14b03202008-05-07 11:41:26 +0800837static const unsigned int cclk_vlev_datasheet[] =
838{
839 VRPAIR(VLEV_100, 400000000),
840 VRPAIR(VLEV_105, 426000000),
841 VRPAIR(VLEV_110, 500000000),
842 VRPAIR(VLEV_115, 533000000),
843 VRPAIR(VLEV_120, 600000000),
844};
845
846static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
847 .tuple_tab = cclk_vlev_datasheet,
848 .tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
849 .vr_settling_time = 25 /* us */,
850};
851
852static struct platform_device bfin_dpmc = {
853 .name = "bfin dpmc",
854 .dev = {
855 .platform_data = &bfin_dmpc_vreg_data,
856 },
857};
858
Michael Hennerich59003142007-10-21 16:54:27 +0800859static struct platform_device *stamp_devices[] __initdata = {
Michael Hennerich14b03202008-05-07 11:41:26 +0800860
861 &bfin_dpmc,
862
Michael Hennerich64307f72007-10-29 16:55:18 +0800863#if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE)
864 &bf5xx_nand_device,
865#endif
866
Michael Hennerich59003142007-10-21 16:54:27 +0800867#if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE)
868 &bfin_pcmcia_cf_device,
869#endif
870
871#if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE)
872 &rtc_device,
873#endif
874
875#if defined(CONFIG_USB_SL811_HCD) || defined(CONFIG_USB_SL811_HCD_MODULE)
876 &sl811_hcd_device,
877#endif
878
Michael Hennerich3f375692008-11-18 17:48:22 +0800879#if defined(CONFIG_USB_ISP1760_HCD) || defined(CONFIG_USB_ISP1760_HCD_MODULE)
880 &bfin_isp1760_device,
881#endif
882
Michael Hennerich1089e222007-12-24 11:49:29 +0800883#if defined(CONFIG_USB_MUSB_HDRC) || defined(CONFIG_USB_MUSB_HDRC_MODULE)
884 &musb_device,
885#endif
886
Michael Hennerich59003142007-10-21 16:54:27 +0800887#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
888 &smc91x_device,
889#endif
890
891#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
892 &dm9000_device,
893#endif
894
895#if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE)
Graf Yang65319622009-02-04 16:49:45 +0800896 &bfin_mii_bus,
Michael Hennerich59003142007-10-21 16:54:27 +0800897 &bfin_mac_device,
898#endif
899
900#if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE)
901 &net2272_bfin_device,
902#endif
903
904#if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE)
905 &bfin_spi0_device,
906#endif
907
Michael Hennerich1089e222007-12-24 11:49:29 +0800908#if defined(CONFIG_FB_BFIN_T350MCQB) || defined(CONFIG_FB_BFIN_T350MCQB_MODULE)
909 &bf52x_t350mcqb_device,
910#endif
911
Michael Hennerich59003142007-10-21 16:54:27 +0800912#if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE)
913 &bfin_uart_device,
914#endif
915
Graf Yang5be36d22008-04-25 03:09:15 +0800916#if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE)
Graf Yang42bd8bc2009-01-07 23:14:39 +0800917#ifdef CONFIG_BFIN_SIR0
918 &bfin_sir0_device,
919#endif
920#ifdef CONFIG_BFIN_SIR1
921 &bfin_sir1_device,
922#endif
Graf Yang5be36d22008-04-25 03:09:15 +0800923#endif
924
Michael Hennerich59003142007-10-21 16:54:27 +0800925#if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE)
926 &i2c_bfin_twi_device,
927#endif
928
929#if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE)
930 &bfin_sport0_uart_device,
931 &bfin_sport1_uart_device,
932#endif
933
Michael Hennerich1089e222007-12-24 11:49:29 +0800934#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
935 &bfin_device_gpiokeys,
936#endif
Mike Frysingercad2ab62008-02-22 17:01:31 +0800937
Michael Hennerichadfc0462009-10-09 07:37:03 +0000938#if defined(CONFIG_INPUT_BFIN_ROTARY) || defined(CONFIG_INPUT_BFIN_ROTARY_MODULE)
Michael Hennerichaca5e4a2008-10-08 14:27:59 +0800939 &bfin_rotary_device,
940#endif
941
Michael Hennerichd7e5dd42008-05-07 11:41:26 +0800942#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
943 &ezkit_flash_device,
944#endif
Michael Hennerich59003142007-10-21 16:54:27 +0800945};
946
Mike Frysinger7f6678c2009-02-04 16:49:45 +0800947static int __init ezkit_init(void)
Michael Hennerich59003142007-10-21 16:54:27 +0800948{
Harvey Harrisonb85d8582008-04-23 09:39:01 +0800949 printk(KERN_INFO "%s(): registering device resources\n", __func__);
Bryan Wu72268682008-05-07 11:41:26 +0800950 i2c_register_board_info(0, bfin_i2c_board_info,
951 ARRAY_SIZE(bfin_i2c_board_info));
Michael Hennerich59003142007-10-21 16:54:27 +0800952 platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
Mike Frysinger5bda2722008-06-07 15:03:01 +0800953 spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
Michael Hennerich59003142007-10-21 16:54:27 +0800954 return 0;
955}
956
Mike Frysinger7f6678c2009-02-04 16:49:45 +0800957arch_initcall(ezkit_init);
Michael Hennerich59003142007-10-21 16:54:27 +0800958
959void native_machine_restart(char *cmd)
960{
961 /* workaround reboot hang when booting from SPI */
962 if ((bfin_read_SYSCR() & 0x7) == 0x3)
Sonic Zhangb52dae32009-02-04 16:49:45 +0800963 bfin_reset_boot_spi_cs(P_DEFAULT_BOOT_SPI_CS);
Michael Hennerich59003142007-10-21 16:54:27 +0800964}
Mike Frysinger137b1522007-11-22 16:07:03 +0800965
Mike Frysinger9862cc52007-11-15 21:21:20 +0800966void bfin_get_ether_addr(char *addr)
Mike Frysinger137b1522007-11-22 16:07:03 +0800967{
Mike Frysinger181afa92008-02-25 11:42:17 +0800968 /* the MAC is stored in OTP memory page 0xDF */
969 u32 ret;
970 u64 otp_mac;
971 u32 (*otp_read)(u32 page, u32 flags, u64 *page_content) = (void *)0xEF00001A;
972
973 ret = otp_read(0xDF, 0x00, &otp_mac);
974 if (!(ret & 0x1)) {
975 char *otp_mac_p = (char *)&otp_mac;
976 for (ret = 0; ret < 6; ++ret)
977 addr[ret] = otp_mac_p[5 - ret];
978 }
Mike Frysinger137b1522007-11-22 16:07:03 +0800979}
Mike Frysinger9862cc52007-11-15 21:21:20 +0800980EXPORT_SYMBOL(bfin_get_ether_addr);