From patchwork Thu Apr 3 15:11:04 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rahul Sharma X-Patchwork-Id: 3933141 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C62C19F96D for ; Thu, 3 Apr 2014 15:52:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D0AAF202A1 for ; Thu, 3 Apr 2014 15:52:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id BB456202EA for ; Thu, 3 Apr 2014 15:52:11 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id A081D6E2C8; Thu, 3 Apr 2014 08:52:04 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by gabe.freedesktop.org (Postfix) with ESMTP id DE39C6E46E for ; Thu, 3 Apr 2014 08:12:18 -0700 (PDT) Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N3G00B1LNKINV30@mailout1.samsung.com> for dri-devel@lists.freedesktop.org; Fri, 04 Apr 2014 00:12:18 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.126]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 02.9B.09028.25A7D335; Fri, 04 Apr 2014 00:12:18 +0900 (KST) X-AuditID: cbfee68e-b7f566d000002344-74-533d7a525b3f Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id A9.B2.29263.15A7D335; Fri, 04 Apr 2014 00:12:18 +0900 (KST) Received: from localhost.localdomain ([107.108.83.245]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0N3G00IVZNJBV460@mmp2.samsung.com>; Fri, 04 Apr 2014 00:12:17 +0900 (KST) From: Rahul Sharma To: dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH 7/7] drm/exynos: replace hdmi reset with hdmi disable Date: Thu, 03 Apr 2014 20:41:04 +0530 Message-id: <1396537864-29291-8-git-send-email-rahul.sharma@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1396537864-29291-1-git-send-email-rahul.sharma@samsung.com> References: <1396537864-29291-1-git-send-email-rahul.sharma@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrHLMWRmVeSWpSXmKPExsWyRsSkTjeoyjbYYMFEXosrX9+zWUy6P4HF 4vuuL+wWM87vY7JY+CLeYsqiw6wW02ZvZHRg99g56y67x/3u40wefVtWMXp83iQXwBLFZZOS mpNZllqkb5fAlbFlwwqmgrVyFT/WqzUwHpTsYuTkkBAwkfj5t58FwhaTuHBvPRuILSSwlFHi 6KdCmJoZJx6xdzFyAcWnM0pMe9XKAuG0M0mcWvqCFaSKTUBXYvbBZ4wgtoiAm0TT4ZlgcWaB PkaJlj3FILawgKvE8UvnmEFsFgFViSP3ToFt4xXwkNgw6RyQzQG0TUFiziQbkDCngKfEl8+f GCEO8pD4ue8Q2BESAv3sEpeen2ODmCMg8W3yIRaIXlmJTQeYIY6WlDi44gbLBEbhBYwMqxhF UwuSC4qT0ouM9IoTc4tL89L1kvNzNzECw/r0v2d9OxhvHrA+xJgMNG4is5Rocj4wLvJK4g2N zYwsTE1MjY3MLc1IE1YS5130MClISCA9sSQ1OzW1ILUovqg0J7X4ECMTB6dUA6PWOu/jTfdb jy2NFOvU37/266X96p/uZq2ysHzw09LWe7r3joMMOyvPcIntURZUn7Zg2sW0PV82OiXJH5Q8 /kinR9zw5/r810d5f5t9mqPCrvyjrfrkGonPBbtc1fot+w4KNWbJn0pctc41zVF037r5mUH7 NOq81/7/xq/32lSCVd/vgaGhmJ4SS3FGoqEWc1FxIgAu5dgKgQIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDIsWRmVeSWpSXmKPExsVy+t9jQd2gKttgg33rmC2ufH3PZjHp/gQW i++7vrBbzDi/j8li4Yt4iymLDrNaTJu9kdGB3WPnrLvsHve7jzN59G1ZxejxeZNcAEtUA6NN RmpiSmqRQmpecn5KZl66rZJ3cLxzvKmZgaGuoaWFuZJCXmJuqq2Si0+ArltmDtAFSgpliTml QKGAxOJiJX07TBNCQ9x0LWAaI3R9Q4LgeowM0EDCGsaMLRtWMBWslav4sV6tgfGgZBcjJ4eE gInEjBOP2CFsMYkL99azdTFycQgJTGeUmPaqlQXCaWeSOLX0BStIFZuArsTsg88YQWwRATeJ psMzweLMAn2MEi17ikFsYQFXieOXzjGD2CwCqhJH7p1iA7F5BTwkNkw6B2RzAG1TkJgzyQYk zCngKfHl8yewkUJAJT/3HWKfwMi7gJFhFaNoakFyQXFSeq6hXnFibnFpXrpecn7uJkZw3DyT 2sG4ssHiEKMAB6MSDy9Hum2wEGtiWXFl7iFGCQ5mJRHeY4lAId6UxMqq1KL8+KLSnNTiQ4zJ QEdNZJYSTc4HxnReSbyhsYm5qbGppYmFiZklacJK4rwHWq0DhQTSE0tSs1NTC1KLYLYwcXBK NTDuarCQnCbx0y2iysNtvvcsy6x7u3403TCyDOLYH1UpszxawuXphQ+c539F+89P0k6WOrjY PzHbuHLi99eW3PnPo7J7RL+p8lscbulatbapvVX12SKBO2k8F0N+3T2+wWnC9vQA5aI9ja9Y n2qx5HaoTisNqAnNq7K6Z1fQsH9L++xj1w291JRYijMSDbWYi4oTATBsVnHfAgAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-Mailman-Approved-At: Thu, 03 Apr 2014 08:52:03 -0700 Cc: Shirish S , joshi@samsung.com, Rahul Sharma X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Before setting the core and timing generation registers, hdmi driver resets the whole hdmi hardware, which also resets the audio related registers. Hdmi reset is replaced by hdmi disable which is called just before setting the core and timing registers. It also ensure that audio settings are not changed. Signed-off-by: Rahul Sharma Signed-off-by: Shirish S --- drivers/gpu/drm/exynos/exynos_hdmi.c | 40 ++++++++++++++-------------------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index fce2f7b..4c69139 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c @@ -197,6 +197,7 @@ struct hdmi_context { struct i2c_client *hdmiphy_port; /* current hdmiphy conf regs */ + struct drm_display_mode current_mode; struct hdmi_conf_regs mode_conf; struct hdmi_resources res; @@ -1350,20 +1351,15 @@ static void hdmi_audio_control(struct hdmi_context *hdata, bool onoff) HDMI_ASP_EN : HDMI_ASP_DIS, HDMI_ASP_MASK); } -static void hdmi_conf_reset(struct hdmi_context *hdata) +static void hdmi_start(struct hdmi_context *hdata, bool start) { - u32 reg; + u32 val = start ? HDMI_TG_EN : 0; - if (hdata->type == HDMI_TYPE13) - reg = HDMI_V13_CORE_RSTOUT; - else - reg = HDMI_CORE_RSTOUT; + if (hdata->current_mode.flags & DRM_MODE_FLAG_INTERLACE) + val |= HDMI_FIELD_EN; - /* resetting HDMI core */ - hdmi_reg_writemask(hdata, reg, 0, HDMI_CORE_SW_RSTOUT); - usleep_range(10000, 12000); - hdmi_reg_writemask(hdata, reg, ~0, HDMI_CORE_SW_RSTOUT); - usleep_range(10000, 12000); + hdmi_reg_writemask(hdata, HDMI_CON_0, val, HDMI_EN); + hdmi_reg_writemask(hdata, HDMI_TG_CMD, val, HDMI_TG_EN | HDMI_FIELD_EN); } static void hdmi_conf_init(struct hdmi_context *hdata) @@ -1500,12 +1496,7 @@ static void hdmi_v13_mode_apply(struct hdmi_context *hdata) clk_prepare_enable(hdata->res.sclk_hdmi); /* enable HDMI and timing generator */ - hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN); - if (core->int_pro_mode[0]) - hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN | - HDMI_FIELD_EN); - else - hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN); + hdmi_start(hdata, true); } static void hdmi_v14_mode_apply(struct hdmi_context *hdata) @@ -1667,12 +1658,7 @@ static void hdmi_v14_mode_apply(struct hdmi_context *hdata) clk_prepare_enable(hdata->res.sclk_hdmi); /* enable HDMI and timing generator */ - hdmi_reg_writemask(hdata, HDMI_CON_0, ~0, HDMI_EN); - if (core->int_pro_mode[0]) - hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN | - HDMI_FIELD_EN); - else - hdmi_reg_writemask(hdata, HDMI_TG_CMD, ~0, HDMI_TG_EN); + hdmi_start(hdata, true); } static void hdmi_mode_apply(struct hdmi_context *hdata) @@ -1788,7 +1774,7 @@ static void hdmi_conf_apply(struct hdmi_context *hdata) hdmiphy_conf_apply(hdata); mutex_lock(&hdata->hdmi_mutex); - hdmi_conf_reset(hdata); + hdmi_start(hdata, false); hdmi_conf_init(hdata); mutex_unlock(&hdata->hdmi_mutex); @@ -2029,6 +2015,9 @@ static void hdmi_mode_set(struct exynos_drm_display *display, m->vrefresh, (m->flags & DRM_MODE_FLAG_INTERLACE) ? "INTERLACED" : "PROGERESSIVE"); + /* preserve mode information for later use. */ + drm_mode_copy(&hdata->current_mode, mode); + if (hdata->type == HDMI_TYPE13) hdmi_v13_mode_set(hdata, mode); else @@ -2089,6 +2078,9 @@ static void hdmi_poweroff(struct exynos_drm_display *display) goto out; mutex_unlock(&hdata->hdmi_mutex); + /* HDMI System Disable */ + hdmi_reg_writemask(hdata, HDMI_CON_0, 0, HDMI_EN); + hdmiphy_poweroff(hdata); cancel_delayed_work(&hdata->hotplug_work);