• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/arm/mach-omap2/
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/input/matrix_keypad.h>
20#include <linux/gpio_keys.h>
21#include <linux/workqueue.h>
22#include <linux/err.h>
23#include <linux/clk.h>
24#include <linux/spi/spi.h>
25#include <linux/spi/ads7846.h>
26#include <linux/regulator/machine.h>
27#include <linux/i2c/twl.h>
28#include <linux/io.h>
29#include <linux/smsc911x.h>
30
31#include <mach/hardware.h>
32#include <asm/mach-types.h>
33#include <asm/mach/arch.h>
34#include <asm/mach/map.h>
35
36#include <plat/mcspi.h>
37#include <mach/gpio.h>
38#include <plat/board.h>
39#include <plat/common.h>
40#include <plat/gpmc.h>
41#include <mach/board-zoom.h>
42
43#include <asm/delay.h>
44#include <plat/control.h>
45#include <plat/usb.h>
46
47#include "mux.h"
48#include "hsmmc.h"
49
50#define LDP_SMSC911X_CS		1
51#define LDP_SMSC911X_GPIO	152
52#define DEBUG_BASE		0x08000000
53#define LDP_ETHR_START		DEBUG_BASE
54
55static struct resource ldp_smsc911x_resources[] = {
56	[0] = {
57		.start	= LDP_ETHR_START,
58		.end	= LDP_ETHR_START + SZ_4K,
59		.flags	= IORESOURCE_MEM,
60	},
61	[1] = {
62		.start	= 0,
63		.end	= 0,
64		.flags	= IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
65	},
66};
67
68static struct smsc911x_platform_config ldp_smsc911x_config = {
69	.irq_polarity	= SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
70	.irq_type	= SMSC911X_IRQ_TYPE_OPEN_DRAIN,
71	.flags		= SMSC911X_USE_32BIT,
72	.phy_interface	= PHY_INTERFACE_MODE_MII,
73};
74
75static struct platform_device ldp_smsc911x_device = {
76	.name		= "smsc911x",
77	.id		= -1,
78	.num_resources	= ARRAY_SIZE(ldp_smsc911x_resources),
79	.resource	= ldp_smsc911x_resources,
80	.dev		= {
81		.platform_data = &ldp_smsc911x_config,
82	},
83};
84
85static int board_keymap[] = {
86	KEY(0, 0, KEY_1),
87	KEY(1, 0, KEY_2),
88	KEY(2, 0, KEY_3),
89	KEY(0, 1, KEY_4),
90	KEY(1, 1, KEY_5),
91	KEY(2, 1, KEY_6),
92	KEY(3, 1, KEY_F5),
93	KEY(0, 2, KEY_7),
94	KEY(1, 2, KEY_8),
95	KEY(2, 2, KEY_9),
96	KEY(3, 2, KEY_F6),
97	KEY(0, 3, KEY_F7),
98	KEY(1, 3, KEY_0),
99	KEY(2, 3, KEY_F8),
100	PERSISTENT_KEY(4, 5),
101	KEY(4, 4, KEY_VOLUMEUP),
102	KEY(5, 5, KEY_VOLUMEDOWN),
103	0
104};
105
106static struct matrix_keymap_data board_map_data = {
107	.keymap			= board_keymap,
108	.keymap_size		= ARRAY_SIZE(board_keymap),
109};
110
111static struct twl4030_keypad_data ldp_kp_twl4030_data = {
112	.keymap_data	= &board_map_data,
113	.rows		= 6,
114	.cols		= 6,
115	.rep		= 1,
116};
117
118static struct gpio_keys_button ldp_gpio_keys_buttons[] = {
119	[0] = {
120		.code			= KEY_ENTER,
121		.gpio			= 101,
122		.desc			= "enter sw",
123		.active_low		= 1,
124		.debounce_interval	= 30,
125	},
126	[1] = {
127		.code			= KEY_F1,
128		.gpio			= 102,
129		.desc			= "func 1",
130		.active_low		= 1,
131		.debounce_interval	= 30,
132	},
133	[2] = {
134		.code			= KEY_F2,
135		.gpio			= 103,
136		.desc			= "func 2",
137		.active_low		= 1,
138		.debounce_interval	= 30,
139	},
140	[3] = {
141		.code			= KEY_F3,
142		.gpio			= 104,
143		.desc			= "func 3",
144		.active_low		= 1,
145		.debounce_interval 	= 30,
146	},
147	[4] = {
148		.code			= KEY_F4,
149		.gpio			= 105,
150		.desc			= "func 4",
151		.active_low		= 1,
152		.debounce_interval	= 30,
153	},
154	[5] = {
155		.code			= KEY_LEFT,
156		.gpio			= 106,
157		.desc			= "left sw",
158		.active_low		= 1,
159		.debounce_interval	= 30,
160	},
161	[6] = {
162		.code			= KEY_RIGHT,
163		.gpio			= 107,
164		.desc			= "right sw",
165		.active_low		= 1,
166		.debounce_interval	= 30,
167	},
168	[7] = {
169		.code			= KEY_UP,
170		.gpio			= 108,
171		.desc			= "up sw",
172		.active_low		= 1,
173		.debounce_interval	= 30,
174	},
175	[8] = {
176		.code			= KEY_DOWN,
177		.gpio			= 109,
178		.desc			= "down sw",
179		.active_low		= 1,
180		.debounce_interval	= 30,
181	},
182};
183
184static struct gpio_keys_platform_data ldp_gpio_keys = {
185	.buttons		= ldp_gpio_keys_buttons,
186	.nbuttons		= ARRAY_SIZE(ldp_gpio_keys_buttons),
187	.rep			= 1,
188};
189
190static struct platform_device ldp_gpio_keys_device = {
191	.name		= "gpio-keys",
192	.id		= -1,
193	.dev		= {
194		.platform_data	= &ldp_gpio_keys,
195	},
196};
197
198static int ts_gpio;
199
200/**
201 * @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
202 *
203 * @return - void. If request gpio fails then Flag KERN_ERR.
204 */
205static void ads7846_dev_init(void)
206{
207	if (gpio_request(ts_gpio, "ads7846 irq") < 0) {
208		printk(KERN_ERR "can't get ads746 pen down GPIO\n");
209		return;
210	}
211
212	gpio_direction_input(ts_gpio);
213	gpio_set_debounce(ts_gpio, 310);
214}
215
216static int ads7846_get_pendown_state(void)
217{
218	return !gpio_get_value(ts_gpio);
219}
220
221static struct ads7846_platform_data tsc2046_config __initdata = {
222	.get_pendown_state	= ads7846_get_pendown_state,
223	.keep_vref_on		= 1,
224};
225
226static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
227	.turbo_mode	= 0,
228	.single_channel	= 1,	/* 0: slave, 1: master */
229};
230
231static struct spi_board_info ldp_spi_board_info[] __initdata = {
232	[0] = {
233		/*
234		 * TSC2046 operates at a max freqency of 2MHz, so
235		 * operate slightly below at 1.5MHz
236		 */
237		.modalias		= "ads7846",
238		.bus_num		= 1,
239		.chip_select		= 0,
240		.max_speed_hz		= 1500000,
241		.controller_data	= &tsc2046_mcspi_config,
242		.irq			= 0,
243		.platform_data		= &tsc2046_config,
244	},
245};
246
247static inline void __init ldp_init_smsc911x(void)
248{
249	int eth_cs;
250	unsigned long cs_mem_base;
251	int eth_gpio = 0;
252
253	eth_cs = LDP_SMSC911X_CS;
254
255	if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
256		printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n");
257		return;
258	}
259
260	ldp_smsc911x_resources[0].start = cs_mem_base + 0x0;
261	ldp_smsc911x_resources[0].end   = cs_mem_base + 0xff;
262	udelay(100);
263
264	eth_gpio = LDP_SMSC911X_GPIO;
265
266	ldp_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
267
268	if (gpio_request(eth_gpio, "smsc911x irq") < 0) {
269		printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
270				eth_gpio);
271		return;
272	}
273	gpio_direction_input(eth_gpio);
274}
275
276static struct platform_device ldp_lcd_device = {
277	.name		= "ldp_lcd",
278	.id		= -1,
279};
280
281static struct omap_lcd_config ldp_lcd_config __initdata = {
282	.ctrl_name	= "internal",
283};
284
285static struct omap_board_config_kernel ldp_config[] __initdata = {
286	{ OMAP_TAG_LCD,		&ldp_lcd_config },
287};
288
289static void __init omap_ldp_init_irq(void)
290{
291	omap_board_config = ldp_config;
292	omap_board_config_size = ARRAY_SIZE(ldp_config);
293	omap2_init_common_hw(NULL, NULL);
294	omap_init_irq();
295	omap_gpio_init();
296	ldp_init_smsc911x();
297}
298
299static struct twl4030_usb_data ldp_usb_data = {
300	.usb_mode	= T2_USB_MODE_ULPI,
301};
302
303static struct twl4030_gpio_platform_data ldp_gpio_data = {
304	.gpio_base	= OMAP_MAX_GPIO_LINES,
305	.irq_base	= TWL4030_GPIO_IRQ_BASE,
306	.irq_end	= TWL4030_GPIO_IRQ_END,
307};
308
309static struct twl4030_madc_platform_data ldp_madc_data = {
310	.irq_line	= 1,
311};
312
313static struct regulator_consumer_supply ldp_vmmc1_supply = {
314	.supply			= "vmmc",
315};
316
317/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
318static struct regulator_init_data ldp_vmmc1 = {
319	.constraints = {
320		.min_uV			= 1850000,
321		.max_uV			= 3150000,
322		.valid_modes_mask	= REGULATOR_MODE_NORMAL
323					| REGULATOR_MODE_STANDBY,
324		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
325					| REGULATOR_CHANGE_MODE
326					| REGULATOR_CHANGE_STATUS,
327	},
328	.num_consumer_supplies	= 1,
329	.consumer_supplies	= &ldp_vmmc1_supply,
330};
331
332static struct twl4030_platform_data ldp_twldata = {
333	.irq_base	= TWL4030_IRQ_BASE,
334	.irq_end	= TWL4030_IRQ_END,
335
336	/* platform_data for children goes here */
337	.madc		= &ldp_madc_data,
338	.usb		= &ldp_usb_data,
339	.vmmc1		= &ldp_vmmc1,
340	.gpio		= &ldp_gpio_data,
341	.keypad		= &ldp_kp_twl4030_data,
342};
343
344static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
345	{
346		I2C_BOARD_INFO("twl4030", 0x48),
347		.flags = I2C_CLIENT_WAKE,
348		.irq = INT_34XX_SYS_NIRQ,
349		.platform_data = &ldp_twldata,
350	},
351};
352
353static int __init omap_i2c_init(void)
354{
355	omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
356			ARRAY_SIZE(ldp_i2c_boardinfo));
357	omap_register_i2c_bus(2, 400, NULL, 0);
358	omap_register_i2c_bus(3, 400, NULL, 0);
359	return 0;
360}
361
362static struct omap2_hsmmc_info mmc[] __initdata = {
363	{
364		.mmc		= 1,
365		.wires		= 4,
366		.gpio_cd	= -EINVAL,
367		.gpio_wp	= -EINVAL,
368	},
369	{}	/* Terminator */
370};
371
372static struct platform_device *ldp_devices[] __initdata = {
373	&ldp_smsc911x_device,
374	&ldp_lcd_device,
375	&ldp_gpio_keys_device,
376};
377
378#ifdef CONFIG_OMAP_MUX
379static struct omap_board_mux board_mux[] __initdata = {
380	{ .reg_offset = OMAP_MUX_TERMINATOR },
381};
382#else
383#define board_mux	NULL
384#endif
385
386static struct omap_musb_board_data musb_board_data = {
387	.interface_type		= MUSB_INTERFACE_ULPI,
388	.mode			= MUSB_OTG,
389	.power			= 100,
390};
391
392static struct mtd_partition ldp_nand_partitions[] = {
393	/* All the partition sizes are listed in terms of NAND block size */
394	{
395		.name		= "X-Loader-NAND",
396		.offset		= 0,
397		.size		= 4 * (64 * 2048),	/* 512KB, 0x80000 */
398		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
399	},
400	{
401		.name		= "U-Boot-NAND",
402		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x80000 */
403		.size		= 10 * (64 * 2048),	/* 1.25MB, 0x140000 */
404		.mask_flags	= MTD_WRITEABLE,	/* force read-only */
405	},
406	{
407		.name		= "Boot Env-NAND",
408		.offset		= MTDPART_OFS_APPEND,   /* Offset = 0x1c0000 */
409		.size		= 2 * (64 * 2048),	/* 256KB, 0x40000 */
410	},
411	{
412		.name		= "Kernel-NAND",
413		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x0200000*/
414		.size		= 240 * (64 * 2048),	/* 30M, 0x1E00000 */
415	},
416	{
417		.name		= "File System - NAND",
418		.offset		= MTDPART_OFS_APPEND,	/* Offset = 0x2000000 */
419		.size		= MTDPART_SIZ_FULL,	/* 96MB, 0x6000000 */
420	},
421
422};
423
424static void __init omap_ldp_init(void)
425{
426	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
427	omap_i2c_init();
428	platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
429	ts_gpio = 54;
430	ldp_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
431	spi_register_board_info(ldp_spi_board_info,
432				ARRAY_SIZE(ldp_spi_board_info));
433	ads7846_dev_init();
434	omap_serial_init();
435	usb_musb_init(&musb_board_data);
436	board_nand_init(ldp_nand_partitions,
437		ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS);
438
439	omap2_hsmmc_init(mmc);
440	/* link regulators to MMC adapters */
441	ldp_vmmc1_supply.dev = mmc[0].dev;
442}
443
444MACHINE_START(OMAP_LDP, "OMAP LDP board")
445	.phys_io	= 0x48000000,
446	.io_pg_offst	= ((0xfa000000) >> 18) & 0xfffc,
447	.boot_params	= 0x80000100,
448	.map_io		= omap3_map_io,
449	.reserve	= omap_reserve,
450	.init_irq	= omap_ldp_init_irq,
451	.init_machine	= omap_ldp_init,
452	.timer		= &omap_timer,
453MACHINE_END
454