Loading arch/arm/mach-omap1/Kconfig +2 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,8 @@ config MACH_AMS_DELTA bool "Amstrad E3 (Delta)" depends on ARCH_OMAP1 && ARCH_OMAP15XX select FIQ select GPIO_GENERIC_PLATFORM select LEDS_GPIO_REGISTER help Support for the Amstrad E3 (codename Delta) videophone. Say Y here if you have such a device. Loading arch/arm/mach-omap1/board-ams-delta.c +187 −39 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/basic_mmio_gpio.h> #include <linux/gpio.h> #include <linux/kernel.h> #include <linux/init.h> Loading Loading @@ -40,9 +41,6 @@ #include <mach/ams-delta-fiq.h> static u8 ams_delta_latch1_reg; static u16 ams_delta_latch2_reg; static const unsigned int ams_delta_keymap[] = { KEY(0, 0, KEY_F1), /* Advert */ Loading Loading @@ -121,39 +119,32 @@ static const unsigned int ams_delta_keymap[] = { KEY(7, 3, KEY_LEFTCTRL), /* Vol down */ }; void ams_delta_latch1_write(u8 mask, u8 value) { ams_delta_latch1_reg &= ~mask; ams_delta_latch1_reg |= value; *(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; } void ams_delta_latch2_write(u16 mask, u16 value) { ams_delta_latch2_reg &= ~mask; ams_delta_latch2_reg |= value; *(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg; } #define LATCH1_PHYS 0x01000000 #define LATCH1_VIRT 0xEA000000 #define MODEM_PHYS 0x04000000 #define MODEM_VIRT 0xEB000000 #define LATCH2_PHYS 0x08000000 #define LATCH2_VIRT 0xEC000000 static struct map_desc ams_delta_io_desc[] __initdata = { /* AMS_DELTA_LATCH1 */ { .virtual = AMS_DELTA_LATCH1_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), .virtual = LATCH1_VIRT, .pfn = __phys_to_pfn(LATCH1_PHYS), .length = 0x01000000, .type = MT_DEVICE }, /* AMS_DELTA_LATCH2 */ { .virtual = AMS_DELTA_LATCH2_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), .virtual = LATCH2_VIRT, .pfn = __phys_to_pfn(LATCH2_PHYS), .length = 0x01000000, .type = MT_DEVICE }, /* AMS_DELTA_MODEM */ { .virtual = AMS_DELTA_MODEM_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), .virtual = MODEM_VIRT, .pfn = __phys_to_pfn(MODEM_PHYS), .length = 0x01000000, .type = MT_DEVICE } Loading @@ -173,6 +164,113 @@ static struct omap_board_config_kernel ams_delta_config[] __initdata = { { OMAP_TAG_LCD, &ams_delta_lcd_config }, }; #define LATCH1_GPIO_BASE 232 #define LATCH1_NGPIO 8 static struct resource latch1_resources[] __initconst = { [0] = { .name = "dat", .start = LATCH1_PHYS, .end = LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8, .flags = IORESOURCE_MEM, }, }; static struct bgpio_pdata latch1_pdata __initconst = { .base = LATCH1_GPIO_BASE, .ngpio = LATCH1_NGPIO, }; static struct platform_device latch1_gpio_device = { .name = "basic-mmio-gpio", .id = 0, .resource = latch1_resources, .num_resources = ARRAY_SIZE(latch1_resources), .dev = { .platform_data = &latch1_pdata, }, }; static struct resource latch2_resources[] __initconst = { [0] = { .name = "dat", .start = LATCH2_PHYS, .end = LATCH2_PHYS + (AMS_DELTA_LATCH2_NGPIO - 1) / 8, .flags = IORESOURCE_MEM, }, }; static struct bgpio_pdata latch2_pdata __initconst = { .base = AMS_DELTA_LATCH2_GPIO_BASE, .ngpio = AMS_DELTA_LATCH2_NGPIO, }; static struct platform_device latch2_gpio_device = { .name = "basic-mmio-gpio", .id = 1, .resource = latch2_resources, .num_resources = ARRAY_SIZE(latch2_resources), .dev = { .platform_data = &latch2_pdata, }, }; static struct gpio latch_gpios[] __initconst = { { .gpio = LATCH1_GPIO_BASE + 6, .flags = GPIOF_OUT_INIT_LOW, .label = "dockit1", }, { .gpio = LATCH1_GPIO_BASE + 7, .flags = GPIOF_OUT_INIT_LOW, .label = "dockit2", }, { .gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN, .flags = GPIOF_OUT_INIT_LOW, .label = "scard_rstin", }, { .gpio = AMS_DELTA_GPIO_PIN_SCARD_CMDVCC, .flags = GPIOF_OUT_INIT_LOW, .label = "scard_cmdvcc", }, { .gpio = AMS_DELTA_GPIO_PIN_MODEM_NRESET, .flags = GPIOF_OUT_INIT_LOW, .label = "modem_nreset", }, { .gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC, .flags = GPIOF_OUT_INIT_LOW, .label = "modem_codec", }, { .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14, .flags = GPIOF_OUT_INIT_LOW, .label = "hookflash1", }, { .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 15, .flags = GPIOF_OUT_INIT_LOW, .label = "hookflash2", }, }; void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value) { int bit = 0; u16 bitpos = 1 << bit; for (; bit < ngpio; bit++, bitpos = bitpos << 1) { if (!(mask & bitpos)) continue; gpio_set_value(base + bit, (value & bitpos) != 0); } } EXPORT_SYMBOL(ams_delta_latch_write); static struct resource ams_delta_nand_resources[] = { [0] = { .start = OMAP1_MPUIO_BASE, Loading Loading @@ -224,9 +322,45 @@ static struct platform_device ams_delta_lcd_device = { .id = -1, }; static struct platform_device ams_delta_led_device = { .name = "ams-delta-led", .id = -1 static struct gpio_led gpio_leds[] __initconst = { { .name = "camera", .gpio = LATCH1_GPIO_BASE + 0, .default_state = LEDS_GPIO_DEFSTATE_OFF, #ifdef CONFIG_LEDS_TRIGGERS .default_trigger = "ams_delta_camera", #endif }, { .name = "advert", .gpio = LATCH1_GPIO_BASE + 1, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "email", .gpio = LATCH1_GPIO_BASE + 2, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "handsfree", .gpio = LATCH1_GPIO_BASE + 3, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "voicemail", .gpio = LATCH1_GPIO_BASE + 4, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "voice", .gpio = LATCH1_GPIO_BASE + 5, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, }; static struct gpio_led_platform_data leds_pdata __initconst = { .leds = gpio_leds, .num_leds = ARRAY_SIZE(gpio_leds), }; static struct i2c_board_info ams_delta_camera_board_info[] = { Loading Loading @@ -275,13 +409,17 @@ static struct omap1_cam_platform_data ams_delta_camera_platform_data = { }; static struct platform_device *ams_delta_devices[] __initdata = { &ams_delta_nand_device, &latch1_gpio_device, &latch2_gpio_device, &ams_delta_kp_device, &ams_delta_lcd_device, &ams_delta_led_device, &ams_delta_camera_device, }; static struct platform_device *late_devices[] __initconst = { &ams_delta_nand_device, &ams_delta_lcd_device, }; static void __init ams_delta_init(void) { /* mux pins for uarts */ Loading @@ -307,15 +445,13 @@ static void __init ams_delta_init(void) omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); /* Clear latch2 (NAND, LCD, modem enable) */ ams_delta_latch2_write(~0, 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(); Loading @@ -325,8 +461,8 @@ static void __init ams_delta_init(void) static struct plat_serial8250_port ams_delta_modem_ports[] = { { .membase = IOMEM(AMS_DELTA_MODEM_VIRT), .mapbase = AMS_DELTA_MODEM_PHYS, .membase = IOMEM(MODEM_VIRT), .mapbase = MODEM_PHYS, .irq = -EINVAL, /* changed later */ .flags = UPF_BOOT_AUTOCONF, .irqflags = IRQF_TRIGGER_RISING, Loading @@ -345,13 +481,21 @@ static struct platform_device ams_delta_modem_device = { }, }; static int __init ams_delta_modem_init(void) 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)); omap_cfg_reg(M14_1510_GPIO2); ams_delta_modem_ports[0].irq = gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ); Loading @@ -367,9 +511,16 @@ static int __init ams_delta_modem_init(void) AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC, AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC); return platform_device_register(&ams_delta_modem_device); err = platform_device_register(&ams_delta_modem_device); if (err) goto gpio_free; return 0; gpio_free: gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); return err; } arch_initcall(ams_delta_modem_init); late_initcall(late_init); static void __init ams_delta_map_io(void) { Loading @@ -388,6 +539,3 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") .timer = &omap1_timer, .restart = omap1_restart, MACHINE_END EXPORT_SYMBOL(ams_delta_latch1_write); EXPORT_SYMBOL(ams_delta_latch2_write); arch/arm/plat-omap/include/plat/board-ams-delta.h +22 −26 Original line number Diff line number Diff line Loading @@ -28,30 +28,6 @@ #if defined (CONFIG_MACH_AMS_DELTA) #define AMS_DELTA_LATCH1_PHYS 0x01000000 #define AMS_DELTA_LATCH1_VIRT 0xEA000000 #define AMS_DELTA_MODEM_PHYS 0x04000000 #define AMS_DELTA_MODEM_VIRT 0xEB000000 #define AMS_DELTA_LATCH2_PHYS 0x08000000 #define AMS_DELTA_LATCH2_VIRT 0xEC000000 #define AMS_DELTA_LATCH1_LED_CAMERA 0x01 #define AMS_DELTA_LATCH1_LED_ADVERT 0x02 #define AMS_DELTA_LATCH1_LED_EMAIL 0x04 #define AMS_DELTA_LATCH1_LED_HANDSFREE 0x08 #define AMS_DELTA_LATCH1_LED_VOICEMAIL 0x10 #define AMS_DELTA_LATCH1_LED_VOICE 0x20 #define AMS_DELTA_LATCH2_LCD_VBLEN 0x0001 #define AMS_DELTA_LATCH2_LCD_NDISP 0x0002 #define AMS_DELTA_LATCH2_NAND_NCE 0x0004 #define AMS_DELTA_LATCH2_NAND_NRE 0x0008 #define AMS_DELTA_LATCH2_NAND_NWP 0x0010 #define AMS_DELTA_LATCH2_NAND_NWE 0x0020 #define AMS_DELTA_LATCH2_NAND_ALE 0x0040 #define AMS_DELTA_LATCH2_NAND_CLE 0x0080 #define AMD_DELTA_LATCH2_KEYBRD_PWR 0x0100 #define AMD_DELTA_LATCH2_KEYBRD_DATA 0x0200 #define AMD_DELTA_LATCH2_SCARD_RSTIN 0x0400 #define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800 #define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000 Loading @@ -66,9 +42,29 @@ #define AMS_DELTA_GPIO_PIN_CONFIG 11 #define AMS_DELTA_GPIO_PIN_NAND_RB 12 #define AMS_DELTA_GPIO_PIN_LCD_VBLEN 240 #define AMS_DELTA_GPIO_PIN_LCD_NDISP 241 #define AMS_DELTA_GPIO_PIN_NAND_NCE 242 #define AMS_DELTA_GPIO_PIN_NAND_NRE 243 #define AMS_DELTA_GPIO_PIN_NAND_NWP 244 #define AMS_DELTA_GPIO_PIN_NAND_NWE 245 #define AMS_DELTA_GPIO_PIN_NAND_ALE 246 #define AMS_DELTA_GPIO_PIN_NAND_CLE 247 #define AMS_DELTA_GPIO_PIN_KEYBRD_PWR 248 #define AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT 249 #define AMS_DELTA_GPIO_PIN_SCARD_RSTIN 250 #define AMS_DELTA_GPIO_PIN_SCARD_CMDVCC 251 #define AMS_DELTA_GPIO_PIN_MODEM_NRESET 252 #define AMS_DELTA_GPIO_PIN_MODEM_CODEC 253 #define AMS_DELTA_LATCH2_GPIO_BASE AMS_DELTA_GPIO_PIN_LCD_VBLEN #define AMS_DELTA_LATCH2_NGPIO 16 #ifndef __ASSEMBLY__ void ams_delta_latch1_write(u8 mask, u8 value); void ams_delta_latch2_write(u16 mask, u16 value); void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value); #define ams_delta_latch2_write(mask, value) \ ams_delta_latch_write(AMS_DELTA_LATCH2_GPIO_BASE, \ AMS_DELTA_LATCH2_NGPIO, (mask), (value)) #endif #endif /* CONFIG_MACH_AMS_DELTA */ Loading drivers/input/serio/ams_delta_serio.c +34 −20 Original line number Diff line number Diff line Loading @@ -92,8 +92,7 @@ static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id) static int ams_delta_serio_open(struct serio *serio) { /* enable keyboard */ ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, AMD_DELTA_LATCH2_KEYBRD_PWR); gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1); return 0; } Loading @@ -101,9 +100,32 @@ static int ams_delta_serio_open(struct serio *serio) static void ams_delta_serio_close(struct serio *serio) { /* disable keyboard */ ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0); } static struct gpio ams_delta_gpios[] __initconst_or_module = { { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA, .flags = GPIOF_DIR_IN, .label = "serio-data", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK, .flags = GPIOF_DIR_IN, .label = "serio-clock", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, .flags = GPIOF_OUT_INIT_LOW, .label = "serio-power", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT, .flags = GPIOF_OUT_INIT_LOW, .label = "serio-dataout", }, }; static int __init ams_delta_serio_init(void) { int err; Loading @@ -123,19 +145,12 @@ static int __init ams_delta_serio_init(void) strlcpy(ams_delta_serio->phys, "GPIO/serio0", sizeof(ams_delta_serio->phys)); err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_DATA, "serio-data"); err = gpio_request_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); if (err) { pr_err("ams_delta_serio: Couldn't request gpio pin for data\n"); pr_err("ams_delta_serio: Couldn't request gpio pins\n"); goto serio; } gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_CLK, "serio-clock"); if (err) { pr_err("ams_delta_serio: couldn't request gpio pin for clock\n"); goto gpio_data; } gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, Loading @@ -143,7 +158,7 @@ static int __init ams_delta_serio_init(void) if (err < 0) { pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n", gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); goto gpio_clk; goto gpio; } /* * Since GPIO register handling for keyboard clock pin is performed Loading @@ -157,10 +172,9 @@ static int __init ams_delta_serio_init(void) dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name); return 0; gpio_clk: gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_data: gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); gpio: gpio_free_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); serio: kfree(ams_delta_serio); return err; Loading @@ -171,7 +185,7 @@ static void __exit ams_delta_serio_exit(void) { serio_unregister_port(ams_delta_serio); free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); gpio_free_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); } module_exit(ams_delta_serio_exit); drivers/leds/Kconfig +0 −7 Original line number Diff line number Diff line Loading @@ -74,13 +74,6 @@ config LEDS_S3C24XX This option enables support for LEDs connected to GPIO lines on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. config LEDS_AMS_DELTA tristate "LED Support for the Amstrad Delta (E3)" depends on LEDS_CLASS depends on MACH_AMS_DELTA help This option enables support for the LEDs on Amstrad Delta (E3). config LEDS_NET48XX tristate "LED Support for Soekris net48xx series Error LED" depends on LEDS_CLASS Loading Loading
arch/arm/mach-omap1/Kconfig +2 −0 Original line number Diff line number Diff line Loading @@ -155,6 +155,8 @@ config MACH_AMS_DELTA bool "Amstrad E3 (Delta)" depends on ARCH_OMAP1 && ARCH_OMAP15XX select FIQ select GPIO_GENERIC_PLATFORM select LEDS_GPIO_REGISTER help Support for the Amstrad E3 (codename Delta) videophone. Say Y here if you have such a device. Loading
arch/arm/mach-omap1/board-ams-delta.c +187 −39 Original line number Diff line number Diff line Loading @@ -11,6 +11,7 @@ * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/basic_mmio_gpio.h> #include <linux/gpio.h> #include <linux/kernel.h> #include <linux/init.h> Loading Loading @@ -40,9 +41,6 @@ #include <mach/ams-delta-fiq.h> static u8 ams_delta_latch1_reg; static u16 ams_delta_latch2_reg; static const unsigned int ams_delta_keymap[] = { KEY(0, 0, KEY_F1), /* Advert */ Loading Loading @@ -121,39 +119,32 @@ static const unsigned int ams_delta_keymap[] = { KEY(7, 3, KEY_LEFTCTRL), /* Vol down */ }; void ams_delta_latch1_write(u8 mask, u8 value) { ams_delta_latch1_reg &= ~mask; ams_delta_latch1_reg |= value; *(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; } void ams_delta_latch2_write(u16 mask, u16 value) { ams_delta_latch2_reg &= ~mask; ams_delta_latch2_reg |= value; *(volatile __u16 *) AMS_DELTA_LATCH2_VIRT = ams_delta_latch2_reg; } #define LATCH1_PHYS 0x01000000 #define LATCH1_VIRT 0xEA000000 #define MODEM_PHYS 0x04000000 #define MODEM_VIRT 0xEB000000 #define LATCH2_PHYS 0x08000000 #define LATCH2_VIRT 0xEC000000 static struct map_desc ams_delta_io_desc[] __initdata = { /* AMS_DELTA_LATCH1 */ { .virtual = AMS_DELTA_LATCH1_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), .virtual = LATCH1_VIRT, .pfn = __phys_to_pfn(LATCH1_PHYS), .length = 0x01000000, .type = MT_DEVICE }, /* AMS_DELTA_LATCH2 */ { .virtual = AMS_DELTA_LATCH2_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), .virtual = LATCH2_VIRT, .pfn = __phys_to_pfn(LATCH2_PHYS), .length = 0x01000000, .type = MT_DEVICE }, /* AMS_DELTA_MODEM */ { .virtual = AMS_DELTA_MODEM_VIRT, .pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), .virtual = MODEM_VIRT, .pfn = __phys_to_pfn(MODEM_PHYS), .length = 0x01000000, .type = MT_DEVICE } Loading @@ -173,6 +164,113 @@ static struct omap_board_config_kernel ams_delta_config[] __initdata = { { OMAP_TAG_LCD, &ams_delta_lcd_config }, }; #define LATCH1_GPIO_BASE 232 #define LATCH1_NGPIO 8 static struct resource latch1_resources[] __initconst = { [0] = { .name = "dat", .start = LATCH1_PHYS, .end = LATCH1_PHYS + (LATCH1_NGPIO - 1) / 8, .flags = IORESOURCE_MEM, }, }; static struct bgpio_pdata latch1_pdata __initconst = { .base = LATCH1_GPIO_BASE, .ngpio = LATCH1_NGPIO, }; static struct platform_device latch1_gpio_device = { .name = "basic-mmio-gpio", .id = 0, .resource = latch1_resources, .num_resources = ARRAY_SIZE(latch1_resources), .dev = { .platform_data = &latch1_pdata, }, }; static struct resource latch2_resources[] __initconst = { [0] = { .name = "dat", .start = LATCH2_PHYS, .end = LATCH2_PHYS + (AMS_DELTA_LATCH2_NGPIO - 1) / 8, .flags = IORESOURCE_MEM, }, }; static struct bgpio_pdata latch2_pdata __initconst = { .base = AMS_DELTA_LATCH2_GPIO_BASE, .ngpio = AMS_DELTA_LATCH2_NGPIO, }; static struct platform_device latch2_gpio_device = { .name = "basic-mmio-gpio", .id = 1, .resource = latch2_resources, .num_resources = ARRAY_SIZE(latch2_resources), .dev = { .platform_data = &latch2_pdata, }, }; static struct gpio latch_gpios[] __initconst = { { .gpio = LATCH1_GPIO_BASE + 6, .flags = GPIOF_OUT_INIT_LOW, .label = "dockit1", }, { .gpio = LATCH1_GPIO_BASE + 7, .flags = GPIOF_OUT_INIT_LOW, .label = "dockit2", }, { .gpio = AMS_DELTA_GPIO_PIN_SCARD_RSTIN, .flags = GPIOF_OUT_INIT_LOW, .label = "scard_rstin", }, { .gpio = AMS_DELTA_GPIO_PIN_SCARD_CMDVCC, .flags = GPIOF_OUT_INIT_LOW, .label = "scard_cmdvcc", }, { .gpio = AMS_DELTA_GPIO_PIN_MODEM_NRESET, .flags = GPIOF_OUT_INIT_LOW, .label = "modem_nreset", }, { .gpio = AMS_DELTA_GPIO_PIN_MODEM_CODEC, .flags = GPIOF_OUT_INIT_LOW, .label = "modem_codec", }, { .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 14, .flags = GPIOF_OUT_INIT_LOW, .label = "hookflash1", }, { .gpio = AMS_DELTA_LATCH2_GPIO_BASE + 15, .flags = GPIOF_OUT_INIT_LOW, .label = "hookflash2", }, }; void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value) { int bit = 0; u16 bitpos = 1 << bit; for (; bit < ngpio; bit++, bitpos = bitpos << 1) { if (!(mask & bitpos)) continue; gpio_set_value(base + bit, (value & bitpos) != 0); } } EXPORT_SYMBOL(ams_delta_latch_write); static struct resource ams_delta_nand_resources[] = { [0] = { .start = OMAP1_MPUIO_BASE, Loading Loading @@ -224,9 +322,45 @@ static struct platform_device ams_delta_lcd_device = { .id = -1, }; static struct platform_device ams_delta_led_device = { .name = "ams-delta-led", .id = -1 static struct gpio_led gpio_leds[] __initconst = { { .name = "camera", .gpio = LATCH1_GPIO_BASE + 0, .default_state = LEDS_GPIO_DEFSTATE_OFF, #ifdef CONFIG_LEDS_TRIGGERS .default_trigger = "ams_delta_camera", #endif }, { .name = "advert", .gpio = LATCH1_GPIO_BASE + 1, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "email", .gpio = LATCH1_GPIO_BASE + 2, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "handsfree", .gpio = LATCH1_GPIO_BASE + 3, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "voicemail", .gpio = LATCH1_GPIO_BASE + 4, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "voice", .gpio = LATCH1_GPIO_BASE + 5, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, }; static struct gpio_led_platform_data leds_pdata __initconst = { .leds = gpio_leds, .num_leds = ARRAY_SIZE(gpio_leds), }; static struct i2c_board_info ams_delta_camera_board_info[] = { Loading Loading @@ -275,13 +409,17 @@ static struct omap1_cam_platform_data ams_delta_camera_platform_data = { }; static struct platform_device *ams_delta_devices[] __initdata = { &ams_delta_nand_device, &latch1_gpio_device, &latch2_gpio_device, &ams_delta_kp_device, &ams_delta_lcd_device, &ams_delta_led_device, &ams_delta_camera_device, }; static struct platform_device *late_devices[] __initconst = { &ams_delta_nand_device, &ams_delta_lcd_device, }; static void __init ams_delta_init(void) { /* mux pins for uarts */ Loading @@ -307,15 +445,13 @@ static void __init ams_delta_init(void) omap_serial_init(); omap_register_i2c_bus(1, 100, NULL, 0); /* Clear latch2 (NAND, LCD, modem enable) */ ams_delta_latch2_write(~0, 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(); Loading @@ -325,8 +461,8 @@ static void __init ams_delta_init(void) static struct plat_serial8250_port ams_delta_modem_ports[] = { { .membase = IOMEM(AMS_DELTA_MODEM_VIRT), .mapbase = AMS_DELTA_MODEM_PHYS, .membase = IOMEM(MODEM_VIRT), .mapbase = MODEM_PHYS, .irq = -EINVAL, /* changed later */ .flags = UPF_BOOT_AUTOCONF, .irqflags = IRQF_TRIGGER_RISING, Loading @@ -345,13 +481,21 @@ static struct platform_device ams_delta_modem_device = { }, }; static int __init ams_delta_modem_init(void) 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)); omap_cfg_reg(M14_1510_GPIO2); ams_delta_modem_ports[0].irq = gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ); Loading @@ -367,9 +511,16 @@ static int __init ams_delta_modem_init(void) AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC, AMS_DELTA_LATCH2_MODEM_NRESET | AMS_DELTA_LATCH2_MODEM_CODEC); return platform_device_register(&ams_delta_modem_device); err = platform_device_register(&ams_delta_modem_device); if (err) goto gpio_free; return 0; gpio_free: gpio_free(AMS_DELTA_GPIO_PIN_MODEM_IRQ); return err; } arch_initcall(ams_delta_modem_init); late_initcall(late_init); static void __init ams_delta_map_io(void) { Loading @@ -388,6 +539,3 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)") .timer = &omap1_timer, .restart = omap1_restart, MACHINE_END EXPORT_SYMBOL(ams_delta_latch1_write); EXPORT_SYMBOL(ams_delta_latch2_write);
arch/arm/plat-omap/include/plat/board-ams-delta.h +22 −26 Original line number Diff line number Diff line Loading @@ -28,30 +28,6 @@ #if defined (CONFIG_MACH_AMS_DELTA) #define AMS_DELTA_LATCH1_PHYS 0x01000000 #define AMS_DELTA_LATCH1_VIRT 0xEA000000 #define AMS_DELTA_MODEM_PHYS 0x04000000 #define AMS_DELTA_MODEM_VIRT 0xEB000000 #define AMS_DELTA_LATCH2_PHYS 0x08000000 #define AMS_DELTA_LATCH2_VIRT 0xEC000000 #define AMS_DELTA_LATCH1_LED_CAMERA 0x01 #define AMS_DELTA_LATCH1_LED_ADVERT 0x02 #define AMS_DELTA_LATCH1_LED_EMAIL 0x04 #define AMS_DELTA_LATCH1_LED_HANDSFREE 0x08 #define AMS_DELTA_LATCH1_LED_VOICEMAIL 0x10 #define AMS_DELTA_LATCH1_LED_VOICE 0x20 #define AMS_DELTA_LATCH2_LCD_VBLEN 0x0001 #define AMS_DELTA_LATCH2_LCD_NDISP 0x0002 #define AMS_DELTA_LATCH2_NAND_NCE 0x0004 #define AMS_DELTA_LATCH2_NAND_NRE 0x0008 #define AMS_DELTA_LATCH2_NAND_NWP 0x0010 #define AMS_DELTA_LATCH2_NAND_NWE 0x0020 #define AMS_DELTA_LATCH2_NAND_ALE 0x0040 #define AMS_DELTA_LATCH2_NAND_CLE 0x0080 #define AMD_DELTA_LATCH2_KEYBRD_PWR 0x0100 #define AMD_DELTA_LATCH2_KEYBRD_DATA 0x0200 #define AMD_DELTA_LATCH2_SCARD_RSTIN 0x0400 #define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800 #define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000 Loading @@ -66,9 +42,29 @@ #define AMS_DELTA_GPIO_PIN_CONFIG 11 #define AMS_DELTA_GPIO_PIN_NAND_RB 12 #define AMS_DELTA_GPIO_PIN_LCD_VBLEN 240 #define AMS_DELTA_GPIO_PIN_LCD_NDISP 241 #define AMS_DELTA_GPIO_PIN_NAND_NCE 242 #define AMS_DELTA_GPIO_PIN_NAND_NRE 243 #define AMS_DELTA_GPIO_PIN_NAND_NWP 244 #define AMS_DELTA_GPIO_PIN_NAND_NWE 245 #define AMS_DELTA_GPIO_PIN_NAND_ALE 246 #define AMS_DELTA_GPIO_PIN_NAND_CLE 247 #define AMS_DELTA_GPIO_PIN_KEYBRD_PWR 248 #define AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT 249 #define AMS_DELTA_GPIO_PIN_SCARD_RSTIN 250 #define AMS_DELTA_GPIO_PIN_SCARD_CMDVCC 251 #define AMS_DELTA_GPIO_PIN_MODEM_NRESET 252 #define AMS_DELTA_GPIO_PIN_MODEM_CODEC 253 #define AMS_DELTA_LATCH2_GPIO_BASE AMS_DELTA_GPIO_PIN_LCD_VBLEN #define AMS_DELTA_LATCH2_NGPIO 16 #ifndef __ASSEMBLY__ void ams_delta_latch1_write(u8 mask, u8 value); void ams_delta_latch2_write(u16 mask, u16 value); void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value); #define ams_delta_latch2_write(mask, value) \ ams_delta_latch_write(AMS_DELTA_LATCH2_GPIO_BASE, \ AMS_DELTA_LATCH2_NGPIO, (mask), (value)) #endif #endif /* CONFIG_MACH_AMS_DELTA */ Loading
drivers/input/serio/ams_delta_serio.c +34 −20 Original line number Diff line number Diff line Loading @@ -92,8 +92,7 @@ static irqreturn_t ams_delta_serio_interrupt(int irq, void *dev_id) static int ams_delta_serio_open(struct serio *serio) { /* enable keyboard */ ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, AMD_DELTA_LATCH2_KEYBRD_PWR); gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1); return 0; } Loading @@ -101,9 +100,32 @@ static int ams_delta_serio_open(struct serio *serio) static void ams_delta_serio_close(struct serio *serio) { /* disable keyboard */ ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 0); } static struct gpio ams_delta_gpios[] __initconst_or_module = { { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATA, .flags = GPIOF_DIR_IN, .label = "serio-data", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_CLK, .flags = GPIOF_DIR_IN, .label = "serio-clock", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_PWR, .flags = GPIOF_OUT_INIT_LOW, .label = "serio-power", }, { .gpio = AMS_DELTA_GPIO_PIN_KEYBRD_DATAOUT, .flags = GPIOF_OUT_INIT_LOW, .label = "serio-dataout", }, }; static int __init ams_delta_serio_init(void) { int err; Loading @@ -123,19 +145,12 @@ static int __init ams_delta_serio_init(void) strlcpy(ams_delta_serio->phys, "GPIO/serio0", sizeof(ams_delta_serio->phys)); err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_DATA, "serio-data"); err = gpio_request_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); if (err) { pr_err("ams_delta_serio: Couldn't request gpio pin for data\n"); pr_err("ams_delta_serio: Couldn't request gpio pins\n"); goto serio; } gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); err = gpio_request(AMS_DELTA_GPIO_PIN_KEYBRD_CLK, "serio-clock"); if (err) { pr_err("ams_delta_serio: couldn't request gpio pin for clock\n"); goto gpio_data; } gpio_direction_input(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, Loading @@ -143,7 +158,7 @@ static int __init ams_delta_serio_init(void) if (err < 0) { pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n", gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); goto gpio_clk; goto gpio; } /* * Since GPIO register handling for keyboard clock pin is performed Loading @@ -157,10 +172,9 @@ static int __init ams_delta_serio_init(void) dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name); return 0; gpio_clk: gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_data: gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); gpio: gpio_free_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); serio: kfree(ams_delta_serio); return err; Loading @@ -171,7 +185,7 @@ static void __exit ams_delta_serio_exit(void) { serio_unregister_port(ams_delta_serio); free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); gpio_free_array(ams_delta_gpios, ARRAY_SIZE(ams_delta_gpios)); } module_exit(ams_delta_serio_exit);
drivers/leds/Kconfig +0 −7 Original line number Diff line number Diff line Loading @@ -74,13 +74,6 @@ config LEDS_S3C24XX This option enables support for LEDs connected to GPIO lines on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. config LEDS_AMS_DELTA tristate "LED Support for the Amstrad Delta (E3)" depends on LEDS_CLASS depends on MACH_AMS_DELTA help This option enables support for the LEDs on Amstrad Delta (E3). config LEDS_NET48XX tristate "LED Support for Soekris net48xx series Error LED" depends on LEDS_CLASS Loading