1/*
2 * Board Info File for the BlackStamp
3 *
4 * Copyright 2004-2008 Analog Devices Inc.
5 *                2008 Benjamin Matthews <bmat@lle.rochester.edu>
6 *                2005 National ICT Australia (NICTA)
7 *                      Aidan Williams <aidan@nicta.com.au>
8 *
9 * More info about the BlackStamp at:
10 * 	http://blackfin.uclinux.org/gf/project/blackstamp/
11 *
12 * Licensed under the GPL-2 or later.
13 */
14
15#include <linux/device.h>
16#include <linux/platform_device.h>
17#include <linux/mtd/mtd.h>
18#include <linux/mtd/partitions.h>
19#include <linux/mtd/physmap.h>
20#include <linux/spi/spi.h>
21#include <linux/spi/flash.h>
22#include <linux/irq.h>
23#include <linux/gpio.h>
24#include <linux/i2c.h>
25#include <asm/dma.h>
26#include <asm/bfin5xx_spi.h>
27#include <asm/portmux.h>
28#include <asm/dpmc.h>
29
30/*
31 * Name the Board for the /proc/cpuinfo
32 */
33const char bfin_board_name[] = "BlackStamp";
34
35#if IS_ENABLED(CONFIG_RTC_DRV_BFIN)
36static struct platform_device rtc_device = {
37	.name = "rtc-bfin",
38	.id   = -1,
39};
40#endif
41
42/*
43 *  Driver needs to know address, irq and flag pin.
44 */
45#if IS_ENABLED(CONFIG_SMC91X)
46#include <linux/smc91x.h>
47
48static struct smc91x_platdata smc91x_info = {
49	.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
50	.leda = RPC_LED_100_10,
51	.ledb = RPC_LED_TX_RX,
52};
53
54static struct resource smc91x_resources[] = {
55	{
56		.name = "smc91x-regs",
57		.start = 0x20300300,
58		.end = 0x20300300 + 16,
59		.flags = IORESOURCE_MEM,
60	}, {
61		.start = IRQ_PF3,
62		.end = IRQ_PF3,
63		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
64	},
65};
66
67static struct platform_device smc91x_device = {
68	.name = "smc91x",
69	.id = 0,
70	.num_resources = ARRAY_SIZE(smc91x_resources),
71	.resource = smc91x_resources,
72	.dev	= {
73		.platform_data	= &smc91x_info,
74	},
75};
76#endif
77
78#if IS_ENABLED(CONFIG_MTD_M25P80)
79static struct mtd_partition bfin_spi_flash_partitions[] = {
80	{
81		.name = "bootloader(spi)",
82		.size = 0x00040000,
83		.offset = 0,
84		.mask_flags = MTD_CAP_ROM
85	}, {
86		.name = "linux kernel(spi)",
87		.size = 0x180000,
88		.offset = MTDPART_OFS_APPEND,
89	}, {
90		.name = "file system(spi)",
91		.size = MTDPART_SIZ_FULL,
92		.offset = MTDPART_OFS_APPEND,
93	}
94};
95
96static struct flash_platform_data bfin_spi_flash_data = {
97	.name = "m25p80",
98	.parts = bfin_spi_flash_partitions,
99	.nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions),
100	.type = "m25p64",
101};
102
103/* SPI flash chip (m25p64) */
104static struct bfin5xx_spi_chip spi_flash_chip_info = {
105	.enable_dma = 0,         /* use dma transfer with this chip*/
106};
107#endif
108
109#if IS_ENABLED(CONFIG_MMC_SPI)
110static struct bfin5xx_spi_chip mmc_spi_chip_info = {
111	.enable_dma = 0,
112};
113#endif
114
115static struct spi_board_info bfin_spi_board_info[] __initdata = {
116#if IS_ENABLED(CONFIG_MTD_M25P80)
117	{
118		/* the modalias must be the same as spi device driver name */
119		.modalias = "m25p80", /* Name of spi_driver for this device */
120		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
121		.bus_num = 0, /* Framework bus number */
122		.chip_select = 2, /* Framework chip select. */
123		.platform_data = &bfin_spi_flash_data,
124		.controller_data = &spi_flash_chip_info,
125		.mode = SPI_MODE_3,
126	},
127#endif
128
129#if IS_ENABLED(CONFIG_MMC_SPI)
130	{
131		.modalias = "mmc_spi",
132		.max_speed_hz = 20000000,     /* max spi clock (SCK) speed in HZ */
133		.bus_num = 0,
134		.chip_select = 5,
135		.controller_data = &mmc_spi_chip_info,
136		.mode = SPI_MODE_3,
137	},
138#endif
139
140#if IS_ENABLED(CONFIG_SPI_SPIDEV)
141	{
142		.modalias = "spidev",
143		.max_speed_hz = 3125000,     /* max spi clock (SCK) speed in HZ */
144		.bus_num = 0,
145		.chip_select = 7,
146	},
147#endif
148};
149
150#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
151/* SPI (0) */
152static struct resource bfin_spi0_resource[] = {
153	[0] = {
154		.start = SPI0_REGBASE,
155		.end   = SPI0_REGBASE + 0xFF,
156		.flags = IORESOURCE_MEM,
157	},
158	[1] = {
159		.start = CH_SPI,
160		.end   = CH_SPI,
161		.flags = IORESOURCE_DMA,
162	},
163	[2] = {
164		.start = IRQ_SPI,
165		.end   = IRQ_SPI,
166		.flags = IORESOURCE_IRQ,
167	}
168};
169
170/* SPI controller data */
171static struct bfin5xx_spi_master bfin_spi0_info = {
172	.num_chipselect = 8,
173	.enable_dma = 1,  /* master has the ability to do dma transfer */
174	.pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0},
175};
176
177static struct platform_device bfin_spi0_device = {
178	.name = "bfin-spi",
179	.id = 0, /* Bus number */
180	.num_resources = ARRAY_SIZE(bfin_spi0_resource),
181	.resource = bfin_spi0_resource,
182	.dev = {
183		.platform_data = &bfin_spi0_info, /* Passed to driver */
184	},
185};
186#endif  /* spi master and devices */
187
188#if IS_ENABLED(CONFIG_SERIAL_BFIN)
189#ifdef CONFIG_SERIAL_BFIN_UART0
190static struct resource bfin_uart0_resources[] = {
191	{
192		.start = BFIN_UART_THR,
193		.end = BFIN_UART_GCTL+2,
194		.flags = IORESOURCE_MEM,
195	},
196	{
197		.start = IRQ_UART0_TX,
198		.end = IRQ_UART0_TX,
199		.flags = IORESOURCE_IRQ,
200	},
201	{
202		.start = IRQ_UART0_RX,
203		.end = IRQ_UART0_RX,
204		.flags = IORESOURCE_IRQ,
205	},
206	{
207		.start = IRQ_UART0_ERROR,
208		.end = IRQ_UART0_ERROR,
209		.flags = IORESOURCE_IRQ,
210	},
211	{
212		.start = CH_UART0_TX,
213		.end = CH_UART0_TX,
214		.flags = IORESOURCE_DMA,
215	},
216	{
217		.start = CH_UART0_RX,
218		.end = CH_UART0_RX,
219		.flags = IORESOURCE_DMA,
220	},
221};
222
223static unsigned short bfin_uart0_peripherals[] = {
224	P_UART0_TX, P_UART0_RX, 0
225};
226
227static struct platform_device bfin_uart0_device = {
228	.name = "bfin-uart",
229	.id = 0,
230	.num_resources = ARRAY_SIZE(bfin_uart0_resources),
231	.resource = bfin_uart0_resources,
232	.dev = {
233		.platform_data = &bfin_uart0_peripherals, /* Passed to driver */
234	},
235};
236#endif
237#endif
238
239#if IS_ENABLED(CONFIG_BFIN_SIR)
240#ifdef CONFIG_BFIN_SIR0
241static struct resource bfin_sir0_resources[] = {
242	{
243		.start = 0xFFC00400,
244		.end = 0xFFC004FF,
245		.flags = IORESOURCE_MEM,
246	},
247	{
248		.start = IRQ_UART0_RX,
249		.end = IRQ_UART0_RX+1,
250		.flags = IORESOURCE_IRQ,
251	},
252	{
253		.start = CH_UART0_RX,
254		.end = CH_UART0_RX+1,
255		.flags = IORESOURCE_DMA,
256	},
257};
258
259static struct platform_device bfin_sir0_device = {
260	.name = "bfin_sir",
261	.id = 0,
262	.num_resources = ARRAY_SIZE(bfin_sir0_resources),
263	.resource = bfin_sir0_resources,
264};
265#endif
266#endif
267
268#if IS_ENABLED(CONFIG_SERIAL_BFIN_SPORT)
269#ifdef CONFIG_SERIAL_BFIN_SPORT0_UART
270static struct resource bfin_sport0_uart_resources[] = {
271	{
272		.start = SPORT0_TCR1,
273		.end = SPORT0_MRCS3+4,
274		.flags = IORESOURCE_MEM,
275	},
276	{
277		.start = IRQ_SPORT0_RX,
278		.end = IRQ_SPORT0_RX+1,
279		.flags = IORESOURCE_IRQ,
280	},
281	{
282		.start = IRQ_SPORT0_ERROR,
283		.end = IRQ_SPORT0_ERROR,
284		.flags = IORESOURCE_IRQ,
285	},
286};
287
288static unsigned short bfin_sport0_peripherals[] = {
289	P_SPORT0_TFS, P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS,
290	P_SPORT0_DRPRI, P_SPORT0_RSCLK, 0
291};
292
293static struct platform_device bfin_sport0_uart_device = {
294	.name = "bfin-sport-uart",
295	.id = 0,
296	.num_resources = ARRAY_SIZE(bfin_sport0_uart_resources),
297	.resource = bfin_sport0_uart_resources,
298	.dev = {
299		.platform_data = &bfin_sport0_peripherals, /* Passed to driver */
300	},
301};
302#endif
303#ifdef CONFIG_SERIAL_BFIN_SPORT1_UART
304static struct resource bfin_sport1_uart_resources[] = {
305	{
306		.start = SPORT1_TCR1,
307		.end = SPORT1_MRCS3+4,
308		.flags = IORESOURCE_MEM,
309	},
310	{
311		.start = IRQ_SPORT1_RX,
312		.end = IRQ_SPORT1_RX+1,
313		.flags = IORESOURCE_IRQ,
314	},
315	{
316		.start = IRQ_SPORT1_ERROR,
317		.end = IRQ_SPORT1_ERROR,
318		.flags = IORESOURCE_IRQ,
319	},
320};
321
322static unsigned short bfin_sport1_peripherals[] = {
323	P_SPORT1_TFS, P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS,
324	P_SPORT1_DRPRI, P_SPORT1_RSCLK, 0
325};
326
327static struct platform_device bfin_sport1_uart_device = {
328	.name = "bfin-sport-uart",
329	.id = 1,
330	.num_resources = ARRAY_SIZE(bfin_sport1_uart_resources),
331	.resource = bfin_sport1_uart_resources,
332	.dev = {
333		.platform_data = &bfin_sport1_peripherals, /* Passed to driver */
334	},
335};
336#endif
337#endif
338
339#if IS_ENABLED(CONFIG_KEYBOARD_GPIO)
340#include <linux/input.h>
341#include <linux/gpio_keys.h>
342
343static struct gpio_keys_button bfin_gpio_keys_table[] = {
344	{BTN_0, GPIO_PF4, 0, "gpio-keys: BTN0"},
345	{BTN_1, GPIO_PF5, 0, "gpio-keys: BTN1"},
346	{BTN_2, GPIO_PF6, 0, "gpio-keys: BTN2"},
347}; /* Mapped to the first three PF Test Points */
348
349static struct gpio_keys_platform_data bfin_gpio_keys_data = {
350	.buttons        = bfin_gpio_keys_table,
351	.nbuttons       = ARRAY_SIZE(bfin_gpio_keys_table),
352};
353
354static struct platform_device bfin_device_gpiokeys = {
355	.name      = "gpio-keys",
356	.dev = {
357		.platform_data = &bfin_gpio_keys_data,
358	},
359};
360#endif
361
362#if IS_ENABLED(CONFIG_I2C_GPIO)
363#include <linux/i2c-gpio.h>
364
365static struct i2c_gpio_platform_data i2c_gpio_data = {
366	.sda_pin		= GPIO_PF8,
367	.scl_pin		= GPIO_PF9,
368	.sda_is_open_drain	= 0,
369	.scl_is_open_drain	= 0,
370	.udelay			= 40,
371}; /* This hasn't actually been used these pins
372    * are (currently) free pins on the expansion connector */
373
374static struct platform_device i2c_gpio_device = {
375	.name		= "i2c-gpio",
376	.id		= 0,
377	.dev		= {
378		.platform_data	= &i2c_gpio_data,
379	},
380};
381#endif
382
383static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
384};
385
386static const unsigned int cclk_vlev_datasheet[] =
387{
388	VRPAIR(VLEV_085, 250000000),
389	VRPAIR(VLEV_090, 376000000),
390	VRPAIR(VLEV_095, 426000000),
391	VRPAIR(VLEV_100, 426000000),
392	VRPAIR(VLEV_105, 476000000),
393	VRPAIR(VLEV_110, 476000000),
394	VRPAIR(VLEV_115, 476000000),
395	VRPAIR(VLEV_120, 600000000),
396	VRPAIR(VLEV_125, 600000000),
397	VRPAIR(VLEV_130, 600000000),
398};
399
400static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = {
401	.tuple_tab = cclk_vlev_datasheet,
402	.tabsize = ARRAY_SIZE(cclk_vlev_datasheet),
403	.vr_settling_time = 25 /* us */,
404};
405
406static struct platform_device bfin_dpmc = {
407	.name = "bfin dpmc",
408	.dev = {
409		.platform_data = &bfin_dmpc_vreg_data,
410	},
411};
412
413static struct platform_device *stamp_devices[] __initdata = {
414
415	&bfin_dpmc,
416
417#if IS_ENABLED(CONFIG_RTC_DRV_BFIN)
418	&rtc_device,
419#endif
420
421#if IS_ENABLED(CONFIG_SMC91X)
422	&smc91x_device,
423#endif
424
425
426#if IS_ENABLED(CONFIG_SPI_BFIN5XX)
427	&bfin_spi0_device,
428#endif
429
430#if IS_ENABLED(CONFIG_SERIAL_BFIN)
431#ifdef CONFIG_SERIAL_BFIN_UART0
432	&bfin_uart0_device,
433#endif
434#endif
435
436#if IS_ENABLED(CONFIG_BFIN_SIR)
437#ifdef CONFIG_BFIN_SIR0
438	&bfin_sir0_device,
439#endif
440#endif
441
442#if IS_ENABLED(CONFIG_SERIAL_BFIN_SPORT)
443#ifdef CONFIG_SERIAL_BFIN_SPORT0_UART
444	&bfin_sport0_uart_device,
445#endif
446#ifdef CONFIG_SERIAL_BFIN_SPORT1_UART
447	&bfin_sport1_uart_device,
448#endif
449#endif
450
451#if IS_ENABLED(CONFIG_KEYBOARD_GPIO)
452	&bfin_device_gpiokeys,
453#endif
454
455#if IS_ENABLED(CONFIG_I2C_GPIO)
456	&i2c_gpio_device,
457#endif
458};
459
460static int __init blackstamp_init(void)
461{
462	int ret;
463
464	printk(KERN_INFO "%s(): registering device resources\n", __func__);
465
466	i2c_register_board_info(0, bfin_i2c_board_info,
467				ARRAY_SIZE(bfin_i2c_board_info));
468
469	ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices));
470	if (ret < 0)
471		return ret;
472
473#if IS_ENABLED(CONFIG_SMC91X)
474	/*
475	 * setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC.
476	 * the bfin-async-map driver takes care of flipping between
477	 * flash and ethernet when necessary.
478	 */
479	ret = gpio_request(GPIO_PF0, "enet_cpld");
480	if (!ret) {
481		gpio_direction_output(GPIO_PF0, 1);
482		gpio_free(GPIO_PF0);
483	}
484#endif
485
486	spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info));
487	return 0;
488}
489
490arch_initcall(blackstamp_init);
491
492static struct platform_device *stamp_early_devices[] __initdata = {
493#if defined(CONFIG_SERIAL_BFIN_CONSOLE) || defined(CONFIG_EARLY_PRINTK)
494#ifdef CONFIG_SERIAL_BFIN_UART0
495	&bfin_uart0_device,
496#endif
497#endif
498
499#if defined(CONFIG_SERIAL_BFIN_SPORT_CONSOLE)
500#ifdef CONFIG_SERIAL_BFIN_SPORT0_UART
501	&bfin_sport0_uart_device,
502#endif
503#ifdef CONFIG_SERIAL_BFIN_SPORT1_UART
504	&bfin_sport1_uart_device,
505#endif
506#endif
507};
508
509void __init native_machine_early_platform_add_devices(void)
510{
511	printk(KERN_INFO "register early platform devices\n");
512	early_platform_add_devices(stamp_early_devices,
513		ARRAY_SIZE(stamp_early_devices));
514}
515