diff options
| author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2010-11-04 07:06:17 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2010-11-10 03:29:27 -0500 |
| commit | 0ea2af1c15b730dba9ce741420352d298bcd7862 (patch) | |
| tree | f57691cb1b208d44369b0c72c465b72d07990fd4 | |
| parent | d2ecbab5960d9814a269d36723647d6ef391ba8f (diff) | |
fbdev: sh_mobile_hdmi: add support for 1080p modes
Add support for 3 more preprogrammed video modes: 1080p at 24, 50, and 60Hz.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
| -rw-r--r-- | drivers/video/sh_mobile_hdmi.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/drivers/video/sh_mobile_hdmi.c b/drivers/video/sh_mobile_hdmi.c index 3adffe6acafc..8338bd4d277e 100644 --- a/drivers/video/sh_mobile_hdmi.c +++ b/drivers/video/sh_mobile_hdmi.c | |||
| @@ -209,7 +209,8 @@ enum hotplug_state { | |||
| 209 | struct sh_hdmi { | 209 | struct sh_hdmi { |
| 210 | void __iomem *base; | 210 | void __iomem *base; |
| 211 | enum hotplug_state hp_state; /* hot-plug status */ | 211 | enum hotplug_state hp_state; /* hot-plug status */ |
| 212 | bool preprogrammed_mode; /* use a pre-programmed VIC or the external mode */ | 212 | u8 preprogrammed_vic; /* use a pre-programmed VIC or |
| 213 | the external mode */ | ||
| 213 | struct clk *hdmi_clk; | 214 | struct clk *hdmi_clk; |
| 214 | struct device *dev; | 215 | struct device *dev; |
| 215 | struct fb_info *info; | 216 | struct fb_info *info; |
| @@ -342,7 +343,7 @@ static void sh_hdmi_external_video_param(struct sh_hdmi *hdmi) | |||
| 342 | hdmi_write(hdmi, var->vsync_len, HDMI_EXTERNAL_V_DURATION); | 343 | hdmi_write(hdmi, var->vsync_len, HDMI_EXTERNAL_V_DURATION); |
| 343 | 344 | ||
| 344 | /* Set bit 0 of HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS here for external mode */ | 345 | /* Set bit 0 of HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS here for external mode */ |
| 345 | if (!hdmi->preprogrammed_mode) | 346 | if (!hdmi->preprogrammed_vic) |
| 346 | hdmi_write(hdmi, sync | 1 | (voffset << 4), | 347 | hdmi_write(hdmi, sync | 1 | (voffset << 4), |
| 347 | HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS); | 348 | HDMI_EXTERNAL_VIDEO_PARAM_SETTINGS); |
| 348 | } | 349 | } |
| @@ -466,7 +467,18 @@ static void sh_hdmi_audio_config(struct sh_hdmi *hdmi) | |||
| 466 | */ | 467 | */ |
| 467 | static void sh_hdmi_phy_config(struct sh_hdmi *hdmi) | 468 | static void sh_hdmi_phy_config(struct sh_hdmi *hdmi) |
| 468 | { | 469 | { |
| 469 | if (hdmi->var.pixclock < 30000) { | 470 | if (hdmi->var.pixclock < 10000) { |
| 471 | /* for 1080p8bit 148MHz */ | ||
| 472 | hdmi_write(hdmi, 0x1d, HDMI_SLIPHDMIT_PARAM_SETTINGS_1); | ||
| 473 | hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_2); | ||
| 474 | hdmi_write(hdmi, 0x00, HDMI_SLIPHDMIT_PARAM_SETTINGS_3); | ||
| 475 | hdmi_write(hdmi, 0x4c, HDMI_SLIPHDMIT_PARAM_SETTINGS_5); | ||
| 476 | hdmi_write(hdmi, 0x1e, HDMI_SLIPHDMIT_PARAM_SETTINGS_6); | ||
| 477 | hdmi_write(hdmi, 0x48, HDMI_SLIPHDMIT_PARAM_SETTINGS_7); | ||
| 478 | hdmi_write(hdmi, 0x0e, HDMI_SLIPHDMIT_PARAM_SETTINGS_8); | ||
| 479 | hdmi_write(hdmi, 0x25, HDMI_SLIPHDMIT_PARAM_SETTINGS_9); | ||
| 480 | hdmi_write(hdmi, 0x04, HDMI_SLIPHDMIT_PARAM_SETTINGS_10); | ||
| 481 | } else if (hdmi->var.pixclock < 30000) { | ||
| 470 | /* 720p, 8bit, 74.25MHz. Might need to be adjusted for other formats */ | 482 | /* 720p, 8bit, 74.25MHz. Might need to be adjusted for other formats */ |
| 471 | /* | 483 | /* |
| 472 | * [1:0] Speed_A | 484 | * [1:0] Speed_A |
| @@ -524,6 +536,7 @@ static void sh_hdmi_phy_config(struct sh_hdmi *hdmi) | |||
| 524 | */ | 536 | */ |
| 525 | static void sh_hdmi_avi_infoframe_setup(struct sh_hdmi *hdmi) | 537 | static void sh_hdmi_avi_infoframe_setup(struct sh_hdmi *hdmi) |
| 526 | { | 538 | { |
| 539 | struct fb_var_screeninfo *var = &hdmi->var; | ||
| 527 | u8 vic; | 540 | u8 vic; |
| 528 | 541 | ||
| 529 | /* AVI InfoFrame */ | 542 | /* AVI InfoFrame */ |
| @@ -565,17 +578,11 @@ static void sh_hdmi_avi_infoframe_setup(struct sh_hdmi *hdmi) | |||
| 565 | hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB3); | 578 | hdmi_write(hdmi, 0x00, HDMI_CTRL_PKT_BUF_ACCESS_PB3); |
| 566 | 579 | ||
| 567 | /* | 580 | /* |
| 568 | * VIC = 1280 x 720p: ignored if external config is used | 581 | * VIC should be ignored if external config is used, so, we could just use 0, |
| 569 | * Send 2 for 720 x 480p, 16 for 1080p, ignored in external mode | 582 | * but play safe and use a valid value in any case just in case |
| 570 | */ | 583 | */ |
| 571 | if (hdmi->var.yres == 1080 && hdmi->var.xres == 1920) | 584 | if (hdmi->preprogrammed_vic) |
| 572 | vic = 16; | 585 | vic = hdmi->preprogrammed_vic; |
| 573 | else if (hdmi->var.yres == 576 && hdmi->var.xres == 720) | ||
| 574 | vic = 17; | ||
| 575 | else if (hdmi->var.yres == 480 && hdmi->var.xres == 720) | ||
| 576 | vic = 2; | ||
| 577 | else if (hdmi->var.yres == 480 && hdmi->var.xres == 640) | ||
| 578 | vic = 1; | ||
| 579 | else | 586 | else |
| 580 | vic = 4; | 587 | vic = 4; |
| 581 | hdmi_write(hdmi, vic, HDMI_CTRL_PKT_BUF_ACCESS_PB4); | 588 | hdmi_write(hdmi, vic, HDMI_CTRL_PKT_BUF_ACCESS_PB4); |
| @@ -828,17 +835,25 @@ static int sh_hdmi_read_edid(struct sh_hdmi *hdmi, unsigned long *hdmi_rate, | |||
| 828 | if (!found) | 835 | if (!found) |
| 829 | return -ENXIO; | 836 | return -ENXIO; |
| 830 | 837 | ||
| 831 | if ((found->xres == 640 && found->yres == 480 && found->refresh == 60) || | 838 | if (found->xres == 640 && found->yres == 480 && found->refresh == 60) |
| 832 | (found->xres == 720 && found->yres == 480 && found->refresh == 60) || | 839 | hdmi->preprogrammed_vic = 1; |
| 833 | (found->xres == 720 && found->yres == 576 && found->refresh == 50) || | 840 | else if (found->xres == 720 && found->yres == 480 && found->refresh == 60) |
| 834 | (found->xres == 1280 && found->yres == 720 && found->refresh == 60) || | 841 | hdmi->preprogrammed_vic = 2; |
| 835 | (found->xres == 1920 && found->yres == 1080 && found->refresh == 60)) | 842 | else if (found->xres == 720 && found->yres == 576 && found->refresh == 50) |
| 836 | hdmi->preprogrammed_mode = true; | 843 | hdmi->preprogrammed_vic = 17; |
| 844 | else if (found->xres == 1280 && found->yres == 720 && found->refresh == 60) | ||
| 845 | hdmi->preprogrammed_vic = 4; | ||
| 846 | else if (found->xres == 1920 && found->yres == 1080 && found->refresh == 24) | ||
| 847 | hdmi->preprogrammed_vic = 32; | ||
| 848 | else if (found->xres == 1920 && found->yres == 1080 && found->refresh == 50) | ||
| 849 | hdmi->preprogrammed_vic = 31; | ||
| 850 | else if (found->xres == 1920 && found->yres == 1080 && found->refresh == 60) | ||
| 851 | hdmi->preprogrammed_vic = 16; | ||
| 837 | else | 852 | else |
| 838 | hdmi->preprogrammed_mode = false; | 853 | hdmi->preprogrammed_vic = 0; |
| 839 | 854 | ||
| 840 | dev_dbg(hdmi->dev, "Using %s %s mode %ux%u@%uHz (%luHz), clock error %luHz\n", | 855 | dev_dbg(hdmi->dev, "Using %s %s mode %ux%u@%uHz (%luHz), clock error %luHz\n", |
| 841 | modelist ? "default" : "EDID", hdmi->preprogrammed_mode ? "VIC" : "external", | 856 | modelist ? "default" : "EDID", hdmi->preprogrammed_vic ? "VIC" : "external", |
| 842 | found->xres, found->yres, found->refresh, | 857 | found->xres, found->yres, found->refresh, |
| 843 | PICOS2KHZ(found->pixclock) * 1000, found_rate_error); | 858 | PICOS2KHZ(found->pixclock) * 1000, found_rate_error); |
| 844 | 859 | ||
