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