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 DD6BF2D8DC4 for ; Tue, 21 Jul 2026 12:49:02 +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=1784638144; cv=none; b=S8vIShAuZcFgoBRnLOPR31Di+085KlcMr8Y7DftyhR2K8ZR4rfl3FmQ4pn0JbnrlI/HIuow+X6FeBIhjQf40pvsTNRUsrLyOgJYCdD9MniGmyAPmeuQlIoW3G2M64yIN+0n/fjNjzCK/h4sMJrHq2woqAlYTBZ2soiA0LssS9zE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784638144; c=relaxed/simple; bh=U7HA9z1+k46clwJJPu8Z+uz9L279gRK1Zr2lzRLsEz0=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=SjjE+DNqqNQOBfnklHyS0XCiayMoHXfnXQc/RCPTN6zXAUMkGvYK6UI6+lfCq+feiCqkyce+SHctB5wrEGHAY1MVyU+aH2wlRiCSFEJFHtq+meMlhmLC78W7RI7gw5tHrVCxEvNvFDNCO2kP9sP6S6Zwl6K+65OLcSDbYvA61z0= 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=EKBm/+U8; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=esgS2KZd; 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="EKBm/+U8"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="esgS2KZd" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66LARNuJ945882 for ; Tue, 21 Jul 2026 12:49:01 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= oR2huL0V5JGejGGvcJlqifpoLwmTifg5Q2IjfL5u2kk=; b=EKBm/+U8PD5Z5AGg YzvjnAMBJq1hu3ScDdGMloMvw/terP/e94VjlsGk2RnPibtgn9qkcznlC6POejCd 5RAIhuHMuTi7+hfh9NgPqxN+BXDmav7h2uEnbFwUeuJ89N/Gx5WHnkU4WrJnwVg0 Cc9oPiZlTJcYBAOAaKoptZNRIKKlSA8bM/y7EIup1a1S+3AAucu+kSmG5mN1cwFj bGtNv/whd0OQvSBZ3lj6fCxGR4p86nmDXcaoOwLC5iblTzVpHoXjytKp4t85mPWz 7eJjKyY0lxRfa3h8W8JAEoW1IbH2L1VAT1TGgXVNhfgFQdzS3ZImOqtuPS7SYbpk xWnjPQ== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fj1es2dn5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 21 Jul 2026 12:49:01 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-92ef13b61bcso1953042285a.1 for ; Tue, 21 Jul 2026 05:49:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1784638140; x=1785242940; darn=vger.kernel.org; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:from:to:cc:subject:date:message-id:reply-to :content-type; bh=oR2huL0V5JGejGGvcJlqifpoLwmTifg5Q2IjfL5u2kk=; b=esgS2KZdCANDnTWGCcUqhrEpOs5lS0BK5sF2/qkp2WCe+q34X2QORYi075bqCfj2L3 xenmbb78cRPQbJP6rjw1z5bvyYdPGVgqu/l85igZuW+eJp5kBOJcb1+BvbbZHBaJFV5A QDFLt9ANR8Vf7/gX4ZF9L87xF+oyZQYpiD0X0RQG7ViYrtZQzVMopw2E+/cJ/o73PYBm VVrOG8XsePXxugDzsIg2Vl/6bPCKuMaL6IhmSkg2oBtdzu0/X3Z2kLDNXjZwv0XvDOPa hkSQl7u0nrZ0wWRgc9qiYR0VXkPUfIJF6/PRhcfinbS+BoHgW+0IZ9IBwErOgNhniYKa zJQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784638140; x=1785242940; h=content-transfer-encoding:content-type:in-reply-to:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=oR2huL0V5JGejGGvcJlqifpoLwmTifg5Q2IjfL5u2kk=; b=AzEngrliNON8BqrkFEyzUDCmyOhUOgX99S1bJfP31zRyt/7GWq8gERGKXF6eDuMuyt oe7tJEtVHixDx19H71WMuYtIf/w3E4Jwc1G2jQrQIITeLqrQYS18zH3jA0T18eL46HNx 9vuiwSdnw18Bd9LHOL+0y98ZcTXF660NAigRGk7bn+e1ZK7LvuNodUPbGY8j6s4oZQ4S SO1Y/0632O56d7148+3UzmwrCR8KawgFOhcRkj1ytRaykqvEWEUIDk+yX0dcNEmJiOWk obEQWMDAntTZ72OHH5KoeTlw4sutcVk1TF+TfYIDk+8TAj48EwIoIur7oZFOydDf0zTb DbLg== X-Forwarded-Encrypted: i=1; AHgh+Rpdxzr+jblwPLiIiCrUJtTh+mwBtQvi09ERrAcTqGpzphWalBQSwqrt/0odYVKJAlE/MAqGSZl1AxbSBow=@vger.kernel.org X-Gm-Message-State: AOJu0YxNhgUAGtPvmj5Rer9zLsQfqu25Qv56tEEaLsNJOYosxnapLcAv oooLT0oXSJOnkRAJ9HiQl3WD27gOPjhJbCvRXgFexWKqm2yQOWu5+EMsF16qK9SdS2lTRtd9w1w R8FRxUH7q6e2ZXe17Vmf7t5ISEveLaZ5sibxntGci5JsB0CTyvbtPcfYlL1grDwtF8r8= X-Gm-Gg: AfdE7cmDBTtcX3NyvcC5b0stdZd3Ry/BPzY/vSeYQfSQnIWMIOCg1FdnVjBiz4LhgZw d0h1ts3o1yTLSNxCv3cMhuyuIpvbwY9ZBWmidhZ9K1IQM9CRaF4If11TG4MMLLUWS368m5hZ7lb /30eEDkJ4NP7sbFLUyKsWht/qei+SWCefqpDhDuHcyb89pqr6kfGes8loGKBCaS8MBfd+f9hWIo cv1axjlZdTZpu0dvjCuSJ6UNGm8pg6lGvWPxcv2y8vgTVeel7IpW+e6InL01r1Sre2QIFgTEdEY AIjeOoaHln275PhT7gKnCyu2T4FlPfaLHxREKF+NBV2y8XR0k5ghLlvrnhPCdhEfyEGJgQV84iX 6Z9j8xToPSatI4/d3Yc0Y9JiceDyKruCWjBU= X-Received: by 2002:a05:620a:230f:20b0:92b:6805:91b4 with SMTP id af79cd13be357-930b431ca0emr1359560985a.60.1784638140108; Tue, 21 Jul 2026 05:49:00 -0700 (PDT) X-Received: by 2002:a05:620a:230f:20b0:92b:6805:91b4 with SMTP id af79cd13be357-930b431ca0emr1359556785a.60.1784638139417; Tue, 21 Jul 2026 05:48:59 -0700 (PDT) Received: from [10.219.57.229] ([202.46.23.19]) by smtp.gmail.com with ESMTPSA id af79cd13be357-930b52fb150sm1113767785a.19.2026.07.21.05.48.47 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 21 Jul 2026 05:48:58 -0700 (PDT) Message-ID: Date: Tue, 21 Jul 2026 18:18:46 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v23 08/13] mfd: core: Add firmware-node support to MFD cells To: Bartosz Golaszewski Cc: linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Florian Fainelli , Krzysztof Kozlowski , Dmitry Baryshkov , Mukesh Ojha , Andre Draszik , Greg Kroah-Hartman , Kathiravan Thirumoorthy , mfd@lists.linux.dev, Srinivas Kandagatla , Bartosz Golaszewski , Sebastian Reichel , Mark Rutland , Lorenzo Pieralisi , "Rafael J. Wysocki" , Daniel Lezcano , Christian Loehle , Ulf Hansson , Lee Jones , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Bjorn Andersson , Konrad Dybcio , Arnd Bergmann , Souvik Chakravarty , Andy Yan , Matthias Brugger , John Stultz , Moritz Fischer , Sudeep Holla References: <20260714-arm-psci-system_reset2-vendor-reboots-v23-0-e7453c548c21@oss.qualcomm.com> <20260714-arm-psci-system_reset2-vendor-reboots-v23-8-e7453c548c21@oss.qualcomm.com> Content-Language: en-US From: Shivendra Pratap In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Authority-Analysis: v=2.4 cv=SPZykuvH c=1 sm=1 tr=0 ts=6a5f6abd cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=j4ogTh8yFefVWWEFDRgCtg==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=EQpnHehRo6XFvJL-JpUA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-GUID: MdIkHLo1REHJ-SRRz4qaNImf2S8GifhH X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzIxMDEzNSBTYWx0ZWRfX3pMmjXxcB/Rv Kfq/PIvdl6YWnBFd4RyRFWi11Mi2EX6Ui+t4q2mvXxTHUXxpJxiR9DJWkq4cqe4LyKApieAQ3HI RwXDB7SMyylJlkC8zkDZZYgnLTZbnfUrS3uJ+Uzn8VO2cUo9FEqRibgCbta2Qx2WcoDNOOwUfuZ hugAcalQ/XB5re8ABU5MKH6VmuuAL1FG+7RXw8xwU8uSVWxNQTAe76ZxOtsU/+wYDJ9kSlmOFMf kx3Ao5LPbKpMuLSwoJ0KePmpLdctE0sVdi70nm/r7FkjFlxJ3MpMlXnQO9jPMOv9CtvlNwTy8X/ pTrtNhJbNnTsIzyWdEwXbVDI4Pm9L94tAiJsvObL4O7QgxBnpemqoqRG+Iz990racEiDCXfm2Ht b/4h1MKofCqjZV/PRZCMR475BOSmyC96ZWagDB/JNi64seAjW1VC2QPsOHG0x7RNe6dB+4Oak8b nA0Z6TlRlXq8nWcZ4oQ== X-Proofpoint-ORIG-GUID: MdIkHLo1REHJ-SRRz4qaNImf2S8GifhH X-Proofpoint-Spam-Info: AW1haW4tMjYwNzIxMDEzNSBTYWx0ZWRfX3sTI7HDwmgdI YwqFsyJP26ZWSOHpSuY6dTuCWCR52wg0IZsZONIoYkacmNij0DXIIBfM1jR56PhhELIzuPYDAKt SRgacRqqgrZUSKHeVj7Y6wq0IstdGsQ= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-21_01,2026-07-20_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 bulkscore=0 phishscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 suspectscore=0 malwarescore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607210135 On 21-07-2026 14:59, Bartosz Golaszewski wrote: > On Tue, 14 Jul 2026 19:16:36 +0200, Shivendra Pratap > said: >> MFD core has no way to register a child device using an explicit firmware >> node. This prevents drivers from registering child nodes when those nodes >> do not define a compatible string. One such example is the PSCI >> "reboot-mode" node, which omits a compatible string as it describes >> boot-states provided by the underlying firmware. >> >> Extend struct mfd_cell with a named firmware-node field to identify a >> child node under the MFD parent. The node is added to the MFD child >> device during registration when none is assigned by device tree, ACPI, >> or software matching. >> >> Suggested-by: Bartosz Golaszewski >> Signed-off-by: Shivendra Pratap >> --- >> drivers/mfd/mfd-core.c | 142 ++++++++++++++++++++++++++++++++++++++++------- >> include/linux/mfd/core.h | 10 ++++ >> 2 files changed, 131 insertions(+), 21 deletions(-) >> >> diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c >> index 7aa32b90cf1e..ba9682ead2ca 100644 >> --- a/drivers/mfd/mfd-core.c >> +++ b/drivers/mfd/mfd-core.c >> @@ -10,6 +10,7 @@ >> #include >> #include >> #include >> +#include >> #include >> #include >> #include >> @@ -22,6 +23,7 @@ >> #include >> >> static LIST_HEAD(mfd_of_node_list); >> +static LIST_HEAD(mfd_named_fwnode_list); >> static DEFINE_MUTEX(mfd_of_node_mutex); >> >> struct mfd_of_node_entry { >> @@ -30,10 +32,91 @@ struct mfd_of_node_entry { >> struct device_node *np; >> }; >> >> +struct mfd_named_fwnode_entry { >> + struct list_head list; >> + struct device *dev; >> + struct fwnode_handle *fwnode; >> +}; >> + >> static const struct device_type mfd_dev_type = { >> .name = "mfd_device", >> }; >> >> +static int mfd_claim_named_fwnode(struct platform_device *pdev, >> + struct fwnode_handle *fwnode) >> +{ >> + struct mfd_named_fwnode_entry *entry, *iter; >> + >> + entry = kzalloc_obj(*entry, GFP_KERNEL); >> + if (!entry) >> + return -ENOMEM; >> + >> + entry->dev = &pdev->dev; >> + entry->fwnode = fwnode_handle_get(fwnode); >> + >> + scoped_guard(mutex, &mfd_of_node_mutex) { >> + list_for_each_entry(iter, &mfd_named_fwnode_list, list) >> + if (iter->fwnode == fwnode) { >> + fwnode_handle_put(entry->fwnode); >> + kfree(entry); >> + return -EAGAIN; >> + } >> + >> + list_add_tail(&entry->list, &mfd_named_fwnode_list); >> + } >> + >> + return 0; >> +} >> + >> +/* >> + * Temporary MFD-local cleanup for named non-OF child fwnodes. >> + * Remove/rework this when platform core starts owning and dropping >> + * dev->fwnode references for these devices. >> + */ >> +static void mfd_release_named_fwnode(struct platform_device *pdev) >> +{ >> + struct mfd_named_fwnode_entry *entry, *tmp; >> + >> + scoped_guard(mutex, &mfd_of_node_mutex) { >> + list_for_each_entry_safe(entry, tmp, &mfd_named_fwnode_list, list) >> + if (entry->dev == &pdev->dev) { >> + if (dev_fwnode(&pdev->dev) == entry->fwnode) >> + device_set_node(&pdev->dev, NULL); >> + fwnode_handle_put(entry->fwnode); >> + list_del(&entry->list); >> + kfree(entry); >> + } >> + } >> +} >> + >> +static int mfd_claim_of_node_to_dev(struct platform_device *pdev, >> + struct device_node *np) >> +{ >> + struct mfd_of_node_entry *of_entry, *iter; >> + >> + of_entry = kzalloc_obj(*of_entry, GFP_KERNEL); >> + if (!of_entry) >> + return -ENOMEM; >> + >> + of_entry->dev = &pdev->dev; >> + of_entry->np = of_node_get(np); >> + >> + /* Skip if OF node has previously been allocated to a device */ >> + scoped_guard(mutex, &mfd_of_node_mutex) { >> + list_for_each_entry(iter, &mfd_of_node_list, list) >> + if (iter->np == np) { >> + of_node_put(of_entry->np); >> + kfree(of_entry); >> + return -EAGAIN; >> + } >> + >> + list_add_tail(&of_entry->list, &mfd_of_node_list); >> + } >> + >> + device_set_node(&pdev->dev, of_fwnode_handle(np)); >> + return 0; >> +} >> + >> #if IS_ENABLED(CONFIG_ACPI) >> struct match_ids_walk_data { >> struct acpi_device_id *ids; >> @@ -111,19 +194,11 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev, >> struct device_node *np, >> const struct mfd_cell *cell) >> { >> - struct mfd_of_node_entry *of_entry; >> u64 of_node_addr; >> >> - /* Skip if OF node has previously been allocated to a device */ >> - scoped_guard(mutex, &mfd_of_node_mutex) { >> - list_for_each_entry(of_entry, &mfd_of_node_list, list) >> - if (of_entry->np == np) >> - return -EAGAIN; >> - } >> - >> if (!cell->use_of_reg) >> /* No of_reg defined - allocate first free compatible match */ >> - goto allocate_of_node; >> + return mfd_claim_of_node_to_dev(pdev, np); >> >> /* We only care about each node's first defined address */ >> if (of_property_read_reg(np, 0, &of_node_addr, NULL)) >> @@ -134,18 +209,7 @@ static int mfd_match_of_node_to_dev(struct platform_device *pdev, >> /* No match */ >> return -EAGAIN; >> >> -allocate_of_node: >> - of_entry = kzalloc(sizeof(*of_entry), GFP_KERNEL); >> - if (!of_entry) >> - return -ENOMEM; >> - >> - of_entry->dev = &pdev->dev; >> - of_entry->np = of_node_get(np); >> - scoped_guard(mutex, &mfd_of_node_mutex) >> - list_add_tail(&of_entry->list, &mfd_of_node_list); >> - >> - device_set_node(&pdev->dev, of_fwnode_handle(np)); >> - return 0; >> + return mfd_claim_of_node_to_dev(pdev, np); >> } >> >> static int mfd_add_device(struct device *parent, int id, >> @@ -156,6 +220,7 @@ static int mfd_add_device(struct device *parent, int id, >> struct resource *res; >> struct platform_device *pdev; >> struct mfd_of_node_entry *of_entry, *tmp; >> + struct fwnode_handle *fwnode; >> bool disabled = false; >> int ret = -ENOMEM; >> int platform_id; >> @@ -224,6 +289,37 @@ static int mfd_add_device(struct device *parent, int id, >> >> mfd_acpi_add_device(cell, pdev); >> >> + /* named_fwnode is a fallback only when no OF/ACPI match and no swnode */ >> + if (!pdev->dev.fwnode && !cell->swnode && cell->named_fwnode) { > > Use dev_fwnode() instead of pdev->dev.fwnode. sure will update. thanks. > >> + struct device_node *named_np; >> + >> + fwnode = device_get_named_child_node(parent, cell->named_fwnode); >> + if (!fwnode) { >> + ret = -ENODEV; >> + goto fail_alias; >> + } >> + >> + named_np = to_of_node(fwnode); >> + if (named_np) { >> + ret = mfd_claim_of_node_to_dev(pdev, named_np); >> + fwnode_handle_put(fwnode); >> + if (ret == -EAGAIN) >> + ret = -EBUSY; >> + if (ret) >> + goto fail_alias; >> + } else { >> + ret = mfd_claim_named_fwnode(pdev, fwnode); >> + if (ret) { >> + fwnode_handle_put(fwnode); >> + if (ret == -EAGAIN) >> + ret = -EBUSY; >> + goto fail_alias; >> + } >> + device_set_node(&pdev->dev, fwnode); >> + fwnode_handle_put(fwnode); >> + } > > What is the reason to have this split into OF and fwnode functions? I don't > really see why you would need to do it twice, isn't fwnode sufficient for the > OF node case too? We do a duplicate check here before adding the named_fwnode and split it for two reasons: 1. of_node list pre-exists. We add a new list of fwnode. of_node based duplicate check go wrong, if its checked with the fwnode list. 2. of_node need to go to its respective list as fwnode list, release path, is different for us. > >> + } >> + >> if (cell->pdata_size) { >> ret = platform_device_add_data(pdev, >> cell->platform_data, cell->pdata_size); >> @@ -295,6 +391,7 @@ static int mfd_add_device(struct device *parent, int id, >> if (cell->swnode) >> device_remove_software_node(&pdev->dev); >> fail_of_entry: >> + mfd_release_named_fwnode(pdev); >> scoped_guard(mutex, &mfd_of_node_mutex) { >> list_for_each_entry_safe(of_entry, tmp, &mfd_of_node_list, list) >> if (of_entry->dev == &pdev->dev) { >> @@ -382,7 +479,10 @@ static int mfd_remove_devices_fn(struct device *dev, void *data) >> regulator_bulk_unregister_supply_alias(dev, cell->parent_supplies, >> cell->num_parent_supplies); >> >> + get_device(&pdev->dev); >> platform_device_unregister(pdev); >> + mfd_release_named_fwnode(pdev); >> + put_device(&pdev->dev); >> return 0; >> } >> >> diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h >> index faeea7abd688..8daa83dd31ea 100644 >> --- a/include/linux/mfd/core.h >> +++ b/include/linux/mfd/core.h >> @@ -80,6 +80,16 @@ struct mfd_cell { >> >> /* Software node for the device. */ >> const struct software_node *swnode; >> + /* >> + * Name of a child firmware node under the MFD parent device. >> + * >> + * Used only as a fallback when no firmware node is assigned to MFD >> + * child and no software node is provided. >> + * >> + * For Device Tree parents, lookup is by base node name only >> + * (the part before '@'). Unit-addresses are not matched. >> + */ > > Side note: struct mfd_cell could really use a proper kernel doc but that's out > of scope of this series. > >> + const char *named_fwnode; >> >> /* >> * Device Tree compatible string >> >> -- >> 2.34.1 >> >> > > Bartosz thanks, Shivendra