From mboxrd@z Thu Jan 1 00:00:00 1970 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 67F653C65FA for ; Fri, 22 May 2026 10:01:43 +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=1779444104; cv=none; b=PoIkOCjb5VOPuXQhZKktqOA2z0+xr4+6Gv6b/It9dVr8es1y/ATFuRIg/MCm3k18kEgp+jIykmtA+xUuHcPIflTwnS6K2lb/4eTNP33g4kS8gEU67y+og6jdxP4pF/UKKubYJ+mN1kMQjd8oT14We79xubFqt+cWQ5HJ6AcKYZA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779444104; c=relaxed/simple; bh=iFHxbTO6wE35Tl3kqwnkO8A1IQ+NptFsGOPDlaw/GEs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jMyasnN1/gqzvJxPfkkY1c85Z0boXh4x72bThvbp6usBM5CUwESjUtj//rJ9u7EBmyxscR/tExQNkWhVbWj4F4gCLde7+jDVnp68cJ29NUQ/oMw6EY2oQRwleyPpbH1DDVy/flFG3YVcJTATjAaKB/FzRUG1mXkdpNRwcZG/srw= 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=RlcEFI4D; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=e8/7QdzX; 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="RlcEFI4D"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="e8/7QdzX" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64M8uuHc3005135 for ; Fri, 22 May 2026 10:01:42 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= 5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=RlcEFI4DbYPXiWK4 QIlBKbaRJedey4Bt6BSXn+z+qgw4dOjuyVZIn6+f4an/HrlkBJNeKn0426wyIWID DWGe0brdpGtxASKeEc9MAkgbfRunDdZwezz8A0DGQgex6gFV8Z2extNKtZ/1dmYL ZZOtc7ZT1PobKIdaS79++SrbhMjyh+cve2dXWjCyGPU5OGYMvMqND7Lxoke7LbzA cT5AtlMq/0QACA3d8DTQ/PMFAU489910ptdIyDy99iyevn9v2c1GnzjVbNN+aOaR h5D9tH3ylLKZkfS5CetSbU3z4mGceFP11qQRbDBZT81idOZgoyyuY7BTPDWutLQo FHdDAA== Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eafrt9f04-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 22 May 2026 10:01:42 +0000 (GMT) Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-82f6b984b3aso3467632b3a.3 for ; Fri, 22 May 2026 03:01:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1779444102; x=1780048902; 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=5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=e8/7QdzX3yUWZa0Rblaoh4TYBfyn+8K0gB9FGX1tr/L4w/9k6hWX5mE4a0b6gC9vxB +784VI0VkFieuH68D9RoKSn7J/gQYv0dafDc10XWupcAGWLx5pjzjGirD+Tr4C0+QDtJ 0R8TLu95aXEKPHZ+JspJeRCrRbZKr5LRhNN3SdFBsPTDASivaLoMkWvsVoKoUGco6L84 DCxM5ZStvGFzJhqKvKlbUqQMKMyG/E1HosL3aoBR8VWCKnkZlqfyyKBgl1t/sYmpFcXt Udnl/+bN6YpavUtpkilIEmGlz7w2pPz9+mwd+YCtc4jvTyFBNgjG0v4UTIyRwoOG7ftf mFVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779444102; x=1780048902; 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=5DXeyrdoWr0DcgBTdRbVLV0jwA0imqVGVhlRKg6Geqg=; b=lO7I9tZQmoQs18lRuyVjKaos2/KpDRGHXM2nuRHSLhyycDA1br9brs0Y+vwrUCXWzX ZRWdSBpzytXLI46QnSA1SebA+rHh4a/j4DatzjD6mu4cZXOTQX66iFXsyf3ridQ7i7Si LveGiujOpyo4q+K+ISeV/J96tME9KsyHXjlN1+ShE7uEn7qqUO6omaR5D4ZHDbRqQCX7 j1H+HWa8JrlbjywZWOqfBDCG0eqFgw18cbJR1Ro1Cpg2B26dQYgLwIoM0nWBnhGKUb3b voKTHcLJRv65aLcNC7Vie23hEYCPGg8v2EssdaDy0UH7dOe6fX+od2O4dCfZV7T1zuC7 54Sw== X-Forwarded-Encrypted: i=1; AFNElJ8kQGzcHp5m9+J7sr5vdz1kw6giBezA3wcOem1HE68x3UAxWM5rPnw19o+tc4Ldp8Cl/IQfKJLR8UyG1ls=@vger.kernel.org X-Gm-Message-State: AOJu0Yz0W16Ahb9h4Zz/Ho1zSS+MMlLxy3WOhnDMLpdr6iF4v+EQ69Dv oXGHS+RWhnd12tcHixEA+xTflg25wPpfJGoBWYaU9u7umrphwauptJSQbdUNDuTWkx4oz8CshBx kAFjw8ZVTMOF/rxdebIpDjJohQC2vFo6s1apENlxZ5ZmUKT9iDeF5tPqs1vrR1fhktI0= X-Gm-Gg: Acq92OEuYmblVmnjXHifAeiroXfsZEAMqwu0wlddmANLPXAPvdh2WrMUvdIzFVfHbFq aG9elTQDm4WTpXkWP/qbdtEHqj3YSxtAnbwBQ6/v69/Zz4ClGS0H9ra3d9RwmpChfsj4Yyk4sMm ep3lFVDjvOonljDo3Wbc/NtZJWwmL3lay7Nw/Bd3DMz5jpfPGUqUW0+wEVfPtfFb1njxv9OQiq+ aLQPHl4KrAOznRSR55tVUjPc6W+T4peklREE/kjxB6O1eqGZA6g0ej53iQNBuMrton4kPZkj1ih 06kpgenAw2Qyeoob5N8jYVxPy8Hi7yio/TlaMdH0XAt+XyGxgbHGNummA+SJFEdNm3vJxUiTgQa ASg2J9P5u2Hraeo8QXAjjs3uDKIpvPgenebqUq1znSVb8VcG9Fb8S2nlYpFRglLTxvkI= X-Received: by 2002:a05:6a00:bd11:b0:82f:24e:6a48 with SMTP id d2e1a72fcca58-8415f2e0caamr3187460b3a.5.1779444100468; Fri, 22 May 2026 03:01:40 -0700 (PDT) X-Received: by 2002:a05:6a00:bd11:b0:82f:24e:6a48 with SMTP id d2e1a72fcca58-8415f2e0caamr3187406b3a.5.1779444099822; Fri, 22 May 2026 03:01:39 -0700 (PDT) Received: from hu-krichai-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-84164ac9b74sm1516641b3a.3.2026.05.22.03.01.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 May 2026 03:01:39 -0700 (PDT) From: Krishna Chaitanya Chundru Date: Fri, 22 May 2026 15:30:37 +0530 Subject: [PATCH v2 6/6] bus: mhi: host: Fix runtime PM ownership between clients and controller 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: 7bit Message-Id: <20260522-mhi_runtimepm-v2-6-fbebf41a82bb@oss.qualcomm.com> References: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@oss.qualcomm.com> In-Reply-To: <20260522-mhi_runtimepm-v2-0-fbebf41a82bb@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 , Simon Horman , Loic Poulain , Sergey Ryazanov , Johannes Berg 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.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1779444039; l=7532; i=krishna.chundru@oss.qualcomm.com; s=20230907; h=from:subject:message-id; bh=iFHxbTO6wE35Tl3kqwnkO8A1IQ+NptFsGOPDlaw/GEs=; b=Leraca11cxKZ9kv0wOGI3YHGBWBAYMU7jDrEbEBi0YqgqfKAQk5bm2D7Lfh9uEh0W7ZzT5vKK DtD9ugdBFwRClFNTiqzjFY0NRel2cgOG3a2qFCZJSiB8OgzBE27Wzzh X-Developer-Key: i=krishna.chundru@oss.qualcomm.com; a=ed25519; pk=10CL2pdAKFyzyOHbfSWHCD0X0my7CXxj8gJScmn1FAg= X-Authority-Analysis: v=2.4 cv=JN0LdcKb c=1 sm=1 tr=0 ts=6a102986 cx=c_pps a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=A8rfxp3GyOsx1I41rDQA:9 a=QEXdDO2ut3YA:10 a=zc0IvFSfCIW2DFIPzwfm:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTIyMDA5OSBTYWx0ZWRfX+XgUu6lVdYnw kHqYG4fHFqN/jFDH1u6WrcHSUAyJRIf9ORR68mQaQlYxglVmJ9th0hdFXIaDzIu0blGs+x/C0Zs afDz6C1kgV9fXZogBliCtxia7uRwUXlpgjxyBEGqQKXXsNPUMeJrK58RC8txbe+rTjEff+APAc0 1WzDhafzs2K8uWXmVC+O3ZzCtzXXJ0KoUFJIkCs3IQz0nIxJ7TxS5VOU77rOLwjlH7qhYcg/r2f yUIG7WZoy7EKnWgHWeOaJc+K2E+KK9Vj628zzP+28U/yP3gydQAY61H40MDvG8XHTQsqXXlrIWY tnL1+d0sq32HfLucOXaZoZRH42THbR8ER0YkfOOFZN6qcIZ/+1YLNZXaOLzKfuWGtCp5QniZwMT U62Bewxoq6fflNGwLMCNe5TxCCn+uI3cLbUB4+nPMzfhzaX2WwYQI7D7FbxGj0mb4PNcQAKtWnv Ym6Jnl1HfhYe+oJrp2g== X-Proofpoint-GUID: CCISGB813O675j5sedyQfnfU3DsEg8ou X-Proofpoint-ORIG-GUID: CCISGB813O675j5sedyQfnfU3DsEg8ou X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-05-22_02,2026-05-18_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 impostorscore=0 phishscore=0 bulkscore=0 clxscore=1015 spamscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605130000 definitions=main-2605220099 The current MHI runtime PM model allows the core to take power references directly on the controller device without visibility into client driver activity. As a result, a controller driver may runtime-suspend the hardware while one or more MHI client devices are still actively in use. This happens because the MHI core historically managed runtime PM internally, rather than relying on standard parent-child PM dependency tracking. The controller driver therefore has no way to infer whether MHI clients still require the controller to remain active. Fix this by enabling runtime PM on the MHI bus device (mhi_dev) and routing runtime PM references through it. Client drivers now hold runtime PM references on their own mhi_dev, allowing the PM framework to naturally propagate activity to the controller via the device hierarchy. The existing mhi_device_get_sync() and mhi_device_put() helpers are retained, as they serve as the synchronization point between the MHI power state machine and runtime PM, combining runtime PM reference management with MHI wake handling. Signed-off-by: Krishna Chaitanya Chundru --- drivers/bus/mhi/host/init.c | 3 +++ drivers/bus/mhi/host/internal.h | 6 +++--- drivers/bus/mhi/host/main.c | 26 ++------------------------ drivers/bus/mhi/host/pm.c | 18 ++++++++---------- 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/drivers/bus/mhi/host/init.c b/drivers/bus/mhi/host/init.c index 9f3ee4a14418..002f3abb8103 100644 --- a/drivers/bus/mhi/host/init.c +++ b/drivers/bus/mhi/host/init.c @@ -1034,6 +1034,9 @@ int mhi_register_controller(struct mhi_controller *mhi_cntrl, mhi_cntrl->mhi_dev = mhi_dev; + pm_runtime_no_callbacks(&mhi_cntrl->mhi_dev->dev); + devm_pm_runtime_set_active_enabled(&mhi_cntrl->mhi_dev->dev); + mhi_create_debugfs(mhi_cntrl); return 0; diff --git a/drivers/bus/mhi/host/internal.h b/drivers/bus/mhi/host/internal.h index a7493aabc6fa..434ed4705d25 100644 --- a/drivers/bus/mhi/host/internal.h +++ b/drivers/bus/mhi/host/internal.h @@ -354,9 +354,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); } /* Register access methods */ diff --git a/drivers/bus/mhi/host/main.c b/drivers/bus/mhi/host/main.c index 71919c2e9462..f0b09657de29 100644 --- a/drivers/bus/mhi/host/main.c +++ b/drivers/bus/mhi/host/main.c @@ -658,12 +658,8 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl, /* notify client */ mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); - if (mhi_chan->dir == DMA_TO_DEVICE) { + if (mhi_chan->dir == 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); - } read_lock_bh(&mhi_chan->lock); } @@ -1135,12 +1131,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info, read_lock_irqsave(&mhi_cntrl->pm_lock, flags); - /* 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); @@ -1150,11 +1140,6 @@ static int mhi_queue(struct mhi_device *mhi_dev, struct mhi_buf_info *buf_info, if (likely(MHI_DB_ACCESS_VALID(mhi_cntrl))) mhi_ring_chan_db(mhi_cntrl, mhi_chan); - if (dir == 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); return ret; @@ -1355,7 +1340,6 @@ static int mhi_update_channel_state(struct mhi_controller *mhi_cntrl, ret = mhi_device_get_sync(mhi_cntrl->mhi_dev); if (ret) return ret; - pm_runtime_get(mhi_cntrl->cntrl_dev); reinit_completion(&mhi_chan->completion); ret = mhi_send_cmd(mhi_cntrl, mhi_chan, cmd); @@ -1386,8 +1370,6 @@ static int mhi_update_channel_state(struct mhi_controller *mhi_cntrl, 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); return ret; @@ -1525,12 +1507,8 @@ static void mhi_reset_data_chan(struct mhi_controller *mhi_cntrl, while (tre_ring->rp != tre_ring->wp) { struct mhi_buf_info *buf_info = buf_ring->rp; - if (mhi_chan->dir == DMA_TO_DEVICE) { + if (mhi_chan->dir == 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); - } 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 f799503c8f36..278fc2ffb820 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_controller *mhi_cntrl) if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) { ret = -EIO; + read_unlock_bh(&mhi_cntrl->pm_lock); goto error_mission_mode; } @@ -459,11 +460,9 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl) */ mhi_create_devices(mhi_cntrl); - read_lock_bh(&mhi_cntrl->pm_lock); error_mission_mode: - mhi_cntrl->wake_put(mhi_cntrl, false); - read_unlock_bh(&mhi_cntrl->pm_lock); + mhi_device_put(mhi_cntrl->mhi_dev); 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); ret = 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)); 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; } @@ -1339,11 +1338,10 @@ void mhi_device_put(struct mhi_device *mhi_dev) 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); 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); -- 2.34.1