From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (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 7E52637703B for ; Fri, 26 Jun 2026 16:33:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=170.10.129.124 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782491597; cv=none; b=oouDHwHFKhNW1pP23NEpJ1tbAH2Cry+LfgDdxZF51omCaQW12coNUKmMA31tFlVGFn12uZ+yH7G4JpocG2yz1E41b/P1EOICYiaZR/BUN6NLHijsjQ67fAsWjTzvWZji8+xnoiJlaCPlPjd+vzkPbsELbp4OXOGTniWxgnKl/LQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782491597; c=relaxed/simple; bh=4C/sb0FsOyRTobfskpY6am3zXhp6RBvbExjHUf950gU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tVkq5+ulVFt++FEODVi32E8jrKm7zOG1LdYwzaFbQc52DNh6/9/HtquyCVu9FmWwrHcvuYTFPbHf1k+3YKETbwR6U5j3/I0Txb8xcK1kY8XpJZ8Xyd4GtpXO6fBPOXV+XAlhQWnk+FISVY6W5fq0wFBVlfEp/j1hgKppiWzVcAY= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b=TJMaqtT4; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b=Foy1WA2f; arc=none smtp.client-ip=170.10.129.124 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="TJMaqtT4"; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.b="Foy1WA2f" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1782491594; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=EKtP6QhUoWmCLEY2y4AAmxBC79rLmGi+P5ljjJKkkTk=; b=TJMaqtT4G5r43eFhfmKEimS882GuQLXssBCuEu0kQApOEjGJ2e0WZ2KXs+xmIPnURgqEdi x0IndM4jND1QHa49moAbSFCbX3iufwG8W7KrDdJBlaYo2uA4owcZf45/wDtrKCXo1g+iH/ VDmqee05DCOc232/nS+Kwci4K4WbJTw= Received: from mail-qv1-f69.google.com (mail-qv1-f69.google.com [209.85.219.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-377-qPbeVA3WOAmTiCtOZwIskQ-1; Fri, 26 Jun 2026 12:33:13 -0400 X-MC-Unique: qPbeVA3WOAmTiCtOZwIskQ-1 X-Mimecast-MFC-AGG-ID: qPbeVA3WOAmTiCtOZwIskQ_1782491593 Received: by mail-qv1-f69.google.com with SMTP id 6a1803df08f44-8dba00e17b5so13278496d6.3 for ; Fri, 26 Jun 2026 09:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1782491593; x=1783096393; 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=EKtP6QhUoWmCLEY2y4AAmxBC79rLmGi+P5ljjJKkkTk=; b=Foy1WA2f9Cjx1xDCmIK2E3IKzlLIq3OVwOXsev/9RgrKYFI1fP7SdrsILvmWbiTvvM 4zYVxO72BRfdPIPKpfMkeBpYeyELmpa5U6qtcTuDw2DWzDpQhB64d9L3yZSOKwamdHrP 2riFjngw6Cu9FrLw7P42T2m95NKbq5o/b+sfxetHohP/7HfgbY1X9NgsMkIvXQknJHdn 0FjqS2yaqpvme75h4pqXHf7n8rV2ABxRlckVrYrudqlr1Sy5vgYKZLmy8kK+CeTvlwoW RRWQRENKEyKsQasNbmyZxIOs/EzqDlURbsJfrGFdPBDWvZ/wK4rkhuQ4qFdSD/BiCgR7 CBbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782491593; x=1783096393; 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=EKtP6QhUoWmCLEY2y4AAmxBC79rLmGi+P5ljjJKkkTk=; b=N+24LY+MJ/g+8yGPXpJ0dqec++Ky58UO4mk7B7yRdo1xeMS/V4WD6sUehYkWS1A8cB vG6toktWkIdRxYryh5V58jL8Rrd8RvOIrIOwkgRbcdGc7Uu51abD6FQfbp4VioCns4Uz 26x8T8P94qC5AhDNaB2TP+AgnE6K6CGZHBtyVq4wiSWCWAP/jaU+l+y37CBoOxDAxh1s UQKmAoqR78aD7pxHDXe3FTaksFL6W/mmcdCwD3NVZpIaaqZg37gEJu+kLaQFrZxElcaX zaC/7SomEk6DjlmrIwi+roKsidU78D+SZJvHXXUlq7pIm189dKagTo032x10xoWQC77o GhLw== X-Forwarded-Encrypted: i=1; AHgh+RqOU+aTFaJF2vUXkYWEmQKPkLww6GqpyngWuaKUsSGROVOdAIeXRbKvP4zo30BQBgMcb8RVklfAPiPTLpc=@vger.kernel.org X-Gm-Message-State: AOJu0YzOe2nbsLiGsio3ewrPWUO6ng0IoRTNE+KLg5mNcltYP8tUUeIi ul1l8QPWCGAhr8Bmw05CLsXd024a/bfMX74mofRHelrPd6j/zpizzz8Okcx33ZudII7/JFcC8YE 5HdHI+yg9qAMjFL6IYPVyNFt8vK+aErRwojULRU0m6m01E6HhbCp6+5d6uZ2fFy+2eg== X-Gm-Gg: AfdE7cm61Ptd4p72AAquCbHgUaRVDk6LHzyZp7CrDY2m+dCqJIJN+r/iNwhiwGRG1Vl VIrh4qUlnrjswZkuaxSAugEMeKA81+TLYibRBynTqjx5os9uVtL4U2Agh3mSvwYI/ghrWDE12U1 2t3h9Qnyew+cBoewahHHmqpcWfEHUn26l9JhTA0+JGZNJBN6y5OejgY+g0qmNw4DTY2eB+2mfcG rsF9QX9Gvdk61euijIOY5AikOcrlhWrdQaBWD+mhaohVTn9UsutN8yLaY2xOi/CDJE7nsovqx+T BABRF8Fq+ca+IDGLUBaWVF3bAodEgmqNYl5uMzK5dzPgUJqcWf6DQaqsPBW14VUlxUJG4UzDAnB Ql9ifzqueZWYIvyVEw/REagJckMlBuCZoL1MStQ4Ry3bsy6kvEw== X-Received: by 2002:ad4:596d:0:b0:8ce:a033:eef9 with SMTP id 6a1803df08f44-8e6d7f0b3f4mr122000796d6.26.1782491592463; Fri, 26 Jun 2026 09:33:12 -0700 (PDT) X-Received: by 2002:ad4:596d:0:b0:8ce:a033:eef9 with SMTP id 6a1803df08f44-8e6d7f0b3f4mr121999726d6.26.1782491591564; Fri, 26 Jun 2026 09:33:11 -0700 (PDT) Received: from [192.168.1.3] (c-73-183-53-213.hsd1.pa.comcast.net. [73.183.53.213]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-8df7f018566sm234540526d6.2.2026.06.26.09.33.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 26 Jun 2026 09:33:10 -0700 (PDT) From: Brian Masney Date: Fri, 26 Jun 2026 12:32:42 -0400 Subject: [PATCH 1/4] driver: core: introduce dev_add_sync_state() 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: <20260626-clk-sync-state-v1-1-4156d8196dc8@redhat.com> References: <20260626-clk-sync-state-v1-0-4156d8196dc8@redhat.com> In-Reply-To: <20260626-clk-sync-state-v1-0-4156d8196dc8@redhat.com> To: Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , Ulf Hansson , Bjorn Andersson , Michael Turquette , Stephen Boyd , Russell King , Neil Armstrong , Xuyang Dong , Jens Glathe , Hans de Goede , Maxime Ripard , Saravana Kannan , Abel Vesa Cc: driver-core@lists.linux.dev, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-clk@vger.kernel.org, Brian Masney X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5167; i=bmasney@redhat.com; s=20250903; h=from:subject:message-id; bh=4C/sb0FsOyRTobfskpY6am3zXhp6RBvbExjHUf950gU=; b=owGbwMvMwCW2/dJd9di6A+2Mp9WSGLLsVh7UZno7S3biD5fKPXEuv/YJVRyo2sQZ1veigv26y 9aUTyyPOkpZGMS4GGTFFFmW5BoVRKSusr13R5MFZg4rE8gQBi5OAZhIdy7DP6PzF968+Otc56fo 0vo33mdyC2NZ9hodLV69poWz5vZZ6jP8066+uMKW2T3K0mbbus98X5RFvL+I/GvRyPoZXZUYcn8 zOwA= X-Developer-Key: i=bmasney@redhat.com; a=openpgp; fpr=A46D32705865AA3DDEDC2904B7D2DD275D7EC087 We have cases where a device node represents a provider for multiple types of resources, like clocks, power-domains, resets, etc. We currently have dev_set_drv_sync_state() where a framework or driver can set the sync_state callback for a device node, however it currently only supports a single sync_state callback. The pmdomain subsystem currently sets up a sync_state callback in the core framework, and the clk subsystem will setup it's own separate sync_state callback in the core framework. These can collide with each other on some types of devices that have multiple types of resources. Additionally, some clk drivers already have their own separate sync_state callback already defined. Let's introduce support for allowing drivers and frameworks to add their own sync_state callback via a new function dev_add_sync_state() so that multiple sync_state callbacks can coexist. Link: https://lore.kernel.org/linux-clk/CAPx+jO9JiV16ePLk59hTQzEMnA96Va6Ns4jqJbwyZ6oTT0AjXA@mail.gmail.com/ Signed-off-by: Brian Masney Assisted-by: Claude:claude-opus-4-6 --- drivers/base/base.h | 7 +++++++ drivers/base/core.c | 29 +++++++++++++++++++++++++++++ include/linux/device.h | 11 +++++++++++ 3 files changed, 47 insertions(+) diff --git a/drivers/base/base.h b/drivers/base/base.h index a5b7abc10ff0..339db4afbeb4 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -178,6 +178,8 @@ static inline bool dev_has_sync_state(struct device *dev) if (!dev) return false; + if (!list_empty(&dev->sync_state_list)) + return true; drv = READ_ONCE(dev->driver); if (drv && drv->sync_state) return true; @@ -188,10 +190,15 @@ static inline bool dev_has_sync_state(struct device *dev) static inline void dev_sync_state(struct device *dev) { + struct sync_state_entry *entry; + if (dev->bus->sync_state) dev->bus->sync_state(dev); else if (dev->driver && dev->driver->sync_state) dev->driver->sync_state(dev); + + list_for_each_entry(entry, &dev->sync_state_list, node) + entry->fn(dev); } int driver_add_groups(const struct device_driver *drv, diff --git a/drivers/base/core.c b/drivers/base/core.c index 4d026682944f..acc12f402dd3 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c @@ -2612,6 +2612,7 @@ EXPORT_SYMBOL_GPL(device_show_string); static void device_release(struct kobject *kobj) { struct device *dev = kobj_to_dev(kobj); + struct sync_state_entry *entry, *tmp; struct device_private *p = dev->p; /* @@ -2625,6 +2626,11 @@ static void device_release(struct kobject *kobj) */ devres_release_all(dev); + list_for_each_entry_safe(entry, tmp, &dev->sync_state_list, node) { + list_del(&entry->node); + kfree(entry); + } + kfree(dev->dma_range_map); kfree(dev->driver_override.name); @@ -3239,12 +3245,35 @@ void device_initialize(struct device *dev) INIT_LIST_HEAD(&dev->links.consumers); INIT_LIST_HEAD(&dev->links.suppliers); INIT_LIST_HEAD(&dev->links.defer_sync); + INIT_LIST_HEAD(&dev->sync_state_list); dev->links.status = DL_DEV_NO_DRIVER; dev_assign_dma_coherent(dev, dma_default_coherent); swiotlb_dev_init(dev); } EXPORT_SYMBOL_GPL(device_initialize); +int dev_add_sync_state(struct device *dev, + void (*fn)(struct device *dev)) +{ + struct sync_state_entry *entry; + + if (!dev || !dev->driver) + return 0; + + list_for_each_entry(entry, &dev->sync_state_list, node) + if (entry->fn == fn) + return 0; + + entry = kmalloc_obj(*entry); + if (!entry) + return -ENOMEM; + + entry->fn = fn; + list_add_tail(&entry->node, &dev->sync_state_list); + return 0; +} +EXPORT_SYMBOL_GPL(dev_add_sync_state); + struct kobject *virtual_device_parent(void) { static struct kobject *virtual_dir = NULL; diff --git a/include/linux/device.h b/include/linux/device.h index 7b2baffdd2f5..b7a3dd4b56ed 100644 --- a/include/linux/device.h +++ b/include/linux/device.h @@ -642,6 +642,8 @@ enum struct_device_flags { * @driver_override: Driver name to force a match. Do not touch directly; use * device_set_driver_override() instead. * @links: Links to suppliers and consumers of this device. + * @sync_state_list: List of sync_state callbacks added by subsystem + * frameworks (e.g. clk, genpd) via dev_add_sync_state(). * @power: For device power management. * See Documentation/driver-api/pm/devices.rst for details. * @pm_domain: Provide callbacks that are executed during system suspend, @@ -723,6 +725,7 @@ struct device { */ struct dev_links_info links; + struct list_head sync_state_list; struct dev_pm_info power; struct dev_pm_domain *pm_domain; @@ -1137,6 +1140,14 @@ static inline int dev_set_drv_sync_state(struct device *dev, return 0; } +struct sync_state_entry { + struct list_head node; + void (*fn)(struct device *dev); +}; + +int dev_add_sync_state(struct device *dev, + void (*fn)(struct device *dev)); + static inline void dev_set_removable(struct device *dev, enum device_removable removable) { -- 2.54.0