[E3-hacking] [PATCH 1/3] Add backlight support for Amstrad Delta

Jonathan McDowell noodles at earth.li
Sun Apr 2 17:36:14 BST 2006


This patch adds support for the Amstrad Delta LCD backlight. It's the
first patch in a series of 3 enabling full LCD support for the Delta and
is the least intrusive, allowing control of the backlight through the
existing backlight class infrastructure.

Signed-Off-By: Jonathan McDowell <noodles at earth.li>

diff --git a/arch/arm/configs/ams_delta_defconfig b/arch/arm/configs/ams_delta_defconfig
index 03f02dd..7cc0727 100644
--- a/arch/arm/configs/ams_delta_defconfig
+++ b/arch/arm/configs/ams_delta_defconfig
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
 # Linux kernel version: 2.6.16-omap1
-# Wed Mar 22 10:53:48 2006
+# Sun Apr  2 16:00:11 2006
 #
 CONFIG_ARM=y
 CONFIG_MMU=y
@@ -623,13 +623,44 @@ CONFIG_I2C_OMAP=y
 #
 # Graphics support
 #
-# CONFIG_FB is not set
+CONFIG_FB=y
+# CONFIG_FB_CFB_FILLRECT is not set
+# CONFIG_FB_CFB_COPYAREA is not set
+# CONFIG_FB_CFB_IMAGEBLIT is not set
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_OMAP=y
+# CONFIG_FB_OMAP_LCDC_EXTERNAL is not set
+# CONFIG_FB_OMAP_LCD_LPH8923 is not set
+# CONFIG_FB_OMAP_BOOTLOADER_INIT is not set
+# CONFIG_FB_OMAP_DMA_TUNE is not set
+# CONFIG_FB_VIRTUAL is not set
 
 #
 # Console display driver support
 #
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+CONFIG_LOGO=y
+# CONFIG_LOGO_LINUX_MONO is not set
+# CONFIG_LOGO_LINUX_VGA16 is not set
+CONFIG_LOGO_LINUX_CLUT224=y
+CONFIG_BACKLIGHT_LCD_SUPPORT=y
+CONFIG_BACKLIGHT_CLASS_DEVICE=y
+CONFIG_BACKLIGHT_DEVICE=y
+# CONFIG_LCD_CLASS_DEVICE is not set
+CONFIG_BACKLIGHT_AMS_DELTA=y
 
 #
 # Sound
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c
index 6178f04..7475587 100644
--- a/arch/arm/mach-omap1/board-ams-delta.c
+++ b/arch/arm/mach-omap1/board-ams-delta.c
@@ -84,6 +84,15 @@ static struct omap_board_config_kernel a
 	{ OMAP_TAG_UART,	&ams_delta_uart_config },
 };
 
+static struct platform_device ams_delta_bl_device = {
+	.name	= "ams-delta-bl",
+	.id	= -1,
+};
+
+static struct platform_device *ams_delta_devices[] __initdata = {
+	&ams_delta_bl_device,
+};
+
 static void __init ams_delta_init(void)
 {
 	iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
@@ -94,6 +103,8 @@ static void __init ams_delta_init(void)
 
 	/* Clear latch2 (NAND, LCD, modem enable) */
 	ams_delta_latch2_write(~0, 0);
+
+	platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
 }
 
 static void __init ams_delta_map_io(void)
diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig
index 9d996f2..5f02b00 100644
--- a/drivers/video/backlight/Kconfig
+++ b/drivers/video/backlight/Kconfig
@@ -42,6 +42,14 @@ config LCD_DEVICE
 	depends on LCD_CLASS_DEVICE
 	default y
 
+config BACKLIGHT_AMS_DELTA
+	tristate "Amstrad Delta (E3) backlight driver"
+	depends on BACKLIGHT_DEVICE && MACH_AMS_DELTA
+	default y
+	help
+	  If you have an Amstrad Delta (E3) videophone, say y to enable
+	  the backlight driver.
+
 config BACKLIGHT_CORGI
 	tristate "Sharp Corgi Backlight Driver (SL-C7xx Series)"
 	depends on BACKLIGHT_DEVICE && PXA_SHARPSL
diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile
index 744210c..2a793ea 100644
--- a/drivers/video/backlight/Makefile
+++ b/drivers/video/backlight/Makefile
@@ -1,6 +1,7 @@
 # Backlight & LCD drivers
 
 obj-$(CONFIG_LCD_CLASS_DEVICE)     += lcd.o
+obj-$(CONFIG_BACKLIGHT_AMS_DELTA) += ams_delta_bl.o
 obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
 obj-$(CONFIG_BACKLIGHT_CORGI)	+= corgi_bl.o
 obj-$(CONFIG_BACKLIGHT_HP680)	+= hp680_bl.o
diff --git a/drivers/video/backlight/ams_delta_bl.c b/drivers/video/backlight/ams_delta_bl.c
new file mode 100644
index 0000000..6b84744
--- /dev/null
+++ b/drivers/video/backlight/ams_delta_bl.c
@@ -0,0 +1,172 @@
+/*
+ * Backlight driver for Amstrad E3 (Delta) videophone.
+ *
+ * Copyright (C) 2006 Jonathan McDowell <noodles at earth.li>
+ *
+ * Based on Richard Purdie's Corgi driver.
+ *
+ * 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/fb.h>
+#include <linux/backlight.h>
+#include <linux/platform_device.h>
+
+#include <asm/arch/omap16xx.h>
+#include <asm/arch/board-ams-delta.h>
+
+#define AMS_DELTA_DEFAULT_INTENSITY	112
+#define AMS_DELTA_MAX_INTENSITY		255
+
+static int ams_delta_bl_powermode = FB_BLANK_UNBLANK;
+static int current_intensity = 0;
+
+static void ams_delta_bl_send_intensity(int intensity)
+{
+	if (ams_delta_bl_powermode != FB_BLANK_UNBLANK) {
+		intensity = 0;
+	}
+
+	omap_writeb(intensity, OMAP16XX_PWL_ENABLE);
+}
+
+static void ams_delta_bl_blank(int blank)
+{
+	switch(blank) {
+
+	case FB_BLANK_NORMAL:
+	case FB_BLANK_VSYNC_SUSPEND:
+	case FB_BLANK_HSYNC_SUSPEND:
+	case FB_BLANK_POWERDOWN:
+		if (ams_delta_bl_powermode == FB_BLANK_UNBLANK) {
+			ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0);
+			ams_delta_bl_send_intensity(0);
+			ams_delta_bl_powermode = blank;
+		}
+		break;
+	case FB_BLANK_UNBLANK:
+		if (ams_delta_bl_powermode != FB_BLANK_UNBLANK) {
+			ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN,
+				AMS_DELTA_LATCH2_LCD_VBLEN);
+			ams_delta_bl_powermode = blank;
+			ams_delta_bl_send_intensity(current_intensity);
+		}
+		break;
+	}
+}
+
+#ifdef CONFIG_PM
+static int ams_delta_bl_suspend(struct platform_device *dev, pm_message_t state)
+{
+	ams_delta_bl_blank(FB_BLANK_POWERDOWN);
+	return 0;
+}
+
+static int ams_delta_bl_resume(struct platform_device *dev)
+{
+	ams_delta_bl_blank(FB_BLANK_UNBLANK);
+	return 0;
+}
+#else
+#define ams_delta_bl_suspend	NULL
+#define ams_delta_bl_resume	NULL
+#endif
+
+
+static int ams_delta_bl_set_power(struct backlight_device *bd, int state)
+{
+	ams_delta_bl_blank(state);
+	return 0;
+}
+
+static int ams_delta_bl_get_power(struct backlight_device *bd)
+{
+	return ams_delta_bl_powermode;
+}
+
+static int ams_delta_bl_set_intensity(struct backlight_device *bd,
+		int intensity)
+{
+	if (intensity > AMS_DELTA_MAX_INTENSITY)
+		intensity = AMS_DELTA_MAX_INTENSITY;
+	ams_delta_bl_send_intensity(intensity);
+	current_intensity = intensity;
+	return 0;
+}
+
+static int ams_delta_bl_get_intensity(struct backlight_device *bd)
+{
+	return current_intensity;
+}
+
+static struct backlight_properties ams_delta_bl_data = {
+	.owner		= THIS_MODULE,
+	.get_power      = ams_delta_bl_get_power,
+	.set_power      = ams_delta_bl_set_power,
+	.max_brightness = AMS_DELTA_MAX_INTENSITY,
+	.get_brightness = ams_delta_bl_get_intensity,
+	.set_brightness = ams_delta_bl_set_intensity,
+};
+
+static struct backlight_device *ams_delta_backlight_device;
+
+static int __init ams_delta_bl_probe(struct platform_device *pdev)
+{
+	ams_delta_backlight_device = backlight_device_register("ams-delta-bl",
+			NULL, &ams_delta_bl_data);
+	if (IS_ERR(ams_delta_backlight_device))
+		return PTR_ERR(ams_delta_backlight_device);
+
+	omap_writeb(1, OMAP16XX_PWL_CLK_ENABLE);
+	ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN,
+			AMS_DELTA_LATCH2_LCD_VBLEN);
+	ams_delta_bl_set_intensity(NULL, AMS_DELTA_DEFAULT_INTENSITY);
+
+	printk("Amstrad Delta backlight driver initialized.\n");
+	return 0;
+}
+
+static int ams_delta_bl_remove(struct platform_device *dev)
+{
+	backlight_device_unregister(ams_delta_backlight_device);
+
+	ams_delta_bl_set_intensity(NULL, 0);
+	omap_writeb(0, OMAP16XX_PWL_CLK_ENABLE);
+	ams_delta_latch2_write(AMS_DELTA_LATCH2_LCD_VBLEN, 0);
+
+	printk("Amstrad Delta backlight driver unloaded\n");
+	return 0;
+}
+
+static struct platform_driver ams_delta_bl_driver = {
+	.probe		= ams_delta_bl_probe,
+	.remove		= ams_delta_bl_remove,
+	.suspend	= ams_delta_bl_suspend,
+	.resume		= ams_delta_bl_resume,
+	.driver		= {
+		.name	= "ams-delta-bl",
+	},
+};
+
+static int __init ams_delta_bl_init(void)
+{
+	return platform_driver_register(&ams_delta_bl_driver);
+}
+
+static void __exit ams_delta_bl_exit(void)
+{
+	platform_driver_unregister(&ams_delta_bl_driver);
+}
+
+module_init(ams_delta_bl_init);
+module_exit(ams_delta_bl_exit);
+
+MODULE_AUTHOR("Jonathan McDowell <noodles at earth.li>");
+MODULE_DESCRIPTION("Amstrad Delta backlight driver");
+MODULE_LICENSE("GPLv2");



More information about the e3-hacking mailing list