|
@@ -472,3 +472,162 @@ static void __init ams_delta_init(void)
|
|
{
|
|
{
|
|
/* mux pins for uarts */
|
|
/* mux pins for uarts */
|
|
omap_cfg_reg(UART1_TX);
|
|
omap_cfg_reg(UART1_TX);
|
|
|
|
+ omap_cfg_reg(UART1_RTS);
|
|
|
|
+
|
|
|
|
+ /* 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);
|
|
|
|
+
|
|
|
|
+ omap_serial_init();
|
|
|
|
+ omap_register_i2c_bus(1, 100, NULL, 0);
|
|
|
|
+
|
|
|
|
+ omap1_usb_init(&ams_delta_usb_config);
|
|
|
|
+ omap1_set_camera_info(&ams_delta_camera_platform_data);
|
|
|
|
+#ifdef CONFIG_LEDS_TRIGGERS
|
|
|
|
+ led_trigger_register_simple("ams_delta_camera",
|
|
|
|
+ &ams_delta_camera_led_trigger);
|
|
|
|
+#endif
|
|
|
|
+ gpio_led_register_device(-1, &leds_pdata);
|
|
|
|
+ platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
|
|
|
|
+
|
|
|
|
+ ams_delta_init_fiq();
|
|
|
|
+
|
|
|
|
+ omap_writew(omap_readw(ARM_RSTCT1) | 0x0004, ARM_RSTCT1);
|
|
|
|
+
|
|
|
|
+ omapfb_set_lcd_config(&ams_delta_lcd_config);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void modem_pm(struct uart_port *port, unsigned int state, unsigned old)
|
|
|
|
+{
|
|
|
|
+ struct modem_private_data *priv = port->private_data;
|
|
|
|
+
|
|
|
|
+ if (IS_ERR(priv->regulator))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (state == old)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (state == 0)
|
|
|
|
+ regulator_enable(priv->regulator);
|
|
|
|
+ else if (old == 0)
|
|
|
|
+ regulator_disable(priv->regulator);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static struct plat_serial8250_port ams_delta_modem_ports[] = {
|
|
|
|
+ {
|
|
|
|
+ .membase = IOMEM(MODEM_VIRT),
|
|
|
|
+ .mapbase = MODEM_PHYS,
|
|
|
|
+ .irq = -EINVAL, /* changed later */
|
|
|
|
+ .flags = UPF_BOOT_AUTOCONF,
|
|
|
|
+ .irqflags = IRQF_TRIGGER_RISING,
|
|
|
|
+ .iotype = UPIO_MEM,
|
|
|
|
+ .regshift = 1,
|
|
|
|
+ .uartclk = BASE_BAUD * 16,
|
|
|
|
+ .pm = modem_pm,
|
|
|
|
+ .private_data = &modem_priv,
|
|
|
|
+ },
|
|
|
|
+ { },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct platform_device ams_delta_modem_device = {
|
|
|
|
+ .name = "serial8250",
|
|
|
|
+ .id = PLAT8250_DEV_PLATFORM1,
|
|
|
|
+ .dev = {
|
|
|
|
+ .platform_data = ams_delta_modem_ports,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int __init late_init(void)
|
|
|
|
+{
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ if (!machine_is_ams_delta())
|
|
|
|
+ return -ENODEV;
|
|
|
|
+
|
|
|
|
+ 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;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ platform_add_devices(late_devices, ARRAY_SIZE(late_devices));
|
|
|
|
+
|
|
|
|
+ err = platform_device_register(&modem_nreset_device);
|
|
|
|
+ if (err) {
|
|
|
|
+ pr_err("Couldn't register the modem regulator device\n");
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ omap_cfg_reg(M14_1510_GPIO2);
|
|
|
|
+ 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);
|
|
|
|
+
|
|
|
|
+ /* Initialize the modem_nreset regulator consumer before use */
|
|
|
|
+ modem_priv.regulator = ERR_PTR(-ENODEV);
|
|
|
|
+
|
|
|
|
+ ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
|
|
|
+ AMS_DELTA_LATCH2_MODEM_CODEC);
|
|
|
|
+
|
|
|
|
+ err = platform_device_register(&ams_delta_modem_device);
|
|
|
|
+ if (err)
|
|
|
|
+ goto gpio_free;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * 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;
|
|
|
|
+ }
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+unregister:
|
|
|
|
+ platform_device_unregister(&ams_delta_modem_device);
|
|
|
|
+gpio_free:
|
|
|
|
+ gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init ams_delta_init_late(void)
|
|
|
|
+{
|
|
|
|
+ omap1_init_late();
|
|
|
|
+ late_init();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init ams_delta_map_io(void)
|
|
|
|
+{
|
|
|
|
+ omap15xx_map_io();
|
|
|
|
+ iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
|
|
|
|
+ /* Maintainer: Jonathan McDowell <noodles@earth.li> */
|
|
|
|
+ .atag_offset = 0x100,
|
|
|
|
+ .map_io = ams_delta_map_io,
|
|
|
|
+ .init_early = omap1_init_early,
|
|
|
|
+ .init_irq = omap1_init_irq,
|
|
|
|
+ .init_machine = ams_delta_init,
|
|
|
|
+ .init_late = ams_delta_init_late,
|
|
|
|
+ .timer = &omap1_timer,
|
|
|
|
+ .restart = omap1_restart,
|
|
|
|
+MACHINE_END
|