From nobody Sat Feb 7 22:07:38 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010047.outbound.protection.outlook.com [52.101.46.47]) (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 94DA2387569 for ; Thu, 29 Jan 2026 11:28:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.47 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769686105; cv=fail; b=WPjbJPJjgnBlVU+7mTrdG9evJb+la6ixq7hhqBMPILwe1CNxHXPhaqdyROV3U8w5A3BLiYDGnONPhzBe1yK7QEe3kB5Yh/Fmrt4utO7tDYL7qdtfyaLs1YIPCsMR9j2tz3b2YwZN/V9k87FlQba1PAHxsRt9GEHFG3Q3xhxqJFg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769686105; c=relaxed/simple; bh=TbcfakoZ5upe1HWA6xhpdQXAuC8/cUYrhxURA4x4lLw=; h=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type; b=uDFG4ndfaOTBuw+eOEj7bmQcQV44lVqSeHvKBWkCBEgoPckX7BeF2MFgaJUWju/j1m+QeO/qX77BXMFpDOUpD22SPHSMAD38Xd/U9LEhJtUM9JscrAmRVF/NX9Vrng63iwuHQBg4BeIEnxPm1SMuHt0m9tQ2wde9vhygT5RMtus= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=bgVakqCR; arc=fail smtp.client-ip=52.101.46.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="bgVakqCR" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ImkXGnACk/bBM9ROXX9Fye/vqWjmV+ShKt8VoQ6diDczYAfPET3V2tZ6+5bP5CbpV4D9Uvc0JU9n1lVS/vUpB/0z0w/sFz9xc6ZIG49Awcxpj/Lv/UvvLyz/bwIt+WxkDzATzUwdMFkZAhy2E0YhXjaZlUuyVM1trPXbWiWEIBa8teDL8U2QC+X1QrUjl2ERtYCcev0QQNT6S9etZ8WQSF8ptKMyJwQema9bFaMIDYTJCNqDwuSMvM9rcmWXX6booOyZte9MRstTtdpUSQKQhdqyZIl8L5atyEI5vkv6PwlYMGAL5JTMszjwLrUP1rYDDQKfpa5XXBarRDyfV65woA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=wSIa51OFwUOlnJQjZRS6pd6DIW74lS9LlNczl/SOI3o=; b=Mmr+h5BfyoqtYUPKcqltvmkcZo6vDYGkFN9F+TTsjlR8Y7hbjuD9D+Me8ANymGIW5MP84IiO0apt2E7BA56dlXuOJG+DzlFl+6kl+aUwWpkmsU0wEw7LfrBn9ZYLEIjJGsBKX32KHlSRTwzACMIr4FaLOkqd35HxMRws5qPbaQEcpyC9qrzLM+4LOtMAUZVTqGafSlVaA5QeuubUVUoosCsHM7rbG2u//UMobQQYAZ4MjcvcP75C/LQ4FAhwL5M+FdfuCD9Nu2mNP8y9/dbD4O5mjvgSAFV9b606mMDSXaKIQwCedoKlaCIpL+A4TqotqtEu3NyqO43E8vKaKbwt2A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.21.194) smtp.rcpttodomain=ideasonboard.com smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wSIa51OFwUOlnJQjZRS6pd6DIW74lS9LlNczl/SOI3o=; b=bgVakqCRQa1FljaPZHMZHrZJY7sHP46vmWQSdHrZW+g8X8LJSBYJsPMZBAQG5niwt9UbaqThiUx7m3Y5n7VPgUs38vBl9/ICeDKva4CNRNcsK3wm7wyLxCSPAZERd7iwSdYY0uon/VBVoeMKec0CJjI+enrlGW6WBSOmw+IN8n4= Received: from BYAPR02CA0029.namprd02.prod.outlook.com (2603:10b6:a02:ee::42) by SJ5PPFB3F166793.namprd10.prod.outlook.com (2603:10b6:a0f:fc02::7c4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.10; Thu, 29 Jan 2026 11:28:20 +0000 Received: from SJ5PEPF000001D6.namprd05.prod.outlook.com (2603:10b6:a02:ee:cafe::ee) by BYAPR02CA0029.outlook.office365.com (2603:10b6:a02:ee::42) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9564.11 via Frontend Transport; Thu, 29 Jan 2026 11:28:20 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.21.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.21.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.21.194; helo=flwvzet200.ext.ti.com; pr=C Received: from flwvzet200.ext.ti.com (198.47.21.194) by SJ5PEPF000001D6.mail.protection.outlook.com (10.167.242.58) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.3 via Frontend Transport; Thu, 29 Jan 2026 11:28:19 +0000 Received: from DFLE209.ent.ti.com (10.64.6.67) by flwvzet200.ext.ti.com (10.248.192.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 05:28:17 -0600 Received: from DFLE205.ent.ti.com (10.64.6.63) by DFLE209.ent.ti.com (10.64.6.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 29 Jan 2026 05:28:17 -0600 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DFLE205.ent.ti.com (10.64.6.63) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 29 Jan 2026 05:28:17 -0600 Received: from uda0543015.dhcp.ti.com (uda0543015.dhcp.ti.com [10.24.69.9]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 60TBSBZ63657229; Thu, 29 Jan 2026 05:28:12 -0600 From: Abhash Kumar Jha To: , , , , , , , , , CC: , , , , , , , Subject: [PATCH] drm/bridge: cdns-mhdp8546: Add suspend resume support to the bridge driver Date: Thu, 29 Jan 2026 16:50:16 +0530 Message-ID: <20260129112016.2448037-1-a-kumar2@ti.com> X-Mailer: git-send-email 2.34.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SJ5PEPF000001D6:EE_|SJ5PPFB3F166793:EE_ X-MS-Office365-Filtering-Correlation-Id: e852e340-caff-46c0-29d8-08de5f2980f6 X-LD-Processed: e5b49634-450b-4709-8abb-1e2b19b982b7,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|36860700013|82310400026|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?GMnHIv7qeibBywDngbmkGm6pDdyfuk7TMucwPlgxf3vzYGy7bB3N7hNbWQWQ?= =?us-ascii?Q?VsOZJkoNwQOfOWPsYRmQgFBx5kXs+mHuaaVupxD0MEnSGfv89ck77mdkwJAp?= =?us-ascii?Q?Is/tctAr0/7NMkOu+1MH5Emj0WuRp63vzC+v6GA1HtwIzznPk8RKPUMfn419?= =?us-ascii?Q?yTYStaoKpYv38qtJeogZ6RaAcdvFB4vMUgEh3kEpM5CKiR9hxxqsqWsMg06a?= =?us-ascii?Q?Sm9V3094vy4VgQxnBj7qPX2YR0NDuVRIHoHzWxgMXSbjhnGM40McYeAYNtQq?= =?us-ascii?Q?81/2Lh5BbKmR8PjXzSkyBqc5biVu+4UemTXfBhtLA9MVU/5zhq0IFRAW9ADb?= =?us-ascii?Q?/IBSjFC8qzH50HF0Ob3001O+Cdb7bn5azobEVInCrGf2fabZ7rxzl9SfsJB3?= =?us-ascii?Q?XjgPTLSP8iecW24omkBOs69Dk3aRsAwH2jqoFsUDJ4PATJAAbxRmEDfgv8KO?= =?us-ascii?Q?ip1lIliDk+WWFr1FU9zN+8TCfsfUdPP1lEZ3L3vJ39uEQluziSqlD4YM2o7P?= =?us-ascii?Q?489VgjnGfER/EXDu02R3KsECIs9M7Wt8OundWIYGp9tkgI2c2VHzanDodzqb?= =?us-ascii?Q?gKbK2/2iVRNVQKay3QZMg/ZhoLefI7Bam2azkAjGCo76MhNyLnU5LGm+A+lC?= =?us-ascii?Q?AJCiNN8I50hTPEXmtkWj4t+7qbnlf1yW7ZQ4nR5d6h2DD4CP+jefRMBtIghe?= =?us-ascii?Q?mTcBwRY/UIp95eNcZZhZoGMHCuanlqJA2mwdTpx00pGs3XiuCQ8gkHtrlSo0?= =?us-ascii?Q?1E+NzEnGgjhdqttQayDGOxbydVIQPT/xqXls2us6+lb6UW4VapR1BCFSGM7P?= =?us-ascii?Q?QrPOilzN85XR5PmfA/D+nCC0JFJlrLz+cERGenV7OaTMNjNWHDuxGMXNh16V?= =?us-ascii?Q?/bUWP49/AqP59pfhDEmVYS3PdKBFJ9dTGcYOmfQ9dN7Za6cjj1zWLOOmh7vN?= =?us-ascii?Q?E96Yic616MAcOrTZE0ORXp0rLa7YSFHXi00VWP3EhW4HndnZsSn1J7IZYr+8?= =?us-ascii?Q?tNU6IOdn9i8u9TmfxAn3aeVob70cKMrzve5tvnNSucV5bP9VRSF2KSPcO+RZ?= =?us-ascii?Q?u7fHxWpXyADWeIR1TOXk3tsq3TYYQ2ocHdOdts6DQ/dYRfYvjX0nhv0CmV56?= =?us-ascii?Q?0MVFZLCM8EZXnRKOLgiWQ64ZIi+lJjMpZQvrTX4nSIfgTrZ7bpfn0bIWtb9d?= =?us-ascii?Q?S2pe1ujVEZrrjA2bQPtRWeR9jXyTBeEb0z4JJLO1G5uYNj1kaptQO4jvOW38?= =?us-ascii?Q?3N0dC2F9DjkYwDevd8bSo27MswAu6gvbfe/AFNUEMa8vxg8mtlij0GAPRZqc?= =?us-ascii?Q?ELGo6UpQVuu+IKbY3HZcOlTfYIYpv/Ul1Pd8TEiqO0N8NS7yQCJ5Mh7wvZiC?= =?us-ascii?Q?ozC2K9Nm2+n9BWGcmAH5NhznymTR8J2k/qCCFHB7tub80EhGttpKhR3PaTG1?= =?us-ascii?Q?dkTqsMPGrgpTt7GB//dDtdCuxz0Oy5PLCixTUl22IBi+qVLFO/Y5TqU9sTI2?= =?us-ascii?Q?loH2n9h+HAVnOg5vR6NS9waWuO0DcBGUuhUk5ZYUX9Yd06CHyJujrrNHsBcR?= =?us-ascii?Q?b7u9vssJ3rVsoJ6Q4kT9n0ZtauAIWNLMfXf2fxSRN4Riw8uoz8G+l7d2OjZa?= =?us-ascii?Q?7GqL8rbyoffH9Dtk0lJ3g35HBE0bF2yvZ3DVSz4Y9S4bNTfZOi5NSCYSnvhE?= =?us-ascii?Q?0iTUdg=3D=3D?= X-Forefront-Antispam-Report: CIP:198.47.21.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:flwvzet200.ext.ti.com;PTR:ErrorRetry;CAT:NONE;SFS:(13230040)(376014)(7416014)(36860700013)(82310400026)(1800799024)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2026 11:28:19.3706 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e852e340-caff-46c0-29d8-08de5f2980f6 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.21.194];Helo=[flwvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: SJ5PEPF000001D6.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ5PPFB3F166793 Content-Type: text/plain; charset="utf-8" Add system suspend and resume hooks to the cdns-mhdp8546 bridge driver. While resuming we either load the firmware or activate it. Firmware is loaded only when resuming from a successful suspend-resume cycle. If resuming due to an aborted suspend, loading the firmware is not possible because the uCPU's IMEM is only accessible after a reset and the bridge has not gone through a reset in this case. Hence, Activate the firmware that is already loaded. Use GENPD_NOTIFY_OFF genpd_notifier to get the power domain status of the bridge and accordingly load the firmware. Additionally, introduce phy_power_off/on to control the power to the phy. Signed-off-by: Abhash Kumar Jha --- .../drm/bridge/cadence/cdns-mhdp8546-core.c | 136 +++++++++++++++++- .../drm/bridge/cadence/cdns-mhdp8546-core.h | 4 + 2 files changed, 139 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c b/drivers/= gpu/drm/bridge/cadence/cdns-mhdp8546-core.c index 38726ae1bf150..dd482094bf184 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include =20 @@ -2383,6 +2384,120 @@ static void cdns_mhdp_hpd_work(struct work_struct *= work) } } =20 +static int cdns_mhdp_resume(struct device *dev) +{ + struct cdns_mhdp_device *mhdp =3D dev_get_drvdata(dev); + unsigned long rate; + int ret; + + ret =3D clk_prepare_enable(mhdp->clk); + if (ret) + return ret; + + rate =3D clk_get_rate(mhdp->clk); + writel(rate % 1000000, mhdp->regs + CDNS_SW_CLK_L); + writel(rate / 1000000, mhdp->regs + CDNS_SW_CLK_H); + writel(~0, mhdp->regs + CDNS_APB_INT_MASK); + + ret =3D phy_init(mhdp->phy); + if (ret) { + dev_err(mhdp->dev, "Failed to initialize PHY: %d\n", ret); + goto disable_clk; + } + ret =3D phy_power_on(mhdp->phy); + if (ret < 0) { + dev_err(mhdp->dev, "Failed to power on PHY: %d\n", ret); + goto error; + } + + if (mhdp->powered_off) { + ret =3D cdns_mhdp_load_firmware(mhdp); + if (ret) + goto phy_off; + + ret =3D wait_event_timeout(mhdp->fw_load_wq, + mhdp->hw_state =3D=3D MHDP_HW_READY, + msecs_to_jiffies(1000)); + if (ret =3D=3D 0) { + dev_err(mhdp->dev, "%s: Timeout waiting for fw loading\n", + __func__); + ret =3D -ETIMEDOUT; + goto phy_off; + } + } else { + ret =3D cdns_mhdp_set_firmware_active(mhdp, true); + if (ret) { + dev_err(mhdp->dev, "Failed to activate firmware (%pe)\n", ERR_PTR(ret)); + goto phy_off; + } + } + + return 0; + +phy_off: + phy_power_off(mhdp->phy); +error: + phy_exit(mhdp->phy); +disable_clk: + clk_disable_unprepare(mhdp->clk); + + return ret; +} + +static int cdns_mhdp_suspend(struct device *dev) +{ + struct cdns_mhdp_device *mhdp =3D dev_get_drvdata(dev); + unsigned long timeout =3D msecs_to_jiffies(100); + int ret =3D 0; + + cancel_work_sync(&mhdp->hpd_work); + ret =3D wait_event_timeout(mhdp->fw_load_wq, + mhdp->hw_state =3D=3D MHDP_HW_READY, + timeout); + + spin_lock(&mhdp->start_lock); + if (mhdp->hw_state !=3D MHDP_HW_READY) { + spin_unlock(&mhdp->start_lock); + return -EINVAL; + } + mhdp->hw_state =3D MHDP_HW_STOPPED; + spin_unlock(&mhdp->start_lock); + + if (ret =3D=3D 0) { + dev_err(mhdp->dev, "%s: Timeout waiting for fw loading\n", __func__); + ret =3D -ETIMEDOUT; + goto error; + } else { + ret =3D cdns_mhdp_set_firmware_active(mhdp, false); + if (ret) { + dev_err(mhdp->dev, "Failed to stop firmware (%pe)\n", ERR_PTR(ret)); + goto error; + } + } + + phy_power_off(mhdp->phy); + phy_exit(mhdp->phy); + clk_disable_unprepare(mhdp->clk); + +error: + return ret; +} + +static int mhdp_pd_notifier_cb(struct notifier_block *nb, + unsigned long action, void *data) +{ + struct cdns_mhdp_device *mhdp =3D container_of(nb, struct cdns_mhdp_devic= e, pd_nb); + + if (action =3D=3D GENPD_NOTIFY_OFF) + mhdp->powered_off =3D true; + + return 0; +} + +static const struct dev_pm_ops cdns_mhdp_pm_ops =3D { + SET_SYSTEM_SLEEP_PM_OPS(cdns_mhdp_suspend, cdns_mhdp_resume) +}; + static int cdns_mhdp_probe(struct platform_device *pdev) { struct device *dev =3D &pdev->dev; @@ -2494,6 +2609,11 @@ static int cdns_mhdp_probe(struct platform_device *p= dev) dev_err(mhdp->dev, "Failed to initialize PHY: %d\n", ret); goto plat_fini; } + ret =3D phy_power_on(mhdp->phy); + if (ret < 0) { + dev_err(mhdp->dev, "Failed to power on PHY: %d\n", ret); + goto phy_exit; + } =20 /* Initialize the work for modeset in case of link train failure */ INIT_WORK(&mhdp->modeset_retry_work, cdns_mhdp_modeset_retry_fn); @@ -2504,21 +2624,33 @@ static int cdns_mhdp_probe(struct platform_device *= pdev) =20 ret =3D cdns_mhdp_load_firmware(mhdp); if (ret) - goto phy_exit; + goto power_off; =20 if (mhdp->hdcp_supported) cdns_mhdp_hdcp_init(mhdp); =20 drm_bridge_add(&mhdp->bridge); =20 + mhdp->powered_off =3D false; + mhdp->pd_nb.notifier_call =3D mhdp_pd_notifier_cb; + ret =3D dev_pm_genpd_add_notifier(mhdp->dev, &mhdp->pd_nb); + if (ret) { + dev_err_probe(dev, ret, "failed to add power domain notifier\n"); + dev_pm_genpd_remove_notifier(mhdp->dev); + goto power_off; + } + return 0; =20 +power_off: + phy_power_off(mhdp->phy); phy_exit: phy_exit(mhdp->phy); plat_fini: if (mhdp->info && mhdp->info->ops && mhdp->info->ops->exit) mhdp->info->ops->exit(mhdp); runtime_put: + mhdp->powered_off =3D true; pm_runtime_put_sync(dev); pm_runtime_disable(dev); =20 @@ -2550,6 +2682,7 @@ static void cdns_mhdp_remove(struct platform_device *= pdev) ERR_PTR(ret)); } =20 + phy_power_off(mhdp->phy); phy_exit(mhdp->phy); =20 if (mhdp->info && mhdp->info->ops && mhdp->info->ops->exit) @@ -2581,6 +2714,7 @@ static struct platform_driver mhdp_driver =3D { .driver =3D { .name =3D "cdns-mhdp8546", .of_match_table =3D mhdp_ids, + .pm =3D &cdns_mhdp_pm_ops, }, .probe =3D cdns_mhdp_probe, .remove =3D cdns_mhdp_remove, diff --git a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h b/drivers/= gpu/drm/bridge/cadence/cdns-mhdp8546-core.h index bad2fc0c73066..b06dd5e44aafd 100644 --- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h +++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.h @@ -412,6 +412,10 @@ struct cdns_mhdp_device { =20 struct cdns_mhdp_hdcp hdcp; bool hdcp_supported; + + /* Power domain status notifier */ + struct notifier_block pd_nb; + bool powered_off; }; =20 #define connector_to_mhdp(x) container_of(x, struct cdns_mhdp_device, conn= ector) --=20 2.34.1