[ARM] 5094/1: pcm990: Add framebuffer and backlight support
authorGuennadi Liakhovetski <lg@denx.de>
Fri, 13 Jun 2008 10:50:44 +0000 (11:50 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Thu, 3 Jul 2008 12:25:09 +0000 (13:25 +0100)
PCM990 boards can be assembled with either a Sharp STN or a NEC TFT LCD. This
patch adds support for these displays and for the backlight, using the pwm_bl
driver.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@pengutronix.de>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/pcm990-baseboard.c

index 7db0fd8..03cbd0f 100644 (file)
@@ -149,6 +149,22 @@ choice
 
 config MACH_PCM990_BASEBOARD
        bool "PHYTEC PCM-990 development board"
+       select HAVE_PWM
+
+endchoice
+
+choice
+       prompt "display on pcm990"
+       depends on MACH_PCM990_BASEBOARD
+
+config PCM990_DISPLAY_SHARP
+       bool "sharp lq084v1dg21 stn display"
+
+config PCM990_DISPLAY_NEC
+       bool "nec nl6448bc20_18d tft display"
+
+config PCM990_DISPLAY_NONE
+       bool "no display"
 
 endchoice
 
index 49d951d..2564e16 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/platform_device.h>
 #include <linux/ide.h>
 #include <linux/i2c.h>
+#include <linux/pwm_backlight.h>
 
 #include <media/soc_camera.h>
 
 #include <asm/arch/mmc.h>
 #include <asm/arch/ohci.h>
 #include <asm/arch/pcm990_baseboard.h>
+#include <asm/arch/pxafb.h>
+
+#include "devices.h"
+
+/*
+ * pcm990_lcd_power - control power supply to the LCD
+ * @on: 0 = switch off, 1 = switch on
+ *
+ * Called by the pxafb driver
+ */
+#ifndef CONFIG_PCM990_DISPLAY_NONE
+static void pcm990_lcd_power(int on, struct fb_var_screeninfo *var)
+{
+       if (on) {
+               /* enable LCD-Latches
+                * power on LCD
+                */
+               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) =
+                       PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON;
+       } else {
+               /* disable LCD-Latches
+                * power off LCD
+                */
+               __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = 0x00;
+       }
+}
+#endif
+
+#if defined(CONFIG_PCM990_DISPLAY_SHARP)
+static struct pxafb_mode_info fb_info_sharp_lq084v1dg21 = {
+       .pixclock               = 28000,
+       .xres                   = 640,
+       .yres                   = 480,
+       .bpp                    = 16,
+       .hsync_len              = 20,
+       .left_margin            = 103,
+       .right_margin           = 47,
+       .vsync_len              = 6,
+       .upper_margin           = 28,
+       .lower_margin           = 5,
+       .sync                   = 0,
+       .cmap_greyscale         = 0,
+};
+
+static struct pxafb_mach_info pcm990_fbinfo __initdata = {
+       .modes                  = &fb_info_sharp_lq084v1dg21,
+       .num_modes              = 1,
+       .lccr0                  = LCCR0_PAS,
+       .lccr3                  = LCCR3_PCP,
+       .pxafb_lcd_power        = pcm990_lcd_power,
+};
+#elif defined(CONFIG_PCM990_DISPLAY_NEC)
+struct pxafb_mode_info fb_info_nec_nl6448bc20_18d = {
+       .pixclock               = 39720,
+       .xres                   = 640,
+       .yres                   = 480,
+       .bpp                    = 16,
+       .hsync_len              = 32,
+       .left_margin            = 16,
+       .right_margin           = 48,
+       .vsync_len              = 2,
+       .upper_margin           = 12,
+       .lower_margin           = 17,
+       .sync                   = 0,
+       .cmap_greyscale         = 0,
+};
+
+static struct pxafb_mach_info pcm990_fbinfo __initdata = {
+       .modes                  = &fb_info_nec_nl6448bc20_18d,
+       .num_modes              = 1,
+       .lccr0                  = LCCR0_Act,
+       .lccr3                  = LCCR3_PixFlEdg,
+       .pxafb_lcd_power        = pcm990_lcd_power,
+};
+#endif
+
+static struct platform_pwm_backlight_data pcm990_backlight_data = {
+       .pwm_id         = 0,
+       .max_brightness = 1023,
+       .dft_brightness = 1023,
+       .pwm_period_ns  = 78770,
+};
+
+static struct platform_device pcm990_backlight_device = {
+       .name           = "pwm-backlight",
+       .dev            = {
+               .parent = &pxa27x_device_pwm0.dev,
+               .platform_data = &pcm990_backlight_data,
+       },
+};
 
 /*
- * The PCM-990 development baseboard uses PCM-027's hardeware in the
+ * The PCM-990 development baseboard uses PCM-027's hardware in the
  * following way:
  *
  * - LCD support is in use
@@ -393,6 +484,12 @@ void __init pcm990_baseboard_init(void)
        /* register CPLD's IRQ controller */
        pcm990_init_irq();
 
+#ifndef CONFIG_PCM990_DISPLAY_NONE
+       set_pxa_fb_info(&pcm990_fbinfo);
+#endif
+       pxa_gpio_mode(GPIO16_PWM0_MD);
+       platform_device_register(&pcm990_backlight_device);
+
        platform_device_register(&pxa27x_device_ac97);
 
        /* MMC */