From nobody Mon Dec 1 22:05:48 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.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 7BE8F31ED82 for ; Mon, 1 Dec 2025 12:43:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764593034; cv=none; b=At5XQmdQGkTEGDmCX4zi7aXAPr6gO2Ir0xd/HgUtcu9jaRwpeCDpce9JVhyDsqNLWLrpNQcRnyxHqnuHFRJ6hxh/OtW7JwjdbCp7D+GPtIk9G2EJOO6Ecns8PhOkdUZX6I0igPQWhrTjP4F8cfb3fHNKQDi/m+BFgkNjb8xBa7w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764593034; c=relaxed/simple; bh=GH482HQseJW7R4QoliiIACcw54hmP3LITJI8fgJuTts=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rHmg2QNVd4+Dv+JLO91+AvWFs05EZOmVTyr+6qXiM3V04hSUWWgl+g6GL7+RUCE6mmOBAXlZTnDXrTOmn7bjUNTyJjQUjIturmHNj0PZia1njElDf+rQLzHtN4WhVt0OgUn5sYAtEvhIJZJ9Dea4zQKQLTlv4OHo3tzpaCWJBAI= 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=Gv12s/IH; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=RFBlkD0V; arc=none smtp.client-ip=205.220.168.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="Gv12s/IH"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="RFBlkD0V" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5B18OCCJ2563012 for ; Mon, 1 Dec 2025 12:43:51 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= g3eWAp1Uztlnh+JGWFxdF/vF9gNgmc6EwOi5LM6HCKM=; b=Gv12s/IHP5hSlfis zkDXZpDoYamcMTEOyJ1p0r9bM8Y/Puj1Ba5v1QbW66gJM65C5DN6JbercA1y2ldq L+G6uEw/hBvpwRCn5FIlG4qwn9yhQ+Gv95ANFSAAv6zTVyHy193kJ3zh7Lt9hv3N +j2iUG1JQpkggG+Grfn/zCN1oLMPTuOI5RTe1UxdRd57RaRxkOT6QfGGMBOJaffb kaC284BGLOz+3TgYmBwWjvRIskHXXTkI7/qCdvCYvN/zr7yruadYlpX0bgnir+KF AVy5Z5waXZt0KH2Ziw7eTTTKWxlHQkQ3iaaIAJ8iGkFBDVX7ywTeTE5NqJyJTQAR L5PYBQ== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4arwnvt005-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 01 Dec 2025 12:43:51 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-340c0604e3dso4298427a91.2 for ; Mon, 01 Dec 2025 04:43:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1764593031; x=1765197831; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=g3eWAp1Uztlnh+JGWFxdF/vF9gNgmc6EwOi5LM6HCKM=; b=RFBlkD0V2TDmgh+NIgAzFMqCVo5YGFkGU52x7CELdO3LfozUcGRalX6s29b/kWw00K 9fMCGJ5SU7WS+ZmJ/o7gDEMe863pAun14XkHEkB8Zpv+e+qbkC1VlW0nVKRmHYgAMIMK Q8AzvRaQvVMs56kcW0rIinnMF/a1tp/6/M3esGtry0X6ZHxlTa6b/StzGKFKJU9vFn3o aGgzvgsgnp+HeDUgP/wakE8Myws9K2YF49fsT4V2cZWzn2xqcM7i0EdahlVOcX7cJnb8 abiYW/lPByIru1JxMMm8HN22JQj5ET+ywWQNHwkiPmMwRkjypwwDviUIuInp0ulxUdRi dOpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764593031; x=1765197831; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=g3eWAp1Uztlnh+JGWFxdF/vF9gNgmc6EwOi5LM6HCKM=; b=rZbJXRQSW0Z9tunBurTDgiv/OFyp6E9HTTBWxLzG/aYRIL9NafrnW2uiyUqIYpPMye qaXZWMMb85QEgcK60Lg9ZI2x8QQvG/p6CWOATci7miWK/eQWcTMKSNYS09pDJF3uYQWb bSv6MoGBjlzBBbGiDSIFcMiQVmpa0PYtipc2BaTDolt9zBVFX2ou7gVsAw8Z0FJFD3FW m4xTIW3Ck9bzZdYuuSVAvzZQFnorlPwW2AJmHI0HCPfEovd2LDj6EW8kfVmlCL83wmwi 5oxVhqlWMb7Rk9Lsn9+6rICVAsKpE7ydkXBJurPJX6rTl2IiMlc/DEJZMQI4j3YLK+Ry jneQ== X-Forwarded-Encrypted: i=1; AJvYcCXUmt07fHLdlWpDXlnQgGmnoZk2Pp8sTh1ENscNrOtDSdUPPFwfO+dzE4fxGjGgKuE8GAUyU+jTVgmnzz0=@vger.kernel.org X-Gm-Message-State: AOJu0YyMyUtsADNoqHRLCgMGJCoer8UZjnuLpNmb+eYZXOcY9aBtsJLz D+jXTSzXdmMtx5ANAa1psF7CAVtg/u3tLvSdKRhCkncKvHnQRXig3GUS4A4KCYVgTr5zIpmbUYe zYdBsUT7+iGUWlxE/QA1baLbcnOcUWuEJLSiiWFBNzAGQtuA+3E8Q5f4Hj10+xmzuVLU= X-Gm-Gg: ASbGncsbJ1hsgmM0dukONcpPdB0jORTtvDIRZA1g1do2WFAzasSuPASWSAkWdcoBm75 IlUYbK4aN49/ggE981BFGSgg9yvBZWkdGl3eDMHzSpHUwpk0fapHtLVQ7tDi2vEyjP5YhRvhFSv dKx/IiQ0oobQq0Q+vd+eIAmUi08Khw06+EOGl3u8YVGOsKPoDsawK7R0WM5BNvnBbktbwHm/Fin FBPc01ROYAtlDR3SW7MzBFHUC8Tmvjg0JtvdnacBdcz/9AsHfFnxr1MVu7fLj7aKhInSps8/nty 4c5yUP4tGCiHPPERISoBN9ZKnTcR5OMwuddzDjwvlq2xmJVSsgw31dCMxi868y+geBaD7qDQVFX LCTPwh+EFhOxp41uj5dazHKdqUH+uG7lC1puUHO83Tl+z X-Received: by 2002:a17:90b:4ec7:b0:341:88d5:a74e with SMTP id 98e67ed59e1d1-34733f4ac35mr37194037a91.29.1764593030908; Mon, 01 Dec 2025 04:43:50 -0800 (PST) X-Google-Smtp-Source: AGHT+IE+1AJmch3kW0mA+J5AWIFl5cR6CskMUYu3HyMBvIiPCYmUUTKrD3aXjJSClrHjHz/ZGceKoA== X-Received: by 2002:a17:90b:4ec7:b0:341:88d5:a74e with SMTP id 98e67ed59e1d1-34733f4ac35mr37194006a91.29.1764593030406; Mon, 01 Dec 2025 04:43:50 -0800 (PST) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3477b733381sm13146374a91.12.2025.12.01.04.43.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 04:43:50 -0800 (PST) From: Krishna Chaitanya Chundru Date: Mon, 01 Dec 2025 18:13:20 +0530 Subject: [PATCH 4/4] bus: mhi: Fix broken runtime PM design 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: <20251201-mhi_runtimepm-v1-4-fab94399ca75@oss.qualcomm.com> References: <20251201-mhi_runtimepm-v1-0-fab94399ca75@oss.qualcomm.com> In-Reply-To: <20251201-mhi_runtimepm-v1-0-fab94399ca75@oss.qualcomm.com> To: Manivannan Sadhasivam , Jeff Hugo , Carl Vanderlip , Oded Gabbay , Jeff Johnson , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: mhi@lists.linux.dev, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org, mayank.rana@oss.qualcomm.com, quic_vbadigan@quicinc.com, vivek.pernamitta@oss.qualcomm.com, Krishna Chaitanya Chundru X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1764593001; l=7600; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=GH482HQseJW7R4QoliiIACcw54hmP3LITJI8fgJuTts=; b=6iTeiDENHrbVLHbi/ceLO/7iDY2j59zpb8UbDBQqB3y4mszKHxMTOmMfNQCmVJepmbVUaIH3P FIGaMVQ5N2wAm3TcemuMJi1WTt4sNs8Uya2mNRCAqG28Z03+njJQ/cu X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Proofpoint-ORIG-GUID: -CQudDZtUkVhmwVo7u2VFNs1B72eZpm_ X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjAxMDEwMyBTYWx0ZWRfX7uLPloDf5XTX Gg4+WxHIQoUeULGMH0URLLfAN5ajWUfEtFv6GmlmLrqeTAGqjUSIkDlPR0IQr9A71WfLuckSK38 z38aIP51tTlhsuED/nUBkmHj21segdanRbQcQdQD0LYKbONAJSiNnyqOheqHdKh9X9n3rh2gZdx 2TUP0PVg2whNhroORooblFjk97Ew8qqIJKQ32iD25OzLiXA5tMsHh3MtXocfglgDR98A+h7NKbV D3pqnxtKkSCeNSHaKE28VGgVShz+Kor+w3D9aj6nlq/9VQuncDR8QMMbi3jIFLPaQj86ci8zIQa U7rXKggEg0qGlC29P3lslCKmtZxCY+IbdfQE2LCWU0i6mPENuhXJYsDdkjf3UIFHlKq01fT9hYA I/bOJf/tnj7sKOLyNk47a4lZ44BgkA== X-Authority-Analysis: v=2.4 cv=Urxu9uwB c=1 sm=1 tr=0 ts=692d8d87 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=A8rfxp3GyOsx1I41rDQA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: -CQudDZtUkVhmwVo7u2VFNs1B72eZpm_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-11-28_08,2025-11-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 phishscore=0 malwarescore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 clxscore=1015 adultscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2510240001 definitions=main-2512010103 The current MHI runtime PM design is flawed, as the MHI core attempts to manage power references internally via mhi_queue() and related paths. This is problematic because the controller drivers do not have the knowledge of the client PM status due to the broken PM topology. So when they runtime suspend the controller, the client drivers could no longer function. To address this, in the new design, the client drivers reports their own runtime PM status now and the PM framework makes sure that the parent (controller driver) and other components up in the chain remain active. This leverages the standard parent-child PM relationship. Since MHI creates a mhi_dev device without an associated driver, we explicitly enable runtime PM on it and mark it with pm_runtime_no_callbacks() to indicate the PM core that no callbacks exist for this device. This is only needed for MHI controller, since the controller driver uses the bus device just like PCI device. Also Update the MHI core to explicitly manage runtime PM references in __mhi_device_get_sync() and mhi_device_put() to ensure the controller does not enter suspend while a client device is active. Signed-off-by: Krishna Chaitanya Chundru --- drivers/bus/mhi/host/internal.h | 6 +++--- drivers/bus/mhi/host/main.c | 28 ++++------------------------ drivers/bus/mhi/host/pm.c | 18 ++++++++---------- 3 files changed, 15 insertions(+), 37 deletions(-) diff --git a/drivers/bus/mhi/host/internal.h b/drivers/bus/mhi/host/interna= l.h index 61e03298e898e6dd02d2a977cddc4c87b21e3a6c..d6a3168bb3ecc34eab1036c0e74= f8d70cf422fed 100644 --- a/drivers/bus/mhi/host/internal.h +++ b/drivers/bus/mhi/host/internal.h @@ -355,9 +355,9 @@ static inline bool mhi_is_active(struct mhi_controller = *mhi_cntrl) static inline void mhi_trigger_resume(struct mhi_controller *mhi_cntrl) { pm_wakeup_event(&mhi_cntrl->mhi_dev->dev, 0); - pm_runtime_get(mhi_cntrl->cntrl_dev); - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); + pm_runtime_get(&mhi_cntrl->mhi_dev->dev); + pm_runtime_mark_last_busy(&mhi_cntrl->mhi_dev->dev); + pm_runtime_put(&mhi_cntrl->mhi_dev->dev); } =20 /* Register access methods */ diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c index 7ac1162a0a81ae11245a2bbd9bf6fd6c0f86fbc1..85a9a5a62a6d3f92b0e9dc35b13= fd867db89dd95 100644 --- a/drivers/bus/mhi/host/main.c +++ b/drivers/bus/mhi/host/main.c @@ -427,6 +427,8 @@ void mhi_create_devices(struct mhi_controller *mhi_cntr= l) if (ret) put_device(&mhi_dev->dev); } + pm_runtime_no_callbacks(&mhi_cntrl->mhi_dev->dev); + devm_pm_runtime_set_active_enabled(&mhi_cntrl->mhi_dev->dev); } =20 irqreturn_t mhi_irq_handler(int irq_number, void *dev) @@ -658,12 +660,8 @@ static int parse_xfer_event(struct mhi_controller *mhi= _cntrl, /* notify client */ mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); =20 - if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { + if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) atomic_dec(&mhi_cntrl->pending_pkts); - /* Release the reference got from mhi_queue() */ - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } =20 /* * Recycle the buffer if buffer is pre-allocated, @@ -1152,12 +1150,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, str= uct mhi_buf_info *buf_info, =20 read_lock_irqsave(&mhi_cntrl->pm_lock, flags); =20 - /* Packet is queued, take a usage ref to exit M3 if necessary - * for host->device buffer, balanced put is done on buffer completion - * for device->host buffer, balanced put is after ringing the DB - */ - pm_runtime_get(mhi_cntrl->cntrl_dev); - /* Assert dev_wake (to exit/prevent M1/M2)*/ mhi_cntrl->wake_toggle(mhi_cntrl); =20 @@ -1167,11 +1159,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, str= uct mhi_buf_info *buf_info, if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) mhi_ring_chan_db(mhi_cntrl, mhi_chan); =20 - if (dir =3D=3D DMA_FROM_DEVICE) { - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } - read_unlock_irqrestore(&mhi_cntrl->pm_lock, flags); =20 return ret; @@ -1377,7 +1364,6 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, ret =3D mhi_device_get_sync(mhi_cntrl->mhi_dev); if (ret) return ret; - pm_runtime_get(mhi_cntrl->cntrl_dev); =20 reinit_completion(&mhi_chan->completion); ret =3D mhi_send_cmd(mhi_cntrl, mhi_chan, cmd); @@ -1408,8 +1394,6 @@ static int mhi_update_channel_state(struct mhi_contro= ller *mhi_cntrl, =20 trace_mhi_channel_command_end(mhi_cntrl, mhi_chan, to_state, TPS("Updated= ")); exit_channel_update: - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; @@ -1592,12 +1576,8 @@ static void mhi_reset_data_chan(struct mhi_controlle= r *mhi_cntrl, while (tre_ring->rp !=3D tre_ring->wp) { struct mhi_buf_info *buf_info =3D buf_ring->rp; =20 - if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) { + if (mhi_chan->dir =3D=3D DMA_TO_DEVICE) atomic_dec(&mhi_cntrl->pending_pkts); - /* Release the reference got from mhi_queue() */ - pm_runtime_mark_last_busy(mhi_cntrl->cntrl_dev); - pm_runtime_put(mhi_cntrl->cntrl_dev); - } =20 if (!buf_info->pre_mapped) mhi_cntrl->unmap_single(mhi_cntrl, buf_info); diff --git a/drivers/bus/mhi/host/pm.c b/drivers/bus/mhi/host/pm.c index b4ef115189b505c3450ff0949ad2d09f3ed53386..fd690e8af693109ed8c55248db0= ea153f9e69423 100644 --- a/drivers/bus/mhi/host/pm.c +++ b/drivers/bus/mhi/host/pm.c @@ -429,6 +429,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_co= ntroller *mhi_cntrl) =20 if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { ret =3D -EIO; + read_unlock_bh(&mhi_cntrl->pm_lock); goto error_mission_mode; } =20 @@ -459,11 +460,9 @@ static int mhi_pm_mission_mode_transition(struct mhi_c= ontroller *mhi_cntrl) */ mhi_create_devices(mhi_cntrl); =20 - read_lock_bh(&mhi_cntrl->pm_lock); =20 error_mission_mode: - mhi_cntrl->wake_put(mhi_cntrl, false); - read_unlock_bh(&mhi_cntrl->pm_lock); + mhi_device_put(mhi_cntrl->mhi_dev); =20 return ret; } @@ -1038,9 +1037,11 @@ int __mhi_device_get_sync(struct mhi_controller *mhi= _cntrl) read_unlock_bh(&mhi_cntrl->pm_lock); return -EIO; } + read_unlock_bh(&mhi_cntrl->pm_lock); + + pm_runtime_get_sync(&mhi_cntrl->mhi_dev->dev); + read_lock_bh(&mhi_cntrl->pm_lock); mhi_cntrl->wake_get(mhi_cntrl, true); - if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) - mhi_trigger_resume(mhi_cntrl); read_unlock_bh(&mhi_cntrl->pm_lock); =20 ret =3D wait_event_timeout(mhi_cntrl->state_event, @@ -1049,9 +1050,7 @@ int __mhi_device_get_sync(struct mhi_controller *mhi_= cntrl) msecs_to_jiffies(mhi_cntrl->timeout_ms)); =20 if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { - read_lock_bh(&mhi_cntrl->pm_lock); - mhi_cntrl->wake_put(mhi_cntrl, false); - read_unlock_bh(&mhi_cntrl->pm_lock); + mhi_device_put(mhi_cntrl->mhi_dev); return -EIO; } =20 @@ -1339,11 +1338,10 @@ void mhi_device_put(struct mhi_device *mhi_dev) =20 mhi_dev->dev_wake--; read_lock_bh(&mhi_cntrl->pm_lock); - if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) - mhi_trigger_resume(mhi_cntrl); =20 mhi_cntrl->wake_put(mhi_cntrl, false); read_unlock_bh(&mhi_cntrl->pm_lock); + pm_runtime_put(&mhi_cntrl->mhi_dev->dev); } EXPORT_SYMBOL_GPL(mhi_device_put); =20 --=20 2.34.1