diff options
-rw-r--r-- | arch/arm/mach-shmobile/board-ap4evb.c | 98 | ||||
-rw-r--r-- | arch/sh/boards/mach-ap325rxa/setup.c | 29 | ||||
-rw-r--r-- | arch/sh/boards/mach-ecovec24/setup.c | 60 | ||||
-rw-r--r-- | arch/sh/boards/mach-kfr2r09/setup.c | 29 | ||||
-rw-r--r-- | arch/sh/boards/mach-migor/setup.c | 58 | ||||
-rw-r--r-- | arch/sh/boards/mach-se/7724/setup.c | 54 | ||||
-rw-r--r-- | drivers/video/sh_mipi_dsi.c | 32 | ||||
-rw-r--r-- | drivers/video/sh_mobile_hdmi.c | 3 | ||||
-rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 10 | ||||
-rw-r--r-- | include/video/sh_mobile_lcdc.h | 3 |
10 files changed, 219 insertions, 157 deletions
diff --git a/arch/arm/mach-shmobile/board-ap4evb.c b/arch/arm/mach-shmobile/board-ap4evb.c index 31e5b28ab9b4..4e883e0fb01b 100644 --- a/arch/arm/mach-shmobile/board-ap4evb.c +++ b/arch/arm/mach-shmobile/board-ap4evb.c | |||
@@ -375,10 +375,40 @@ static struct platform_device usb1_host_device = { | |||
375 | .resource = usb1_host_resources, | 375 | .resource = usb1_host_resources, |
376 | }; | 376 | }; |
377 | 377 | ||
378 | const static struct fb_videomode ap4evb_lcdc_modes[] = { | ||
379 | { | ||
380 | #ifdef CONFIG_AP4EVB_QHD | ||
381 | .name = "R63302(QHD)", | ||
382 | .xres = 544, | ||
383 | .yres = 961, | ||
384 | .left_margin = 72, | ||
385 | .right_margin = 600, | ||
386 | .hsync_len = 16, | ||
387 | .upper_margin = 8, | ||
388 | .lower_margin = 8, | ||
389 | .vsync_len = 2, | ||
390 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
391 | #else | ||
392 | .name = "WVGA Panel", | ||
393 | .xres = 800, | ||
394 | .yres = 480, | ||
395 | .left_margin = 220, | ||
396 | .right_margin = 110, | ||
397 | .hsync_len = 70, | ||
398 | .upper_margin = 20, | ||
399 | .lower_margin = 5, | ||
400 | .vsync_len = 5, | ||
401 | .sync = 0, | ||
402 | #endif | ||
403 | }, | ||
404 | }; | ||
405 | |||
378 | static struct sh_mobile_lcdc_info lcdc_info = { | 406 | static struct sh_mobile_lcdc_info lcdc_info = { |
379 | .ch[0] = { | 407 | .ch[0] = { |
380 | .chan = LCDC_CHAN_MAINLCD, | 408 | .chan = LCDC_CHAN_MAINLCD, |
381 | .bpp = 16, | 409 | .bpp = 16, |
410 | .lcd_cfg = ap4evb_lcdc_modes, | ||
411 | .num_cfg = ARRAY_SIZE(ap4evb_lcdc_modes), | ||
382 | } | 412 | } |
383 | }; | 413 | }; |
384 | 414 | ||
@@ -569,6 +599,31 @@ static struct platform_device fsi_device = { | |||
569 | }, | 599 | }, |
570 | }; | 600 | }; |
571 | 601 | ||
602 | const static struct fb_videomode ap4evb_hdmi_modes[] = { | ||
603 | { | ||
604 | .name = "HDMI 720p", | ||
605 | .xres = 1280, | ||
606 | .yres = 720, | ||
607 | |||
608 | /* | ||
609 | * If left and right margins are not multiples of 8, | ||
610 | * LDHAJR will be adjusted accordingly by the LCDC | ||
611 | * driver. Until we start using EDID, these values | ||
612 | * might have to be adjusted for different monitors. | ||
613 | */ | ||
614 | .left_margin = 200, | ||
615 | .right_margin = 88, | ||
616 | .hsync_len = 48, | ||
617 | |||
618 | .upper_margin = 20, | ||
619 | .lower_margin = 5, | ||
620 | .vsync_len = 5, | ||
621 | |||
622 | .pixclock = 13468, | ||
623 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
624 | }, | ||
625 | }; | ||
626 | |||
572 | static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = { | 627 | static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = { |
573 | .clock_source = LCDC_CLK_EXTERNAL, | 628 | .clock_source = LCDC_CLK_EXTERNAL, |
574 | .ch[0] = { | 629 | .ch[0] = { |
@@ -577,26 +632,8 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc1_info = { | |||
577 | .interface_type = RGB24, | 632 | .interface_type = RGB24, |
578 | .clock_divider = 1, | 633 | .clock_divider = 1, |
579 | .flags = LCDC_FLAGS_DWPOL, | 634 | .flags = LCDC_FLAGS_DWPOL, |
580 | .lcd_cfg = { | 635 | .lcd_cfg = ap4evb_hdmi_modes, |
581 | .name = "HDMI", | 636 | .num_cfg = ARRAY_SIZE(ap4evb_hdmi_modes), |
582 | /* So far only 720p is supported */ | ||
583 | .xres = 1280, | ||
584 | .yres = 720, | ||
585 | /* | ||
586 | * If left and right margins are not multiples of 8, | ||
587 | * LDHAJR will be adjusted accordingly by the LCDC | ||
588 | * driver. Until we start using EDID, these values | ||
589 | * might have to be adjusted for different monitors. | ||
590 | */ | ||
591 | .left_margin = 200, | ||
592 | .right_margin = 88, | ||
593 | .hsync_len = 48, | ||
594 | .upper_margin = 20, | ||
595 | .lower_margin = 5, | ||
596 | .vsync_len = 5, | ||
597 | .pixclock = 13468, | ||
598 | .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, | ||
599 | }, | ||
600 | } | 637 | } |
601 | }; | 638 | }; |
602 | 639 | ||
@@ -960,17 +997,6 @@ static void __init ap4evb_init(void) | |||
960 | lcdc_info.ch[0].interface_type = RGB24; | 997 | lcdc_info.ch[0].interface_type = RGB24; |
961 | lcdc_info.ch[0].clock_divider = 1; | 998 | lcdc_info.ch[0].clock_divider = 1; |
962 | lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL; | 999 | lcdc_info.ch[0].flags = LCDC_FLAGS_DWPOL; |
963 | lcdc_info.ch[0].lcd_cfg.name = "R63302(QHD)"; | ||
964 | lcdc_info.ch[0].lcd_cfg.xres = 544; | ||
965 | lcdc_info.ch[0].lcd_cfg.yres = 961; | ||
966 | lcdc_info.ch[0].lcd_cfg.left_margin = 72; | ||
967 | lcdc_info.ch[0].lcd_cfg.right_margin = 600; | ||
968 | lcdc_info.ch[0].lcd_cfg.hsync_len = 16; | ||
969 | lcdc_info.ch[0].lcd_cfg.upper_margin = 8; | ||
970 | lcdc_info.ch[0].lcd_cfg.lower_margin = 8; | ||
971 | lcdc_info.ch[0].lcd_cfg.vsync_len = 2; | ||
972 | lcdc_info.ch[0].lcd_cfg.sync = FB_SYNC_VERT_HIGH_ACT | | ||
973 | FB_SYNC_HOR_HIGH_ACT; | ||
974 | lcdc_info.ch[0].lcd_size_cfg.width = 44; | 1000 | lcdc_info.ch[0].lcd_size_cfg.width = 44; |
975 | lcdc_info.ch[0].lcd_size_cfg.height = 79; | 1001 | lcdc_info.ch[0].lcd_size_cfg.height = 79; |
976 | 1002 | ||
@@ -1013,16 +1039,6 @@ static void __init ap4evb_init(void) | |||
1013 | lcdc_info.ch[0].interface_type = RGB18; | 1039 | lcdc_info.ch[0].interface_type = RGB18; |
1014 | lcdc_info.ch[0].clock_divider = 2; | 1040 | lcdc_info.ch[0].clock_divider = 2; |
1015 | lcdc_info.ch[0].flags = 0; | 1041 | lcdc_info.ch[0].flags = 0; |
1016 | lcdc_info.ch[0].lcd_cfg.name = "WVGA Panel"; | ||
1017 | lcdc_info.ch[0].lcd_cfg.xres = 800; | ||
1018 | lcdc_info.ch[0].lcd_cfg.yres = 480; | ||
1019 | lcdc_info.ch[0].lcd_cfg.left_margin = 220; | ||
1020 | lcdc_info.ch[0].lcd_cfg.right_margin = 110; | ||
1021 | lcdc_info.ch[0].lcd_cfg.hsync_len = 70; | ||
1022 | lcdc_info.ch[0].lcd_cfg.upper_margin = 20; | ||
1023 | lcdc_info.ch[0].lcd_cfg.lower_margin = 5; | ||
1024 | lcdc_info.ch[0].lcd_cfg.vsync_len = 5; | ||
1025 | lcdc_info.ch[0].lcd_cfg.sync = 0; | ||
1026 | lcdc_info.ch[0].lcd_size_cfg.width = 152; | 1042 | lcdc_info.ch[0].lcd_size_cfg.width = 152; |
1027 | lcdc_info.ch[0].lcd_size_cfg.height = 91; | 1043 | lcdc_info.ch[0].lcd_size_cfg.height = 91; |
1028 | 1044 | ||
diff --git a/arch/sh/boards/mach-ap325rxa/setup.c b/arch/sh/boards/mach-ap325rxa/setup.c index 3da116f47f01..00553233a7c5 100644 --- a/arch/sh/boards/mach-ap325rxa/setup.c +++ b/arch/sh/boards/mach-ap325rxa/setup.c | |||
@@ -176,6 +176,21 @@ static void ap320_wvga_power_off(void *board_data) | |||
176 | __raw_writew(0, FPGA_LCDREG); | 176 | __raw_writew(0, FPGA_LCDREG); |
177 | } | 177 | } |
178 | 178 | ||
179 | const static struct fb_videomode ap325rxa_lcdc_modes[] = { | ||
180 | { | ||
181 | .name = "LB070WV1", | ||
182 | .xres = 800, | ||
183 | .yres = 480, | ||
184 | .left_margin = 32, | ||
185 | .right_margin = 160, | ||
186 | .hsync_len = 8, | ||
187 | .upper_margin = 63, | ||
188 | .lower_margin = 80, | ||
189 | .vsync_len = 1, | ||
190 | .sync = 0, /* hsync and vsync are active low */ | ||
191 | }, | ||
192 | }; | ||
193 | |||
179 | static struct sh_mobile_lcdc_info lcdc_info = { | 194 | static struct sh_mobile_lcdc_info lcdc_info = { |
180 | .clock_source = LCDC_CLK_EXTERNAL, | 195 | .clock_source = LCDC_CLK_EXTERNAL, |
181 | .ch[0] = { | 196 | .ch[0] = { |
@@ -183,18 +198,8 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
183 | .bpp = 16, | 198 | .bpp = 16, |
184 | .interface_type = RGB18, | 199 | .interface_type = RGB18, |
185 | .clock_divider = 1, | 200 | .clock_divider = 1, |
186 | .lcd_cfg = { | 201 | .lcd_cfg = ap325rxa_lcdc_modes, |
187 | .name = "LB070WV1", | 202 | .num_cfg = ARRAY_SIZE(ap325rxa_lcdc_modes), |
188 | .xres = 800, | ||
189 | .yres = 480, | ||
190 | .left_margin = 32, | ||
191 | .right_margin = 160, | ||
192 | .hsync_len = 8, | ||
193 | .upper_margin = 63, | ||
194 | .lower_margin = 80, | ||
195 | .vsync_len = 1, | ||
196 | .sync = 0, /* hsync and vsync are active low */ | ||
197 | }, | ||
198 | .lcd_size_cfg = { /* 7.0 inch */ | 203 | .lcd_size_cfg = { /* 7.0 inch */ |
199 | .width = 152, | 204 | .width = 152, |
200 | .height = 91, | 205 | .height = 91, |
diff --git a/arch/sh/boards/mach-ecovec24/setup.c b/arch/sh/boards/mach-ecovec24/setup.c index 1d7b495a7db4..feadf5dada77 100644 --- a/arch/sh/boards/mach-ecovec24/setup.c +++ b/arch/sh/boards/mach-ecovec24/setup.c | |||
@@ -231,14 +231,41 @@ static struct platform_device usb1_common_device = { | |||
231 | }; | 231 | }; |
232 | 232 | ||
233 | /* LCDC */ | 233 | /* LCDC */ |
234 | const static struct fb_videomode ecovec_lcd_modes[] = { | ||
235 | { | ||
236 | .name = "Panel", | ||
237 | .xres = 800, | ||
238 | .yres = 480, | ||
239 | .left_margin = 220, | ||
240 | .right_margin = 110, | ||
241 | .hsync_len = 70, | ||
242 | .upper_margin = 20, | ||
243 | .lower_margin = 5, | ||
244 | .vsync_len = 5, | ||
245 | .sync = 0, /* hsync and vsync are active low */ | ||
246 | }, | ||
247 | }; | ||
248 | |||
249 | const static struct fb_videomode ecovec_dvi_modes[] = { | ||
250 | { | ||
251 | .name = "DVI", | ||
252 | .xres = 1280, | ||
253 | .yres = 720, | ||
254 | .left_margin = 220, | ||
255 | .right_margin = 110, | ||
256 | .hsync_len = 40, | ||
257 | .upper_margin = 20, | ||
258 | .lower_margin = 5, | ||
259 | .vsync_len = 5, | ||
260 | .sync = 0, /* hsync and vsync are active low */ | ||
261 | }, | ||
262 | }; | ||
263 | |||
234 | static struct sh_mobile_lcdc_info lcdc_info = { | 264 | static struct sh_mobile_lcdc_info lcdc_info = { |
235 | .ch[0] = { | 265 | .ch[0] = { |
236 | .interface_type = RGB18, | 266 | .interface_type = RGB18, |
237 | .chan = LCDC_CHAN_MAINLCD, | 267 | .chan = LCDC_CHAN_MAINLCD, |
238 | .bpp = 16, | 268 | .bpp = 16, |
239 | .lcd_cfg = { | ||
240 | .sync = 0, /* hsync and vsync are active low */ | ||
241 | }, | ||
242 | .lcd_size_cfg = { /* 7.0 inch */ | 269 | .lcd_size_cfg = { /* 7.0 inch */ |
243 | .width = 152, | 270 | .width = 152, |
244 | .height = 91, | 271 | .height = 91, |
@@ -1079,33 +1106,18 @@ static int __init arch_setup(void) | |||
1079 | if (gpio_get_value(GPIO_PTE6)) { | 1106 | if (gpio_get_value(GPIO_PTE6)) { |
1080 | /* DVI */ | 1107 | /* DVI */ |
1081 | lcdc_info.clock_source = LCDC_CLK_EXTERNAL; | 1108 | lcdc_info.clock_source = LCDC_CLK_EXTERNAL; |
1082 | lcdc_info.ch[0].clock_divider = 1, | 1109 | lcdc_info.ch[0].clock_divider = 1; |
1083 | lcdc_info.ch[0].lcd_cfg.name = "DVI"; | 1110 | lcdc_info.ch[0].lcd_cfg = ecovec_dvi_modes; |
1084 | lcdc_info.ch[0].lcd_cfg.xres = 1280; | 1111 | lcdc_info.ch[0].num_cfg = ARRAY_SIZE(ecovec_dvi_modes); |
1085 | lcdc_info.ch[0].lcd_cfg.yres = 720; | ||
1086 | lcdc_info.ch[0].lcd_cfg.left_margin = 220; | ||
1087 | lcdc_info.ch[0].lcd_cfg.right_margin = 110; | ||
1088 | lcdc_info.ch[0].lcd_cfg.hsync_len = 40; | ||
1089 | lcdc_info.ch[0].lcd_cfg.upper_margin = 20; | ||
1090 | lcdc_info.ch[0].lcd_cfg.lower_margin = 5; | ||
1091 | lcdc_info.ch[0].lcd_cfg.vsync_len = 5; | ||
1092 | 1112 | ||
1093 | gpio_set_value(GPIO_PTA2, 1); | 1113 | gpio_set_value(GPIO_PTA2, 1); |
1094 | gpio_set_value(GPIO_PTU1, 1); | 1114 | gpio_set_value(GPIO_PTU1, 1); |
1095 | } else { | 1115 | } else { |
1096 | /* Panel */ | 1116 | /* Panel */ |
1097 | |||
1098 | lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; | 1117 | lcdc_info.clock_source = LCDC_CLK_PERIPHERAL; |
1099 | lcdc_info.ch[0].clock_divider = 2, | 1118 | lcdc_info.ch[0].clock_divider = 2; |
1100 | lcdc_info.ch[0].lcd_cfg.name = "Panel"; | 1119 | lcdc_info.ch[0].lcd_cfg = ecovec_lcd_modes; |
1101 | lcdc_info.ch[0].lcd_cfg.xres = 800; | 1120 | lcdc_info.ch[0].num_cfg = ARRAY_SIZE(ecovec_lcd_modes); |
1102 | lcdc_info.ch[0].lcd_cfg.yres = 480; | ||
1103 | lcdc_info.ch[0].lcd_cfg.left_margin = 220; | ||
1104 | lcdc_info.ch[0].lcd_cfg.right_margin = 110; | ||
1105 | lcdc_info.ch[0].lcd_cfg.hsync_len = 70; | ||
1106 | lcdc_info.ch[0].lcd_cfg.upper_margin = 20; | ||
1107 | lcdc_info.ch[0].lcd_cfg.lower_margin = 5; | ||
1108 | lcdc_info.ch[0].lcd_cfg.vsync_len = 5; | ||
1109 | 1121 | ||
1110 | gpio_set_value(GPIO_PTR1, 1); | 1122 | gpio_set_value(GPIO_PTR1, 1); |
1111 | 1123 | ||
diff --git a/arch/sh/boards/mach-kfr2r09/setup.c b/arch/sh/boards/mach-kfr2r09/setup.c index 68994a163f6c..87d4b90e368c 100644 --- a/arch/sh/boards/mach-kfr2r09/setup.c +++ b/arch/sh/boards/mach-kfr2r09/setup.c | |||
@@ -126,6 +126,21 @@ static struct platform_device kfr2r09_sh_keysc_device = { | |||
126 | }, | 126 | }, |
127 | }; | 127 | }; |
128 | 128 | ||
129 | const static struct fb_videomode kfr2r09_lcdc_modes[] = { | ||
130 | { | ||
131 | .name = "TX07D34VM0AAA", | ||
132 | .xres = 240, | ||
133 | .yres = 400, | ||
134 | .left_margin = 0, | ||
135 | .right_margin = 16, | ||
136 | .hsync_len = 8, | ||
137 | .upper_margin = 0, | ||
138 | .lower_margin = 1, | ||
139 | .vsync_len = 1, | ||
140 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
141 | }, | ||
142 | }; | ||
143 | |||
129 | static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = { | 144 | static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = { |
130 | .clock_source = LCDC_CLK_BUS, | 145 | .clock_source = LCDC_CLK_BUS, |
131 | .ch[0] = { | 146 | .ch[0] = { |
@@ -134,18 +149,8 @@ static struct sh_mobile_lcdc_info kfr2r09_sh_lcdc_info = { | |||
134 | .interface_type = SYS18, | 149 | .interface_type = SYS18, |
135 | .clock_divider = 6, | 150 | .clock_divider = 6, |
136 | .flags = LCDC_FLAGS_DWPOL, | 151 | .flags = LCDC_FLAGS_DWPOL, |
137 | .lcd_cfg = { | 152 | .lcd_cfg = kfr2r09_lcdc_modes, |
138 | .name = "TX07D34VM0AAA", | 153 | .num_cfg = ARRAY_SIZE(kfr2r09_lcdc_modes), |
139 | .xres = 240, | ||
140 | .yres = 400, | ||
141 | .left_margin = 0, | ||
142 | .right_margin = 16, | ||
143 | .hsync_len = 8, | ||
144 | .upper_margin = 0, | ||
145 | .lower_margin = 1, | ||
146 | .vsync_len = 1, | ||
147 | .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, | ||
148 | }, | ||
149 | .lcd_size_cfg = { | 154 | .lcd_size_cfg = { |
150 | .width = 35, | 155 | .width = 35, |
151 | .height = 58, | 156 | .height = 58, |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 662debe4ead2..9204cbb87147 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -213,51 +213,55 @@ static struct platform_device migor_nand_flash_device = { | |||
213 | } | 213 | } |
214 | }; | 214 | }; |
215 | 215 | ||
216 | const static struct fb_videomode migor_lcd_modes[] = { | ||
217 | { | ||
218 | #if defined(CONFIG_SH_MIGOR_RTA_WVGA) | ||
219 | .name = "LB070WV1", | ||
220 | .xres = 800, | ||
221 | .yres = 480, | ||
222 | .left_margin = 64, | ||
223 | .right_margin = 16, | ||
224 | .hsync_len = 120, | ||
225 | .sync = 0, | ||
226 | #elif defined(CONFIG_SH_MIGOR_QVGA) | ||
227 | .name = "PH240320T", | ||
228 | .xres = 320, | ||
229 | .yres = 240, | ||
230 | .left_margin = 0, | ||
231 | .right_margin = 16, | ||
232 | .hsync_len = 8, | ||
233 | .sync = FB_SYNC_HOR_HIGH_ACT, | ||
234 | #endif | ||
235 | .upper_margin = 1, | ||
236 | .lower_margin = 17, | ||
237 | .vsync_len = 2, | ||
238 | }, | ||
239 | }; | ||
240 | |||
216 | static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { | 241 | static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { |
217 | #ifdef CONFIG_SH_MIGOR_RTA_WVGA | 242 | #if defined(CONFIG_SH_MIGOR_RTA_WVGA) |
218 | .clock_source = LCDC_CLK_BUS, | 243 | .clock_source = LCDC_CLK_BUS, |
219 | .ch[0] = { | 244 | .ch[0] = { |
220 | .chan = LCDC_CHAN_MAINLCD, | 245 | .chan = LCDC_CHAN_MAINLCD, |
221 | .bpp = 16, | 246 | .bpp = 16, |
222 | .interface_type = RGB16, | 247 | .interface_type = RGB16, |
223 | .clock_divider = 2, | 248 | .clock_divider = 2, |
224 | .lcd_cfg = { | 249 | .lcd_cfg = migor_lcd_modes, |
225 | .name = "LB070WV1", | 250 | .num_cfg = ARRAY_SIZE(migor_lcd_modes), |
226 | .xres = 800, | ||
227 | .yres = 480, | ||
228 | .left_margin = 64, | ||
229 | .right_margin = 16, | ||
230 | .hsync_len = 120, | ||
231 | .upper_margin = 1, | ||
232 | .lower_margin = 17, | ||
233 | .vsync_len = 2, | ||
234 | .sync = 0, | ||
235 | }, | ||
236 | .lcd_size_cfg = { /* 7.0 inch */ | 251 | .lcd_size_cfg = { /* 7.0 inch */ |
237 | .width = 152, | 252 | .width = 152, |
238 | .height = 91, | 253 | .height = 91, |
239 | }, | 254 | }, |
240 | } | 255 | } |
241 | #endif | 256 | #elif defined(CONFIG_SH_MIGOR_QVGA) |
242 | #ifdef CONFIG_SH_MIGOR_QVGA | ||
243 | .clock_source = LCDC_CLK_PERIPHERAL, | 257 | .clock_source = LCDC_CLK_PERIPHERAL, |
244 | .ch[0] = { | 258 | .ch[0] = { |
245 | .chan = LCDC_CHAN_MAINLCD, | 259 | .chan = LCDC_CHAN_MAINLCD, |
246 | .bpp = 16, | 260 | .bpp = 16, |
247 | .interface_type = SYS16A, | 261 | .interface_type = SYS16A, |
248 | .clock_divider = 10, | 262 | .clock_divider = 10, |
249 | .lcd_cfg = { | 263 | .lcd_cfg = migor_lcd_modes, |
250 | .name = "PH240320T", | 264 | .num_cfg = ARRAY_SIZE(migor_lcd_modes), |
251 | .xres = 320, | ||
252 | .yres = 240, | ||
253 | .left_margin = 0, | ||
254 | .right_margin = 16, | ||
255 | .hsync_len = 8, | ||
256 | .upper_margin = 1, | ||
257 | .lower_margin = 17, | ||
258 | .vsync_len = 2, | ||
259 | .sync = FB_SYNC_HOR_HIGH_ACT, | ||
260 | }, | ||
261 | .lcd_size_cfg = { /* 2.4 inch */ | 265 | .lcd_size_cfg = { /* 2.4 inch */ |
262 | .width = 49, | 266 | .width = 49, |
263 | .height = 37, | 267 | .height = 37, |
diff --git a/arch/sh/boards/mach-se/7724/setup.c b/arch/sh/boards/mach-se/7724/setup.c index 552ebd9ba82b..3099c36759ad 100644 --- a/arch/sh/boards/mach-se/7724/setup.c +++ b/arch/sh/boards/mach-se/7724/setup.c | |||
@@ -144,16 +144,42 @@ static struct platform_device nor_flash_device = { | |||
144 | }; | 144 | }; |
145 | 145 | ||
146 | /* LCDC */ | 146 | /* LCDC */ |
147 | const static struct fb_videomode lcdc_720p_modes[] = { | ||
148 | { | ||
149 | .name = "LB070WV1", | ||
150 | .sync = 0, /* hsync and vsync are active low */ | ||
151 | .xres = 1280; | ||
152 | .yres = 720; | ||
153 | .left_margin = 220; | ||
154 | .right_margin = 110; | ||
155 | .hsync_len = 40; | ||
156 | .upper_margin = 20; | ||
157 | .lower_margin = 5; | ||
158 | .vsync_len = 5; | ||
159 | }, | ||
160 | }; | ||
161 | |||
162 | const static struct fb_videomode lcdc_vga_modes[] = { | ||
163 | { | ||
164 | .name = "LB070WV1", | ||
165 | .sync = 0, /* hsync and vsync are active low */ | ||
166 | .xres = 640; | ||
167 | .yres = 480; | ||
168 | .left_margin = 105; | ||
169 | .right_margin = 50; | ||
170 | .hsync_len = 96; | ||
171 | .upper_margin = 33; | ||
172 | .lower_margin = 10; | ||
173 | .vsync_len = 2; | ||
174 | }, | ||
175 | }; | ||
176 | |||
147 | static struct sh_mobile_lcdc_info lcdc_info = { | 177 | static struct sh_mobile_lcdc_info lcdc_info = { |
148 | .clock_source = LCDC_CLK_EXTERNAL, | 178 | .clock_source = LCDC_CLK_EXTERNAL, |
149 | .ch[0] = { | 179 | .ch[0] = { |
150 | .chan = LCDC_CHAN_MAINLCD, | 180 | .chan = LCDC_CHAN_MAINLCD, |
151 | .bpp = 16, | 181 | .bpp = 16, |
152 | .clock_divider = 1, | 182 | .clock_divider = 1, |
153 | .lcd_cfg = { | ||
154 | .name = "LB070WV1", | ||
155 | .sync = 0, /* hsync and vsync are active low */ | ||
156 | }, | ||
157 | .lcd_size_cfg = { /* 7.0 inch */ | 183 | .lcd_size_cfg = { /* 7.0 inch */ |
158 | .width = 152, | 184 | .width = 152, |
159 | .height = 91, | 185 | .height = 91, |
@@ -909,24 +935,12 @@ static int __init devices_setup(void) | |||
909 | 935 | ||
910 | if (sw & SW41_B) { | 936 | if (sw & SW41_B) { |
911 | /* 720p */ | 937 | /* 720p */ |
912 | lcdc_info.ch[0].lcd_cfg.xres = 1280; | 938 | lcdc_info.ch[0].lcd_cfg = lcdc_720p_modes; |
913 | lcdc_info.ch[0].lcd_cfg.yres = 720; | 939 | lcdc_info.ch[0].num_cfg = ARRAY_SIZE(lcdc_720p_modes); |
914 | lcdc_info.ch[0].lcd_cfg.left_margin = 220; | ||
915 | lcdc_info.ch[0].lcd_cfg.right_margin = 110; | ||
916 | lcdc_info.ch[0].lcd_cfg.hsync_len = 40; | ||
917 | lcdc_info.ch[0].lcd_cfg.upper_margin = 20; | ||
918 | lcdc_info.ch[0].lcd_cfg.lower_margin = 5; | ||
919 | lcdc_info.ch[0].lcd_cfg.vsync_len = 5; | ||
920 | } else { | 940 | } else { |
921 | /* VGA */ | 941 | /* VGA */ |
922 | lcdc_info.ch[0].lcd_cfg.xres = 640; | 942 | lcdc_info.ch[0].lcd_cfg = lcdc_vga_modes; |
923 | lcdc_info.ch[0].lcd_cfg.yres = 480; | 943 | lcdc_info.ch[0].num_cfg = ARRAY_SIZE(lcdc_vga_modes); |
924 | lcdc_info.ch[0].lcd_cfg.left_margin = 105; | ||
925 | lcdc_info.ch[0].lcd_cfg.right_margin = 50; | ||
926 | lcdc_info.ch[0].lcd_cfg.hsync_len = 96; | ||
927 | lcdc_info.ch[0].lcd_cfg.upper_margin = 33; | ||
928 | lcdc_info.ch[0].lcd_cfg.lower_margin = 10; | ||
929 | lcdc_info.ch[0].lcd_cfg.vsync_len = 2; | ||
930 | } | 944 | } |
931 | 945 | ||
932 | if (sw & SW41_A) { | 946 | if (sw & SW41_A) { |
diff --git a/drivers/video/sh_mipi_dsi.c b/drivers/video/sh_mipi_dsi.c index 5699ce0c1780..3f3d431033ca 100644 --- a/drivers/video/sh_mipi_dsi.c +++ b/drivers/video/sh_mipi_dsi.c | |||
@@ -123,83 +123,87 @@ static int __init sh_mipi_setup(struct sh_mipi *mipi, | |||
123 | u32 linelength; | 123 | u32 linelength; |
124 | bool yuv; | 124 | bool yuv; |
125 | 125 | ||
126 | /* Select data format */ | 126 | /* |
127 | * Select data format. MIPI DSI is not hot-pluggable, so, we just use | ||
128 | * the default videomode. If this ever becomes a problem, We'll have to | ||
129 | * move this to mipi_display_on() above and use info->var.xres | ||
130 | */ | ||
127 | switch (pdata->data_format) { | 131 | switch (pdata->data_format) { |
128 | case MIPI_RGB888: | 132 | case MIPI_RGB888: |
129 | pctype = 0; | 133 | pctype = 0; |
130 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; | 134 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; |
131 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 135 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
132 | linelength = ch->lcd_cfg.xres * 3; | 136 | linelength = ch->lcd_cfg[0].xres * 3; |
133 | yuv = false; | 137 | yuv = false; |
134 | break; | 138 | break; |
135 | case MIPI_RGB565: | 139 | case MIPI_RGB565: |
136 | pctype = 1; | 140 | pctype = 1; |
137 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; | 141 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; |
138 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 142 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
139 | linelength = ch->lcd_cfg.xres * 2; | 143 | linelength = ch->lcd_cfg[0].xres * 2; |
140 | yuv = false; | 144 | yuv = false; |
141 | break; | 145 | break; |
142 | case MIPI_RGB666_LP: | 146 | case MIPI_RGB666_LP: |
143 | pctype = 2; | 147 | pctype = 2; |
144 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; | 148 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; |
145 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 149 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
146 | linelength = ch->lcd_cfg.xres * 3; | 150 | linelength = ch->lcd_cfg[0].xres * 3; |
147 | yuv = false; | 151 | yuv = false; |
148 | break; | 152 | break; |
149 | case MIPI_RGB666: | 153 | case MIPI_RGB666: |
150 | pctype = 3; | 154 | pctype = 3; |
151 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; | 155 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; |
152 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; | 156 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; |
153 | linelength = (ch->lcd_cfg.xres * 18 + 7) / 8; | 157 | linelength = (ch->lcd_cfg[0].xres * 18 + 7) / 8; |
154 | yuv = false; | 158 | yuv = false; |
155 | break; | 159 | break; |
156 | case MIPI_BGR888: | 160 | case MIPI_BGR888: |
157 | pctype = 8; | 161 | pctype = 8; |
158 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; | 162 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_24; |
159 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 163 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
160 | linelength = ch->lcd_cfg.xres * 3; | 164 | linelength = ch->lcd_cfg[0].xres * 3; |
161 | yuv = false; | 165 | yuv = false; |
162 | break; | 166 | break; |
163 | case MIPI_BGR565: | 167 | case MIPI_BGR565: |
164 | pctype = 9; | 168 | pctype = 9; |
165 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; | 169 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_16; |
166 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 170 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
167 | linelength = ch->lcd_cfg.xres * 2; | 171 | linelength = ch->lcd_cfg[0].xres * 2; |
168 | yuv = false; | 172 | yuv = false; |
169 | break; | 173 | break; |
170 | case MIPI_BGR666_LP: | 174 | case MIPI_BGR666_LP: |
171 | pctype = 0xa; | 175 | pctype = 0xa; |
172 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; | 176 | datatype = MIPI_DSI_PIXEL_STREAM_3BYTE_18; |
173 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; | 177 | pixfmt = MIPI_DCS_PIXEL_FMT_24BIT; |
174 | linelength = ch->lcd_cfg.xres * 3; | 178 | linelength = ch->lcd_cfg[0].xres * 3; |
175 | yuv = false; | 179 | yuv = false; |
176 | break; | 180 | break; |
177 | case MIPI_BGR666: | 181 | case MIPI_BGR666: |
178 | pctype = 0xb; | 182 | pctype = 0xb; |
179 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; | 183 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_18; |
180 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; | 184 | pixfmt = MIPI_DCS_PIXEL_FMT_18BIT; |
181 | linelength = (ch->lcd_cfg.xres * 18 + 7) / 8; | 185 | linelength = (ch->lcd_cfg[0].xres * 18 + 7) / 8; |
182 | yuv = false; | 186 | yuv = false; |
183 | break; | 187 | break; |
184 | case MIPI_YUYV: | 188 | case MIPI_YUYV: |
185 | pctype = 4; | 189 | pctype = 4; |
186 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; | 190 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; |
187 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 191 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
188 | linelength = ch->lcd_cfg.xres * 2; | 192 | linelength = ch->lcd_cfg[0].xres * 2; |
189 | yuv = true; | 193 | yuv = true; |
190 | break; | 194 | break; |
191 | case MIPI_UYVY: | 195 | case MIPI_UYVY: |
192 | pctype = 5; | 196 | pctype = 5; |
193 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; | 197 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16; |
194 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; | 198 | pixfmt = MIPI_DCS_PIXEL_FMT_16BIT; |
195 | linelength = ch->lcd_cfg.xres * 2; | 199 | linelength = ch->lcd_cfg[0].xres * 2; |
196 | yuv = true; | 200 | yuv = true; |
197 | break; | 201 | break; |
198 | case MIPI_YUV420_L: | 202 | case MIPI_YUV420_L: |
199 | pctype = 6; | 203 | pctype = 6; |
200 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; | 204 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; |
201 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; | 205 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; |
202 | linelength = (ch->lcd_cfg.xres * 12 + 7) / 8; | 206 | linelength = (ch->lcd_cfg[0].xres * 12 + 7) / 8; |
203 | yuv = true; | 207 | yuv = true; |
204 | break; | 208 | break; |
205 | case MIPI_YUV420: | 209 | case MIPI_YUV420: |
@@ -207,7 +211,7 @@ static int __init sh_mipi_setup(struct sh_mipi *mipi, | |||
207 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; | 211 | datatype = MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12; |
208 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; | 212 | pixfmt = MIPI_DCS_PIXEL_FMT_12BIT; |
209 | /* Length of U/V line */ | 213 | /* Length of U/V line */ |
210 | linelength = (ch->lcd_cfg.xres + 1) / 2; | 214 | linelength = (ch->lcd_cfg[0].xres + 1) / 2; |
211 | yuv = true; | 215 | yuv = true; |
212 | break; | 216 | break; |
213 | default: | 217 | default: |
@@ -281,7 +285,7 @@ static int __init sh_mipi_setup(struct sh_mipi *mipi, | |||
281 | iowrite32(0x00e00000, base + 0x8024); /* VMCTR2 */ | 285 | iowrite32(0x00e00000, base + 0x8024); /* VMCTR2 */ |
282 | /* | 286 | /* |
283 | * 0x660 = 1632 bytes per line (RGB24, 544 pixels: see | 287 | * 0x660 = 1632 bytes per line (RGB24, 544 pixels: see |
284 | * sh_mobile_lcdc_info.ch[0].lcd_cfg.xres), HSALEN = 1 - default | 288 | * sh_mobile_lcdc_info.ch[0].lcd_cfg[0].xres), HSALEN = 1 - default |
285 | * (unused, since VMCTR2[HSABM] = 0) | 289 | * (unused, since VMCTR2[HSABM] = 0) |
286 | */ | 290 | */ |
287 | iowrite32(1 | (linelength << 16), base + 0x8028); /* VMLEN1 */ | 291 | iowrite32(1 | (linelength << 16), base + 0x8028); /* VMLEN1 */ |
diff --git a/drivers/video/sh_mobile_hdmi.c b/drivers/video/sh_mobile_hdmi.c index a8117c33e75f..6608429c0fbb 100644 --- a/drivers/video/sh_mobile_hdmi.c +++ b/drivers/video/sh_mobile_hdmi.c | |||
@@ -777,7 +777,8 @@ static int __init sh_hdmi_probe(struct platform_device *pdev) | |||
777 | goto egetclk; | 777 | goto egetclk; |
778 | } | 778 | } |
779 | 779 | ||
780 | rate = PICOS2KHZ(pdata->lcd_chan->lcd_cfg.pixclock) * 1000; | 780 | /* TODO: reconfigure the clock on monitor plug in */ |
781 | rate = PICOS2KHZ(pdata->lcd_chan->lcd_cfg[0].pixclock) * 1000; | ||
781 | 782 | ||
782 | rate = clk_round_rate(hdmi->hdmi_clk, rate); | 783 | rate = clk_round_rate(hdmi->hdmi_clk, rate); |
783 | if (rate < 0) { | 784 | if (rate < 0) { |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index e4f6012fe4e3..ce3ed4bc991f 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -989,8 +989,8 @@ static int sh_mobile_lcdc_notify(struct notifier_block *nb, | |||
989 | int ret; | 989 | int ret; |
990 | 990 | ||
991 | /* Can we handle this display? */ | 991 | /* Can we handle this display? */ |
992 | if (var->xres > ch->cfg.lcd_cfg.xres || | 992 | if (var->xres > ch->cfg.lcd_cfg[0].xres || |
993 | var->yres > ch->cfg.lcd_cfg.yres) | 993 | var->yres > ch->cfg.lcd_cfg[0].yres) |
994 | return -ENOMEM; | 994 | return -ENOMEM; |
995 | 995 | ||
996 | /* Add to the modelist */ | 996 | /* Add to the modelist */ |
@@ -1115,7 +1115,7 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
1115 | 1115 | ||
1116 | info = ch->info; | 1116 | info = ch->info; |
1117 | var = &info->var; | 1117 | var = &info->var; |
1118 | lcd_cfg = &cfg->lcd_cfg; | 1118 | lcd_cfg = &cfg->lcd_cfg[0]; |
1119 | info->fbops = &sh_mobile_lcdc_ops; | 1119 | info->fbops = &sh_mobile_lcdc_ops; |
1120 | fb_videomode_to_var(var, lcd_cfg); | 1120 | fb_videomode_to_var(var, lcd_cfg); |
1121 | /* Default Y virtual resolution is 2x panel size */ | 1121 | /* Default Y virtual resolution is 2x panel size */ |
@@ -1187,8 +1187,8 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
1187 | pdev->name, | 1187 | pdev->name, |
1188 | (ch->cfg.chan == LCDC_CHAN_MAINLCD) ? | 1188 | (ch->cfg.chan == LCDC_CHAN_MAINLCD) ? |
1189 | "mainlcd" : "sublcd", | 1189 | "mainlcd" : "sublcd", |
1190 | (int) ch->cfg.lcd_cfg.xres, | 1190 | (int) ch->cfg.lcd_cfg[0].xres, |
1191 | (int) ch->cfg.lcd_cfg.yres, | 1191 | (int) ch->cfg.lcd_cfg[0].yres, |
1192 | ch->cfg.bpp); | 1192 | ch->cfg.bpp); |
1193 | 1193 | ||
1194 | /* deferred io mode: disable clock to save power */ | 1194 | /* deferred io mode: disable clock to save power */ |
diff --git a/include/video/sh_mobile_lcdc.h b/include/video/sh_mobile_lcdc.h index 55d700e8566e..19c69d788f3b 100644 --- a/include/video/sh_mobile_lcdc.h +++ b/include/video/sh_mobile_lcdc.h | |||
@@ -70,7 +70,8 @@ struct sh_mobile_lcdc_chan_cfg { | |||
70 | int interface_type; /* selects RGBn or SYSn I/F, see above */ | 70 | int interface_type; /* selects RGBn or SYSn I/F, see above */ |
71 | int clock_divider; | 71 | int clock_divider; |
72 | unsigned long flags; /* LCDC_FLAGS_... */ | 72 | unsigned long flags; /* LCDC_FLAGS_... */ |
73 | struct fb_videomode lcd_cfg; | 73 | const struct fb_videomode *lcd_cfg; |
74 | int num_cfg; | ||
74 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; | 75 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; |
75 | struct sh_mobile_lcdc_board_cfg board_cfg; | 76 | struct sh_mobile_lcdc_board_cfg board_cfg; |
76 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ | 77 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ |