dect
/
linux-2.6
Archived
13
0
Fork 0

Merge branch 'omap1' into ams-delta

This commit is contained in:
Tony Lindgren 2012-03-01 15:20:00 -08:00
commit 4239276214
10 changed files with 318 additions and 249 deletions

View File

@ -155,6 +155,8 @@ config MACH_AMS_DELTA
bool "Amstrad E3 (Delta)" bool "Amstrad E3 (Delta)"
depends on ARCH_OMAP1 && ARCH_OMAP15XX depends on ARCH_OMAP1 && ARCH_OMAP15XX
select FIQ select FIQ
select GPIO_GENERIC_PLATFORM
select LEDS_GPIO_REGISTER
help help
Support for the Amstrad E3 (codename Delta) videophone. Say Y here Support for the Amstrad E3 (codename Delta) videophone. Say Y here
if you have such a device. if you have such a device.

View File

@ -11,6 +11,7 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/basic_mmio_gpio.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
@ -40,9 +41,6 @@
#include <mach/ams-delta-fiq.h> #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[] = { static const unsigned int ams_delta_keymap[] = {
KEY(0, 0, KEY_F1), /* Advert */ KEY(0, 0, KEY_F1), /* Advert */
@ -121,39 +119,32 @@ static const unsigned int ams_delta_keymap[] = {
KEY(7, 3, KEY_LEFTCTRL), /* Vol down */ KEY(7, 3, KEY_LEFTCTRL), /* Vol down */
}; };
void ams_delta_latch1_write(u8 mask, u8 value) #define LATCH1_PHYS 0x01000000
{ #define LATCH1_VIRT 0xEA000000
ams_delta_latch1_reg &= ~mask; #define MODEM_PHYS 0x04000000
ams_delta_latch1_reg |= value; #define MODEM_VIRT 0xEB000000
*(volatile __u8 *) AMS_DELTA_LATCH1_VIRT = ams_delta_latch1_reg; #define LATCH2_PHYS 0x08000000
} #define LATCH2_VIRT 0xEC000000
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;
}
static struct map_desc ams_delta_io_desc[] __initdata = { static struct map_desc ams_delta_io_desc[] __initdata = {
/* AMS_DELTA_LATCH1 */ /* AMS_DELTA_LATCH1 */
{ {
.virtual = AMS_DELTA_LATCH1_VIRT, .virtual = LATCH1_VIRT,
.pfn = __phys_to_pfn(AMS_DELTA_LATCH1_PHYS), .pfn = __phys_to_pfn(LATCH1_PHYS),
.length = 0x01000000, .length = 0x01000000,
.type = MT_DEVICE .type = MT_DEVICE
}, },
/* AMS_DELTA_LATCH2 */ /* AMS_DELTA_LATCH2 */
{ {
.virtual = AMS_DELTA_LATCH2_VIRT, .virtual = LATCH2_VIRT,
.pfn = __phys_to_pfn(AMS_DELTA_LATCH2_PHYS), .pfn = __phys_to_pfn(LATCH2_PHYS),
.length = 0x01000000, .length = 0x01000000,
.type = MT_DEVICE .type = MT_DEVICE
}, },
/* AMS_DELTA_MODEM */ /* AMS_DELTA_MODEM */
{ {
.virtual = AMS_DELTA_MODEM_VIRT, .virtual = MODEM_VIRT,
.pfn = __phys_to_pfn(AMS_DELTA_MODEM_PHYS), .pfn = __phys_to_pfn(MODEM_PHYS),
.length = 0x01000000, .length = 0x01000000,
.type = MT_DEVICE .type = MT_DEVICE
} }
@ -173,6 +164,113 @@ static struct omap_board_config_kernel ams_delta_config[] __initdata = {
{ OMAP_TAG_LCD, &ams_delta_lcd_config }, { 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[] = { static struct resource ams_delta_nand_resources[] = {
[0] = { [0] = {
.start = OMAP1_MPUIO_BASE, .start = OMAP1_MPUIO_BASE,
@ -224,9 +322,45 @@ static struct platform_device ams_delta_lcd_device = {
.id = -1, .id = -1,
}; };
static struct platform_device ams_delta_led_device = { static struct gpio_led gpio_leds[] __initconst = {
.name = "ams-delta-led", {
.id = -1 .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[] = { static struct i2c_board_info ams_delta_camera_board_info[] = {
@ -275,13 +409,17 @@ static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
}; };
static struct platform_device *ams_delta_devices[] __initdata = { static struct platform_device *ams_delta_devices[] __initdata = {
&ams_delta_nand_device, &latch1_gpio_device,
&latch2_gpio_device,
&ams_delta_kp_device, &ams_delta_kp_device,
&ams_delta_lcd_device,
&ams_delta_led_device,
&ams_delta_camera_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) static void __init ams_delta_init(void)
{ {
/* mux pins for uarts */ /* mux pins for uarts */
@ -307,15 +445,13 @@ static void __init ams_delta_init(void)
omap_serial_init(); omap_serial_init();
omap_register_i2c_bus(1, 100, NULL, 0); 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_usb_init(&ams_delta_usb_config);
omap1_set_camera_info(&ams_delta_camera_platform_data); omap1_set_camera_info(&ams_delta_camera_platform_data);
#ifdef CONFIG_LEDS_TRIGGERS #ifdef CONFIG_LEDS_TRIGGERS
led_trigger_register_simple("ams_delta_camera", led_trigger_register_simple("ams_delta_camera",
&ams_delta_camera_led_trigger); &ams_delta_camera_led_trigger);
#endif #endif
gpio_led_register_device(-1, &leds_pdata);
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices)); platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
ams_delta_init_fiq(); ams_delta_init_fiq();
@ -325,8 +461,8 @@ static void __init ams_delta_init(void)
static struct plat_serial8250_port ams_delta_modem_ports[] = { static struct plat_serial8250_port ams_delta_modem_ports[] = {
{ {
.membase = IOMEM(AMS_DELTA_MODEM_VIRT), .membase = IOMEM(MODEM_VIRT),
.mapbase = AMS_DELTA_MODEM_PHYS, .mapbase = MODEM_PHYS,
.irq = -EINVAL, /* changed later */ .irq = -EINVAL, /* changed later */
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.irqflags = IRQF_TRIGGER_RISING, .irqflags = IRQF_TRIGGER_RISING,
@ -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; int err;
if (!machine_is_ams_delta()) if (!machine_is_ams_delta())
return -ENODEV; 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); omap_cfg_reg(M14_1510_GPIO2);
ams_delta_modem_ports[0].irq = ams_delta_modem_ports[0].irq =
gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ); gpio_to_irq(AMS_DELTA_GPIO_PIN_MODEM_IRQ);
@ -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,
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) static void __init ams_delta_map_io(void)
{ {
@ -388,6 +539,3 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
.timer = &omap1_timer, .timer = &omap1_timer,
.restart = omap1_restart, .restart = omap1_restart,
MACHINE_END MACHINE_END
EXPORT_SYMBOL(ams_delta_latch1_write);
EXPORT_SYMBOL(ams_delta_latch2_write);

View File

@ -28,30 +28,6 @@
#if defined (CONFIG_MACH_AMS_DELTA) #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_RSTIN 0x0400
#define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800 #define AMD_DELTA_LATCH2_SCARD_CMDVCC 0x0800
#define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000 #define AMS_DELTA_LATCH2_MODEM_NRESET 0x1000
@ -66,9 +42,29 @@
#define AMS_DELTA_GPIO_PIN_CONFIG 11 #define AMS_DELTA_GPIO_PIN_CONFIG 11
#define AMS_DELTA_GPIO_PIN_NAND_RB 12 #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__ #ifndef __ASSEMBLY__
void ams_delta_latch1_write(u8 mask, u8 value); void ams_delta_latch_write(int base, int ngpio, u16 mask, u16 value);
void ams_delta_latch2_write(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
#endif /* CONFIG_MACH_AMS_DELTA */ #endif /* CONFIG_MACH_AMS_DELTA */

View File

@ -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) static int ams_delta_serio_open(struct serio *serio)
{ {
/* enable keyboard */ /* enable keyboard */
ams_delta_latch2_write(AMD_DELTA_LATCH2_KEYBRD_PWR, gpio_set_value(AMS_DELTA_GPIO_PIN_KEYBRD_PWR, 1);
AMD_DELTA_LATCH2_KEYBRD_PWR);
return 0; return 0;
} }
@ -101,9 +100,32 @@ static int ams_delta_serio_open(struct serio *serio)
static void ams_delta_serio_close(struct serio *serio) static void ams_delta_serio_close(struct serio *serio)
{ {
/* disable keyboard */ /* 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) static int __init ams_delta_serio_init(void)
{ {
int err; int err;
@ -123,19 +145,12 @@ static int __init ams_delta_serio_init(void)
strlcpy(ams_delta_serio->phys, "GPIO/serio0", strlcpy(ams_delta_serio->phys, "GPIO/serio0",
sizeof(ams_delta_serio->phys)); 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) { 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; 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), err = request_irq(gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK),
ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING, ams_delta_serio_interrupt, IRQ_TYPE_EDGE_RISING,
@ -143,7 +158,7 @@ static int __init ams_delta_serio_init(void)
if (err < 0) { if (err < 0) {
pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n", pr_err("ams_delta_serio: couldn't request gpio interrupt %d\n",
gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK)); gpio_to_irq(AMS_DELTA_GPIO_PIN_KEYBRD_CLK));
goto gpio_clk; goto gpio;
} }
/* /*
* Since GPIO register handling for keyboard clock pin is performed * Since GPIO register handling for keyboard clock pin is performed
@ -157,10 +172,9 @@ static int __init ams_delta_serio_init(void)
dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name); dev_info(&ams_delta_serio->dev, "%s\n", ams_delta_serio->name);
return 0; return 0;
gpio_clk: gpio:
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_free_array(ams_delta_gpios,
gpio_data: ARRAY_SIZE(ams_delta_gpios));
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA);
serio: serio:
kfree(ams_delta_serio); kfree(ams_delta_serio);
return err; return err;
@ -171,7 +185,7 @@ static void __exit ams_delta_serio_exit(void)
{ {
serio_unregister_port(ams_delta_serio); serio_unregister_port(ams_delta_serio);
free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0); free_irq(OMAP_GPIO_IRQ(AMS_DELTA_GPIO_PIN_KEYBRD_CLK), 0);
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_CLK); gpio_free_array(ams_delta_gpios,
gpio_free(AMS_DELTA_GPIO_PIN_KEYBRD_DATA); ARRAY_SIZE(ams_delta_gpios));
} }
module_exit(ams_delta_serio_exit); module_exit(ams_delta_serio_exit);

View File

@ -74,13 +74,6 @@ config LEDS_S3C24XX
This option enables support for LEDs connected to GPIO lines This option enables support for LEDs connected to GPIO lines
on Samsung S3C24XX series CPUs, such as the S3C2410 and S3C2440. 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 config LEDS_NET48XX
tristate "LED Support for Soekris net48xx series Error LED" tristate "LED Support for Soekris net48xx series Error LED"
depends on LEDS_CLASS depends on LEDS_CLASS

View File

@ -12,7 +12,6 @@ obj-$(CONFIG_LEDS_LOCOMO) += leds-locomo.o
obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o obj-$(CONFIG_LEDS_LM3530) += leds-lm3530.o
obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o obj-$(CONFIG_LEDS_MIKROTIK_RB532) += leds-rb532.o
obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o obj-$(CONFIG_LEDS_S3C24XX) += leds-s3c24xx.o
obj-$(CONFIG_LEDS_AMS_DELTA) += leds-ams-delta.o
obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o obj-$(CONFIG_LEDS_NET48XX) += leds-net48xx.o
obj-$(CONFIG_LEDS_NET5501) += leds-net5501.o obj-$(CONFIG_LEDS_NET5501) += leds-net5501.o
obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o obj-$(CONFIG_LEDS_WRAP) += leds-wrap.o

View File

@ -1,126 +0,0 @@
/*
* LEDs driver for Amstrad Delta (E3)
*
* Copyright (C) 2006 Jonathan McDowell <noodles@earth.li>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <plat/board-ams-delta.h>
/*
* Our context
*/
struct ams_delta_led {
struct led_classdev cdev;
u8 bitmask;
};
static void ams_delta_led_set(struct led_classdev *led_cdev,
enum led_brightness value)
{
struct ams_delta_led *led_dev =
container_of(led_cdev, struct ams_delta_led, cdev);
if (value)
ams_delta_latch1_write(led_dev->bitmask, led_dev->bitmask);
else
ams_delta_latch1_write(led_dev->bitmask, 0);
}
static struct ams_delta_led ams_delta_leds[] = {
{
.cdev = {
.name = "ams-delta::camera",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_CAMERA,
},
{
.cdev = {
.name = "ams-delta::advert",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_ADVERT,
},
{
.cdev = {
.name = "ams-delta::email",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_EMAIL,
},
{
.cdev = {
.name = "ams-delta::handsfree",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_HANDSFREE,
},
{
.cdev = {
.name = "ams-delta::voicemail",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_VOICEMAIL,
},
{
.cdev = {
.name = "ams-delta::voice",
.brightness_set = ams_delta_led_set,
},
.bitmask = AMS_DELTA_LATCH1_LED_VOICE,
},
};
static int ams_delta_led_probe(struct platform_device *pdev)
{
int i, ret;
for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++) {
ams_delta_leds[i].cdev.flags |= LED_CORE_SUSPENDRESUME;
ret = led_classdev_register(&pdev->dev,
&ams_delta_leds[i].cdev);
if (ret < 0)
goto fail;
}
return 0;
fail:
while (--i >= 0)
led_classdev_unregister(&ams_delta_leds[i].cdev);
return ret;
}
static int ams_delta_led_remove(struct platform_device *pdev)
{
int i;
for (i = 0; i < ARRAY_SIZE(ams_delta_leds); i++)
led_classdev_unregister(&ams_delta_leds[i].cdev);
return 0;
}
static struct platform_driver ams_delta_led_driver = {
.probe = ams_delta_led_probe,
.remove = ams_delta_led_remove,
.driver = {
.name = "ams-delta-led",
.owner = THIS_MODULE,
},
};
module_platform_driver(ams_delta_led_driver);
MODULE_AUTHOR("Jonathan McDowell <noodles@earth.li>");
MODULE_DESCRIPTION("Amstrad Delta LED driver");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:ams-delta-led");

View File

@ -26,7 +26,7 @@
#include <asm/io.h> #include <asm/io.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/sizes.h> #include <asm/sizes.h>
#include <asm/gpio.h> #include <linux/gpio.h>
#include <plat/board-ams-delta.h> #include <plat/board-ams-delta.h>
/* /*
@ -34,8 +34,6 @@
*/ */
static struct mtd_info *ams_delta_mtd = NULL; static struct mtd_info *ams_delta_mtd = NULL;
#define NAND_MASK (AMS_DELTA_LATCH2_NAND_NRE | AMS_DELTA_LATCH2_NAND_NWE | AMS_DELTA_LATCH2_NAND_CLE | AMS_DELTA_LATCH2_NAND_ALE | AMS_DELTA_LATCH2_NAND_NCE | AMS_DELTA_LATCH2_NAND_NWP)
/* /*
* Define partitions for flash devices * Define partitions for flash devices
*/ */
@ -68,10 +66,9 @@ static void ams_delta_write_byte(struct mtd_info *mtd, u_char byte)
writew(0, io_base + OMAP_MPUIO_IO_CNTL); writew(0, io_base + OMAP_MPUIO_IO_CNTL);
writew(byte, this->IO_ADDR_W); writew(byte, this->IO_ADDR_W);
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 0);
ndelay(40); ndelay(40);
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NWE, gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NWE, 1);
AMS_DELTA_LATCH2_NAND_NWE);
} }
static u_char ams_delta_read_byte(struct mtd_info *mtd) static u_char ams_delta_read_byte(struct mtd_info *mtd)
@ -80,12 +77,11 @@ static u_char ams_delta_read_byte(struct mtd_info *mtd)
struct nand_chip *this = mtd->priv; struct nand_chip *this = mtd->priv;
void __iomem *io_base = this->priv; void __iomem *io_base = this->priv;
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 0);
ndelay(40); ndelay(40);
writew(~0, io_base + OMAP_MPUIO_IO_CNTL); writew(~0, io_base + OMAP_MPUIO_IO_CNTL);
res = readw(this->IO_ADDR_R); res = readw(this->IO_ADDR_R);
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_NRE, gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NRE, 1);
AMS_DELTA_LATCH2_NAND_NRE);
return res; return res;
} }
@ -132,15 +128,12 @@ static void ams_delta_hwcontrol(struct mtd_info *mtd, int cmd,
{ {
if (ctrl & NAND_CTRL_CHANGE) { if (ctrl & NAND_CTRL_CHANGE) {
unsigned long bits; gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_NCE,
(ctrl & NAND_NCE) == 0);
bits = (~ctrl & NAND_NCE) ? AMS_DELTA_LATCH2_NAND_NCE : 0; gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_CLE,
bits |= (ctrl & NAND_CLE) ? AMS_DELTA_LATCH2_NAND_CLE : 0; (ctrl & NAND_CLE) != 0);
bits |= (ctrl & NAND_ALE) ? AMS_DELTA_LATCH2_NAND_ALE : 0; gpio_set_value(AMS_DELTA_GPIO_PIN_NAND_ALE,
(ctrl & NAND_ALE) != 0);
ams_delta_latch2_write(AMS_DELTA_LATCH2_NAND_CLE |
AMS_DELTA_LATCH2_NAND_ALE |
AMS_DELTA_LATCH2_NAND_NCE, bits);
} }
if (cmd != NAND_CMD_NONE) if (cmd != NAND_CMD_NONE)
@ -152,6 +145,39 @@ static int ams_delta_nand_ready(struct mtd_info *mtd)
return gpio_get_value(AMS_DELTA_GPIO_PIN_NAND_RB); return gpio_get_value(AMS_DELTA_GPIO_PIN_NAND_RB);
} }
static struct gpio _mandatory_gpio[] __initconst_or_module = {
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_NCE,
.flags = GPIOF_OUT_INIT_HIGH,
.label = "nand_nce",
},
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_NRE,
.flags = GPIOF_OUT_INIT_HIGH,
.label = "nand_nre",
},
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_NWP,
.flags = GPIOF_OUT_INIT_HIGH,
.label = "nand_nwp",
},
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_NWE,
.flags = GPIOF_OUT_INIT_HIGH,
.label = "nand_nwe",
},
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_ALE,
.flags = GPIOF_OUT_INIT_LOW,
.label = "nand_ale",
},
{
.gpio = AMS_DELTA_GPIO_PIN_NAND_CLE,
.flags = GPIOF_OUT_INIT_LOW,
.label = "nand_cle",
},
};
/* /*
* Main initialization routine * Main initialization routine
*/ */
@ -223,10 +249,9 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
platform_set_drvdata(pdev, io_base); platform_set_drvdata(pdev, io_base);
/* Set chip enabled, but */ /* Set chip enabled, but */
ams_delta_latch2_write(NAND_MASK, AMS_DELTA_LATCH2_NAND_NRE | err = gpio_request_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
AMS_DELTA_LATCH2_NAND_NWE | if (err)
AMS_DELTA_LATCH2_NAND_NCE | goto out_gpio;
AMS_DELTA_LATCH2_NAND_NWP);
/* Scan to find existence of the device */ /* Scan to find existence of the device */
if (nand_scan(ams_delta_mtd, 1)) { if (nand_scan(ams_delta_mtd, 1)) {
@ -241,7 +266,10 @@ static int __devinit ams_delta_init(struct platform_device *pdev)
goto out; goto out;
out_mtd: out_mtd:
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
out_gpio:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
iounmap(io_base); iounmap(io_base);
out_release_io: out_release_io:
release_mem_region(res->start, resource_size(res)); release_mem_region(res->start, resource_size(res));
@ -262,6 +290,8 @@ static int __devexit ams_delta_cleanup(struct platform_device *pdev)
/* Release resources, unregister device */ /* Release resources, unregister device */
nand_release(ams_delta_mtd); nand_release(ams_delta_mtd);
gpio_free_array(_mandatory_gpio, ARRAY_SIZE(_mandatory_gpio));
gpio_free(AMS_DELTA_GPIO_PIN_NAND_RB);
iounmap(io_base); iounmap(io_base);
release_mem_region(res->start, resource_size(res)); release_mem_region(res->start, resource_size(res));

View File

@ -25,6 +25,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/lcd.h> #include <linux/lcd.h>
#include <linux/gpio.h>
#include <plat/board-ams-delta.h> #include <plat/board-ams-delta.h>
#include <mach/hardware.h> #include <mach/hardware.h>
@ -98,29 +99,41 @@ static struct lcd_ops ams_delta_lcd_ops = {
/* omapfb panel section */ /* omapfb panel section */
static struct gpio _gpios[] __initconst_or_module = {
{
.gpio = AMS_DELTA_GPIO_PIN_LCD_VBLEN,
.flags = GPIOF_OUT_INIT_LOW,
.label = "lcd_vblen",
},
{
.gpio = AMS_DELTA_GPIO_PIN_LCD_NDISP,
.flags = GPIOF_OUT_INIT_LOW,
.label = "lcd_ndisp",
},
};
static int ams_delta_panel_init(struct lcd_panel *panel, static int ams_delta_panel_init(struct lcd_panel *panel,
struct omapfb_device *fbdev) struct omapfb_device *fbdev)
{ {
return 0; return gpio_request_array(_gpios, ARRAY_SIZE(_gpios));
} }
static void ams_delta_panel_cleanup(struct lcd_panel *panel) static void ams_delta_panel_cleanup(struct lcd_panel *panel)
{ {
gpio_free_array(_gpios, ARRAY_SIZE(_gpios));
} }
static int ams_delta_panel_enable(struct lcd_panel *panel) static int ams_delta_panel_enable(struct lcd_panel *panel)
{ {
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 1);
AMS_DELTA_LATCH2_LCD_NDISP); gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 1);
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN,
AMS_DELTA_LATCH2_LCD_VBLEN);
return 0; return 0;
} }
static void ams_delta_panel_disable(struct lcd_panel *panel) static void ams_delta_panel_disable(struct lcd_panel *panel)
{ {
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_VBLEN, 0);
ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_NDISP, 0); gpio_set_value(AMS_DELTA_GPIO_PIN_LCD_NDISP, 0);
} }
static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel) static unsigned long ams_delta_panel_get_caps(struct lcd_panel *panel)

View File

@ -635,7 +635,7 @@ err:
platform_device_put(ams_delta_audio_platform_device); platform_device_put(ams_delta_audio_platform_device);
return ret; return ret;
} }
module_init(ams_delta_module_init); late_initcall(ams_delta_module_init);
static void __exit ams_delta_module_exit(void) static void __exit ams_delta_module_exit(void)
{ {