Linux-2.6.12-rc2
[safe/jmp/linux-2.6] / arch / arm / mach-omap / board-osk.c
1 /*
2  * linux/arch/arm/mach-omap/board-osk.c
3  *
4  * Board specific init for OMAP5912 OSK
5  *
6  * Written by Dirk Behme <dirk.behme@de.bosch.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by the
10  * Free Software Foundation; either version 2 of the License, or (at your
11  * option) any later version.
12  *
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
14  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
16  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
19  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  * You should have received a copy of the  GNU General Public License along
25  * with this program; if not, write  to the Free Software Foundation, Inc.,
26  * 675 Mass Ave, Cambridge, MA 02139, USA.
27  */
28
29 #include <linux/kernel.h>
30 #include <linux/init.h>
31 #include <linux/device.h>
32
33 #include <asm/hardware.h>
34 #include <asm/mach-types.h>
35 #include <asm/mach/arch.h>
36 #include <asm/mach/map.h>
37
38 #include <asm/arch/gpio.h>
39 #include <asm/arch/usb.h>
40 #include <asm/arch/mux.h>
41 #include <asm/arch/tc.h>
42
43 #include "common.h"
44
45 static struct map_desc osk5912_io_desc[] __initdata = {
46 { OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE,
47         MT_DEVICE },
48 };
49
50 static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0};
51
52 static struct resource osk5912_smc91x_resources[] = {
53         [0] = {
54                 .start  = OMAP_OSK_ETHR_START,          /* Physical */
55                 .end    = OMAP_OSK_ETHR_START + 0xf,
56                 .flags  = IORESOURCE_MEM,
57         },
58         [1] = {
59                 .start  = OMAP_GPIO_IRQ(0),
60                 .end    = OMAP_GPIO_IRQ(0),
61                 .flags  = IORESOURCE_IRQ,
62         },
63 };
64
65 static struct platform_device osk5912_smc91x_device = {
66         .name           = "smc91x",
67         .id             = -1,
68         .num_resources  = ARRAY_SIZE(osk5912_smc91x_resources),
69         .resource       = osk5912_smc91x_resources,
70 };
71
72 static struct resource osk5912_cf_resources[] = {
73         [0] = {
74                 .start  = OMAP_GPIO_IRQ(62),
75                 .end    = OMAP_GPIO_IRQ(62),
76                 .flags  = IORESOURCE_IRQ,
77         },
78 };
79
80 static struct platform_device osk5912_cf_device = {
81         .name           = "omap_cf",
82         .id             = -1,
83         .dev = {
84                 .platform_data  = (void *) 2 /* CS2 */,
85         },
86         .num_resources  = ARRAY_SIZE(osk5912_cf_resources),
87         .resource       = osk5912_cf_resources,
88 };
89
90 static struct platform_device *osk5912_devices[] __initdata = {
91         &osk5912_smc91x_device,
92         &osk5912_cf_device,
93 };
94
95 static void __init osk_init_smc91x(void)
96 {
97         if ((omap_request_gpio(0)) < 0) {
98                 printk("Error requesting gpio 0 for smc91x irq\n");
99                 return;
100         }
101         omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE);
102
103         /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
104         EMIFS_CCS(1) |= 0x2;
105 }
106
107 static void __init osk_init_cf(void)
108 {
109         omap_cfg_reg(M7_1610_GPIO62);
110         if ((omap_request_gpio(62)) < 0) {
111                 printk("Error requesting gpio 62 for CF irq\n");
112                 return;
113         }
114         /* it's really active-low */
115         omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE);
116 }
117
118 void osk_init_irq(void)
119 {
120         omap_init_irq();
121         omap_gpio_init();
122         osk_init_smc91x();
123         osk_init_cf();
124 }
125
126 static struct omap_usb_config osk_usb_config __initdata = {
127         /* has usb host connector (A) ... for development it can also
128          * be used, with a NONSTANDARD gender-bending cable/dongle, as
129          * a peripheral.
130          */
131 #ifdef  CONFIG_USB_GADGET_OMAP
132         .register_dev   = 1,
133         .hmc_mode       = 0,
134 #else
135         .register_host  = 1,
136         .hmc_mode       = 16,
137         .rwc            = 1,
138 #endif
139         .pins[0]        = 2,
140 };
141
142 static struct omap_board_config_kernel osk_config[] = {
143         { OMAP_TAG_USB,           &osk_usb_config },
144 };
145
146 static void __init osk_init(void)
147 {
148         platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices));
149         omap_board_config = osk_config;
150         omap_board_config_size = ARRAY_SIZE(osk_config);
151         USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
152 }
153
154 static void __init osk_map_io(void)
155 {
156         omap_map_io();
157         iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc));
158         omap_serial_init(osk_serial_ports);
159 }
160
161 MACHINE_START(OMAP_OSK, "TI-OSK")
162         MAINTAINER("Dirk Behme <dirk.behme@de.bosch.com>")
163         BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
164         BOOT_PARAMS(0x10000100)
165         MAPIO(osk_map_io)
166         INITIRQ(osk_init_irq)
167         INIT_MACHINE(osk_init)
168         .timer          = &omap_timer,
169 MACHINE_END