Path: blob/master/arch/arm/mach-omap1/board-ams-delta.c
10817 views
/*1* linux/arch/arm/mach-omap1/board-ams-delta.c2*3* Modified from board-generic.c4*5* Board specific inits for the Amstrad E3 (codename Delta) videophone6*7* Copyright (C) 2006 Jonathan McDowell <[email protected]>8*9* This program is free software; you can redistribute it and/or modify10* it under the terms of the GNU General Public License version 2 as11* published by the Free Software Foundation.12*/1314#include <linux/kernel.h>15#include <linux/init.h>16#include <linux/input.h>17#include <linux/interrupt.h>18#include <linux/leds.h>19#include <linux/platform_device.h>20#include <linux/serial_8250.h>2122#include <media/soc_camera.h>2324#include <asm/serial.h>25#include <mach/hardware.h>26#include <asm/mach-types.h>27#include <asm/mach/arch.h>28#include <asm/mach/map.h>2930#include <plat/io.h>31#include <plat/board-ams-delta.h>32#include <mach/gpio.h>33#include <plat/keypad.h>34#include <plat/mux.h>35#include <plat/usb.h>36#include <plat/board.h>37#include <plat/common.h>38#include <mach/camera.h>3940#include <mach/ams-delta-fiq.h>4142static u8 ams_delta_latch1_reg;43static u16 ams_delta_latch2_reg;4445static const unsigned int ams_delta_keymap[] = {46KEY(0, 0, KEY_F1), /* Advert */4748KEY(0, 3, KEY_COFFEE), /* Games */49KEY(0, 2, KEY_QUESTION), /* Directory */50KEY(2, 3, KEY_CONNECT), /* Internet */51KEY(1, 2, KEY_SHOP), /* Services */52KEY(1, 1, KEY_PHONE), /* VoiceMail */5354KEY(0, 1, KEY_DELETE), /* Delete */55KEY(2, 2, KEY_PLAY), /* Play */56KEY(1, 0, KEY_PAGEUP), /* Up */57KEY(1, 3, KEY_PAGEDOWN), /* Down */58KEY(2, 0, KEY_EMAIL), /* ReadEmail */59KEY(2, 1, KEY_STOP), /* Stop */6061/* Numeric keypad portion */62KEY(0, 7, KEY_KP1),63KEY(0, 6, KEY_KP2),64KEY(0, 5, KEY_KP3),65KEY(1, 7, KEY_KP4),66KEY(1, 6, KEY_KP5),67KEY(1, 5, KEY_KP6),68KEY(2, 7, KEY_KP7),69KEY(2, 6, KEY_KP8),70KEY(2, 5, KEY_KP9),71KEY(3, 6, KEY_KP0),72KEY(3, 7, KEY_KPASTERISK),73KEY(3, 5, KEY_KPDOT), /* # key */74KEY(7, 2, KEY_NUMLOCK), /* Mute */75KEY(7, 1, KEY_KPMINUS), /* Recall */76KEY(6, 1, KEY_KPPLUS), /* Redial */77KEY(7, 6, KEY_KPSLASH), /* Handsfree */78KEY(6, 0, KEY_ENTER), /* Video */7980KEY(7, 4, KEY_CAMERA), /* Photo */8182KEY(0, 4, KEY_F2), /* Home */83KEY(1, 4, KEY_F3), /* Office */84KEY(2, 4, KEY_F4), /* Mobile */85KEY(7, 7, KEY_F5), /* SMS */86KEY(7, 5, KEY_F6), /* Email */8788/* QWERTY portion of keypad */89KEY(3, 4, KEY_Q),90KEY(3, 3, KEY_W),91KEY(3, 2, KEY_E),92KEY(3, 1, KEY_R),93KEY(3, 0, KEY_T),94KEY(4, 7, KEY_Y),95KEY(4, 6, KEY_U),96KEY(4, 5, KEY_I),97KEY(4, 4, KEY_O),98KEY(4, 3, KEY_P),99100KEY(4, 2, KEY_A),101KEY(4, 1, KEY_S),102KEY(4, 0, KEY_D),103KEY(5, 7, KEY_F),104KEY(5, 6, KEY_G),105KEY(5, 5, KEY_H),106KEY(5, 4, KEY_J),107KEY(5, 3, KEY_K),108KEY(5, 2, KEY_L),109110KEY(5, 1, KEY_Z),111KEY(5, 0, KEY_X),112KEY(6, 7, KEY_C),113KEY(6, 6, KEY_V),114KEY(6, 5, KEY_B),115KEY(6, 4, KEY_N),116KEY(6, 3, KEY_M),117KEY(6, 2, KEY_SPACE),118119KEY(7, 0, KEY_LEFTSHIFT), /* Vol up */120KEY(7, 3, KEY_LEFTCTRL), /* Vol down */121};122123void ams_delta_latch1_write(u8 mask, u8 value)124{125ams_delta_latch1_reg &= ~mask;126ams_delta_latch1_reg |= value;127*(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg;128}129130void ams_delta_latch2_write(u16 mask, u16 value)131{132ams_delta_latch2_reg &= ~mask;133ams_delta_latch2_reg |= value;134*(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg;135}136137static void __init ams_delta_init_irq(void)138{139omap1_init_common_hw();140omap_init_irq();141}142143static struct map_desc ams_delta_io_desc[] __initdata = {144/* AMS_DELTA_LATCH1 */145{146.virtual = AMS_DELTA_LATCH1_VIRT,147.pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS),148.length = 0x01000000,149.type = MT_DEVICE150},151/* AMS_DELTA_LATCH2 */152{153.virtual = AMS_DELTA_LATCH2_VIRT,154.pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS),155.length = 0x01000000,156.type = MT_DEVICE157},158/* AMS_DELTA_MODEM */159{160.virtual = AMS_DELTA_MODEM_VIRT,161.pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS),162.length = 0x01000000,163.type = MT_DEVICE164}165};166167static struct omap_lcd_config ams_delta_lcd_config = {168.ctrl_name = "internal",169};170171static struct omap_usb_config ams_delta_usb_config __initdata = {172.register_host = 1,173.hmc_mode = 16,174.pins[0] = 2,175};176177static struct omap_board_config_kernel ams_delta_config[] __initdata = {178{ OMAP_TAG_LCD, &ams_delta_lcd_config },179};180181static struct resource ams_delta_nand_resources[] = {182[0] = {183.start = OMAP1_MPUIO_BASE,184.end = OMAP1_MPUIO_BASE +185OMAP_MPUIO_IO_CNTL + sizeof(u32) - 1,186.flags = IORESOURCE_MEM,187},188};189190static struct platform_device ams_delta_nand_device = {191.name = "ams-delta-nand",192.id = -1,193.num_resources = ARRAY_SIZE(ams_delta_nand_resources),194.resource = ams_delta_nand_resources,195};196197static struct resource ams_delta_kp_resources[] = {198[0] = {199.start = INT_KEYBOARD,200.end = INT_KEYBOARD,201.flags = IORESOURCE_IRQ,202},203};204205static const struct matrix_keymap_data ams_delta_keymap_data = {206.keymap = ams_delta_keymap,207.keymap_size = ARRAY_SIZE(ams_delta_keymap),208};209210static struct omap_kp_platform_data ams_delta_kp_data __initdata = {211.rows = 8,212.cols = 8,213.keymap_data = &ams_delta_keymap_data,214.delay = 9,215};216217static struct platform_device ams_delta_kp_device = {218.name = "omap-keypad",219.id = -1,220.dev = {221.platform_data = &ams_delta_kp_data,222},223.num_resources = ARRAY_SIZE(ams_delta_kp_resources),224.resource = ams_delta_kp_resources,225};226227static struct platform_device ams_delta_lcd_device = {228.name = "lcd_ams_delta",229.id = -1,230};231232static struct platform_device ams_delta_led_device = {233.name = "ams-delta-led",234.id = -1235};236237static struct i2c_board_info ams_delta_camera_board_info[] = {238{239I2C_BOARD_INFO("ov6650", 0x60),240},241};242243#ifdef CONFIG_LEDS_TRIGGERS244DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger);245246static int ams_delta_camera_power(struct device *dev, int power)247{248/*249* turn on camera LED250*/251if (power)252led_trigger_event(ams_delta_camera_led_trigger, LED_FULL);253else254led_trigger_event(ams_delta_camera_led_trigger, LED_OFF);255return 0;256}257#else258#define ams_delta_camera_power NULL259#endif260261static struct soc_camera_link ams_delta_iclink = {262.bus_id = 0, /* OMAP1 SoC camera bus */263.i2c_adapter_id = 1,264.board_info = &ams_delta_camera_board_info[0],265.module_name = "ov6650",266.power = ams_delta_camera_power,267};268269static struct platform_device ams_delta_camera_device = {270.name = "soc-camera-pdrv",271.id = 0,272.dev = {273.platform_data = &ams_delta_iclink,274},275};276277static struct omap1_cam_platform_data ams_delta_camera_platform_data = {278.camexclk_khz = 12000, /* default 12MHz clock, no extra DPLL */279.lclk_khz_max = 1334, /* results in 5fps CIF, 10fps QCIF */280};281282static struct platform_device *ams_delta_devices[] __initdata = {283&ams_delta_nand_device,284&ams_delta_kp_device,285&ams_delta_lcd_device,286&ams_delta_led_device,287&ams_delta_camera_device,288};289290static void __init ams_delta_init(void)291{292/* mux pins for uarts */293omap_cfg_reg(UART1_TX);294omap_cfg_reg(UART1_RTS);295296/* parallel camera interface */297omap_cfg_reg(H19_1610_CAM_EXCLK);298omap_cfg_reg(J15_1610_CAM_LCLK);299omap_cfg_reg(L18_1610_CAM_VS);300omap_cfg_reg(L15_1610_CAM_HS);301omap_cfg_reg(L19_1610_CAM_D0);302omap_cfg_reg(K14_1610_CAM_D1);303omap_cfg_reg(K15_1610_CAM_D2);304omap_cfg_reg(K19_1610_CAM_D3);305omap_cfg_reg(K18_1610_CAM_D4);306omap_cfg_reg(J14_1610_CAM_D5);307omap_cfg_reg(J19_1610_CAM_D6);308omap_cfg_reg(J18_1610_CAM_D7);309310iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));311312omap_board_config = ams_delta_config;313omap_board_config_size = ARRAY_SIZE(ams_delta_config);314omap_serial_init();315omap_register_i2c_bus(1, 100, NULL, 0);316317/* Clear latch2 (NAND, LCD, modem enable) */318ams_delta_latch2_write(~0, 0);319320omap1_usb_init(&ams_delta_usb_config);321omap1_set_camera_info(&ams_delta_camera_platform_data);322#ifdef CONFIG_LEDS_TRIGGERS323led_trigger_register_simple("ams_delta_camera",324&ams_delta_camera_led_trigger);325#endif326platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));327328ams_delta_init_fiq();329330omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);331}332333static struct plat_serial8250_port ams_delta_modem_ports[] = {334{335.membase = IOMEM(AMS_DELTA_MODEM_VIRT),336.mapbase = AMS_DELTA_MODEM_PHYS,337.irq = -EINVAL, /* changed later */338.flags = UPF_BOOT_AUTOCONF,339.irqflags = IRQF_TRIGGER_RISING,340.iotype = UPIO_MEM,341.regshift = 1,342.uartclk = BASE_BAUD * 16,343},344{ },345};346347static struct platform_device ams_delta_modem_device = {348.name = "serial8250",349.id = PLAT8250_DEV_PLATFORM1,350.dev = {351.platform_data = ams_delta_modem_ports,352},353};354355static int __init ams_delta_modem_init(void)356{357int err;358359if (!machine_is_ams_delta())360return -ENODEV;361362omap_cfg_reg(M14_1510_GPIO2);363ams_delta_modem_ports[0].irq =364gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ);365366err = gpio_request(AMS_DELTA_GPIO_PIN_MODEM_IRQ, "modem");367if (err) {368pr_err("Couldn't request gpio pin for modem\n");369return err;370}371gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ);372373ams_delta_latch2_write(374AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC,375AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC);376377return platform_device_register(&ams_delta_modem_device);378}379arch_initcall(ams_delta_modem_init);380381static void __init ams_delta_map_io(void)382{383omap1_map_common_io();384}385386MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")387/* Maintainer: Jonathan McDowell <[email protected]> */388.boot_params = 0x10000100,389.map_io = ams_delta_map_io,390.reserve = omap_reserve,391.init_irq = ams_delta_init_irq,392.init_machine = ams_delta_init,393.timer = &omap_timer,394MACHINE_END395396EXPORT_SYMBOL(ams_delta_latch1_write);397EXPORT_SYMBOL(ams_delta_latch2_write);398399400