ARM: mach-shmobile: kzm9g: add LCDC support
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 11 Apr 2012 03:58:33 +0000 (20:58 -0700)
committerRafael J. Wysocki <rjw@sisk.pl>
Sat, 12 May 2012 20:34:16 +0000 (22:34 +0200)
AS3711 chip initalization is required for enabling LCDC backlight,
but there is no driver for this chip.
So, this patch sends its settings when boot.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Simon Horman <horms@verge.net.au>
Acked-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
arch/arm/mach-shmobile/board-kzm9g.c

index f48db23..145341d 100644 (file)
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
+
+#include <linux/delay.h>
 #include <linux/gpio.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/platform_device.h>
 #include <linux/smsc911x.h>
 #include <linux/usb/r8a66597.h>
+#include <linux/videodev2.h>
 #include <mach/irqs.h>
 #include <mach/sh73a0.h>
 #include <mach/common.h>
@@ -29,6 +32,7 @@
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
+#include <video/sh_mobile_lcdc.h>
 
 /* SMSC 9221 */
 static struct resource smsc9221_resources[] = {
@@ -88,11 +92,119 @@ static struct platform_device usb_host_device = {
        .resource       = usb_resources,
 };
 
+/* LCDC */
+static struct fb_videomode kzm_lcdc_mode = {
+       .name           = "WVGA Panel",
+       .xres           = 800,
+       .yres           = 480,
+       .left_margin    = 220,
+       .right_margin   = 110,
+       .hsync_len      = 70,
+       .upper_margin   = 20,
+       .lower_margin   = 5,
+       .vsync_len      = 5,
+       .sync           = 0,
+};
+
+static struct sh_mobile_lcdc_info lcdc_info = {
+       .clock_source = LCDC_CLK_BUS,
+       .ch[0] = {
+               .chan           = LCDC_CHAN_MAINLCD,
+               .fourcc         = V4L2_PIX_FMT_RGB565,
+               .interface_type = RGB24,
+               .lcd_modes      = &kzm_lcdc_mode,
+               .num_modes      = 1,
+               .clock_divider  = 5,
+               .flags          = 0,
+               .panel_cfg = {
+                       .width  = 152,
+                       .height = 91,
+               },
+       }
+};
+
+static struct resource lcdc_resources[] = {
+       [0] = {
+               .name   = "LCDC",
+               .start  = 0xfe940000,
+               .end    = 0xfe943fff,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = intcs_evt2irq(0x580),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device lcdc_device = {
+       .name           = "sh_mobile_lcdc_fb",
+       .num_resources  = ARRAY_SIZE(lcdc_resources),
+       .resource       = lcdc_resources,
+       .dev    = {
+               .platform_data  = &lcdc_info,
+               .coherent_dma_mask = ~0,
+       },
+};
+
 static struct platform_device *kzm_devices[] __initdata = {
        &smsc_device,
        &usb_host_device,
+       &lcdc_device,
 };
 
+/*
+ * FIXME
+ *
+ * This is quick hack for enabling LCDC backlight
+ */
+static int __init as3711_enable_lcdc_backlight(void)
+{
+       struct i2c_adapter *a = i2c_get_adapter(0);
+       struct i2c_msg msg;
+       int i, ret;
+       __u8 magic[] = {
+               0x40, 0x2a,
+               0x43, 0x3c,
+               0x44, 0x3c,
+               0x45, 0x3c,
+               0x54, 0x03,
+               0x51, 0x00,
+               0x51, 0x01,
+               0xff, 0x00, /* wait */
+               0x43, 0xf0,
+               0x44, 0xf0,
+               0x45, 0xf0,
+       };
+
+       if (!machine_is_kzm9g())
+               return 0;
+
+       if (!a)
+               return 0;
+
+       msg.addr        = 0x40;
+       msg.len         = 2;
+       msg.flags       = 0;
+
+       for (i = 0; i < ARRAY_SIZE(magic); i += 2) {
+               msg.buf = magic + i;
+
+               if (0xff == msg.buf[0]) {
+                       udelay(500);
+                       continue;
+               }
+
+               ret = i2c_transfer(a, &msg, 1);
+               if (ret < 0) {
+                       pr_err("i2c transfer fail\n");
+                       break;
+               }
+       }
+
+       return 0;
+}
+device_initcall(as3711_enable_lcdc_backlight);
+
 static void __init kzm_init(void)
 {
        sh73a0_pinmux_init();
@@ -110,6 +222,37 @@ static void __init kzm_init(void)
        gpio_request(GPIO_PORT224, NULL); /* IRQ3 */
        gpio_direction_input(GPIO_PORT224);
 
+       /* LCDC */
+       gpio_request(GPIO_FN_LCDD23,    NULL);
+       gpio_request(GPIO_FN_LCDD22,    NULL);
+       gpio_request(GPIO_FN_LCDD21,    NULL);
+       gpio_request(GPIO_FN_LCDD20,    NULL);
+       gpio_request(GPIO_FN_LCDD19,    NULL);
+       gpio_request(GPIO_FN_LCDD18,    NULL);
+       gpio_request(GPIO_FN_LCDD17,    NULL);
+       gpio_request(GPIO_FN_LCDD16,    NULL);
+       gpio_request(GPIO_FN_LCDD15,    NULL);
+       gpio_request(GPIO_FN_LCDD14,    NULL);
+       gpio_request(GPIO_FN_LCDD13,    NULL);
+       gpio_request(GPIO_FN_LCDD12,    NULL);
+       gpio_request(GPIO_FN_LCDD11,    NULL);
+       gpio_request(GPIO_FN_LCDD10,    NULL);
+       gpio_request(GPIO_FN_LCDD9,     NULL);
+       gpio_request(GPIO_FN_LCDD8,     NULL);
+       gpio_request(GPIO_FN_LCDD7,     NULL);
+       gpio_request(GPIO_FN_LCDD6,     NULL);
+       gpio_request(GPIO_FN_LCDD5,     NULL);
+       gpio_request(GPIO_FN_LCDD4,     NULL);
+       gpio_request(GPIO_FN_LCDD3,     NULL);
+       gpio_request(GPIO_FN_LCDD2,     NULL);
+       gpio_request(GPIO_FN_LCDD1,     NULL);
+       gpio_request(GPIO_FN_LCDD0,     NULL);
+       gpio_request(GPIO_FN_LCDDISP,   NULL);
+       gpio_request(GPIO_FN_LCDDCK,    NULL);
+
+       gpio_request(GPIO_PORT222,      NULL);
+       gpio_direction_output(GPIO_PORT222, 1);
+
 #ifdef CONFIG_CACHE_L2X0
        /* Early BRESP enable, Shared attribute override enable, 64K*8way */
        l2x0_init(IOMEM(0xf0100000), 0x40460000, 0x82000fff);