Merge branch 'stable/vga.support' into stable/drivers
[pandora-kernel.git] / arch / arm / mach-omap2 / board-zoom-debugboard.c
1 /*
2  * Copyright (C) 2009 Texas Instruments Inc.
3  * Mikkel Christensen <mlc@ti.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation.
8  */
9
10 #include <linux/kernel.h>
11 #include <linux/init.h>
12 #include <linux/gpio.h>
13 #include <linux/serial_8250.h>
14 #include <linux/smsc911x.h>
15 #include <linux/interrupt.h>
16
17 #include <plat/gpmc.h>
18 #include <plat/gpmc-smsc911x.h>
19
20 #include <mach/board-zoom.h>
21
22 #define ZOOM_SMSC911X_CS        7
23 #define ZOOM_SMSC911X_GPIO      158
24 #define ZOOM_QUADUART_CS        3
25 #define ZOOM_QUADUART_GPIO      102
26 #define QUART_CLK               1843200
27 #define DEBUG_BASE              0x08000000
28 #define ZOOM_ETHR_START DEBUG_BASE
29
30 static struct omap_smsc911x_platform_data zoom_smsc911x_cfg = {
31         .cs             = ZOOM_SMSC911X_CS,
32         .gpio_irq       = ZOOM_SMSC911X_GPIO,
33         .gpio_reset     = -EINVAL,
34         .flags          = SMSC911X_USE_32BIT,
35 };
36
37 static inline void __init zoom_init_smsc911x(void)
38 {
39         gpmc_smsc911x_init(&zoom_smsc911x_cfg);
40 }
41
42 static struct plat_serial8250_port serial_platform_data[] = {
43         {
44                 .mapbase        = ZOOM_UART_BASE,
45                 .irq            = OMAP_GPIO_IRQ(102),
46                 .flags          = UPF_BOOT_AUTOCONF|UPF_IOREMAP|UPF_SHARE_IRQ,
47                 .irqflags       = IRQF_SHARED | IRQF_TRIGGER_RISING,
48                 .iotype         = UPIO_MEM,
49                 .regshift       = 1,
50                 .uartclk        = QUART_CLK,
51         }, {
52                 .flags          = 0
53         }
54 };
55
56 static struct platform_device zoom_debugboard_serial_device = {
57         .name                   = "serial8250",
58         .id                     = PLAT8250_DEV_PLATFORM,
59         .dev                    = {
60                 .platform_data  = serial_platform_data,
61         },
62 };
63
64 static inline void __init zoom_init_quaduart(void)
65 {
66         int quart_cs;
67         unsigned long cs_mem_base;
68         int quart_gpio = 0;
69
70         quart_cs = ZOOM_QUADUART_CS;
71
72         if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) {
73                 printk(KERN_ERR "Failed to request GPMC mem"
74                                 "for Quad UART(TL16CP754C)\n");
75                 return;
76         }
77
78         quart_gpio = ZOOM_QUADUART_GPIO;
79
80         if (gpio_request_one(quart_gpio, GPIOF_IN, "TL16CP754C GPIO") < 0)
81                 printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n",
82                                                                 quart_gpio);
83 }
84
85 static inline int omap_zoom_debugboard_detect(void)
86 {
87         int debug_board_detect = 0;
88         int ret = 1;
89
90         debug_board_detect = ZOOM_SMSC911X_GPIO;
91
92         if (gpio_request_one(debug_board_detect, GPIOF_IN,
93                              "Zoom debug board detect") < 0) {
94                 printk(KERN_ERR "Failed to request GPIO%d for Zoom debug"
95                 "board detect\n", debug_board_detect);
96                 return 0;
97         }
98
99         if (!gpio_get_value(debug_board_detect)) {
100                 ret = 0;
101         }
102         gpio_free(debug_board_detect);
103         return ret;
104 }
105
106 static struct platform_device *zoom_devices[] __initdata = {
107         &zoom_debugboard_serial_device,
108 };
109
110 int __init zoom_debugboard_init(void)
111 {
112         if (!omap_zoom_debugboard_detect())
113                 return 0;
114
115         zoom_init_smsc911x();
116         zoom_init_quaduart();
117         return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices));
118 }