Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp627685imm; Wed, 19 Sep 2018 04:31:09 -0700 (PDT) X-Google-Smtp-Source: ANB0VdY2PR2IXM+MJgb6CwONJdia2mNlNQ8+QwfUH/n2QUTLuEQUm1y+wjdKGMJBwBvZxiZnL/lg X-Received: by 2002:a63:ad44:: with SMTP id y4-v6mr31836501pgo.138.1537356669170; Wed, 19 Sep 2018 04:31:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537356669; cv=none; d=google.com; s=arc-20160816; b=rVTzoAivwgsMmxNkggAZ+MbYQ7QCyM6y4QVasmG9AbqY5cxIpM+9yFVA6AyQQyYwUC aRJcumHBBpM6nrnG2JX9w3Vy++rI+Tw5eCyER2khGF4tvkyvLR61dfx/49wKVufDS48x q1trHd97KbBUlcEvgJLXiyNrlx4VVzli156NVZiBFkbyk0txmiRJmDX2B1Aj25zvkjX5 0kNtHeiWcVpRvQrey1Ix06pBzWwq53wCgn7B0CtxYZzQN4I5Qh5bT3qhQ42VlvfSdlYF Ji9ylVOzdlOjf8UGwS0IFkSIM85iWmhP5oAvFbGimg+oZeoIdnmSdlkY6ASY1EHFZ5Us QYgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature; bh=uHErZwZRianEsjMA4CKWP9i7/BVOT+GBXD0SqIEUjfc=; b=mqWUKfd+SdaTIOyJ9zpxD+paEFyW5uCdy1H4sWiTGoxoIhuetyrr7zRgybfe3aZ82U 0JVFr1S7TSuwHAy9vZ40l7XXZHdO6Sn0YwZJgzZ88SYLWqKltF3guq39a9/88siqIbuA OKefeUB7/F5boJpG8y3PdykgQi77MKO9k2Z30PBt3mthBTymAx5OVMGrvOaN9vjV50g8 OO7/AyWkLvRdQEHIQevzVPDLpDjfUH0Z9sM8dd9Fb9inI6J9n0hWr7+mM5pkcdk8JU41 WdgA/rMnmPLA0vOUdOugQgzF3+CBuNxaA0qjlj8QDyioQQe+DNAAoF1lnOgoB5dTJ5Rg Oo+Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@endlessm-com.20150623.gappssmtp.com header.s=20150623 header.b=weV0aE0P; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id m76-v6si22460724pfg.323.2018.09.19.04.30.53; Wed, 19 Sep 2018 04:31:09 -0700 (PDT) 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=@endlessm-com.20150623.gappssmtp.com header.s=20150623 header.b=weV0aE0P; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731472AbeISRHf (ORCPT + 99 others); Wed, 19 Sep 2018 13:07:35 -0400 Received: from mail-pl1-f195.google.com ([209.85.214.195]:35671 "EHLO mail-pl1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730892AbeISRHf (ORCPT ); Wed, 19 Sep 2018 13:07:35 -0400 Received: by mail-pl1-f195.google.com with SMTP id g2-v6so2543995plo.2 for ; Wed, 19 Sep 2018 04:30:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=endlessm-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=uHErZwZRianEsjMA4CKWP9i7/BVOT+GBXD0SqIEUjfc=; b=weV0aE0PDEDRy/PcMlLMyAPU8O4yAadItZ16jc/kAzLCLh4YBPYTt8/bFAsphL3jQH t2PFQlRFf4wv7KVSMTkvvaGyyU4UEwSuzSzDQa5Xyyk3cBFY+WoANa64qHRSkrWWFejk cuSnqffLyb0gSaG+Qgj/8GfmaxqL40XuqCjntrJCuWqeTUaBGJHxVKqcWjR3mhP57WzA 9z4A++PS52aT8rntIuqHBYZNOngHD1bqr40bhmF8Ct2vy8aTuzTNQBlLcwONiUgekxqZ 743KOkejT6tKjWkepS4sA16NJVUxxuMNpgvZvg1BLNuTidDvHDQO9pDi/dncZa1a2GxX oJGg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=uHErZwZRianEsjMA4CKWP9i7/BVOT+GBXD0SqIEUjfc=; b=OC9zLWjHzCwLogQdux//yYAcPPsST44ZjhG+gdLeGu7Gj36dK/2L6yU++X6MaqW/ZO XVByx26CTfMGSUkAYjQyhui2KdyYEGSBaKvar2uh/Qet6FsaxTvU/R0acebarXvmGZ32 FSJiCk4JP2pTTirl9+5JwveGIElP9IZMoWD2YVzprMHEq3v5eOJrioTxathOU8VSAizu 7PAaoPNheJJfVNbhUUtVO62jgpqjZDDyb0KbzhD10uerlED0otr94PdzkkbWQ74hT3XX Fwc3E3/5uyduqRK5QIp4wcDAWEYR5xsr2FW8KVfKoXHC2o4lkE9Yza7KJYFiS6sgAszK MNZg== X-Gm-Message-State: APzg51DOLxAVLmWPf/5G3zF0iCg0vYrGABhLqPBJ/yIrwLYFC30PnD1Z bXiQv7rTEDuAiHKvq/1GRp/WJA== X-Received: by 2002:a17:902:2e83:: with SMTP id r3-v6mr34104820plb.80.1537356605690; Wed, 19 Sep 2018 04:30:05 -0700 (PDT) Received: from localhost.localdomain (125-227-158-176.HINET-IP.hinet.net. [125.227.158.176]) by smtp.gmail.com with ESMTPSA id g7-v6sm27386862pfi.175.2018.09.19.04.30.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Sep 2018 04:30:04 -0700 (PDT) From: Chris Chiu To: jani.nikula@intel.com, joonas.lahtinen@linux.intel.com, rodrigo.vivi@intel.com, airlied@linux.ie Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux@endlessm.com, Chris Chiu Subject: [PATCH] drm/i915: re-check the hotplug with a delayed work Date: Wed, 19 Sep 2018 19:29:33 +0800 Message-Id: <20180919112933.47382-1-chiu@endlessm.com> X-Mailer: git-send-email 2.15.1 (Apple Git-101) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I have few ASUS laptops, X705FD(Intel i7-8565), X560UD(Intel i5-8250U) and X530UN(Intel i7-8550U) share the same problem. The HDMI connector status stays 'connected' even the HDMI cable has been unplugged. Then the status in sysfs would never change since then until we do 'xrandr' to reprobe the devices. It would also cause the audio output path cannot correctly swicth based on the connector status. This commit kicks off a delayed work when the status remains unchanged in the first hotplug event handling, which may not be the perfect timing in some special cases. Signed-off-by: Chris Chiu --- drivers/gpu/drm/i915/i915_drv.h | 1 + drivers/gpu/drm/i915/intel_hotplug.c | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index d51d8574a679..78e2cf09cc10 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -286,6 +286,7 @@ struct i915_hotplug { } stats[HPD_NUM_PINS]; u32 event_bits; struct delayed_work reenable_work; + struct delayed_work recheck_work; struct intel_digital_port *irq_port[I915_MAX_PORTS]; u32 long_port_mask; diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c index 43aa92beff2a..089a24588ec8 100644 --- a/drivers/gpu/drm/i915/intel_hotplug.c +++ b/drivers/gpu/drm/i915/intel_hotplug.c @@ -349,14 +349,15 @@ static void i915_digport_work_func(struct work_struct *work) } } +#define HPD_RECHECK_DELAY (2 * 1000) + /* * Handle hotplug events outside the interrupt handler proper. */ -static void i915_hotplug_work_func(struct work_struct *work) +static void do_i915_hotplug_check(struct work_struct *work, + struct drm_i915_private *dev_priv, + struct drm_device *dev, bool do_recheck) { - struct drm_i915_private *dev_priv = - container_of(work, struct drm_i915_private, hotplug.hotplug_work); - struct drm_device *dev = &dev_priv->drm; struct intel_connector *intel_connector; struct intel_encoder *intel_encoder; struct drm_connector *connector; @@ -396,8 +397,31 @@ static void i915_hotplug_work_func(struct work_struct *work) if (changed) drm_kms_helper_hotplug_event(dev); + else if (do_recheck) { + spin_lock_irq(&dev_priv->irq_lock); + dev_priv->hotplug.event_bits |= hpd_event_bits; + spin_unlock_irq(&dev_priv->irq_lock); + schedule_delayed_work(&dev_priv->hotplug.recheck_work, msecs_to_jiffies(HPD_RECHECK_DELAY)); + } } +static void i915_hotplug_work_func(struct work_struct *work) +{ + struct drm_i915_private *dev_priv = + container_of(work, struct drm_i915_private, hotplug.hotplug_work); + struct drm_device *dev = &dev_priv->drm; + + do_i915_hotplug_check(work, dev_priv, dev, true); +} + +static void i915_hotplug_recheck_func(struct work_struct *work) +{ + struct drm_i915_private *dev_priv = + container_of(work, struct drm_i915_private, hotplug.recheck_work.work); + struct drm_device *dev = &dev_priv->drm; + + do_i915_hotplug_check(work, dev_priv, dev, false); +} /** * intel_hpd_irq_handler - main hotplug irq handler @@ -619,6 +643,8 @@ void intel_hpd_init_work(struct drm_i915_private *dev_priv) INIT_WORK(&dev_priv->hotplug.poll_init_work, i915_hpd_poll_init_work); INIT_DELAYED_WORK(&dev_priv->hotplug.reenable_work, intel_hpd_irq_storm_reenable_work); + INIT_DELAYED_WORK(&dev_priv->hotplug.recheck_work, + i915_hotplug_recheck_func); } void intel_hpd_cancel_work(struct drm_i915_private *dev_priv) @@ -635,6 +661,7 @@ void intel_hpd_cancel_work(struct drm_i915_private *dev_priv) cancel_work_sync(&dev_priv->hotplug.hotplug_work); cancel_work_sync(&dev_priv->hotplug.poll_init_work); cancel_delayed_work_sync(&dev_priv->hotplug.reenable_work); + cancel_delayed_work_sync(&dev_priv->hotplug.recheck_work); } bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin) -- 2.11.0