diff options
Diffstat (limited to 'drivers/video/fbdev/omap2/dss/hdmi4.c')
-rw-r--r-- | drivers/video/fbdev/omap2/dss/hdmi4.c | 53 |
1 files changed, 22 insertions, 31 deletions
diff --git a/drivers/video/fbdev/omap2/dss/hdmi4.c b/drivers/video/fbdev/omap2/dss/hdmi4.c index 626aad2bef46..6a8550cf43e5 100644 --- a/drivers/video/fbdev/omap2/dss/hdmi4.c +++ b/drivers/video/fbdev/omap2/dss/hdmi4.c | |||
@@ -281,29 +281,11 @@ static int hdmi_display_check_timing(struct omap_dss_device *dssdev, | |||
281 | static void hdmi_display_set_timing(struct omap_dss_device *dssdev, | 281 | static void hdmi_display_set_timing(struct omap_dss_device *dssdev, |
282 | struct omap_video_timings *timings) | 282 | struct omap_video_timings *timings) |
283 | { | 283 | { |
284 | struct hdmi_cm cm; | ||
285 | const struct hdmi_config *t; | ||
286 | |||
287 | mutex_lock(&hdmi.lock); | 284 | mutex_lock(&hdmi.lock); |
288 | 285 | ||
289 | cm = hdmi_get_code(timings); | 286 | hdmi.cfg.timings = *timings; |
290 | hdmi.cfg.cm = cm; | ||
291 | |||
292 | t = hdmi_get_timings(cm.mode, cm.code); | ||
293 | if (t != NULL) { | ||
294 | hdmi.cfg = *t; | ||
295 | |||
296 | dispc_set_tv_pclk(t->timings.pixelclock); | ||
297 | } else { | ||
298 | hdmi.cfg.timings = *timings; | ||
299 | hdmi.cfg.cm.code = 0; | ||
300 | hdmi.cfg.cm.mode = HDMI_DVI; | ||
301 | |||
302 | dispc_set_tv_pclk(timings->pixelclock); | ||
303 | } | ||
304 | 287 | ||
305 | DSSDBG("using mode: %s, code %d\n", hdmi.cfg.cm.mode == HDMI_DVI ? | 288 | dispc_set_tv_pclk(timings->pixelclock); |
306 | "DVI" : "HDMI", hdmi.cfg.cm.code); | ||
307 | 289 | ||
308 | mutex_unlock(&hdmi.lock); | 290 | mutex_unlock(&hdmi.lock); |
309 | } | 291 | } |
@@ -311,14 +293,7 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev, | |||
311 | static void hdmi_display_get_timings(struct omap_dss_device *dssdev, | 293 | static void hdmi_display_get_timings(struct omap_dss_device *dssdev, |
312 | struct omap_video_timings *timings) | 294 | struct omap_video_timings *timings) |
313 | { | 295 | { |
314 | const struct hdmi_config *cfg; | 296 | *timings = hdmi.cfg.timings; |
315 | struct hdmi_cm cm = hdmi.cfg.cm; | ||
316 | |||
317 | cfg = hdmi_get_timings(cm.mode, cm.code); | ||
318 | if (cfg == NULL) | ||
319 | cfg = hdmi_default_timing(); | ||
320 | |||
321 | memcpy(timings, &cfg->timings, sizeof(cfg->timings)); | ||
322 | } | 297 | } |
323 | 298 | ||
324 | static void hdmi_dump_regs(struct seq_file *s) | 299 | static void hdmi_dump_regs(struct seq_file *s) |
@@ -516,7 +491,7 @@ static int hdmi_audio_enable(struct omap_dss_device *dssdev) | |||
516 | 491 | ||
517 | mutex_lock(&hdmi.lock); | 492 | mutex_lock(&hdmi.lock); |
518 | 493 | ||
519 | if (!hdmi_mode_has_audio(hdmi.cfg.cm.mode)) { | 494 | if (!hdmi_mode_has_audio(hdmi.cfg.hdmi_dvi_mode)) { |
520 | r = -EPERM; | 495 | r = -EPERM; |
521 | goto err; | 496 | goto err; |
522 | } | 497 | } |
@@ -554,7 +529,7 @@ static bool hdmi_audio_supported(struct omap_dss_device *dssdev) | |||
554 | 529 | ||
555 | mutex_lock(&hdmi.lock); | 530 | mutex_lock(&hdmi.lock); |
556 | 531 | ||
557 | r = hdmi_mode_has_audio(hdmi.cfg.cm.mode); | 532 | r = hdmi_mode_has_audio(hdmi.cfg.hdmi_dvi_mode); |
558 | 533 | ||
559 | mutex_unlock(&hdmi.lock); | 534 | mutex_unlock(&hdmi.lock); |
560 | return r; | 535 | return r; |
@@ -568,7 +543,7 @@ static int hdmi_audio_config(struct omap_dss_device *dssdev, | |||
568 | 543 | ||
569 | mutex_lock(&hdmi.lock); | 544 | mutex_lock(&hdmi.lock); |
570 | 545 | ||
571 | if (!hdmi_mode_has_audio(hdmi.cfg.cm.mode)) { | 546 | if (!hdmi_mode_has_audio(hdmi.cfg.hdmi_dvi_mode)) { |
572 | r = -EPERM; | 547 | r = -EPERM; |
573 | goto err; | 548 | goto err; |
574 | } | 549 | } |
@@ -615,6 +590,20 @@ static int hdmi_audio_config(struct omap_dss_device *dssdev, | |||
615 | } | 590 | } |
616 | #endif | 591 | #endif |
617 | 592 | ||
593 | static int hdmi_set_infoframe(struct omap_dss_device *dssdev, | ||
594 | const struct hdmi_avi_infoframe *avi) | ||
595 | { | ||
596 | hdmi.cfg.infoframe = *avi; | ||
597 | return 0; | ||
598 | } | ||
599 | |||
600 | static int hdmi_set_hdmi_mode(struct omap_dss_device *dssdev, | ||
601 | bool hdmi_mode) | ||
602 | { | ||
603 | hdmi.cfg.hdmi_dvi_mode = hdmi_mode ? HDMI_HDMI : HDMI_DVI; | ||
604 | return 0; | ||
605 | } | ||
606 | |||
618 | static const struct omapdss_hdmi_ops hdmi_ops = { | 607 | static const struct omapdss_hdmi_ops hdmi_ops = { |
619 | .connect = hdmi_connect, | 608 | .connect = hdmi_connect, |
620 | .disconnect = hdmi_disconnect, | 609 | .disconnect = hdmi_disconnect, |
@@ -627,6 +616,8 @@ static const struct omapdss_hdmi_ops hdmi_ops = { | |||
627 | .get_timings = hdmi_display_get_timings, | 616 | .get_timings = hdmi_display_get_timings, |
628 | 617 | ||
629 | .read_edid = hdmi_read_edid, | 618 | .read_edid = hdmi_read_edid, |
619 | .set_infoframe = hdmi_set_infoframe, | ||
620 | .set_hdmi_mode = hdmi_set_hdmi_mode, | ||
630 | 621 | ||
631 | .audio_enable = hdmi_audio_enable, | 622 | .audio_enable = hdmi_audio_enable, |
632 | .audio_disable = hdmi_audio_disable, | 623 | .audio_disable = hdmi_audio_disable, |