Received: by 10.223.176.46 with SMTP id f43csp4034246wra; Tue, 23 Jan 2018 03:14:14 -0800 (PST) X-Google-Smtp-Source: AH8x227p91m8Fey3xkThBgkJ+EupDjlzonoC4eDFBYmGWMxqnLMBELAr2n/eggIpneCLT3uX6DFC X-Received: by 10.98.61.22 with SMTP id k22mr10107575pfa.133.1516706054405; Tue, 23 Jan 2018 03:14:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516706054; cv=none; d=google.com; s=arc-20160816; b=bS4VaxNx0qp0hWsmbo+tFd3uo++p4em05WZ/dQpGBx1CZ0AR5PBNkHunxu52qnDKWD DWHkvMP0ntKLBN33qNqaPOjhL2vrTlRSKm0nVFB5PYpysF/EXSltfX/52gll5cR7uKty eLJQtLxZ+fJOEpatEyV6izkgzuZdxl/8CZKY7KPSv8cEJi1EMUdxIuu5JNG4zPANpzeS kAe7gp1qXoAqnRzUdx1+342w0HtY0XTZpCPCDuBSfsMTF+VgMSyMiNKfMjf6zWMRj3VL ULiflYneYRhom0N6fkzcuSX/W9B5x/9JZZaRon9H0dszVr+DIQWRD1QYbTj8NHAPxsE6 uVpg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:cms-type:message-id:date :subject:cc:to:from:dkim-signature:dkim-filter :arc-authentication-results; bh=fNqoe0WSQw8jScO9nia49CZyAhzcslShf4+5/EZsWUM=; b=ymLPYecYx2RUEK/FzmgJTid/zskU4+5tRwiRb619FbdKIO5T1iTZn5PUjcYaXE2HIa JbCO8gBPrJ54Twm7FB+jsItCrEKDze36R/tw7Pd2iZltmqHmqHxBYdVjX7Q1MT+l5R6E 0kNtfoNylEnvSp0DsG+VTb20lMski21s5nzbn8BoE6jqrzFEx8Gl1yHpF6B56PiMz6nV kdbwsi4WhsdXPMybR3UexqK0HPRifMHxD8EBx4L7savZ/sEVtX/icDn5b1KmdUiIMdh4 axpdk8+es0x4+I8j07RScoVCIf5FurahitHtfGRxgDytPqHmWC3bP0rqk16nbV6u2oGS UhHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=hk5/epPq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b1si9564784pge.137.2018.01.23.03.13.59; Tue, 23 Jan 2018 03:14:14 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@samsung.com header.s=mail20170921 header.b=hk5/epPq; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=samsung.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751192AbeAWLNe (ORCPT + 99 others); Tue, 23 Jan 2018 06:13:34 -0500 Received: from mailout2.w1.samsung.com ([210.118.77.12]:45005 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751086AbeAWLNc (ORCPT ); Tue, 23 Jan 2018 06:13:32 -0500 Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20180123111330euoutp02b7b02138efdfb517e6542055973c6e0f~MbBSpTHNv3198431984euoutp02J; Tue, 23 Jan 2018 11:13:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20180123111330euoutp02b7b02138efdfb517e6542055973c6e0f~MbBSpTHNv3198431984euoutp02J DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1516706010; bh=fNqoe0WSQw8jScO9nia49CZyAhzcslShf4+5/EZsWUM=; h=From:To:Cc:Subject:Date:References:From; b=hk5/epPq9Dwj8EoZelEQ7+I+yryVDSizPj69fI+wCWZUQ75Zzp2jVs4CmCjPfFKf3 mX8AGcZxV8wccqVzINEtKfworq5pmhuiYxCIbzSMfYI6vIjuhF89jRM3DZqxbgPjtq NOR/KSKswaDQgpy5+tpv5h9kiq4fEj1OrlZqxhU0= Received: from eusmges5.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20180123111329eucas1p1a8f5a915017ffe241051b695e47d4a45~MbBR4-bGY1858618586eucas1p17; Tue, 23 Jan 2018 11:13:29 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges5.samsung.com (EUCPMTA) with SMTP id 50.0B.12743.9D8176A5; Tue, 23 Jan 2018 11:13:29 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20180123111328eucas1p2f9b9aa506e5edda012ab8f40230f6d28~MbBROjRyf1086510865eucas1p28; Tue, 23 Jan 2018 11:13:28 +0000 (GMT) X-AuditID: cbfec7f5-f79d06d0000031c7-18-5a6718d9a5fd Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id B4.F0.18832.8D8176A5; Tue, 23 Jan 2018 11:13:28 +0000 (GMT) Received: from AMDC2075.DIGITAL.local ([106.120.51.25]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0P3000MHA9U91T80@eusync3.samsung.com>; Tue, 23 Jan 2018 11:13:28 +0000 (GMT) From: Maciej Purski To: dri-devel@lists.freedesktop.org Cc: Archit Taneja , Andrzej Hajda , Laurent Pinchart , David Airlie , Bartlomiej Zolnierkiewicz , Marek Szyprowski , linux-kernel@vger.kernel.org, Maciej Purski Subject: [PATCH v2] drm/bridge/sii8620: fix HDMI cable connection to dongle Date: Tue, 23 Jan 2018 12:13:16 +0100 Message-id: <1516705996-8928-1-git-send-email-m.purski@samsung.com> X-Mailer: git-send-email 2.7.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrFIsWRmVeSWpSXmKPExsWy7djP87o3JdKjDJ5cl7S4te4cq0XvuZNM Fk0db1ktNs5Yz2px5et7NovOiUvYLS7vmsNmseDlLRaLtUfusjtwelzu62XymN0xk9Vj+7cH rB73u48zefRtWcXo8XmTXABbFJdNSmpOZllqkb5dAlfG5ta8gtuGFev72pgaGKdpdjFycEgI mEj8mizfxcgJZIpJXLi3nq2LkYtDSGApo0T3pkPMIAkhgc+MEsu/BcLUf7gWD1GzjFHi0bJm dgjnP5Bzei4LSBGbgJbEmvZ4kF4RAWWJvxNXMYLUMAtcZZI4eXk7E0hCWMBbYs2efewgNouA qsSBJ5vYQGxeAWeJ9tffWCEukpO4ea6TGaRZQqCHTeLggTeMEAkXicbph1ggbGGJV8e3sEPY MhKdHQeZIOxqiYtfd7FB2DUSjbc3QNVYS3yetAXsM2YBPolJ26YzQ3zGK9HRJgRR4iFxYNtU Voiwo8SNiY4gppBArMTynyITGKUWMDKsYhRJLS3OTU8tNtUrTswtLs1L10vOz93ECIzR0/+O f93BuPSY1SFGAQ5GJR5eBca0KCHWxLLiytxDjBIczEoivHms6VFCvCmJlVWpRfnxRaU5qcWH GKU5WJTEeW2j2iKFBNITS1KzU1MLUotgskwcnFINjCsMclfETJ39i313s8ofASbv4x3pmlZP mT6/nFZsafKeT9vEZCnvNy6hUBu7De/CFF1Y9xjpFX7tEw54s07SKlLj0ewdsl1ua4UOfmgJ 91+486PAu9lFGl/uGXvF2tYcexp6X8RbiePwRwMJWZdr231fMpsL1NrfKbjAqCnRtPgWm27z 30nvlFiKMxINtZiLihMBfDPzg80CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupgluLIzCtJLcpLzFFi42I5/e/4Vd0bEulRBh/eWVncWneO1aL33Ekm i6aOt6wWG2esZ7W48vU9m0XnxCXsFpd3zWGzWPDyFovF2iN32R04PS739TJ5zO6Yyeqx/dsD Vo/73ceZPPq2rGL0+LxJLoAtissmJTUnsyy1SN8ugStjc2tewW3DivV9bUwNjNM0uxg5OCQE TCQ+XIvvYuQEMsUkLtxbz9bFyMUhJLCEUaJ112ZWCKeRSeLA1UeMIA1sAloSa9rBGkQElCX+ TlzFCFLDLHCTSeLv2b2sIAlhAW+JNXv2sYPYLAKqEgeebGIDsXkFnCXaX39jhdgmJ3HzXCfz BEbuBYwMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQLDZ9uxn5t3MF7aGHyIUYCDUYmHV4Ex LUqINbGsuDL3EKMEB7OSCG8ea3qUEG9KYmVValF+fFFpTmrxIUZpDhYlcd7ePasjhQTSE0tS s1NTC1KLYLJMHJxSDYzaXpHnLVSZBT5XCMaEO7qeP2O10H5p2tMbn2+Z8j64wHh7sSiTaOTX A0caGBLc86uUn9VbRe8Jn+WR+Y3Nzm5l3YeLC32Up1Q//P66U/F9vHU7r+PlTb96HKbNcd/8 /aLu1sQJcmFiKtkx5oz5WdqbWSo29fi7qmkwL9A6Uz2NKdKngLlKRYmlOCPRUIu5qDgRAJhB UNQbAgAA X-CMS-MailID: 20180123111328eucas1p2f9b9aa506e5edda012ab8f40230f6d28 X-Msg-Generator: CA CMS-TYPE: 201P X-CMS-RootMailID: 20180123111328eucas1p2f9b9aa506e5edda012ab8f40230f6d28 X-RootMTR: 20180123111328eucas1p2f9b9aa506e5edda012ab8f40230f6d28 References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org MHL bridge is usually connected to TV via MHL dongle. Currently plugging HDMI cable to dongle is handled improperly. Fix it by splitting connecting of a dongle and a HDMI cable. The driver should now handle unplugging a sink from a dongle and plugging a different sink with new edid. Tested on MHL1, MHL2 and MHL3 using various vendors' dongles both in DVI and HDMI mode. Signed-off-by: Maciej Purski --- Changes in v2: - handle MHL1 and MHL2 initialization sequence - rename hpd_plugged() function to identify_sink(), as it is now used in different contexts - fix commit message --- drivers/gpu/drm/bridge/sil-sii8620.c | 64 +++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/drm/bridge/sil-sii8620.c b/drivers/gpu/drm/bridge/sil-sii8620.c index 46ccceb..5168783 100644 --- a/drivers/gpu/drm/bridge/sil-sii8620.c +++ b/drivers/gpu/drm/bridge/sil-sii8620.c @@ -78,6 +78,9 @@ struct sii8620 { u8 devcap[MHL_DCAP_SIZE]; u8 xdevcap[MHL_XDC_SIZE]; u8 avif[HDMI_INFOFRAME_SIZE(AVI)]; + bool feature_complete; + bool devcap_read; + bool sink_detected; struct edid *edid; unsigned int gen2_write_burst:1; enum sii8620_mt_state mt_state; @@ -470,7 +473,7 @@ static void sii8620_update_array(u8 *dst, u8 *src, int count) } } -static void sii8620_sink_detected(struct sii8620 *ctx, int ret) +static void sii8620_identify_sink(struct sii8620 *ctx) { static const char * const sink_str[] = { [SINK_NONE] = "NONE", @@ -481,7 +484,7 @@ static void sii8620_sink_detected(struct sii8620 *ctx, int ret) char sink_name[20]; struct device *dev = ctx->dev; - if (ret < 0) + if (!ctx->sink_detected || !ctx->devcap_read) return; sii8620_fetch_edid(ctx); @@ -490,6 +493,7 @@ static void sii8620_sink_detected(struct sii8620 *ctx, int ret) sii8620_mhl_disconnected(ctx); return; } + sii8620_set_upstream_edid(ctx); if (drm_detect_hdmi_monitor(ctx->edid)) ctx->sink_type = SINK_HDMI; @@ -502,15 +506,6 @@ static void sii8620_sink_detected(struct sii8620 *ctx, int ret) sink_str[ctx->sink_type], sink_name); } -static void sii8620_edid_read(struct sii8620 *ctx, int ret) -{ - if (ret < 0) - return; - - sii8620_set_upstream_edid(ctx); - sii8620_enable_hpd(ctx); -} - static void sii8620_mr_devcap(struct sii8620 *ctx) { u8 dcap[MHL_DCAP_SIZE]; @@ -526,6 +521,8 @@ static void sii8620_mr_devcap(struct sii8620 *ctx) dcap[MHL_DCAP_ADOPTER_ID_H], dcap[MHL_DCAP_ADOPTER_ID_L], dcap[MHL_DCAP_DEVICE_ID_H], dcap[MHL_DCAP_DEVICE_ID_L]); sii8620_update_array(ctx->devcap, dcap, MHL_DCAP_SIZE); + ctx->devcap_read = true; + sii8620_identify_sink(ctx); } static void sii8620_mr_xdevcap(struct sii8620 *ctx) @@ -1491,6 +1488,16 @@ static void sii8620_set_mode(struct sii8620 *ctx, enum sii8620_mode mode) ); } +static void sii8620_hpd_unplugged(struct sii8620 *ctx) +{ + sii8620_disable_hpd(ctx); + ctx->sink_type = SINK_NONE; + ctx->sink_detected = false; + ctx->feature_complete = false; + kfree(ctx->edid); + ctx->edid = NULL; +} + static void sii8620_disconnect(struct sii8620 *ctx) { sii8620_disable_gen2_write_burst(ctx); @@ -1518,7 +1525,7 @@ static void sii8620_disconnect(struct sii8620 *ctx) REG_MHL_DP_CTL6, 0x2A, REG_MHL_DP_CTL7, 0x03 ); - sii8620_disable_hpd(ctx); + sii8620_hpd_unplugged(ctx); sii8620_write_seq_static(ctx, REG_M3_CTRL, VAL_M3_CTRL_MHL3_VALUE, REG_MHL_COC_CTL1, 0x07, @@ -1566,10 +1573,8 @@ static void sii8620_disconnect(struct sii8620 *ctx) memset(ctx->xstat, 0, sizeof(ctx->xstat)); memset(ctx->devcap, 0, sizeof(ctx->devcap)); memset(ctx->xdevcap, 0, sizeof(ctx->xdevcap)); + ctx->devcap_read = false; ctx->cbus_status = 0; - ctx->sink_type = SINK_NONE; - kfree(ctx->edid); - ctx->edid = NULL; sii8620_mt_cleanup(ctx); } @@ -1660,9 +1665,6 @@ static void sii8620_status_changed_path(struct sii8620 *ctx) sii8620_mt_write_stat(ctx, MHL_DST_REG(LINK_MODE), MHL_DST_LM_CLK_MODE_NORMAL | MHL_DST_LM_PATH_ENABLED); - if (!sii8620_is_mhl3(ctx)) - sii8620_mt_read_devcap(ctx, false); - sii8620_mt_set_cont(ctx, sii8620_sink_detected); } else { sii8620_mt_write_stat(ctx, MHL_DST_REG(LINK_MODE), MHL_DST_LM_CLK_MODE_NORMAL); @@ -1679,9 +1681,13 @@ static void sii8620_msc_mr_write_stat(struct sii8620 *ctx) sii8620_update_array(ctx->stat, st, MHL_DST_SIZE); sii8620_update_array(ctx->xstat, xst, MHL_XDS_SIZE); - if (ctx->stat[MHL_DST_CONNECTED_RDY] & MHL_DST_CONN_DCAP_RDY) + if (ctx->stat[MHL_DST_CONNECTED_RDY] & st[MHL_DST_CONNECTED_RDY] & MHL_DST_CONN_DCAP_RDY) { sii8620_status_dcap_ready(ctx); + if (!sii8620_is_mhl3(ctx)) + sii8620_mt_read_devcap(ctx, false); + } + if (st[MHL_DST_LINK_MODE] & MHL_DST_LM_PATH_ENABLED) sii8620_status_changed_path(ctx); } @@ -1765,8 +1771,11 @@ static void sii8620_msc_mr_set_int(struct sii8620 *ctx) } if (ints[MHL_INT_RCHANGE] & MHL_INT_RC_FEAT_REQ) sii8620_send_features(ctx); - if (ints[MHL_INT_RCHANGE] & MHL_INT_RC_FEAT_COMPLETE) - sii8620_edid_read(ctx, 0); + if (ints[MHL_INT_RCHANGE] & MHL_INT_RC_FEAT_COMPLETE) { + ctx->feature_complete = true; + if (ctx->edid) + sii8620_enable_hpd(ctx); + } } static struct sii8620_mt_msg *sii8620_msc_msg_first(struct sii8620 *ctx) @@ -1841,6 +1850,15 @@ static void sii8620_irq_msc(struct sii8620 *ctx) if (stat & BIT_CBUS_MSC_MR_WRITE_STAT) sii8620_msc_mr_write_stat(ctx); + if (stat & BIT_CBUS_HPD_CHG) { + if (ctx->cbus_status & BIT_CBUS_STATUS_CBUS_HPD) { + ctx->sink_detected = true; + sii8620_identify_sink(ctx); + } else { + sii8620_hpd_unplugged(ctx); + } + } + if (stat & BIT_CBUS_MSC_MR_SET_INT) sii8620_msc_mr_set_int(ctx); @@ -1952,11 +1970,11 @@ static void sii8620_irq_ddc(struct sii8620 *ctx) if (stat & BIT_DDC_CMD_DONE) { sii8620_write(ctx, REG_INTR3_MASK, 0); - if (sii8620_is_mhl3(ctx)) + if (sii8620_is_mhl3(ctx) && !ctx->feature_complete) sii8620_mt_set_int(ctx, MHL_INT_REG(RCHANGE), MHL_INT_RC_FEAT_REQ); else - sii8620_edid_read(ctx, 0); + sii8620_enable_hpd(ctx); } sii8620_write(ctx, REG_INTR3, stat); } -- 2.7.4