|
@@ -34,9 +34,10 @@
|
|
|
#include <linux/input/sh_keysc.h>
|
|
|
#include <linux/mmc/host.h>
|
|
|
#include <linux/mmc/sh_mmcif.h>
|
|
|
-
|
|
|
+#include <linux/sh_clk.h>
|
|
|
+#include <video/sh_mobile_lcdc.h>
|
|
|
+#include <video/sh_mipi_dsi.h>
|
|
|
#include <sound/sh_fsi.h>
|
|
|
-
|
|
|
#include <mach/hardware.h>
|
|
|
#include <mach/sh73a0.h>
|
|
|
#include <mach/common.h>
|
|
@@ -203,12 +204,145 @@ static struct platform_device irda_device = {
|
|
|
.num_resources = ARRAY_SIZE(irda_resources),
|
|
|
};
|
|
|
|
|
|
+static unsigned char lcd_backlight_seq[3][2] = {
|
|
|
+ { 0x04, 0x07 },
|
|
|
+ { 0x23, 0x80 },
|
|
|
+ { 0x03, 0x01 },
|
|
|
+};
|
|
|
+
|
|
|
+static void lcd_backlight_on(void)
|
|
|
+{
|
|
|
+ struct i2c_adapter *a;
|
|
|
+ struct i2c_msg msg;
|
|
|
+ int k;
|
|
|
+
|
|
|
+ a = i2c_get_adapter(1);
|
|
|
+ for (k = 0; a && k < 3; k++) {
|
|
|
+ msg.addr = 0x6d;
|
|
|
+ msg.buf = &lcd_backlight_seq[k][0];
|
|
|
+ msg.len = 2;
|
|
|
+ msg.flags = 0;
|
|
|
+ if (i2c_transfer(a, &msg, 1) != 1)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void lcd_backlight_reset(void)
|
|
|
+{
|
|
|
+ gpio_set_value(GPIO_PORT235, 0);
|
|
|
+ mdelay(24);
|
|
|
+ gpio_set_value(GPIO_PORT235, 1);
|
|
|
+}
|
|
|
+
|
|
|
+static void lcd_on(void *board_data, struct fb_info *info)
|
|
|
+{
|
|
|
+ lcd_backlight_on();
|
|
|
+}
|
|
|
+
|
|
|
+static void lcd_off(void *board_data)
|
|
|
+{
|
|
|
+ lcd_backlight_reset();
|
|
|
+}
|
|
|
+
|
|
|
+/* LCDC0 */
|
|
|
+static const struct fb_videomode lcdc0_modes[] = {
|
|
|
+ {
|
|
|
+ .name = "R63302(QHD)",
|
|
|
+ .xres = 544,
|
|
|
+ .yres = 961,
|
|
|
+ .left_margin = 72,
|
|
|
+ .right_margin = 600,
|
|
|
+ .hsync_len = 16,
|
|
|
+ .upper_margin = 8,
|
|
|
+ .lower_margin = 8,
|
|
|
+ .vsync_len = 2,
|
|
|
+ .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_mobile_lcdc_info lcdc0_info = {
|
|
|
+ .clock_source = LCDC_CLK_PERIPHERAL,
|
|
|
+ .ch[0] = {
|
|
|
+ .chan = LCDC_CHAN_MAINLCD,
|
|
|
+ .interface_type = RGB24,
|
|
|
+ .clock_divider = 1,
|
|
|
+ .flags = LCDC_FLAGS_DWPOL,
|
|
|
+ .lcd_size_cfg.width = 44,
|
|
|
+ .lcd_size_cfg.height = 79,
|
|
|
+ .bpp = 16,
|
|
|
+ .lcd_cfg = lcdc0_modes,
|
|
|
+ .num_cfg = ARRAY_SIZE(lcdc0_modes),
|
|
|
+ .board_cfg = {
|
|
|
+ .display_on = lcd_on,
|
|
|
+ .display_off = lcd_off,
|
|
|
+ },
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource lcdc0_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .name = "LCDC0",
|
|
|
+ .start = 0xfe940000, /* P4-only space */
|
|
|
+ .end = 0xfe943fff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = intcs_evt2irq(0x580),
|
|
|
+ .flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device lcdc0_device = {
|
|
|
+ .name = "sh_mobile_lcdc_fb",
|
|
|
+ .num_resources = ARRAY_SIZE(lcdc0_resources),
|
|
|
+ .resource = lcdc0_resources,
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &lcdc0_info,
|
|
|
+ .coherent_dma_mask = ~0,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+/* MIPI-DSI */
|
|
|
+static struct resource mipidsi0_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .start = 0xfeab0000,
|
|
|
+ .end = 0xfeab3fff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = 0xfeab4000,
|
|
|
+ .end = 0xfeab7fff,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct sh_mipi_dsi_info mipidsi0_info = {
|
|
|
+ .data_format = MIPI_RGB888,
|
|
|
+ .lcd_chan = &lcdc0_info.ch[0],
|
|
|
+ .vsynw_offset = 20,
|
|
|
+ .clksrc = 1,
|
|
|
+ .flags = SH_MIPI_DSI_HSABM,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device mipidsi0_device = {
|
|
|
+ .name = "sh-mipi-dsi",
|
|
|
+ .num_resources = ARRAY_SIZE(mipidsi0_resources),
|
|
|
+ .resource = mipidsi0_resources,
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &mipidsi0_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
static struct platform_device *ag5evm_devices[] __initdata = {
|
|
|
ð_device,
|
|
|
&keysc_device,
|
|
|
&fsi_device,
|
|
|
&mmc_device,
|
|
|
&irda_device,
|
|
|
+ &lcdc0_device,
|
|
|
+ &mipidsi0_device,
|
|
|
};
|
|
|
|
|
|
static struct map_desc ag5evm_io_desc[] __initdata = {
|
|
@@ -245,6 +379,8 @@ void __init ag5evm_init_irq(void)
|
|
|
__raw_writew(__raw_readw(PINTCR0A) | (2<<10), PINTCR0A);
|
|
|
}
|
|
|
|
|
|
+#define DSI0PHYCR 0xe615006c
|
|
|
+
|
|
|
static void __init ag5evm_init(void)
|
|
|
{
|
|
|
sh73a0_pinmux_init();
|
|
@@ -313,6 +449,20 @@ static void __init ag5evm_init(void)
|
|
|
gpio_request(GPIO_FN_PORT242_IRDA_IN, NULL);
|
|
|
gpio_request(GPIO_FN_PORT243_IRDA_FIRSEL, NULL);
|
|
|
|
|
|
+ /* LCD panel */
|
|
|
+ gpio_request(GPIO_PORT217, NULL); /* RESET */
|
|
|
+ gpio_direction_output(GPIO_PORT217, 0);
|
|
|
+ mdelay(1);
|
|
|
+ gpio_set_value(GPIO_PORT217, 1);
|
|
|
+
|
|
|
+ /* LCD backlight controller */
|
|
|
+ gpio_request(GPIO_PORT235, NULL); /* RESET */
|
|
|
+ gpio_direction_output(GPIO_PORT235, 0);
|
|
|
+ lcd_backlight_reset();
|
|
|
+
|
|
|
+ /* MIPI-DSI clock setup */
|
|
|
+ __raw_writel(0x2a809010, DSI0PHYCR);
|
|
|
+
|
|
|
#ifdef CONFIG_CACHE_L2X0
|
|
|
/* Shared attribute override enable, 64K*8way */
|
|
|
l2x0_init(__io(0xf0100000), 0x00460000, 0xc2000fff);
|