diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/dss/dss.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/dss/dss.c | 255 |
1 files changed, 176 insertions, 79 deletions
diff --git a/drivers/gpu/drm/omapdrm/dss/dss.c b/drivers/gpu/drm/omapdrm/dss/dss.c index 3303cfad4838..14887d5b02e5 100644 --- a/drivers/gpu/drm/omapdrm/dss/dss.c +++ b/drivers/gpu/drm/omapdrm/dss/dss.c | |||
@@ -42,8 +42,7 @@ | |||
42 | #include <linux/suspend.h> | 42 | #include <linux/suspend.h> |
43 | #include <linux/component.h> | 43 | #include <linux/component.h> |
44 | 44 | ||
45 | #include <video/omapdss.h> | 45 | #include "omapdss.h" |
46 | |||
47 | #include "dss.h" | 46 | #include "dss.h" |
48 | #include "dss_features.h" | 47 | #include "dss_features.h" |
49 | 48 | ||
@@ -76,6 +75,8 @@ struct dss_features { | |||
76 | const enum omap_display_type *ports; | 75 | const enum omap_display_type *ports; |
77 | int num_ports; | 76 | int num_ports; |
78 | int (*dpi_select_source)(int port, enum omap_channel channel); | 77 | int (*dpi_select_source)(int port, enum omap_channel channel); |
78 | int (*select_lcd_source)(enum omap_channel channel, | ||
79 | enum dss_clk_source clk_src); | ||
79 | }; | 80 | }; |
80 | 81 | ||
81 | static struct { | 82 | static struct { |
@@ -92,9 +93,9 @@ static struct { | |||
92 | unsigned long cache_prate; | 93 | unsigned long cache_prate; |
93 | struct dispc_clock_info cache_dispc_cinfo; | 94 | struct dispc_clock_info cache_dispc_cinfo; |
94 | 95 | ||
95 | enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI]; | 96 | enum dss_clk_source dsi_clk_source[MAX_NUM_DSI]; |
96 | enum omap_dss_clk_source dispc_clk_source; | 97 | enum dss_clk_source dispc_clk_source; |
97 | enum omap_dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS]; | 98 | enum dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS]; |
98 | 99 | ||
99 | bool ctx_valid; | 100 | bool ctx_valid; |
100 | u32 ctx[DSS_SZ_REGS / sizeof(u32)]; | 101 | u32 ctx[DSS_SZ_REGS / sizeof(u32)]; |
@@ -106,11 +107,14 @@ static struct { | |||
106 | } dss; | 107 | } dss; |
107 | 108 | ||
108 | static const char * const dss_generic_clk_source_names[] = { | 109 | static const char * const dss_generic_clk_source_names[] = { |
109 | [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC", | 110 | [DSS_CLK_SRC_FCK] = "FCK", |
110 | [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI", | 111 | [DSS_CLK_SRC_PLL1_1] = "PLL1:1", |
111 | [OMAP_DSS_CLK_SRC_FCK] = "DSS_FCK", | 112 | [DSS_CLK_SRC_PLL1_2] = "PLL1:2", |
112 | [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC] = "DSI_PLL2_HSDIV_DISPC", | 113 | [DSS_CLK_SRC_PLL1_3] = "PLL1:3", |
113 | [OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI] = "DSI_PLL2_HSDIV_DSI", | 114 | [DSS_CLK_SRC_PLL2_1] = "PLL2:1", |
115 | [DSS_CLK_SRC_PLL2_2] = "PLL2:2", | ||
116 | [DSS_CLK_SRC_PLL2_3] = "PLL2:3", | ||
117 | [DSS_CLK_SRC_HDMI_PLL] = "HDMI PLL", | ||
114 | }; | 118 | }; |
115 | 119 | ||
116 | static bool dss_initialized; | 120 | static bool dss_initialized; |
@@ -203,68 +207,70 @@ void dss_ctrl_pll_enable(enum dss_pll_id pll_id, bool enable) | |||
203 | 1 << shift, val << shift); | 207 | 1 << shift, val << shift); |
204 | } | 208 | } |
205 | 209 | ||
206 | void dss_ctrl_pll_set_control_mux(enum dss_pll_id pll_id, | 210 | static int dss_ctrl_pll_set_control_mux(enum dss_clk_source clk_src, |
207 | enum omap_channel channel) | 211 | enum omap_channel channel) |
208 | { | 212 | { |
209 | unsigned shift, val; | 213 | unsigned shift, val; |
210 | 214 | ||
211 | if (!dss.syscon_pll_ctrl) | 215 | if (!dss.syscon_pll_ctrl) |
212 | return; | 216 | return -EINVAL; |
213 | 217 | ||
214 | switch (channel) { | 218 | switch (channel) { |
215 | case OMAP_DSS_CHANNEL_LCD: | 219 | case OMAP_DSS_CHANNEL_LCD: |
216 | shift = 3; | 220 | shift = 3; |
217 | 221 | ||
218 | switch (pll_id) { | 222 | switch (clk_src) { |
219 | case DSS_PLL_VIDEO1: | 223 | case DSS_CLK_SRC_PLL1_1: |
220 | val = 0; break; | 224 | val = 0; break; |
221 | case DSS_PLL_HDMI: | 225 | case DSS_CLK_SRC_HDMI_PLL: |
222 | val = 1; break; | 226 | val = 1; break; |
223 | default: | 227 | default: |
224 | DSSERR("error in PLL mux config for LCD\n"); | 228 | DSSERR("error in PLL mux config for LCD\n"); |
225 | return; | 229 | return -EINVAL; |
226 | } | 230 | } |
227 | 231 | ||
228 | break; | 232 | break; |
229 | case OMAP_DSS_CHANNEL_LCD2: | 233 | case OMAP_DSS_CHANNEL_LCD2: |
230 | shift = 5; | 234 | shift = 5; |
231 | 235 | ||
232 | switch (pll_id) { | 236 | switch (clk_src) { |
233 | case DSS_PLL_VIDEO1: | 237 | case DSS_CLK_SRC_PLL1_3: |
234 | val = 0; break; | 238 | val = 0; break; |
235 | case DSS_PLL_VIDEO2: | 239 | case DSS_CLK_SRC_PLL2_3: |
236 | val = 1; break; | 240 | val = 1; break; |
237 | case DSS_PLL_HDMI: | 241 | case DSS_CLK_SRC_HDMI_PLL: |
238 | val = 2; break; | 242 | val = 2; break; |
239 | default: | 243 | default: |
240 | DSSERR("error in PLL mux config for LCD2\n"); | 244 | DSSERR("error in PLL mux config for LCD2\n"); |
241 | return; | 245 | return -EINVAL; |
242 | } | 246 | } |
243 | 247 | ||
244 | break; | 248 | break; |
245 | case OMAP_DSS_CHANNEL_LCD3: | 249 | case OMAP_DSS_CHANNEL_LCD3: |
246 | shift = 7; | 250 | shift = 7; |
247 | 251 | ||
248 | switch (pll_id) { | 252 | switch (clk_src) { |
249 | case DSS_PLL_VIDEO1: | 253 | case DSS_CLK_SRC_PLL2_1: |
250 | val = 1; break; | ||
251 | case DSS_PLL_VIDEO2: | ||
252 | val = 0; break; | 254 | val = 0; break; |
253 | case DSS_PLL_HDMI: | 255 | case DSS_CLK_SRC_PLL1_3: |
256 | val = 1; break; | ||
257 | case DSS_CLK_SRC_HDMI_PLL: | ||
254 | val = 2; break; | 258 | val = 2; break; |
255 | default: | 259 | default: |
256 | DSSERR("error in PLL mux config for LCD3\n"); | 260 | DSSERR("error in PLL mux config for LCD3\n"); |
257 | return; | 261 | return -EINVAL; |
258 | } | 262 | } |
259 | 263 | ||
260 | break; | 264 | break; |
261 | default: | 265 | default: |
262 | DSSERR("error in PLL mux config\n"); | 266 | DSSERR("error in PLL mux config\n"); |
263 | return; | 267 | return -EINVAL; |
264 | } | 268 | } |
265 | 269 | ||
266 | regmap_update_bits(dss.syscon_pll_ctrl, dss.syscon_pll_ctrl_offset, | 270 | regmap_update_bits(dss.syscon_pll_ctrl, dss.syscon_pll_ctrl_offset, |
267 | 0x3 << shift, val << shift); | 271 | 0x3 << shift, val << shift); |
272 | |||
273 | return 0; | ||
268 | } | 274 | } |
269 | 275 | ||
270 | void dss_sdi_init(int datapairs) | 276 | void dss_sdi_init(int datapairs) |
@@ -354,14 +360,14 @@ void dss_sdi_disable(void) | |||
354 | REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ | 360 | REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ |
355 | } | 361 | } |
356 | 362 | ||
357 | const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src) | 363 | const char *dss_get_clk_source_name(enum dss_clk_source clk_src) |
358 | { | 364 | { |
359 | return dss_generic_clk_source_names[clk_src]; | 365 | return dss_generic_clk_source_names[clk_src]; |
360 | } | 366 | } |
361 | 367 | ||
362 | void dss_dump_clocks(struct seq_file *s) | 368 | void dss_dump_clocks(struct seq_file *s) |
363 | { | 369 | { |
364 | const char *fclk_name, *fclk_real_name; | 370 | const char *fclk_name; |
365 | unsigned long fclk_rate; | 371 | unsigned long fclk_rate; |
366 | 372 | ||
367 | if (dss_runtime_get()) | 373 | if (dss_runtime_get()) |
@@ -369,12 +375,11 @@ void dss_dump_clocks(struct seq_file *s) | |||
369 | 375 | ||
370 | seq_printf(s, "- DSS -\n"); | 376 | seq_printf(s, "- DSS -\n"); |
371 | 377 | ||
372 | fclk_name = dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_FCK); | 378 | fclk_name = dss_get_clk_source_name(DSS_CLK_SRC_FCK); |
373 | fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK); | ||
374 | fclk_rate = clk_get_rate(dss.dss_clk); | 379 | fclk_rate = clk_get_rate(dss.dss_clk); |
375 | 380 | ||
376 | seq_printf(s, "%s (%s) = %lu\n", | 381 | seq_printf(s, "%s = %lu\n", |
377 | fclk_name, fclk_real_name, | 382 | fclk_name, |
378 | fclk_rate); | 383 | fclk_rate); |
379 | 384 | ||
380 | dss_runtime_put(); | 385 | dss_runtime_put(); |
@@ -403,19 +408,42 @@ static void dss_dump_regs(struct seq_file *s) | |||
403 | #undef DUMPREG | 408 | #undef DUMPREG |
404 | } | 409 | } |
405 | 410 | ||
406 | static void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src) | 411 | static int dss_get_channel_index(enum omap_channel channel) |
412 | { | ||
413 | switch (channel) { | ||
414 | case OMAP_DSS_CHANNEL_LCD: | ||
415 | return 0; | ||
416 | case OMAP_DSS_CHANNEL_LCD2: | ||
417 | return 1; | ||
418 | case OMAP_DSS_CHANNEL_LCD3: | ||
419 | return 2; | ||
420 | default: | ||
421 | WARN_ON(1); | ||
422 | return 0; | ||
423 | } | ||
424 | } | ||
425 | |||
426 | static void dss_select_dispc_clk_source(enum dss_clk_source clk_src) | ||
407 | { | 427 | { |
408 | int b; | 428 | int b; |
409 | u8 start, end; | 429 | u8 start, end; |
410 | 430 | ||
431 | /* | ||
432 | * We always use PRCM clock as the DISPC func clock, except on DSS3, | ||
433 | * where we don't have separate DISPC and LCD clock sources. | ||
434 | */ | ||
435 | if (WARN_ON(dss_has_feature(FEAT_LCD_CLK_SRC) && | ||
436 | clk_src != DSS_CLK_SRC_FCK)) | ||
437 | return; | ||
438 | |||
411 | switch (clk_src) { | 439 | switch (clk_src) { |
412 | case OMAP_DSS_CLK_SRC_FCK: | 440 | case DSS_CLK_SRC_FCK: |
413 | b = 0; | 441 | b = 0; |
414 | break; | 442 | break; |
415 | case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: | 443 | case DSS_CLK_SRC_PLL1_1: |
416 | b = 1; | 444 | b = 1; |
417 | break; | 445 | break; |
418 | case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: | 446 | case DSS_CLK_SRC_PLL2_1: |
419 | b = 2; | 447 | b = 2; |
420 | break; | 448 | break; |
421 | default: | 449 | default: |
@@ -431,19 +459,19 @@ static void dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src) | |||
431 | } | 459 | } |
432 | 460 | ||
433 | void dss_select_dsi_clk_source(int dsi_module, | 461 | void dss_select_dsi_clk_source(int dsi_module, |
434 | enum omap_dss_clk_source clk_src) | 462 | enum dss_clk_source clk_src) |
435 | { | 463 | { |
436 | int b, pos; | 464 | int b, pos; |
437 | 465 | ||
438 | switch (clk_src) { | 466 | switch (clk_src) { |
439 | case OMAP_DSS_CLK_SRC_FCK: | 467 | case DSS_CLK_SRC_FCK: |
440 | b = 0; | 468 | b = 0; |
441 | break; | 469 | break; |
442 | case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI: | 470 | case DSS_CLK_SRC_PLL1_2: |
443 | BUG_ON(dsi_module != 0); | 471 | BUG_ON(dsi_module != 0); |
444 | b = 1; | 472 | b = 1; |
445 | break; | 473 | break; |
446 | case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI: | 474 | case DSS_CLK_SRC_PLL2_2: |
447 | BUG_ON(dsi_module != 1); | 475 | BUG_ON(dsi_module != 1); |
448 | b = 1; | 476 | b = 1; |
449 | break; | 477 | break; |
@@ -458,59 +486,125 @@ void dss_select_dsi_clk_source(int dsi_module, | |||
458 | dss.dsi_clk_source[dsi_module] = clk_src; | 486 | dss.dsi_clk_source[dsi_module] = clk_src; |
459 | } | 487 | } |
460 | 488 | ||
489 | static int dss_lcd_clk_mux_dra7(enum omap_channel channel, | ||
490 | enum dss_clk_source clk_src) | ||
491 | { | ||
492 | const u8 ctrl_bits[] = { | ||
493 | [OMAP_DSS_CHANNEL_LCD] = 0, | ||
494 | [OMAP_DSS_CHANNEL_LCD2] = 12, | ||
495 | [OMAP_DSS_CHANNEL_LCD3] = 19, | ||
496 | }; | ||
497 | |||
498 | u8 ctrl_bit = ctrl_bits[channel]; | ||
499 | int r; | ||
500 | |||
501 | if (clk_src == DSS_CLK_SRC_FCK) { | ||
502 | /* LCDx_CLK_SWITCH */ | ||
503 | REG_FLD_MOD(DSS_CONTROL, 0, ctrl_bit, ctrl_bit); | ||
504 | return -EINVAL; | ||
505 | } | ||
506 | |||
507 | r = dss_ctrl_pll_set_control_mux(clk_src, channel); | ||
508 | if (r) | ||
509 | return r; | ||
510 | |||
511 | REG_FLD_MOD(DSS_CONTROL, 1, ctrl_bit, ctrl_bit); | ||
512 | |||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | static int dss_lcd_clk_mux_omap5(enum omap_channel channel, | ||
517 | enum dss_clk_source clk_src) | ||
518 | { | ||
519 | const u8 ctrl_bits[] = { | ||
520 | [OMAP_DSS_CHANNEL_LCD] = 0, | ||
521 | [OMAP_DSS_CHANNEL_LCD2] = 12, | ||
522 | [OMAP_DSS_CHANNEL_LCD3] = 19, | ||
523 | }; | ||
524 | const enum dss_clk_source allowed_plls[] = { | ||
525 | [OMAP_DSS_CHANNEL_LCD] = DSS_CLK_SRC_PLL1_1, | ||
526 | [OMAP_DSS_CHANNEL_LCD2] = DSS_CLK_SRC_FCK, | ||
527 | [OMAP_DSS_CHANNEL_LCD3] = DSS_CLK_SRC_PLL2_1, | ||
528 | }; | ||
529 | |||
530 | u8 ctrl_bit = ctrl_bits[channel]; | ||
531 | |||
532 | if (clk_src == DSS_CLK_SRC_FCK) { | ||
533 | /* LCDx_CLK_SWITCH */ | ||
534 | REG_FLD_MOD(DSS_CONTROL, 0, ctrl_bit, ctrl_bit); | ||
535 | return -EINVAL; | ||
536 | } | ||
537 | |||
538 | if (WARN_ON(allowed_plls[channel] != clk_src)) | ||
539 | return -EINVAL; | ||
540 | |||
541 | REG_FLD_MOD(DSS_CONTROL, 1, ctrl_bit, ctrl_bit); | ||
542 | |||
543 | return 0; | ||
544 | } | ||
545 | |||
546 | static int dss_lcd_clk_mux_omap4(enum omap_channel channel, | ||
547 | enum dss_clk_source clk_src) | ||
548 | { | ||
549 | const u8 ctrl_bits[] = { | ||
550 | [OMAP_DSS_CHANNEL_LCD] = 0, | ||
551 | [OMAP_DSS_CHANNEL_LCD2] = 12, | ||
552 | }; | ||
553 | const enum dss_clk_source allowed_plls[] = { | ||
554 | [OMAP_DSS_CHANNEL_LCD] = DSS_CLK_SRC_PLL1_1, | ||
555 | [OMAP_DSS_CHANNEL_LCD2] = DSS_CLK_SRC_PLL2_1, | ||
556 | }; | ||
557 | |||
558 | u8 ctrl_bit = ctrl_bits[channel]; | ||
559 | |||
560 | if (clk_src == DSS_CLK_SRC_FCK) { | ||
561 | /* LCDx_CLK_SWITCH */ | ||
562 | REG_FLD_MOD(DSS_CONTROL, 0, ctrl_bit, ctrl_bit); | ||
563 | return 0; | ||
564 | } | ||
565 | |||
566 | if (WARN_ON(allowed_plls[channel] != clk_src)) | ||
567 | return -EINVAL; | ||
568 | |||
569 | REG_FLD_MOD(DSS_CONTROL, 1, ctrl_bit, ctrl_bit); | ||
570 | |||
571 | return 0; | ||
572 | } | ||
573 | |||
461 | void dss_select_lcd_clk_source(enum omap_channel channel, | 574 | void dss_select_lcd_clk_source(enum omap_channel channel, |
462 | enum omap_dss_clk_source clk_src) | 575 | enum dss_clk_source clk_src) |
463 | { | 576 | { |
464 | int b, ix, pos; | 577 | int idx = dss_get_channel_index(channel); |
578 | int r; | ||
465 | 579 | ||
466 | if (!dss_has_feature(FEAT_LCD_CLK_SRC)) { | 580 | if (!dss_has_feature(FEAT_LCD_CLK_SRC)) { |
467 | dss_select_dispc_clk_source(clk_src); | 581 | dss_select_dispc_clk_source(clk_src); |
582 | dss.lcd_clk_source[idx] = clk_src; | ||
468 | return; | 583 | return; |
469 | } | 584 | } |
470 | 585 | ||
471 | switch (clk_src) { | 586 | r = dss.feat->select_lcd_source(channel, clk_src); |
472 | case OMAP_DSS_CLK_SRC_FCK: | 587 | if (r) |
473 | b = 0; | ||
474 | break; | ||
475 | case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: | ||
476 | BUG_ON(channel != OMAP_DSS_CHANNEL_LCD); | ||
477 | b = 1; | ||
478 | break; | ||
479 | case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: | ||
480 | BUG_ON(channel != OMAP_DSS_CHANNEL_LCD2 && | ||
481 | channel != OMAP_DSS_CHANNEL_LCD3); | ||
482 | b = 1; | ||
483 | break; | ||
484 | default: | ||
485 | BUG(); | ||
486 | return; | 588 | return; |
487 | } | ||
488 | |||
489 | pos = channel == OMAP_DSS_CHANNEL_LCD ? 0 : | ||
490 | (channel == OMAP_DSS_CHANNEL_LCD2 ? 12 : 19); | ||
491 | REG_FLD_MOD(DSS_CONTROL, b, pos, pos); /* LCDx_CLK_SWITCH */ | ||
492 | 589 | ||
493 | ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : | 590 | dss.lcd_clk_source[idx] = clk_src; |
494 | (channel == OMAP_DSS_CHANNEL_LCD2 ? 1 : 2); | ||
495 | dss.lcd_clk_source[ix] = clk_src; | ||
496 | } | 591 | } |
497 | 592 | ||
498 | enum omap_dss_clk_source dss_get_dispc_clk_source(void) | 593 | enum dss_clk_source dss_get_dispc_clk_source(void) |
499 | { | 594 | { |
500 | return dss.dispc_clk_source; | 595 | return dss.dispc_clk_source; |
501 | } | 596 | } |
502 | 597 | ||
503 | enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module) | 598 | enum dss_clk_source dss_get_dsi_clk_source(int dsi_module) |
504 | { | 599 | { |
505 | return dss.dsi_clk_source[dsi_module]; | 600 | return dss.dsi_clk_source[dsi_module]; |
506 | } | 601 | } |
507 | 602 | ||
508 | enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) | 603 | enum dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) |
509 | { | 604 | { |
510 | if (dss_has_feature(FEAT_LCD_CLK_SRC)) { | 605 | if (dss_has_feature(FEAT_LCD_CLK_SRC)) { |
511 | int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : | 606 | int idx = dss_get_channel_index(channel); |
512 | (channel == OMAP_DSS_CHANNEL_LCD2 ? 1 : 2); | 607 | return dss.lcd_clk_source[idx]; |
513 | return dss.lcd_clk_source[ix]; | ||
514 | } else { | 608 | } else { |
515 | /* LCD_CLK source is the same as DISPC_FCLK source for | 609 | /* LCD_CLK source is the same as DISPC_FCLK source for |
516 | * OMAP2 and OMAP3 */ | 610 | * OMAP2 and OMAP3 */ |
@@ -859,6 +953,7 @@ static const struct dss_features omap44xx_dss_feats = { | |||
859 | .dpi_select_source = &dss_dpi_select_source_omap4, | 953 | .dpi_select_source = &dss_dpi_select_source_omap4, |
860 | .ports = omap2plus_ports, | 954 | .ports = omap2plus_ports, |
861 | .num_ports = ARRAY_SIZE(omap2plus_ports), | 955 | .num_ports = ARRAY_SIZE(omap2plus_ports), |
956 | .select_lcd_source = &dss_lcd_clk_mux_omap4, | ||
862 | }; | 957 | }; |
863 | 958 | ||
864 | static const struct dss_features omap54xx_dss_feats = { | 959 | static const struct dss_features omap54xx_dss_feats = { |
@@ -868,6 +963,7 @@ static const struct dss_features omap54xx_dss_feats = { | |||
868 | .dpi_select_source = &dss_dpi_select_source_omap5, | 963 | .dpi_select_source = &dss_dpi_select_source_omap5, |
869 | .ports = omap2plus_ports, | 964 | .ports = omap2plus_ports, |
870 | .num_ports = ARRAY_SIZE(omap2plus_ports), | 965 | .num_ports = ARRAY_SIZE(omap2plus_ports), |
966 | .select_lcd_source = &dss_lcd_clk_mux_omap5, | ||
871 | }; | 967 | }; |
872 | 968 | ||
873 | static const struct dss_features am43xx_dss_feats = { | 969 | static const struct dss_features am43xx_dss_feats = { |
@@ -886,6 +982,7 @@ static const struct dss_features dra7xx_dss_feats = { | |||
886 | .dpi_select_source = &dss_dpi_select_source_dra7xx, | 982 | .dpi_select_source = &dss_dpi_select_source_dra7xx, |
887 | .ports = dra7xx_ports, | 983 | .ports = dra7xx_ports, |
888 | .num_ports = ARRAY_SIZE(dra7xx_ports), | 984 | .num_ports = ARRAY_SIZE(dra7xx_ports), |
985 | .select_lcd_source = &dss_lcd_clk_mux_dra7, | ||
889 | }; | 986 | }; |
890 | 987 | ||
891 | static int dss_init_features(struct platform_device *pdev) | 988 | static int dss_init_features(struct platform_device *pdev) |
@@ -1143,18 +1240,18 @@ static int dss_bind(struct device *dev) | |||
1143 | /* Select DPLL */ | 1240 | /* Select DPLL */ |
1144 | REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); | 1241 | REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); |
1145 | 1242 | ||
1146 | dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); | 1243 | dss_select_dispc_clk_source(DSS_CLK_SRC_FCK); |
1147 | 1244 | ||
1148 | #ifdef CONFIG_OMAP2_DSS_VENC | 1245 | #ifdef CONFIG_OMAP2_DSS_VENC |
1149 | REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ | 1246 | REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ |
1150 | REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ | 1247 | REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ |
1151 | REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ | 1248 | REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ |
1152 | #endif | 1249 | #endif |
1153 | dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; | 1250 | dss.dsi_clk_source[0] = DSS_CLK_SRC_FCK; |
1154 | dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; | 1251 | dss.dsi_clk_source[1] = DSS_CLK_SRC_FCK; |
1155 | dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK; | 1252 | dss.dispc_clk_source = DSS_CLK_SRC_FCK; |
1156 | dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; | 1253 | dss.lcd_clk_source[0] = DSS_CLK_SRC_FCK; |
1157 | dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; | 1254 | dss.lcd_clk_source[1] = DSS_CLK_SRC_FCK; |
1158 | 1255 | ||
1159 | rev = dss_read_reg(DSS_REVISION); | 1256 | rev = dss_read_reg(DSS_REVISION); |
1160 | printk(KERN_INFO "OMAP DSS rev %d.%d\n", | 1257 | printk(KERN_INFO "OMAP DSS rev %d.%d\n", |