From nobody Sun Oct 5 05:31:06 2025 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E378823B63A for ; Sat, 9 Aug 2025 00:35:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754699751; cv=none; b=AfSlFQWGRryHzfm6BNfP8X5egGBmwcU+SRrJRguoUPgmU/jTwv+6MKWHQJD+XInmid/AWdYVdiN0VRW/NnLjAbLhPtdvSuPXrlSboESQ+zGZ50eQnGMuIk9hkH1fGm1Yd2lxLmmoTltzsvNwMoKtLcObC/RjflclIzO5ZqktIdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1754699751; c=relaxed/simple; bh=HTqrrF+C5QTfFndFWgmnWgSjgmkkDUYYRxWdw3qjL0o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mr90BJFmAnm6p+ZBMBq0eeMpz4l+UpUXjZnN9/mOfYhEm67FHP4pLYryft2D8Jm0LmJjJkPY9ExCsP+/HVSsRSZlQjhHxR7aJeacHQlOQdWCj2U294nfPV3tynk8KNhfdmQQp3csVJbgs90iFD45iKynCmq5pweSlikVqukBY1o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=H9pA9wdZ; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="H9pA9wdZ" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 578NExXc022010 for ; Sat, 9 Aug 2025 00:35:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= pVp2LvuWfzIBugnNlvc8UhhBMesOGUqQJS4eHYhxUXE=; b=H9pA9wdZWtZ5bCRd onuweo1yrHB6viIZDm+SOzCyiUZeMGfOe/eDqfKvnKSADFGALA9sBnqZJRrbHB8l egOd2iXASsfB4ywFuWmpoY7meDjKyIOzyb3dNntnPrc6rWPh6RS46PhYE8PRE7v8 YWhLnMyix4WScpUQ0KidnE86n8m+lAm++KY5SWtFe2oo6PKlZFdJ+45MQPy0NEjC nkH0NtoePOoOIjbAUt2GpK4Va52S62I46Kapy2HFcHBvp0rble7GeG+TLQcXv9Yp HpDTW+J49/IrPZpVpeODzDiDuBg0FZ90PqHfXZzXq3G/cbHnwT/T8JKM95J+GCyY dZC9Eg== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48bpybkm6g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Sat, 09 Aug 2025 00:35:48 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-242abac2cb4so32192585ad.0 for ; Fri, 08 Aug 2025 17:35:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754699747; x=1755304547; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=pVp2LvuWfzIBugnNlvc8UhhBMesOGUqQJS4eHYhxUXE=; b=m1CNNJPx9dR5QoHm4dfSxVPNyytelU4370+fhOoNogJdxryhpJ3SugadmcycFfyvOO IqP0cBZ2/twdrhCeRXnypUVK/sj2KhR5QLFTStAWP1u7yjd3aPQog4k25kqCuxbdc9ve 0kXyeROlhMxribfw1xvcExJIehJ+iryQPPe3vSJ0VgG6ZDSf4BQ7yIZmuOxfu7Ux+6lM A3DlR0THH0BpecuM7wdgplnycev7yyHcWdH7veqQ7u8elkDrOa2HwW+eWeu24d6vZJwU vY7waeYWVWPHCwgrg+V7u203SY1So4yMFtxis/XuMps0KydMtGjMjbxja+wM+UdlM45Q qgJw== X-Forwarded-Encrypted: i=1; AJvYcCU94dmPYUpDTRP9gk6dXSzF59pyvn8gy8f4QMqpxv9bImQhRq8cRX+GWYzOpvXCPyxPx/8dim5zZr1GCwU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxb9NxFtCQvGWHYAIVC2tz0/zZ3tSekzADw3OaDB44JMyoYXcer cB8gKIJkIZpXBCeMvAufjbjEzZKMqWRHSM+s9SDAtuoQwfSzl2rQ5iu3sh/sIfvUs0UU6GWOCP+ wu5nXUlv51ekeh6RYs3SQI6oAX3xeAuIIGNk5cHRMTk8qKnwSQ8JM7bth5hlK7wkJ9XkL8LI1Yf g= X-Gm-Gg: ASbGnctBwsvLSfqQ00mZmp+VwvVhitKyP4X1d+6EZ6i+w9XaltPFUDptZ1vDYVv2Umx 6fM/bW0auOJqN0LI9wbuu16oSLEoWOTlO7ctjI40Yavuy/jFymypzIUCTyi/nfYvDYEnbgPhxjO 5cjpfq4iwFdgyDEHoGElQI/OGWVWf9VUAn4y47vWfF4baB5Sr21ICRZXNw1I+SuMEUBSoY1CN5b QomVkzEDpZyCy2zfX8Lul0fN6NXbksPH/BY8gJVUclyeoZnslishP8y/bZhnSsLGo98f8+MLQwG wdS1yGqMr9UwqaliaumUGbF+3ZHPpDQKnU3Cz9siO+wlNkduTQlucmvIQBpn0big4EHBfhgH3Yk 9IfrdkcLCTqJ6ysKzZtKwoZF/ X-Received: by 2002:a17:902:d585:b0:23f:d903:d867 with SMTP id d9443c01a7336-242c21dcdc9mr66684665ad.35.1754699746874; Fri, 08 Aug 2025 17:35:46 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHpDzXJUG2NG/inVALaMSroTXHJ0oWYwhYOpF7guVZ6NqIs4yl+/T4nnDKa6V0uCpokze4sOA== X-Received: by 2002:a17:902:d585:b0:23f:d903:d867 with SMTP id d9443c01a7336-242c21dcdc9mr66684055ad.35.1754699746283; Fri, 08 Aug 2025 17:35:46 -0700 (PDT) Received: from jesszhan-linux.qualcomm.com (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-241d1ef678dsm219865355ad.39.2025.08.08.17.35.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Aug 2025 17:35:45 -0700 (PDT) From: Jessica Zhang Date: Fri, 08 Aug 2025 17:35:20 -0700 Subject: [PATCH v2 08/12] drm/msm/dp: Drop event waitqueue Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250808-hpd-refactor-v2-8-7f4e1e741aa3@oss.qualcomm.com> References: <20250808-hpd-refactor-v2-0-7f4e1e741aa3@oss.qualcomm.com> In-Reply-To: <20250808-hpd-refactor-v2-0-7f4e1e741aa3@oss.qualcomm.com> To: Rob Clark , Abhinav Kumar , Dmitry Baryshkov , Sean Paul , Marijn Suijten , David Airlie , Simona Vetter , Jessica Zhang , Kuogee Hsieh Cc: linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Yongxing Mou X-Mailer: b4 0.15-dev-a9b2a X-Developer-Signature: v=1; a=ed25519-sha256; t=1754699734; l=15203; i=jessica.zhang@oss.qualcomm.com; s=20230329; h=from:subject:message-id; bh=HTqrrF+C5QTfFndFWgmnWgSjgmkkDUYYRxWdw3qjL0o=; b=UJDbpsNuP3Llm5q+JW9nAZCwXzU559UaTsfBS+2xaxmyWqCzL2MvJufSsoeyxm/mGL3bZX0sz hdO4w+8z7wiBv0gkxveaFL2GP3NFm+VzutpY442bBVbynZVkkU2KkLw X-Developer-Key: i=jessica.zhang@oss.qualcomm.com; a=ed25519; pk=gAUCgHZ6wTJOzQa3U0GfeCDH7iZLlqIEPo4rrjfDpWE= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODA2MDAwOSBTYWx0ZWRfX9TTeqbvqQEP4 iWgNFL9iIl/g3iUdPvGDoyOvTP9DMeR8IF/GaMnams6SwbJOA6wVZ9l7ESlHP4d9qxRKzRY2nQ2 FplY6iwDAoI6d9yd6adGBwqv4KLuFHUoWnVRUvfNhZiy9+wXp17a9FeSXRqiv/gqQ18v5mGe7fy Qo7my2Q1XpNLDRrjdce8saMyb1gIBRPxqzxCDG/Zcp4tmRw4BrcFY2Pw+niJkCg5z6HhwdUltj2 3VQYKQzhf4YnFw+HOKG4wQsUxjWfHG4bteeWoyH5fh+o9gvR/JbvFQqvdosvHxjAiz11W1MVccI L2o3gWbt65OL0dOLVFYPFeImyHJrY4xVlImfbDGmEpYv8L4gHRiPBCw5ayHabvN6X7qDYNEWyYD qfvAtokr X-Proofpoint-GUID: 8vyJkFwia8raOlaKMNJU74b7bKhSqnCq X-Authority-Analysis: v=2.4 cv=EavIQOmC c=1 sm=1 tr=0 ts=689697e4 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=JYp8KDb2vCoCEuGobkYCKw==:17 a=IkcTkHD0fZMA:10 a=2OwXVqhp2XgA:10 a=EUspDBNiAAAA:8 a=WmteE7YyU5uwuhFq2T4A:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 X-Proofpoint-ORIG-GUID: 8vyJkFwia8raOlaKMNJU74b7bKhSqnCq X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-08_08,2025-08-06_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 clxscore=1015 priorityscore=1501 adultscore=0 bulkscore=0 phishscore=0 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508060009 Since the HPD IRQ handler directly notifies DRM core for hotplug events, there is no need to maintain a separate event waitqueue. Drop the event waitqueue and all related structs and helpers. Signed-off-by: Jessica Zhang --- drivers/gpu/drm/msm/dp/dp_display.c | 255 +-------------------------------= ---- 1 file changed, 7 insertions(+), 248 deletions(-) diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/d= p_display.c index b9e2e368c4a8..eabd6e6981fb 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -52,27 +52,6 @@ enum { ST_DISPLAY_OFF, }; =20 -enum { - EV_NO_EVENT, - /* hpd events */ - EV_HPD_PLUG_INT, - EV_IRQ_HPD_INT, - EV_HPD_UNPLUG_INT, -}; - -#define EVENT_TIMEOUT (HZ/10) /* 100ms */ -#define DP_EVENT_Q_MAX 8 - -#define DP_TIMEOUT_NONE 0 - -#define WAIT_FOR_RESUME_TIMEOUT_JIFFIES (HZ / 2) - -struct msm_dp_event { - u32 event_id; - u32 data; - u32 delay; -}; - struct msm_dp_display_private { int irq; =20 @@ -100,16 +79,7 @@ struct msm_dp_display_private { spinlock_t irq_thread_lock; u32 hpd_isr_status; =20 - /* event related only access by event thread */ - struct mutex event_mutex; - wait_queue_head_t event_q; u32 hpd_state; - u32 event_pndx; - u32 event_gndx; - struct task_struct *ev_tsk; - struct msm_dp_event event_list[DP_EVENT_Q_MAX]; - spinlock_t event_lock; - bool wide_bus_supported; =20 struct msm_dp_audio *audio; @@ -212,60 +182,6 @@ static struct msm_dp_display_private *dev_get_dp_displ= ay_private(struct device * return container_of(dp, struct msm_dp_display_private, msm_dp_display); } =20 -static int msm_dp_add_event(struct msm_dp_display_private *msm_dp_priv, u3= 2 event, - u32 data, u32 delay) -{ - unsigned long flag; - struct msm_dp_event *todo; - int pndx; - - spin_lock_irqsave(&msm_dp_priv->event_lock, flag); - pndx =3D msm_dp_priv->event_pndx + 1; - pndx %=3D DP_EVENT_Q_MAX; - if (pndx =3D=3D msm_dp_priv->event_gndx) { - pr_err("event_q is full: pndx=3D%d gndx=3D%d\n", - msm_dp_priv->event_pndx, msm_dp_priv->event_gndx); - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - return -EPERM; - } - todo =3D &msm_dp_priv->event_list[msm_dp_priv->event_pndx++]; - msm_dp_priv->event_pndx %=3D DP_EVENT_Q_MAX; - todo->event_id =3D event; - todo->data =3D data; - todo->delay =3D delay; - wake_up(&msm_dp_priv->event_q); - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - - return 0; -} - -static int msm_dp_del_event(struct msm_dp_display_private *msm_dp_priv, u3= 2 event) -{ - unsigned long flag; - struct msm_dp_event *todo; - u32 gndx; - - spin_lock_irqsave(&msm_dp_priv->event_lock, flag); - if (msm_dp_priv->event_pndx =3D=3D msm_dp_priv->event_gndx) { - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - return -ENOENT; - } - - gndx =3D msm_dp_priv->event_gndx; - while (msm_dp_priv->event_pndx !=3D gndx) { - todo =3D &msm_dp_priv->event_list[gndx]; - if (todo->event_id =3D=3D event) { - todo->event_id =3D EV_NO_EVENT; /* deleted */ - todo->delay =3D 0; - } - gndx++; - gndx %=3D DP_EVENT_Q_MAX; - } - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - - return 0; -} - void msm_dp_display_signal_audio_start(struct msm_dp *msm_dp_display) { struct msm_dp_display_private *dp; @@ -284,8 +200,6 @@ void msm_dp_display_signal_audio_complete(struct msm_dp= *msm_dp_display) complete_all(&dp->audio_comp); } =20 -static int msm_dp_hpd_event_thread_start(struct msm_dp_display_private *ms= m_dp_priv); - static int msm_dp_display_bind(struct device *dev, struct device *master, void *data) { @@ -305,12 +219,6 @@ static int msm_dp_display_bind(struct device *dev, str= uct device *master, goto end; } =20 - rc =3D msm_dp_hpd_event_thread_start(dp); - if (rc) { - DRM_ERROR("Event thread create failed\n"); - goto end; - } - return 0; end: return rc; @@ -322,8 +230,6 @@ static void msm_dp_display_unbind(struct device *dev, s= truct device *master, struct msm_dp_display_private *dp =3D dev_get_dp_display_private(dev); struct msm_drm_private *priv =3D dev_get_drvdata(master); =20 - kthread_stop(dp->ev_tsk); - of_dp_aux_depopulate_bus(dp->aux); =20 msm_dp_aux_unregister(dp->aux); @@ -585,33 +491,22 @@ static int msm_dp_hpd_plug_handle(struct msm_dp_displ= ay_private *dp, u32 data) =20 msm_dp_aux_enable_xfers(dp->aux, true); =20 - mutex_lock(&dp->event_mutex); - state =3D dp->hpd_state; drm_dbg_dp(dp->drm_dev, "Before, type=3D%d hpd_state=3D%d\n", dp->msm_dp_display.connector_type, state); =20 - if (state =3D=3D ST_DISPLAY_OFF) { - mutex_unlock(&dp->event_mutex); + if (state =3D=3D ST_DISPLAY_OFF) return 0; - } =20 - if (state =3D=3D ST_MAINLINK_READY || state =3D=3D ST_CONNECTED) { - mutex_unlock(&dp->event_mutex); + if (state =3D=3D ST_MAINLINK_READY || state =3D=3D ST_CONNECTED) return 0; - } =20 - if (state =3D=3D ST_DISCONNECT_PENDING) { - /* wait until ST_DISCONNECTED */ - msm_dp_add_event(dp, EV_HPD_PLUG_INT, 0, 1); /* delay =3D 1 */ - mutex_unlock(&dp->event_mutex); + if (state =3D=3D ST_DISCONNECT_PENDING) return 0; - } =20 ret =3D pm_runtime_resume_and_get(&pdev->dev); if (ret) { DRM_ERROR("failed to pm_runtime_resume\n"); - mutex_unlock(&dp->event_mutex); return ret; } =20 @@ -625,7 +520,6 @@ static int msm_dp_hpd_plug_handle(struct msm_dp_display= _private *dp, u32 data) =20 drm_dbg_dp(dp->drm_dev, "After, type=3D%d hpd_state=3D%d\n", dp->msm_dp_display.connector_type, state); - mutex_unlock(&dp->event_mutex); =20 /* uevent will complete connection part */ return 0; @@ -652,26 +546,19 @@ static int msm_dp_hpd_unplug_handle(struct msm_dp_dis= play_private *dp, u32 data) =20 msm_dp_aux_enable_xfers(dp->aux, false); =20 - mutex_lock(&dp->event_mutex); - state =3D dp->hpd_state; =20 drm_dbg_dp(dp->drm_dev, "Before, type=3D%d hpd_state=3D%d\n", dp->msm_dp_display.connector_type, state); =20 - /* unplugged, no more irq_hpd handle */ - msm_dp_del_event(dp, EV_IRQ_HPD_INT); - if (state =3D=3D ST_DISCONNECTED) { /* triggered by irq_hdp with sink_count =3D 0 */ if (dp->link->sink_count =3D=3D 0) { msm_dp_display_host_phy_exit(dp); } msm_dp_display_notify_disconnect(&dp->msm_dp_display.pdev->dev); - mutex_unlock(&dp->event_mutex); return 0; } else if (state =3D=3D ST_DISCONNECT_PENDING) { - mutex_unlock(&dp->event_mutex); return 0; } else if (state =3D=3D ST_MAINLINK_READY) { msm_dp_ctrl_off_link(dp->ctrl); @@ -679,7 +566,6 @@ static int msm_dp_hpd_unplug_handle(struct msm_dp_displ= ay_private *dp, u32 data) dp->hpd_state =3D ST_DISCONNECTED; msm_dp_display_notify_disconnect(&dp->msm_dp_display.pdev->dev); pm_runtime_put_sync(&pdev->dev); - mutex_unlock(&dp->event_mutex); return 0; } =20 @@ -703,7 +589,6 @@ static int msm_dp_hpd_unplug_handle(struct msm_dp_displ= ay_private *dp, u32 data) =20 /* uevent will complete disconnection part */ pm_runtime_put_sync(&pdev->dev); - mutex_unlock(&dp->event_mutex); return 0; } =20 @@ -711,32 +596,22 @@ static int msm_dp_irq_hpd_handle(struct msm_dp_displa= y_private *dp, u32 data) { u32 state; =20 - mutex_lock(&dp->event_mutex); - /* irq_hpd can happen at either connected or disconnected state */ state =3D dp->hpd_state; drm_dbg_dp(dp->drm_dev, "Before, type=3D%d hpd_state=3D%d\n", dp->msm_dp_display.connector_type, state); =20 - if (state =3D=3D ST_DISPLAY_OFF) { - mutex_unlock(&dp->event_mutex); + if (state =3D=3D ST_DISPLAY_OFF) return 0; - } =20 - if (state =3D=3D ST_MAINLINK_READY || state =3D=3D ST_DISCONNECT_PENDING)= { - /* wait until ST_CONNECTED */ - msm_dp_add_event(dp, EV_IRQ_HPD_INT, 0, 1); /* delay =3D 1 */ - mutex_unlock(&dp->event_mutex); + if (state =3D=3D ST_MAINLINK_READY || state =3D=3D ST_DISCONNECT_PENDING) return 0; - } =20 msm_dp_display_usbpd_attention_cb(&dp->msm_dp_display.pdev->dev); =20 drm_dbg_dp(dp->drm_dev, "After, type=3D%d hpd_state=3D%d\n", dp->msm_dp_display.connector_type, state); =20 - mutex_unlock(&dp->event_mutex); - return 0; } =20 @@ -1013,12 +888,8 @@ void msm_dp_snapshot(struct msm_disp_state *disp_stat= e, struct msm_dp *dp) * power_on status before dumping DP registers to avoid crash due * to unclocked access */ - mutex_lock(&msm_dp_display->event_mutex); - - if (!dp->power_on) { - mutex_unlock(&msm_dp_display->event_mutex); + if (!dp->power_on) return; - } =20 msm_disp_snapshot_add_block(disp_state, msm_dp_display->ahb_len, msm_dp_display->ahb_base, "dp_ahb"); @@ -1028,8 +899,6 @@ void msm_dp_snapshot(struct msm_disp_state *disp_state= , struct msm_dp *dp) msm_dp_display->link_base, "dp_link"); msm_disp_snapshot_add_block(disp_state, msm_dp_display->p0_len, msm_dp_display->p0_base, "dp_p0"); - - mutex_unlock(&msm_dp_display->event_mutex); } =20 void msm_dp_display_set_psr(struct msm_dp *msm_dp_display, bool enter) @@ -1045,96 +914,6 @@ void msm_dp_display_set_psr(struct msm_dp *msm_dp_dis= play, bool enter) msm_dp_ctrl_set_psr(dp->ctrl, enter); } =20 -static int hpd_event_thread(void *data) -{ - struct msm_dp_display_private *msm_dp_priv; - unsigned long flag; - struct msm_dp_event *todo; - int timeout_mode =3D 0; - - msm_dp_priv =3D (struct msm_dp_display_private *)data; - - while (1) { - if (timeout_mode) { - wait_event_timeout(msm_dp_priv->event_q, - (msm_dp_priv->event_pndx =3D=3D msm_dp_priv->event_gndx) || - kthread_should_stop(), EVENT_TIMEOUT); - } else { - wait_event_interruptible(msm_dp_priv->event_q, - (msm_dp_priv->event_pndx !=3D msm_dp_priv->event_gndx) || - kthread_should_stop()); - } - - if (kthread_should_stop()) - break; - - spin_lock_irqsave(&msm_dp_priv->event_lock, flag); - todo =3D &msm_dp_priv->event_list[msm_dp_priv->event_gndx]; - if (todo->delay) { - struct msm_dp_event *todo_next; - - msm_dp_priv->event_gndx++; - msm_dp_priv->event_gndx %=3D DP_EVENT_Q_MAX; - - /* re enter delay event into q */ - todo_next =3D &msm_dp_priv->event_list[msm_dp_priv->event_pndx++]; - msm_dp_priv->event_pndx %=3D DP_EVENT_Q_MAX; - todo_next->event_id =3D todo->event_id; - todo_next->data =3D todo->data; - todo_next->delay =3D todo->delay - 1; - - /* clean up older event */ - todo->event_id =3D EV_NO_EVENT; - todo->delay =3D 0; - - /* switch to timeout mode */ - timeout_mode =3D 1; - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - continue; - } - - /* timeout with no events in q */ - if (msm_dp_priv->event_pndx =3D=3D msm_dp_priv->event_gndx) { - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - continue; - } - - msm_dp_priv->event_gndx++; - msm_dp_priv->event_gndx %=3D DP_EVENT_Q_MAX; - timeout_mode =3D 0; - spin_unlock_irqrestore(&msm_dp_priv->event_lock, flag); - - switch (todo->event_id) { - case EV_HPD_PLUG_INT: - msm_dp_hpd_plug_handle(msm_dp_priv, todo->data); - break; - case EV_HPD_UNPLUG_INT: - msm_dp_hpd_unplug_handle(msm_dp_priv, todo->data); - break; - case EV_IRQ_HPD_INT: - msm_dp_irq_hpd_handle(msm_dp_priv, todo->data); - break; - default: - break; - } - } - - return 0; -} - -static int msm_dp_hpd_event_thread_start(struct msm_dp_display_private *ms= m_dp_priv) -{ - /* set event q to empty */ - msm_dp_priv->event_gndx =3D 0; - msm_dp_priv->event_pndx =3D 0; - - msm_dp_priv->ev_tsk =3D kthread_run(hpd_event_thread, msm_dp_priv, "dp_hp= d_handler"); - if (IS_ERR(msm_dp_priv->ev_tsk)) - return PTR_ERR(msm_dp_priv->ev_tsk); - - return 0; -} - /** * msm_dp_bridge_detect - callback to determine if connector is connected * @bridge: Pointer to drm bridge structure @@ -1455,11 +1234,6 @@ static int msm_dp_display_probe(struct platform_devi= ce *pdev) return -EPROBE_DEFER; } =20 - /* setup event q */ - mutex_init(&dp->event_mutex); - init_waitqueue_head(&dp->event_q); - spin_lock_init(&dp->event_lock); - /* Store DP audio handle inside DP display */ dp->msm_dp_display.msm_dp_audio =3D dp->audio; =20 @@ -1667,23 +1441,18 @@ void msm_dp_bridge_atomic_enable(struct drm_bridge = *drm_bridge, if (dp->is_edp) msm_dp_hpd_plug_handle(msm_dp_display, 0); =20 - mutex_lock(&msm_dp_display->event_mutex); if (pm_runtime_resume_and_get(&dp->pdev->dev)) { DRM_ERROR("failed to pm_runtime_resume\n"); - mutex_unlock(&msm_dp_display->event_mutex); return; } =20 hpd_state =3D msm_dp_display->hpd_state; - if (hpd_state !=3D ST_DISPLAY_OFF && hpd_state !=3D ST_MAINLINK_READY) { - mutex_unlock(&msm_dp_display->event_mutex); + if (hpd_state !=3D ST_DISPLAY_OFF && hpd_state !=3D ST_MAINLINK_READY) return; - } =20 rc =3D msm_dp_display_set_mode(dp, &msm_dp_display->msm_dp_mode); if (rc) { DRM_ERROR("Failed to perform a mode set, rc=3D%d\n", rc); - mutex_unlock(&msm_dp_display->event_mutex); return; } =20 @@ -1712,7 +1481,6 @@ void msm_dp_bridge_atomic_enable(struct drm_bridge *d= rm_bridge, msm_dp_display->hpd_state =3D ST_CONNECTED; =20 drm_dbg_dp(dp->drm_dev, "type=3D%d Done\n", dp->connector_type); - mutex_unlock(&msm_dp_display->event_mutex); } =20 void msm_dp_bridge_atomic_disable(struct drm_bridge *drm_bridge, @@ -1740,8 +1508,6 @@ void msm_dp_bridge_atomic_post_disable(struct drm_bri= dge *drm_bridge, if (dp->is_edp) msm_dp_hpd_unplug_handle(msm_dp_display, 0); =20 - mutex_lock(&msm_dp_display->event_mutex); - hpd_state =3D msm_dp_display->hpd_state; if (hpd_state !=3D ST_DISCONNECT_PENDING && hpd_state !=3D ST_CONNECTED) drm_dbg_dp(dp->drm_dev, "type=3D%d wrong hpd_state=3D%d\n", @@ -1760,7 +1526,6 @@ void msm_dp_bridge_atomic_post_disable(struct drm_bri= dge *drm_bridge, drm_dbg_dp(dp->drm_dev, "type=3D%d Done\n", dp->connector_type); =20 pm_runtime_put_sync(&dp->pdev->dev); - mutex_unlock(&msm_dp_display->event_mutex); } =20 void msm_dp_bridge_mode_set(struct drm_bridge *drm_bridge, @@ -1816,10 +1581,8 @@ void msm_dp_bridge_hpd_enable(struct drm_bridge *bri= dge) * step-4: DP PHY is initialized at plugin handler before link training * */ - mutex_lock(&dp->event_mutex); if (pm_runtime_resume_and_get(&msm_dp_display->pdev->dev)) { DRM_ERROR("failed to resume power\n"); - mutex_unlock(&dp->event_mutex); return; } =20 @@ -1827,7 +1590,6 @@ void msm_dp_bridge_hpd_enable(struct drm_bridge *brid= ge) msm_dp_aux_hpd_intr_enable(dp->aux); =20 msm_dp_display->internal_hpd =3D true; - mutex_unlock(&dp->event_mutex); } =20 void msm_dp_bridge_hpd_disable(struct drm_bridge *bridge) @@ -1836,15 +1598,12 @@ void msm_dp_bridge_hpd_disable(struct drm_bridge *b= ridge) struct msm_dp *msm_dp_display =3D msm_dp_bridge->msm_dp_display; struct msm_dp_display_private *dp =3D container_of(msm_dp_display, struct= msm_dp_display_private, msm_dp_display); =20 - mutex_lock(&dp->event_mutex); - msm_dp_aux_hpd_intr_disable(dp->aux); msm_dp_aux_hpd_disable(dp->aux); =20 msm_dp_display->internal_hpd =3D false; =20 pm_runtime_put_sync(&msm_dp_display->pdev->dev); - mutex_unlock(&dp->event_mutex); } =20 void msm_dp_bridge_hpd_notify(struct drm_bridge *bridge, --=20 2.50.1