• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * linux/arch/arm/mach-omap2/board-ldp.c
3  *
4  * Copyright (C) 2008 Texas Instruments Inc.
5  * Nishant Kamat <nskamat@ti.com>
6  *
7  * Modified from mach-omap2/board-3430sdp.c
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/input.h>
19 #include <linux/workqueue.h>
20 #include <linux/err.h>
21 #include <linux/clk.h>
22 #include <linux/spi/spi.h>
23 #include <linux/spi/ads7846.h>
24 #include <linux/i2c/twl4030.h>
25 
26 #include <mach/hardware.h>
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 
31 #include <mach/board-ldp.h>
32 #include <mach/mcspi.h>
33 #include <mach/gpio.h>
34 #include <mach/board.h>
35 #include <mach/common.h>
36 #include <mach/gpmc.h>
37 
38 #include <asm/io.h>
39 #include <asm/delay.h>
40 #include <mach/control.h>
41 
42 #include "mmc-twl4030.h"
43 
44 #define SDP3430_SMC91X_CS	3
45 
46 static struct resource ldp_smc911x_resources[] = {
47 	[0] = {
48 		.start	= OMAP34XX_ETHR_START,
49 		.end	= OMAP34XX_ETHR_START + SZ_4K,
50 		.flags	= IORESOURCE_MEM,
51 	},
52 	[1] = {
53 		.start	= 0,
54 		.end	= 0,
55 		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
56 	},
57 };
58 
59 static struct platform_device ldp_smc911x_device = {
60 	.name		= "smc911x",
61 	.id		= -1,
62 	.num_resources	= ARRAY_SIZE(ldp_smc911x_resources),
63 	.resource	= ldp_smc911x_resources,
64 };
65 
66 static struct platform_device *ldp_devices[] __initdata = {
67 	&ldp_smc911x_device,
68 };
69 
ldp_init_smc911x(void)70 static inline void __init ldp_init_smc911x(void)
71 {
72 	int eth_cs;
73 	unsigned long cs_mem_base;
74 	int eth_gpio = 0;
75 
76 	eth_cs = LDP_SMC911X_CS;
77 
78 	if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
79 		printk(KERN_ERR "Failed to request GPMC mem for smc911x\n");
80 		return;
81 	}
82 
83 	ldp_smc911x_resources[0].start = cs_mem_base + 0x0;
84 	ldp_smc911x_resources[0].end   = cs_mem_base + 0xff;
85 	udelay(100);
86 
87 	eth_gpio = LDP_SMC911X_GPIO;
88 
89 	ldp_smc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
90 
91 	if (gpio_request(eth_gpio, "smc911x irq") < 0) {
92 		printk(KERN_ERR "Failed to request GPIO%d for smc911x IRQ\n",
93 				eth_gpio);
94 		return;
95 	}
96 	gpio_direction_input(eth_gpio);
97 }
98 
omap_ldp_init_irq(void)99 static void __init omap_ldp_init_irq(void)
100 {
101 	omap2_init_common_hw();
102 	omap_init_irq();
103 	omap_gpio_init();
104 	ldp_init_smc911x();
105 }
106 
107 static struct omap_uart_config ldp_uart_config __initdata = {
108 	.enabled_uarts	= ((1 << 0) | (1 << 1) | (1 << 2)),
109 };
110 
111 static struct omap_board_config_kernel ldp_config[] __initdata = {
112 	{ OMAP_TAG_UART,	&ldp_uart_config },
113 };
114 
115 static struct twl4030_gpio_platform_data ldp_gpio_data = {
116 	.gpio_base	= OMAP_MAX_GPIO_LINES,
117 	.irq_base	= TWL4030_GPIO_IRQ_BASE,
118 	.irq_end	= TWL4030_GPIO_IRQ_END,
119 };
120 
121 static struct twl4030_platform_data ldp_twldata = {
122 	.irq_base	= TWL4030_IRQ_BASE,
123 	.irq_end	= TWL4030_IRQ_END,
124 
125 	/* platform_data for children goes here */
126 	.gpio		= &ldp_gpio_data,
127 };
128 
129 static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
130 	{
131 		I2C_BOARD_INFO("twl4030", 0x48),
132 		.flags = I2C_CLIENT_WAKE,
133 		.irq = INT_34XX_SYS_NIRQ,
134 		.platform_data = &ldp_twldata,
135 	},
136 };
137 
omap_i2c_init(void)138 static int __init omap_i2c_init(void)
139 {
140 	omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
141 			ARRAY_SIZE(ldp_i2c_boardinfo));
142 	omap_register_i2c_bus(2, 400, NULL, 0);
143 	omap_register_i2c_bus(3, 400, NULL, 0);
144 	return 0;
145 }
146 
147 static struct twl4030_hsmmc_info mmc[] __initdata = {
148 	{
149 		.mmc		= 1,
150 		.wires		= 4,
151 		.gpio_cd	= -EINVAL,
152 		.gpio_wp	= -EINVAL,
153 	},
154 	{}	/* Terminator */
155 };
156 
omap_ldp_init(void)157 static void __init omap_ldp_init(void)
158 {
159 	omap_i2c_init();
160 	platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
161 	omap_board_config = ldp_config;
162 	omap_board_config_size = ARRAY_SIZE(ldp_config);
163 	omap_serial_init();
164 	twl4030_mmc_init(mmc);
165 }
166 
omap_ldp_map_io(void)167 static void __init omap_ldp_map_io(void)
168 {
169 	omap2_set_globals_343x();
170 	omap2_map_common_io();
171 }
172 
173 MACHINE_START(OMAP_LDP, "OMAP LDP board")
174 	.phys_io	= 0x48000000,
175 	.io_pg_offst	= ((0xd8000000) >> 18) & 0xfffc,
176 	.boot_params	= 0x80000100,
177 	.map_io		= omap_ldp_map_io,
178 	.init_irq	= omap_ldp_init_irq,
179 	.init_machine	= omap_ldp_init,
180 	.timer		= &omap_timer,
181 MACHINE_END
182