1 /* 2 * linux/arch/arm/mach-omap1/board-ams-delta.c 3 * 4 * Modified from board-generic.c 5 * 6 * Board specific inits for the Amstrad E3 (codename Delta) videophone 7 * 8 * Copyright (C) 2006 Jonathan McDowell <noodles@earth.li> 9 * 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. 13 */ 14 15 #include <linux/kernel.h> 16 #include <linux/init.h> 17 #include <linux/input.h> 18 #include <linux/interrupt.h> 19 #include <linux/leds.h> 20 #include <linux/platform_device.h> 21 #include <linux/serial_8250.h> 22 23 #include <media/soc_camera.h> 24 25 #include <asm/serial.h> 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 <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> 39 40 #include <mach/ams-delta-fiq.h> 41 42 static u8 ams_delta_latch1_reg; 43 static u16 ams_delta_latch2_reg; 44 45 static int ams_delta_keymap[] = { 46 KEY(0, 0, KEY_F1), /* Advert */ 47 48 KEY(3, 0, KEY_COFFEE), /* Games */ 49 KEY(2, 0, KEY_QUESTION), /* Directory */ 50 KEY(3, 2, KEY_CONNECT), /* Internet */ 51 KEY(2, 1, KEY_SHOP), /* Services */ 52 KEY(1, 1, KEY_PHONE), /* VoiceMail */ 53 54 KEY(1, 0, KEY_DELETE), /* Delete */ 55 KEY(2, 2, KEY_PLAY), /* Play */ 56 KEY(0, 1, KEY_PAGEUP), /* Up */ 57 KEY(3, 1, KEY_PAGEDOWN), /* Down */ 58 KEY(0, 2, KEY_EMAIL), /* ReadEmail */ 59 KEY(1, 2, KEY_STOP), /* Stop */ 60 61 /* Numeric keypad portion */ 62 KEY(7, 0, KEY_KP1), 63 KEY(6, 0, KEY_KP2), 64 KEY(5, 0, KEY_KP3), 65 KEY(7, 1, KEY_KP4), 66 KEY(6, 1, KEY_KP5), 67 KEY(5, 1, KEY_KP6), 68 KEY(7, 2, KEY_KP7), 69 KEY(6, 2, KEY_KP8), 70 KEY(5, 2, KEY_KP9), 71 KEY(6, 3, KEY_KP0), 72 KEY(7, 3, KEY_KPASTERISK), 73 KEY(5, 3, KEY_KPDOT), /* # key */ 74 KEY(2, 7, KEY_NUMLOCK), /* Mute */ 75 KEY(1, 7, KEY_KPMINUS), /* Recall */ 76 KEY(1, 6, KEY_KPPLUS), /* Redial */ 77 KEY(6, 7, KEY_KPSLASH), /* Handsfree */ 78 KEY(0, 6, KEY_ENTER), /* Video */ 79 80 KEY(4, 7, KEY_CAMERA), /* Photo */ 81 82 KEY(4, 0, KEY_F2), /* Home */ 83 KEY(4, 1, KEY_F3), /* Office */ 84 KEY(4, 2, KEY_F4), /* Mobile */ 85 KEY(7, 7, KEY_F5), /* SMS */ 86 KEY(5, 7, KEY_F6), /* Email */ 87 88 /* QWERTY portion of keypad */ 89 KEY(4, 3, KEY_Q), 90 KEY(3, 3, KEY_W), 91 KEY(2, 3, KEY_E), 92 KEY(1, 3, KEY_R), 93 KEY(0, 3, KEY_T), 94 KEY(7, 4, KEY_Y), 95 KEY(6, 4, KEY_U), 96 KEY(5, 4, KEY_I), 97 KEY(4, 4, KEY_O), 98 KEY(3, 4, KEY_P), 99 100 KEY(2, 4, KEY_A), 101 KEY(1, 4, KEY_S), 102 KEY(0, 4, KEY_D), 103 KEY(7, 5, KEY_F), 104 KEY(6, 5, KEY_G), 105 KEY(5, 5, KEY_H), 106 KEY(4, 5, KEY_J), 107 KEY(3, 5, KEY_K), 108 KEY(2, 5, KEY_L), 109 110 KEY(1, 5, KEY_Z), 111 KEY(0, 5, KEY_X), 112 KEY(7, 6, KEY_C), 113 KEY(6, 6, KEY_V), 114 KEY(5, 6, KEY_B), 115 KEY(4, 6, KEY_N), 116 KEY(3, 6, KEY_M), 117 KEY(2, 6, KEY_SPACE), 118 119 KEY(0, 7, KEY_LEFTSHIFT), /* Vol up */ 120 KEY(3, 7, KEY_LEFTCTRL), /* Vol down */ 121 122 0 123 }; 124 125 void ams_delta_latch1_write(u8 mask, u8 value) 126 { 127 ams_delta_latch1_reg &= ~mask; 128 ams_delta_latch1_reg |= value; 129 *(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; 130 } 131 132 void ams_delta_latch2_write(u16 mask, u16 value) 133 { 134 ams_delta_latch2_reg &= ~mask; 135 ams_delta_latch2_reg |= value; 136 *(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg; 137 } 138 139 static void __init ams_delta_init_irq(void) 140 { 141 omap1_init_common_hw(); 142 omap_init_irq(); 143 omap_gpio_init(); 144 } 145 146 static struct map_desc ams_delta_io_desc[] __initdata = { 147 /* AMS_DELTA_LATCH1 */ 148 { 149 .virtual = AMS_DELTA_LATCH1_VIRT, 150 .pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), 151 .length = 0x01000000, 152 .type = MT_DEVICE 153 }, 154 /* AMS_DELTA_LATCH2 */ 155 { 156 .virtual = AMS_DELTA_LATCH2_VIRT, 157 .pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), 158 .length = 0x01000000, 159 .type = MT_DEVICE 160 }, 161 /* AMS_DELTA_MODEM */ 162 { 163 .virtual = AMS_DELTA_MODEM_VIRT, 164 .pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), 165 .length = 0x01000000, 166 .type = MT_DEVICE 167 } 168 }; 169 170 static struct omap_lcd_config ams_delta_lcd_config __initdata = { 171 .ctrl_name = "internal", 172 }; 173 174 static struct omap_usb_config ams_delta_usb_config __initdata = { 175 .register_host = 1, 176 .hmc_mode = 16, 177 .pins[0] = 2, 178 }; 179 180 static struct omap_board_config_kernel ams_delta_config[] = { 181 { OMAP_TAG_LCD, &ams_delta_lcd_config }, 182 }; 183 184 static struct resource ams_delta_kp_resources[] = { 185 [0] = { 186 .start = INT_KEYBOARD, 187 .end = INT_KEYBOARD, 188 .flags = IORESOURCE_IRQ, 189 }, 190 }; 191 192 static struct omap_kp_platform_data ams_delta_kp_data = { 193 .rows = 8, 194 .cols = 8, 195 .keymap = ams_delta_keymap, 196 .keymapsize = ARRAY_SIZE(ams_delta_keymap), 197 .delay = 9, 198 }; 199 200 static struct platform_device ams_delta_kp_device = { 201 .name = "omap-keypad", 202 .id = -1, 203 .dev = { 204 .platform_data = &ams_delta_kp_data, 205 }, 206 .num_resources = ARRAY_SIZE(ams_delta_kp_resources), 207 .resource = ams_delta_kp_resources, 208 }; 209 210 static struct platform_device ams_delta_lcd_device = { 211 .name = "lcd_ams_delta", 212 .id = -1, 213 }; 214 215 static struct platform_device ams_delta_led_device = { 216 .name = "ams-delta-led", 217 .id = -1 218 }; 219 220 static struct i2c_board_info ams_delta_camera_board_info[] = { 221 { 222 I2C_BOARD_INFO("ov6650", 0x60), 223 }, 224 }; 225 226 #ifdef CONFIG_LEDS_TRIGGERS 227 DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger); 228 229 static int ams_delta_camera_power(struct device *dev, int power) 230 { 231 /* 232 * turn on camera LED 233 */ 234 if (power) 235 led_trigger_event(ams_delta_camera_led_trigger, LED_FULL); 236 else 237 led_trigger_event(ams_delta_camera_led_trigger, LED_OFF); 238 return 0; 239 } 240 #else 241 #define ams_delta_camera_power NULL 242 #endif 243 244 static struct soc_camera_link __initdata ams_delta_iclink = { 245 .bus_id = 0, /* OMAP1 SoC camera bus */ 246 .i2c_adapter_id = 1, 247 .board_info = &ams_delta_camera_board_info[0], 248 .module_name = "ov6650", 249 .power = ams_delta_camera_power, 250 }; 251 252 static struct platform_device ams_delta_camera_device = { 253 .name = "soc-camera-pdrv", 254 .id = 0, 255 .dev = { 256 .platform_data = &ams_delta_iclink, 257 }, 258 }; 259 260 static struct omap1_cam_platform_data ams_delta_camera_platform_data = { 261 .camexclk_khz = 12000, /* default 12MHz clock, no extra DPLL */ 262 .lclk_khz_max = 1334, /* results in 5fps CIF, 10fps QCIF */ 263 }; 264 265 static struct platform_device *ams_delta_devices[] __initdata = { 266 &ams_delta_kp_device, 267 &ams_delta_lcd_device, 268 &ams_delta_led_device, 269 &ams_delta_camera_device, 270 }; 271 272 static void __init ams_delta_init(void) 273 { 274 /* mux pins for uarts */ 275 omap_cfg_reg(UART1_TX); 276 omap_cfg_reg(UART1_RTS); 277 278 /* parallel camera interface */ 279 omap_cfg_reg(H19_1610_CAM_EXCLK); 280 omap_cfg_reg(J15_1610_CAM_LCLK); 281 omap_cfg_reg(L18_1610_CAM_VS); 282 omap_cfg_reg(L15_1610_CAM_HS); 283 omap_cfg_reg(L19_1610_CAM_D0); 284 omap_cfg_reg(K14_1610_CAM_D1); 285 omap_cfg_reg(K15_1610_CAM_D2); 286 omap_cfg_reg(K19_1610_CAM_D3); 287 omap_cfg_reg(K18_1610_CAM_D4); 288 omap_cfg_reg(J14_1610_CAM_D5); 289 omap_cfg_reg(J19_1610_CAM_D6); 290 omap_cfg_reg(J18_1610_CAM_D7); 291 292 iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc)); 293 294 omap_board_config = ams_delta_config; 295 omap_board_config_size = ARRAY_SIZE(ams_delta_config); 296 omap_serial_init(); 297 omap_register_i2c_bus(1, 100, NULL, 0); 298 299 /* Clear latch2 (NAND, LCD, modem enable) */ 300 ams_delta_latch2_write(~0, 0); 301 302 omap1_usb_init(&ams_delta_usb_config); 303 omap1_set_camera_info(&ams_delta_camera_platform_data); 304 #ifdef CONFIG_LEDS_TRIGGERS 305 led_trigger_register_simple("ams_delta_camera", 306 &ams_delta_camera_led_trigger); 307 #endif 308 platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); 309 310 #ifdef CONFIG_AMS_DELTA_FIQ 311 ams_delta_init_fiq(); 312 #endif 313 314 omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1); 315 } 316 317 static struct plat_serial8250_port ams_delta_modem_ports[] = { 318 { 319 .membase = (void *) AMS_DELTA_MODEM_VIRT, 320 .mapbase = AMS_DELTA_MODEM_PHYS, 321 .irq = -EINVAL, /* changed later */ 322 .flags = UPF_BOOT_AUTOCONF, 323 .irqflags = IRQF_TRIGGER_RISING, 324 .iotype = UPIO_MEM, 325 .regshift = 1, 326 .uartclk = BASE_BAUD * 16, 327 }, 328 { }, 329 }; 330 331 static struct platform_device ams_delta_modem_device = { 332 .name = "serial8250", 333 .id = PLAT8250_DEV_PLATFORM1, 334 .dev = { 335 .platform_data = ams_delta_modem_ports, 336 }, 337 }; 338 339 static int __init ams_delta_modem_init(void) 340 { 341 int err; 342 343 omap_cfg_reg(M14_1510_GPIO2); 344 ams_delta_modem_ports[0].irq = 345 gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ); 346 347 err = gpio_request(AMS_DELTA_GPIO_PIN_MODEM_IRQ, "modem"); 348 if (err) { 349 pr_err("Couldn't request gpio pin for modem\n"); 350 return err; 351 } 352 gpio_direction_input(AMS_DELTA_GPIO_PIN_MODEM_IRQ); 353 354 ams_delta_latch2_write( 355 AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC, 356 AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC); 357 358 return platform_device_register(&ams_delta_modem_device); 359 } 360 arch_initcall(ams_delta_modem_init); 361 362 static void __init ams_delta_map_io(void) 363 { 364 omap1_map_common_io(); 365 } 366 367 MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") 368 /* Maintainer: Jonathan McDowell <noodles@earth.li> */ 369 .boot_params = 0x10000100, 370 .map_io = ams_delta_map_io, 371 .reserve = omap_reserve, 372 .init_irq = ams_delta_init_irq, 373 .init_machine = ams_delta_init, 374 .timer = &omap_timer, 375 MACHINE_END 376 377 EXPORT_SYMBOL(ams_delta_latch1_write); 378 EXPORT_SYMBOL(ams_delta_latch2_write); 379