From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753434AbbJGDkw (ORCPT ); Tue, 6 Oct 2015 23:40:52 -0400 Received: from lucky1.263xmail.com ([211.157.147.131]:54541 "EHLO lucky1.263xmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752972AbbJGDkv (ORCPT ); Tue, 6 Oct 2015 23:40:51 -0400 X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 X-ADDR-CHECKED: 0 X-RL-SENDER: ykk@rock-chips.com X-FST-TO: airlied@linux.ie X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: ykk@rock-chips.com X-UNIQUE-TAG: X-ATTACHMENT-NUM: 0 X-DNS-TYPE: 0 Message-ID: <5614942E.3010702@rock-chips.com> Date: Wed, 07 Oct 2015 11:40:30 +0800 From: Yakir Yang User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: Russell King , linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org CC: Philipp Zabel , Andy Yan , Fabio Estevam , Sascha Hauer , Jon Nettleton , David Airlie Subject: Re: [PATCH 06/12] drm: bridge/dw_hdmi: clean up HDMI vs DVI mode handling References: <20150808160251.GM7557@n2100.arm.linux.org.uk> In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Russell & Andy On 08/09/2015 12:03 AM, Russell King wrote: > The FSL kernel detects the HDMI vendor id, and uses this to set > hdmi->edid_cfg.hdmi_cap, which is then used to set mdvi appropriately, > rather than detecting whether we are outputting a CEA mode. Update > the dw_hdmi code to use this logic, but lets eliminate the mdvi > variable, prefering the more verbose "hdmi->sink_is_hdmi" instead. > > Use the generic drm_detect_hdmi_monitor() to detect a HDMI sink. > > Signed-off-by: Russell King Actually I have posted similarly changes before, feel better about this one, and I have backport those 06/12 & 07/12 to chrome-3.14 tree, audio still works rightly when I changing the display resolutions. So I would like to share: Tested-by: Yakir Yang Besides, Andy, would you like to share your ACK here :) Best regards, - Yakir > --- > drivers/gpu/drm/bridge/dw_hdmi.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c > index 2e211b8331ed..7f764716f3c4 100644 > --- a/drivers/gpu/drm/bridge/dw_hdmi.c > +++ b/drivers/gpu/drm/bridge/dw_hdmi.c > @@ -82,7 +82,6 @@ static const u16 csc_coeff_rgb_in_eitu709[3][4] = { > }; > > struct hdmi_vmode { > - bool mdvi; > bool mdataenablepolarity; > > unsigned int mpixelclock; > @@ -123,6 +122,7 @@ struct dw_hdmi { > > struct i2c_adapter *ddc; > void __iomem *regs; > + bool sink_is_hdmi; > > spinlock_t audio_lock; > struct mutex audio_mutex; > @@ -913,11 +913,10 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep, > static int dw_hdmi_phy_init(struct dw_hdmi *hdmi) > { > int i, ret; > - bool cscon = false; > + bool cscon; > > /*check csc whether needed activated in HDMI mode */ > - cscon = (is_color_space_conversion(hdmi) && > - !hdmi->hdmi_data.video_mode.mdvi); > + cscon = hdmi->sink_is_hdmi && is_color_space_conversion(hdmi); > > /* HDMI Phy spec says to do the phy initialization sequence twice */ > for (i = 0; i < 2; i++) { > @@ -1094,9 +1093,9 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi, > HDMI_FC_INVIDCONF_IN_I_P_INTERLACED : > HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE; > > - inv_val |= (vmode->mdvi ? > - HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE : > - HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE); > + inv_val |= hdmi->sink_is_hdmi ? > + HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE : > + HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE; > > hdmi_writeb(hdmi, inv_val, HDMI_FC_INVIDCONF); > > @@ -1236,10 +1235,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > if (!hdmi->vic) { > dev_dbg(hdmi->dev, "Non-CEA mode used in HDMI\n"); > - hdmi->hdmi_data.video_mode.mdvi = true; > } else { > dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic); > - hdmi->hdmi_data.video_mode.mdvi = false; > } > > if ((hdmi->vic == 6) || (hdmi->vic == 7) || > @@ -1275,10 +1272,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > dw_hdmi_enable_video_path(hdmi); > > /* not for DVI mode */ > - if (hdmi->hdmi_data.video_mode.mdvi) { > - dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > - } else { > - dev_dbg(hdmi->dev, "%s CEA mode\n", __func__); > + if (hdmi->sink_is_hdmi) { > + dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__); > > /* HDMI Initialization Step E - Configure audio */ > hdmi_clk_regenerator_update_pixel_clock(hdmi); > @@ -1286,6 +1281,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > /* HDMI Initialization Step F - Configure AVI InfoFrame */ > hdmi_config_AVI(hdmi, mode); > + } else { > + dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > } > > hdmi_video_packetize(hdmi); > @@ -1294,7 +1291,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > hdmi_tx_hdcp_config(hdmi); > > dw_hdmi_clear_overflow(hdmi); > - if (hdmi->cable_plugin && !hdmi->hdmi_data.video_mode.mdvi) > + if (hdmi->cable_plugin && hdmi->sink_is_hdmi) > hdmi_enable_overflow_interrupts(hdmi); > > return 0; > @@ -1444,6 +1441,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) > dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n", > edid->width_cm, edid->height_cm); > > + hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid); > drm_mode_connector_update_edid_property(connector, edid); > ret = drm_add_edid_modes(connector, edid); > kfree(edid); From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yakir Yang Subject: Re: [PATCH 06/12] drm: bridge/dw_hdmi: clean up HDMI vs DVI mode handling Date: Wed, 07 Oct 2015 11:40:30 +0800 Message-ID: <5614942E.3010702@rock-chips.com> References: <20150808160251.GM7557@n2100.arm.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Russell King , linux-rockchip@lists.infradead.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: Fabio Estevam , Andy Yan List-Id: linux-rockchip.vger.kernel.org SGkgUnVzc2VsbCAmIEFuZHkKCk9uIDA4LzA5LzIwMTUgMTI6MDMgQU0sIFJ1c3NlbGwgS2luZyB3 cm90ZToKPiBUaGUgRlNMIGtlcm5lbCBkZXRlY3RzIHRoZSBIRE1JIHZlbmRvciBpZCwgYW5kIHVz ZXMgdGhpcyB0byBzZXQKPiBoZG1pLT5lZGlkX2NmZy5oZG1pX2NhcCwgd2hpY2ggaXMgdGhlbiB1 c2VkIHRvIHNldCBtZHZpIGFwcHJvcHJpYXRlbHksCj4gcmF0aGVyIHRoYW4gZGV0ZWN0aW5nIHdo ZXRoZXIgd2UgYXJlIG91dHB1dHRpbmcgYSBDRUEgbW9kZS4gIFVwZGF0ZQo+IHRoZSBkd19oZG1p IGNvZGUgdG8gdXNlIHRoaXMgbG9naWMsIGJ1dCBsZXRzIGVsaW1pbmF0ZSB0aGUgbWR2aQo+IHZh cmlhYmxlLCBwcmVmZXJpbmcgdGhlIG1vcmUgdmVyYm9zZSAiaGRtaS0+c2lua19pc19oZG1pIiBp bnN0ZWFkLgo+Cj4gVXNlIHRoZSBnZW5lcmljIGRybV9kZXRlY3RfaGRtaV9tb25pdG9yKCkgdG8g ZGV0ZWN0IGEgSERNSSBzaW5rLgo+Cj4gU2lnbmVkLW9mZi1ieTogUnVzc2VsbCBLaW5nIDxybWsr a2VybmVsQGFybS5saW51eC5vcmcudWs+CgpBY3R1YWxseSBJIGhhdmUgcG9zdGVkIHNpbWlsYXJs eSBjaGFuZ2VzIGJlZm9yZSwgZmVlbCBiZXR0ZXIgYWJvdXQKdGhpcyBvbmUsIGFuZCBJIGhhdmUg YmFja3BvcnQgdGhvc2UgMDYvMTIgJiAwNy8xMiB0byBjaHJvbWUtMy4xNAp0cmVlLCBhdWRpbyBz dGlsbCB3b3JrcyByaWdodGx5IHdoZW4gSSBjaGFuZ2luZyB0aGUgZGlzcGxheSByZXNvbHV0aW9u cy4KU28gSSB3b3VsZCBsaWtlIHRvIHNoYXJlOgoKVGVzdGVkLWJ5OiBZYWtpciBZYW5nIDx5a2tA cm9jay1jaGlwcy5jb20+CgpCZXNpZGVzLCBBbmR5LCB3b3VsZCB5b3UgbGlrZSB0byBzaGFyZSB5 b3VyIEFDSyBoZXJlIDopCgpCZXN0IHJlZ2FyZHMsCi0gWWFraXIKPiAtLS0KPiAgIGRyaXZlcnMv Z3B1L2RybS9icmlkZ2UvZHdfaGRtaS5jIHwgMjYgKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0K PiAgIDEgZmlsZSBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkKPgo+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3X2hkbWkuYyBiL2RyaXZlcnMv Z3B1L2RybS9icmlkZ2UvZHdfaGRtaS5jCj4gaW5kZXggMmUyMTFiODMzMWVkLi43Zjc2NDcxNmYz YzQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9kd19oZG1pLmMKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3X2hkbWkuYwo+IEBAIC04Miw3ICs4Miw2IEBAIHN0 YXRpYyBjb25zdCB1MTYgY3NjX2NvZWZmX3JnYl9pbl9laXR1NzA5WzNdWzRdID0gewo+ICAgfTsK PiAgIAo+ICAgc3RydWN0IGhkbWlfdm1vZGUgewo+IC0JYm9vbCBtZHZpOwo+ICAgCWJvb2wgbWRh dGFlbmFibGVwb2xhcml0eTsKPiAgIAo+ICAgCXVuc2lnbmVkIGludCBtcGl4ZWxjbG9jazsKPiBA QCAtMTIzLDYgKzEyMiw3IEBAIHN0cnVjdCBkd19oZG1pIHsKPiAgIAo+ICAgCXN0cnVjdCBpMmNf YWRhcHRlciAqZGRjOwo+ICAgCXZvaWQgX19pb21lbSAqcmVnczsKPiArCWJvb2wgc2lua19pc19o ZG1pOwo+ICAgCj4gICAJc3BpbmxvY2tfdCBhdWRpb19sb2NrOwo+ICAgCXN0cnVjdCBtdXRleCBh dWRpb19tdXRleDsKPiBAQCAtOTEzLDExICs5MTMsMTAgQEAgc3RhdGljIGludCBoZG1pX3BoeV9j b25maWd1cmUoc3RydWN0IGR3X2hkbWkgKmhkbWksIHVuc2lnbmVkIGNoYXIgcHJlcCwKPiAgIHN0 YXRpYyBpbnQgZHdfaGRtaV9waHlfaW5pdChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSkKPiAgIHsKPiAg IAlpbnQgaSwgcmV0Owo+IC0JYm9vbCBjc2NvbiA9IGZhbHNlOwo+ICsJYm9vbCBjc2NvbjsKPiAg IAo+ICAgCS8qY2hlY2sgY3NjIHdoZXRoZXIgbmVlZGVkIGFjdGl2YXRlZCBpbiBIRE1JIG1vZGUg Ki8KPiAtCWNzY29uID0gKGlzX2NvbG9yX3NwYWNlX2NvbnZlcnNpb24oaGRtaSkgJiYKPiAtCQkJ IWhkbWktPmhkbWlfZGF0YS52aWRlb19tb2RlLm1kdmkpOwo+ICsJY3Njb24gPSBoZG1pLT5zaW5r X2lzX2hkbWkgJiYgaXNfY29sb3Jfc3BhY2VfY29udmVyc2lvbihoZG1pKTsKPiAgIAo+ICAgCS8q IEhETUkgUGh5IHNwZWMgc2F5cyB0byBkbyB0aGUgcGh5IGluaXRpYWxpemF0aW9uIHNlcXVlbmNl IHR3aWNlICovCj4gICAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewo+IEBAIC0xMDk0LDkgKzEw OTMsOSBAQCBzdGF0aWMgdm9pZCBoZG1pX2F2X2NvbXBvc2VyKHN0cnVjdCBkd19oZG1pICpoZG1p LAo+ICAgCQlIRE1JX0ZDX0lOVklEQ09ORl9JTl9JX1BfSU5URVJMQUNFRCA6Cj4gICAJCUhETUlf RkNfSU5WSURDT05GX0lOX0lfUF9QUk9HUkVTU0lWRTsKPiAgIAo+IC0JaW52X3ZhbCB8PSAodm1v ZGUtPm1kdmkgPwo+IC0JCUhETUlfRkNfSU5WSURDT05GX0RWSV9NT0RFWl9EVklfTU9ERSA6Cj4g LQkJSERNSV9GQ19JTlZJRENPTkZfRFZJX01PREVaX0hETUlfTU9ERSk7Cj4gKwlpbnZfdmFsIHw9 IGhkbWktPnNpbmtfaXNfaGRtaSA/Cj4gKwkJSERNSV9GQ19JTlZJRENPTkZfRFZJX01PREVaX0hE TUlfTU9ERSA6Cj4gKwkJSERNSV9GQ19JTlZJRENPTkZfRFZJX01PREVaX0RWSV9NT0RFOwo+ICAg Cj4gICAJaGRtaV93cml0ZWIoaGRtaSwgaW52X3ZhbCwgSERNSV9GQ19JTlZJRENPTkYpOwo+ICAg Cj4gQEAgLTEyMzYsMTAgKzEyMzUsOCBAQCBzdGF0aWMgaW50IGR3X2hkbWlfc2V0dXAoc3RydWN0 IGR3X2hkbWkgKmhkbWksIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICAgCj4gICAJ aWYgKCFoZG1pLT52aWMpIHsKPiAgIAkJZGV2X2RiZyhoZG1pLT5kZXYsICJOb24tQ0VBIG1vZGUg dXNlZCBpbiBIRE1JXG4iKTsKPiAtCQloZG1pLT5oZG1pX2RhdGEudmlkZW9fbW9kZS5tZHZpID0g dHJ1ZTsKPiAgIAl9IGVsc2Ugewo+ICAgCQlkZXZfZGJnKGhkbWktPmRldiwgIkNFQSBtb2RlIHVz ZWQgdmljPSVkXG4iLCBoZG1pLT52aWMpOwo+IC0JCWhkbWktPmhkbWlfZGF0YS52aWRlb19tb2Rl Lm1kdmkgPSBmYWxzZTsKPiAgIAl9Cj4gICAKPiAgIAlpZiAoKGhkbWktPnZpYyA9PSA2KSB8fCAo aGRtaS0+dmljID09IDcpIHx8Cj4gQEAgLTEyNzUsMTAgKzEyNzIsOCBAQCBzdGF0aWMgaW50IGR3 X2hkbWlfc2V0dXAoc3RydWN0IGR3X2hkbWkgKmhkbWksIHN0cnVjdCBkcm1fZGlzcGxheV9tb2Rl ICptb2RlKQo+ICAgCWR3X2hkbWlfZW5hYmxlX3ZpZGVvX3BhdGgoaGRtaSk7Cj4gICAKPiAgIAkv KiBub3QgZm9yIERWSSBtb2RlICovCj4gLQlpZiAoaGRtaS0+aGRtaV9kYXRhLnZpZGVvX21vZGUu bWR2aSkgewo+IC0JCWRldl9kYmcoaGRtaS0+ZGV2LCAiJXMgRFZJIG1vZGVcbiIsIF9fZnVuY19f KTsKPiAtCX0gZWxzZSB7Cj4gLQkJZGV2X2RiZyhoZG1pLT5kZXYsICIlcyBDRUEgbW9kZVxuIiwg X19mdW5jX18pOwo+ICsJaWYgKGhkbWktPnNpbmtfaXNfaGRtaSkgewo+ICsJCWRldl9kYmcoaGRt aS0+ZGV2LCAiJXMgSERNSSBtb2RlXG4iLCBfX2Z1bmNfXyk7Cj4gICAKPiAgIAkJLyogSERNSSBJ bml0aWFsaXphdGlvbiBTdGVwIEUgLSBDb25maWd1cmUgYXVkaW8gKi8KPiAgIAkJaGRtaV9jbGtf cmVnZW5lcmF0b3JfdXBkYXRlX3BpeGVsX2Nsb2NrKGhkbWkpOwo+IEBAIC0xMjg2LDYgKzEyODEs OCBAQCBzdGF0aWMgaW50IGR3X2hkbWlfc2V0dXAoc3RydWN0IGR3X2hkbWkgKmhkbWksIHN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICAgCj4gICAJCS8qIEhETUkgSW5pdGlhbGl6YXRp b24gU3RlcCBGIC0gQ29uZmlndXJlIEFWSSBJbmZvRnJhbWUgKi8KPiAgIAkJaGRtaV9jb25maWdf QVZJKGhkbWksIG1vZGUpOwo+ICsJfSBlbHNlIHsKPiArCQlkZXZfZGJnKGhkbWktPmRldiwgIiVz IERWSSBtb2RlXG4iLCBfX2Z1bmNfXyk7Cj4gICAJfQo+ICAgCj4gICAJaGRtaV92aWRlb19wYWNr ZXRpemUoaGRtaSk7Cj4gQEAgLTEyOTQsNyArMTI5MSw3IEBAIHN0YXRpYyBpbnQgZHdfaGRtaV9z ZXR1cChzdHJ1Y3QgZHdfaGRtaSAqaGRtaSwgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUp Cj4gICAJaGRtaV90eF9oZGNwX2NvbmZpZyhoZG1pKTsKPiAgIAo+ICAgCWR3X2hkbWlfY2xlYXJf b3ZlcmZsb3coaGRtaSk7Cj4gLQlpZiAoaGRtaS0+Y2FibGVfcGx1Z2luICYmICFoZG1pLT5oZG1p X2RhdGEudmlkZW9fbW9kZS5tZHZpKQo+ICsJaWYgKGhkbWktPmNhYmxlX3BsdWdpbiAmJiBoZG1p LT5zaW5rX2lzX2hkbWkpCj4gICAJCWhkbWlfZW5hYmxlX292ZXJmbG93X2ludGVycnVwdHMoaGRt aSk7Cj4gICAKPiAgIAlyZXR1cm4gMDsKPiBAQCAtMTQ0NCw2ICsxNDQxLDcgQEAgc3RhdGljIGlu dCBkd19oZG1pX2Nvbm5lY3Rvcl9nZXRfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvcikKPiAgIAkJZGV2X2RiZyhoZG1pLT5kZXYsICJnb3QgZWRpZDogd2lkdGhbJWRdIHggaGVp Z2h0WyVkXVxuIiwKPiAgIAkJCWVkaWQtPndpZHRoX2NtLCBlZGlkLT5oZWlnaHRfY20pOwo+ICAg Cj4gKwkJaGRtaS0+c2lua19pc19oZG1pID0gZHJtX2RldGVjdF9oZG1pX21vbml0b3IoZWRpZCk7 Cj4gICAJCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3Is IGVkaWQpOwo+ICAgCQlyZXQgPSBkcm1fYWRkX2VkaWRfbW9kZXMoY29ubmVjdG9yLCBlZGlkKTsK PiAgIAkJa2ZyZWUoZWRpZCk7CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9k cmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: ykk@rock-chips.com (Yakir Yang) Date: Wed, 07 Oct 2015 11:40:30 +0800 Subject: [PATCH 06/12] drm: bridge/dw_hdmi: clean up HDMI vs DVI mode handling In-Reply-To: References: <20150808160251.GM7557@n2100.arm.linux.org.uk> Message-ID: <5614942E.3010702@rock-chips.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org Hi Russell & Andy On 08/09/2015 12:03 AM, Russell King wrote: > The FSL kernel detects the HDMI vendor id, and uses this to set > hdmi->edid_cfg.hdmi_cap, which is then used to set mdvi appropriately, > rather than detecting whether we are outputting a CEA mode. Update > the dw_hdmi code to use this logic, but lets eliminate the mdvi > variable, prefering the more verbose "hdmi->sink_is_hdmi" instead. > > Use the generic drm_detect_hdmi_monitor() to detect a HDMI sink. > > Signed-off-by: Russell King Actually I have posted similarly changes before, feel better about this one, and I have backport those 06/12 & 07/12 to chrome-3.14 tree, audio still works rightly when I changing the display resolutions. So I would like to share: Tested-by: Yakir Yang Besides, Andy, would you like to share your ACK here :) Best regards, - Yakir > --- > drivers/gpu/drm/bridge/dw_hdmi.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) > > diff --git a/drivers/gpu/drm/bridge/dw_hdmi.c b/drivers/gpu/drm/bridge/dw_hdmi.c > index 2e211b8331ed..7f764716f3c4 100644 > --- a/drivers/gpu/drm/bridge/dw_hdmi.c > +++ b/drivers/gpu/drm/bridge/dw_hdmi.c > @@ -82,7 +82,6 @@ static const u16 csc_coeff_rgb_in_eitu709[3][4] = { > }; > > struct hdmi_vmode { > - bool mdvi; > bool mdataenablepolarity; > > unsigned int mpixelclock; > @@ -123,6 +122,7 @@ struct dw_hdmi { > > struct i2c_adapter *ddc; > void __iomem *regs; > + bool sink_is_hdmi; > > spinlock_t audio_lock; > struct mutex audio_mutex; > @@ -913,11 +913,10 @@ static int hdmi_phy_configure(struct dw_hdmi *hdmi, unsigned char prep, > static int dw_hdmi_phy_init(struct dw_hdmi *hdmi) > { > int i, ret; > - bool cscon = false; > + bool cscon; > > /*check csc whether needed activated in HDMI mode */ > - cscon = (is_color_space_conversion(hdmi) && > - !hdmi->hdmi_data.video_mode.mdvi); > + cscon = hdmi->sink_is_hdmi && is_color_space_conversion(hdmi); > > /* HDMI Phy spec says to do the phy initialization sequence twice */ > for (i = 0; i < 2; i++) { > @@ -1094,9 +1093,9 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi, > HDMI_FC_INVIDCONF_IN_I_P_INTERLACED : > HDMI_FC_INVIDCONF_IN_I_P_PROGRESSIVE; > > - inv_val |= (vmode->mdvi ? > - HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE : > - HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE); > + inv_val |= hdmi->sink_is_hdmi ? > + HDMI_FC_INVIDCONF_DVI_MODEZ_HDMI_MODE : > + HDMI_FC_INVIDCONF_DVI_MODEZ_DVI_MODE; > > hdmi_writeb(hdmi, inv_val, HDMI_FC_INVIDCONF); > > @@ -1236,10 +1235,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > if (!hdmi->vic) { > dev_dbg(hdmi->dev, "Non-CEA mode used in HDMI\n"); > - hdmi->hdmi_data.video_mode.mdvi = true; > } else { > dev_dbg(hdmi->dev, "CEA mode used vic=%d\n", hdmi->vic); > - hdmi->hdmi_data.video_mode.mdvi = false; > } > > if ((hdmi->vic == 6) || (hdmi->vic == 7) || > @@ -1275,10 +1272,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > dw_hdmi_enable_video_path(hdmi); > > /* not for DVI mode */ > - if (hdmi->hdmi_data.video_mode.mdvi) { > - dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > - } else { > - dev_dbg(hdmi->dev, "%s CEA mode\n", __func__); > + if (hdmi->sink_is_hdmi) { > + dev_dbg(hdmi->dev, "%s HDMI mode\n", __func__); > > /* HDMI Initialization Step E - Configure audio */ > hdmi_clk_regenerator_update_pixel_clock(hdmi); > @@ -1286,6 +1281,8 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > > /* HDMI Initialization Step F - Configure AVI InfoFrame */ > hdmi_config_AVI(hdmi, mode); > + } else { > + dev_dbg(hdmi->dev, "%s DVI mode\n", __func__); > } > > hdmi_video_packetize(hdmi); > @@ -1294,7 +1291,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) > hdmi_tx_hdcp_config(hdmi); > > dw_hdmi_clear_overflow(hdmi); > - if (hdmi->cable_plugin && !hdmi->hdmi_data.video_mode.mdvi) > + if (hdmi->cable_plugin && hdmi->sink_is_hdmi) > hdmi_enable_overflow_interrupts(hdmi); > > return 0; > @@ -1444,6 +1441,7 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) > dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n", > edid->width_cm, edid->height_cm); > > + hdmi->sink_is_hdmi = drm_detect_hdmi_monitor(edid); > drm_mode_connector_update_edid_property(connector, edid); > ret = drm_add_edid_modes(connector, edid); > kfree(edid);