board-ams-delta.c 14.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * linux/arch/arm/mach-omap1/board-ams-delta.c
 *
 * Modified from board-generic.c
 *
 * Board specific inits for the Amstrad E3 (codename Delta) videophone
 *
 * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
14
#include <linux/basic_mmio_gpio.h>
15
#include <linux/gpio.h>
16 17
#include <linux/kernel.h>
#include <linux/init.h>
18
#include <linux/input.h>
19
#include <linux/interrupt.h>
20
#include <linux/leds.h>
21
#include <linux/platform_device.h>
22 23 24
#include <linux/regulator/consumer.h>
#include <linux/regulator/fixed.h>
#include <linux/regulator/machine.h>
25
#include <linux/serial_8250.h>
26
#include <linux/export.h>
27
#include <linux/omapfb.h>
28
#include <linux/io.h>
29

30 31
#include <media/soc_camera.h>

32
#include <asm/serial.h>
33 34 35 36
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>

37 38 39 40
#include <plat/board-ams-delta.h>
#include <plat/keypad.h>
#include <plat/mux.h>
#include <plat/board.h>
41

42
#include <mach/hardware.h>
43
#include <mach/ams-delta-fiq.h>
44
#include <mach/camera.h>
45
#include <mach/usb.h>
46 47 48

#include "iomap.h"
#include "common.h"
49

50
static const unsigned int ams_delta_keymap[] = {
51
	KEY(0, 0, KEY_F1),		/* Advert    */
52

53 54 55 56
	KEY(0, 3, KEY_COFFEE),		/* Games     */
	KEY(0, 2, KEY_QUESTION),	/* Directory */
	KEY(2, 3, KEY_CONNECT),		/* Internet  */
	KEY(1, 2, KEY_SHOP),		/* Services  */
57
	KEY(1, 1, KEY_PHONE),		/* VoiceMail */
58

59
	KEY(0, 1, KEY_DELETE),		/* Delete    */
60
	KEY(2, 2, KEY_PLAY),		/* Play      */
61 62 63 64
	KEY(1, 0, KEY_PAGEUP),		/* Up        */
	KEY(1, 3, KEY_PAGEDOWN),	/* Down      */
	KEY(2, 0, KEY_EMAIL),		/* ReadEmail */
	KEY(2, 1, KEY_STOP),		/* Stop      */
65 66

	/* Numeric keypad portion */
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
	KEY(0, 7, KEY_KP1),
	KEY(0, 6, KEY_KP2),
	KEY(0, 5, KEY_KP3),
	KEY(1, 7, KEY_KP4),
	KEY(1, 6, KEY_KP5),
	KEY(1, 5, KEY_KP6),
	KEY(2, 7, KEY_KP7),
	KEY(2, 6, KEY_KP8),
	KEY(2, 5, KEY_KP9),
	KEY(3, 6, KEY_KP0),
	KEY(3, 7, KEY_KPASTERISK),
	KEY(3, 5, KEY_KPDOT),		/* # key     */
	KEY(7, 2, KEY_NUMLOCK),		/* Mute      */
	KEY(7, 1, KEY_KPMINUS),		/* Recall    */
	KEY(6, 1, KEY_KPPLUS),		/* Redial    */
	KEY(7, 6, KEY_KPSLASH),		/* Handsfree */
	KEY(6, 0, KEY_ENTER),		/* Video     */

	KEY(7, 4, KEY_CAMERA),		/* Photo     */

	KEY(0, 4, KEY_F2),		/* Home      */
	KEY(1, 4, KEY_F3),		/* Office    */
	KEY(2, 4, KEY_F4),		/* Mobile    */
90
	KEY(7, 7, KEY_F5),		/* SMS       */
91
	KEY(7, 5, KEY_F6),		/* Email     */
92 93

	/* QWERTY portion of keypad */
94
	KEY(3, 4, KEY_Q),
95
	KEY(3, 3, KEY_W),
96 97 98 99 100 101
	KEY(3, 2, KEY_E),
	KEY(3, 1, KEY_R),
	KEY(3, 0, KEY_T),
	KEY(4, 7, KEY_Y),
	KEY(4, 6, KEY_U),
	KEY(4, 5, KEY_I),
102
	KEY(4, 4, KEY_O),
103
	KEY(4, 3, KEY_P),
104

105 106 107 108 109
	KEY(4, 2, KEY_A),
	KEY(4, 1, KEY_S),
	KEY(4, 0, KEY_D),
	KEY(5, 7, KEY_F),
	KEY(5, 6, KEY_G),
110
	KEY(5, 5, KEY_H),
111 112 113
	KEY(5, 4, KEY_J),
	KEY(5, 3, KEY_K),
	KEY(5, 2, KEY_L),
114

115 116 117
	KEY(5, 1, KEY_Z),
	KEY(5, 0, KEY_X),
	KEY(6, 7, KEY_C),
118
	KEY(6, 6, KEY_V),
119 120 121 122
	KEY(6, 5, KEY_B),
	KEY(6, 4, KEY_N),
	KEY(6, 3, KEY_M),
	KEY(6, 2, KEY_SPACE),
123

124 125
	KEY(7, 0, KEY_LEFTSHIFT),	/* Vol up    */
	KEY(7, 3, KEY_LEFTCTRL),	/* Vol down  */
126 127
};

128 129 130 131 132 133
#define LATCH1_PHYS	0x01000000
#define LATCH1_VIRT	0xEA000000
#define MODEM_PHYS	0x04000000
#define MODEM_VIRT	0xEB000000
#define LATCH2_PHYS	0x08000000
#define LATCH2_VIRT	0xEC000000
134 135

static struct map_desc ams_delta_io_desc[] __initdata = {
136
	/* AMS_DELTA_LATCH1 */
137
	{
138 139
		.virtual	= LATCH1_VIRT,
		.pfn		= __phys_to_pfn(LATCH1_PHYS),
140 141 142
		.length		= 0x01000000,
		.type		= MT_DEVICE
	},
143
	/* AMS_DELTA_LATCH2 */
144
	{
145 146
		.virtual	= LATCH2_VIRT,
		.pfn		= __phys_to_pfn(LATCH2_PHYS),
147 148 149
		.length		= 0x01000000,
		.type		= MT_DEVICE
	},
150
	/* AMS_DELTA_MODEM */
151
	{
152 153
		.virtual	= MODEM_VIRT,
		.pfn		= __phys_to_pfn(MODEM_PHYS),
154 155 156 157 158
		.length		= 0x01000000,
		.type		= MT_DEVICE
	}
};

159
static struct omap_lcd_config ams_delta_lcd_config __initdata = {
160 161 162
	.ctrl_name	= "internal",
};

163
static struct omap_usb_config ams_delta_usb_config = {
164 165 166 167 168
	.register_host	= 1,
	.hmc_mode	= 16,
	.pins[0]	= 2,
};

169 170 171
#define LATCH1_GPIO_BASE	232
#define LATCH1_NGPIO		8

172
static struct resource latch1_resources[] = {
173 174 175
	[0] = {
		.name	= "dat",
		.start	= LATCH1_PHYS,
176
		.end	= LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8,
177 178 179 180
		.flags	= IORESOURCE_MEM,
	},
};

181
static struct bgpio_pdata latch1_pdata = {
182 183
	.base	= LATCH1_GPIO_BASE,
	.ngpio	= LATCH1_NGPIO,
184 185 186 187 188 189 190 191 192 193 194 195
};

static struct platform_device latch1_gpio_device = {
	.name		= "basic-mmio-gpio",
	.id		= 0,
	.resource	= latch1_resources,
	.num_resources	= ARRAY_SIZE(latch1_resources),
	.dev		= {
		.platform_data	= &latch1_pdata,
	},
};

196
static struct resource latch2_resources[] = {
197 198 199 200 201 202 203 204
	[0] = {
		.name	= "dat",
		.start	= LATCH2_PHYS,
		.end	= LATCH2_PHYS + (AMS_DELTA_LATCH2_NGPIO - 1) / 8,
		.flags	= IORESOURCE_MEM,
	},
};

205
static struct bgpio_pdata latch2_pdata = {
206 207 208 209 210 211 212 213 214 215 216 217 218 219
	.base	= AMS_DELTA_LATCH2_GPIO_BASE,
	.ngpio	= AMS_DELTA_LATCH2_NGPIO,
};

static struct platform_device latch2_gpio_device = {
	.name		= "basic-mmio-gpio",
	.id		= 1,
	.resource	= latch2_resources,
	.num_resources	= ARRAY_SIZE(latch2_resources),
	.dev		= {
		.platform_data	= &latch2_pdata,
	},
};

220
static const struct gpio latch_gpios[] __initconst = {
221
	{
222
		.gpio	= LATCH1_GPIO_BASE + 6,
223 224 225 226
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "dockit1",
	},
	{
227
		.gpio	= LATCH1_GPIO_BASE + 7,
228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "dockit2",
	},
	{
		.gpio	= AMS_DELTA_GPIO_PIN_SCARD_RSTIN,
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "scard_rstin",
	},
	{
		.gpio	= AMS_DELTA_GPIO_PIN_SCARD_CMDVCC,
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "scard_cmdvcc",
	},
	{
		.gpio	= AMS_DELTA_GPIO_PIN_MODEM_CODEC,
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "modem_codec",
	},
	{
		.gpio	= AMS_DELTA_LATCH2_GPIO_BASE + 14,
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "hookflash1",
	},
	{
		.gpio	= AMS_DELTA_LATCH2_GPIO_BASE + 15,
		.flags	= GPIOF_OUT_INIT_LOW,
		.label	= "hookflash2",
	},
};

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
static struct regulator_consumer_supply modem_nreset_consumers[] = {
	REGULATOR_SUPPLY("RESET#", "serial8250.1"),
	REGULATOR_SUPPLY("POR", "cx20442-codec"),
};

static struct regulator_init_data modem_nreset_data = {
	.constraints		= {
		.valid_ops_mask		= REGULATOR_CHANGE_STATUS,
		.boot_on		= 1,
	},
	.num_consumer_supplies	= ARRAY_SIZE(modem_nreset_consumers),
	.consumer_supplies	= modem_nreset_consumers,
};

static struct fixed_voltage_config modem_nreset_config = {
	.supply_name		= "modem_nreset",
	.microvolts		= 3300000,
	.gpio			= AMS_DELTA_GPIO_PIN_MODEM_NRESET,
	.startup_delay		= 25000,
	.enable_high		= 1,
	.enabled_at_boot	= 1,
	.init_data		= &modem_nreset_data,
};

static struct platform_device modem_nreset_device = {
	.name	= "reg-fixed-voltage",
	.id	= -1,
	.dev	= {
		.platform_data	= &modem_nreset_config,
	},
};

struct modem_private_data {
	struct regulator *regulator;
};

static struct modem_private_data modem_priv;

296 297 298 299 300 301 302 303
void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value)
{
	int bit = 0;
	u16 bitpos = 1 << bit;

	for (; bit < ngpio; bit++, bitpos = bitpos << 1) {
		if (!(mask & bitpos))
			continue;
304 305
		else
			gpio_set_value(base + bit, (value & bitpos) != 0);
306 307 308 309
	}
}
EXPORT_SYMBOL(ams_delta_latch_write);

310 311 312 313 314 315 316 317 318
static struct resource ams_delta_nand_resources[] = {
	[0] = {
		.start	= OMAP1_MPUIO_BASE,
		.end	= OMAP1_MPUIO_BASE +
				OMAP_MPUIO_IO_CNTL + sizeof(u32) - 1,
		.flags	= IORESOURCE_MEM,
	},
};

319 320
static struct platform_device ams_delta_nand_device = {
	.name	= "ams-delta-nand",
321 322 323
	.id	= -1,
	.num_resources	= ARRAY_SIZE(ams_delta_nand_resources),
	.resource	= ams_delta_nand_resources,
324 325
};

326 327 328 329 330 331 332 333
static struct resource ams_delta_kp_resources[] = {
	[0] = {
		.start	= INT_KEYBOARD,
		.end	= INT_KEYBOARD,
		.flags	= IORESOURCE_IRQ,
	},
};

334 335 336 337 338
static const struct matrix_keymap_data ams_delta_keymap_data = {
	.keymap		= ams_delta_keymap,
	.keymap_size	= ARRAY_SIZE(ams_delta_keymap),
};

339
static struct omap_kp_platform_data ams_delta_kp_data = {
340 341
	.rows		= 8,
	.cols		= 8,
342
	.keymap_data	= &ams_delta_keymap_data,
343 344 345
	.delay		= 9,
};

346
static struct platform_device ams_delta_kp_device = {
347 348 349 350 351 352 353 354 355
	.name		= "omap-keypad",
	.id		= -1,
	.dev		= {
		.platform_data = &ams_delta_kp_data,
	},
	.num_resources	= ARRAY_SIZE(ams_delta_kp_resources),
	.resource	= ams_delta_kp_resources,
};

356
static struct platform_device ams_delta_lcd_device = {
357 358 359 360
	.name	= "lcd_ams_delta",
	.id	= -1,
};

361
static const struct gpio_led gpio_leds[] __initconst = {
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
	{
		.name		 = "camera",
		.gpio		 = LATCH1_GPIO_BASE + 0,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
#ifdef CONFIG_LEDS_TRIGGERS
		.default_trigger = "ams_delta_camera",
#endif
	},
	{
		.name		 = "advert",
		.gpio		 = LATCH1_GPIO_BASE + 1,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
	},
	{
		.name		 = "email",
		.gpio		 = LATCH1_GPIO_BASE + 2,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
	},
	{
		.name		 = "handsfree",
		.gpio		 = LATCH1_GPIO_BASE + 3,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
	},
	{
		.name		 = "voicemail",
		.gpio		 = LATCH1_GPIO_BASE + 4,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
	},
	{
		.name		 = "voice",
		.gpio		 = LATCH1_GPIO_BASE + 5,
		.default_state	 = LEDS_GPIO_DEFSTATE_OFF,
	},
};

397
static const struct gpio_led_platform_data leds_pdata __initconst = {
398 399
	.leds		= gpio_leds,
	.num_leds	= ARRAY_SIZE(gpio_leds),
400 401
};

402 403 404 405 406 407
static struct i2c_board_info ams_delta_camera_board_info[] = {
	{
		I2C_BOARD_INFO("ov6650", 0x60),
	},
};

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
#ifdef CONFIG_LEDS_TRIGGERS
DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger);

static int ams_delta_camera_power(struct device *dev, int power)
{
	/*
	 * turn on camera LED
	 */
	if (power)
		led_trigger_event(ams_delta_camera_led_trigger, LED_FULL);
	else
		led_trigger_event(ams_delta_camera_led_trigger, LED_OFF);
	return 0;
}
#else
#define ams_delta_camera_power	NULL
#endif

426
static struct soc_camera_link ams_delta_iclink = {
427 428 429 430
	.bus_id         = 0,	/* OMAP1 SoC camera bus */
	.i2c_adapter_id = 1,
	.board_info     = &ams_delta_camera_board_info[0],
	.module_name    = "ov6650",
431
	.power		= ams_delta_camera_power,
432 433
};

434
static struct platform_device ams_delta_camera_device = {
435 436 437 438 439 440 441 442 443 444 445 446
	.name   = "soc-camera-pdrv",
	.id     = 0,
	.dev    = {
		.platform_data = &ams_delta_iclink,
	},
};

static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
	.camexclk_khz	= 12000,	/* default 12MHz clock, no extra DPLL */
	.lclk_khz_max	= 1334,		/* results in 5fps CIF, 10fps QCIF */
};

447
static struct platform_device *ams_delta_devices[] __initdata = {
448 449
	&latch1_gpio_device,
	&latch2_gpio_device,
450
	&ams_delta_kp_device,
451
	&ams_delta_camera_device,
452 453
};

454
static struct platform_device *late_devices[] __initdata = {
455
	&ams_delta_nand_device,
456
	&ams_delta_lcd_device,
457 458
};

459 460
static void __init ams_delta_init(void)
{
461 462 463 464
	/* mux pins for uarts */
	omap_cfg_reg(UART1_TX);
	omap_cfg_reg(UART1_RTS);

465 466 467 468 469 470 471 472 473 474 475 476 477 478
	/* parallel camera interface */
	omap_cfg_reg(H19_1610_CAM_EXCLK);
	omap_cfg_reg(J15_1610_CAM_LCLK);
	omap_cfg_reg(L18_1610_CAM_VS);
	omap_cfg_reg(L15_1610_CAM_HS);
	omap_cfg_reg(L19_1610_CAM_D0);
	omap_cfg_reg(K14_1610_CAM_D1);
	omap_cfg_reg(K15_1610_CAM_D2);
	omap_cfg_reg(K19_1610_CAM_D3);
	omap_cfg_reg(K18_1610_CAM_D4);
	omap_cfg_reg(J14_1610_CAM_D5);
	omap_cfg_reg(J19_1610_CAM_D6);
	omap_cfg_reg(J18_1610_CAM_D7);

479
	omap_serial_init();
480
	omap_register_i2c_bus(1, 100, NULL, 0);
481

482
	omap1_usb_init(&ams_delta_usb_config);
483
	omap1_set_camera_info(&ams_delta_camera_platform_data);
484 485 486 487
#ifdef CONFIG_LEDS_TRIGGERS
	led_trigger_register_simple("ams_delta_camera",
			&ams_delta_camera_led_trigger);
#endif
488
	gpio_led_register_device(-1, &leds_pdata);
489
	platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
490

491 492
	ams_delta_init_fiq();

493
	omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);
494 495

	omapfb_set_lcd_config(&ams_delta_lcd_config);
496 497
}

498 499 500 501
static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)
{
	struct modem_private_data *priv = port->private_data;

502 503 504
	if (IS_ERR(priv->regulator))
		return;

505 506 507
	if (state == old)
		return;

508 509 510 511
	if (state == 0)
		regulator_enable(priv->regulator);
	else if (old == 0)
		regulator_disable(priv->regulator);
512 513
}

514 515
static struct plat_serial8250_port ams_delta_modem_ports[] = {
	{
516 517
		.membase	= IOMEM(MODEM_VIRT),
		.mapbase	= MODEM_PHYS,
518 519 520 521 522 523
		.irq		= -EINVAL, /* changed later */
		.flags		= UPF_BOOT_AUTOCONF,
		.irqflags	= IRQF_TRIGGER_RISING,
		.iotype		= UPIO_MEM,
		.regshift	= 1,
		.uartclk	= BASE_BAUD * 16,
524 525
		.pm		= modem_pm,
		.private_data	= &modem_priv,
526 527 528 529 530 531 532 533 534 535 536 537
	},
	{ },
};

static struct platform_device ams_delta_modem_device = {
	.name	= "serial8250",
	.id	= PLAT8250_DEV_PLATFORM1,
	.dev		= {
		.platform_data = ams_delta_modem_ports,
	},
};

538
static int __init late_init(void)
539
{
540 541
	int err;

542 543 544
	if (!machine_is_ams_delta())
		return -ENODEV;

545 546 547 548 549
	err = gpio_request_array(latch_gpios, ARRAY_SIZE(latch_gpios));
	if (err) {
		pr_err("Couldn't take over latch1/latch2 GPIO pins\n");
		return err;
	}
550 551 552

	platform_add_devices(late_devices, ARRAY_SIZE(late_devices));

553 554 555 556 557 558
	err = platform_device_register(&modem_nreset_device);
	if (err) {
		pr_err("Couldn't register the modem regulator device\n");
		return err;
	}

559
	omap_cfg_reg(M14_1510_GPIO2);
560 561 562 563 564 565 566 567 568
	ams_delta_modem_ports[0].irq =
			gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ);

	err = gpio_request(AMS_DELTA_GPIO_PIN_MODEM_IRQ, "modem");
	if (err) {
		pr_err("Couldn't request gpio pin for modem\n");
		return err;
	}
	gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
569

570 571 572
	/* Initialize the modem_nreset regulator consumer before use */
	modem_priv.regulator = ERR_PTR(-ENODEV);

573 574
	ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
			AMS_DELTA_LATCH2_MODEM_CODEC);
575

576 577 578
	err = platform_device_register(&ams_delta_modem_device);
	if (err)
		goto gpio_free;
579

580 581 582 583 584 585 586 587 588 589
	/*
	 * Once the modem device is registered, the modem_nreset
	 * regulator can be requested on behalf of that device.
	 */
	modem_priv.regulator = regulator_get(&ams_delta_modem_device.dev,
			"RESET#");
	if (IS_ERR(modem_priv.regulator)) {
		err = PTR_ERR(modem_priv.regulator);
		goto unregister;
	}
590 591
	return 0;

592 593
unregister:
	platform_device_unregister(&ams_delta_modem_device);
594 595 596
gpio_free:
	gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
	return err;
597
}
598 599 600 601 602 603

static void __init ams_delta_init_late(void)
{
	omap1_init_late();
	late_init();
}
604

605 606 607 608 609 610
static void __init ams_delta_map_io(void)
{
	omap15xx_map_io();
	iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
}

611 612
MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
	/* Maintainer: Jonathan McDowell <noodles@earth.li> */
613
	.atag_offset	= 0x100,
614
	.map_io		= ams_delta_map_io,
615
	.init_early	= omap1_init_early,
616
	.reserve	= omap_reserve,
617
	.init_irq	= omap1_init_irq,
618
	.init_machine	= ams_delta_init,
619
	.init_late	= ams_delta_init_late,
620
	.timer		= &omap1_timer,
621
	.restart	= omap1_restart,
622
MACHINE_END