2 * linux/arch/arm/mach-omap1/board-ams-delta.c
4 * Modified from board-generic.c
6 * Board specific inits for the Amstrad E3 (codename Delta) videophone
8 * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
14 #include <linux/gpio/driver.h>
15 #include <linux/gpio/machine.h>
16 #include <linux/gpio.h>
17 #include <linux/kernel.h>
18 #include <linux/init.h>
19 #include <linux/input.h>
20 #include <linux/interrupt.h>
21 #include <linux/leds.h>
22 #include <linux/platform_device.h>
23 #include <linux/regulator/consumer.h>
24 #include <linux/regulator/fixed.h>
25 #include <linux/regulator/machine.h>
26 #include <linux/serial_8250.h>
27 #include <linux/export.h>
28 #include <linux/omapfb.h>
30 #include <linux/platform_data/gpio-omap.h>
32 #include <media/soc_camera.h>
34 #include <asm/serial.h>
35 #include <asm/mach-types.h>
36 #include <asm/mach/arch.h>
37 #include <asm/mach/map.h>
39 #include <mach/board-ams-delta.h>
40 #include <linux/platform_data/keypad-omap.h>
43 #include <mach/hardware.h>
44 #include <mach/ams-delta-fiq.h>
51 static const unsigned int ams_delta_keymap
[] = {
52 KEY(0, 0, KEY_F1
), /* Advert */
54 KEY(0, 3, KEY_COFFEE
), /* Games */
55 KEY(0, 2, KEY_QUESTION
), /* Directory */
56 KEY(2, 3, KEY_CONNECT
), /* Internet */
57 KEY(1, 2, KEY_SHOP
), /* Services */
58 KEY(1, 1, KEY_PHONE
), /* VoiceMail */
60 KEY(0, 1, KEY_DELETE
), /* Delete */
61 KEY(2, 2, KEY_PLAY
), /* Play */
62 KEY(1, 0, KEY_PAGEUP
), /* Up */
63 KEY(1, 3, KEY_PAGEDOWN
), /* Down */
64 KEY(2, 0, KEY_EMAIL
), /* ReadEmail */
65 KEY(2, 1, KEY_STOP
), /* Stop */
67 /* Numeric keypad portion */
78 KEY(3, 7, KEY_KPASTERISK
),
79 KEY(3, 5, KEY_KPDOT
), /* # key */
80 KEY(7, 2, KEY_NUMLOCK
), /* Mute */
81 KEY(7, 1, KEY_KPMINUS
), /* Recall */
82 KEY(6, 1, KEY_KPPLUS
), /* Redial */
83 KEY(7, 6, KEY_KPSLASH
), /* Handsfree */
84 KEY(6, 0, KEY_ENTER
), /* Video */
86 KEY(7, 4, KEY_CAMERA
), /* Photo */
88 KEY(0, 4, KEY_F2
), /* Home */
89 KEY(1, 4, KEY_F3
), /* Office */
90 KEY(2, 4, KEY_F4
), /* Mobile */
91 KEY(7, 7, KEY_F5
), /* SMS */
92 KEY(7, 5, KEY_F6
), /* Email */
94 /* QWERTY portion of keypad */
123 KEY(6, 2, KEY_SPACE
),
125 KEY(7, 0, KEY_LEFTSHIFT
), /* Vol up */
126 KEY(7, 3, KEY_LEFTCTRL
), /* Vol down */
129 #define LATCH1_PHYS 0x01000000
130 #define LATCH1_VIRT 0xEA000000
131 #define MODEM_PHYS 0x04000000
132 #define MODEM_VIRT 0xEB000000
133 #define LATCH2_PHYS 0x08000000
134 #define LATCH2_VIRT 0xEC000000
136 static struct map_desc ams_delta_io_desc
[] __initdata
= {
137 /* AMS_DELTA_LATCH1 */
139 .virtual = LATCH1_VIRT
,
140 .pfn
= __phys_to_pfn(LATCH1_PHYS
),
141 .length
= 0x01000000,
144 /* AMS_DELTA_LATCH2 */
146 .virtual = LATCH2_VIRT
,
147 .pfn
= __phys_to_pfn(LATCH2_PHYS
),
148 .length
= 0x01000000,
151 /* AMS_DELTA_MODEM */
153 .virtual = MODEM_VIRT
,
154 .pfn
= __phys_to_pfn(MODEM_PHYS
),
155 .length
= 0x01000000,
160 static const struct omap_lcd_config ams_delta_lcd_config __initconst
= {
161 .ctrl_name
= "internal",
164 static struct omap_usb_config ams_delta_usb_config __initdata
= {
170 #define LATCH1_GPIO_BASE 232
171 #define LATCH1_NGPIO 8
173 static struct resource latch1_resources
[] = {
176 .start
= LATCH1_PHYS
,
177 .end
= LATCH1_PHYS
+ (LATCH1_NGPIO
- 1) / 8,
178 .flags
= IORESOURCE_MEM
,
182 static struct bgpio_pdata latch1_pdata
= {
183 .base
= LATCH1_GPIO_BASE
,
184 .ngpio
= LATCH1_NGPIO
,
187 static struct platform_device latch1_gpio_device
= {
188 .name
= "basic-mmio-gpio",
190 .resource
= latch1_resources
,
191 .num_resources
= ARRAY_SIZE(latch1_resources
),
193 .platform_data
= &latch1_pdata
,
197 static struct resource latch2_resources
[] = {
200 .start
= LATCH2_PHYS
,
201 .end
= LATCH2_PHYS
+ (AMS_DELTA_LATCH2_NGPIO
- 1) / 8,
202 .flags
= IORESOURCE_MEM
,
206 #define LATCH2_LABEL "latch2"
208 static struct bgpio_pdata latch2_pdata
= {
209 .label
= LATCH2_LABEL
,
210 .base
= AMS_DELTA_LATCH2_GPIO_BASE
,
211 .ngpio
= AMS_DELTA_LATCH2_NGPIO
,
214 static struct platform_device latch2_gpio_device
= {
215 .name
= "basic-mmio-gpio",
217 .resource
= latch2_resources
,
218 .num_resources
= ARRAY_SIZE(latch2_resources
),
220 .platform_data
= &latch2_pdata
,
224 #define LATCH2_PIN_LCD_VBLEN 0
225 #define LATCH2_PIN_LCD_NDISP 1
226 #define LATCH2_PIN_NAND_NCE 2
227 #define LATCH2_PIN_NAND_NRE 3
228 #define LATCH2_PIN_NAND_NWP 4
229 #define LATCH2_PIN_NAND_NWE 5
230 #define LATCH2_PIN_NAND_ALE 6
231 #define LATCH2_PIN_NAND_CLE 7
232 #define LATCH2_PIN_KEYBRD_PWR 8
233 #define LATCH2_PIN_KEYBRD_DATAOUT 9
234 #define LATCH2_PIN_SCARD_RSTIN 10
235 #define LATCH2_PIN_SCARD_CMDVCC 11
236 #define LATCH2_PIN_MODEM_NRESET 12
237 #define LATCH2_PIN_MODEM_CODEC 13
238 #define LATCH2_PIN_HOOKFLASH1 14
239 #define LATCH2_PIN_HOOKFLASH2 15
241 static const struct gpio latch_gpios
[] __initconst
= {
243 .gpio
= LATCH1_GPIO_BASE
+ 6,
244 .flags
= GPIOF_OUT_INIT_LOW
,
248 .gpio
= LATCH1_GPIO_BASE
+ 7,
249 .flags
= GPIOF_OUT_INIT_LOW
,
253 .gpio
= AMS_DELTA_GPIO_PIN_SCARD_RSTIN
,
254 .flags
= GPIOF_OUT_INIT_LOW
,
255 .label
= "scard_rstin",
258 .gpio
= AMS_DELTA_GPIO_PIN_SCARD_CMDVCC
,
259 .flags
= GPIOF_OUT_INIT_LOW
,
260 .label
= "scard_cmdvcc",
263 .gpio
= AMS_DELTA_LATCH2_GPIO_BASE
+ 14,
264 .flags
= GPIOF_OUT_INIT_LOW
,
265 .label
= "hookflash1",
268 .gpio
= AMS_DELTA_LATCH2_GPIO_BASE
+ 15,
269 .flags
= GPIOF_OUT_INIT_LOW
,
270 .label
= "hookflash2",
274 static struct regulator_consumer_supply modem_nreset_consumers
[] = {
275 REGULATOR_SUPPLY("RESET#", "serial8250.1"),
276 REGULATOR_SUPPLY("POR", "cx20442-codec"),
279 static struct regulator_init_data modem_nreset_data
= {
281 .valid_ops_mask
= REGULATOR_CHANGE_STATUS
,
284 .num_consumer_supplies
= ARRAY_SIZE(modem_nreset_consumers
),
285 .consumer_supplies
= modem_nreset_consumers
,
288 static struct fixed_voltage_config modem_nreset_config
= {
289 .supply_name
= "modem_nreset",
290 .microvolts
= 3300000,
291 .gpio
= AMS_DELTA_GPIO_PIN_MODEM_NRESET
,
292 .startup_delay
= 25000,
294 .enabled_at_boot
= 1,
295 .init_data
= &modem_nreset_data
,
298 static struct platform_device modem_nreset_device
= {
299 .name
= "reg-fixed-voltage",
302 .platform_data
= &modem_nreset_config
,
306 struct modem_private_data
{
307 struct regulator
*regulator
;
310 static struct modem_private_data modem_priv
;
312 void ams_delta_latch_write(int base
, int ngpio
, u16 mask
, u16 value
)
315 u16 bitpos
= 1 << bit
;
317 for (; bit
< ngpio
; bit
++, bitpos
= bitpos
<< 1) {
318 if (!(mask
& bitpos
))
321 gpio_set_value(base
+ bit
, (value
& bitpos
) != 0);
324 EXPORT_SYMBOL(ams_delta_latch_write
);
326 static struct resource ams_delta_nand_resources
[] = {
328 .start
= OMAP1_MPUIO_BASE
,
329 .end
= OMAP1_MPUIO_BASE
+
330 OMAP_MPUIO_IO_CNTL
+ sizeof(u32
) - 1,
331 .flags
= IORESOURCE_MEM
,
335 static struct platform_device ams_delta_nand_device
= {
336 .name
= "ams-delta-nand",
338 .num_resources
= ARRAY_SIZE(ams_delta_nand_resources
),
339 .resource
= ams_delta_nand_resources
,
342 #define OMAP_GPIO_LABEL "gpio-0-15"
344 static struct gpiod_lookup_table ams_delta_nand_gpio_table
= {
346 GPIO_LOOKUP(OMAP_GPIO_LABEL
, AMS_DELTA_GPIO_PIN_NAND_RB
, "rdy",
348 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_NCE
, "nce", 0),
349 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_NRE
, "nre", 0),
350 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_NWP
, "nwp", 0),
351 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_NWE
, "nwe", 0),
352 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_ALE
, "ale", 0),
353 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_NAND_CLE
, "cle", 0),
358 static struct resource ams_delta_kp_resources
[] = {
360 .start
= INT_KEYBOARD
,
362 .flags
= IORESOURCE_IRQ
,
366 static const struct matrix_keymap_data ams_delta_keymap_data
= {
367 .keymap
= ams_delta_keymap
,
368 .keymap_size
= ARRAY_SIZE(ams_delta_keymap
),
371 static struct omap_kp_platform_data ams_delta_kp_data
= {
374 .keymap_data
= &ams_delta_keymap_data
,
378 static struct platform_device ams_delta_kp_device
= {
379 .name
= "omap-keypad",
382 .platform_data
= &ams_delta_kp_data
,
384 .num_resources
= ARRAY_SIZE(ams_delta_kp_resources
),
385 .resource
= ams_delta_kp_resources
,
388 static struct platform_device ams_delta_lcd_device
= {
389 .name
= "lcd_ams_delta",
393 static struct gpiod_lookup_table ams_delta_lcd_gpio_table
= {
395 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_LCD_VBLEN
, "vblen", 0),
396 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_LCD_NDISP
, "ndisp", 0),
401 static const struct gpio_led gpio_leds
[] __initconst
= {
404 .gpio
= LATCH1_GPIO_BASE
+ 0,
405 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
406 #ifdef CONFIG_LEDS_TRIGGERS
407 .default_trigger
= "ams_delta_camera",
412 .gpio
= LATCH1_GPIO_BASE
+ 1,
413 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
417 .gpio
= LATCH1_GPIO_BASE
+ 2,
418 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
422 .gpio
= LATCH1_GPIO_BASE
+ 3,
423 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
427 .gpio
= LATCH1_GPIO_BASE
+ 4,
428 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
432 .gpio
= LATCH1_GPIO_BASE
+ 5,
433 .default_state
= LEDS_GPIO_DEFSTATE_OFF
,
437 static const struct gpio_led_platform_data leds_pdata __initconst
= {
439 .num_leds
= ARRAY_SIZE(gpio_leds
),
442 static struct i2c_board_info ams_delta_camera_board_info
[] = {
444 I2C_BOARD_INFO("ov6650", 0x60),
448 #ifdef CONFIG_LEDS_TRIGGERS
449 DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger
);
451 static int ams_delta_camera_power(struct device
*dev
, int power
)
457 led_trigger_event(ams_delta_camera_led_trigger
, LED_FULL
);
459 led_trigger_event(ams_delta_camera_led_trigger
, LED_OFF
);
463 #define ams_delta_camera_power NULL
466 static struct soc_camera_link ams_delta_iclink
= {
467 .bus_id
= 0, /* OMAP1 SoC camera bus */
469 .board_info
= &ams_delta_camera_board_info
[0],
470 .module_name
= "ov6650",
471 .power
= ams_delta_camera_power
,
474 static struct platform_device ams_delta_camera_device
= {
475 .name
= "soc-camera-pdrv",
478 .platform_data
= &ams_delta_iclink
,
482 static struct omap1_cam_platform_data ams_delta_camera_platform_data
= {
483 .camexclk_khz
= 12000, /* default 12MHz clock, no extra DPLL */
484 .lclk_khz_max
= 1334, /* results in 5fps CIF, 10fps QCIF */
487 static struct platform_device ams_delta_audio_device
= {
488 .name
= "ams-delta-audio",
492 static struct gpiod_lookup_table ams_delta_audio_gpio_table
= {
494 GPIO_LOOKUP(OMAP_GPIO_LABEL
, AMS_DELTA_GPIO_PIN_HOOK_SWITCH
,
496 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_MODEM_CODEC
,
502 static struct platform_device cx20442_codec_device
= {
503 .name
= "cx20442-codec",
507 static struct gpiod_lookup_table ams_delta_serio_gpio_table
= {
509 GPIO_LOOKUP(OMAP_GPIO_LABEL
, AMS_DELTA_GPIO_PIN_KEYBRD_DATA
,
511 GPIO_LOOKUP(OMAP_GPIO_LABEL
, AMS_DELTA_GPIO_PIN_KEYBRD_CLK
,
513 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_KEYBRD_PWR
,
515 GPIO_LOOKUP(LATCH2_LABEL
, LATCH2_PIN_KEYBRD_DATAOUT
,
521 static struct platform_device
*ams_delta_devices
[] __initdata
= {
524 &ams_delta_kp_device
,
525 &ams_delta_camera_device
,
526 &ams_delta_audio_device
,
529 static struct platform_device
*late_devices
[] __initdata
= {
530 &ams_delta_nand_device
,
531 &ams_delta_lcd_device
,
532 &cx20442_codec_device
,
535 static struct gpiod_lookup_table
*ams_delta_gpio_tables
[] __initdata
= {
536 &ams_delta_audio_gpio_table
,
537 &ams_delta_serio_gpio_table
,
540 static struct gpiod_lookup_table
*late_gpio_tables
[] __initdata
= {
541 &ams_delta_lcd_gpio_table
,
542 &ams_delta_nand_gpio_table
,
545 static void __init
ams_delta_init(void)
547 /* mux pins for uarts */
548 omap_cfg_reg(UART1_TX
);
549 omap_cfg_reg(UART1_RTS
);
551 /* parallel camera interface */
552 omap_cfg_reg(H19_1610_CAM_EXCLK
);
553 omap_cfg_reg(J15_1610_CAM_LCLK
);
554 omap_cfg_reg(L18_1610_CAM_VS
);
555 omap_cfg_reg(L15_1610_CAM_HS
);
556 omap_cfg_reg(L19_1610_CAM_D0
);
557 omap_cfg_reg(K14_1610_CAM_D1
);
558 omap_cfg_reg(K15_1610_CAM_D2
);
559 omap_cfg_reg(K19_1610_CAM_D3
);
560 omap_cfg_reg(K18_1610_CAM_D4
);
561 omap_cfg_reg(J14_1610_CAM_D5
);
562 omap_cfg_reg(J19_1610_CAM_D6
);
563 omap_cfg_reg(J18_1610_CAM_D7
);
566 omap_register_i2c_bus(1, 100, NULL
, 0);
568 omap1_usb_init(&ams_delta_usb_config
);
569 omap1_set_camera_info(&ams_delta_camera_platform_data
);
570 #ifdef CONFIG_LEDS_TRIGGERS
571 led_trigger_register_simple("ams_delta_camera",
572 &ams_delta_camera_led_trigger
);
574 gpio_led_register_device(-1, &leds_pdata
);
575 platform_add_devices(ams_delta_devices
, ARRAY_SIZE(ams_delta_devices
));
578 * As soon as devices have been registered, assign their dev_names
579 * to respective GPIO lookup tables before they are added.
581 ams_delta_audio_gpio_table
.dev_id
=
582 dev_name(&ams_delta_audio_device
.dev
);
584 * No device name is assigned to GPIO lookup table for serio device
585 * as long as serio driver is not converted to platform device driver.
588 gpiod_add_lookup_tables(ams_delta_gpio_tables
,
589 ARRAY_SIZE(ams_delta_gpio_tables
));
591 ams_delta_init_fiq();
593 omap_writew(omap_readw(ARM_RSTCT1
) | 0x0004, ARM_RSTCT1
);
595 omapfb_set_lcd_config(&ams_delta_lcd_config
);
598 static void modem_pm(struct uart_port
*port
, unsigned int state
, unsigned old
)
600 struct modem_private_data
*priv
= port
->private_data
;
603 if (IS_ERR(priv
->regulator
))
610 ret
= regulator_enable(priv
->regulator
);
612 ret
= regulator_disable(priv
->regulator
);
618 "ams_delta modem_pm: failed to %sable regulator: %d\n",
619 state
? "dis" : "en", ret
);
622 static struct plat_serial8250_port ams_delta_modem_ports
[] = {
624 .membase
= IOMEM(MODEM_VIRT
),
625 .mapbase
= MODEM_PHYS
,
626 .irq
= -EINVAL
, /* changed later */
627 .flags
= UPF_BOOT_AUTOCONF
,
628 .irqflags
= IRQF_TRIGGER_RISING
,
631 .uartclk
= BASE_BAUD
* 16,
633 .private_data
= &modem_priv
,
638 static struct platform_device ams_delta_modem_device
= {
639 .name
= "serial8250",
640 .id
= PLAT8250_DEV_PLATFORM1
,
642 .platform_data
= ams_delta_modem_ports
,
646 static int __init
late_init(void)
650 if (!machine_is_ams_delta())
653 err
= gpio_request_array(latch_gpios
, ARRAY_SIZE(latch_gpios
));
655 pr_err("Couldn't take over latch1/latch2 GPIO pins\n");
659 platform_add_devices(late_devices
, ARRAY_SIZE(late_devices
));
662 * As soon as devices have been registered, assign their dev_names
663 * to respective GPIO lookup tables before they are added.
665 ams_delta_lcd_gpio_table
.dev_id
= dev_name(&ams_delta_lcd_device
.dev
);
666 ams_delta_nand_gpio_table
.dev_id
= dev_name(&ams_delta_nand_device
.dev
);
668 gpiod_add_lookup_tables(late_gpio_tables
, ARRAY_SIZE(late_gpio_tables
));
670 err
= platform_device_register(&modem_nreset_device
);
672 pr_err("Couldn't register the modem regulator device\n");
676 omap_cfg_reg(M14_1510_GPIO2
);
677 ams_delta_modem_ports
[0].irq
=
678 gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ
);
680 err
= gpio_request(AMS_DELTA_GPIO_PIN_MODEM_IRQ
, "modem");
682 pr_err("Couldn't request gpio pin for modem\n");
685 gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ
);
687 /* Initialize the modem_nreset regulator consumer before use */
688 modem_priv
.regulator
= ERR_PTR(-ENODEV
);
690 ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC
,
691 AMS_DELTA_LATCH2_MODEM_CODEC
);
693 err
= platform_device_register(&ams_delta_modem_device
);
698 * Once the modem device is registered, the modem_nreset
699 * regulator can be requested on behalf of that device.
701 modem_priv
.regulator
= regulator_get(&ams_delta_modem_device
.dev
,
703 if (IS_ERR(modem_priv
.regulator
)) {
704 err
= PTR_ERR(modem_priv
.regulator
);
710 platform_device_unregister(&ams_delta_modem_device
);
712 gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ
);
716 static void __init
ams_delta_init_late(void)
722 static void __init
ams_delta_map_io(void)
725 iotable_init(ams_delta_io_desc
, ARRAY_SIZE(ams_delta_io_desc
));
728 MACHINE_START(AMS_DELTA
, "Amstrad E3 (Delta)")
729 /* Maintainer: Jonathan McDowell <noodles@earth.li> */
730 .atag_offset
= 0x100,
731 .map_io
= ams_delta_map_io
,
732 .init_early
= omap1_init_early
,
733 .init_irq
= omap1_init_irq
,
734 .handle_irq
= omap1_handle_irq
,
735 .init_machine
= ams_delta_init
,
736 .init_late
= ams_delta_init_late
,
737 .init_time
= omap1_timer_init
,
738 .restart
= omap1_restart
,