xref: /openbmc/linux/drivers/base/core.c (revision f6837f34)
1989d42e8SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * drivers/base/core.c - core driver model code (device registration, etc)
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (c) 2002-3 Patrick Mochel
61da177e4SLinus Torvalds  * Copyright (c) 2002-3 Open Source Development Labs
764bb5d2cSGreg Kroah-Hartman  * Copyright (c) 2006 Greg Kroah-Hartman <gregkh@suse.de>
864bb5d2cSGreg Kroah-Hartman  * Copyright (c) 2006 Novell, Inc.
91da177e4SLinus Torvalds  */
101da177e4SLinus Torvalds 
117847a145SHeikki Krogerus #include <linux/acpi.h>
1265650b35SRafael J. Wysocki #include <linux/cpufreq.h>
131da177e4SLinus Torvalds #include <linux/device.h>
141da177e4SLinus Torvalds #include <linux/err.h>
1597badf87SRafael J. Wysocki #include <linux/fwnode.h>
161da177e4SLinus Torvalds #include <linux/init.h>
1773060022SChristophe JAILLET #include <linux/kstrtox.h>
181da177e4SLinus Torvalds #include <linux/module.h>
191da177e4SLinus Torvalds #include <linux/slab.h>
201da177e4SLinus Torvalds #include <linux/string.h>
2123681e47SGreg Kroah-Hartman #include <linux/kdev_t.h>
22116af378SBenjamin Herrenschmidt #include <linux/notifier.h>
2307d57a32SGrant Likely #include <linux/of.h>
2407d57a32SGrant Likely #include <linux/of_device.h>
25322cbb50SChristoph Hellwig #include <linux/blkdev.h>
26f75b1c60SDave Young #include <linux/mutex.h>
27af8db150SPeter Chen #include <linux/pm_runtime.h>
28c4e00daaSKay Sievers #include <linux/netdevice.h>
29174cd4b1SIngo Molnar #include <linux/sched/signal.h>
30b8530017SOliver Neukum #include <linux/sched/mm.h>
3169031f50SClaire Chang #include <linux/swiotlb.h>
3263967685SGreg Kroah-Hartman #include <linux/sysfs.h>
336d4e9a8eSChristoph Hellwig #include <linux/dma-map-ops.h> /* for dma_default_coherent */
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds #include "base.h"
366423d295SWon Chung #include "physical_location.h"
371da177e4SLinus Torvalds #include "power/power.h"
381da177e4SLinus Torvalds 
39e52eec13SAndi Kleen #ifdef CONFIG_SYSFS_DEPRECATED
40e52eec13SAndi Kleen #ifdef CONFIG_SYSFS_DEPRECATED_V2
41e52eec13SAndi Kleen long sysfs_deprecated = 1;
42e52eec13SAndi Kleen #else
43e52eec13SAndi Kleen long sysfs_deprecated = 0;
44e52eec13SAndi Kleen #endif
453454bf96SHanjun Guo static int __init sysfs_deprecated_setup(char *arg)
46e52eec13SAndi Kleen {
4734da5e67SJingoo Han 	return kstrtol(arg, 10, &sysfs_deprecated);
48e52eec13SAndi Kleen }
49e52eec13SAndi Kleen early_param("sysfs.deprecated", sysfs_deprecated_setup);
50e52eec13SAndi Kleen #endif
51e52eec13SAndi Kleen 
529ed98953SRafael J. Wysocki /* Device links support. */
53fc5a251dSSaravana Kannan static LIST_HEAD(deferred_sync);
54fc5a251dSSaravana Kannan static unsigned int defer_sync_state_count = 1;
557b337cb3SSaravana Kannan static DEFINE_MUTEX(fwnode_link_lock);
5625ac86c6SSaravana Kannan static bool fw_devlink_is_permissive(void);
57d46f3e3eSSaravana Kannan static bool fw_devlink_drv_reg_done;
582f8c3ae8SSaravana Kannan static bool fw_devlink_best_effort;
597b337cb3SSaravana Kannan 
607b337cb3SSaravana Kannan /**
617b337cb3SSaravana Kannan  * fwnode_link_add - Create a link between two fwnode_handles.
627b337cb3SSaravana Kannan  * @con: Consumer end of the link.
637b337cb3SSaravana Kannan  * @sup: Supplier end of the link.
647b337cb3SSaravana Kannan  *
657b337cb3SSaravana Kannan  * Create a fwnode link between fwnode handles @con and @sup. The fwnode link
667b337cb3SSaravana Kannan  * represents the detail that the firmware lists @sup fwnode as supplying a
677b337cb3SSaravana Kannan  * resource to @con.
687b337cb3SSaravana Kannan  *
697b337cb3SSaravana Kannan  * The driver core will use the fwnode link to create a device link between the
707b337cb3SSaravana Kannan  * two device objects corresponding to @con and @sup when they are created. The
717b337cb3SSaravana Kannan  * driver core will automatically delete the fwnode link between @con and @sup
727b337cb3SSaravana Kannan  * after doing that.
737b337cb3SSaravana Kannan  *
747b337cb3SSaravana Kannan  * Attempts to create duplicate links between the same pair of fwnode handles
757b337cb3SSaravana Kannan  * are ignored and there is no reference counting.
767b337cb3SSaravana Kannan  */
777b337cb3SSaravana Kannan int fwnode_link_add(struct fwnode_handle *con, struct fwnode_handle *sup)
787b337cb3SSaravana Kannan {
797b337cb3SSaravana Kannan 	struct fwnode_link *link;
807b337cb3SSaravana Kannan 	int ret = 0;
817b337cb3SSaravana Kannan 
827b337cb3SSaravana Kannan 	mutex_lock(&fwnode_link_lock);
837b337cb3SSaravana Kannan 
847b337cb3SSaravana Kannan 	list_for_each_entry(link, &sup->consumers, s_hook)
857b337cb3SSaravana Kannan 		if (link->consumer == con)
867b337cb3SSaravana Kannan 			goto out;
877b337cb3SSaravana Kannan 
887b337cb3SSaravana Kannan 	link = kzalloc(sizeof(*link), GFP_KERNEL);
897b337cb3SSaravana Kannan 	if (!link) {
907b337cb3SSaravana Kannan 		ret = -ENOMEM;
917b337cb3SSaravana Kannan 		goto out;
927b337cb3SSaravana Kannan 	}
937b337cb3SSaravana Kannan 
947b337cb3SSaravana Kannan 	link->supplier = sup;
957b337cb3SSaravana Kannan 	INIT_LIST_HEAD(&link->s_hook);
967b337cb3SSaravana Kannan 	link->consumer = con;
977b337cb3SSaravana Kannan 	INIT_LIST_HEAD(&link->c_hook);
987b337cb3SSaravana Kannan 
997b337cb3SSaravana Kannan 	list_add(&link->s_hook, &sup->consumers);
1007b337cb3SSaravana Kannan 	list_add(&link->c_hook, &con->suppliers);
101ebd6823aSSaravana Kannan 	pr_debug("%pfwP Linked as a fwnode consumer to %pfwP\n",
102ebd6823aSSaravana Kannan 		 con, sup);
1037b337cb3SSaravana Kannan out:
1047b337cb3SSaravana Kannan 	mutex_unlock(&fwnode_link_lock);
1057b337cb3SSaravana Kannan 
1067b337cb3SSaravana Kannan 	return ret;
1077b337cb3SSaravana Kannan }
1087b337cb3SSaravana Kannan 
1097b337cb3SSaravana Kannan /**
11076f13081SSaravana Kannan  * __fwnode_link_del - Delete a link between two fwnode_handles.
11176f13081SSaravana Kannan  * @link: the fwnode_link to be deleted
11276f13081SSaravana Kannan  *
11376f13081SSaravana Kannan  * The fwnode_link_lock needs to be held when this function is called.
11476f13081SSaravana Kannan  */
11576f13081SSaravana Kannan static void __fwnode_link_del(struct fwnode_link *link)
11676f13081SSaravana Kannan {
117ebd6823aSSaravana Kannan 	pr_debug("%pfwP Dropping the fwnode link to %pfwP\n",
118ebd6823aSSaravana Kannan 		 link->consumer, link->supplier);
11976f13081SSaravana Kannan 	list_del(&link->s_hook);
12076f13081SSaravana Kannan 	list_del(&link->c_hook);
12176f13081SSaravana Kannan 	kfree(link);
12276f13081SSaravana Kannan }
12376f13081SSaravana Kannan 
12476f13081SSaravana Kannan /**
1257b337cb3SSaravana Kannan  * fwnode_links_purge_suppliers - Delete all supplier links of fwnode_handle.
1267b337cb3SSaravana Kannan  * @fwnode: fwnode whose supplier links need to be deleted
1277b337cb3SSaravana Kannan  *
1287b337cb3SSaravana Kannan  * Deletes all supplier links connecting directly to @fwnode.
1297b337cb3SSaravana Kannan  */
1307b337cb3SSaravana Kannan static void fwnode_links_purge_suppliers(struct fwnode_handle *fwnode)
1317b337cb3SSaravana Kannan {
1327b337cb3SSaravana Kannan 	struct fwnode_link *link, *tmp;
1337b337cb3SSaravana Kannan 
1347b337cb3SSaravana Kannan 	mutex_lock(&fwnode_link_lock);
13576f13081SSaravana Kannan 	list_for_each_entry_safe(link, tmp, &fwnode->suppliers, c_hook)
13676f13081SSaravana Kannan 		__fwnode_link_del(link);
1377b337cb3SSaravana Kannan 	mutex_unlock(&fwnode_link_lock);
1387b337cb3SSaravana Kannan }
1397b337cb3SSaravana Kannan 
1407b337cb3SSaravana Kannan /**
1417b337cb3SSaravana Kannan  * fwnode_links_purge_consumers - Delete all consumer links of fwnode_handle.
1427b337cb3SSaravana Kannan  * @fwnode: fwnode whose consumer links need to be deleted
1437b337cb3SSaravana Kannan  *
1447b337cb3SSaravana Kannan  * Deletes all consumer links connecting directly to @fwnode.
1457b337cb3SSaravana Kannan  */
1467b337cb3SSaravana Kannan static void fwnode_links_purge_consumers(struct fwnode_handle *fwnode)
1477b337cb3SSaravana Kannan {
1487b337cb3SSaravana Kannan 	struct fwnode_link *link, *tmp;
1497b337cb3SSaravana Kannan 
1507b337cb3SSaravana Kannan 	mutex_lock(&fwnode_link_lock);
15176f13081SSaravana Kannan 	list_for_each_entry_safe(link, tmp, &fwnode->consumers, s_hook)
15276f13081SSaravana Kannan 		__fwnode_link_del(link);
1537b337cb3SSaravana Kannan 	mutex_unlock(&fwnode_link_lock);
1547b337cb3SSaravana Kannan }
1557b337cb3SSaravana Kannan 
1567b337cb3SSaravana Kannan /**
1577b337cb3SSaravana Kannan  * fwnode_links_purge - Delete all links connected to a fwnode_handle.
1587b337cb3SSaravana Kannan  * @fwnode: fwnode whose links needs to be deleted
1597b337cb3SSaravana Kannan  *
1607b337cb3SSaravana Kannan  * Deletes all links connecting directly to a fwnode.
1617b337cb3SSaravana Kannan  */
1627b337cb3SSaravana Kannan void fwnode_links_purge(struct fwnode_handle *fwnode)
1637b337cb3SSaravana Kannan {
1647b337cb3SSaravana Kannan 	fwnode_links_purge_suppliers(fwnode);
1657b337cb3SSaravana Kannan 	fwnode_links_purge_consumers(fwnode);
1667b337cb3SSaravana Kannan }
1679ed98953SRafael J. Wysocki 
16828ec344bSSaravana Kannan void fw_devlink_purge_absent_suppliers(struct fwnode_handle *fwnode)
1699528e0d9SSaravana Kannan {
1709528e0d9SSaravana Kannan 	struct fwnode_handle *child;
1719528e0d9SSaravana Kannan 
1729528e0d9SSaravana Kannan 	/* Don't purge consumer links of an added child */
1739528e0d9SSaravana Kannan 	if (fwnode->dev)
1749528e0d9SSaravana Kannan 		return;
1759528e0d9SSaravana Kannan 
1769528e0d9SSaravana Kannan 	fwnode->flags |= FWNODE_FLAG_NOT_DEVICE;
1779528e0d9SSaravana Kannan 	fwnode_links_purge_consumers(fwnode);
1789528e0d9SSaravana Kannan 
1799528e0d9SSaravana Kannan 	fwnode_for_each_available_child_node(fwnode, child)
1809528e0d9SSaravana Kannan 		fw_devlink_purge_absent_suppliers(child);
1819528e0d9SSaravana Kannan }
18228ec344bSSaravana Kannan EXPORT_SYMBOL_GPL(fw_devlink_purge_absent_suppliers);
1839528e0d9SSaravana Kannan 
1849ed98953SRafael J. Wysocki #ifdef CONFIG_SRCU
1859ed98953SRafael J. Wysocki static DEFINE_MUTEX(device_links_lock);
1869ed98953SRafael J. Wysocki DEFINE_STATIC_SRCU(device_links_srcu);
1879ed98953SRafael J. Wysocki 
1889ed98953SRafael J. Wysocki static inline void device_links_write_lock(void)
1899ed98953SRafael J. Wysocki {
1909ed98953SRafael J. Wysocki 	mutex_lock(&device_links_lock);
1919ed98953SRafael J. Wysocki }
1929ed98953SRafael J. Wysocki 
1939ed98953SRafael J. Wysocki static inline void device_links_write_unlock(void)
1949ed98953SRafael J. Wysocki {
1959ed98953SRafael J. Wysocki 	mutex_unlock(&device_links_lock);
1969ed98953SRafael J. Wysocki }
1979ed98953SRafael J. Wysocki 
19868464d79SJules Irenge int device_links_read_lock(void) __acquires(&device_links_srcu)
1999ed98953SRafael J. Wysocki {
2009ed98953SRafael J. Wysocki 	return srcu_read_lock(&device_links_srcu);
2019ed98953SRafael J. Wysocki }
2029ed98953SRafael J. Wysocki 
203ab7789c5SJules Irenge void device_links_read_unlock(int idx) __releases(&device_links_srcu)
2049ed98953SRafael J. Wysocki {
2059ed98953SRafael J. Wysocki 	srcu_read_unlock(&device_links_srcu, idx);
2069ed98953SRafael J. Wysocki }
207c2fa1e1bSJoel Fernandes (Google) 
208c2fa1e1bSJoel Fernandes (Google) int device_links_read_lock_held(void)
209c2fa1e1bSJoel Fernandes (Google) {
210c2fa1e1bSJoel Fernandes (Google) 	return srcu_read_lock_held(&device_links_srcu);
211c2fa1e1bSJoel Fernandes (Google) }
21280dd33cfSRafael J. Wysocki 
21380dd33cfSRafael J. Wysocki static void device_link_synchronize_removal(void)
21480dd33cfSRafael J. Wysocki {
21580dd33cfSRafael J. Wysocki 	synchronize_srcu(&device_links_srcu);
21680dd33cfSRafael J. Wysocki }
2170c871315SRafael J. Wysocki 
2180c871315SRafael J. Wysocki static void device_link_remove_from_lists(struct device_link *link)
2190c871315SRafael J. Wysocki {
2200c871315SRafael J. Wysocki 	list_del_rcu(&link->s_node);
2210c871315SRafael J. Wysocki 	list_del_rcu(&link->c_node);
2220c871315SRafael J. Wysocki }
2239ed98953SRafael J. Wysocki #else /* !CONFIG_SRCU */
2249ed98953SRafael J. Wysocki static DECLARE_RWSEM(device_links_lock);
2259ed98953SRafael J. Wysocki 
2269ed98953SRafael J. Wysocki static inline void device_links_write_lock(void)
2279ed98953SRafael J. Wysocki {
2289ed98953SRafael J. Wysocki 	down_write(&device_links_lock);
2299ed98953SRafael J. Wysocki }
2309ed98953SRafael J. Wysocki 
2319ed98953SRafael J. Wysocki static inline void device_links_write_unlock(void)
2329ed98953SRafael J. Wysocki {
2339ed98953SRafael J. Wysocki 	up_write(&device_links_lock);
2349ed98953SRafael J. Wysocki }
2359ed98953SRafael J. Wysocki 
2369ed98953SRafael J. Wysocki int device_links_read_lock(void)
2379ed98953SRafael J. Wysocki {
2389ed98953SRafael J. Wysocki 	down_read(&device_links_lock);
2399ed98953SRafael J. Wysocki 	return 0;
2409ed98953SRafael J. Wysocki }
2419ed98953SRafael J. Wysocki 
2429ed98953SRafael J. Wysocki void device_links_read_unlock(int not_used)
2439ed98953SRafael J. Wysocki {
2449ed98953SRafael J. Wysocki 	up_read(&device_links_lock);
2459ed98953SRafael J. Wysocki }
246c2fa1e1bSJoel Fernandes (Google) 
247c2fa1e1bSJoel Fernandes (Google) #ifdef CONFIG_DEBUG_LOCK_ALLOC
248c2fa1e1bSJoel Fernandes (Google) int device_links_read_lock_held(void)
249c2fa1e1bSJoel Fernandes (Google) {
250c2fa1e1bSJoel Fernandes (Google) 	return lockdep_is_held(&device_links_lock);
251c2fa1e1bSJoel Fernandes (Google) }
252c2fa1e1bSJoel Fernandes (Google) #endif
25380dd33cfSRafael J. Wysocki 
25480dd33cfSRafael J. Wysocki static inline void device_link_synchronize_removal(void)
25580dd33cfSRafael J. Wysocki {
25680dd33cfSRafael J. Wysocki }
2570c871315SRafael J. Wysocki 
2580c871315SRafael J. Wysocki static void device_link_remove_from_lists(struct device_link *link)
2590c871315SRafael J. Wysocki {
2600c871315SRafael J. Wysocki 	list_del(&link->s_node);
2610c871315SRafael J. Wysocki 	list_del(&link->c_node);
2620c871315SRafael J. Wysocki }
2639ed98953SRafael J. Wysocki #endif /* !CONFIG_SRCU */
2649ed98953SRafael J. Wysocki 
2653d1cf435SRafael J. Wysocki static bool device_is_ancestor(struct device *dev, struct device *target)
2663d1cf435SRafael J. Wysocki {
2673d1cf435SRafael J. Wysocki 	while (target->parent) {
2683d1cf435SRafael J. Wysocki 		target = target->parent;
2693d1cf435SRafael J. Wysocki 		if (dev == target)
2703d1cf435SRafael J. Wysocki 			return true;
2713d1cf435SRafael J. Wysocki 	}
2723d1cf435SRafael J. Wysocki 	return false;
2733d1cf435SRafael J. Wysocki }
2743d1cf435SRafael J. Wysocki 
2759ed98953SRafael J. Wysocki /**
2769ed98953SRafael J. Wysocki  * device_is_dependent - Check if one device depends on another one
2779ed98953SRafael J. Wysocki  * @dev: Device to check dependencies for.
2789ed98953SRafael J. Wysocki  * @target: Device to check against.
2799ed98953SRafael J. Wysocki  *
2809ed98953SRafael J. Wysocki  * Check if @target depends on @dev or any device dependent on it (its child or
2819ed98953SRafael J. Wysocki  * its consumer etc).  Return 1 if that is the case or 0 otherwise.
2829ed98953SRafael J. Wysocki  */
2837d34ca38SSaravana Kannan int device_is_dependent(struct device *dev, void *target)
2849ed98953SRafael J. Wysocki {
2859ed98953SRafael J. Wysocki 	struct device_link *link;
2869ed98953SRafael J. Wysocki 	int ret;
2879ed98953SRafael J. Wysocki 
2883d1cf435SRafael J. Wysocki 	/*
2893d1cf435SRafael J. Wysocki 	 * The "ancestors" check is needed to catch the case when the target
2903d1cf435SRafael J. Wysocki 	 * device has not been completely initialized yet and it is still
2913d1cf435SRafael J. Wysocki 	 * missing from the list of children of its parent device.
2923d1cf435SRafael J. Wysocki 	 */
2933d1cf435SRafael J. Wysocki 	if (dev == target || device_is_ancestor(dev, target))
2949ed98953SRafael J. Wysocki 		return 1;
2959ed98953SRafael J. Wysocki 
2969ed98953SRafael J. Wysocki 	ret = device_for_each_child(dev, target, device_is_dependent);
2979ed98953SRafael J. Wysocki 	if (ret)
2989ed98953SRafael J. Wysocki 		return ret;
2999ed98953SRafael J. Wysocki 
3009ed98953SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.consumers, s_node) {
3014b9bbb29SSaravana Kannan 		if ((link->flags & ~DL_FLAG_INFERRED) ==
3024b9bbb29SSaravana Kannan 		    (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
30305ef983eSSaravana Kannan 			continue;
30405ef983eSSaravana Kannan 
305e16f4f3eSBenjamin Gaignard 		if (link->consumer == target)
3069ed98953SRafael J. Wysocki 			return 1;
3079ed98953SRafael J. Wysocki 
3089ed98953SRafael J. Wysocki 		ret = device_is_dependent(link->consumer, target);
3099ed98953SRafael J. Wysocki 		if (ret)
3109ed98953SRafael J. Wysocki 			break;
3119ed98953SRafael J. Wysocki 	}
3129ed98953SRafael J. Wysocki 	return ret;
3139ed98953SRafael J. Wysocki }
3149ed98953SRafael J. Wysocki 
315515db266SRafael J. Wysocki static void device_link_init_status(struct device_link *link,
316515db266SRafael J. Wysocki 				    struct device *consumer,
317515db266SRafael J. Wysocki 				    struct device *supplier)
318515db266SRafael J. Wysocki {
319515db266SRafael J. Wysocki 	switch (supplier->links.status) {
320515db266SRafael J. Wysocki 	case DL_DEV_PROBING:
321515db266SRafael J. Wysocki 		switch (consumer->links.status) {
322515db266SRafael J. Wysocki 		case DL_DEV_PROBING:
323515db266SRafael J. Wysocki 			/*
324515db266SRafael J. Wysocki 			 * A consumer driver can create a link to a supplier
325515db266SRafael J. Wysocki 			 * that has not completed its probing yet as long as it
326515db266SRafael J. Wysocki 			 * knows that the supplier is already functional (for
327515db266SRafael J. Wysocki 			 * example, it has just acquired some resources from the
328515db266SRafael J. Wysocki 			 * supplier).
329515db266SRafael J. Wysocki 			 */
330515db266SRafael J. Wysocki 			link->status = DL_STATE_CONSUMER_PROBE;
331515db266SRafael J. Wysocki 			break;
332515db266SRafael J. Wysocki 		default:
333515db266SRafael J. Wysocki 			link->status = DL_STATE_DORMANT;
334515db266SRafael J. Wysocki 			break;
335515db266SRafael J. Wysocki 		}
336515db266SRafael J. Wysocki 		break;
337515db266SRafael J. Wysocki 	case DL_DEV_DRIVER_BOUND:
338515db266SRafael J. Wysocki 		switch (consumer->links.status) {
339515db266SRafael J. Wysocki 		case DL_DEV_PROBING:
340515db266SRafael J. Wysocki 			link->status = DL_STATE_CONSUMER_PROBE;
341515db266SRafael J. Wysocki 			break;
342515db266SRafael J. Wysocki 		case DL_DEV_DRIVER_BOUND:
343515db266SRafael J. Wysocki 			link->status = DL_STATE_ACTIVE;
344515db266SRafael J. Wysocki 			break;
345515db266SRafael J. Wysocki 		default:
346515db266SRafael J. Wysocki 			link->status = DL_STATE_AVAILABLE;
347515db266SRafael J. Wysocki 			break;
348515db266SRafael J. Wysocki 		}
349515db266SRafael J. Wysocki 		break;
350515db266SRafael J. Wysocki 	case DL_DEV_UNBINDING:
351515db266SRafael J. Wysocki 		link->status = DL_STATE_SUPPLIER_UNBIND;
352515db266SRafael J. Wysocki 		break;
353515db266SRafael J. Wysocki 	default:
354515db266SRafael J. Wysocki 		link->status = DL_STATE_DORMANT;
355515db266SRafael J. Wysocki 		break;
356515db266SRafael J. Wysocki 	}
357515db266SRafael J. Wysocki }
358515db266SRafael J. Wysocki 
3599ed98953SRafael J. Wysocki static int device_reorder_to_tail(struct device *dev, void *not_used)
3609ed98953SRafael J. Wysocki {
3619ed98953SRafael J. Wysocki 	struct device_link *link;
3629ed98953SRafael J. Wysocki 
3639ed98953SRafael J. Wysocki 	/*
3649ed98953SRafael J. Wysocki 	 * Devices that have not been registered yet will be put to the ends
3659ed98953SRafael J. Wysocki 	 * of the lists during the registration, so skip them here.
3669ed98953SRafael J. Wysocki 	 */
3679ed98953SRafael J. Wysocki 	if (device_is_registered(dev))
3689ed98953SRafael J. Wysocki 		devices_kset_move_last(dev);
3699ed98953SRafael J. Wysocki 
3709ed98953SRafael J. Wysocki 	if (device_pm_initialized(dev))
3719ed98953SRafael J. Wysocki 		device_pm_move_last(dev);
3729ed98953SRafael J. Wysocki 
3739ed98953SRafael J. Wysocki 	device_for_each_child(dev, NULL, device_reorder_to_tail);
37405ef983eSSaravana Kannan 	list_for_each_entry(link, &dev->links.consumers, s_node) {
3754b9bbb29SSaravana Kannan 		if ((link->flags & ~DL_FLAG_INFERRED) ==
3764b9bbb29SSaravana Kannan 		    (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
37705ef983eSSaravana Kannan 			continue;
3789ed98953SRafael J. Wysocki 		device_reorder_to_tail(link->consumer, NULL);
37905ef983eSSaravana Kannan 	}
3809ed98953SRafael J. Wysocki 
3819ed98953SRafael J. Wysocki 	return 0;
3829ed98953SRafael J. Wysocki }
3839ed98953SRafael J. Wysocki 
3849ed98953SRafael J. Wysocki /**
385494fd7b7SFeng Kan  * device_pm_move_to_tail - Move set of devices to the end of device lists
386494fd7b7SFeng Kan  * @dev: Device to move
387494fd7b7SFeng Kan  *
388494fd7b7SFeng Kan  * This is a device_reorder_to_tail() wrapper taking the requisite locks.
389494fd7b7SFeng Kan  *
390494fd7b7SFeng Kan  * It moves the @dev along with all of its children and all of its consumers
391494fd7b7SFeng Kan  * to the ends of the device_kset and dpm_list, recursively.
392494fd7b7SFeng Kan  */
393494fd7b7SFeng Kan void device_pm_move_to_tail(struct device *dev)
394494fd7b7SFeng Kan {
395494fd7b7SFeng Kan 	int idx;
396494fd7b7SFeng Kan 
397494fd7b7SFeng Kan 	idx = device_links_read_lock();
398494fd7b7SFeng Kan 	device_pm_lock();
399494fd7b7SFeng Kan 	device_reorder_to_tail(dev, NULL);
400494fd7b7SFeng Kan 	device_pm_unlock();
401494fd7b7SFeng Kan 	device_links_read_unlock(idx);
402494fd7b7SFeng Kan }
403494fd7b7SFeng Kan 
404287905e6SSaravana Kannan #define to_devlink(dev)	container_of((dev), struct device_link, link_dev)
405287905e6SSaravana Kannan 
406287905e6SSaravana Kannan static ssize_t status_show(struct device *dev,
407287905e6SSaravana Kannan 			   struct device_attribute *attr, char *buf)
408287905e6SSaravana Kannan {
409948b3edbSJoe Perches 	const char *output;
410287905e6SSaravana Kannan 
411287905e6SSaravana Kannan 	switch (to_devlink(dev)->status) {
412287905e6SSaravana Kannan 	case DL_STATE_NONE:
413948b3edbSJoe Perches 		output = "not tracked";
414948b3edbSJoe Perches 		break;
415287905e6SSaravana Kannan 	case DL_STATE_DORMANT:
416948b3edbSJoe Perches 		output = "dormant";
417948b3edbSJoe Perches 		break;
418287905e6SSaravana Kannan 	case DL_STATE_AVAILABLE:
419948b3edbSJoe Perches 		output = "available";
420948b3edbSJoe Perches 		break;
421287905e6SSaravana Kannan 	case DL_STATE_CONSUMER_PROBE:
422948b3edbSJoe Perches 		output = "consumer probing";
423948b3edbSJoe Perches 		break;
424287905e6SSaravana Kannan 	case DL_STATE_ACTIVE:
425948b3edbSJoe Perches 		output = "active";
426948b3edbSJoe Perches 		break;
427287905e6SSaravana Kannan 	case DL_STATE_SUPPLIER_UNBIND:
428948b3edbSJoe Perches 		output = "supplier unbinding";
429948b3edbSJoe Perches 		break;
430287905e6SSaravana Kannan 	default:
431948b3edbSJoe Perches 		output = "unknown";
432948b3edbSJoe Perches 		break;
433287905e6SSaravana Kannan 	}
434948b3edbSJoe Perches 
435948b3edbSJoe Perches 	return sysfs_emit(buf, "%s\n", output);
436287905e6SSaravana Kannan }
437287905e6SSaravana Kannan static DEVICE_ATTR_RO(status);
438287905e6SSaravana Kannan 
439287905e6SSaravana Kannan static ssize_t auto_remove_on_show(struct device *dev,
440287905e6SSaravana Kannan 				   struct device_attribute *attr, char *buf)
441287905e6SSaravana Kannan {
442287905e6SSaravana Kannan 	struct device_link *link = to_devlink(dev);
443973c3911SJoe Perches 	const char *output;
444287905e6SSaravana Kannan 
445287905e6SSaravana Kannan 	if (link->flags & DL_FLAG_AUTOREMOVE_SUPPLIER)
446973c3911SJoe Perches 		output = "supplier unbind";
447287905e6SSaravana Kannan 	else if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER)
448973c3911SJoe Perches 		output = "consumer unbind";
449287905e6SSaravana Kannan 	else
450973c3911SJoe Perches 		output = "never";
451287905e6SSaravana Kannan 
452973c3911SJoe Perches 	return sysfs_emit(buf, "%s\n", output);
453287905e6SSaravana Kannan }
454287905e6SSaravana Kannan static DEVICE_ATTR_RO(auto_remove_on);
455287905e6SSaravana Kannan 
456287905e6SSaravana Kannan static ssize_t runtime_pm_show(struct device *dev,
457287905e6SSaravana Kannan 			       struct device_attribute *attr, char *buf)
458287905e6SSaravana Kannan {
459287905e6SSaravana Kannan 	struct device_link *link = to_devlink(dev);
460287905e6SSaravana Kannan 
461aa838896SJoe Perches 	return sysfs_emit(buf, "%d\n", !!(link->flags & DL_FLAG_PM_RUNTIME));
462287905e6SSaravana Kannan }
463287905e6SSaravana Kannan static DEVICE_ATTR_RO(runtime_pm);
464287905e6SSaravana Kannan 
465287905e6SSaravana Kannan static ssize_t sync_state_only_show(struct device *dev,
466287905e6SSaravana Kannan 				    struct device_attribute *attr, char *buf)
467287905e6SSaravana Kannan {
468287905e6SSaravana Kannan 	struct device_link *link = to_devlink(dev);
469287905e6SSaravana Kannan 
470aa838896SJoe Perches 	return sysfs_emit(buf, "%d\n",
471aa838896SJoe Perches 			  !!(link->flags & DL_FLAG_SYNC_STATE_ONLY));
472287905e6SSaravana Kannan }
473287905e6SSaravana Kannan static DEVICE_ATTR_RO(sync_state_only);
474287905e6SSaravana Kannan 
475287905e6SSaravana Kannan static struct attribute *devlink_attrs[] = {
476287905e6SSaravana Kannan 	&dev_attr_status.attr,
477287905e6SSaravana Kannan 	&dev_attr_auto_remove_on.attr,
478287905e6SSaravana Kannan 	&dev_attr_runtime_pm.attr,
479287905e6SSaravana Kannan 	&dev_attr_sync_state_only.attr,
480287905e6SSaravana Kannan 	NULL,
481287905e6SSaravana Kannan };
482287905e6SSaravana Kannan ATTRIBUTE_GROUPS(devlink);
483287905e6SSaravana Kannan 
48480dd33cfSRafael J. Wysocki static void device_link_release_fn(struct work_struct *work)
485843e600bSSaravana Kannan {
48680dd33cfSRafael J. Wysocki 	struct device_link *link = container_of(work, struct device_link, rm_work);
48780dd33cfSRafael J. Wysocki 
48880dd33cfSRafael J. Wysocki 	/* Ensure that all references to the link object have been dropped. */
48980dd33cfSRafael J. Wysocki 	device_link_synchronize_removal();
49080dd33cfSRafael J. Wysocki 
49107358194SRafael J. Wysocki 	pm_runtime_release_supplier(link);
49288737106SRafael J. Wysocki 	/*
49388737106SRafael J. Wysocki 	 * If supplier_preactivated is set, the link has been dropped between
49488737106SRafael J. Wysocki 	 * the pm_runtime_get_suppliers() and pm_runtime_put_suppliers() calls
49588737106SRafael J. Wysocki 	 * in __driver_probe_device().  In that case, drop the supplier's
49688737106SRafael J. Wysocki 	 * PM-runtime usage counter to remove the reference taken by
49788737106SRafael J. Wysocki 	 * pm_runtime_get_suppliers().
49888737106SRafael J. Wysocki 	 */
49988737106SRafael J. Wysocki 	if (link->supplier_preactivated)
50088737106SRafael J. Wysocki 		pm_runtime_put_noidle(link->supplier);
50188737106SRafael J. Wysocki 
50207358194SRafael J. Wysocki 	pm_request_idle(link->supplier);
503843e600bSSaravana Kannan 
504843e600bSSaravana Kannan 	put_device(link->consumer);
505843e600bSSaravana Kannan 	put_device(link->supplier);
506843e600bSSaravana Kannan 	kfree(link);
507843e600bSSaravana Kannan }
508843e600bSSaravana Kannan 
509287905e6SSaravana Kannan static void devlink_dev_release(struct device *dev)
510287905e6SSaravana Kannan {
511843e600bSSaravana Kannan 	struct device_link *link = to_devlink(dev);
512843e600bSSaravana Kannan 
51380dd33cfSRafael J. Wysocki 	INIT_WORK(&link->rm_work, device_link_release_fn);
51480dd33cfSRafael J. Wysocki 	/*
51580dd33cfSRafael J. Wysocki 	 * It may take a while to complete this work because of the SRCU
51680dd33cfSRafael J. Wysocki 	 * synchronization in device_link_release_fn() and if the consumer or
51780dd33cfSRafael J. Wysocki 	 * supplier devices get deleted when it runs, so put it into the "long"
51880dd33cfSRafael J. Wysocki 	 * workqueue.
51980dd33cfSRafael J. Wysocki 	 */
52080dd33cfSRafael J. Wysocki 	queue_work(system_long_wq, &link->rm_work);
521287905e6SSaravana Kannan }
522287905e6SSaravana Kannan 
523287905e6SSaravana Kannan static struct class devlink_class = {
524287905e6SSaravana Kannan 	.name = "devlink",
525287905e6SSaravana Kannan 	.owner = THIS_MODULE,
526287905e6SSaravana Kannan 	.dev_groups = devlink_groups,
527287905e6SSaravana Kannan 	.dev_release = devlink_dev_release,
528287905e6SSaravana Kannan };
529287905e6SSaravana Kannan 
530287905e6SSaravana Kannan static int devlink_add_symlinks(struct device *dev,
531287905e6SSaravana Kannan 				struct class_interface *class_intf)
532287905e6SSaravana Kannan {
533287905e6SSaravana Kannan 	int ret;
534287905e6SSaravana Kannan 	size_t len;
535287905e6SSaravana Kannan 	struct device_link *link = to_devlink(dev);
536287905e6SSaravana Kannan 	struct device *sup = link->supplier;
537287905e6SSaravana Kannan 	struct device *con = link->consumer;
538287905e6SSaravana Kannan 	char *buf;
539287905e6SSaravana Kannan 
540e020ff61SSaravana Kannan 	len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
541e020ff61SSaravana Kannan 		  strlen(dev_bus_name(con)) + strlen(dev_name(con)));
542e020ff61SSaravana Kannan 	len += strlen(":");
543287905e6SSaravana Kannan 	len += strlen("supplier:") + 1;
544287905e6SSaravana Kannan 	buf = kzalloc(len, GFP_KERNEL);
545287905e6SSaravana Kannan 	if (!buf)
546287905e6SSaravana Kannan 		return -ENOMEM;
547287905e6SSaravana Kannan 
548287905e6SSaravana Kannan 	ret = sysfs_create_link(&link->link_dev.kobj, &sup->kobj, "supplier");
549287905e6SSaravana Kannan 	if (ret)
550287905e6SSaravana Kannan 		goto out;
551287905e6SSaravana Kannan 
552287905e6SSaravana Kannan 	ret = sysfs_create_link(&link->link_dev.kobj, &con->kobj, "consumer");
553287905e6SSaravana Kannan 	if (ret)
554287905e6SSaravana Kannan 		goto err_con;
555287905e6SSaravana Kannan 
556e020ff61SSaravana Kannan 	snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
557287905e6SSaravana Kannan 	ret = sysfs_create_link(&sup->kobj, &link->link_dev.kobj, buf);
558287905e6SSaravana Kannan 	if (ret)
559287905e6SSaravana Kannan 		goto err_con_dev;
560287905e6SSaravana Kannan 
561e020ff61SSaravana Kannan 	snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
562287905e6SSaravana Kannan 	ret = sysfs_create_link(&con->kobj, &link->link_dev.kobj, buf);
563287905e6SSaravana Kannan 	if (ret)
564287905e6SSaravana Kannan 		goto err_sup_dev;
565287905e6SSaravana Kannan 
566287905e6SSaravana Kannan 	goto out;
567287905e6SSaravana Kannan 
568287905e6SSaravana Kannan err_sup_dev:
569e020ff61SSaravana Kannan 	snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
570287905e6SSaravana Kannan 	sysfs_remove_link(&sup->kobj, buf);
571287905e6SSaravana Kannan err_con_dev:
572287905e6SSaravana Kannan 	sysfs_remove_link(&link->link_dev.kobj, "consumer");
573287905e6SSaravana Kannan err_con:
574287905e6SSaravana Kannan 	sysfs_remove_link(&link->link_dev.kobj, "supplier");
575287905e6SSaravana Kannan out:
576287905e6SSaravana Kannan 	kfree(buf);
577287905e6SSaravana Kannan 	return ret;
578287905e6SSaravana Kannan }
579287905e6SSaravana Kannan 
580287905e6SSaravana Kannan static void devlink_remove_symlinks(struct device *dev,
581287905e6SSaravana Kannan 				   struct class_interface *class_intf)
582287905e6SSaravana Kannan {
583287905e6SSaravana Kannan 	struct device_link *link = to_devlink(dev);
584287905e6SSaravana Kannan 	size_t len;
585287905e6SSaravana Kannan 	struct device *sup = link->supplier;
586287905e6SSaravana Kannan 	struct device *con = link->consumer;
587287905e6SSaravana Kannan 	char *buf;
588287905e6SSaravana Kannan 
589287905e6SSaravana Kannan 	sysfs_remove_link(&link->link_dev.kobj, "consumer");
590287905e6SSaravana Kannan 	sysfs_remove_link(&link->link_dev.kobj, "supplier");
591287905e6SSaravana Kannan 
592e020ff61SSaravana Kannan 	len = max(strlen(dev_bus_name(sup)) + strlen(dev_name(sup)),
593e020ff61SSaravana Kannan 		  strlen(dev_bus_name(con)) + strlen(dev_name(con)));
594e020ff61SSaravana Kannan 	len += strlen(":");
595287905e6SSaravana Kannan 	len += strlen("supplier:") + 1;
596287905e6SSaravana Kannan 	buf = kzalloc(len, GFP_KERNEL);
597287905e6SSaravana Kannan 	if (!buf) {
598287905e6SSaravana Kannan 		WARN(1, "Unable to properly free device link symlinks!\n");
599287905e6SSaravana Kannan 		return;
600287905e6SSaravana Kannan 	}
601287905e6SSaravana Kannan 
602e64daad6SAdrian Hunter 	if (device_is_registered(con)) {
603e020ff61SSaravana Kannan 		snprintf(buf, len, "supplier:%s:%s", dev_bus_name(sup), dev_name(sup));
604287905e6SSaravana Kannan 		sysfs_remove_link(&con->kobj, buf);
605e64daad6SAdrian Hunter 	}
606e020ff61SSaravana Kannan 	snprintf(buf, len, "consumer:%s:%s", dev_bus_name(con), dev_name(con));
607287905e6SSaravana Kannan 	sysfs_remove_link(&sup->kobj, buf);
608287905e6SSaravana Kannan 	kfree(buf);
609287905e6SSaravana Kannan }
610287905e6SSaravana Kannan 
611287905e6SSaravana Kannan static struct class_interface devlink_class_intf = {
612287905e6SSaravana Kannan 	.class = &devlink_class,
613287905e6SSaravana Kannan 	.add_dev = devlink_add_symlinks,
614287905e6SSaravana Kannan 	.remove_dev = devlink_remove_symlinks,
615287905e6SSaravana Kannan };
616287905e6SSaravana Kannan 
617287905e6SSaravana Kannan static int __init devlink_class_init(void)
618287905e6SSaravana Kannan {
619287905e6SSaravana Kannan 	int ret;
620287905e6SSaravana Kannan 
621287905e6SSaravana Kannan 	ret = class_register(&devlink_class);
622287905e6SSaravana Kannan 	if (ret)
623287905e6SSaravana Kannan 		return ret;
624287905e6SSaravana Kannan 
625287905e6SSaravana Kannan 	ret = class_interface_register(&devlink_class_intf);
626287905e6SSaravana Kannan 	if (ret)
627287905e6SSaravana Kannan 		class_unregister(&devlink_class);
628287905e6SSaravana Kannan 
629287905e6SSaravana Kannan 	return ret;
630287905e6SSaravana Kannan }
631287905e6SSaravana Kannan postcore_initcall(devlink_class_init);
632287905e6SSaravana Kannan 
633515db266SRafael J. Wysocki #define DL_MANAGED_LINK_FLAGS (DL_FLAG_AUTOREMOVE_CONSUMER | \
634515db266SRafael J. Wysocki 			       DL_FLAG_AUTOREMOVE_SUPPLIER | \
63505ef983eSSaravana Kannan 			       DL_FLAG_AUTOPROBE_CONSUMER  | \
6364b9bbb29SSaravana Kannan 			       DL_FLAG_SYNC_STATE_ONLY | \
6374b9bbb29SSaravana Kannan 			       DL_FLAG_INFERRED)
638515db266SRafael J. Wysocki 
639fb583c8eSRafael J. Wysocki #define DL_ADD_VALID_FLAGS (DL_MANAGED_LINK_FLAGS | DL_FLAG_STATELESS | \
640fb583c8eSRafael J. Wysocki 			    DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE)
641fb583c8eSRafael J. Wysocki 
642494fd7b7SFeng Kan /**
6439ed98953SRafael J. Wysocki  * device_link_add - Create a link between two devices.
6449ed98953SRafael J. Wysocki  * @consumer: Consumer end of the link.
6459ed98953SRafael J. Wysocki  * @supplier: Supplier end of the link.
6469ed98953SRafael J. Wysocki  * @flags: Link flags.
6479ed98953SRafael J. Wysocki  *
64821d5c57bSRafael J. Wysocki  * The caller is responsible for the proper synchronization of the link creation
64921d5c57bSRafael J. Wysocki  * with runtime PM.  First, setting the DL_FLAG_PM_RUNTIME flag will cause the
65021d5c57bSRafael J. Wysocki  * runtime PM framework to take the link into account.  Second, if the
65121d5c57bSRafael J. Wysocki  * DL_FLAG_RPM_ACTIVE flag is set in addition to it, the supplier devices will
65221d5c57bSRafael J. Wysocki  * be forced into the active meta state and reference-counted upon the creation
65321d5c57bSRafael J. Wysocki  * of the link.  If DL_FLAG_PM_RUNTIME is not set, DL_FLAG_RPM_ACTIVE will be
65421d5c57bSRafael J. Wysocki  * ignored.
65521d5c57bSRafael J. Wysocki  *
656515db266SRafael J. Wysocki  * If DL_FLAG_STATELESS is set in @flags, the caller of this function is
657515db266SRafael J. Wysocki  * expected to release the link returned by it directly with the help of either
658515db266SRafael J. Wysocki  * device_link_del() or device_link_remove().
65972175d4eSRafael J. Wysocki  *
66072175d4eSRafael J. Wysocki  * If that flag is not set, however, the caller of this function is handing the
66172175d4eSRafael J. Wysocki  * management of the link over to the driver core entirely and its return value
66272175d4eSRafael J. Wysocki  * can only be used to check whether or not the link is present.  In that case,
66372175d4eSRafael J. Wysocki  * the DL_FLAG_AUTOREMOVE_CONSUMER and DL_FLAG_AUTOREMOVE_SUPPLIER device link
66472175d4eSRafael J. Wysocki  * flags can be used to indicate to the driver core when the link can be safely
66572175d4eSRafael J. Wysocki  * deleted.  Namely, setting one of them in @flags indicates to the driver core
66672175d4eSRafael J. Wysocki  * that the link is not going to be used (by the given caller of this function)
66772175d4eSRafael J. Wysocki  * after unbinding the consumer or supplier driver, respectively, from its
66872175d4eSRafael J. Wysocki  * device, so the link can be deleted at that point.  If none of them is set,
66972175d4eSRafael J. Wysocki  * the link will be maintained until one of the devices pointed to by it (either
67072175d4eSRafael J. Wysocki  * the consumer or the supplier) is unregistered.
671c8d50986SRafael J. Wysocki  *
672e7dd4010SRafael J. Wysocki  * Also, if DL_FLAG_STATELESS, DL_FLAG_AUTOREMOVE_CONSUMER and
673e7dd4010SRafael J. Wysocki  * DL_FLAG_AUTOREMOVE_SUPPLIER are not set in @flags (that is, a persistent
674e7dd4010SRafael J. Wysocki  * managed device link is being added), the DL_FLAG_AUTOPROBE_CONSUMER flag can
675d475f8eaSThierry Reding  * be used to request the driver core to automatically probe for a consumer
676e7dd4010SRafael J. Wysocki  * driver after successfully binding a driver to the supplier device.
677e7dd4010SRafael J. Wysocki  *
678515db266SRafael J. Wysocki  * The combination of DL_FLAG_STATELESS and one of DL_FLAG_AUTOREMOVE_CONSUMER,
679515db266SRafael J. Wysocki  * DL_FLAG_AUTOREMOVE_SUPPLIER, or DL_FLAG_AUTOPROBE_CONSUMER set in @flags at
680515db266SRafael J. Wysocki  * the same time is invalid and will cause NULL to be returned upfront.
681515db266SRafael J. Wysocki  * However, if a device link between the given @consumer and @supplier pair
682515db266SRafael J. Wysocki  * exists already when this function is called for them, the existing link will
683515db266SRafael J. Wysocki  * be returned regardless of its current type and status (the link's flags may
684515db266SRafael J. Wysocki  * be modified then).  The caller of this function is then expected to treat
685515db266SRafael J. Wysocki  * the link as though it has just been created, so (in particular) if
686515db266SRafael J. Wysocki  * DL_FLAG_STATELESS was passed in @flags, the link needs to be released
687515db266SRafael J. Wysocki  * explicitly when not needed any more (as stated above).
6889ed98953SRafael J. Wysocki  *
6899ed98953SRafael J. Wysocki  * A side effect of the link creation is re-ordering of dpm_list and the
6909ed98953SRafael J. Wysocki  * devices_kset list by moving the consumer device and all devices depending
6919ed98953SRafael J. Wysocki  * on it to the ends of these lists (that does not happen to devices that have
6929ed98953SRafael J. Wysocki  * not been registered when this function is called).
6939ed98953SRafael J. Wysocki  *
6949ed98953SRafael J. Wysocki  * The supplier device is required to be registered when this function is called
6959ed98953SRafael J. Wysocki  * and NULL will be returned if that is not the case.  The consumer device need
69664df1148SLukas Wunner  * not be registered, however.
6979ed98953SRafael J. Wysocki  */
6989ed98953SRafael J. Wysocki struct device_link *device_link_add(struct device *consumer,
6999ed98953SRafael J. Wysocki 				    struct device *supplier, u32 flags)
7009ed98953SRafael J. Wysocki {
7019ed98953SRafael J. Wysocki 	struct device_link *link;
7029ed98953SRafael J. Wysocki 
703f729a592SSaravana Kannan 	if (!consumer || !supplier || consumer == supplier ||
704f729a592SSaravana Kannan 	    flags & ~DL_ADD_VALID_FLAGS ||
705515db266SRafael J. Wysocki 	    (flags & DL_FLAG_STATELESS && flags & DL_MANAGED_LINK_FLAGS) ||
70605ef983eSSaravana Kannan 	    (flags & DL_FLAG_SYNC_STATE_ONLY &&
7074b9bbb29SSaravana Kannan 	     (flags & ~DL_FLAG_INFERRED) != DL_FLAG_SYNC_STATE_ONLY) ||
708e7dd4010SRafael J. Wysocki 	    (flags & DL_FLAG_AUTOPROBE_CONSUMER &&
709e7dd4010SRafael J. Wysocki 	     flags & (DL_FLAG_AUTOREMOVE_CONSUMER |
710e7dd4010SRafael J. Wysocki 		      DL_FLAG_AUTOREMOVE_SUPPLIER)))
7119ed98953SRafael J. Wysocki 		return NULL;
7129ed98953SRafael J. Wysocki 
7135db25c9eSRafael J. Wysocki 	if (flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) {
7145db25c9eSRafael J. Wysocki 		if (pm_runtime_get_sync(supplier) < 0) {
7155db25c9eSRafael J. Wysocki 			pm_runtime_put_noidle(supplier);
7165db25c9eSRafael J. Wysocki 			return NULL;
7175db25c9eSRafael J. Wysocki 		}
7185db25c9eSRafael J. Wysocki 	}
7195db25c9eSRafael J. Wysocki 
720515db266SRafael J. Wysocki 	if (!(flags & DL_FLAG_STATELESS))
721515db266SRafael J. Wysocki 		flags |= DL_FLAG_MANAGED;
722515db266SRafael J. Wysocki 
7239ed98953SRafael J. Wysocki 	device_links_write_lock();
7249ed98953SRafael J. Wysocki 	device_pm_lock();
7259ed98953SRafael J. Wysocki 
7269ed98953SRafael J. Wysocki 	/*
7279ed98953SRafael J. Wysocki 	 * If the supplier has not been fully registered yet or there is a
72805ef983eSSaravana Kannan 	 * reverse (non-SYNC_STATE_ONLY) dependency between the consumer and
72905ef983eSSaravana Kannan 	 * the supplier already in the graph, return NULL. If the link is a
73005ef983eSSaravana Kannan 	 * SYNC_STATE_ONLY link, we don't check for reverse dependencies
73105ef983eSSaravana Kannan 	 * because it only affects sync_state() callbacks.
7329ed98953SRafael J. Wysocki 	 */
7339ed98953SRafael J. Wysocki 	if (!device_pm_initialized(supplier)
73405ef983eSSaravana Kannan 	    || (!(flags & DL_FLAG_SYNC_STATE_ONLY) &&
73505ef983eSSaravana Kannan 		  device_is_dependent(consumer, supplier))) {
7369ed98953SRafael J. Wysocki 		link = NULL;
7379ed98953SRafael J. Wysocki 		goto out;
7389ed98953SRafael J. Wysocki 	}
7399ed98953SRafael J. Wysocki 
74072175d4eSRafael J. Wysocki 	/*
741ac66c5bbSSaravana Kannan 	 * SYNC_STATE_ONLY links are useless once a consumer device has probed.
742ac66c5bbSSaravana Kannan 	 * So, only create it if the consumer hasn't probed yet.
743ac66c5bbSSaravana Kannan 	 */
744ac66c5bbSSaravana Kannan 	if (flags & DL_FLAG_SYNC_STATE_ONLY &&
745ac66c5bbSSaravana Kannan 	    consumer->links.status != DL_DEV_NO_DRIVER &&
746ac66c5bbSSaravana Kannan 	    consumer->links.status != DL_DEV_PROBING) {
747ac66c5bbSSaravana Kannan 		link = NULL;
748ac66c5bbSSaravana Kannan 		goto out;
749ac66c5bbSSaravana Kannan 	}
750ac66c5bbSSaravana Kannan 
751ac66c5bbSSaravana Kannan 	/*
75272175d4eSRafael J. Wysocki 	 * DL_FLAG_AUTOREMOVE_SUPPLIER indicates that the link will be needed
75372175d4eSRafael J. Wysocki 	 * longer than for DL_FLAG_AUTOREMOVE_CONSUMER and setting them both
75472175d4eSRafael J. Wysocki 	 * together doesn't make sense, so prefer DL_FLAG_AUTOREMOVE_SUPPLIER.
75572175d4eSRafael J. Wysocki 	 */
75672175d4eSRafael J. Wysocki 	if (flags & DL_FLAG_AUTOREMOVE_SUPPLIER)
75772175d4eSRafael J. Wysocki 		flags &= ~DL_FLAG_AUTOREMOVE_CONSUMER;
75872175d4eSRafael J. Wysocki 
759f265df55SRafael J. Wysocki 	list_for_each_entry(link, &supplier->links.consumers, s_node) {
760f265df55SRafael J. Wysocki 		if (link->consumer != consumer)
761f265df55SRafael J. Wysocki 			continue;
762f265df55SRafael J. Wysocki 
7634b9bbb29SSaravana Kannan 		if (link->flags & DL_FLAG_INFERRED &&
7644b9bbb29SSaravana Kannan 		    !(flags & DL_FLAG_INFERRED))
7654b9bbb29SSaravana Kannan 			link->flags &= ~DL_FLAG_INFERRED;
7664b9bbb29SSaravana Kannan 
767e2f3cd83SRafael J. Wysocki 		if (flags & DL_FLAG_PM_RUNTIME) {
768e2f3cd83SRafael J. Wysocki 			if (!(link->flags & DL_FLAG_PM_RUNTIME)) {
7694c06c4e6SRafael J. Wysocki 				pm_runtime_new_link(consumer);
770e2f3cd83SRafael J. Wysocki 				link->flags |= DL_FLAG_PM_RUNTIME;
771e2f3cd83SRafael J. Wysocki 			}
772e2f3cd83SRafael J. Wysocki 			if (flags & DL_FLAG_RPM_ACTIVE)
77336003d4cSRafael J. Wysocki 				refcount_inc(&link->rpm_active);
774e2f3cd83SRafael J. Wysocki 		}
775e2f3cd83SRafael J. Wysocki 
77672175d4eSRafael J. Wysocki 		if (flags & DL_FLAG_STATELESS) {
777ead18c23SLukas Wunner 			kref_get(&link->kref);
77821c27f06SSaravana Kannan 			if (link->flags & DL_FLAG_SYNC_STATE_ONLY &&
77944e96049SSaravana Kannan 			    !(link->flags & DL_FLAG_STATELESS)) {
78044e96049SSaravana Kannan 				link->flags |= DL_FLAG_STATELESS;
78105ef983eSSaravana Kannan 				goto reorder;
78244e96049SSaravana Kannan 			} else {
78344e96049SSaravana Kannan 				link->flags |= DL_FLAG_STATELESS;
7849ed98953SRafael J. Wysocki 				goto out;
785ead18c23SLukas Wunner 			}
78644e96049SSaravana Kannan 		}
7879ed98953SRafael J. Wysocki 
78872175d4eSRafael J. Wysocki 		/*
78972175d4eSRafael J. Wysocki 		 * If the life time of the link following from the new flags is
79072175d4eSRafael J. Wysocki 		 * longer than indicated by the flags of the existing link,
79172175d4eSRafael J. Wysocki 		 * update the existing link to stay around longer.
79272175d4eSRafael J. Wysocki 		 */
79372175d4eSRafael J. Wysocki 		if (flags & DL_FLAG_AUTOREMOVE_SUPPLIER) {
79472175d4eSRafael J. Wysocki 			if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER) {
79572175d4eSRafael J. Wysocki 				link->flags &= ~DL_FLAG_AUTOREMOVE_CONSUMER;
79672175d4eSRafael J. Wysocki 				link->flags |= DL_FLAG_AUTOREMOVE_SUPPLIER;
79772175d4eSRafael J. Wysocki 			}
79872175d4eSRafael J. Wysocki 		} else if (!(flags & DL_FLAG_AUTOREMOVE_CONSUMER)) {
79972175d4eSRafael J. Wysocki 			link->flags &= ~(DL_FLAG_AUTOREMOVE_CONSUMER |
80072175d4eSRafael J. Wysocki 					 DL_FLAG_AUTOREMOVE_SUPPLIER);
80172175d4eSRafael J. Wysocki 		}
802515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED)) {
803515db266SRafael J. Wysocki 			kref_get(&link->kref);
804515db266SRafael J. Wysocki 			link->flags |= DL_FLAG_MANAGED;
805515db266SRafael J. Wysocki 			device_link_init_status(link, consumer, supplier);
806515db266SRafael J. Wysocki 		}
80705ef983eSSaravana Kannan 		if (link->flags & DL_FLAG_SYNC_STATE_ONLY &&
80805ef983eSSaravana Kannan 		    !(flags & DL_FLAG_SYNC_STATE_ONLY)) {
80905ef983eSSaravana Kannan 			link->flags &= ~DL_FLAG_SYNC_STATE_ONLY;
81005ef983eSSaravana Kannan 			goto reorder;
81105ef983eSSaravana Kannan 		}
81205ef983eSSaravana Kannan 
81372175d4eSRafael J. Wysocki 		goto out;
81472175d4eSRafael J. Wysocki 	}
81572175d4eSRafael J. Wysocki 
81621d5c57bSRafael J. Wysocki 	link = kzalloc(sizeof(*link), GFP_KERNEL);
8179ed98953SRafael J. Wysocki 	if (!link)
8189ed98953SRafael J. Wysocki 		goto out;
8199ed98953SRafael J. Wysocki 
820e2f3cd83SRafael J. Wysocki 	refcount_set(&link->rpm_active, 1);
821e2f3cd83SRafael J. Wysocki 
8229ed98953SRafael J. Wysocki 	get_device(supplier);
8239ed98953SRafael J. Wysocki 	link->supplier = supplier;
8249ed98953SRafael J. Wysocki 	INIT_LIST_HEAD(&link->s_node);
8259ed98953SRafael J. Wysocki 	get_device(consumer);
8269ed98953SRafael J. Wysocki 	link->consumer = consumer;
8279ed98953SRafael J. Wysocki 	INIT_LIST_HEAD(&link->c_node);
8289ed98953SRafael J. Wysocki 	link->flags = flags;
829ead18c23SLukas Wunner 	kref_init(&link->kref);
8309ed98953SRafael J. Wysocki 
831287905e6SSaravana Kannan 	link->link_dev.class = &devlink_class;
832287905e6SSaravana Kannan 	device_set_pm_not_required(&link->link_dev);
833e020ff61SSaravana Kannan 	dev_set_name(&link->link_dev, "%s:%s--%s:%s",
834e020ff61SSaravana Kannan 		     dev_bus_name(supplier), dev_name(supplier),
835e020ff61SSaravana Kannan 		     dev_bus_name(consumer), dev_name(consumer));
836287905e6SSaravana Kannan 	if (device_register(&link->link_dev)) {
837df0a1814SYang Yingliang 		put_device(&link->link_dev);
838287905e6SSaravana Kannan 		link = NULL;
839287905e6SSaravana Kannan 		goto out;
840287905e6SSaravana Kannan 	}
841287905e6SSaravana Kannan 
842287905e6SSaravana Kannan 	if (flags & DL_FLAG_PM_RUNTIME) {
843287905e6SSaravana Kannan 		if (flags & DL_FLAG_RPM_ACTIVE)
844287905e6SSaravana Kannan 			refcount_inc(&link->rpm_active);
845287905e6SSaravana Kannan 
846287905e6SSaravana Kannan 		pm_runtime_new_link(consumer);
847287905e6SSaravana Kannan 	}
848287905e6SSaravana Kannan 
84964df1148SLukas Wunner 	/* Determine the initial link state. */
850515db266SRafael J. Wysocki 	if (flags & DL_FLAG_STATELESS)
8519ed98953SRafael J. Wysocki 		link->status = DL_STATE_NONE;
852515db266SRafael J. Wysocki 	else
853515db266SRafael J. Wysocki 		device_link_init_status(link, consumer, supplier);
8549ed98953SRafael J. Wysocki 
8559ed98953SRafael J. Wysocki 	/*
85615cfb094SRafael J. Wysocki 	 * Some callers expect the link creation during consumer driver probe to
85715cfb094SRafael J. Wysocki 	 * resume the supplier even without DL_FLAG_RPM_ACTIVE.
85815cfb094SRafael J. Wysocki 	 */
85915cfb094SRafael J. Wysocki 	if (link->status == DL_STATE_CONSUMER_PROBE &&
86015cfb094SRafael J. Wysocki 	    flags & DL_FLAG_PM_RUNTIME)
86115cfb094SRafael J. Wysocki 		pm_runtime_resume(supplier);
86215cfb094SRafael J. Wysocki 
86321c27f06SSaravana Kannan 	list_add_tail_rcu(&link->s_node, &supplier->links.consumers);
86421c27f06SSaravana Kannan 	list_add_tail_rcu(&link->c_node, &consumer->links.suppliers);
86521c27f06SSaravana Kannan 
86605ef983eSSaravana Kannan 	if (flags & DL_FLAG_SYNC_STATE_ONLY) {
86705ef983eSSaravana Kannan 		dev_dbg(consumer,
86805ef983eSSaravana Kannan 			"Linked as a sync state only consumer to %s\n",
86905ef983eSSaravana Kannan 			dev_name(supplier));
87005ef983eSSaravana Kannan 		goto out;
87105ef983eSSaravana Kannan 	}
87221c27f06SSaravana Kannan 
87305ef983eSSaravana Kannan reorder:
87415cfb094SRafael J. Wysocki 	/*
8759ed98953SRafael J. Wysocki 	 * Move the consumer and all of the devices depending on it to the end
8769ed98953SRafael J. Wysocki 	 * of dpm_list and the devices_kset list.
8779ed98953SRafael J. Wysocki 	 *
8789ed98953SRafael J. Wysocki 	 * It is necessary to hold dpm_list locked throughout all that or else
8799ed98953SRafael J. Wysocki 	 * we may end up suspending with a wrong ordering of it.
8809ed98953SRafael J. Wysocki 	 */
8819ed98953SRafael J. Wysocki 	device_reorder_to_tail(consumer, NULL);
8829ed98953SRafael J. Wysocki 
8838a4b3269SJerome Brunet 	dev_dbg(consumer, "Linked as a consumer to %s\n", dev_name(supplier));
8849ed98953SRafael J. Wysocki 
8859ed98953SRafael J. Wysocki out:
8869ed98953SRafael J. Wysocki 	device_pm_unlock();
8879ed98953SRafael J. Wysocki 	device_links_write_unlock();
8885db25c9eSRafael J. Wysocki 
889e2f3cd83SRafael J. Wysocki 	if ((flags & DL_FLAG_PM_RUNTIME && flags & DL_FLAG_RPM_ACTIVE) && !link)
8905db25c9eSRafael J. Wysocki 		pm_runtime_put(supplier);
8915db25c9eSRafael J. Wysocki 
8929ed98953SRafael J. Wysocki 	return link;
8939ed98953SRafael J. Wysocki }
8949ed98953SRafael J. Wysocki EXPORT_SYMBOL_GPL(device_link_add);
8959ed98953SRafael J. Wysocki 
896ead18c23SLukas Wunner static void __device_link_del(struct kref *kref)
8979ed98953SRafael J. Wysocki {
898ead18c23SLukas Wunner 	struct device_link *link = container_of(kref, struct device_link, kref);
899ead18c23SLukas Wunner 
9008a4b3269SJerome Brunet 	dev_dbg(link->consumer, "Dropping the link to %s\n",
9019ed98953SRafael J. Wysocki 		dev_name(link->supplier));
9029ed98953SRafael J. Wysocki 
903e0e398e2SRafael J. Wysocki 	pm_runtime_drop_link(link);
904baa8809fSRafael J. Wysocki 
9050c871315SRafael J. Wysocki 	device_link_remove_from_lists(link);
906843e600bSSaravana Kannan 	device_unregister(&link->link_dev);
9079ed98953SRafael J. Wysocki }
9089ed98953SRafael J. Wysocki 
90972175d4eSRafael J. Wysocki static void device_link_put_kref(struct device_link *link)
91072175d4eSRafael J. Wysocki {
91172175d4eSRafael J. Wysocki 	if (link->flags & DL_FLAG_STATELESS)
91272175d4eSRafael J. Wysocki 		kref_put(&link->kref, __device_link_del);
913bf25967aSAdrian Hunter 	else if (!device_is_registered(link->consumer))
914bf25967aSAdrian Hunter 		__device_link_del(&link->kref);
91572175d4eSRafael J. Wysocki 	else
91672175d4eSRafael J. Wysocki 		WARN(1, "Unable to drop a managed device link reference\n");
91772175d4eSRafael J. Wysocki }
91872175d4eSRafael J. Wysocki 
9199ed98953SRafael J. Wysocki /**
92072175d4eSRafael J. Wysocki  * device_link_del - Delete a stateless link between two devices.
9219ed98953SRafael J. Wysocki  * @link: Device link to delete.
9229ed98953SRafael J. Wysocki  *
9239ed98953SRafael J. Wysocki  * The caller must ensure proper synchronization of this function with runtime
924ead18c23SLukas Wunner  * PM.  If the link was added multiple times, it needs to be deleted as often.
925ead18c23SLukas Wunner  * Care is required for hotplugged devices:  Their links are purged on removal
926ead18c23SLukas Wunner  * and calling device_link_del() is then no longer allowed.
9279ed98953SRafael J. Wysocki  */
9289ed98953SRafael J. Wysocki void device_link_del(struct device_link *link)
9299ed98953SRafael J. Wysocki {
9309ed98953SRafael J. Wysocki 	device_links_write_lock();
93172175d4eSRafael J. Wysocki 	device_link_put_kref(link);
9329ed98953SRafael J. Wysocki 	device_links_write_unlock();
9339ed98953SRafael J. Wysocki }
9349ed98953SRafael J. Wysocki EXPORT_SYMBOL_GPL(device_link_del);
9359ed98953SRafael J. Wysocki 
936d8842211Spascal paillet /**
93772175d4eSRafael J. Wysocki  * device_link_remove - Delete a stateless link between two devices.
938d8842211Spascal paillet  * @consumer: Consumer end of the link.
939d8842211Spascal paillet  * @supplier: Supplier end of the link.
940d8842211Spascal paillet  *
941d8842211Spascal paillet  * The caller must ensure proper synchronization of this function with runtime
942d8842211Spascal paillet  * PM.
943d8842211Spascal paillet  */
944d8842211Spascal paillet void device_link_remove(void *consumer, struct device *supplier)
945d8842211Spascal paillet {
946d8842211Spascal paillet 	struct device_link *link;
947d8842211Spascal paillet 
948d8842211Spascal paillet 	if (WARN_ON(consumer == supplier))
949d8842211Spascal paillet 		return;
950d8842211Spascal paillet 
951d8842211Spascal paillet 	device_links_write_lock();
952d8842211Spascal paillet 
953d8842211Spascal paillet 	list_for_each_entry(link, &supplier->links.consumers, s_node) {
954d8842211Spascal paillet 		if (link->consumer == consumer) {
95572175d4eSRafael J. Wysocki 			device_link_put_kref(link);
956d8842211Spascal paillet 			break;
957d8842211Spascal paillet 		}
958d8842211Spascal paillet 	}
959d8842211Spascal paillet 
960d8842211Spascal paillet 	device_links_write_unlock();
961d8842211Spascal paillet }
962d8842211Spascal paillet EXPORT_SYMBOL_GPL(device_link_remove);
963d8842211Spascal paillet 
9649ed98953SRafael J. Wysocki static void device_links_missing_supplier(struct device *dev)
9659ed98953SRafael J. Wysocki {
9669ed98953SRafael J. Wysocki 	struct device_link *link;
9679ed98953SRafael J. Wysocki 
9688c3e315dSSaravana Kannan 	list_for_each_entry(link, &dev->links.suppliers, c_node) {
9698c3e315dSSaravana Kannan 		if (link->status != DL_STATE_CONSUMER_PROBE)
9708c3e315dSSaravana Kannan 			continue;
9718c3e315dSSaravana Kannan 
9728c3e315dSSaravana Kannan 		if (link->supplier->links.status == DL_DEV_DRIVER_BOUND) {
9739ed98953SRafael J. Wysocki 			WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
9748c3e315dSSaravana Kannan 		} else {
9758c3e315dSSaravana Kannan 			WARN_ON(!(link->flags & DL_FLAG_SYNC_STATE_ONLY));
9768c3e315dSSaravana Kannan 			WRITE_ONCE(link->status, DL_STATE_DORMANT);
9778c3e315dSSaravana Kannan 		}
9788c3e315dSSaravana Kannan 	}
9799ed98953SRafael J. Wysocki }
9809ed98953SRafael J. Wysocki 
9812f8c3ae8SSaravana Kannan static bool dev_is_best_effort(struct device *dev)
9822f8c3ae8SSaravana Kannan {
9838f486cabSSaravana Kannan 	return (fw_devlink_best_effort && dev->can_match) ||
9848f486cabSSaravana Kannan 		(dev->fwnode && (dev->fwnode->flags & FWNODE_FLAG_BEST_EFFORT));
9852f8c3ae8SSaravana Kannan }
9862f8c3ae8SSaravana Kannan 
9879ed98953SRafael J. Wysocki /**
9889ed98953SRafael J. Wysocki  * device_links_check_suppliers - Check presence of supplier drivers.
9899ed98953SRafael J. Wysocki  * @dev: Consumer device.
9909ed98953SRafael J. Wysocki  *
9919ed98953SRafael J. Wysocki  * Check links from this device to any suppliers.  Walk the list of the device's
9929ed98953SRafael J. Wysocki  * links to suppliers and see if all of them are available.  If not, simply
9939ed98953SRafael J. Wysocki  * return -EPROBE_DEFER.
9949ed98953SRafael J. Wysocki  *
9959ed98953SRafael J. Wysocki  * We need to guarantee that the supplier will not go away after the check has
9969ed98953SRafael J. Wysocki  * been positive here.  It only can go away in __device_release_driver() and
9979ed98953SRafael J. Wysocki  * that function  checks the device's links to consumers.  This means we need to
9989ed98953SRafael J. Wysocki  * mark the link as "consumer probe in progress" to make the supplier removal
9999ed98953SRafael J. Wysocki  * wait for us to complete (or bad things may happen).
10009ed98953SRafael J. Wysocki  *
1001515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
10029ed98953SRafael J. Wysocki  */
10039ed98953SRafael J. Wysocki int device_links_check_suppliers(struct device *dev)
10049ed98953SRafael J. Wysocki {
10059ed98953SRafael J. Wysocki 	struct device_link *link;
10062f8c3ae8SSaravana Kannan 	int ret = 0, fwnode_ret = 0;
100768223eeeSSaravana Kannan 	struct fwnode_handle *sup_fw;
10089ed98953SRafael J. Wysocki 
1009e2ae9bccSSaravana Kannan 	/*
1010e2ae9bccSSaravana Kannan 	 * Device waiting for supplier to become available is not allowed to
1011e2ae9bccSSaravana Kannan 	 * probe.
1012e2ae9bccSSaravana Kannan 	 */
101325ac86c6SSaravana Kannan 	mutex_lock(&fwnode_link_lock);
101425ac86c6SSaravana Kannan 	if (dev->fwnode && !list_empty(&dev->fwnode->suppliers) &&
101525ac86c6SSaravana Kannan 	    !fw_devlink_is_permissive()) {
101668223eeeSSaravana Kannan 		sup_fw = list_first_entry(&dev->fwnode->suppliers,
10171f0dfa05SSaravana Kannan 					  struct fwnode_link,
101868223eeeSSaravana Kannan 					  c_hook)->supplier;
10192f8c3ae8SSaravana Kannan 		if (!dev_is_best_effort(dev)) {
10202f8c3ae8SSaravana Kannan 			fwnode_ret = -EPROBE_DEFER;
10212f8c3ae8SSaravana Kannan 			dev_err_probe(dev, -EPROBE_DEFER,
10222f8c3ae8SSaravana Kannan 				    "wait for supplier %pfwP\n", sup_fw);
10232f8c3ae8SSaravana Kannan 		} else {
10242f8c3ae8SSaravana Kannan 			fwnode_ret = -EAGAIN;
10252f8c3ae8SSaravana Kannan 		}
1026e2ae9bccSSaravana Kannan 	}
102725ac86c6SSaravana Kannan 	mutex_unlock(&fwnode_link_lock);
10282f8c3ae8SSaravana Kannan 	if (fwnode_ret == -EPROBE_DEFER)
10292f8c3ae8SSaravana Kannan 		return fwnode_ret;
1030e2ae9bccSSaravana Kannan 
10319ed98953SRafael J. Wysocki 	device_links_write_lock();
10329ed98953SRafael J. Wysocki 
10339ed98953SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.suppliers, c_node) {
10348c3e315dSSaravana Kannan 		if (!(link->flags & DL_FLAG_MANAGED))
10359ed98953SRafael J. Wysocki 			continue;
10369ed98953SRafael J. Wysocki 
10378c3e315dSSaravana Kannan 		if (link->status != DL_STATE_AVAILABLE &&
10388c3e315dSSaravana Kannan 		    !(link->flags & DL_FLAG_SYNC_STATE_ONLY)) {
10392f8c3ae8SSaravana Kannan 
10402f8c3ae8SSaravana Kannan 			if (dev_is_best_effort(dev) &&
10412f8c3ae8SSaravana Kannan 			    link->flags & DL_FLAG_INFERRED &&
10422f8c3ae8SSaravana Kannan 			    !link->supplier->can_match) {
10432f8c3ae8SSaravana Kannan 				ret = -EAGAIN;
10442f8c3ae8SSaravana Kannan 				continue;
10452f8c3ae8SSaravana Kannan 			}
10462f8c3ae8SSaravana Kannan 
10479ed98953SRafael J. Wysocki 			device_links_missing_supplier(dev);
104868223eeeSSaravana Kannan 			dev_err_probe(dev, -EPROBE_DEFER,
104968223eeeSSaravana Kannan 				      "supplier %s not ready\n",
10501f0dfa05SSaravana Kannan 				      dev_name(link->supplier));
10519ed98953SRafael J. Wysocki 			ret = -EPROBE_DEFER;
10529ed98953SRafael J. Wysocki 			break;
10539ed98953SRafael J. Wysocki 		}
10549ed98953SRafael J. Wysocki 		WRITE_ONCE(link->status, DL_STATE_CONSUMER_PROBE);
10559ed98953SRafael J. Wysocki 	}
10569ed98953SRafael J. Wysocki 	dev->links.status = DL_DEV_PROBING;
10579ed98953SRafael J. Wysocki 
10589ed98953SRafael J. Wysocki 	device_links_write_unlock();
10592f8c3ae8SSaravana Kannan 
10602f8c3ae8SSaravana Kannan 	return ret ? ret : fwnode_ret;
10619ed98953SRafael J. Wysocki }
10629ed98953SRafael J. Wysocki 
106326e77708SSaravana Kannan /**
106426e77708SSaravana Kannan  * __device_links_queue_sync_state - Queue a device for sync_state() callback
106526e77708SSaravana Kannan  * @dev: Device to call sync_state() on
106626e77708SSaravana Kannan  * @list: List head to queue the @dev on
106726e77708SSaravana Kannan  *
106826e77708SSaravana Kannan  * Queues a device for a sync_state() callback when the device links write lock
106926e77708SSaravana Kannan  * isn't held. This allows the sync_state() execution flow to use device links
107026e77708SSaravana Kannan  * APIs.  The caller must ensure this function is called with
107126e77708SSaravana Kannan  * device_links_write_lock() held.
107226e77708SSaravana Kannan  *
107326e77708SSaravana Kannan  * This function does a get_device() to make sure the device is not freed while
107426e77708SSaravana Kannan  * on this list.
107526e77708SSaravana Kannan  *
107626e77708SSaravana Kannan  * So the caller must also ensure that device_links_flush_sync_list() is called
107726e77708SSaravana Kannan  * as soon as the caller releases device_links_write_lock().  This is necessary
107826e77708SSaravana Kannan  * to make sure the sync_state() is called in a timely fashion and the
107926e77708SSaravana Kannan  * put_device() is called on this device.
108026e77708SSaravana Kannan  */
108126e77708SSaravana Kannan static void __device_links_queue_sync_state(struct device *dev,
108226e77708SSaravana Kannan 					    struct list_head *list)
1083fc5a251dSSaravana Kannan {
1084fc5a251dSSaravana Kannan 	struct device_link *link;
1085fc5a251dSSaravana Kannan 
108677036165SSaravana Kannan 	if (!dev_has_sync_state(dev))
108777036165SSaravana Kannan 		return;
1088fc5a251dSSaravana Kannan 	if (dev->state_synced)
1089fc5a251dSSaravana Kannan 		return;
1090fc5a251dSSaravana Kannan 
1091fc5a251dSSaravana Kannan 	list_for_each_entry(link, &dev->links.consumers, s_node) {
1092fc5a251dSSaravana Kannan 		if (!(link->flags & DL_FLAG_MANAGED))
1093fc5a251dSSaravana Kannan 			continue;
1094fc5a251dSSaravana Kannan 		if (link->status != DL_STATE_ACTIVE)
1095fc5a251dSSaravana Kannan 			return;
1096fc5a251dSSaravana Kannan 	}
1097fc5a251dSSaravana Kannan 
109826e77708SSaravana Kannan 	/*
109926e77708SSaravana Kannan 	 * Set the flag here to avoid adding the same device to a list more
110026e77708SSaravana Kannan 	 * than once. This can happen if new consumers get added to the device
110126e77708SSaravana Kannan 	 * and probed before the list is flushed.
110226e77708SSaravana Kannan 	 */
110326e77708SSaravana Kannan 	dev->state_synced = true;
110426e77708SSaravana Kannan 
11053b052a3eSSaravana Kannan 	if (WARN_ON(!list_empty(&dev->links.defer_sync)))
110626e77708SSaravana Kannan 		return;
110726e77708SSaravana Kannan 
110826e77708SSaravana Kannan 	get_device(dev);
11093b052a3eSSaravana Kannan 	list_add_tail(&dev->links.defer_sync, list);
111026e77708SSaravana Kannan }
111126e77708SSaravana Kannan 
111226e77708SSaravana Kannan /**
111326e77708SSaravana Kannan  * device_links_flush_sync_list - Call sync_state() on a list of devices
111426e77708SSaravana Kannan  * @list: List of devices to call sync_state() on
111521eb93f4SSaravana Kannan  * @dont_lock_dev: Device for which lock is already held by the caller
111626e77708SSaravana Kannan  *
111726e77708SSaravana Kannan  * Calls sync_state() on all the devices that have been queued for it. This
111821eb93f4SSaravana Kannan  * function is used in conjunction with __device_links_queue_sync_state(). The
111921eb93f4SSaravana Kannan  * @dont_lock_dev parameter is useful when this function is called from a
112021eb93f4SSaravana Kannan  * context where a device lock is already held.
112126e77708SSaravana Kannan  */
112221eb93f4SSaravana Kannan static void device_links_flush_sync_list(struct list_head *list,
112321eb93f4SSaravana Kannan 					 struct device *dont_lock_dev)
112426e77708SSaravana Kannan {
112526e77708SSaravana Kannan 	struct device *dev, *tmp;
112626e77708SSaravana Kannan 
11273b052a3eSSaravana Kannan 	list_for_each_entry_safe(dev, tmp, list, links.defer_sync) {
11283b052a3eSSaravana Kannan 		list_del_init(&dev->links.defer_sync);
112926e77708SSaravana Kannan 
113021eb93f4SSaravana Kannan 		if (dev != dont_lock_dev)
113126e77708SSaravana Kannan 			device_lock(dev);
113226e77708SSaravana Kannan 
1133fc5a251dSSaravana Kannan 		if (dev->bus->sync_state)
1134fc5a251dSSaravana Kannan 			dev->bus->sync_state(dev);
1135fc5a251dSSaravana Kannan 		else if (dev->driver && dev->driver->sync_state)
1136fc5a251dSSaravana Kannan 			dev->driver->sync_state(dev);
1137fc5a251dSSaravana Kannan 
113821eb93f4SSaravana Kannan 		if (dev != dont_lock_dev)
113926e77708SSaravana Kannan 			device_unlock(dev);
114026e77708SSaravana Kannan 
114126e77708SSaravana Kannan 		put_device(dev);
114226e77708SSaravana Kannan 	}
1143fc5a251dSSaravana Kannan }
1144fc5a251dSSaravana Kannan 
1145fc5a251dSSaravana Kannan void device_links_supplier_sync_state_pause(void)
1146fc5a251dSSaravana Kannan {
1147fc5a251dSSaravana Kannan 	device_links_write_lock();
1148fc5a251dSSaravana Kannan 	defer_sync_state_count++;
1149fc5a251dSSaravana Kannan 	device_links_write_unlock();
1150fc5a251dSSaravana Kannan }
1151fc5a251dSSaravana Kannan 
1152fc5a251dSSaravana Kannan void device_links_supplier_sync_state_resume(void)
1153fc5a251dSSaravana Kannan {
1154fc5a251dSSaravana Kannan 	struct device *dev, *tmp;
115526e77708SSaravana Kannan 	LIST_HEAD(sync_list);
1156fc5a251dSSaravana Kannan 
1157fc5a251dSSaravana Kannan 	device_links_write_lock();
1158fc5a251dSSaravana Kannan 	if (!defer_sync_state_count) {
1159fc5a251dSSaravana Kannan 		WARN(true, "Unmatched sync_state pause/resume!");
1160fc5a251dSSaravana Kannan 		goto out;
1161fc5a251dSSaravana Kannan 	}
1162fc5a251dSSaravana Kannan 	defer_sync_state_count--;
1163fc5a251dSSaravana Kannan 	if (defer_sync_state_count)
1164fc5a251dSSaravana Kannan 		goto out;
1165fc5a251dSSaravana Kannan 
11663b052a3eSSaravana Kannan 	list_for_each_entry_safe(dev, tmp, &deferred_sync, links.defer_sync) {
116726e77708SSaravana Kannan 		/*
116826e77708SSaravana Kannan 		 * Delete from deferred_sync list before queuing it to
11693b052a3eSSaravana Kannan 		 * sync_list because defer_sync is used for both lists.
117026e77708SSaravana Kannan 		 */
11713b052a3eSSaravana Kannan 		list_del_init(&dev->links.defer_sync);
117226e77708SSaravana Kannan 		__device_links_queue_sync_state(dev, &sync_list);
1173fc5a251dSSaravana Kannan 	}
1174fc5a251dSSaravana Kannan out:
1175fc5a251dSSaravana Kannan 	device_links_write_unlock();
117626e77708SSaravana Kannan 
117721eb93f4SSaravana Kannan 	device_links_flush_sync_list(&sync_list, NULL);
1178fc5a251dSSaravana Kannan }
1179fc5a251dSSaravana Kannan 
1180fc5a251dSSaravana Kannan static int sync_state_resume_initcall(void)
1181fc5a251dSSaravana Kannan {
1182fc5a251dSSaravana Kannan 	device_links_supplier_sync_state_resume();
1183fc5a251dSSaravana Kannan 	return 0;
1184fc5a251dSSaravana Kannan }
1185fc5a251dSSaravana Kannan late_initcall(sync_state_resume_initcall);
1186fc5a251dSSaravana Kannan 
1187fc5a251dSSaravana Kannan static void __device_links_supplier_defer_sync(struct device *sup)
1188fc5a251dSSaravana Kannan {
11893b052a3eSSaravana Kannan 	if (list_empty(&sup->links.defer_sync) && dev_has_sync_state(sup))
11903b052a3eSSaravana Kannan 		list_add_tail(&sup->links.defer_sync, &deferred_sync);
1191fc5a251dSSaravana Kannan }
1192fc5a251dSSaravana Kannan 
119321c27f06SSaravana Kannan static void device_link_drop_managed(struct device_link *link)
119421c27f06SSaravana Kannan {
119521c27f06SSaravana Kannan 	link->flags &= ~DL_FLAG_MANAGED;
119621c27f06SSaravana Kannan 	WRITE_ONCE(link->status, DL_STATE_NONE);
119721c27f06SSaravana Kannan 	kref_put(&link->kref, __device_link_del);
119821c27f06SSaravana Kannan }
119921c27f06SSaravana Kannan 
1200da6d6475SSaravana Kannan static ssize_t waiting_for_supplier_show(struct device *dev,
1201da6d6475SSaravana Kannan 					 struct device_attribute *attr,
1202da6d6475SSaravana Kannan 					 char *buf)
1203da6d6475SSaravana Kannan {
1204da6d6475SSaravana Kannan 	bool val;
1205da6d6475SSaravana Kannan 
1206da6d6475SSaravana Kannan 	device_lock(dev);
120725ac86c6SSaravana Kannan 	val = !list_empty(&dev->fwnode->suppliers);
1208da6d6475SSaravana Kannan 	device_unlock(dev);
1209aa838896SJoe Perches 	return sysfs_emit(buf, "%u\n", val);
1210da6d6475SSaravana Kannan }
1211da6d6475SSaravana Kannan static DEVICE_ATTR_RO(waiting_for_supplier);
1212da6d6475SSaravana Kannan 
12139ed98953SRafael J. Wysocki /**
1214b6f617dfSSaravana Kannan  * device_links_force_bind - Prepares device to be force bound
1215b6f617dfSSaravana Kannan  * @dev: Consumer device.
1216b6f617dfSSaravana Kannan  *
1217b6f617dfSSaravana Kannan  * device_bind_driver() force binds a device to a driver without calling any
1218b6f617dfSSaravana Kannan  * driver probe functions. So the consumer really isn't going to wait for any
1219b6f617dfSSaravana Kannan  * supplier before it's bound to the driver. We still want the device link
1220b6f617dfSSaravana Kannan  * states to be sensible when this happens.
1221b6f617dfSSaravana Kannan  *
1222b6f617dfSSaravana Kannan  * In preparation for device_bind_driver(), this function goes through each
1223b6f617dfSSaravana Kannan  * supplier device links and checks if the supplier is bound. If it is, then
1224b6f617dfSSaravana Kannan  * the device link status is set to CONSUMER_PROBE. Otherwise, the device link
1225b6f617dfSSaravana Kannan  * is dropped. Links without the DL_FLAG_MANAGED flag set are ignored.
1226b6f617dfSSaravana Kannan  */
1227b6f617dfSSaravana Kannan void device_links_force_bind(struct device *dev)
1228b6f617dfSSaravana Kannan {
1229b6f617dfSSaravana Kannan 	struct device_link *link, *ln;
1230b6f617dfSSaravana Kannan 
1231b6f617dfSSaravana Kannan 	device_links_write_lock();
1232b6f617dfSSaravana Kannan 
1233b6f617dfSSaravana Kannan 	list_for_each_entry_safe(link, ln, &dev->links.suppliers, c_node) {
1234b6f617dfSSaravana Kannan 		if (!(link->flags & DL_FLAG_MANAGED))
1235b6f617dfSSaravana Kannan 			continue;
1236b6f617dfSSaravana Kannan 
1237b6f617dfSSaravana Kannan 		if (link->status != DL_STATE_AVAILABLE) {
1238b6f617dfSSaravana Kannan 			device_link_drop_managed(link);
1239b6f617dfSSaravana Kannan 			continue;
1240b6f617dfSSaravana Kannan 		}
1241b6f617dfSSaravana Kannan 		WRITE_ONCE(link->status, DL_STATE_CONSUMER_PROBE);
1242b6f617dfSSaravana Kannan 	}
1243b6f617dfSSaravana Kannan 	dev->links.status = DL_DEV_PROBING;
1244b6f617dfSSaravana Kannan 
1245b6f617dfSSaravana Kannan 	device_links_write_unlock();
1246b6f617dfSSaravana Kannan }
1247b6f617dfSSaravana Kannan 
1248b6f617dfSSaravana Kannan /**
12499ed98953SRafael J. Wysocki  * device_links_driver_bound - Update device links after probing its driver.
12509ed98953SRafael J. Wysocki  * @dev: Device to update the links for.
12519ed98953SRafael J. Wysocki  *
12529ed98953SRafael J. Wysocki  * The probe has been successful, so update links from this device to any
12539ed98953SRafael J. Wysocki  * consumers by changing their status to "available".
12549ed98953SRafael J. Wysocki  *
12559ed98953SRafael J. Wysocki  * Also change the status of @dev's links to suppliers to "active".
12569ed98953SRafael J. Wysocki  *
1257515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
12589ed98953SRafael J. Wysocki  */
12599ed98953SRafael J. Wysocki void device_links_driver_bound(struct device *dev)
12609ed98953SRafael J. Wysocki {
126121c27f06SSaravana Kannan 	struct device_link *link, *ln;
126226e77708SSaravana Kannan 	LIST_HEAD(sync_list);
12639ed98953SRafael J. Wysocki 
1264bcbbcfd5SSaravana Kannan 	/*
12659528e0d9SSaravana Kannan 	 * If a device binds successfully, it's expected to have created all
1266bcbbcfd5SSaravana Kannan 	 * the device links it needs to or make new device links as it needs
12679528e0d9SSaravana Kannan 	 * them. So, fw_devlink no longer needs to create device links to any
12689528e0d9SSaravana Kannan 	 * of the device's suppliers.
12699528e0d9SSaravana Kannan 	 *
12709528e0d9SSaravana Kannan 	 * Also, if a child firmware node of this bound device is not added as
12719528e0d9SSaravana Kannan 	 * a device by now, assume it is never going to be added and make sure
12729528e0d9SSaravana Kannan 	 * other devices don't defer probe indefinitely by waiting for such a
12739528e0d9SSaravana Kannan 	 * child device.
1274bcbbcfd5SSaravana Kannan 	 */
12759528e0d9SSaravana Kannan 	if (dev->fwnode && dev->fwnode->dev == dev) {
12769528e0d9SSaravana Kannan 		struct fwnode_handle *child;
1277f9aa4606SSaravana Kannan 		fwnode_links_purge_suppliers(dev->fwnode);
12789528e0d9SSaravana Kannan 		fwnode_for_each_available_child_node(dev->fwnode, child)
12799528e0d9SSaravana Kannan 			fw_devlink_purge_absent_suppliers(child);
12809528e0d9SSaravana Kannan 	}
1281da6d6475SSaravana Kannan 	device_remove_file(dev, &dev_attr_waiting_for_supplier);
1282bcbbcfd5SSaravana Kannan 
12839ed98953SRafael J. Wysocki 	device_links_write_lock();
12849ed98953SRafael J. Wysocki 
12859ed98953SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.consumers, s_node) {
1286515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
12879ed98953SRafael J. Wysocki 			continue;
12889ed98953SRafael J. Wysocki 
128915cfb094SRafael J. Wysocki 		/*
129015cfb094SRafael J. Wysocki 		 * Links created during consumer probe may be in the "consumer
129115cfb094SRafael J. Wysocki 		 * probe" state to start with if the supplier is still probing
129215cfb094SRafael J. Wysocki 		 * when they are created and they may become "active" if the
129315cfb094SRafael J. Wysocki 		 * consumer probe returns first.  Skip them here.
129415cfb094SRafael J. Wysocki 		 */
129515cfb094SRafael J. Wysocki 		if (link->status == DL_STATE_CONSUMER_PROBE ||
129615cfb094SRafael J. Wysocki 		    link->status == DL_STATE_ACTIVE)
129715cfb094SRafael J. Wysocki 			continue;
129815cfb094SRafael J. Wysocki 
12999ed98953SRafael J. Wysocki 		WARN_ON(link->status != DL_STATE_DORMANT);
13009ed98953SRafael J. Wysocki 		WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
1301e7dd4010SRafael J. Wysocki 
1302e7dd4010SRafael J. Wysocki 		if (link->flags & DL_FLAG_AUTOPROBE_CONSUMER)
1303e7dd4010SRafael J. Wysocki 			driver_deferred_probe_add(link->consumer);
13049ed98953SRafael J. Wysocki 	}
13059ed98953SRafael J. Wysocki 
130621eb93f4SSaravana Kannan 	if (defer_sync_state_count)
130721eb93f4SSaravana Kannan 		__device_links_supplier_defer_sync(dev);
130821eb93f4SSaravana Kannan 	else
130921eb93f4SSaravana Kannan 		__device_links_queue_sync_state(dev, &sync_list);
131021eb93f4SSaravana Kannan 
131121c27f06SSaravana Kannan 	list_for_each_entry_safe(link, ln, &dev->links.suppliers, c_node) {
131221c27f06SSaravana Kannan 		struct device *supplier;
131321c27f06SSaravana Kannan 
1314515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
13159ed98953SRafael J. Wysocki 			continue;
13169ed98953SRafael J. Wysocki 
131721c27f06SSaravana Kannan 		supplier = link->supplier;
131821c27f06SSaravana Kannan 		if (link->flags & DL_FLAG_SYNC_STATE_ONLY) {
131921c27f06SSaravana Kannan 			/*
132021c27f06SSaravana Kannan 			 * When DL_FLAG_SYNC_STATE_ONLY is set, it means no
132121c27f06SSaravana Kannan 			 * other DL_MANAGED_LINK_FLAGS have been set. So, it's
132221c27f06SSaravana Kannan 			 * save to drop the managed link completely.
132321c27f06SSaravana Kannan 			 */
132421c27f06SSaravana Kannan 			device_link_drop_managed(link);
13252f8c3ae8SSaravana Kannan 		} else if (dev_is_best_effort(dev) &&
13262f8c3ae8SSaravana Kannan 			   link->flags & DL_FLAG_INFERRED &&
13272f8c3ae8SSaravana Kannan 			   link->status != DL_STATE_CONSUMER_PROBE &&
13282f8c3ae8SSaravana Kannan 			   !link->supplier->can_match) {
13292f8c3ae8SSaravana Kannan 			/*
13302f8c3ae8SSaravana Kannan 			 * When dev_is_best_effort() is true, we ignore device
13312f8c3ae8SSaravana Kannan 			 * links to suppliers that don't have a driver.  If the
13322f8c3ae8SSaravana Kannan 			 * consumer device still managed to probe, there's no
13332f8c3ae8SSaravana Kannan 			 * point in maintaining a device link in a weird state
13342f8c3ae8SSaravana Kannan 			 * (consumer probed before supplier). So delete it.
13352f8c3ae8SSaravana Kannan 			 */
13362f8c3ae8SSaravana Kannan 			device_link_drop_managed(link);
133721c27f06SSaravana Kannan 		} else {
13389ed98953SRafael J. Wysocki 			WARN_ON(link->status != DL_STATE_CONSUMER_PROBE);
13399ed98953SRafael J. Wysocki 			WRITE_ONCE(link->status, DL_STATE_ACTIVE);
134021c27f06SSaravana Kannan 		}
1341fc5a251dSSaravana Kannan 
134221c27f06SSaravana Kannan 		/*
134321c27f06SSaravana Kannan 		 * This needs to be done even for the deleted
134421c27f06SSaravana Kannan 		 * DL_FLAG_SYNC_STATE_ONLY device link in case it was the last
134521c27f06SSaravana Kannan 		 * device link that was preventing the supplier from getting a
134621c27f06SSaravana Kannan 		 * sync_state() call.
134721c27f06SSaravana Kannan 		 */
1348fc5a251dSSaravana Kannan 		if (defer_sync_state_count)
134921c27f06SSaravana Kannan 			__device_links_supplier_defer_sync(supplier);
1350fc5a251dSSaravana Kannan 		else
135121c27f06SSaravana Kannan 			__device_links_queue_sync_state(supplier, &sync_list);
13529ed98953SRafael J. Wysocki 	}
13539ed98953SRafael J. Wysocki 
13549ed98953SRafael J. Wysocki 	dev->links.status = DL_DEV_DRIVER_BOUND;
13559ed98953SRafael J. Wysocki 
13569ed98953SRafael J. Wysocki 	device_links_write_unlock();
135726e77708SSaravana Kannan 
135821eb93f4SSaravana Kannan 	device_links_flush_sync_list(&sync_list, dev);
13599ed98953SRafael J. Wysocki }
13609ed98953SRafael J. Wysocki 
13619ed98953SRafael J. Wysocki /**
13629ed98953SRafael J. Wysocki  * __device_links_no_driver - Update links of a device without a driver.
13639ed98953SRafael J. Wysocki  * @dev: Device without a drvier.
13649ed98953SRafael J. Wysocki  *
13659ed98953SRafael J. Wysocki  * Delete all non-persistent links from this device to any suppliers.
13669ed98953SRafael J. Wysocki  *
13679ed98953SRafael J. Wysocki  * Persistent links stay around, but their status is changed to "available",
13689ed98953SRafael J. Wysocki  * unless they already are in the "supplier unbind in progress" state in which
13699ed98953SRafael J. Wysocki  * case they need not be updated.
13709ed98953SRafael J. Wysocki  *
1371515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
13729ed98953SRafael J. Wysocki  */
13739ed98953SRafael J. Wysocki static void __device_links_no_driver(struct device *dev)
13749ed98953SRafael J. Wysocki {
13759ed98953SRafael J. Wysocki 	struct device_link *link, *ln;
13769ed98953SRafael J. Wysocki 
13779ed98953SRafael J. Wysocki 	list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, c_node) {
1378515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
13799ed98953SRafael J. Wysocki 			continue;
13809ed98953SRafael J. Wysocki 
13818c3e315dSSaravana Kannan 		if (link->flags & DL_FLAG_AUTOREMOVE_CONSUMER) {
1382515db266SRafael J. Wysocki 			device_link_drop_managed(link);
13838c3e315dSSaravana Kannan 			continue;
13848c3e315dSSaravana Kannan 		}
13858c3e315dSSaravana Kannan 
13868c3e315dSSaravana Kannan 		if (link->status != DL_STATE_CONSUMER_PROBE &&
13878c3e315dSSaravana Kannan 		    link->status != DL_STATE_ACTIVE)
13888c3e315dSSaravana Kannan 			continue;
13898c3e315dSSaravana Kannan 
13908c3e315dSSaravana Kannan 		if (link->supplier->links.status == DL_DEV_DRIVER_BOUND) {
13919ed98953SRafael J. Wysocki 			WRITE_ONCE(link->status, DL_STATE_AVAILABLE);
13928c3e315dSSaravana Kannan 		} else {
13938c3e315dSSaravana Kannan 			WARN_ON(!(link->flags & DL_FLAG_SYNC_STATE_ONLY));
13948c3e315dSSaravana Kannan 			WRITE_ONCE(link->status, DL_STATE_DORMANT);
13958c3e315dSSaravana Kannan 		}
13969ed98953SRafael J. Wysocki 	}
13979ed98953SRafael J. Wysocki 
13989ed98953SRafael J. Wysocki 	dev->links.status = DL_DEV_NO_DRIVER;
13999ed98953SRafael J. Wysocki }
14009ed98953SRafael J. Wysocki 
140115cfb094SRafael J. Wysocki /**
140215cfb094SRafael J. Wysocki  * device_links_no_driver - Update links after failing driver probe.
140315cfb094SRafael J. Wysocki  * @dev: Device whose driver has just failed to probe.
140415cfb094SRafael J. Wysocki  *
140515cfb094SRafael J. Wysocki  * Clean up leftover links to consumers for @dev and invoke
140615cfb094SRafael J. Wysocki  * %__device_links_no_driver() to update links to suppliers for it as
140715cfb094SRafael J. Wysocki  * appropriate.
140815cfb094SRafael J. Wysocki  *
1409515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
141015cfb094SRafael J. Wysocki  */
14119ed98953SRafael J. Wysocki void device_links_no_driver(struct device *dev)
14129ed98953SRafael J. Wysocki {
141315cfb094SRafael J. Wysocki 	struct device_link *link;
141415cfb094SRafael J. Wysocki 
14159ed98953SRafael J. Wysocki 	device_links_write_lock();
141615cfb094SRafael J. Wysocki 
141715cfb094SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.consumers, s_node) {
1418515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
141915cfb094SRafael J. Wysocki 			continue;
142015cfb094SRafael J. Wysocki 
142115cfb094SRafael J. Wysocki 		/*
142215cfb094SRafael J. Wysocki 		 * The probe has failed, so if the status of the link is
142315cfb094SRafael J. Wysocki 		 * "consumer probe" or "active", it must have been added by
142415cfb094SRafael J. Wysocki 		 * a probing consumer while this device was still probing.
142515cfb094SRafael J. Wysocki 		 * Change its state to "dormant", as it represents a valid
142615cfb094SRafael J. Wysocki 		 * relationship, but it is not functionally meaningful.
142715cfb094SRafael J. Wysocki 		 */
142815cfb094SRafael J. Wysocki 		if (link->status == DL_STATE_CONSUMER_PROBE ||
142915cfb094SRafael J. Wysocki 		    link->status == DL_STATE_ACTIVE)
143015cfb094SRafael J. Wysocki 			WRITE_ONCE(link->status, DL_STATE_DORMANT);
143115cfb094SRafael J. Wysocki 	}
143215cfb094SRafael J. Wysocki 
14339ed98953SRafael J. Wysocki 	__device_links_no_driver(dev);
143415cfb094SRafael J. Wysocki 
14359ed98953SRafael J. Wysocki 	device_links_write_unlock();
14369ed98953SRafael J. Wysocki }
14379ed98953SRafael J. Wysocki 
14389ed98953SRafael J. Wysocki /**
14399ed98953SRafael J. Wysocki  * device_links_driver_cleanup - Update links after driver removal.
14409ed98953SRafael J. Wysocki  * @dev: Device whose driver has just gone away.
14419ed98953SRafael J. Wysocki  *
14429ed98953SRafael J. Wysocki  * Update links to consumers for @dev by changing their status to "dormant" and
14439ed98953SRafael J. Wysocki  * invoke %__device_links_no_driver() to update links to suppliers for it as
14449ed98953SRafael J. Wysocki  * appropriate.
14459ed98953SRafael J. Wysocki  *
1446515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
14479ed98953SRafael J. Wysocki  */
14489ed98953SRafael J. Wysocki void device_links_driver_cleanup(struct device *dev)
14499ed98953SRafael J. Wysocki {
1450c8d50986SRafael J. Wysocki 	struct device_link *link, *ln;
14519ed98953SRafael J. Wysocki 
14529ed98953SRafael J. Wysocki 	device_links_write_lock();
14539ed98953SRafael J. Wysocki 
1454c8d50986SRafael J. Wysocki 	list_for_each_entry_safe(link, ln, &dev->links.consumers, s_node) {
1455515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
14569ed98953SRafael J. Wysocki 			continue;
14579ed98953SRafael J. Wysocki 
1458e88728f4SVivek Gautam 		WARN_ON(link->flags & DL_FLAG_AUTOREMOVE_CONSUMER);
14599ed98953SRafael J. Wysocki 		WARN_ON(link->status != DL_STATE_SUPPLIER_UNBIND);
14601689cac5SVivek Gautam 
14611689cac5SVivek Gautam 		/*
14621689cac5SVivek Gautam 		 * autoremove the links between this @dev and its consumer
14631689cac5SVivek Gautam 		 * devices that are not active, i.e. where the link state
14641689cac5SVivek Gautam 		 * has moved to DL_STATE_SUPPLIER_UNBIND.
14651689cac5SVivek Gautam 		 */
14661689cac5SVivek Gautam 		if (link->status == DL_STATE_SUPPLIER_UNBIND &&
14671689cac5SVivek Gautam 		    link->flags & DL_FLAG_AUTOREMOVE_SUPPLIER)
1468515db266SRafael J. Wysocki 			device_link_drop_managed(link);
14691689cac5SVivek Gautam 
14709ed98953SRafael J. Wysocki 		WRITE_ONCE(link->status, DL_STATE_DORMANT);
14719ed98953SRafael J. Wysocki 	}
14729ed98953SRafael J. Wysocki 
14733b052a3eSSaravana Kannan 	list_del_init(&dev->links.defer_sync);
14749ed98953SRafael J. Wysocki 	__device_links_no_driver(dev);
14759ed98953SRafael J. Wysocki 
14769ed98953SRafael J. Wysocki 	device_links_write_unlock();
14779ed98953SRafael J. Wysocki }
14789ed98953SRafael J. Wysocki 
14799ed98953SRafael J. Wysocki /**
14809ed98953SRafael J. Wysocki  * device_links_busy - Check if there are any busy links to consumers.
14819ed98953SRafael J. Wysocki  * @dev: Device to check.
14829ed98953SRafael J. Wysocki  *
14839ed98953SRafael J. Wysocki  * Check each consumer of the device and return 'true' if its link's status
14849ed98953SRafael J. Wysocki  * is one of "consumer probe" or "active" (meaning that the given consumer is
14859ed98953SRafael J. Wysocki  * probing right now or its driver is present).  Otherwise, change the link
14869ed98953SRafael J. Wysocki  * state to "supplier unbind" to prevent the consumer from being probed
14879ed98953SRafael J. Wysocki  * successfully going forward.
14889ed98953SRafael J. Wysocki  *
14899ed98953SRafael J. Wysocki  * Return 'false' if there are no probing or active consumers.
14909ed98953SRafael J. Wysocki  *
1491515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
14929ed98953SRafael J. Wysocki  */
14939ed98953SRafael J. Wysocki bool device_links_busy(struct device *dev)
14949ed98953SRafael J. Wysocki {
14959ed98953SRafael J. Wysocki 	struct device_link *link;
14969ed98953SRafael J. Wysocki 	bool ret = false;
14979ed98953SRafael J. Wysocki 
14989ed98953SRafael J. Wysocki 	device_links_write_lock();
14999ed98953SRafael J. Wysocki 
15009ed98953SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.consumers, s_node) {
1501515db266SRafael J. Wysocki 		if (!(link->flags & DL_FLAG_MANAGED))
15029ed98953SRafael J. Wysocki 			continue;
15039ed98953SRafael J. Wysocki 
15049ed98953SRafael J. Wysocki 		if (link->status == DL_STATE_CONSUMER_PROBE
15059ed98953SRafael J. Wysocki 		    || link->status == DL_STATE_ACTIVE) {
15069ed98953SRafael J. Wysocki 			ret = true;
15079ed98953SRafael J. Wysocki 			break;
15089ed98953SRafael J. Wysocki 		}
15099ed98953SRafael J. Wysocki 		WRITE_ONCE(link->status, DL_STATE_SUPPLIER_UNBIND);
15109ed98953SRafael J. Wysocki 	}
15119ed98953SRafael J. Wysocki 
15129ed98953SRafael J. Wysocki 	dev->links.status = DL_DEV_UNBINDING;
15139ed98953SRafael J. Wysocki 
15149ed98953SRafael J. Wysocki 	device_links_write_unlock();
15159ed98953SRafael J. Wysocki 	return ret;
15169ed98953SRafael J. Wysocki }
15179ed98953SRafael J. Wysocki 
15189ed98953SRafael J. Wysocki /**
15199ed98953SRafael J. Wysocki  * device_links_unbind_consumers - Force unbind consumers of the given device.
15209ed98953SRafael J. Wysocki  * @dev: Device to unbind the consumers of.
15219ed98953SRafael J. Wysocki  *
15229ed98953SRafael J. Wysocki  * Walk the list of links to consumers for @dev and if any of them is in the
15239ed98953SRafael J. Wysocki  * "consumer probe" state, wait for all device probes in progress to complete
15249ed98953SRafael J. Wysocki  * and start over.
15259ed98953SRafael J. Wysocki  *
15269ed98953SRafael J. Wysocki  * If that's not the case, change the status of the link to "supplier unbind"
15279ed98953SRafael J. Wysocki  * and check if the link was in the "active" state.  If so, force the consumer
15289ed98953SRafael J. Wysocki  * driver to unbind and start over (the consumer will not re-probe as we have
15299ed98953SRafael J. Wysocki  * changed the state of the link already).
15309ed98953SRafael J. Wysocki  *
1531515db266SRafael J. Wysocki  * Links without the DL_FLAG_MANAGED flag set are ignored.
15329ed98953SRafael J. Wysocki  */
15339ed98953SRafael J. Wysocki void device_links_unbind_consumers(struct device *dev)
15349ed98953SRafael J. Wysocki {
15359ed98953SRafael J. Wysocki 	struct device_link *link;
15369ed98953SRafael J. Wysocki 
15379ed98953SRafael J. Wysocki  start:
15389ed98953SRafael J. Wysocki 	device_links_write_lock();
15399ed98953SRafael J. Wysocki 
15409ed98953SRafael J. Wysocki 	list_for_each_entry(link, &dev->links.consumers, s_node) {
15419ed98953SRafael J. Wysocki 		enum device_link_state status;
15429ed98953SRafael J. Wysocki 
154305ef983eSSaravana Kannan 		if (!(link->flags & DL_FLAG_MANAGED) ||
154405ef983eSSaravana Kannan 		    link->flags & DL_FLAG_SYNC_STATE_ONLY)
15459ed98953SRafael J. Wysocki 			continue;
15469ed98953SRafael J. Wysocki 
15479ed98953SRafael J. Wysocki 		status = link->status;
15489ed98953SRafael J. Wysocki 		if (status == DL_STATE_CONSUMER_PROBE) {
15499ed98953SRafael J. Wysocki 			device_links_write_unlock();
15509ed98953SRafael J. Wysocki 
15519ed98953SRafael J. Wysocki 			wait_for_device_probe();
15529ed98953SRafael J. Wysocki 			goto start;
15539ed98953SRafael J. Wysocki 		}
15549ed98953SRafael J. Wysocki 		WRITE_ONCE(link->status, DL_STATE_SUPPLIER_UNBIND);
15559ed98953SRafael J. Wysocki 		if (status == DL_STATE_ACTIVE) {
15569ed98953SRafael J. Wysocki 			struct device *consumer = link->consumer;
15579ed98953SRafael J. Wysocki 
15589ed98953SRafael J. Wysocki 			get_device(consumer);
15599ed98953SRafael J. Wysocki 
15609ed98953SRafael J. Wysocki 			device_links_write_unlock();
15619ed98953SRafael J. Wysocki 
15629ed98953SRafael J. Wysocki 			device_release_driver_internal(consumer, NULL,
15639ed98953SRafael J. Wysocki 						       consumer->parent);
15649ed98953SRafael J. Wysocki 			put_device(consumer);
15659ed98953SRafael J. Wysocki 			goto start;
15669ed98953SRafael J. Wysocki 		}
15679ed98953SRafael J. Wysocki 	}
15689ed98953SRafael J. Wysocki 
15699ed98953SRafael J. Wysocki 	device_links_write_unlock();
15709ed98953SRafael J. Wysocki }
15719ed98953SRafael J. Wysocki 
15729ed98953SRafael J. Wysocki /**
15739ed98953SRafael J. Wysocki  * device_links_purge - Delete existing links to other devices.
15749ed98953SRafael J. Wysocki  * @dev: Target device.
15759ed98953SRafael J. Wysocki  */
15769ed98953SRafael J. Wysocki static void device_links_purge(struct device *dev)
15779ed98953SRafael J. Wysocki {
15789ed98953SRafael J. Wysocki 	struct device_link *link, *ln;
15799ed98953SRafael J. Wysocki 
1580287905e6SSaravana Kannan 	if (dev->class == &devlink_class)
1581287905e6SSaravana Kannan 		return;
1582287905e6SSaravana Kannan 
15839ed98953SRafael J. Wysocki 	/*
15849ed98953SRafael J. Wysocki 	 * Delete all of the remaining links from this device to any other
15859ed98953SRafael J. Wysocki 	 * devices (either consumers or suppliers).
15869ed98953SRafael J. Wysocki 	 */
15879ed98953SRafael J. Wysocki 	device_links_write_lock();
15889ed98953SRafael J. Wysocki 
15899ed98953SRafael J. Wysocki 	list_for_each_entry_safe_reverse(link, ln, &dev->links.suppliers, c_node) {
15909ed98953SRafael J. Wysocki 		WARN_ON(link->status == DL_STATE_ACTIVE);
1591ead18c23SLukas Wunner 		__device_link_del(&link->kref);
15929ed98953SRafael J. Wysocki 	}
15939ed98953SRafael J. Wysocki 
15949ed98953SRafael J. Wysocki 	list_for_each_entry_safe_reverse(link, ln, &dev->links.consumers, s_node) {
15959ed98953SRafael J. Wysocki 		WARN_ON(link->status != DL_STATE_DORMANT &&
15969ed98953SRafael J. Wysocki 			link->status != DL_STATE_NONE);
1597ead18c23SLukas Wunner 		__device_link_del(&link->kref);
15989ed98953SRafael J. Wysocki 	}
15999ed98953SRafael J. Wysocki 
16009ed98953SRafael J. Wysocki 	device_links_write_unlock();
16019ed98953SRafael J. Wysocki }
16029ed98953SRafael J. Wysocki 
1603b90fb8f6SSaravana Kannan #define FW_DEVLINK_FLAGS_PERMISSIVE	(DL_FLAG_INFERRED | \
1604b90fb8f6SSaravana Kannan 					 DL_FLAG_SYNC_STATE_ONLY)
1605b90fb8f6SSaravana Kannan #define FW_DEVLINK_FLAGS_ON		(DL_FLAG_INFERRED | \
1606b90fb8f6SSaravana Kannan 					 DL_FLAG_AUTOPROBE_CONSUMER)
1607b90fb8f6SSaravana Kannan #define FW_DEVLINK_FLAGS_RPM		(FW_DEVLINK_FLAGS_ON | \
1608b90fb8f6SSaravana Kannan 					 DL_FLAG_PM_RUNTIME)
1609b90fb8f6SSaravana Kannan 
1610ea718c69SSaravana Kannan static u32 fw_devlink_flags = FW_DEVLINK_FLAGS_ON;
161142926ac3SSaravana Kannan static int __init fw_devlink_setup(char *arg)
161242926ac3SSaravana Kannan {
161342926ac3SSaravana Kannan 	if (!arg)
161442926ac3SSaravana Kannan 		return -EINVAL;
161542926ac3SSaravana Kannan 
161642926ac3SSaravana Kannan 	if (strcmp(arg, "off") == 0) {
161742926ac3SSaravana Kannan 		fw_devlink_flags = 0;
161842926ac3SSaravana Kannan 	} else if (strcmp(arg, "permissive") == 0) {
1619b90fb8f6SSaravana Kannan 		fw_devlink_flags = FW_DEVLINK_FLAGS_PERMISSIVE;
162042926ac3SSaravana Kannan 	} else if (strcmp(arg, "on") == 0) {
1621b90fb8f6SSaravana Kannan 		fw_devlink_flags = FW_DEVLINK_FLAGS_ON;
162242926ac3SSaravana Kannan 	} else if (strcmp(arg, "rpm") == 0) {
1623b90fb8f6SSaravana Kannan 		fw_devlink_flags = FW_DEVLINK_FLAGS_RPM;
162442926ac3SSaravana Kannan 	}
162542926ac3SSaravana Kannan 	return 0;
162642926ac3SSaravana Kannan }
162742926ac3SSaravana Kannan early_param("fw_devlink", fw_devlink_setup);
162842926ac3SSaravana Kannan 
1629d8ab4685SGreg Kroah-Hartman static bool fw_devlink_strict;
163019d0f5f6SSaravana Kannan static int __init fw_devlink_strict_setup(char *arg)
163119d0f5f6SSaravana Kannan {
163273060022SChristophe JAILLET 	return kstrtobool(arg, &fw_devlink_strict);
163319d0f5f6SSaravana Kannan }
163419d0f5f6SSaravana Kannan early_param("fw_devlink.strict", fw_devlink_strict_setup);
163519d0f5f6SSaravana Kannan 
163642926ac3SSaravana Kannan u32 fw_devlink_get_flags(void)
163742926ac3SSaravana Kannan {
163842926ac3SSaravana Kannan 	return fw_devlink_flags;
163942926ac3SSaravana Kannan }
164042926ac3SSaravana Kannan 
164142926ac3SSaravana Kannan static bool fw_devlink_is_permissive(void)
164242926ac3SSaravana Kannan {
1643b90fb8f6SSaravana Kannan 	return fw_devlink_flags == FW_DEVLINK_FLAGS_PERMISSIVE;
164442926ac3SSaravana Kannan }
164542926ac3SSaravana Kannan 
164619d0f5f6SSaravana Kannan bool fw_devlink_is_strict(void)
164719d0f5f6SSaravana Kannan {
164819d0f5f6SSaravana Kannan 	return fw_devlink_strict && !fw_devlink_is_permissive();
16499ed98953SRafael J. Wysocki }
16509ed98953SRafael J. Wysocki 
1651c2c724c8SSaravana Kannan static void fw_devlink_parse_fwnode(struct fwnode_handle *fwnode)
1652c2c724c8SSaravana Kannan {
1653c2c724c8SSaravana Kannan 	if (fwnode->flags & FWNODE_FLAG_LINKS_ADDED)
1654c2c724c8SSaravana Kannan 		return;
1655c2c724c8SSaravana Kannan 
16562d09e6ebSSaravana Kannan 	fwnode_call_int_op(fwnode, add_links);
1657c2c724c8SSaravana Kannan 	fwnode->flags |= FWNODE_FLAG_LINKS_ADDED;
1658c2c724c8SSaravana Kannan }
1659c2c724c8SSaravana Kannan 
1660c2c724c8SSaravana Kannan static void fw_devlink_parse_fwtree(struct fwnode_handle *fwnode)
1661c2c724c8SSaravana Kannan {
1662c2c724c8SSaravana Kannan 	struct fwnode_handle *child = NULL;
1663c2c724c8SSaravana Kannan 
1664c2c724c8SSaravana Kannan 	fw_devlink_parse_fwnode(fwnode);
1665c2c724c8SSaravana Kannan 
1666c2c724c8SSaravana Kannan 	while ((child = fwnode_get_next_available_child_node(fwnode, child)))
1667c2c724c8SSaravana Kannan 		fw_devlink_parse_fwtree(child);
1668c2c724c8SSaravana Kannan }
1669c2c724c8SSaravana Kannan 
1670d46f3e3eSSaravana Kannan static void fw_devlink_relax_link(struct device_link *link)
1671d46f3e3eSSaravana Kannan {
1672d46f3e3eSSaravana Kannan 	if (!(link->flags & DL_FLAG_INFERRED))
1673d46f3e3eSSaravana Kannan 		return;
1674d46f3e3eSSaravana Kannan 
1675d46f3e3eSSaravana Kannan 	if (link->flags == (DL_FLAG_MANAGED | FW_DEVLINK_FLAGS_PERMISSIVE))
1676d46f3e3eSSaravana Kannan 		return;
1677d46f3e3eSSaravana Kannan 
1678d46f3e3eSSaravana Kannan 	pm_runtime_drop_link(link);
1679d46f3e3eSSaravana Kannan 	link->flags = DL_FLAG_MANAGED | FW_DEVLINK_FLAGS_PERMISSIVE;
1680d46f3e3eSSaravana Kannan 	dev_dbg(link->consumer, "Relaxing link with %s\n",
1681d46f3e3eSSaravana Kannan 		dev_name(link->supplier));
1682d46f3e3eSSaravana Kannan }
1683d46f3e3eSSaravana Kannan 
1684d46f3e3eSSaravana Kannan static int fw_devlink_no_driver(struct device *dev, void *data)
1685d46f3e3eSSaravana Kannan {
1686d46f3e3eSSaravana Kannan 	struct device_link *link = to_devlink(dev);
1687d46f3e3eSSaravana Kannan 
1688d46f3e3eSSaravana Kannan 	if (!link->supplier->can_match)
1689d46f3e3eSSaravana Kannan 		fw_devlink_relax_link(link);
1690d46f3e3eSSaravana Kannan 
1691d46f3e3eSSaravana Kannan 	return 0;
1692d46f3e3eSSaravana Kannan }
1693d46f3e3eSSaravana Kannan 
1694d46f3e3eSSaravana Kannan void fw_devlink_drivers_done(void)
1695d46f3e3eSSaravana Kannan {
1696d46f3e3eSSaravana Kannan 	fw_devlink_drv_reg_done = true;
1697d46f3e3eSSaravana Kannan 	device_links_write_lock();
1698d46f3e3eSSaravana Kannan 	class_for_each_device(&devlink_class, NULL, NULL,
1699d46f3e3eSSaravana Kannan 			      fw_devlink_no_driver);
1700d46f3e3eSSaravana Kannan 	device_links_write_unlock();
1701d46f3e3eSSaravana Kannan }
1702d46f3e3eSSaravana Kannan 
17032f8c3ae8SSaravana Kannan /**
17042f8c3ae8SSaravana Kannan  * wait_for_init_devices_probe - Try to probe any device needed for init
17052f8c3ae8SSaravana Kannan  *
17062f8c3ae8SSaravana Kannan  * Some devices might need to be probed and bound successfully before the kernel
17072f8c3ae8SSaravana Kannan  * boot sequence can finish and move on to init/userspace. For example, a
17082f8c3ae8SSaravana Kannan  * network interface might need to be bound to be able to mount a NFS rootfs.
17092f8c3ae8SSaravana Kannan  *
17102f8c3ae8SSaravana Kannan  * With fw_devlink=on by default, some of these devices might be blocked from
17112f8c3ae8SSaravana Kannan  * probing because they are waiting on a optional supplier that doesn't have a
17122f8c3ae8SSaravana Kannan  * driver. While fw_devlink will eventually identify such devices and unblock
17132f8c3ae8SSaravana Kannan  * the probing automatically, it might be too late by the time it unblocks the
17142f8c3ae8SSaravana Kannan  * probing of devices. For example, the IP4 autoconfig might timeout before
17152f8c3ae8SSaravana Kannan  * fw_devlink unblocks probing of the network interface.
17162f8c3ae8SSaravana Kannan  *
17172f8c3ae8SSaravana Kannan  * This function is available to temporarily try and probe all devices that have
17182f8c3ae8SSaravana Kannan  * a driver even if some of their suppliers haven't been added or don't have
17192f8c3ae8SSaravana Kannan  * drivers.
17202f8c3ae8SSaravana Kannan  *
17212f8c3ae8SSaravana Kannan  * The drivers can then decide which of the suppliers are optional vs mandatory
17222f8c3ae8SSaravana Kannan  * and probe the device if possible. By the time this function returns, all such
17232f8c3ae8SSaravana Kannan  * "best effort" probes are guaranteed to be completed. If a device successfully
17242f8c3ae8SSaravana Kannan  * probes in this mode, we delete all fw_devlink discovered dependencies of that
17252f8c3ae8SSaravana Kannan  * device where the supplier hasn't yet probed successfully because they have to
17262f8c3ae8SSaravana Kannan  * be optional dependencies.
17272f8c3ae8SSaravana Kannan  *
17282f8c3ae8SSaravana Kannan  * Any devices that didn't successfully probe go back to being treated as if
17292f8c3ae8SSaravana Kannan  * this function was never called.
17302f8c3ae8SSaravana Kannan  *
17312f8c3ae8SSaravana Kannan  * This also means that some devices that aren't needed for init and could have
17322f8c3ae8SSaravana Kannan  * waited for their optional supplier to probe (when the supplier's module is
17332f8c3ae8SSaravana Kannan  * loaded later on) would end up probing prematurely with limited functionality.
17342f8c3ae8SSaravana Kannan  * So call this function only when boot would fail without it.
17352f8c3ae8SSaravana Kannan  */
17362f8c3ae8SSaravana Kannan void __init wait_for_init_devices_probe(void)
17372f8c3ae8SSaravana Kannan {
17382f8c3ae8SSaravana Kannan 	if (!fw_devlink_flags || fw_devlink_is_permissive())
17392f8c3ae8SSaravana Kannan 		return;
17402f8c3ae8SSaravana Kannan 
17412f8c3ae8SSaravana Kannan 	/*
17422f8c3ae8SSaravana Kannan 	 * Wait for all ongoing probes to finish so that the "best effort" is
17432f8c3ae8SSaravana Kannan 	 * only applied to devices that can't probe otherwise.
17442f8c3ae8SSaravana Kannan 	 */
17452f8c3ae8SSaravana Kannan 	wait_for_device_probe();
17462f8c3ae8SSaravana Kannan 
17472f8c3ae8SSaravana Kannan 	pr_info("Trying to probe devices needed for running init ...\n");
17482f8c3ae8SSaravana Kannan 	fw_devlink_best_effort = true;
17492f8c3ae8SSaravana Kannan 	driver_deferred_probe_trigger();
17502f8c3ae8SSaravana Kannan 
17512f8c3ae8SSaravana Kannan 	/*
17522f8c3ae8SSaravana Kannan 	 * Wait for all "best effort" probes to finish before going back to
17532f8c3ae8SSaravana Kannan 	 * normal enforcement.
17542f8c3ae8SSaravana Kannan 	 */
17552f8c3ae8SSaravana Kannan 	wait_for_device_probe();
17562f8c3ae8SSaravana Kannan 	fw_devlink_best_effort = false;
17572f8c3ae8SSaravana Kannan }
17582f8c3ae8SSaravana Kannan 
1759d46f3e3eSSaravana Kannan static void fw_devlink_unblock_consumers(struct device *dev)
1760d46f3e3eSSaravana Kannan {
1761d46f3e3eSSaravana Kannan 	struct device_link *link;
1762d46f3e3eSSaravana Kannan 
1763d46f3e3eSSaravana Kannan 	if (!fw_devlink_flags || fw_devlink_is_permissive())
1764d46f3e3eSSaravana Kannan 		return;
1765d46f3e3eSSaravana Kannan 
1766d46f3e3eSSaravana Kannan 	device_links_write_lock();
1767d46f3e3eSSaravana Kannan 	list_for_each_entry(link, &dev->links.consumers, s_node)
1768d46f3e3eSSaravana Kannan 		fw_devlink_relax_link(link);
1769d46f3e3eSSaravana Kannan 	device_links_write_unlock();
1770d46f3e3eSSaravana Kannan }
1771d46f3e3eSSaravana Kannan 
1772f9aa4606SSaravana Kannan /**
1773b0e2fa4fSSaravana Kannan  * fw_devlink_relax_cycle - Convert cyclic links to SYNC_STATE_ONLY links
1774b0e2fa4fSSaravana Kannan  * @con: Device to check dependencies for.
1775b0e2fa4fSSaravana Kannan  * @sup: Device to check against.
1776b0e2fa4fSSaravana Kannan  *
1777b0e2fa4fSSaravana Kannan  * Check if @sup depends on @con or any device dependent on it (its child or
1778b0e2fa4fSSaravana Kannan  * its consumer etc).  When such a cyclic dependency is found, convert all
1779b0e2fa4fSSaravana Kannan  * device links created solely by fw_devlink into SYNC_STATE_ONLY device links.
1780b0e2fa4fSSaravana Kannan  * This is the equivalent of doing fw_devlink=permissive just between the
1781b0e2fa4fSSaravana Kannan  * devices in the cycle. We need to do this because, at this point, fw_devlink
1782b0e2fa4fSSaravana Kannan  * can't tell which of these dependencies is not a real dependency.
1783b0e2fa4fSSaravana Kannan  *
1784b0e2fa4fSSaravana Kannan  * Return 1 if a cycle is found. Otherwise, return 0.
1785b0e2fa4fSSaravana Kannan  */
1786c13b8279Skernel test robot static int fw_devlink_relax_cycle(struct device *con, void *sup)
1787b0e2fa4fSSaravana Kannan {
1788b0e2fa4fSSaravana Kannan 	struct device_link *link;
1789b0e2fa4fSSaravana Kannan 	int ret;
1790b0e2fa4fSSaravana Kannan 
1791b0e2fa4fSSaravana Kannan 	if (con == sup)
1792b0e2fa4fSSaravana Kannan 		return 1;
1793b0e2fa4fSSaravana Kannan 
1794b0e2fa4fSSaravana Kannan 	ret = device_for_each_child(con, sup, fw_devlink_relax_cycle);
1795b0e2fa4fSSaravana Kannan 	if (ret)
1796b0e2fa4fSSaravana Kannan 		return ret;
1797b0e2fa4fSSaravana Kannan 
1798b0e2fa4fSSaravana Kannan 	list_for_each_entry(link, &con->links.consumers, s_node) {
1799b0e2fa4fSSaravana Kannan 		if ((link->flags & ~DL_FLAG_INFERRED) ==
1800b0e2fa4fSSaravana Kannan 		    (DL_FLAG_SYNC_STATE_ONLY | DL_FLAG_MANAGED))
1801b0e2fa4fSSaravana Kannan 			continue;
1802b0e2fa4fSSaravana Kannan 
1803b0e2fa4fSSaravana Kannan 		if (!fw_devlink_relax_cycle(link->consumer, sup))
1804b0e2fa4fSSaravana Kannan 			continue;
1805b0e2fa4fSSaravana Kannan 
1806b0e2fa4fSSaravana Kannan 		ret = 1;
1807b0e2fa4fSSaravana Kannan 
1808d46f3e3eSSaravana Kannan 		fw_devlink_relax_link(link);
1809b0e2fa4fSSaravana Kannan 	}
1810b0e2fa4fSSaravana Kannan 	return ret;
1811b0e2fa4fSSaravana Kannan }
1812b0e2fa4fSSaravana Kannan 
1813b0e2fa4fSSaravana Kannan /**
1814f9aa4606SSaravana Kannan  * fw_devlink_create_devlink - Create a device link from a consumer to fwnode
181537c52f74SPierre-Louis Bossart  * @con: consumer device for the device link
181637c52f74SPierre-Louis Bossart  * @sup_handle: fwnode handle of supplier
181737c52f74SPierre-Louis Bossart  * @flags: devlink flags
1818f9aa4606SSaravana Kannan  *
1819f9aa4606SSaravana Kannan  * This function will try to create a device link between the consumer device
1820f9aa4606SSaravana Kannan  * @con and the supplier device represented by @sup_handle.
1821f9aa4606SSaravana Kannan  *
1822f9aa4606SSaravana Kannan  * The supplier has to be provided as a fwnode because incorrect cycles in
1823f9aa4606SSaravana Kannan  * fwnode links can sometimes cause the supplier device to never be created.
1824f9aa4606SSaravana Kannan  * This function detects such cases and returns an error if it cannot create a
1825f9aa4606SSaravana Kannan  * device link from the consumer to a missing supplier.
1826f9aa4606SSaravana Kannan  *
1827f9aa4606SSaravana Kannan  * Returns,
1828f9aa4606SSaravana Kannan  * 0 on successfully creating a device link
1829f9aa4606SSaravana Kannan  * -EINVAL if the device link cannot be created as expected
1830f9aa4606SSaravana Kannan  * -EAGAIN if the device link cannot be created right now, but it may be
1831f9aa4606SSaravana Kannan  *  possible to do that in the future
1832f9aa4606SSaravana Kannan  */
1833f9aa4606SSaravana Kannan static int fw_devlink_create_devlink(struct device *con,
1834f9aa4606SSaravana Kannan 				     struct fwnode_handle *sup_handle, u32 flags)
1835f9aa4606SSaravana Kannan {
1836f9aa4606SSaravana Kannan 	struct device *sup_dev;
1837f9aa4606SSaravana Kannan 	int ret = 0;
1838f9aa4606SSaravana Kannan 
18395501765aSSaravana Kannan 	/*
18405501765aSSaravana Kannan 	 * In some cases, a device P might also be a supplier to its child node
18415501765aSSaravana Kannan 	 * C. However, this would defer the probe of C until the probe of P
18425501765aSSaravana Kannan 	 * completes successfully. This is perfectly fine in the device driver
18435501765aSSaravana Kannan 	 * model. device_add() doesn't guarantee probe completion of the device
18445501765aSSaravana Kannan 	 * by the time it returns.
18455501765aSSaravana Kannan 	 *
18465501765aSSaravana Kannan 	 * However, there are a few drivers that assume C will finish probing
18475501765aSSaravana Kannan 	 * as soon as it's added and before P finishes probing. So, we provide
18485501765aSSaravana Kannan 	 * a flag to let fw_devlink know not to delay the probe of C until the
18495501765aSSaravana Kannan 	 * probe of P completes successfully.
18505501765aSSaravana Kannan 	 *
18515501765aSSaravana Kannan 	 * When such a flag is set, we can't create device links where P is the
18525501765aSSaravana Kannan 	 * supplier of C as that would delay the probe of C.
18535501765aSSaravana Kannan 	 */
18545501765aSSaravana Kannan 	if (sup_handle->flags & FWNODE_FLAG_NEEDS_CHILD_BOUND_ON_ADD &&
18555501765aSSaravana Kannan 	    fwnode_is_ancestor_of(sup_handle, con->fwnode))
18565501765aSSaravana Kannan 		return -EINVAL;
18575501765aSSaravana Kannan 
1858f9aa4606SSaravana Kannan 	sup_dev = get_dev_from_fwnode(sup_handle);
1859f9aa4606SSaravana Kannan 	if (sup_dev) {
1860f9aa4606SSaravana Kannan 		/*
186174c782cfSSaravana Kannan 		 * If it's one of those drivers that don't actually bind to
186274c782cfSSaravana Kannan 		 * their device using driver core, then don't wait on this
186374c782cfSSaravana Kannan 		 * supplier device indefinitely.
186474c782cfSSaravana Kannan 		 */
186574c782cfSSaravana Kannan 		if (sup_dev->links.status == DL_DEV_NO_DRIVER &&
186674c782cfSSaravana Kannan 		    sup_handle->flags & FWNODE_FLAG_INITIALIZED) {
186774c782cfSSaravana Kannan 			ret = -EINVAL;
186874c782cfSSaravana Kannan 			goto out;
186974c782cfSSaravana Kannan 		}
187074c782cfSSaravana Kannan 
187174c782cfSSaravana Kannan 		/*
1872f9aa4606SSaravana Kannan 		 * If this fails, it is due to cycles in device links.  Just
1873f9aa4606SSaravana Kannan 		 * give up on this link and treat it as invalid.
1874f9aa4606SSaravana Kannan 		 */
1875b0e2fa4fSSaravana Kannan 		if (!device_link_add(con, sup_dev, flags) &&
1876b0e2fa4fSSaravana Kannan 		    !(flags & DL_FLAG_SYNC_STATE_ONLY)) {
1877b0e2fa4fSSaravana Kannan 			dev_info(con, "Fixing up cyclic dependency with %s\n",
1878b0e2fa4fSSaravana Kannan 				 dev_name(sup_dev));
1879b0e2fa4fSSaravana Kannan 			device_links_write_lock();
1880b0e2fa4fSSaravana Kannan 			fw_devlink_relax_cycle(con, sup_dev);
1881b0e2fa4fSSaravana Kannan 			device_links_write_unlock();
1882b0e2fa4fSSaravana Kannan 			device_link_add(con, sup_dev,
1883b0e2fa4fSSaravana Kannan 					FW_DEVLINK_FLAGS_PERMISSIVE);
1884f9aa4606SSaravana Kannan 			ret = -EINVAL;
1885b0e2fa4fSSaravana Kannan 		}
1886f9aa4606SSaravana Kannan 
1887f9aa4606SSaravana Kannan 		goto out;
1888f9aa4606SSaravana Kannan 	}
1889f9aa4606SSaravana Kannan 
189074c782cfSSaravana Kannan 	/* Supplier that's already initialized without a struct device. */
189174c782cfSSaravana Kannan 	if (sup_handle->flags & FWNODE_FLAG_INITIALIZED)
189274c782cfSSaravana Kannan 		return -EINVAL;
189374c782cfSSaravana Kannan 
1894f9aa4606SSaravana Kannan 	/*
1895f9aa4606SSaravana Kannan 	 * DL_FLAG_SYNC_STATE_ONLY doesn't block probing and supports
1896f9aa4606SSaravana Kannan 	 * cycles. So cycle detection isn't necessary and shouldn't be
1897f9aa4606SSaravana Kannan 	 * done.
1898f9aa4606SSaravana Kannan 	 */
1899f9aa4606SSaravana Kannan 	if (flags & DL_FLAG_SYNC_STATE_ONLY)
1900f9aa4606SSaravana Kannan 		return -EAGAIN;
1901f9aa4606SSaravana Kannan 
1902f9aa4606SSaravana Kannan 	/*
1903f9aa4606SSaravana Kannan 	 * If we can't find the supplier device from its fwnode, it might be
1904f9aa4606SSaravana Kannan 	 * due to a cyclic dependency between fwnodes. Some of these cycles can
1905f9aa4606SSaravana Kannan 	 * be broken by applying logic. Check for these types of cycles and
1906f9aa4606SSaravana Kannan 	 * break them so that devices in the cycle probe properly.
1907f9aa4606SSaravana Kannan 	 *
19082de9d8e0SSaravana Kannan 	 * If the supplier's parent is dependent on the consumer, then the
19092de9d8e0SSaravana Kannan 	 * consumer and supplier have a cyclic dependency. Since fw_devlink
19102de9d8e0SSaravana Kannan 	 * can't tell which of the inferred dependencies are incorrect, don't
19112de9d8e0SSaravana Kannan 	 * enforce probe ordering between any of the devices in this cyclic
19122de9d8e0SSaravana Kannan 	 * dependency. Do this by relaxing all the fw_devlink device links in
19132de9d8e0SSaravana Kannan 	 * this cycle and by treating the fwnode link between the consumer and
19142de9d8e0SSaravana Kannan 	 * the supplier as an invalid dependency.
1915f9aa4606SSaravana Kannan 	 */
1916f9aa4606SSaravana Kannan 	sup_dev = fwnode_get_next_parent_dev(sup_handle);
1917f9aa4606SSaravana Kannan 	if (sup_dev && device_is_dependent(con, sup_dev)) {
19182de9d8e0SSaravana Kannan 		dev_info(con, "Fixing up cyclic dependency with %pfwP (%s)\n",
19192de9d8e0SSaravana Kannan 			 sup_handle, dev_name(sup_dev));
19202de9d8e0SSaravana Kannan 		device_links_write_lock();
19212de9d8e0SSaravana Kannan 		fw_devlink_relax_cycle(con, sup_dev);
19222de9d8e0SSaravana Kannan 		device_links_write_unlock();
1923f9aa4606SSaravana Kannan 		ret = -EINVAL;
1924f9aa4606SSaravana Kannan 	} else {
1925f9aa4606SSaravana Kannan 		/*
1926f9aa4606SSaravana Kannan 		 * Can't check for cycles or no cycles. So let's try
1927f9aa4606SSaravana Kannan 		 * again later.
1928f9aa4606SSaravana Kannan 		 */
1929f9aa4606SSaravana Kannan 		ret = -EAGAIN;
1930f9aa4606SSaravana Kannan 	}
1931f9aa4606SSaravana Kannan 
1932f9aa4606SSaravana Kannan out:
1933f9aa4606SSaravana Kannan 	put_device(sup_dev);
1934f9aa4606SSaravana Kannan 	return ret;
1935f9aa4606SSaravana Kannan }
1936f9aa4606SSaravana Kannan 
1937f9aa4606SSaravana Kannan /**
1938f9aa4606SSaravana Kannan  * __fw_devlink_link_to_consumers - Create device links to consumers of a device
193937c52f74SPierre-Louis Bossart  * @dev: Device that needs to be linked to its consumers
1940f9aa4606SSaravana Kannan  *
1941f9aa4606SSaravana Kannan  * This function looks at all the consumer fwnodes of @dev and creates device
1942f9aa4606SSaravana Kannan  * links between the consumer device and @dev (supplier).
1943f9aa4606SSaravana Kannan  *
1944f9aa4606SSaravana Kannan  * If the consumer device has not been added yet, then this function creates a
1945f9aa4606SSaravana Kannan  * SYNC_STATE_ONLY link between @dev (supplier) and the closest ancestor device
1946f9aa4606SSaravana Kannan  * of the consumer fwnode. This is necessary to make sure @dev doesn't get a
1947f9aa4606SSaravana Kannan  * sync_state() callback before the real consumer device gets to be added and
1948f9aa4606SSaravana Kannan  * then probed.
1949f9aa4606SSaravana Kannan  *
1950f9aa4606SSaravana Kannan  * Once device links are created from the real consumer to @dev (supplier), the
1951f9aa4606SSaravana Kannan  * fwnode links are deleted.
1952f9aa4606SSaravana Kannan  */
1953f9aa4606SSaravana Kannan static void __fw_devlink_link_to_consumers(struct device *dev)
1954f9aa4606SSaravana Kannan {
1955f9aa4606SSaravana Kannan 	struct fwnode_handle *fwnode = dev->fwnode;
1956f9aa4606SSaravana Kannan 	struct fwnode_link *link, *tmp;
1957f9aa4606SSaravana Kannan 
1958f9aa4606SSaravana Kannan 	list_for_each_entry_safe(link, tmp, &fwnode->consumers, s_hook) {
1959f9aa4606SSaravana Kannan 		u32 dl_flags = fw_devlink_get_flags();
1960f9aa4606SSaravana Kannan 		struct device *con_dev;
1961f9aa4606SSaravana Kannan 		bool own_link = true;
1962f9aa4606SSaravana Kannan 		int ret;
1963f9aa4606SSaravana Kannan 
1964f9aa4606SSaravana Kannan 		con_dev = get_dev_from_fwnode(link->consumer);
1965f9aa4606SSaravana Kannan 		/*
1966f9aa4606SSaravana Kannan 		 * If consumer device is not available yet, make a "proxy"
1967f9aa4606SSaravana Kannan 		 * SYNC_STATE_ONLY link from the consumer's parent device to
1968f9aa4606SSaravana Kannan 		 * the supplier device. This is necessary to make sure the
1969f9aa4606SSaravana Kannan 		 * supplier doesn't get a sync_state() callback before the real
1970f9aa4606SSaravana Kannan 		 * consumer can create a device link to the supplier.
1971f9aa4606SSaravana Kannan 		 *
1972f9aa4606SSaravana Kannan 		 * This proxy link step is needed to handle the case where the
1973f9aa4606SSaravana Kannan 		 * consumer's parent device is added before the supplier.
1974f9aa4606SSaravana Kannan 		 */
1975f9aa4606SSaravana Kannan 		if (!con_dev) {
1976f9aa4606SSaravana Kannan 			con_dev = fwnode_get_next_parent_dev(link->consumer);
1977f9aa4606SSaravana Kannan 			/*
1978f9aa4606SSaravana Kannan 			 * However, if the consumer's parent device is also the
1979f9aa4606SSaravana Kannan 			 * parent of the supplier, don't create a
1980f9aa4606SSaravana Kannan 			 * consumer-supplier link from the parent to its child
1981f9aa4606SSaravana Kannan 			 * device. Such a dependency is impossible.
1982f9aa4606SSaravana Kannan 			 */
1983f9aa4606SSaravana Kannan 			if (con_dev &&
1984f9aa4606SSaravana Kannan 			    fwnode_is_ancestor_of(con_dev->fwnode, fwnode)) {
1985f9aa4606SSaravana Kannan 				put_device(con_dev);
1986f9aa4606SSaravana Kannan 				con_dev = NULL;
1987f9aa4606SSaravana Kannan 			} else {
1988f9aa4606SSaravana Kannan 				own_link = false;
1989b90fb8f6SSaravana Kannan 				dl_flags = FW_DEVLINK_FLAGS_PERMISSIVE;
1990f9aa4606SSaravana Kannan 			}
1991f9aa4606SSaravana Kannan 		}
1992f9aa4606SSaravana Kannan 
1993f9aa4606SSaravana Kannan 		if (!con_dev)
1994f9aa4606SSaravana Kannan 			continue;
1995f9aa4606SSaravana Kannan 
1996f9aa4606SSaravana Kannan 		ret = fw_devlink_create_devlink(con_dev, fwnode, dl_flags);
1997f9aa4606SSaravana Kannan 		put_device(con_dev);
1998f9aa4606SSaravana Kannan 		if (!own_link || ret == -EAGAIN)
1999f9aa4606SSaravana Kannan 			continue;
2000f9aa4606SSaravana Kannan 
200176f13081SSaravana Kannan 		__fwnode_link_del(link);
2002f9aa4606SSaravana Kannan 	}
2003f9aa4606SSaravana Kannan }
2004f9aa4606SSaravana Kannan 
2005f9aa4606SSaravana Kannan /**
2006f9aa4606SSaravana Kannan  * __fw_devlink_link_to_suppliers - Create device links to suppliers of a device
200737c52f74SPierre-Louis Bossart  * @dev: The consumer device that needs to be linked to its suppliers
200837c52f74SPierre-Louis Bossart  * @fwnode: Root of the fwnode tree that is used to create device links
2009f9aa4606SSaravana Kannan  *
2010f9aa4606SSaravana Kannan  * This function looks at all the supplier fwnodes of fwnode tree rooted at
2011f9aa4606SSaravana Kannan  * @fwnode and creates device links between @dev (consumer) and all the
2012f9aa4606SSaravana Kannan  * supplier devices of the entire fwnode tree at @fwnode.
2013f9aa4606SSaravana Kannan  *
2014f9aa4606SSaravana Kannan  * The function creates normal (non-SYNC_STATE_ONLY) device links between @dev
2015f9aa4606SSaravana Kannan  * and the real suppliers of @dev. Once these device links are created, the
2016f9aa4606SSaravana Kannan  * fwnode links are deleted. When such device links are successfully created,
2017f9aa4606SSaravana Kannan  * this function is called recursively on those supplier devices. This is
2018f9aa4606SSaravana Kannan  * needed to detect and break some invalid cycles in fwnode links.  See
2019f9aa4606SSaravana Kannan  * fw_devlink_create_devlink() for more details.
2020f9aa4606SSaravana Kannan  *
2021f9aa4606SSaravana Kannan  * In addition, it also looks at all the suppliers of the entire fwnode tree
2022f9aa4606SSaravana Kannan  * because some of the child devices of @dev that have not been added yet
2023f9aa4606SSaravana Kannan  * (because @dev hasn't probed) might already have their suppliers added to
2024f9aa4606SSaravana Kannan  * driver core. So, this function creates SYNC_STATE_ONLY device links between
2025f9aa4606SSaravana Kannan  * @dev (consumer) and these suppliers to make sure they don't execute their
2026f9aa4606SSaravana Kannan  * sync_state() callbacks before these child devices have a chance to create
2027f9aa4606SSaravana Kannan  * their device links. The fwnode links that correspond to the child devices
2028f9aa4606SSaravana Kannan  * aren't delete because they are needed later to create the device links
2029f9aa4606SSaravana Kannan  * between the real consumer and supplier devices.
2030f9aa4606SSaravana Kannan  */
2031f9aa4606SSaravana Kannan static void __fw_devlink_link_to_suppliers(struct device *dev,
2032f9aa4606SSaravana Kannan 					   struct fwnode_handle *fwnode)
2033f9aa4606SSaravana Kannan {
2034f9aa4606SSaravana Kannan 	bool own_link = (dev->fwnode == fwnode);
2035f9aa4606SSaravana Kannan 	struct fwnode_link *link, *tmp;
2036f9aa4606SSaravana Kannan 	struct fwnode_handle *child = NULL;
2037f9aa4606SSaravana Kannan 	u32 dl_flags;
2038f9aa4606SSaravana Kannan 
2039f9aa4606SSaravana Kannan 	if (own_link)
2040f9aa4606SSaravana Kannan 		dl_flags = fw_devlink_get_flags();
2041f9aa4606SSaravana Kannan 	else
2042b90fb8f6SSaravana Kannan 		dl_flags = FW_DEVLINK_FLAGS_PERMISSIVE;
2043f9aa4606SSaravana Kannan 
2044f9aa4606SSaravana Kannan 	list_for_each_entry_safe(link, tmp, &fwnode->suppliers, c_hook) {
2045f9aa4606SSaravana Kannan 		int ret;
2046f9aa4606SSaravana Kannan 		struct device *sup_dev;
2047f9aa4606SSaravana Kannan 		struct fwnode_handle *sup = link->supplier;
2048f9aa4606SSaravana Kannan 
2049f9aa4606SSaravana Kannan 		ret = fw_devlink_create_devlink(dev, sup, dl_flags);
2050f9aa4606SSaravana Kannan 		if (!own_link || ret == -EAGAIN)
2051f9aa4606SSaravana Kannan 			continue;
2052f9aa4606SSaravana Kannan 
205376f13081SSaravana Kannan 		__fwnode_link_del(link);
2054f9aa4606SSaravana Kannan 
2055f9aa4606SSaravana Kannan 		/* If no device link was created, nothing more to do. */
2056f9aa4606SSaravana Kannan 		if (ret)
2057f9aa4606SSaravana Kannan 			continue;
2058f9aa4606SSaravana Kannan 
2059f9aa4606SSaravana Kannan 		/*
2060f9aa4606SSaravana Kannan 		 * If a device link was successfully created to a supplier, we
2061f9aa4606SSaravana Kannan 		 * now need to try and link the supplier to all its suppliers.
2062f9aa4606SSaravana Kannan 		 *
2063f9aa4606SSaravana Kannan 		 * This is needed to detect and delete false dependencies in
2064f9aa4606SSaravana Kannan 		 * fwnode links that haven't been converted to a device link
2065f9aa4606SSaravana Kannan 		 * yet. See comments in fw_devlink_create_devlink() for more
2066f9aa4606SSaravana Kannan 		 * details on the false dependency.
2067f9aa4606SSaravana Kannan 		 *
2068f9aa4606SSaravana Kannan 		 * Without deleting these false dependencies, some devices will
2069f9aa4606SSaravana Kannan 		 * never probe because they'll keep waiting for their false
2070f9aa4606SSaravana Kannan 		 * dependency fwnode links to be converted to device links.
2071f9aa4606SSaravana Kannan 		 */
2072f9aa4606SSaravana Kannan 		sup_dev = get_dev_from_fwnode(sup);
2073f9aa4606SSaravana Kannan 		__fw_devlink_link_to_suppliers(sup_dev, sup_dev->fwnode);
2074f9aa4606SSaravana Kannan 		put_device(sup_dev);
2075f9aa4606SSaravana Kannan 	}
2076f9aa4606SSaravana Kannan 
2077f9aa4606SSaravana Kannan 	/*
2078f9aa4606SSaravana Kannan 	 * Make "proxy" SYNC_STATE_ONLY device links to represent the needs of
2079f9aa4606SSaravana Kannan 	 * all the descendants. This proxy link step is needed to handle the
2080f9aa4606SSaravana Kannan 	 * case where the supplier is added before the consumer's parent device
2081f9aa4606SSaravana Kannan 	 * (@dev).
2082f9aa4606SSaravana Kannan 	 */
2083f9aa4606SSaravana Kannan 	while ((child = fwnode_get_next_available_child_node(fwnode, child)))
2084f9aa4606SSaravana Kannan 		__fw_devlink_link_to_suppliers(dev, child);
2085f9aa4606SSaravana Kannan }
2086f9aa4606SSaravana Kannan 
20875f5377eaSSaravana Kannan static void fw_devlink_link_device(struct device *dev)
20885f5377eaSSaravana Kannan {
2089f9aa4606SSaravana Kannan 	struct fwnode_handle *fwnode = dev->fwnode;
20905f5377eaSSaravana Kannan 
2091f9aa4606SSaravana Kannan 	if (!fw_devlink_flags)
2092f9aa4606SSaravana Kannan 		return;
20935f5377eaSSaravana Kannan 
2094f9aa4606SSaravana Kannan 	fw_devlink_parse_fwtree(fwnode);
2095f9aa4606SSaravana Kannan 
2096f9aa4606SSaravana Kannan 	mutex_lock(&fwnode_link_lock);
2097f9aa4606SSaravana Kannan 	__fw_devlink_link_to_consumers(dev);
2098f9aa4606SSaravana Kannan 	__fw_devlink_link_to_suppliers(dev, fwnode);
2099f9aa4606SSaravana Kannan 	mutex_unlock(&fwnode_link_lock);
21005f5377eaSSaravana Kannan }
21015f5377eaSSaravana Kannan 
21029ed98953SRafael J. Wysocki /* Device links support end. */
21039ed98953SRafael J. Wysocki 
21041da177e4SLinus Torvalds int (*platform_notify)(struct device *dev) = NULL;
21051da177e4SLinus Torvalds int (*platform_notify_remove)(struct device *dev) = NULL;
2106e105b8bfSDan Williams static struct kobject *dev_kobj;
2107e105b8bfSDan Williams struct kobject *sysfs_dev_char_kobj;
2108e105b8bfSDan Williams struct kobject *sysfs_dev_block_kobj;
21091da177e4SLinus Torvalds 
21105e33bc41SRafael J. Wysocki static DEFINE_MUTEX(device_hotplug_lock);
21115e33bc41SRafael J. Wysocki 
21125e33bc41SRafael J. Wysocki void lock_device_hotplug(void)
21135e33bc41SRafael J. Wysocki {
21145e33bc41SRafael J. Wysocki 	mutex_lock(&device_hotplug_lock);
21155e33bc41SRafael J. Wysocki }
21165e33bc41SRafael J. Wysocki 
21175e33bc41SRafael J. Wysocki void unlock_device_hotplug(void)
21185e33bc41SRafael J. Wysocki {
21195e33bc41SRafael J. Wysocki 	mutex_unlock(&device_hotplug_lock);
21205e33bc41SRafael J. Wysocki }
21215e33bc41SRafael J. Wysocki 
21225e33bc41SRafael J. Wysocki int lock_device_hotplug_sysfs(void)
21235e33bc41SRafael J. Wysocki {
21245e33bc41SRafael J. Wysocki 	if (mutex_trylock(&device_hotplug_lock))
21255e33bc41SRafael J. Wysocki 		return 0;
21265e33bc41SRafael J. Wysocki 
21275e33bc41SRafael J. Wysocki 	/* Avoid busy looping (5 ms of sleep should do). */
21285e33bc41SRafael J. Wysocki 	msleep(5);
21295e33bc41SRafael J. Wysocki 	return restart_syscall();
21305e33bc41SRafael J. Wysocki }
21315e33bc41SRafael J. Wysocki 
21324e886c29SGreg Kroah-Hartman #ifdef CONFIG_BLOCK
21334e886c29SGreg Kroah-Hartman static inline int device_is_not_partition(struct device *dev)
21344e886c29SGreg Kroah-Hartman {
21354e886c29SGreg Kroah-Hartman 	return !(dev->type == &part_type);
21364e886c29SGreg Kroah-Hartman }
21374e886c29SGreg Kroah-Hartman #else
21384e886c29SGreg Kroah-Hartman static inline int device_is_not_partition(struct device *dev)
21394e886c29SGreg Kroah-Hartman {
21404e886c29SGreg Kroah-Hartman 	return 1;
21414e886c29SGreg Kroah-Hartman }
21424e886c29SGreg Kroah-Hartman #endif
21431da177e4SLinus Torvalds 
2144b2ebd9ddSRafael J. Wysocki static void device_platform_notify(struct device *dev)
214507de0e86SHeikki Krogerus {
2146d0b8e398SRafael J. Wysocki 	acpi_device_notify(dev);
21477847a145SHeikki Krogerus 
2148b2ebd9ddSRafael J. Wysocki 	software_node_notify(dev);
21497847a145SHeikki Krogerus 
2150b2ebd9ddSRafael J. Wysocki 	if (platform_notify)
215107de0e86SHeikki Krogerus 		platform_notify(dev);
2152b2ebd9ddSRafael J. Wysocki }
2153b2ebd9ddSRafael J. Wysocki 
2154b2ebd9ddSRafael J. Wysocki static void device_platform_notify_remove(struct device *dev)
2155b2ebd9ddSRafael J. Wysocki {
2156d0b8e398SRafael J. Wysocki 	acpi_device_notify_remove(dev);
215707de0e86SHeikki Krogerus 
2158384f5a85SRafael J. Wysocki 	software_node_notify_remove(dev);
21591da177e4SLinus Torvalds 
2160b2ebd9ddSRafael J. Wysocki 	if (platform_notify_remove)
21611da177e4SLinus Torvalds 		platform_notify_remove(dev);
21621da177e4SLinus Torvalds }
21631da177e4SLinus Torvalds 
21643e95637aSAlan Stern /**
21653e95637aSAlan Stern  * dev_driver_string - Return a device's driver name, if at all possible
21663e95637aSAlan Stern  * @dev: struct device to get the name of
21673e95637aSAlan Stern  *
21683e95637aSAlan Stern  * Will return the device's driver's name if it is bound to a device.  If
21699169c012Syan  * the device is not bound to a driver, it will return the name of the bus
21703e95637aSAlan Stern  * it is attached to.  If it is not attached to a bus either, an empty
21713e95637aSAlan Stern  * string will be returned.
21723e95637aSAlan Stern  */
2173bf9ca69fSJean Delvare const char *dev_driver_string(const struct device *dev)
21743e95637aSAlan Stern {
21753589972eSAlan Stern 	struct device_driver *drv;
21763589972eSAlan Stern 
21773589972eSAlan Stern 	/* dev->driver can change to NULL underneath us because of unbinding,
21783589972eSAlan Stern 	 * so be careful about accessing it.  dev->bus and dev->class should
21793589972eSAlan Stern 	 * never change once they are set, so they don't need special care.
21803589972eSAlan Stern 	 */
21816aa7de05SMark Rutland 	drv = READ_ONCE(dev->driver);
2182e020ff61SSaravana Kannan 	return drv ? drv->name : dev_bus_name(dev);
21833e95637aSAlan Stern }
2184310a922dSMatthew Wilcox EXPORT_SYMBOL(dev_driver_string);
21853e95637aSAlan Stern 
21861da177e4SLinus Torvalds #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr)
21871da177e4SLinus Torvalds 
21884a3ad20cSGreg Kroah-Hartman static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr,
21894a3ad20cSGreg Kroah-Hartman 			     char *buf)
21901da177e4SLinus Torvalds {
21911da177e4SLinus Torvalds 	struct device_attribute *dev_attr = to_dev_attr(attr);
2192b0d1f807SLars-Peter Clausen 	struct device *dev = kobj_to_dev(kobj);
21934a0c20bfSDmitry Torokhov 	ssize_t ret = -EIO;
21941da177e4SLinus Torvalds 
21951da177e4SLinus Torvalds 	if (dev_attr->show)
219654b6f35cSYani Ioannou 		ret = dev_attr->show(dev, dev_attr, buf);
2197815d2d50SAndrew Morton 	if (ret >= (ssize_t)PAGE_SIZE) {
2198a52668c6SSergey Senozhatsky 		printk("dev_attr_show: %pS returned bad count\n",
2199a52668c6SSergey Senozhatsky 				dev_attr->show);
2200815d2d50SAndrew Morton 	}
22011da177e4SLinus Torvalds 	return ret;
22021da177e4SLinus Torvalds }
22031da177e4SLinus Torvalds 
22044a3ad20cSGreg Kroah-Hartman static ssize_t dev_attr_store(struct kobject *kobj, struct attribute *attr,
22051da177e4SLinus Torvalds 			      const char *buf, size_t count)
22061da177e4SLinus Torvalds {
22071da177e4SLinus Torvalds 	struct device_attribute *dev_attr = to_dev_attr(attr);
2208b0d1f807SLars-Peter Clausen 	struct device *dev = kobj_to_dev(kobj);
22094a0c20bfSDmitry Torokhov 	ssize_t ret = -EIO;
22101da177e4SLinus Torvalds 
22111da177e4SLinus Torvalds 	if (dev_attr->store)
221254b6f35cSYani Ioannou 		ret = dev_attr->store(dev, dev_attr, buf, count);
22131da177e4SLinus Torvalds 	return ret;
22141da177e4SLinus Torvalds }
22151da177e4SLinus Torvalds 
221652cf25d0SEmese Revfy static const struct sysfs_ops dev_sysfs_ops = {
22171da177e4SLinus Torvalds 	.show	= dev_attr_show,
22181da177e4SLinus Torvalds 	.store	= dev_attr_store,
22191da177e4SLinus Torvalds };
22201da177e4SLinus Torvalds 
2221ca22e56dSKay Sievers #define to_ext_attr(x) container_of(x, struct dev_ext_attribute, attr)
2222ca22e56dSKay Sievers 
2223ca22e56dSKay Sievers ssize_t device_store_ulong(struct device *dev,
2224ca22e56dSKay Sievers 			   struct device_attribute *attr,
2225ca22e56dSKay Sievers 			   const char *buf, size_t size)
2226ca22e56dSKay Sievers {
2227ca22e56dSKay Sievers 	struct dev_ext_attribute *ea = to_ext_attr(attr);
2228f88184bfSKaitao cheng 	int ret;
2229f88184bfSKaitao cheng 	unsigned long new;
2230f88184bfSKaitao cheng 
2231f88184bfSKaitao cheng 	ret = kstrtoul(buf, 0, &new);
2232f88184bfSKaitao cheng 	if (ret)
2233f88184bfSKaitao cheng 		return ret;
2234ca22e56dSKay Sievers 	*(unsigned long *)(ea->var) = new;
2235ca22e56dSKay Sievers 	/* Always return full write size even if we didn't consume all */
2236ca22e56dSKay Sievers 	return size;
2237ca22e56dSKay Sievers }
2238ca22e56dSKay Sievers EXPORT_SYMBOL_GPL(device_store_ulong);
2239ca22e56dSKay Sievers 
2240ca22e56dSKay Sievers ssize_t device_show_ulong(struct device *dev,
2241ca22e56dSKay Sievers 			  struct device_attribute *attr,
2242ca22e56dSKay Sievers 			  char *buf)
2243ca22e56dSKay Sievers {
2244ca22e56dSKay Sievers 	struct dev_ext_attribute *ea = to_ext_attr(attr);
2245aa838896SJoe Perches 	return sysfs_emit(buf, "%lx\n", *(unsigned long *)(ea->var));
2246ca22e56dSKay Sievers }
2247ca22e56dSKay Sievers EXPORT_SYMBOL_GPL(device_show_ulong);
2248ca22e56dSKay Sievers 
2249ca22e56dSKay Sievers ssize_t device_store_int(struct device *dev,
2250ca22e56dSKay Sievers 			 struct device_attribute *attr,
2251ca22e56dSKay Sievers 			 const char *buf, size_t size)
2252ca22e56dSKay Sievers {
2253ca22e56dSKay Sievers 	struct dev_ext_attribute *ea = to_ext_attr(attr);
2254f88184bfSKaitao cheng 	int ret;
2255f88184bfSKaitao cheng 	long new;
2256f88184bfSKaitao cheng 
2257f88184bfSKaitao cheng 	ret = kstrtol(buf, 0, &new);
2258f88184bfSKaitao cheng 	if (ret)
2259f88184bfSKaitao cheng 		return ret;
2260f88184bfSKaitao cheng 
2261f88184bfSKaitao cheng 	if (new > INT_MAX || new < INT_MIN)
2262ca22e56dSKay Sievers 		return -EINVAL;
2263ca22e56dSKay Sievers 	*(int *)(ea->var) = new;
2264ca22e56dSKay Sievers 	/* Always return full write size even if we didn't consume all */
2265ca22e56dSKay Sievers 	return size;
2266ca22e56dSKay Sievers }
2267ca22e56dSKay Sievers EXPORT_SYMBOL_GPL(device_store_int);
2268ca22e56dSKay Sievers 
2269ca22e56dSKay Sievers ssize_t device_show_int(struct device *dev,
2270ca22e56dSKay Sievers 			struct device_attribute *attr,
2271ca22e56dSKay Sievers 			char *buf)
2272ca22e56dSKay Sievers {
2273ca22e56dSKay Sievers 	struct dev_ext_attribute *ea = to_ext_attr(attr);
2274ca22e56dSKay Sievers 
2275aa838896SJoe Perches 	return sysfs_emit(buf, "%d\n", *(int *)(ea->var));
2276ca22e56dSKay Sievers }
2277ca22e56dSKay Sievers EXPORT_SYMBOL_GPL(device_show_int);
22781da177e4SLinus Torvalds 
227991872392SBorislav Petkov ssize_t device_store_bool(struct device *dev, struct device_attribute *attr,
228091872392SBorislav Petkov 			  const char *buf, size_t size)
228191872392SBorislav Petkov {
228291872392SBorislav Petkov 	struct dev_ext_attribute *ea = to_ext_attr(attr);
228391872392SBorislav Petkov 
228473060022SChristophe JAILLET 	if (kstrtobool(buf, ea->var) < 0)
228591872392SBorislav Petkov 		return -EINVAL;
228691872392SBorislav Petkov 
228791872392SBorislav Petkov 	return size;
228891872392SBorislav Petkov }
228991872392SBorislav Petkov EXPORT_SYMBOL_GPL(device_store_bool);
229091872392SBorislav Petkov 
229191872392SBorislav Petkov ssize_t device_show_bool(struct device *dev, struct device_attribute *attr,
229291872392SBorislav Petkov 			 char *buf)
229391872392SBorislav Petkov {
229491872392SBorislav Petkov 	struct dev_ext_attribute *ea = to_ext_attr(attr);
229591872392SBorislav Petkov 
2296aa838896SJoe Perches 	return sysfs_emit(buf, "%d\n", *(bool *)(ea->var));
229791872392SBorislav Petkov }
229891872392SBorislav Petkov EXPORT_SYMBOL_GPL(device_show_bool);
229991872392SBorislav Petkov 
23001da177e4SLinus Torvalds /**
23011da177e4SLinus Torvalds  * device_release - free device structure.
23021da177e4SLinus Torvalds  * @kobj: device's kobject.
23031da177e4SLinus Torvalds  *
23041da177e4SLinus Torvalds  * This is called once the reference count for the object
23051da177e4SLinus Torvalds  * reaches 0. We forward the call to the device's release
23061da177e4SLinus Torvalds  * method, which should handle actually freeing the structure.
23071da177e4SLinus Torvalds  */
23081da177e4SLinus Torvalds static void device_release(struct kobject *kobj)
23091da177e4SLinus Torvalds {
2310b0d1f807SLars-Peter Clausen 	struct device *dev = kobj_to_dev(kobj);
2311fb069a5dSGreg Kroah-Hartman 	struct device_private *p = dev->p;
23121da177e4SLinus Torvalds 
2313a525a3ddSMing Lei 	/*
2314a525a3ddSMing Lei 	 * Some platform devices are driven without driver attached
2315a525a3ddSMing Lei 	 * and managed resources may have been acquired.  Make sure
2316a525a3ddSMing Lei 	 * all resources are released.
2317a525a3ddSMing Lei 	 *
2318a525a3ddSMing Lei 	 * Drivers still can add resources into device after device
2319a525a3ddSMing Lei 	 * is deleted but alive, so release devres here to avoid
2320a525a3ddSMing Lei 	 * possible memory leak.
2321a525a3ddSMing Lei 	 */
2322a525a3ddSMing Lei 	devres_release_all(dev);
2323a525a3ddSMing Lei 
2324e0d07278SJim Quinlan 	kfree(dev->dma_range_map);
2325e0d07278SJim Quinlan 
23261da177e4SLinus Torvalds 	if (dev->release)
23271da177e4SLinus Torvalds 		dev->release(dev);
2328f9f852dfSKay Sievers 	else if (dev->type && dev->type->release)
2329f9f852dfSKay Sievers 		dev->type->release(dev);
23302620efefSGreg Kroah-Hartman 	else if (dev->class && dev->class->dev_release)
23312620efefSGreg Kroah-Hartman 		dev->class->dev_release(dev);
2332f810a5cfSArjan van de Ven 	else
23330c1bc6b8SMauro Carvalho Chehab 		WARN(1, KERN_ERR "Device '%s' does not have a release() function, it is broken and must be fixed. See Documentation/core-api/kobject.rst.\n",
23341e0b2cf9SKay Sievers 			dev_name(dev));
2335fb069a5dSGreg Kroah-Hartman 	kfree(p);
23361da177e4SLinus Torvalds }
23371da177e4SLinus Torvalds 
233802a476d9SGreg Kroah-Hartman static const void *device_namespace(const struct kobject *kobj)
2339bc451f20SEric W. Biederman {
2340fa627348SGreg Kroah-Hartman 	const struct device *dev = kobj_to_dev(kobj);
2341bc451f20SEric W. Biederman 	const void *ns = NULL;
2342bc451f20SEric W. Biederman 
2343bc451f20SEric W. Biederman 	if (dev->class && dev->class->ns_type)
2344bc451f20SEric W. Biederman 		ns = dev->class->namespace(dev);
2345bc451f20SEric W. Biederman 
2346bc451f20SEric W. Biederman 	return ns;
2347bc451f20SEric W. Biederman }
2348bc451f20SEric W. Biederman 
234902a476d9SGreg Kroah-Hartman static void device_get_ownership(const struct kobject *kobj, kuid_t *uid, kgid_t *gid)
23509944e894SDmitry Torokhov {
2351fa627348SGreg Kroah-Hartman 	const struct device *dev = kobj_to_dev(kobj);
23529944e894SDmitry Torokhov 
23539944e894SDmitry Torokhov 	if (dev->class && dev->class->get_ownership)
23549944e894SDmitry Torokhov 		dev->class->get_ownership(dev, uid, gid);
23559944e894SDmitry Torokhov }
23569944e894SDmitry Torokhov 
23578f4afc41SGreg Kroah-Hartman static struct kobj_type device_ktype = {
23581da177e4SLinus Torvalds 	.release	= device_release,
23591da177e4SLinus Torvalds 	.sysfs_ops	= &dev_sysfs_ops,
2360bc451f20SEric W. Biederman 	.namespace	= device_namespace,
23619944e894SDmitry Torokhov 	.get_ownership	= device_get_ownership,
23621da177e4SLinus Torvalds };
23631da177e4SLinus Torvalds 
23641da177e4SLinus Torvalds 
2365c45a88bbSGreg Kroah-Hartman static int dev_uevent_filter(const struct kobject *kobj)
23661da177e4SLinus Torvalds {
2367ee6d3dd4SWedson Almeida Filho 	const struct kobj_type *ktype = get_ktype(kobj);
23681da177e4SLinus Torvalds 
23698f4afc41SGreg Kroah-Hartman 	if (ktype == &device_ktype) {
2370c45a88bbSGreg Kroah-Hartman 		const struct device *dev = kobj_to_dev(kobj);
23711da177e4SLinus Torvalds 		if (dev->bus)
23721da177e4SLinus Torvalds 			return 1;
237323681e47SGreg Kroah-Hartman 		if (dev->class)
237423681e47SGreg Kroah-Hartman 			return 1;
23751da177e4SLinus Torvalds 	}
23761da177e4SLinus Torvalds 	return 0;
23771da177e4SLinus Torvalds }
23781da177e4SLinus Torvalds 
2379a53d1accSGreg Kroah-Hartman static const char *dev_uevent_name(const struct kobject *kobj)
23801da177e4SLinus Torvalds {
2381a53d1accSGreg Kroah-Hartman 	const struct device *dev = kobj_to_dev(kobj);
23821da177e4SLinus Torvalds 
238323681e47SGreg Kroah-Hartman 	if (dev->bus)
23841da177e4SLinus Torvalds 		return dev->bus->name;
238523681e47SGreg Kroah-Hartman 	if (dev->class)
238623681e47SGreg Kroah-Hartman 		return dev->class->name;
238723681e47SGreg Kroah-Hartman 	return NULL;
23881da177e4SLinus Torvalds }
23891da177e4SLinus Torvalds 
2390cf6299b6SGreg Kroah-Hartman static int dev_uevent(struct kobject *kobj, struct kobj_uevent_env *env)
23911da177e4SLinus Torvalds {
2392b0d1f807SLars-Peter Clausen 	struct device *dev = kobj_to_dev(kobj);
23931da177e4SLinus Torvalds 	int retval = 0;
23941da177e4SLinus Torvalds 
23956fcf53acSKay Sievers 	/* add device node properties if present */
239623681e47SGreg Kroah-Hartman 	if (MAJOR(dev->devt)) {
23976fcf53acSKay Sievers 		const char *tmp;
23986fcf53acSKay Sievers 		const char *name;
23992c9ede55SAl Viro 		umode_t mode = 0;
24004e4098a3SGreg Kroah-Hartman 		kuid_t uid = GLOBAL_ROOT_UID;
24014e4098a3SGreg Kroah-Hartman 		kgid_t gid = GLOBAL_ROOT_GID;
24026fcf53acSKay Sievers 
24037eff2e7aSKay Sievers 		add_uevent_var(env, "MAJOR=%u", MAJOR(dev->devt));
24047eff2e7aSKay Sievers 		add_uevent_var(env, "MINOR=%u", MINOR(dev->devt));
24053c2670e6SKay Sievers 		name = device_get_devnode(dev, &mode, &uid, &gid, &tmp);
24066fcf53acSKay Sievers 		if (name) {
24076fcf53acSKay Sievers 			add_uevent_var(env, "DEVNAME=%s", name);
2408e454cea2SKay Sievers 			if (mode)
2409e454cea2SKay Sievers 				add_uevent_var(env, "DEVMODE=%#o", mode & 0777);
24104e4098a3SGreg Kroah-Hartman 			if (!uid_eq(uid, GLOBAL_ROOT_UID))
24114e4098a3SGreg Kroah-Hartman 				add_uevent_var(env, "DEVUID=%u", from_kuid(&init_user_ns, uid));
24124e4098a3SGreg Kroah-Hartman 			if (!gid_eq(gid, GLOBAL_ROOT_GID))
24134e4098a3SGreg Kroah-Hartman 				add_uevent_var(env, "DEVGID=%u", from_kgid(&init_user_ns, gid));
24143c2670e6SKay Sievers 			kfree(tmp);
24156fcf53acSKay Sievers 		}
241623681e47SGreg Kroah-Hartman 	}
241723681e47SGreg Kroah-Hartman 
2418414264f9SKay Sievers 	if (dev->type && dev->type->name)
24197eff2e7aSKay Sievers 		add_uevent_var(env, "DEVTYPE=%s", dev->type->name);
2420414264f9SKay Sievers 
2421239378f1SKay Sievers 	if (dev->driver)
24227eff2e7aSKay Sievers 		add_uevent_var(env, "DRIVER=%s", dev->driver->name);
2423239378f1SKay Sievers 
242407d57a32SGrant Likely 	/* Add common DT information about the device */
242507d57a32SGrant Likely 	of_device_uevent(dev, env);
242607d57a32SGrant Likely 
24271da177e4SLinus Torvalds 	/* have the bus specific function add its stuff */
24287eff2e7aSKay Sievers 	if (dev->bus && dev->bus->uevent) {
24297eff2e7aSKay Sievers 		retval = dev->bus->uevent(dev, env);
2430f9f852dfSKay Sievers 		if (retval)
24317dc72b28SGreg Kroah-Hartman 			pr_debug("device: '%s': %s: bus uevent() returned %d\n",
24321e0b2cf9SKay Sievers 				 dev_name(dev), __func__, retval);
24331da177e4SLinus Torvalds 	}
24341da177e4SLinus Torvalds 
24352620efefSGreg Kroah-Hartman 	/* have the class specific function add its stuff */
24367eff2e7aSKay Sievers 	if (dev->class && dev->class->dev_uevent) {
24377eff2e7aSKay Sievers 		retval = dev->class->dev_uevent(dev, env);
2438f9f852dfSKay Sievers 		if (retval)
24397dc72b28SGreg Kroah-Hartman 			pr_debug("device: '%s': %s: class uevent() "
24401e0b2cf9SKay Sievers 				 "returned %d\n", dev_name(dev),
24412b3a302aSHarvey Harrison 				 __func__, retval);
24422620efefSGreg Kroah-Hartman 	}
2443f9f852dfSKay Sievers 
2444eef35c2dSStefan Weil 	/* have the device type specific function add its stuff */
24457eff2e7aSKay Sievers 	if (dev->type && dev->type->uevent) {
24467eff2e7aSKay Sievers 		retval = dev->type->uevent(dev, env);
2447f9f852dfSKay Sievers 		if (retval)
24487dc72b28SGreg Kroah-Hartman 			pr_debug("device: '%s': %s: dev_type uevent() "
24491e0b2cf9SKay Sievers 				 "returned %d\n", dev_name(dev),
24502b3a302aSHarvey Harrison 				 __func__, retval);
24512620efefSGreg Kroah-Hartman 	}
24522620efefSGreg Kroah-Hartman 
24531da177e4SLinus Torvalds 	return retval;
24541da177e4SLinus Torvalds }
24551da177e4SLinus Torvalds 
24569cd43611SEmese Revfy static const struct kset_uevent_ops device_uevent_ops = {
2457312c004dSKay Sievers 	.filter =	dev_uevent_filter,
2458312c004dSKay Sievers 	.name =		dev_uevent_name,
2459312c004dSKay Sievers 	.uevent =	dev_uevent,
24601da177e4SLinus Torvalds };
24611da177e4SLinus Torvalds 
2462c5e064a6SGreg Kroah-Hartman static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
246316574dccSKay Sievers 			   char *buf)
246416574dccSKay Sievers {
246516574dccSKay Sievers 	struct kobject *top_kobj;
246616574dccSKay Sievers 	struct kset *kset;
24677eff2e7aSKay Sievers 	struct kobj_uevent_env *env = NULL;
246816574dccSKay Sievers 	int i;
2469948b3edbSJoe Perches 	int len = 0;
247016574dccSKay Sievers 	int retval;
247116574dccSKay Sievers 
247216574dccSKay Sievers 	/* search the kset, the device belongs to */
247316574dccSKay Sievers 	top_kobj = &dev->kobj;
24745c5daf65SKay Sievers 	while (!top_kobj->kset && top_kobj->parent)
247516574dccSKay Sievers 		top_kobj = top_kobj->parent;
247616574dccSKay Sievers 	if (!top_kobj->kset)
247716574dccSKay Sievers 		goto out;
24785c5daf65SKay Sievers 
247916574dccSKay Sievers 	kset = top_kobj->kset;
248016574dccSKay Sievers 	if (!kset->uevent_ops || !kset->uevent_ops->uevent)
248116574dccSKay Sievers 		goto out;
248216574dccSKay Sievers 
248316574dccSKay Sievers 	/* respect filter */
248416574dccSKay Sievers 	if (kset->uevent_ops && kset->uevent_ops->filter)
2485cf6299b6SGreg Kroah-Hartman 		if (!kset->uevent_ops->filter(&dev->kobj))
248616574dccSKay Sievers 			goto out;
248716574dccSKay Sievers 
24887eff2e7aSKay Sievers 	env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);
24897eff2e7aSKay Sievers 	if (!env)
2490c7308c81SGreg Kroah-Hartman 		return -ENOMEM;
2491c7308c81SGreg Kroah-Hartman 
249216574dccSKay Sievers 	/* let the kset specific function add its keys */
2493cf6299b6SGreg Kroah-Hartman 	retval = kset->uevent_ops->uevent(&dev->kobj, env);
249416574dccSKay Sievers 	if (retval)
249516574dccSKay Sievers 		goto out;
249616574dccSKay Sievers 
249716574dccSKay Sievers 	/* copy keys to file */
24987eff2e7aSKay Sievers 	for (i = 0; i < env->envp_idx; i++)
2499948b3edbSJoe Perches 		len += sysfs_emit_at(buf, len, "%s\n", env->envp[i]);
250016574dccSKay Sievers out:
25017eff2e7aSKay Sievers 	kfree(env);
2502948b3edbSJoe Perches 	return len;
250316574dccSKay Sievers }
250416574dccSKay Sievers 
2505c5e064a6SGreg Kroah-Hartman static ssize_t uevent_store(struct device *dev, struct device_attribute *attr,
2506a7fd6706SKay Sievers 			    const char *buf, size_t count)
2507a7fd6706SKay Sievers {
2508df44b479SPeter Rajnoha 	int rc;
2509df44b479SPeter Rajnoha 
2510df44b479SPeter Rajnoha 	rc = kobject_synth_uevent(&dev->kobj, buf, count);
2511df44b479SPeter Rajnoha 
2512df44b479SPeter Rajnoha 	if (rc) {
25136bb7ea3aSBrian Norris 		dev_err(dev, "uevent: failed to send synthetic uevent: %d\n", rc);
2514df44b479SPeter Rajnoha 		return rc;
2515df44b479SPeter Rajnoha 	}
251660a96a59SKay Sievers 
2517a7fd6706SKay Sievers 	return count;
2518a7fd6706SKay Sievers }
2519c5e064a6SGreg Kroah-Hartman static DEVICE_ATTR_RW(uevent);
2520a7fd6706SKay Sievers 
2521c5e064a6SGreg Kroah-Hartman static ssize_t online_show(struct device *dev, struct device_attribute *attr,
25224f3549d7SRafael J. Wysocki 			   char *buf)
25234f3549d7SRafael J. Wysocki {
25244f3549d7SRafael J. Wysocki 	bool val;
25254f3549d7SRafael J. Wysocki 
25265e33bc41SRafael J. Wysocki 	device_lock(dev);
25274f3549d7SRafael J. Wysocki 	val = !dev->offline;
25285e33bc41SRafael J. Wysocki 	device_unlock(dev);
2529aa838896SJoe Perches 	return sysfs_emit(buf, "%u\n", val);
25304f3549d7SRafael J. Wysocki }
25314f3549d7SRafael J. Wysocki 
2532c5e064a6SGreg Kroah-Hartman static ssize_t online_store(struct device *dev, struct device_attribute *attr,
25334f3549d7SRafael J. Wysocki 			    const char *buf, size_t count)
25344f3549d7SRafael J. Wysocki {
25354f3549d7SRafael J. Wysocki 	bool val;
25364f3549d7SRafael J. Wysocki 	int ret;
25374f3549d7SRafael J. Wysocki 
253873060022SChristophe JAILLET 	ret = kstrtobool(buf, &val);
25394f3549d7SRafael J. Wysocki 	if (ret < 0)
25404f3549d7SRafael J. Wysocki 		return ret;
25414f3549d7SRafael J. Wysocki 
25425e33bc41SRafael J. Wysocki 	ret = lock_device_hotplug_sysfs();
25435e33bc41SRafael J. Wysocki 	if (ret)
25445e33bc41SRafael J. Wysocki 		return ret;
25455e33bc41SRafael J. Wysocki 
25464f3549d7SRafael J. Wysocki 	ret = val ? device_online(dev) : device_offline(dev);
25474f3549d7SRafael J. Wysocki 	unlock_device_hotplug();
25484f3549d7SRafael J. Wysocki 	return ret < 0 ? ret : count;
25494f3549d7SRafael J. Wysocki }
2550c5e064a6SGreg Kroah-Hartman static DEVICE_ATTR_RW(online);
25514f3549d7SRafael J. Wysocki 
255270f400d4SRajat Jain static ssize_t removable_show(struct device *dev, struct device_attribute *attr,
255370f400d4SRajat Jain 			      char *buf)
255470f400d4SRajat Jain {
255570f400d4SRajat Jain 	const char *loc;
255670f400d4SRajat Jain 
255770f400d4SRajat Jain 	switch (dev->removable) {
255870f400d4SRajat Jain 	case DEVICE_REMOVABLE:
255970f400d4SRajat Jain 		loc = "removable";
256070f400d4SRajat Jain 		break;
256170f400d4SRajat Jain 	case DEVICE_FIXED:
256270f400d4SRajat Jain 		loc = "fixed";
256370f400d4SRajat Jain 		break;
256470f400d4SRajat Jain 	default:
256570f400d4SRajat Jain 		loc = "unknown";
256670f400d4SRajat Jain 	}
256770f400d4SRajat Jain 	return sysfs_emit(buf, "%s\n", loc);
256870f400d4SRajat Jain }
256970f400d4SRajat Jain static DEVICE_ATTR_RO(removable);
257070f400d4SRajat Jain 
2571fa6fdb33SGreg Kroah-Hartman int device_add_groups(struct device *dev, const struct attribute_group **groups)
2572621a1672SDmitry Torokhov {
25733e9b2baeSGreg Kroah-Hartman 	return sysfs_create_groups(&dev->kobj, groups);
2574621a1672SDmitry Torokhov }
2575a7670d42SDmitry Torokhov EXPORT_SYMBOL_GPL(device_add_groups);
2576621a1672SDmitry Torokhov 
2577fa6fdb33SGreg Kroah-Hartman void device_remove_groups(struct device *dev,
2578a4dbd674SDavid Brownell 			  const struct attribute_group **groups)
2579621a1672SDmitry Torokhov {
25803e9b2baeSGreg Kroah-Hartman 	sysfs_remove_groups(&dev->kobj, groups);
2581621a1672SDmitry Torokhov }
2582a7670d42SDmitry Torokhov EXPORT_SYMBOL_GPL(device_remove_groups);
2583de0ff00dSGreg Kroah-Hartman 
258457b8ff07SDmitry Torokhov union device_attr_group_devres {
258557b8ff07SDmitry Torokhov 	const struct attribute_group *group;
258657b8ff07SDmitry Torokhov 	const struct attribute_group **groups;
258757b8ff07SDmitry Torokhov };
258857b8ff07SDmitry Torokhov 
258957b8ff07SDmitry Torokhov static void devm_attr_group_remove(struct device *dev, void *res)
259057b8ff07SDmitry Torokhov {
259157b8ff07SDmitry Torokhov 	union device_attr_group_devres *devres = res;
259257b8ff07SDmitry Torokhov 	const struct attribute_group *group = devres->group;
259357b8ff07SDmitry Torokhov 
259457b8ff07SDmitry Torokhov 	dev_dbg(dev, "%s: removing group %p\n", __func__, group);
259557b8ff07SDmitry Torokhov 	sysfs_remove_group(&dev->kobj, group);
259657b8ff07SDmitry Torokhov }
259757b8ff07SDmitry Torokhov 
259857b8ff07SDmitry Torokhov static void devm_attr_groups_remove(struct device *dev, void *res)
259957b8ff07SDmitry Torokhov {
260057b8ff07SDmitry Torokhov 	union device_attr_group_devres *devres = res;
260157b8ff07SDmitry Torokhov 	const struct attribute_group **groups = devres->groups;
260257b8ff07SDmitry Torokhov 
260357b8ff07SDmitry Torokhov 	dev_dbg(dev, "%s: removing groups %p\n", __func__, groups);
260457b8ff07SDmitry Torokhov 	sysfs_remove_groups(&dev->kobj, groups);
260557b8ff07SDmitry Torokhov }
260657b8ff07SDmitry Torokhov 
260757b8ff07SDmitry Torokhov /**
260857b8ff07SDmitry Torokhov  * devm_device_add_group - given a device, create a managed attribute group
260957b8ff07SDmitry Torokhov  * @dev:	The device to create the group for
261057b8ff07SDmitry Torokhov  * @grp:	The attribute group to create
261157b8ff07SDmitry Torokhov  *
261257b8ff07SDmitry Torokhov  * This function creates a group for the first time.  It will explicitly
261357b8ff07SDmitry Torokhov  * warn and error if any of the attribute files being created already exist.
261457b8ff07SDmitry Torokhov  *
261557b8ff07SDmitry Torokhov  * Returns 0 on success or error code on failure.
261657b8ff07SDmitry Torokhov  */
261757b8ff07SDmitry Torokhov int devm_device_add_group(struct device *dev, const struct attribute_group *grp)
261857b8ff07SDmitry Torokhov {
261957b8ff07SDmitry Torokhov 	union device_attr_group_devres *devres;
262057b8ff07SDmitry Torokhov 	int error;
262157b8ff07SDmitry Torokhov 
262257b8ff07SDmitry Torokhov 	devres = devres_alloc(devm_attr_group_remove,
262357b8ff07SDmitry Torokhov 			      sizeof(*devres), GFP_KERNEL);
262457b8ff07SDmitry Torokhov 	if (!devres)
262557b8ff07SDmitry Torokhov 		return -ENOMEM;
262657b8ff07SDmitry Torokhov 
262757b8ff07SDmitry Torokhov 	error = sysfs_create_group(&dev->kobj, grp);
262857b8ff07SDmitry Torokhov 	if (error) {
262957b8ff07SDmitry Torokhov 		devres_free(devres);
263057b8ff07SDmitry Torokhov 		return error;
263157b8ff07SDmitry Torokhov 	}
263257b8ff07SDmitry Torokhov 
263357b8ff07SDmitry Torokhov 	devres->group = grp;
263457b8ff07SDmitry Torokhov 	devres_add(dev, devres);
263557b8ff07SDmitry Torokhov 	return 0;
263657b8ff07SDmitry Torokhov }
263757b8ff07SDmitry Torokhov EXPORT_SYMBOL_GPL(devm_device_add_group);
263857b8ff07SDmitry Torokhov 
263957b8ff07SDmitry Torokhov /**
264057b8ff07SDmitry Torokhov  * devm_device_add_groups - create a bunch of managed attribute groups
264157b8ff07SDmitry Torokhov  * @dev:	The device to create the group for
264257b8ff07SDmitry Torokhov  * @groups:	The attribute groups to create, NULL terminated
264357b8ff07SDmitry Torokhov  *
264457b8ff07SDmitry Torokhov  * This function creates a bunch of managed attribute groups.  If an error
264557b8ff07SDmitry Torokhov  * occurs when creating a group, all previously created groups will be
264657b8ff07SDmitry Torokhov  * removed, unwinding everything back to the original state when this
264757b8ff07SDmitry Torokhov  * function was called.  It will explicitly warn and error if any of the
264857b8ff07SDmitry Torokhov  * attribute files being created already exist.
264957b8ff07SDmitry Torokhov  *
265057b8ff07SDmitry Torokhov  * Returns 0 on success or error code from sysfs_create_group on failure.
265157b8ff07SDmitry Torokhov  */
265257b8ff07SDmitry Torokhov int devm_device_add_groups(struct device *dev,
265357b8ff07SDmitry Torokhov 			   const struct attribute_group **groups)
265457b8ff07SDmitry Torokhov {
265557b8ff07SDmitry Torokhov 	union device_attr_group_devres *devres;
265657b8ff07SDmitry Torokhov 	int error;
265757b8ff07SDmitry Torokhov 
265857b8ff07SDmitry Torokhov 	devres = devres_alloc(devm_attr_groups_remove,
265957b8ff07SDmitry Torokhov 			      sizeof(*devres), GFP_KERNEL);
266057b8ff07SDmitry Torokhov 	if (!devres)
266157b8ff07SDmitry Torokhov 		return -ENOMEM;
266257b8ff07SDmitry Torokhov 
266357b8ff07SDmitry Torokhov 	error = sysfs_create_groups(&dev->kobj, groups);
266457b8ff07SDmitry Torokhov 	if (error) {
266557b8ff07SDmitry Torokhov 		devres_free(devres);
266657b8ff07SDmitry Torokhov 		return error;
266757b8ff07SDmitry Torokhov 	}
266857b8ff07SDmitry Torokhov 
266957b8ff07SDmitry Torokhov 	devres->groups = groups;
267057b8ff07SDmitry Torokhov 	devres_add(dev, devres);
267157b8ff07SDmitry Torokhov 	return 0;
267257b8ff07SDmitry Torokhov }
267357b8ff07SDmitry Torokhov EXPORT_SYMBOL_GPL(devm_device_add_groups);
267457b8ff07SDmitry Torokhov 
26752620efefSGreg Kroah-Hartman static int device_add_attrs(struct device *dev)
26762620efefSGreg Kroah-Hartman {
26772620efefSGreg Kroah-Hartman 	struct class *class = dev->class;
2678aed65af1SStephen Hemminger 	const struct device_type *type = dev->type;
2679621a1672SDmitry Torokhov 	int error;
26802620efefSGreg Kroah-Hartman 
2681621a1672SDmitry Torokhov 	if (class) {
2682d05a6f96SGreg Kroah-Hartman 		error = device_add_groups(dev, class->dev_groups);
26832620efefSGreg Kroah-Hartman 		if (error)
2684621a1672SDmitry Torokhov 			return error;
2685f9f852dfSKay Sievers 	}
2686f9f852dfSKay Sievers 
2687621a1672SDmitry Torokhov 	if (type) {
2688621a1672SDmitry Torokhov 		error = device_add_groups(dev, type->groups);
2689f9f852dfSKay Sievers 		if (error)
2690a6b01dedSGreg Kroah-Hartman 			goto err_remove_class_groups;
2691f9f852dfSKay Sievers 	}
2692621a1672SDmitry Torokhov 
2693621a1672SDmitry Torokhov 	error = device_add_groups(dev, dev->groups);
2694f9f852dfSKay Sievers 	if (error)
2695621a1672SDmitry Torokhov 		goto err_remove_type_groups;
2696621a1672SDmitry Torokhov 
26974f3549d7SRafael J. Wysocki 	if (device_supports_offline(dev) && !dev->offline_disabled) {
2698c5e064a6SGreg Kroah-Hartman 		error = device_create_file(dev, &dev_attr_online);
26994f3549d7SRafael J. Wysocki 		if (error)
2700ecfbf6fdSRafael J. Wysocki 			goto err_remove_dev_groups;
27014f3549d7SRafael J. Wysocki 	}
27024f3549d7SRafael J. Wysocki 
270325ac86c6SSaravana Kannan 	if (fw_devlink_flags && !fw_devlink_is_permissive() && dev->fwnode) {
2704da6d6475SSaravana Kannan 		error = device_create_file(dev, &dev_attr_waiting_for_supplier);
2705da6d6475SSaravana Kannan 		if (error)
2706da6d6475SSaravana Kannan 			goto err_remove_dev_online;
2707da6d6475SSaravana Kannan 	}
2708da6d6475SSaravana Kannan 
270970f400d4SRajat Jain 	if (dev_removable_is_valid(dev)) {
271070f400d4SRajat Jain 		error = device_create_file(dev, &dev_attr_removable);
271170f400d4SRajat Jain 		if (error)
271270f400d4SRajat Jain 			goto err_remove_dev_waiting_for_supplier;
271370f400d4SRajat Jain 	}
271470f400d4SRajat Jain 
27156423d295SWon Chung 	if (dev_add_physical_location(dev)) {
27166423d295SWon Chung 		error = device_add_group(dev,
27176423d295SWon Chung 			&dev_attr_physical_location_group);
27186423d295SWon Chung 		if (error)
27196423d295SWon Chung 			goto err_remove_dev_removable;
27206423d295SWon Chung 	}
27216423d295SWon Chung 
2722621a1672SDmitry Torokhov 	return 0;
2723621a1672SDmitry Torokhov 
27246423d295SWon Chung  err_remove_dev_removable:
27256423d295SWon Chung 	device_remove_file(dev, &dev_attr_removable);
272670f400d4SRajat Jain  err_remove_dev_waiting_for_supplier:
272770f400d4SRajat Jain 	device_remove_file(dev, &dev_attr_waiting_for_supplier);
2728da6d6475SSaravana Kannan  err_remove_dev_online:
2729da6d6475SSaravana Kannan 	device_remove_file(dev, &dev_attr_online);
2730ecfbf6fdSRafael J. Wysocki  err_remove_dev_groups:
2731ecfbf6fdSRafael J. Wysocki 	device_remove_groups(dev, dev->groups);
2732621a1672SDmitry Torokhov  err_remove_type_groups:
2733621a1672SDmitry Torokhov 	if (type)
2734621a1672SDmitry Torokhov 		device_remove_groups(dev, type->groups);
2735d05a6f96SGreg Kroah-Hartman  err_remove_class_groups:
2736d05a6f96SGreg Kroah-Hartman 	if (class)
2737d05a6f96SGreg Kroah-Hartman 		device_remove_groups(dev, class->dev_groups);
2738f9f852dfSKay Sievers 
27392620efefSGreg Kroah-Hartman 	return error;
27402620efefSGreg Kroah-Hartman }
27412620efefSGreg Kroah-Hartman 
27422620efefSGreg Kroah-Hartman static void device_remove_attrs(struct device *dev)
27432620efefSGreg Kroah-Hartman {
27442620efefSGreg Kroah-Hartman 	struct class *class = dev->class;
2745aed65af1SStephen Hemminger 	const struct device_type *type = dev->type;
27462620efefSGreg Kroah-Hartman 
27476423d295SWon Chung 	if (dev->physical_location) {
27486423d295SWon Chung 		device_remove_group(dev, &dev_attr_physical_location_group);
27496423d295SWon Chung 		kfree(dev->physical_location);
27506423d295SWon Chung 	}
27516423d295SWon Chung 
275270f400d4SRajat Jain 	device_remove_file(dev, &dev_attr_removable);
2753da6d6475SSaravana Kannan 	device_remove_file(dev, &dev_attr_waiting_for_supplier);
2754c5e064a6SGreg Kroah-Hartman 	device_remove_file(dev, &dev_attr_online);
2755621a1672SDmitry Torokhov 	device_remove_groups(dev, dev->groups);
2756f9f852dfSKay Sievers 
2757621a1672SDmitry Torokhov 	if (type)
2758621a1672SDmitry Torokhov 		device_remove_groups(dev, type->groups);
2759621a1672SDmitry Torokhov 
2760a6b01dedSGreg Kroah-Hartman 	if (class)
2761d05a6f96SGreg Kroah-Hartman 		device_remove_groups(dev, class->dev_groups);
2762c97415a7SStefan Achatz }
27632620efefSGreg Kroah-Hartman 
2764c5e064a6SGreg Kroah-Hartman static ssize_t dev_show(struct device *dev, struct device_attribute *attr,
276523681e47SGreg Kroah-Hartman 			char *buf)
276623681e47SGreg Kroah-Hartman {
276723681e47SGreg Kroah-Hartman 	return print_dev_t(buf, dev->devt);
276823681e47SGreg Kroah-Hartman }
2769c5e064a6SGreg Kroah-Hartman static DEVICE_ATTR_RO(dev);
2770ad6a1e1cSTejun Heo 
2771ca22e56dSKay Sievers /* /sys/devices/ */
2772881c6cfdSGreg Kroah-Hartman struct kset *devices_kset;
27731da177e4SLinus Torvalds 
27741da177e4SLinus Torvalds /**
277552cdbdd4SGrygorii Strashko  * devices_kset_move_before - Move device in the devices_kset's list.
277652cdbdd4SGrygorii Strashko  * @deva: Device to move.
277752cdbdd4SGrygorii Strashko  * @devb: Device @deva should come before.
277852cdbdd4SGrygorii Strashko  */
277952cdbdd4SGrygorii Strashko static void devices_kset_move_before(struct device *deva, struct device *devb)
278052cdbdd4SGrygorii Strashko {
278152cdbdd4SGrygorii Strashko 	if (!devices_kset)
278252cdbdd4SGrygorii Strashko 		return;
278352cdbdd4SGrygorii Strashko 	pr_debug("devices_kset: Moving %s before %s\n",
278452cdbdd4SGrygorii Strashko 		 dev_name(deva), dev_name(devb));
278552cdbdd4SGrygorii Strashko 	spin_lock(&devices_kset->list_lock);
278652cdbdd4SGrygorii Strashko 	list_move_tail(&deva->kobj.entry, &devb->kobj.entry);
278752cdbdd4SGrygorii Strashko 	spin_unlock(&devices_kset->list_lock);
278852cdbdd4SGrygorii Strashko }
278952cdbdd4SGrygorii Strashko 
279052cdbdd4SGrygorii Strashko /**
279152cdbdd4SGrygorii Strashko  * devices_kset_move_after - Move device in the devices_kset's list.
279252cdbdd4SGrygorii Strashko  * @deva: Device to move
279352cdbdd4SGrygorii Strashko  * @devb: Device @deva should come after.
279452cdbdd4SGrygorii Strashko  */
279552cdbdd4SGrygorii Strashko static void devices_kset_move_after(struct device *deva, struct device *devb)
279652cdbdd4SGrygorii Strashko {
279752cdbdd4SGrygorii Strashko 	if (!devices_kset)
279852cdbdd4SGrygorii Strashko 		return;
279952cdbdd4SGrygorii Strashko 	pr_debug("devices_kset: Moving %s after %s\n",
280052cdbdd4SGrygorii Strashko 		 dev_name(deva), dev_name(devb));
280152cdbdd4SGrygorii Strashko 	spin_lock(&devices_kset->list_lock);
280252cdbdd4SGrygorii Strashko 	list_move(&deva->kobj.entry, &devb->kobj.entry);
280352cdbdd4SGrygorii Strashko 	spin_unlock(&devices_kset->list_lock);
280452cdbdd4SGrygorii Strashko }
280552cdbdd4SGrygorii Strashko 
280652cdbdd4SGrygorii Strashko /**
280752cdbdd4SGrygorii Strashko  * devices_kset_move_last - move the device to the end of devices_kset's list.
280852cdbdd4SGrygorii Strashko  * @dev: device to move
280952cdbdd4SGrygorii Strashko  */
281052cdbdd4SGrygorii Strashko void devices_kset_move_last(struct device *dev)
281152cdbdd4SGrygorii Strashko {
281252cdbdd4SGrygorii Strashko 	if (!devices_kset)
281352cdbdd4SGrygorii Strashko 		return;
281452cdbdd4SGrygorii Strashko 	pr_debug("devices_kset: Moving %s to end of list\n", dev_name(dev));
281552cdbdd4SGrygorii Strashko 	spin_lock(&devices_kset->list_lock);
281652cdbdd4SGrygorii Strashko 	list_move_tail(&dev->kobj.entry, &devices_kset->list);
281752cdbdd4SGrygorii Strashko 	spin_unlock(&devices_kset->list_lock);
281852cdbdd4SGrygorii Strashko }
281952cdbdd4SGrygorii Strashko 
282052cdbdd4SGrygorii Strashko /**
28211da177e4SLinus Torvalds  * device_create_file - create sysfs attribute file for device.
28221da177e4SLinus Torvalds  * @dev: device.
28231da177e4SLinus Torvalds  * @attr: device attribute descriptor.
28241da177e4SLinus Torvalds  */
282526579ab7SPhil Carmody int device_create_file(struct device *dev,
282626579ab7SPhil Carmody 		       const struct device_attribute *attr)
28271da177e4SLinus Torvalds {
28281da177e4SLinus Torvalds 	int error = 0;
28298f46baaaSFelipe Balbi 
28308f46baaaSFelipe Balbi 	if (dev) {
28318f46baaaSFelipe Balbi 		WARN(((attr->attr.mode & S_IWUGO) && !attr->store),
283297521978Sdyoung@redhat.com 			"Attribute %s: write permission without 'store'\n",
283397521978Sdyoung@redhat.com 			attr->attr.name);
28348f46baaaSFelipe Balbi 		WARN(((attr->attr.mode & S_IRUGO) && !attr->show),
283597521978Sdyoung@redhat.com 			"Attribute %s: read permission without 'show'\n",
283697521978Sdyoung@redhat.com 			attr->attr.name);
28371da177e4SLinus Torvalds 		error = sysfs_create_file(&dev->kobj, &attr->attr);
28388f46baaaSFelipe Balbi 	}
28398f46baaaSFelipe Balbi 
28401da177e4SLinus Torvalds 	return error;
28411da177e4SLinus Torvalds }
284286df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_create_file);
28431da177e4SLinus Torvalds 
28441da177e4SLinus Torvalds /**
28451da177e4SLinus Torvalds  * device_remove_file - remove sysfs attribute file.
28461da177e4SLinus Torvalds  * @dev: device.
28471da177e4SLinus Torvalds  * @attr: device attribute descriptor.
28481da177e4SLinus Torvalds  */
284926579ab7SPhil Carmody void device_remove_file(struct device *dev,
285026579ab7SPhil Carmody 			const struct device_attribute *attr)
28511da177e4SLinus Torvalds {
28520c98b19fSCornelia Huck 	if (dev)
28531da177e4SLinus Torvalds 		sysfs_remove_file(&dev->kobj, &attr->attr);
28541da177e4SLinus Torvalds }
285586df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_remove_file);
28561da177e4SLinus Torvalds 
28572589f188SGreg Kroah-Hartman /**
28586b0afc2aSTejun Heo  * device_remove_file_self - remove sysfs attribute file from its own method.
28596b0afc2aSTejun Heo  * @dev: device.
28606b0afc2aSTejun Heo  * @attr: device attribute descriptor.
28616b0afc2aSTejun Heo  *
28626b0afc2aSTejun Heo  * See kernfs_remove_self() for details.
28636b0afc2aSTejun Heo  */
28646b0afc2aSTejun Heo bool device_remove_file_self(struct device *dev,
28656b0afc2aSTejun Heo 			     const struct device_attribute *attr)
28666b0afc2aSTejun Heo {
28676b0afc2aSTejun Heo 	if (dev)
28686b0afc2aSTejun Heo 		return sysfs_remove_file_self(&dev->kobj, &attr->attr);
28696b0afc2aSTejun Heo 	else
28706b0afc2aSTejun Heo 		return false;
28716b0afc2aSTejun Heo }
28726b0afc2aSTejun Heo EXPORT_SYMBOL_GPL(device_remove_file_self);
28736b0afc2aSTejun Heo 
28746b0afc2aSTejun Heo /**
28752589f188SGreg Kroah-Hartman  * device_create_bin_file - create sysfs binary attribute file for device.
28762589f188SGreg Kroah-Hartman  * @dev: device.
28772589f188SGreg Kroah-Hartman  * @attr: device binary attribute descriptor.
28782589f188SGreg Kroah-Hartman  */
287966ecb92bSPhil Carmody int device_create_bin_file(struct device *dev,
288066ecb92bSPhil Carmody 			   const struct bin_attribute *attr)
28812589f188SGreg Kroah-Hartman {
28822589f188SGreg Kroah-Hartman 	int error = -EINVAL;
28832589f188SGreg Kroah-Hartman 	if (dev)
28842589f188SGreg Kroah-Hartman 		error = sysfs_create_bin_file(&dev->kobj, attr);
28852589f188SGreg Kroah-Hartman 	return error;
28862589f188SGreg Kroah-Hartman }
28872589f188SGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_create_bin_file);
28882589f188SGreg Kroah-Hartman 
28892589f188SGreg Kroah-Hartman /**
28902589f188SGreg Kroah-Hartman  * device_remove_bin_file - remove sysfs binary attribute file
28912589f188SGreg Kroah-Hartman  * @dev: device.
28922589f188SGreg Kroah-Hartman  * @attr: device binary attribute descriptor.
28932589f188SGreg Kroah-Hartman  */
289466ecb92bSPhil Carmody void device_remove_bin_file(struct device *dev,
289566ecb92bSPhil Carmody 			    const struct bin_attribute *attr)
28962589f188SGreg Kroah-Hartman {
28972589f188SGreg Kroah-Hartman 	if (dev)
28982589f188SGreg Kroah-Hartman 		sysfs_remove_bin_file(&dev->kobj, attr);
28992589f188SGreg Kroah-Hartman }
29002589f188SGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_remove_bin_file);
29012589f188SGreg Kroah-Hartman 
290234bb61f9SJames Bottomley static void klist_children_get(struct klist_node *n)
290334bb61f9SJames Bottomley {
2904f791b8c8SGreg Kroah-Hartman 	struct device_private *p = to_device_private_parent(n);
2905f791b8c8SGreg Kroah-Hartman 	struct device *dev = p->device;
290634bb61f9SJames Bottomley 
290734bb61f9SJames Bottomley 	get_device(dev);
290834bb61f9SJames Bottomley }
290934bb61f9SJames Bottomley 
291034bb61f9SJames Bottomley static void klist_children_put(struct klist_node *n)
291134bb61f9SJames Bottomley {
2912f791b8c8SGreg Kroah-Hartman 	struct device_private *p = to_device_private_parent(n);
2913f791b8c8SGreg Kroah-Hartman 	struct device *dev = p->device;
291434bb61f9SJames Bottomley 
291534bb61f9SJames Bottomley 	put_device(dev);
291634bb61f9SJames Bottomley }
291734bb61f9SJames Bottomley 
29181da177e4SLinus Torvalds /**
29191da177e4SLinus Torvalds  * device_initialize - init device structure.
29201da177e4SLinus Torvalds  * @dev: device.
29211da177e4SLinus Torvalds  *
29225739411aSCornelia Huck  * This prepares the device for use by other layers by initializing
29235739411aSCornelia Huck  * its fields.
29241da177e4SLinus Torvalds  * It is the first half of device_register(), if called by
29255739411aSCornelia Huck  * that function, though it can also be called separately, so one
29265739411aSCornelia Huck  * may use @dev's fields. In particular, get_device()/put_device()
29275739411aSCornelia Huck  * may be used for reference counting of @dev after calling this
29285739411aSCornelia Huck  * function.
29295739411aSCornelia Huck  *
2930b10d5efdSAlan Stern  * All fields in @dev must be initialized by the caller to 0, except
2931b10d5efdSAlan Stern  * for those explicitly set to some other value.  The simplest
2932b10d5efdSAlan Stern  * approach is to use kzalloc() to allocate the structure containing
2933b10d5efdSAlan Stern  * @dev.
2934b10d5efdSAlan Stern  *
29355739411aSCornelia Huck  * NOTE: Use put_device() to give up your reference instead of freeing
29365739411aSCornelia Huck  * @dev directly once you have called this function.
29371da177e4SLinus Torvalds  */
29381da177e4SLinus Torvalds void device_initialize(struct device *dev)
29391da177e4SLinus Torvalds {
2940881c6cfdSGreg Kroah-Hartman 	dev->kobj.kset = devices_kset;
2941f9cb074bSGreg Kroah-Hartman 	kobject_init(&dev->kobj, &device_ktype);
29421da177e4SLinus Torvalds 	INIT_LIST_HEAD(&dev->dma_pools);
29433142788bSThomas Gleixner 	mutex_init(&dev->mutex);
29441704f47bSPeter Zijlstra 	lockdep_set_novalidate_class(&dev->mutex);
29459ac7849eSTejun Heo 	spin_lock_init(&dev->devres_lock);
29469ac7849eSTejun Heo 	INIT_LIST_HEAD(&dev->devres_head);
29473b98aeafSAlan Stern 	device_pm_init(dev);
2948d460d7f7SMax Gurtovoy 	set_dev_node(dev, NUMA_NO_NODE);
29499ed98953SRafael J. Wysocki 	INIT_LIST_HEAD(&dev->links.consumers);
29509ed98953SRafael J. Wysocki 	INIT_LIST_HEAD(&dev->links.suppliers);
29513b052a3eSSaravana Kannan 	INIT_LIST_HEAD(&dev->links.defer_sync);
29529ed98953SRafael J. Wysocki 	dev->links.status = DL_DEV_NO_DRIVER;
29536d4e9a8eSChristoph Hellwig #if defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_DEVICE) || \
29546d4e9a8eSChristoph Hellwig     defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU) || \
29556d4e9a8eSChristoph Hellwig     defined(CONFIG_ARCH_HAS_SYNC_DMA_FOR_CPU_ALL)
29566d4e9a8eSChristoph Hellwig 	dev->dma_coherent = dma_default_coherent;
29576d4e9a8eSChristoph Hellwig #endif
295869031f50SClaire Chang #ifdef CONFIG_SWIOTLB
2959463e862aSWill Deacon 	dev->dma_io_tlb_mem = &io_tlb_default_mem;
296069031f50SClaire Chang #endif
29611da177e4SLinus Torvalds }
296286df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_initialize);
29631da177e4SLinus Torvalds 
2964d73ce004STejun Heo struct kobject *virtual_device_parent(struct device *dev)
2965f0ee61a6SGreg Kroah-Hartman {
2966f0ee61a6SGreg Kroah-Hartman 	static struct kobject *virtual_dir = NULL;
2967f0ee61a6SGreg Kroah-Hartman 
2968f0ee61a6SGreg Kroah-Hartman 	if (!virtual_dir)
29694ff6abffSGreg Kroah-Hartman 		virtual_dir = kobject_create_and_add("virtual",
2970881c6cfdSGreg Kroah-Hartman 						     &devices_kset->kobj);
2971f0ee61a6SGreg Kroah-Hartman 
297286406245SKay Sievers 	return virtual_dir;
2973f0ee61a6SGreg Kroah-Hartman }
2974f0ee61a6SGreg Kroah-Hartman 
2975bc451f20SEric W. Biederman struct class_dir {
2976bc451f20SEric W. Biederman 	struct kobject kobj;
2977bc451f20SEric W. Biederman 	struct class *class;
2978bc451f20SEric W. Biederman };
2979bc451f20SEric W. Biederman 
2980bc451f20SEric W. Biederman #define to_class_dir(obj) container_of(obj, struct class_dir, kobj)
2981bc451f20SEric W. Biederman 
2982bc451f20SEric W. Biederman static void class_dir_release(struct kobject *kobj)
2983bc451f20SEric W. Biederman {
2984bc451f20SEric W. Biederman 	struct class_dir *dir = to_class_dir(kobj);
2985bc451f20SEric W. Biederman 	kfree(dir);
2986bc451f20SEric W. Biederman }
2987bc451f20SEric W. Biederman 
2988bc451f20SEric W. Biederman static const
298902a476d9SGreg Kroah-Hartman struct kobj_ns_type_operations *class_dir_child_ns_type(const struct kobject *kobj)
2990bc451f20SEric W. Biederman {
299102a476d9SGreg Kroah-Hartman 	const struct class_dir *dir = to_class_dir(kobj);
2992bc451f20SEric W. Biederman 	return dir->class->ns_type;
2993bc451f20SEric W. Biederman }
2994bc451f20SEric W. Biederman 
2995bc451f20SEric W. Biederman static struct kobj_type class_dir_ktype = {
2996bc451f20SEric W. Biederman 	.release	= class_dir_release,
2997bc451f20SEric W. Biederman 	.sysfs_ops	= &kobj_sysfs_ops,
2998bc451f20SEric W. Biederman 	.child_ns_type	= class_dir_child_ns_type
2999bc451f20SEric W. Biederman };
3000bc451f20SEric W. Biederman 
3001bc451f20SEric W. Biederman static struct kobject *
3002bc451f20SEric W. Biederman class_dir_create_and_add(struct class *class, struct kobject *parent_kobj)
3003bc451f20SEric W. Biederman {
3004bc451f20SEric W. Biederman 	struct class_dir *dir;
3005bc451f20SEric W. Biederman 	int retval;
3006bc451f20SEric W. Biederman 
3007bc451f20SEric W. Biederman 	dir = kzalloc(sizeof(*dir), GFP_KERNEL);
3008bc451f20SEric W. Biederman 	if (!dir)
300984d0c27dSTetsuo Handa 		return ERR_PTR(-ENOMEM);
3010bc451f20SEric W. Biederman 
3011bc451f20SEric W. Biederman 	dir->class = class;
3012bc451f20SEric W. Biederman 	kobject_init(&dir->kobj, &class_dir_ktype);
3013bc451f20SEric W. Biederman 
30146b6e39a6SKay Sievers 	dir->kobj.kset = &class->p->glue_dirs;
3015bc451f20SEric W. Biederman 
3016bc451f20SEric W. Biederman 	retval = kobject_add(&dir->kobj, parent_kobj, "%s", class->name);
3017bc451f20SEric W. Biederman 	if (retval < 0) {
3018bc451f20SEric W. Biederman 		kobject_put(&dir->kobj);
301984d0c27dSTetsuo Handa 		return ERR_PTR(retval);
3020bc451f20SEric W. Biederman 	}
3021bc451f20SEric W. Biederman 	return &dir->kobj;
3022bc451f20SEric W. Biederman }
3023bc451f20SEric W. Biederman 
3024e4a60d13SYijing Wang static DEFINE_MUTEX(gdp_mutex);
3025bc451f20SEric W. Biederman 
3026c744aeaeSCornelia Huck static struct kobject *get_device_parent(struct device *dev,
3027c744aeaeSCornelia Huck 					 struct device *parent)
302840fa5422SGreg Kroah-Hartman {
302986406245SKay Sievers 	if (dev->class) {
303086406245SKay Sievers 		struct kobject *kobj = NULL;
303186406245SKay Sievers 		struct kobject *parent_kobj;
303286406245SKay Sievers 		struct kobject *k;
303386406245SKay Sievers 
3034ead454feSRandy Dunlap #ifdef CONFIG_BLOCK
303539aba963SKay Sievers 		/* block disks show up in /sys/block */
3036e52eec13SAndi Kleen 		if (sysfs_deprecated && dev->class == &block_class) {
303739aba963SKay Sievers 			if (parent && parent->class == &block_class)
303839aba963SKay Sievers 				return &parent->kobj;
30396b6e39a6SKay Sievers 			return &block_class.p->subsys.kobj;
304039aba963SKay Sievers 		}
3041ead454feSRandy Dunlap #endif
3042e52eec13SAndi Kleen 
304386406245SKay Sievers 		/*
304486406245SKay Sievers 		 * If we have no parent, we live in "virtual".
30450f4dafc0SKay Sievers 		 * Class-devices with a non class-device as parent, live
30460f4dafc0SKay Sievers 		 * in a "glue" directory to prevent namespace collisions.
304786406245SKay Sievers 		 */
304886406245SKay Sievers 		if (parent == NULL)
304986406245SKay Sievers 			parent_kobj = virtual_device_parent(dev);
305024b1442dSEric W. Biederman 		else if (parent->class && !dev->class->ns_type)
305186406245SKay Sievers 			return &parent->kobj;
305286406245SKay Sievers 		else
305386406245SKay Sievers 			parent_kobj = &parent->kobj;
305486406245SKay Sievers 
305577d3d7c1STejun Heo 		mutex_lock(&gdp_mutex);
305677d3d7c1STejun Heo 
305786406245SKay Sievers 		/* find our class-directory at the parent and reference it */
30586b6e39a6SKay Sievers 		spin_lock(&dev->class->p->glue_dirs.list_lock);
30596b6e39a6SKay Sievers 		list_for_each_entry(k, &dev->class->p->glue_dirs.list, entry)
306086406245SKay Sievers 			if (k->parent == parent_kobj) {
306186406245SKay Sievers 				kobj = kobject_get(k);
306286406245SKay Sievers 				break;
306386406245SKay Sievers 			}
30646b6e39a6SKay Sievers 		spin_unlock(&dev->class->p->glue_dirs.list_lock);
306577d3d7c1STejun Heo 		if (kobj) {
306677d3d7c1STejun Heo 			mutex_unlock(&gdp_mutex);
306786406245SKay Sievers 			return kobj;
306877d3d7c1STejun Heo 		}
306986406245SKay Sievers 
307086406245SKay Sievers 		/* or create a new class-directory at the parent device */
3071bc451f20SEric W. Biederman 		k = class_dir_create_and_add(dev->class, parent_kobj);
30720f4dafc0SKay Sievers 		/* do not emit an uevent for this simple "glue" directory */
307377d3d7c1STejun Heo 		mutex_unlock(&gdp_mutex);
307443968d2fSGreg Kroah-Hartman 		return k;
307586406245SKay Sievers 	}
307686406245SKay Sievers 
3077ca22e56dSKay Sievers 	/* subsystems can specify a default root directory for their devices */
3078ca22e56dSKay Sievers 	if (!parent && dev->bus && dev->bus->dev_root)
3079ca22e56dSKay Sievers 		return &dev->bus->dev_root->kobj;
3080ca22e56dSKay Sievers 
308186406245SKay Sievers 	if (parent)
3082c744aeaeSCornelia Huck 		return &parent->kobj;
3083c744aeaeSCornelia Huck 	return NULL;
3084c744aeaeSCornelia Huck }
3085da231fd5SKay Sievers 
3086cebf8fd1SMing Lei static inline bool live_in_glue_dir(struct kobject *kobj,
3087cebf8fd1SMing Lei 				    struct device *dev)
3088cebf8fd1SMing Lei {
3089cebf8fd1SMing Lei 	if (!kobj || !dev->class ||
3090cebf8fd1SMing Lei 	    kobj->kset != &dev->class->p->glue_dirs)
3091cebf8fd1SMing Lei 		return false;
3092cebf8fd1SMing Lei 	return true;
3093cebf8fd1SMing Lei }
3094cebf8fd1SMing Lei 
3095cebf8fd1SMing Lei static inline struct kobject *get_glue_dir(struct device *dev)
3096cebf8fd1SMing Lei {
3097cebf8fd1SMing Lei 	return dev->kobj.parent;
3098cebf8fd1SMing Lei }
3099cebf8fd1SMing Lei 
3100f0832664SIngo Molnar /**
3101f0832664SIngo Molnar  * kobject_has_children - Returns whether a kobject has children.
3102f0832664SIngo Molnar  * @kobj: the object to test
3103f0832664SIngo Molnar  *
3104f0832664SIngo Molnar  * This will return whether a kobject has other kobjects as children.
3105f0832664SIngo Molnar  *
3106f0832664SIngo Molnar  * It does NOT account for the presence of attribute files, only sub
3107f0832664SIngo Molnar  * directories. It also assumes there is no concurrent addition or
3108f0832664SIngo Molnar  * removal of such children, and thus relies on external locking.
3109f0832664SIngo Molnar  */
3110f0832664SIngo Molnar static inline bool kobject_has_children(struct kobject *kobj)
3111f0832664SIngo Molnar {
3112f0832664SIngo Molnar 	WARN_ON_ONCE(kref_read(&kobj->kref) == 0);
3113f0832664SIngo Molnar 
3114f0832664SIngo Molnar 	return kobj->sd && kobj->sd->dir.subdirs;
3115f0832664SIngo Molnar }
3116f0832664SIngo Molnar 
3117cebf8fd1SMing Lei /*
3118cebf8fd1SMing Lei  * make sure cleaning up dir as the last step, we need to make
3119cebf8fd1SMing Lei  * sure .release handler of kobject is run with holding the
3120cebf8fd1SMing Lei  * global lock
3121cebf8fd1SMing Lei  */
312263b6971aSCornelia Huck static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
3123da231fd5SKay Sievers {
3124ac43432cSMuchun Song 	unsigned int ref;
3125ac43432cSMuchun Song 
31260f4dafc0SKay Sievers 	/* see if we live in a "glue" directory */
3127cebf8fd1SMing Lei 	if (!live_in_glue_dir(glue_dir, dev))
3128da231fd5SKay Sievers 		return;
3129da231fd5SKay Sievers 
3130e4a60d13SYijing Wang 	mutex_lock(&gdp_mutex);
3131ac43432cSMuchun Song 	/**
3132ac43432cSMuchun Song 	 * There is a race condition between removing glue directory
3133ac43432cSMuchun Song 	 * and adding a new device under the glue directory.
3134ac43432cSMuchun Song 	 *
3135ac43432cSMuchun Song 	 * CPU1:                                         CPU2:
3136ac43432cSMuchun Song 	 *
3137ac43432cSMuchun Song 	 * device_add()
3138ac43432cSMuchun Song 	 *   get_device_parent()
3139ac43432cSMuchun Song 	 *     class_dir_create_and_add()
3140ac43432cSMuchun Song 	 *       kobject_add_internal()
3141ac43432cSMuchun Song 	 *         create_dir()    // create glue_dir
3142ac43432cSMuchun Song 	 *
3143ac43432cSMuchun Song 	 *                                               device_add()
3144ac43432cSMuchun Song 	 *                                                 get_device_parent()
3145ac43432cSMuchun Song 	 *                                                   kobject_get() // get glue_dir
3146ac43432cSMuchun Song 	 *
3147ac43432cSMuchun Song 	 * device_del()
3148ac43432cSMuchun Song 	 *   cleanup_glue_dir()
3149ac43432cSMuchun Song 	 *     kobject_del(glue_dir)
3150ac43432cSMuchun Song 	 *
3151ac43432cSMuchun Song 	 *                                               kobject_add()
3152ac43432cSMuchun Song 	 *                                                 kobject_add_internal()
3153ac43432cSMuchun Song 	 *                                                   create_dir() // in glue_dir
3154ac43432cSMuchun Song 	 *                                                     sysfs_create_dir_ns()
3155ac43432cSMuchun Song 	 *                                                       kernfs_create_dir_ns(sd)
3156ac43432cSMuchun Song 	 *
3157ac43432cSMuchun Song 	 *       sysfs_remove_dir() // glue_dir->sd=NULL
3158ac43432cSMuchun Song 	 *       sysfs_put()        // free glue_dir->sd
3159ac43432cSMuchun Song 	 *
3160ac43432cSMuchun Song 	 *                                                         // sd is freed
3161ac43432cSMuchun Song 	 *                                                         kernfs_new_node(sd)
3162ac43432cSMuchun Song 	 *                                                           kernfs_get(glue_dir)
3163ac43432cSMuchun Song 	 *                                                           kernfs_add_one()
3164ac43432cSMuchun Song 	 *                                                           kernfs_put()
3165ac43432cSMuchun Song 	 *
3166ac43432cSMuchun Song 	 * Before CPU1 remove last child device under glue dir, if CPU2 add
3167ac43432cSMuchun Song 	 * a new device under glue dir, the glue_dir kobject reference count
3168ac43432cSMuchun Song 	 * will be increase to 2 in kobject_get(k). And CPU2 has been called
3169ac43432cSMuchun Song 	 * kernfs_create_dir_ns(). Meanwhile, CPU1 call sysfs_remove_dir()
3170ac43432cSMuchun Song 	 * and sysfs_put(). This result in glue_dir->sd is freed.
3171ac43432cSMuchun Song 	 *
3172ac43432cSMuchun Song 	 * Then the CPU2 will see a stale "empty" but still potentially used
3173ac43432cSMuchun Song 	 * glue dir around in kernfs_new_node().
3174ac43432cSMuchun Song 	 *
3175ac43432cSMuchun Song 	 * In order to avoid this happening, we also should make sure that
3176ac43432cSMuchun Song 	 * kernfs_node for glue_dir is released in CPU1 only when refcount
3177ac43432cSMuchun Song 	 * for glue_dir kobj is 1.
3178ac43432cSMuchun Song 	 */
3179ac43432cSMuchun Song 	ref = kref_read(&glue_dir->kref);
3180ac43432cSMuchun Song 	if (!kobject_has_children(glue_dir) && !--ref)
3181726e4109SBenjamin Herrenschmidt 		kobject_del(glue_dir);
31820f4dafc0SKay Sievers 	kobject_put(glue_dir);
3183e4a60d13SYijing Wang 	mutex_unlock(&gdp_mutex);
3184da231fd5SKay Sievers }
318563b6971aSCornelia Huck 
31862ee97cafSCornelia Huck static int device_add_class_symlinks(struct device *dev)
31872ee97cafSCornelia Huck {
31885590f319SBenjamin Herrenschmidt 	struct device_node *of_node = dev_of_node(dev);
31892ee97cafSCornelia Huck 	int error;
31902ee97cafSCornelia Huck 
31915590f319SBenjamin Herrenschmidt 	if (of_node) {
31920c3c234bSRob Herring 		error = sysfs_create_link(&dev->kobj, of_node_kobj(of_node), "of_node");
31935590f319SBenjamin Herrenschmidt 		if (error)
31945590f319SBenjamin Herrenschmidt 			dev_warn(dev, "Error %d creating of_node link\n",error);
31955590f319SBenjamin Herrenschmidt 		/* An error here doesn't warrant bringing down the device */
31965590f319SBenjamin Herrenschmidt 	}
31975590f319SBenjamin Herrenschmidt 
31982ee97cafSCornelia Huck 	if (!dev->class)
31992ee97cafSCornelia Huck 		return 0;
3200da231fd5SKay Sievers 
32011fbfee6cSGreg Kroah-Hartman 	error = sysfs_create_link(&dev->kobj,
32026b6e39a6SKay Sievers 				  &dev->class->p->subsys.kobj,
32032ee97cafSCornelia Huck 				  "subsystem");
32042ee97cafSCornelia Huck 	if (error)
32055590f319SBenjamin Herrenschmidt 		goto out_devnode;
3206da231fd5SKay Sievers 
32074e886c29SGreg Kroah-Hartman 	if (dev->parent && device_is_not_partition(dev)) {
32084f01a757SDmitry Torokhov 		error = sysfs_create_link(&dev->kobj, &dev->parent->kobj,
32094f01a757SDmitry Torokhov 					  "device");
32104f01a757SDmitry Torokhov 		if (error)
321139aba963SKay Sievers 			goto out_subsys;
32122ee97cafSCornelia Huck 	}
321339aba963SKay Sievers 
3214ead454feSRandy Dunlap #ifdef CONFIG_BLOCK
321539aba963SKay Sievers 	/* /sys/block has directories and does not need symlinks */
3216e52eec13SAndi Kleen 	if (sysfs_deprecated && dev->class == &block_class)
321739aba963SKay Sievers 		return 0;
3218ead454feSRandy Dunlap #endif
321939aba963SKay Sievers 
322039aba963SKay Sievers 	/* link in the class directory pointing to the device */
32216b6e39a6SKay Sievers 	error = sysfs_create_link(&dev->class->p->subsys.kobj,
322239aba963SKay Sievers 				  &dev->kobj, dev_name(dev));
322339aba963SKay Sievers 	if (error)
322439aba963SKay Sievers 		goto out_device;
322539aba963SKay Sievers 
32262ee97cafSCornelia Huck 	return 0;
32272ee97cafSCornelia Huck 
322839aba963SKay Sievers out_device:
322939aba963SKay Sievers 	sysfs_remove_link(&dev->kobj, "device");
3230da231fd5SKay Sievers 
32312ee97cafSCornelia Huck out_subsys:
32322ee97cafSCornelia Huck 	sysfs_remove_link(&dev->kobj, "subsystem");
32335590f319SBenjamin Herrenschmidt out_devnode:
32345590f319SBenjamin Herrenschmidt 	sysfs_remove_link(&dev->kobj, "of_node");
32352ee97cafSCornelia Huck 	return error;
32362ee97cafSCornelia Huck }
32372ee97cafSCornelia Huck 
32382ee97cafSCornelia Huck static void device_remove_class_symlinks(struct device *dev)
32392ee97cafSCornelia Huck {
32405590f319SBenjamin Herrenschmidt 	if (dev_of_node(dev))
32415590f319SBenjamin Herrenschmidt 		sysfs_remove_link(&dev->kobj, "of_node");
32425590f319SBenjamin Herrenschmidt 
32432ee97cafSCornelia Huck 	if (!dev->class)
32442ee97cafSCornelia Huck 		return;
3245da231fd5SKay Sievers 
32464e886c29SGreg Kroah-Hartman 	if (dev->parent && device_is_not_partition(dev))
3247da231fd5SKay Sievers 		sysfs_remove_link(&dev->kobj, "device");
32482ee97cafSCornelia Huck 	sysfs_remove_link(&dev->kobj, "subsystem");
3249ead454feSRandy Dunlap #ifdef CONFIG_BLOCK
3250e52eec13SAndi Kleen 	if (sysfs_deprecated && dev->class == &block_class)
325139aba963SKay Sievers 		return;
3252ead454feSRandy Dunlap #endif
32536b6e39a6SKay Sievers 	sysfs_delete_link(&dev->class->p->subsys.kobj, &dev->kobj, dev_name(dev));
32542ee97cafSCornelia Huck }
32552ee97cafSCornelia Huck 
32561da177e4SLinus Torvalds /**
3257413c239fSStephen Rothwell  * dev_set_name - set a device name
3258413c239fSStephen Rothwell  * @dev: device
325946232366SRandy Dunlap  * @fmt: format string for the device's name
3260413c239fSStephen Rothwell  */
3261413c239fSStephen Rothwell int dev_set_name(struct device *dev, const char *fmt, ...)
3262413c239fSStephen Rothwell {
3263413c239fSStephen Rothwell 	va_list vargs;
32641fa5ae85SKay Sievers 	int err;
3265413c239fSStephen Rothwell 
3266413c239fSStephen Rothwell 	va_start(vargs, fmt);
32671fa5ae85SKay Sievers 	err = kobject_set_name_vargs(&dev->kobj, fmt, vargs);
3268413c239fSStephen Rothwell 	va_end(vargs);
32691fa5ae85SKay Sievers 	return err;
3270413c239fSStephen Rothwell }
3271413c239fSStephen Rothwell EXPORT_SYMBOL_GPL(dev_set_name);
3272413c239fSStephen Rothwell 
3273413c239fSStephen Rothwell /**
3274e105b8bfSDan Williams  * device_to_dev_kobj - select a /sys/dev/ directory for the device
3275e105b8bfSDan Williams  * @dev: device
3276e105b8bfSDan Williams  *
3277e105b8bfSDan Williams  * By default we select char/ for new entries.  Setting class->dev_obj
3278e105b8bfSDan Williams  * to NULL prevents an entry from being created.  class->dev_kobj must
3279e105b8bfSDan Williams  * be set (or cleared) before any devices are registered to the class
3280e105b8bfSDan Williams  * otherwise device_create_sys_dev_entry() and
32810d4e293cSPeter Korsgaard  * device_remove_sys_dev_entry() will disagree about the presence of
32820d4e293cSPeter Korsgaard  * the link.
3283e105b8bfSDan Williams  */
3284e105b8bfSDan Williams static struct kobject *device_to_dev_kobj(struct device *dev)
3285e105b8bfSDan Williams {
3286e105b8bfSDan Williams 	struct kobject *kobj;
3287e105b8bfSDan Williams 
3288e105b8bfSDan Williams 	if (dev->class)
3289e105b8bfSDan Williams 		kobj = dev->class->dev_kobj;
3290e105b8bfSDan Williams 	else
3291e105b8bfSDan Williams 		kobj = sysfs_dev_char_kobj;
3292e105b8bfSDan Williams 
3293e105b8bfSDan Williams 	return kobj;
3294e105b8bfSDan Williams }
3295e105b8bfSDan Williams 
3296e105b8bfSDan Williams static int device_create_sys_dev_entry(struct device *dev)
3297e105b8bfSDan Williams {
3298e105b8bfSDan Williams 	struct kobject *kobj = device_to_dev_kobj(dev);
3299e105b8bfSDan Williams 	int error = 0;
3300e105b8bfSDan Williams 	char devt_str[15];
3301e105b8bfSDan Williams 
3302e105b8bfSDan Williams 	if (kobj) {
3303e105b8bfSDan Williams 		format_dev_t(devt_str, dev->devt);
3304e105b8bfSDan Williams 		error = sysfs_create_link(kobj, &dev->kobj, devt_str);
3305e105b8bfSDan Williams 	}
3306e105b8bfSDan Williams 
3307e105b8bfSDan Williams 	return error;
3308e105b8bfSDan Williams }
3309e105b8bfSDan Williams 
3310e105b8bfSDan Williams static void device_remove_sys_dev_entry(struct device *dev)
3311e105b8bfSDan Williams {
3312e105b8bfSDan Williams 	struct kobject *kobj = device_to_dev_kobj(dev);
3313e105b8bfSDan Williams 	char devt_str[15];
3314e105b8bfSDan Williams 
3315e105b8bfSDan Williams 	if (kobj) {
3316e105b8bfSDan Williams 		format_dev_t(devt_str, dev->devt);
3317e105b8bfSDan Williams 		sysfs_remove_link(kobj, devt_str);
3318e105b8bfSDan Williams 	}
3319e105b8bfSDan Williams }
3320e105b8bfSDan Williams 
332146d3a037SShaokun Zhang static int device_private_init(struct device *dev)
3322b4028437SGreg Kroah-Hartman {
3323b4028437SGreg Kroah-Hartman 	dev->p = kzalloc(sizeof(*dev->p), GFP_KERNEL);
3324b4028437SGreg Kroah-Hartman 	if (!dev->p)
3325b4028437SGreg Kroah-Hartman 		return -ENOMEM;
3326b4028437SGreg Kroah-Hartman 	dev->p->device = dev;
3327b4028437SGreg Kroah-Hartman 	klist_init(&dev->p->klist_children, klist_children_get,
3328b4028437SGreg Kroah-Hartman 		   klist_children_put);
3329ef8a3fd6SGreg Kroah-Hartman 	INIT_LIST_HEAD(&dev->p->deferred_probe);
3330b4028437SGreg Kroah-Hartman 	return 0;
3331b4028437SGreg Kroah-Hartman }
3332b4028437SGreg Kroah-Hartman 
3333e105b8bfSDan Williams /**
33341da177e4SLinus Torvalds  * device_add - add device to device hierarchy.
33351da177e4SLinus Torvalds  * @dev: device.
33361da177e4SLinus Torvalds  *
33371da177e4SLinus Torvalds  * This is part 2 of device_register(), though may be called
33381da177e4SLinus Torvalds  * separately _iff_ device_initialize() has been called separately.
33391da177e4SLinus Torvalds  *
33405739411aSCornelia Huck  * This adds @dev to the kobject hierarchy via kobject_add(), adds it
33411da177e4SLinus Torvalds  * to the global and sibling lists for the device, then
33421da177e4SLinus Torvalds  * adds it to the other relevant subsystems of the driver model.
33435739411aSCornelia Huck  *
3344b10d5efdSAlan Stern  * Do not call this routine or device_register() more than once for
3345b10d5efdSAlan Stern  * any device structure.  The driver model core is not designed to work
3346b10d5efdSAlan Stern  * with devices that get unregistered and then spring back to life.
3347b10d5efdSAlan Stern  * (Among other things, it's very hard to guarantee that all references
3348b10d5efdSAlan Stern  * to the previous incarnation of @dev have been dropped.)  Allocate
3349b10d5efdSAlan Stern  * and register a fresh new struct device instead.
3350b10d5efdSAlan Stern  *
33515739411aSCornelia Huck  * NOTE: _Never_ directly free @dev after calling this function, even
33525739411aSCornelia Huck  * if it returned an error! Always use put_device() to give up your
33535739411aSCornelia Huck  * reference instead.
3354affada72SBorislav Petkov  *
3355affada72SBorislav Petkov  * Rule of thumb is: if device_add() succeeds, you should call
3356affada72SBorislav Petkov  * device_del() when you want to get rid of it. If device_add() has
3357affada72SBorislav Petkov  * *not* succeeded, use *only* put_device() to drop the reference
3358affada72SBorislav Petkov  * count.
33591da177e4SLinus Torvalds  */
33601da177e4SLinus Torvalds int device_add(struct device *dev)
33611da177e4SLinus Torvalds {
336235dbf4efSViresh Kumar 	struct device *parent;
3363ca22e56dSKay Sievers 	struct kobject *kobj;
3364c47ed219SGreg Kroah-Hartman 	struct class_interface *class_intf;
33655f5377eaSSaravana Kannan 	int error = -EINVAL;
3366cebf8fd1SMing Lei 	struct kobject *glue_dir = NULL;
3367775b64d2SRafael J. Wysocki 
33681da177e4SLinus Torvalds 	dev = get_device(dev);
3369c906a48aSGreg Kroah-Hartman 	if (!dev)
3370c906a48aSGreg Kroah-Hartman 		goto done;
3371c906a48aSGreg Kroah-Hartman 
3372fb069a5dSGreg Kroah-Hartman 	if (!dev->p) {
3373b4028437SGreg Kroah-Hartman 		error = device_private_init(dev);
3374b4028437SGreg Kroah-Hartman 		if (error)
3375fb069a5dSGreg Kroah-Hartman 			goto done;
3376fb069a5dSGreg Kroah-Hartman 	}
3377fb069a5dSGreg Kroah-Hartman 
33781fa5ae85SKay Sievers 	/*
33791fa5ae85SKay Sievers 	 * for statically allocated devices, which should all be converted
33801fa5ae85SKay Sievers 	 * some day, we need to initialize the name. We prevent reading back
33811fa5ae85SKay Sievers 	 * the name, and force the use of dev_name()
33821fa5ae85SKay Sievers 	 */
33831fa5ae85SKay Sievers 	if (dev->init_name) {
3384acc0e90fSGreg Kroah-Hartman 		dev_set_name(dev, "%s", dev->init_name);
33851fa5ae85SKay Sievers 		dev->init_name = NULL;
33861fa5ae85SKay Sievers 	}
3387c906a48aSGreg Kroah-Hartman 
3388ca22e56dSKay Sievers 	/* subsystems can specify simple device enumeration */
3389ca22e56dSKay Sievers 	if (!dev_name(dev) && dev->bus && dev->bus->dev_name)
3390ca22e56dSKay Sievers 		dev_set_name(dev, "%s%u", dev->bus->dev_name, dev->id);
3391ca22e56dSKay Sievers 
3392e6309e75SThomas Gleixner 	if (!dev_name(dev)) {
3393e6309e75SThomas Gleixner 		error = -EINVAL;
33945c8563d7SKay Sievers 		goto name_error;
3395e6309e75SThomas Gleixner 	}
33961da177e4SLinus Torvalds 
33971e0b2cf9SKay Sievers 	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
3398c205ef48SGreg Kroah-Hartman 
33991da177e4SLinus Torvalds 	parent = get_device(dev->parent);
3400ca22e56dSKay Sievers 	kobj = get_device_parent(dev, parent);
340184d0c27dSTetsuo Handa 	if (IS_ERR(kobj)) {
340284d0c27dSTetsuo Handa 		error = PTR_ERR(kobj);
340384d0c27dSTetsuo Handa 		goto parent_error;
340484d0c27dSTetsuo Handa 	}
3405ca22e56dSKay Sievers 	if (kobj)
3406ca22e56dSKay Sievers 		dev->kobj.parent = kobj;
34071da177e4SLinus Torvalds 
34080d358f22SYinghai Lu 	/* use parent numa_node */
340956f2de81SZhen Lei 	if (parent && (dev_to_node(dev) == NUMA_NO_NODE))
34100d358f22SYinghai Lu 		set_dev_node(dev, dev_to_node(parent));
34110d358f22SYinghai Lu 
34121da177e4SLinus Torvalds 	/* first, register with generic layer. */
34138a577ffcSKay Sievers 	/* we require the name to be set before, and pass NULL */
34148a577ffcSKay Sievers 	error = kobject_add(&dev->kobj, dev->kobj.parent, NULL);
3415cebf8fd1SMing Lei 	if (error) {
3416cebf8fd1SMing Lei 		glue_dir = get_glue_dir(dev);
34171da177e4SLinus Torvalds 		goto Error;
3418cebf8fd1SMing Lei 	}
3419a7fd6706SKay Sievers 
342037022644SBrian Walsh 	/* notify platform of device entry */
3421b2ebd9ddSRafael J. Wysocki 	device_platform_notify(dev);
342237022644SBrian Walsh 
3423c5e064a6SGreg Kroah-Hartman 	error = device_create_file(dev, &dev_attr_uevent);
3424a306eea4SCornelia Huck 	if (error)
3425a306eea4SCornelia Huck 		goto attrError;
3426a7fd6706SKay Sievers 
34272ee97cafSCornelia Huck 	error = device_add_class_symlinks(dev);
34282ee97cafSCornelia Huck 	if (error)
34292ee97cafSCornelia Huck 		goto SymlinkError;
3430dc0afa83SCornelia Huck 	error = device_add_attrs(dev);
3431dc0afa83SCornelia Huck 	if (error)
34322620efefSGreg Kroah-Hartman 		goto AttrsError;
3433dc0afa83SCornelia Huck 	error = bus_add_device(dev);
3434dc0afa83SCornelia Huck 	if (error)
34351da177e4SLinus Torvalds 		goto BusError;
34363b98aeafSAlan Stern 	error = dpm_sysfs_add(dev);
343757eee3d2SRafael J. Wysocki 	if (error)
34383b98aeafSAlan Stern 		goto DPMError;
34393b98aeafSAlan Stern 	device_pm_add(dev);
3440ec0676eeSAlan Stern 
34410cd75047SSergey Klyaus 	if (MAJOR(dev->devt)) {
34420cd75047SSergey Klyaus 		error = device_create_file(dev, &dev_attr_dev);
34430cd75047SSergey Klyaus 		if (error)
34440cd75047SSergey Klyaus 			goto DevAttrError;
34450cd75047SSergey Klyaus 
34460cd75047SSergey Klyaus 		error = device_create_sys_dev_entry(dev);
34470cd75047SSergey Klyaus 		if (error)
34480cd75047SSergey Klyaus 			goto SysEntryError;
34490cd75047SSergey Klyaus 
34500cd75047SSergey Klyaus 		devtmpfs_create_node(dev);
34510cd75047SSergey Klyaus 	}
34520cd75047SSergey Klyaus 
3453ec0676eeSAlan Stern 	/* Notify clients of device addition.  This call must come
3454268863f4Smajianpeng 	 * after dpm_sysfs_add() and before kobject_uevent().
3455ec0676eeSAlan Stern 	 */
3456ec0676eeSAlan Stern 	if (dev->bus)
3457ec0676eeSAlan Stern 		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
3458ec0676eeSAlan Stern 					     BUS_NOTIFY_ADD_DEVICE, dev);
3459ec0676eeSAlan Stern 
346053877d06SKay Sievers 	kobject_uevent(&dev->kobj, KOBJ_ADD);
3461372a67c0SSaravana Kannan 
3462e2ae9bccSSaravana Kannan 	/*
3463e2ae9bccSSaravana Kannan 	 * Check if any of the other devices (consumers) have been waiting for
3464e2ae9bccSSaravana Kannan 	 * this device (supplier) to be added so that they can create a device
3465e2ae9bccSSaravana Kannan 	 * link to it.
3466e2ae9bccSSaravana Kannan 	 *
3467e2ae9bccSSaravana Kannan 	 * This needs to happen after device_pm_add() because device_link_add()
3468e2ae9bccSSaravana Kannan 	 * requires the supplier be registered before it's called.
3469e2ae9bccSSaravana Kannan 	 *
34702cd38fd1SSaravana Kannan 	 * But this also needs to happen before bus_probe_device() to make sure
3471e2ae9bccSSaravana Kannan 	 * waiting consumers can link to it before the driver is bound to the
3472e2ae9bccSSaravana Kannan 	 * device and the driver sync_state callback is called for this device.
3473e2ae9bccSSaravana Kannan 	 */
34742cd38fd1SSaravana Kannan 	if (dev->fwnode && !dev->fwnode->dev) {
34752cd38fd1SSaravana Kannan 		dev->fwnode->dev = dev;
34765f5377eaSSaravana Kannan 		fw_devlink_link_device(dev);
347703324507SSaravana Kannan 	}
3478e2ae9bccSSaravana Kannan 
34792023c610SAlan Stern 	bus_probe_device(dev);
3480d46f3e3eSSaravana Kannan 
3481d46f3e3eSSaravana Kannan 	/*
3482d46f3e3eSSaravana Kannan 	 * If all driver registration is done and a newly added device doesn't
3483d46f3e3eSSaravana Kannan 	 * match with any driver, don't block its consumers from probing in
3484d46f3e3eSSaravana Kannan 	 * case the consumer device is able to operate without this supplier.
3485d46f3e3eSSaravana Kannan 	 */
3486d46f3e3eSSaravana Kannan 	if (dev->fwnode && fw_devlink_drv_reg_done && !dev->can_match)
3487d46f3e3eSSaravana Kannan 		fw_devlink_unblock_consumers(dev);
3488d46f3e3eSSaravana Kannan 
34891da177e4SLinus Torvalds 	if (parent)
3490f791b8c8SGreg Kroah-Hartman 		klist_add_tail(&dev->p->knode_parent,
3491f791b8c8SGreg Kroah-Hartman 			       &parent->p->klist_children);
34921da177e4SLinus Torvalds 
34935d9fd169SGreg Kroah-Hartman 	if (dev->class) {
3494ca22e56dSKay Sievers 		mutex_lock(&dev->class->p->mutex);
3495c47ed219SGreg Kroah-Hartman 		/* tie the class to the device */
3496570d0200SWei Yang 		klist_add_tail(&dev->p->knode_class,
34976b6e39a6SKay Sievers 			       &dev->class->p->klist_devices);
3498c47ed219SGreg Kroah-Hartman 
3499c47ed219SGreg Kroah-Hartman 		/* notify any interfaces that the device is here */
3500184f1f77SGreg Kroah-Hartman 		list_for_each_entry(class_intf,
3501ca22e56dSKay Sievers 				    &dev->class->p->interfaces, node)
3502c47ed219SGreg Kroah-Hartman 			if (class_intf->add_dev)
3503c47ed219SGreg Kroah-Hartman 				class_intf->add_dev(dev, class_intf);
3504ca22e56dSKay Sievers 		mutex_unlock(&dev->class->p->mutex);
35055d9fd169SGreg Kroah-Hartman 	}
3506c906a48aSGreg Kroah-Hartman done:
35071da177e4SLinus Torvalds 	put_device(dev);
35081da177e4SLinus Torvalds 	return error;
35090cd75047SSergey Klyaus  SysEntryError:
35100cd75047SSergey Klyaus 	if (MAJOR(dev->devt))
35110cd75047SSergey Klyaus 		device_remove_file(dev, &dev_attr_dev);
35120cd75047SSergey Klyaus  DevAttrError:
35130cd75047SSergey Klyaus 	device_pm_remove(dev);
35140cd75047SSergey Klyaus 	dpm_sysfs_remove(dev);
35153b98aeafSAlan Stern  DPMError:
3516*f6837f34SYang Yingliang 	dev->driver = NULL;
351757eee3d2SRafael J. Wysocki 	bus_remove_device(dev);
351857eee3d2SRafael J. Wysocki  BusError:
35192620efefSGreg Kroah-Hartman 	device_remove_attrs(dev);
35202620efefSGreg Kroah-Hartman  AttrsError:
35212ee97cafSCornelia Huck 	device_remove_class_symlinks(dev);
35222ee97cafSCornelia Huck  SymlinkError:
3523c5e064a6SGreg Kroah-Hartman 	device_remove_file(dev, &dev_attr_uevent);
352423681e47SGreg Kroah-Hartman  attrError:
3525b2ebd9ddSRafael J. Wysocki 	device_platform_notify_remove(dev);
3526312c004dSKay Sievers 	kobject_uevent(&dev->kobj, KOBJ_REMOVE);
3527cebf8fd1SMing Lei 	glue_dir = get_glue_dir(dev);
35281da177e4SLinus Torvalds 	kobject_del(&dev->kobj);
35291da177e4SLinus Torvalds  Error:
3530cebf8fd1SMing Lei 	cleanup_glue_dir(dev, glue_dir);
353184d0c27dSTetsuo Handa parent_error:
35321da177e4SLinus Torvalds 	put_device(parent);
35335c8563d7SKay Sievers name_error:
35345c8563d7SKay Sievers 	kfree(dev->p);
35355c8563d7SKay Sievers 	dev->p = NULL;
3536c906a48aSGreg Kroah-Hartman 	goto done;
35371da177e4SLinus Torvalds }
353886df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_add);
35391da177e4SLinus Torvalds 
35401da177e4SLinus Torvalds /**
35411da177e4SLinus Torvalds  * device_register - register a device with the system.
35421da177e4SLinus Torvalds  * @dev: pointer to the device structure
35431da177e4SLinus Torvalds  *
35441da177e4SLinus Torvalds  * This happens in two clean steps - initialize the device
35451da177e4SLinus Torvalds  * and add it to the system. The two steps can be called
35461da177e4SLinus Torvalds  * separately, but this is the easiest and most common.
35471da177e4SLinus Torvalds  * I.e. you should only call the two helpers separately if
35481da177e4SLinus Torvalds  * have a clearly defined need to use and refcount the device
35491da177e4SLinus Torvalds  * before it is added to the hierarchy.
35505739411aSCornelia Huck  *
3551b10d5efdSAlan Stern  * For more information, see the kerneldoc for device_initialize()
3552b10d5efdSAlan Stern  * and device_add().
3553b10d5efdSAlan Stern  *
35545739411aSCornelia Huck  * NOTE: _Never_ directly free @dev after calling this function, even
35555739411aSCornelia Huck  * if it returned an error! Always use put_device() to give up the
35565739411aSCornelia Huck  * reference initialized in this function instead.
35571da177e4SLinus Torvalds  */
35581da177e4SLinus Torvalds int device_register(struct device *dev)
35591da177e4SLinus Torvalds {
35601da177e4SLinus Torvalds 	device_initialize(dev);
35611da177e4SLinus Torvalds 	return device_add(dev);
35621da177e4SLinus Torvalds }
356386df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_register);
35641da177e4SLinus Torvalds 
35651da177e4SLinus Torvalds /**
35661da177e4SLinus Torvalds  * get_device - increment reference count for device.
35671da177e4SLinus Torvalds  * @dev: device.
35681da177e4SLinus Torvalds  *
35691da177e4SLinus Torvalds  * This simply forwards the call to kobject_get(), though
35701da177e4SLinus Torvalds  * we do take care to provide for the case that we get a NULL
35711da177e4SLinus Torvalds  * pointer passed in.
35721da177e4SLinus Torvalds  */
35731da177e4SLinus Torvalds struct device *get_device(struct device *dev)
35741da177e4SLinus Torvalds {
3575b0d1f807SLars-Peter Clausen 	return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL;
35761da177e4SLinus Torvalds }
357786df2687SDavid Graham White EXPORT_SYMBOL_GPL(get_device);
35781da177e4SLinus Torvalds 
35791da177e4SLinus Torvalds /**
35801da177e4SLinus Torvalds  * put_device - decrement reference count.
35811da177e4SLinus Torvalds  * @dev: device in question.
35821da177e4SLinus Torvalds  */
35831da177e4SLinus Torvalds void put_device(struct device *dev)
35841da177e4SLinus Torvalds {
3585edfaa7c3SKay Sievers 	/* might_sleep(); */
35861da177e4SLinus Torvalds 	if (dev)
35871da177e4SLinus Torvalds 		kobject_put(&dev->kobj);
35881da177e4SLinus Torvalds }
358986df2687SDavid Graham White EXPORT_SYMBOL_GPL(put_device);
35901da177e4SLinus Torvalds 
359100289cd8SDan Williams bool kill_device(struct device *dev)
359200289cd8SDan Williams {
359300289cd8SDan Williams 	/*
359400289cd8SDan Williams 	 * Require the device lock and set the "dead" flag to guarantee that
359500289cd8SDan Williams 	 * the update behavior is consistent with the other bitfields near
359600289cd8SDan Williams 	 * it and that we cannot have an asynchronous probe routine trying
359700289cd8SDan Williams 	 * to run while we are tearing out the bus/class/sysfs from
359800289cd8SDan Williams 	 * underneath the device.
359900289cd8SDan Williams 	 */
36008c60a141SJulian Wiedmann 	device_lock_assert(dev);
360100289cd8SDan Williams 
360200289cd8SDan Williams 	if (dev->p->dead)
360300289cd8SDan Williams 		return false;
360400289cd8SDan Williams 	dev->p->dead = true;
360500289cd8SDan Williams 	return true;
360600289cd8SDan Williams }
360700289cd8SDan Williams EXPORT_SYMBOL_GPL(kill_device);
360800289cd8SDan Williams 
36091da177e4SLinus Torvalds /**
36101da177e4SLinus Torvalds  * device_del - delete device from system.
36111da177e4SLinus Torvalds  * @dev: device.
36121da177e4SLinus Torvalds  *
36131da177e4SLinus Torvalds  * This is the first part of the device unregistration
36141da177e4SLinus Torvalds  * sequence. This removes the device from the lists we control
36151da177e4SLinus Torvalds  * from here, has it removed from the other driver model
36161da177e4SLinus Torvalds  * subsystems it was added to in device_add(), and removes it
36171da177e4SLinus Torvalds  * from the kobject hierarchy.
36181da177e4SLinus Torvalds  *
36191da177e4SLinus Torvalds  * NOTE: this should be called manually _iff_ device_add() was
36201da177e4SLinus Torvalds  * also called manually.
36211da177e4SLinus Torvalds  */
36221da177e4SLinus Torvalds void device_del(struct device *dev)
36231da177e4SLinus Torvalds {
36241da177e4SLinus Torvalds 	struct device *parent = dev->parent;
3625cebf8fd1SMing Lei 	struct kobject *glue_dir = NULL;
3626c47ed219SGreg Kroah-Hartman 	struct class_interface *class_intf;
3627b8530017SOliver Neukum 	unsigned int noio_flag;
36281da177e4SLinus Torvalds 
36293451a495SAlexander Duyck 	device_lock(dev);
363000289cd8SDan Williams 	kill_device(dev);
36313451a495SAlexander Duyck 	device_unlock(dev);
36323451a495SAlexander Duyck 
3633372a67c0SSaravana Kannan 	if (dev->fwnode && dev->fwnode->dev == dev)
3634372a67c0SSaravana Kannan 		dev->fwnode->dev = NULL;
3635372a67c0SSaravana Kannan 
3636ec0676eeSAlan Stern 	/* Notify clients of device removal.  This call must come
3637ec0676eeSAlan Stern 	 * before dpm_sysfs_remove().
3638ec0676eeSAlan Stern 	 */
3639b8530017SOliver Neukum 	noio_flag = memalloc_noio_save();
3640ec0676eeSAlan Stern 	if (dev->bus)
3641ec0676eeSAlan Stern 		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
3642ec0676eeSAlan Stern 					     BUS_NOTIFY_DEL_DEVICE, dev);
36439ed98953SRafael J. Wysocki 
36443b98aeafSAlan Stern 	dpm_sysfs_remove(dev);
36451da177e4SLinus Torvalds 	if (parent)
3646f791b8c8SGreg Kroah-Hartman 		klist_del(&dev->p->knode_parent);
3647e105b8bfSDan Williams 	if (MAJOR(dev->devt)) {
36482b2af54aSKay Sievers 		devtmpfs_delete_node(dev);
3649e105b8bfSDan Williams 		device_remove_sys_dev_entry(dev);
3650c5e064a6SGreg Kroah-Hartman 		device_remove_file(dev, &dev_attr_dev);
3651e105b8bfSDan Williams 	}
3652b9d9c82bSKay Sievers 	if (dev->class) {
3653da231fd5SKay Sievers 		device_remove_class_symlinks(dev);
365499ef3ef8SKay Sievers 
3655ca22e56dSKay Sievers 		mutex_lock(&dev->class->p->mutex);
3656c47ed219SGreg Kroah-Hartman 		/* notify any interfaces that the device is now gone */
3657184f1f77SGreg Kroah-Hartman 		list_for_each_entry(class_intf,
3658ca22e56dSKay Sievers 				    &dev->class->p->interfaces, node)
3659c47ed219SGreg Kroah-Hartman 			if (class_intf->remove_dev)
3660c47ed219SGreg Kroah-Hartman 				class_intf->remove_dev(dev, class_intf);
3661c47ed219SGreg Kroah-Hartman 		/* remove the device from the class list */
3662570d0200SWei Yang 		klist_del(&dev->p->knode_class);
3663ca22e56dSKay Sievers 		mutex_unlock(&dev->class->p->mutex);
3664b9d9c82bSKay Sievers 	}
3665c5e064a6SGreg Kroah-Hartman 	device_remove_file(dev, &dev_attr_uevent);
36662620efefSGreg Kroah-Hartman 	device_remove_attrs(dev);
366728953533SBenjamin Herrenschmidt 	bus_remove_device(dev);
36684b6d1f12SLongX Zhang 	device_pm_remove(dev);
3669d1c3414cSGrant Likely 	driver_deferred_probe_del(dev);
3670b2ebd9ddSRafael J. Wysocki 	device_platform_notify_remove(dev);
36712ec16150SJeffy Chen 	device_links_purge(dev);
36721da177e4SLinus Torvalds 
3673599bad38SJoerg Roedel 	if (dev->bus)
3674599bad38SJoerg Roedel 		blocking_notifier_call_chain(&dev->bus->p->bus_notifier,
3675599bad38SJoerg Roedel 					     BUS_NOTIFY_REMOVED_DEVICE, dev);
3676312c004dSKay Sievers 	kobject_uevent(&dev->kobj, KOBJ_REMOVE);
3677cebf8fd1SMing Lei 	glue_dir = get_glue_dir(dev);
36781da177e4SLinus Torvalds 	kobject_del(&dev->kobj);
3679cebf8fd1SMing Lei 	cleanup_glue_dir(dev, glue_dir);
3680b8530017SOliver Neukum 	memalloc_noio_restore(noio_flag);
36811da177e4SLinus Torvalds 	put_device(parent);
36821da177e4SLinus Torvalds }
368386df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_del);
36841da177e4SLinus Torvalds 
36851da177e4SLinus Torvalds /**
36861da177e4SLinus Torvalds  * device_unregister - unregister device from system.
36871da177e4SLinus Torvalds  * @dev: device going away.
36881da177e4SLinus Torvalds  *
36891da177e4SLinus Torvalds  * We do this in two parts, like we do device_register(). First,
36901da177e4SLinus Torvalds  * we remove it from all the subsystems with device_del(), then
36911da177e4SLinus Torvalds  * we decrement the reference count via put_device(). If that
36921da177e4SLinus Torvalds  * is the final reference count, the device will be cleaned up
36931da177e4SLinus Torvalds  * via device_release() above. Otherwise, the structure will
36941da177e4SLinus Torvalds  * stick around until the final reference to the device is dropped.
36951da177e4SLinus Torvalds  */
36961da177e4SLinus Torvalds void device_unregister(struct device *dev)
36971da177e4SLinus Torvalds {
36981e0b2cf9SKay Sievers 	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
36991da177e4SLinus Torvalds 	device_del(dev);
37001da177e4SLinus Torvalds 	put_device(dev);
37011da177e4SLinus Torvalds }
370286df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_unregister);
37031da177e4SLinus Torvalds 
37043d060aebSAndy Shevchenko static struct device *prev_device(struct klist_iter *i)
37053d060aebSAndy Shevchenko {
37063d060aebSAndy Shevchenko 	struct klist_node *n = klist_prev(i);
37073d060aebSAndy Shevchenko 	struct device *dev = NULL;
37083d060aebSAndy Shevchenko 	struct device_private *p;
37093d060aebSAndy Shevchenko 
37103d060aebSAndy Shevchenko 	if (n) {
37113d060aebSAndy Shevchenko 		p = to_device_private_parent(n);
37123d060aebSAndy Shevchenko 		dev = p->device;
37133d060aebSAndy Shevchenko 	}
37143d060aebSAndy Shevchenko 	return dev;
37153d060aebSAndy Shevchenko }
37163d060aebSAndy Shevchenko 
371736239577Smochel@digitalimplant.org static struct device *next_device(struct klist_iter *i)
371836239577Smochel@digitalimplant.org {
371936239577Smochel@digitalimplant.org 	struct klist_node *n = klist_next(i);
3720f791b8c8SGreg Kroah-Hartman 	struct device *dev = NULL;
3721f791b8c8SGreg Kroah-Hartman 	struct device_private *p;
3722f791b8c8SGreg Kroah-Hartman 
3723f791b8c8SGreg Kroah-Hartman 	if (n) {
3724f791b8c8SGreg Kroah-Hartman 		p = to_device_private_parent(n);
3725f791b8c8SGreg Kroah-Hartman 		dev = p->device;
3726f791b8c8SGreg Kroah-Hartman 	}
3727f791b8c8SGreg Kroah-Hartman 	return dev;
372836239577Smochel@digitalimplant.org }
372936239577Smochel@digitalimplant.org 
37301da177e4SLinus Torvalds /**
3731e454cea2SKay Sievers  * device_get_devnode - path of device node file
37326fcf53acSKay Sievers  * @dev: device
3733e454cea2SKay Sievers  * @mode: returned file access mode
37343c2670e6SKay Sievers  * @uid: returned file owner
37353c2670e6SKay Sievers  * @gid: returned file group
37366fcf53acSKay Sievers  * @tmp: possibly allocated string
37376fcf53acSKay Sievers  *
37386fcf53acSKay Sievers  * Return the relative path of a possible device node.
37396fcf53acSKay Sievers  * Non-default names may need to allocate a memory to compose
37406fcf53acSKay Sievers  * a name. This memory is returned in tmp and needs to be
37416fcf53acSKay Sievers  * freed by the caller.
37426fcf53acSKay Sievers  */
3743e454cea2SKay Sievers const char *device_get_devnode(struct device *dev,
37444e4098a3SGreg Kroah-Hartman 			       umode_t *mode, kuid_t *uid, kgid_t *gid,
37453c2670e6SKay Sievers 			       const char **tmp)
37466fcf53acSKay Sievers {
37476fcf53acSKay Sievers 	char *s;
37486fcf53acSKay Sievers 
37496fcf53acSKay Sievers 	*tmp = NULL;
37506fcf53acSKay Sievers 
37516fcf53acSKay Sievers 	/* the device type may provide a specific name */
3752e454cea2SKay Sievers 	if (dev->type && dev->type->devnode)
37533c2670e6SKay Sievers 		*tmp = dev->type->devnode(dev, mode, uid, gid);
37546fcf53acSKay Sievers 	if (*tmp)
37556fcf53acSKay Sievers 		return *tmp;
37566fcf53acSKay Sievers 
37576fcf53acSKay Sievers 	/* the class may provide a specific name */
3758e454cea2SKay Sievers 	if (dev->class && dev->class->devnode)
3759e454cea2SKay Sievers 		*tmp = dev->class->devnode(dev, mode);
37606fcf53acSKay Sievers 	if (*tmp)
37616fcf53acSKay Sievers 		return *tmp;
37626fcf53acSKay Sievers 
37636fcf53acSKay Sievers 	/* return name without allocation, tmp == NULL */
37646fcf53acSKay Sievers 	if (strchr(dev_name(dev), '!') == NULL)
37656fcf53acSKay Sievers 		return dev_name(dev);
37666fcf53acSKay Sievers 
37676fcf53acSKay Sievers 	/* replace '!' in the name with '/' */
3768a29fd614SRasmus Villemoes 	s = kstrdup(dev_name(dev), GFP_KERNEL);
3769a29fd614SRasmus Villemoes 	if (!s)
37706fcf53acSKay Sievers 		return NULL;
3771a29fd614SRasmus Villemoes 	strreplace(s, '!', '/');
3772a29fd614SRasmus Villemoes 	return *tmp = s;
37736fcf53acSKay Sievers }
37746fcf53acSKay Sievers 
37756fcf53acSKay Sievers /**
37761da177e4SLinus Torvalds  * device_for_each_child - device child iterator.
3777c41455fbSRandy Dunlap  * @parent: parent struct device.
37781da177e4SLinus Torvalds  * @fn: function to be called for each device.
3779f8878dcbSRobert P. J. Day  * @data: data for the callback.
37801da177e4SLinus Torvalds  *
3781c41455fbSRandy Dunlap  * Iterate over @parent's child devices, and call @fn for each,
37821da177e4SLinus Torvalds  * passing it @data.
37831da177e4SLinus Torvalds  *
37841da177e4SLinus Torvalds  * We check the return of @fn each time. If it returns anything
37851da177e4SLinus Torvalds  * other than 0, we break out and return that value.
37861da177e4SLinus Torvalds  */
378736239577Smochel@digitalimplant.org int device_for_each_child(struct device *parent, void *data,
37884a3ad20cSGreg Kroah-Hartman 			  int (*fn)(struct device *dev, void *data))
37891da177e4SLinus Torvalds {
379036239577Smochel@digitalimplant.org 	struct klist_iter i;
37911da177e4SLinus Torvalds 	struct device *child;
37921da177e4SLinus Torvalds 	int error = 0;
37931da177e4SLinus Torvalds 
3794014c90dbSGreg Kroah-Hartman 	if (!parent->p)
3795014c90dbSGreg Kroah-Hartman 		return 0;
3796014c90dbSGreg Kroah-Hartman 
3797f791b8c8SGreg Kroah-Hartman 	klist_iter_init(&parent->p->klist_children, &i);
379893ead7c9SGimcuan Hui 	while (!error && (child = next_device(&i)))
379936239577Smochel@digitalimplant.org 		error = fn(child, data);
380036239577Smochel@digitalimplant.org 	klist_iter_exit(&i);
38011da177e4SLinus Torvalds 	return error;
38021da177e4SLinus Torvalds }
380386df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_for_each_child);
38041da177e4SLinus Torvalds 
38055ab69981SCornelia Huck /**
38063d060aebSAndy Shevchenko  * device_for_each_child_reverse - device child iterator in reversed order.
38073d060aebSAndy Shevchenko  * @parent: parent struct device.
38083d060aebSAndy Shevchenko  * @fn: function to be called for each device.
38093d060aebSAndy Shevchenko  * @data: data for the callback.
38103d060aebSAndy Shevchenko  *
38113d060aebSAndy Shevchenko  * Iterate over @parent's child devices, and call @fn for each,
38123d060aebSAndy Shevchenko  * passing it @data.
38133d060aebSAndy Shevchenko  *
38143d060aebSAndy Shevchenko  * We check the return of @fn each time. If it returns anything
38153d060aebSAndy Shevchenko  * other than 0, we break out and return that value.
38163d060aebSAndy Shevchenko  */
38173d060aebSAndy Shevchenko int device_for_each_child_reverse(struct device *parent, void *data,
38183d060aebSAndy Shevchenko 				  int (*fn)(struct device *dev, void *data))
38193d060aebSAndy Shevchenko {
38203d060aebSAndy Shevchenko 	struct klist_iter i;
38213d060aebSAndy Shevchenko 	struct device *child;
38223d060aebSAndy Shevchenko 	int error = 0;
38233d060aebSAndy Shevchenko 
38243d060aebSAndy Shevchenko 	if (!parent->p)
38253d060aebSAndy Shevchenko 		return 0;
38263d060aebSAndy Shevchenko 
38273d060aebSAndy Shevchenko 	klist_iter_init(&parent->p->klist_children, &i);
38283d060aebSAndy Shevchenko 	while ((child = prev_device(&i)) && !error)
38293d060aebSAndy Shevchenko 		error = fn(child, data);
38303d060aebSAndy Shevchenko 	klist_iter_exit(&i);
38313d060aebSAndy Shevchenko 	return error;
38323d060aebSAndy Shevchenko }
38333d060aebSAndy Shevchenko EXPORT_SYMBOL_GPL(device_for_each_child_reverse);
38343d060aebSAndy Shevchenko 
38353d060aebSAndy Shevchenko /**
38365ab69981SCornelia Huck  * device_find_child - device iterator for locating a particular device.
38375ab69981SCornelia Huck  * @parent: parent struct device
38385ab69981SCornelia Huck  * @match: Callback function to check device
3839f8878dcbSRobert P. J. Day  * @data: Data to pass to match function
38405ab69981SCornelia Huck  *
38415ab69981SCornelia Huck  * This is similar to the device_for_each_child() function above, but it
38425ab69981SCornelia Huck  * returns a reference to a device that is 'found' for later use, as
38435ab69981SCornelia Huck  * determined by the @match callback.
38445ab69981SCornelia Huck  *
38455ab69981SCornelia Huck  * The callback should return 0 if the device doesn't match and non-zero
38465ab69981SCornelia Huck  * if it does.  If the callback returns non-zero and a reference to the
38475ab69981SCornelia Huck  * current device can be obtained, this function will return to the caller
38485ab69981SCornelia Huck  * and not iterate over any more devices.
3849a4e2400aSFederico Vaga  *
3850a4e2400aSFederico Vaga  * NOTE: you will need to drop the reference with put_device() after use.
38515ab69981SCornelia Huck  */
38525ab69981SCornelia Huck struct device *device_find_child(struct device *parent, void *data,
38534a3ad20cSGreg Kroah-Hartman 				 int (*match)(struct device *dev, void *data))
38545ab69981SCornelia Huck {
38555ab69981SCornelia Huck 	struct klist_iter i;
38565ab69981SCornelia Huck 	struct device *child;
38575ab69981SCornelia Huck 
38585ab69981SCornelia Huck 	if (!parent)
38595ab69981SCornelia Huck 		return NULL;
38605ab69981SCornelia Huck 
3861f791b8c8SGreg Kroah-Hartman 	klist_iter_init(&parent->p->klist_children, &i);
38625ab69981SCornelia Huck 	while ((child = next_device(&i)))
38635ab69981SCornelia Huck 		if (match(child, data) && get_device(child))
38645ab69981SCornelia Huck 			break;
38655ab69981SCornelia Huck 	klist_iter_exit(&i);
38665ab69981SCornelia Huck 	return child;
38675ab69981SCornelia Huck }
386886df2687SDavid Graham White EXPORT_SYMBOL_GPL(device_find_child);
38695ab69981SCornelia Huck 
3870dad9bb01SHeikki Krogerus /**
3871dad9bb01SHeikki Krogerus  * device_find_child_by_name - device iterator for locating a child device.
3872dad9bb01SHeikki Krogerus  * @parent: parent struct device
3873dad9bb01SHeikki Krogerus  * @name: name of the child device
3874dad9bb01SHeikki Krogerus  *
3875dad9bb01SHeikki Krogerus  * This is similar to the device_find_child() function above, but it
3876dad9bb01SHeikki Krogerus  * returns a reference to a device that has the name @name.
3877dad9bb01SHeikki Krogerus  *
3878dad9bb01SHeikki Krogerus  * NOTE: you will need to drop the reference with put_device() after use.
3879dad9bb01SHeikki Krogerus  */
3880dad9bb01SHeikki Krogerus struct device *device_find_child_by_name(struct device *parent,
3881dad9bb01SHeikki Krogerus 					 const char *name)
3882dad9bb01SHeikki Krogerus {
3883dad9bb01SHeikki Krogerus 	struct klist_iter i;
3884dad9bb01SHeikki Krogerus 	struct device *child;
3885dad9bb01SHeikki Krogerus 
3886dad9bb01SHeikki Krogerus 	if (!parent)
3887dad9bb01SHeikki Krogerus 		return NULL;
3888dad9bb01SHeikki Krogerus 
3889dad9bb01SHeikki Krogerus 	klist_iter_init(&parent->p->klist_children, &i);
3890dad9bb01SHeikki Krogerus 	while ((child = next_device(&i)))
3891c77f520dSDan Williams 		if (sysfs_streq(dev_name(child), name) && get_device(child))
3892dad9bb01SHeikki Krogerus 			break;
3893dad9bb01SHeikki Krogerus 	klist_iter_exit(&i);
3894dad9bb01SHeikki Krogerus 	return child;
3895dad9bb01SHeikki Krogerus }
3896dad9bb01SHeikki Krogerus EXPORT_SYMBOL_GPL(device_find_child_by_name);
3897dad9bb01SHeikki Krogerus 
389882b070beSAndy Shevchenko static int match_any(struct device *dev, void *unused)
389982b070beSAndy Shevchenko {
390082b070beSAndy Shevchenko 	return 1;
390182b070beSAndy Shevchenko }
390282b070beSAndy Shevchenko 
390382b070beSAndy Shevchenko /**
390482b070beSAndy Shevchenko  * device_find_any_child - device iterator for locating a child device, if any.
390582b070beSAndy Shevchenko  * @parent: parent struct device
390682b070beSAndy Shevchenko  *
390782b070beSAndy Shevchenko  * This is similar to the device_find_child() function above, but it
390882b070beSAndy Shevchenko  * returns a reference to a child device, if any.
390982b070beSAndy Shevchenko  *
391082b070beSAndy Shevchenko  * NOTE: you will need to drop the reference with put_device() after use.
391182b070beSAndy Shevchenko  */
391282b070beSAndy Shevchenko struct device *device_find_any_child(struct device *parent)
391382b070beSAndy Shevchenko {
391482b070beSAndy Shevchenko 	return device_find_child(parent, NULL, match_any);
391582b070beSAndy Shevchenko }
391682b070beSAndy Shevchenko EXPORT_SYMBOL_GPL(device_find_any_child);
391782b070beSAndy Shevchenko 
39181da177e4SLinus Torvalds int __init devices_init(void)
39191da177e4SLinus Torvalds {
3920881c6cfdSGreg Kroah-Hartman 	devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
3921881c6cfdSGreg Kroah-Hartman 	if (!devices_kset)
3922881c6cfdSGreg Kroah-Hartman 		return -ENOMEM;
3923e105b8bfSDan Williams 	dev_kobj = kobject_create_and_add("dev", NULL);
3924e105b8bfSDan Williams 	if (!dev_kobj)
3925e105b8bfSDan Williams 		goto dev_kobj_err;
3926e105b8bfSDan Williams 	sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
3927e105b8bfSDan Williams 	if (!sysfs_dev_block_kobj)
3928e105b8bfSDan Williams 		goto block_kobj_err;
3929e105b8bfSDan Williams 	sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
3930e105b8bfSDan Williams 	if (!sysfs_dev_char_kobj)
3931e105b8bfSDan Williams 		goto char_kobj_err;
3932e105b8bfSDan Williams 
3933881c6cfdSGreg Kroah-Hartman 	return 0;
3934e105b8bfSDan Williams 
3935e105b8bfSDan Williams  char_kobj_err:
3936e105b8bfSDan Williams 	kobject_put(sysfs_dev_block_kobj);
3937e105b8bfSDan Williams  block_kobj_err:
3938e105b8bfSDan Williams 	kobject_put(dev_kobj);
3939e105b8bfSDan Williams  dev_kobj_err:
3940e105b8bfSDan Williams 	kset_unregister(devices_kset);
3941e105b8bfSDan Williams 	return -ENOMEM;
39421da177e4SLinus Torvalds }
39431da177e4SLinus Torvalds 
39444f3549d7SRafael J. Wysocki static int device_check_offline(struct device *dev, void *not_used)
39454f3549d7SRafael J. Wysocki {
39464f3549d7SRafael J. Wysocki 	int ret;
39474f3549d7SRafael J. Wysocki 
39484f3549d7SRafael J. Wysocki 	ret = device_for_each_child(dev, NULL, device_check_offline);
39494f3549d7SRafael J. Wysocki 	if (ret)
39504f3549d7SRafael J. Wysocki 		return ret;
39514f3549d7SRafael J. Wysocki 
39524f3549d7SRafael J. Wysocki 	return device_supports_offline(dev) && !dev->offline ? -EBUSY : 0;
39534f3549d7SRafael J. Wysocki }
39544f3549d7SRafael J. Wysocki 
39554f3549d7SRafael J. Wysocki /**
39564f3549d7SRafael J. Wysocki  * device_offline - Prepare the device for hot-removal.
39574f3549d7SRafael J. Wysocki  * @dev: Device to be put offline.
39584f3549d7SRafael J. Wysocki  *
39594f3549d7SRafael J. Wysocki  * Execute the device bus type's .offline() callback, if present, to prepare
39604f3549d7SRafael J. Wysocki  * the device for a subsequent hot-removal.  If that succeeds, the device must
39614f3549d7SRafael J. Wysocki  * not be used until either it is removed or its bus type's .online() callback
39624f3549d7SRafael J. Wysocki  * is executed.
39634f3549d7SRafael J. Wysocki  *
39644f3549d7SRafael J. Wysocki  * Call under device_hotplug_lock.
39654f3549d7SRafael J. Wysocki  */
39664f3549d7SRafael J. Wysocki int device_offline(struct device *dev)
39674f3549d7SRafael J. Wysocki {
39684f3549d7SRafael J. Wysocki 	int ret;
39694f3549d7SRafael J. Wysocki 
39704f3549d7SRafael J. Wysocki 	if (dev->offline_disabled)
39714f3549d7SRafael J. Wysocki 		return -EPERM;
39724f3549d7SRafael J. Wysocki 
39734f3549d7SRafael J. Wysocki 	ret = device_for_each_child(dev, NULL, device_check_offline);
39744f3549d7SRafael J. Wysocki 	if (ret)
39754f3549d7SRafael J. Wysocki 		return ret;
39764f3549d7SRafael J. Wysocki 
39774f3549d7SRafael J. Wysocki 	device_lock(dev);
39784f3549d7SRafael J. Wysocki 	if (device_supports_offline(dev)) {
39794f3549d7SRafael J. Wysocki 		if (dev->offline) {
39804f3549d7SRafael J. Wysocki 			ret = 1;
39814f3549d7SRafael J. Wysocki 		} else {
39824f3549d7SRafael J. Wysocki 			ret = dev->bus->offline(dev);
39834f3549d7SRafael J. Wysocki 			if (!ret) {
39844f3549d7SRafael J. Wysocki 				kobject_uevent(&dev->kobj, KOBJ_OFFLINE);
39854f3549d7SRafael J. Wysocki 				dev->offline = true;
39864f3549d7SRafael J. Wysocki 			}
39874f3549d7SRafael J. Wysocki 		}
39884f3549d7SRafael J. Wysocki 	}
39894f3549d7SRafael J. Wysocki 	device_unlock(dev);
39904f3549d7SRafael J. Wysocki 
39914f3549d7SRafael J. Wysocki 	return ret;
39924f3549d7SRafael J. Wysocki }
39934f3549d7SRafael J. Wysocki 
39944f3549d7SRafael J. Wysocki /**
39954f3549d7SRafael J. Wysocki  * device_online - Put the device back online after successful device_offline().
39964f3549d7SRafael J. Wysocki  * @dev: Device to be put back online.
39974f3549d7SRafael J. Wysocki  *
39984f3549d7SRafael J. Wysocki  * If device_offline() has been successfully executed for @dev, but the device
39994f3549d7SRafael J. Wysocki  * has not been removed subsequently, execute its bus type's .online() callback
40004f3549d7SRafael J. Wysocki  * to indicate that the device can be used again.
40014f3549d7SRafael J. Wysocki  *
40024f3549d7SRafael J. Wysocki  * Call under device_hotplug_lock.
40034f3549d7SRafael J. Wysocki  */
40044f3549d7SRafael J. Wysocki int device_online(struct device *dev)
40054f3549d7SRafael J. Wysocki {
40064f3549d7SRafael J. Wysocki 	int ret = 0;
40074f3549d7SRafael J. Wysocki 
40084f3549d7SRafael J. Wysocki 	device_lock(dev);
40094f3549d7SRafael J. Wysocki 	if (device_supports_offline(dev)) {
40104f3549d7SRafael J. Wysocki 		if (dev->offline) {
40114f3549d7SRafael J. Wysocki 			ret = dev->bus->online(dev);
40124f3549d7SRafael J. Wysocki 			if (!ret) {
40134f3549d7SRafael J. Wysocki 				kobject_uevent(&dev->kobj, KOBJ_ONLINE);
40144f3549d7SRafael J. Wysocki 				dev->offline = false;
40154f3549d7SRafael J. Wysocki 			}
40164f3549d7SRafael J. Wysocki 		} else {
40174f3549d7SRafael J. Wysocki 			ret = 1;
40184f3549d7SRafael J. Wysocki 		}
40194f3549d7SRafael J. Wysocki 	}
40204f3549d7SRafael J. Wysocki 	device_unlock(dev);
40214f3549d7SRafael J. Wysocki 
40224f3549d7SRafael J. Wysocki 	return ret;
40234f3549d7SRafael J. Wysocki }
40244f3549d7SRafael J. Wysocki 
40257f100d15SKarthigan Srinivasan struct root_device {
40260aa0dc41SMark McLoughlin 	struct device dev;
40270aa0dc41SMark McLoughlin 	struct module *owner;
40280aa0dc41SMark McLoughlin };
40290aa0dc41SMark McLoughlin 
403093058424SJosh Triplett static inline struct root_device *to_root_device(struct device *d)
4031481e2079SFerenc Wagner {
4032481e2079SFerenc Wagner 	return container_of(d, struct root_device, dev);
4033481e2079SFerenc Wagner }
40340aa0dc41SMark McLoughlin 
40350aa0dc41SMark McLoughlin static void root_device_release(struct device *dev)
40360aa0dc41SMark McLoughlin {
40370aa0dc41SMark McLoughlin 	kfree(to_root_device(dev));
40380aa0dc41SMark McLoughlin }
40390aa0dc41SMark McLoughlin 
40400aa0dc41SMark McLoughlin /**
40410aa0dc41SMark McLoughlin  * __root_device_register - allocate and register a root device
40420aa0dc41SMark McLoughlin  * @name: root device name
40430aa0dc41SMark McLoughlin  * @owner: owner module of the root device, usually THIS_MODULE
40440aa0dc41SMark McLoughlin  *
40450aa0dc41SMark McLoughlin  * This function allocates a root device and registers it
40460aa0dc41SMark McLoughlin  * using device_register(). In order to free the returned
40470aa0dc41SMark McLoughlin  * device, use root_device_unregister().
40480aa0dc41SMark McLoughlin  *
40490aa0dc41SMark McLoughlin  * Root devices are dummy devices which allow other devices
40500aa0dc41SMark McLoughlin  * to be grouped under /sys/devices. Use this function to
40510aa0dc41SMark McLoughlin  * allocate a root device and then use it as the parent of
40520aa0dc41SMark McLoughlin  * any device which should appear under /sys/devices/{name}
40530aa0dc41SMark McLoughlin  *
40540aa0dc41SMark McLoughlin  * The /sys/devices/{name} directory will also contain a
40550aa0dc41SMark McLoughlin  * 'module' symlink which points to the @owner directory
40560aa0dc41SMark McLoughlin  * in sysfs.
40570aa0dc41SMark McLoughlin  *
4058f0eae0edSJani Nikula  * Returns &struct device pointer on success, or ERR_PTR() on error.
4059f0eae0edSJani Nikula  *
40600aa0dc41SMark McLoughlin  * Note: You probably want to use root_device_register().
40610aa0dc41SMark McLoughlin  */
40620aa0dc41SMark McLoughlin struct device *__root_device_register(const char *name, struct module *owner)
40630aa0dc41SMark McLoughlin {
40640aa0dc41SMark McLoughlin 	struct root_device *root;
40650aa0dc41SMark McLoughlin 	int err = -ENOMEM;
40660aa0dc41SMark McLoughlin 
40670aa0dc41SMark McLoughlin 	root = kzalloc(sizeof(struct root_device), GFP_KERNEL);
40680aa0dc41SMark McLoughlin 	if (!root)
40690aa0dc41SMark McLoughlin 		return ERR_PTR(err);
40700aa0dc41SMark McLoughlin 
4071acc0e90fSGreg Kroah-Hartman 	err = dev_set_name(&root->dev, "%s", name);
40720aa0dc41SMark McLoughlin 	if (err) {
40730aa0dc41SMark McLoughlin 		kfree(root);
40740aa0dc41SMark McLoughlin 		return ERR_PTR(err);
40750aa0dc41SMark McLoughlin 	}
40760aa0dc41SMark McLoughlin 
40770aa0dc41SMark McLoughlin 	root->dev.release = root_device_release;
40780aa0dc41SMark McLoughlin 
40790aa0dc41SMark McLoughlin 	err = device_register(&root->dev);
40800aa0dc41SMark McLoughlin 	if (err) {
40810aa0dc41SMark McLoughlin 		put_device(&root->dev);
40820aa0dc41SMark McLoughlin 		return ERR_PTR(err);
40830aa0dc41SMark McLoughlin 	}
40840aa0dc41SMark McLoughlin 
40851d9e882bSChristoph Egger #ifdef CONFIG_MODULES	/* gotta find a "cleaner" way to do this */
40860aa0dc41SMark McLoughlin 	if (owner) {
40870aa0dc41SMark McLoughlin 		struct module_kobject *mk = &owner->mkobj;
40880aa0dc41SMark McLoughlin 
40890aa0dc41SMark McLoughlin 		err = sysfs_create_link(&root->dev.kobj, &mk->kobj, "module");
40900aa0dc41SMark McLoughlin 		if (err) {
40910aa0dc41SMark McLoughlin 			device_unregister(&root->dev);
40920aa0dc41SMark McLoughlin 			return ERR_PTR(err);
40930aa0dc41SMark McLoughlin 		}
40940aa0dc41SMark McLoughlin 		root->owner = owner;
40950aa0dc41SMark McLoughlin 	}
40960aa0dc41SMark McLoughlin #endif
40970aa0dc41SMark McLoughlin 
40980aa0dc41SMark McLoughlin 	return &root->dev;
40990aa0dc41SMark McLoughlin }
41000aa0dc41SMark McLoughlin EXPORT_SYMBOL_GPL(__root_device_register);
41010aa0dc41SMark McLoughlin 
41020aa0dc41SMark McLoughlin /**
41030aa0dc41SMark McLoughlin  * root_device_unregister - unregister and free a root device
41047cbcf225SRandy Dunlap  * @dev: device going away
41050aa0dc41SMark McLoughlin  *
41060aa0dc41SMark McLoughlin  * This function unregisters and cleans up a device that was created by
41070aa0dc41SMark McLoughlin  * root_device_register().
41080aa0dc41SMark McLoughlin  */
41090aa0dc41SMark McLoughlin void root_device_unregister(struct device *dev)
41100aa0dc41SMark McLoughlin {
41110aa0dc41SMark McLoughlin 	struct root_device *root = to_root_device(dev);
41120aa0dc41SMark McLoughlin 
41130aa0dc41SMark McLoughlin 	if (root->owner)
41140aa0dc41SMark McLoughlin 		sysfs_remove_link(&root->dev.kobj, "module");
41150aa0dc41SMark McLoughlin 
41160aa0dc41SMark McLoughlin 	device_unregister(dev);
41170aa0dc41SMark McLoughlin }
41180aa0dc41SMark McLoughlin EXPORT_SYMBOL_GPL(root_device_unregister);
41190aa0dc41SMark McLoughlin 
412023681e47SGreg Kroah-Hartman 
412123681e47SGreg Kroah-Hartman static void device_create_release(struct device *dev)
412223681e47SGreg Kroah-Hartman {
41231e0b2cf9SKay Sievers 	pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
412423681e47SGreg Kroah-Hartman 	kfree(dev);
412523681e47SGreg Kroah-Hartman }
412623681e47SGreg Kroah-Hartman 
41276a8b55d7SMathieu Malaterre static __printf(6, 0) struct device *
412839ef3112SGuenter Roeck device_create_groups_vargs(struct class *class, struct device *parent,
412939ef3112SGuenter Roeck 			   dev_t devt, void *drvdata,
413039ef3112SGuenter Roeck 			   const struct attribute_group **groups,
413139ef3112SGuenter Roeck 			   const char *fmt, va_list args)
413239ef3112SGuenter Roeck {
413339ef3112SGuenter Roeck 	struct device *dev = NULL;
413439ef3112SGuenter Roeck 	int retval = -ENODEV;
413539ef3112SGuenter Roeck 
4136d70590d5SYang Yingliang 	if (IS_ERR_OR_NULL(class))
413739ef3112SGuenter Roeck 		goto error;
413839ef3112SGuenter Roeck 
413939ef3112SGuenter Roeck 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
414039ef3112SGuenter Roeck 	if (!dev) {
414139ef3112SGuenter Roeck 		retval = -ENOMEM;
414239ef3112SGuenter Roeck 		goto error;
414339ef3112SGuenter Roeck 	}
414439ef3112SGuenter Roeck 
4145bbc780f8SDavid Herrmann 	device_initialize(dev);
414639ef3112SGuenter Roeck 	dev->devt = devt;
414739ef3112SGuenter Roeck 	dev->class = class;
414839ef3112SGuenter Roeck 	dev->parent = parent;
414939ef3112SGuenter Roeck 	dev->groups = groups;
415039ef3112SGuenter Roeck 	dev->release = device_create_release;
415139ef3112SGuenter Roeck 	dev_set_drvdata(dev, drvdata);
415239ef3112SGuenter Roeck 
415339ef3112SGuenter Roeck 	retval = kobject_set_name_vargs(&dev->kobj, fmt, args);
415439ef3112SGuenter Roeck 	if (retval)
415539ef3112SGuenter Roeck 		goto error;
415639ef3112SGuenter Roeck 
4157bbc780f8SDavid Herrmann 	retval = device_add(dev);
415839ef3112SGuenter Roeck 	if (retval)
415939ef3112SGuenter Roeck 		goto error;
416039ef3112SGuenter Roeck 
416139ef3112SGuenter Roeck 	return dev;
416239ef3112SGuenter Roeck 
416339ef3112SGuenter Roeck error:
416439ef3112SGuenter Roeck 	put_device(dev);
416539ef3112SGuenter Roeck 	return ERR_PTR(retval);
416639ef3112SGuenter Roeck }
416739ef3112SGuenter Roeck 
416823681e47SGreg Kroah-Hartman /**
41694e106739SGreg Kroah-Hartman  * device_create - creates a device and registers it with sysfs
41708882b394SGreg Kroah-Hartman  * @class: pointer to the struct class that this device should be registered to
41718882b394SGreg Kroah-Hartman  * @parent: pointer to the parent struct device of this new device, if any
41728882b394SGreg Kroah-Hartman  * @devt: the dev_t for the char device to be added
41738882b394SGreg Kroah-Hartman  * @drvdata: the data to be added to the device for callbacks
41748882b394SGreg Kroah-Hartman  * @fmt: string for the device's name
41758882b394SGreg Kroah-Hartman  *
41768882b394SGreg Kroah-Hartman  * This function can be used by char device classes.  A struct device
41778882b394SGreg Kroah-Hartman  * will be created in sysfs, registered to the specified class.
41788882b394SGreg Kroah-Hartman  *
41798882b394SGreg Kroah-Hartman  * A "dev" file will be created, showing the dev_t for the device, if
41808882b394SGreg Kroah-Hartman  * the dev_t is not 0,0.
41818882b394SGreg Kroah-Hartman  * If a pointer to a parent struct device is passed in, the newly created
41828882b394SGreg Kroah-Hartman  * struct device will be a child of that device in sysfs.
41838882b394SGreg Kroah-Hartman  * The pointer to the struct device will be returned from the call.
41848882b394SGreg Kroah-Hartman  * Any further sysfs files that might be required can be created using this
41858882b394SGreg Kroah-Hartman  * pointer.
41868882b394SGreg Kroah-Hartman  *
4187f0eae0edSJani Nikula  * Returns &struct device pointer on success, or ERR_PTR() on error.
4188f0eae0edSJani Nikula  *
41898882b394SGreg Kroah-Hartman  * Note: the struct class passed to this function must have previously
41908882b394SGreg Kroah-Hartman  * been created with a call to class_create().
41918882b394SGreg Kroah-Hartman  */
41924e106739SGreg Kroah-Hartman struct device *device_create(struct class *class, struct device *parent,
41934e106739SGreg Kroah-Hartman 			     dev_t devt, void *drvdata, const char *fmt, ...)
41948882b394SGreg Kroah-Hartman {
41958882b394SGreg Kroah-Hartman 	va_list vargs;
41968882b394SGreg Kroah-Hartman 	struct device *dev;
41978882b394SGreg Kroah-Hartman 
41988882b394SGreg Kroah-Hartman 	va_start(vargs, fmt);
41994c747466SChristoph Hellwig 	dev = device_create_groups_vargs(class, parent, devt, drvdata, NULL,
42004c747466SChristoph Hellwig 					  fmt, vargs);
42018882b394SGreg Kroah-Hartman 	va_end(vargs);
42028882b394SGreg Kroah-Hartman 	return dev;
42038882b394SGreg Kroah-Hartman }
42044e106739SGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_create);
42058882b394SGreg Kroah-Hartman 
420639ef3112SGuenter Roeck /**
420739ef3112SGuenter Roeck  * device_create_with_groups - creates a device and registers it with sysfs
420839ef3112SGuenter Roeck  * @class: pointer to the struct class that this device should be registered to
420939ef3112SGuenter Roeck  * @parent: pointer to the parent struct device of this new device, if any
421039ef3112SGuenter Roeck  * @devt: the dev_t for the char device to be added
421139ef3112SGuenter Roeck  * @drvdata: the data to be added to the device for callbacks
421239ef3112SGuenter Roeck  * @groups: NULL-terminated list of attribute groups to be created
421339ef3112SGuenter Roeck  * @fmt: string for the device's name
421439ef3112SGuenter Roeck  *
421539ef3112SGuenter Roeck  * This function can be used by char device classes.  A struct device
421639ef3112SGuenter Roeck  * will be created in sysfs, registered to the specified class.
421739ef3112SGuenter Roeck  * Additional attributes specified in the groups parameter will also
421839ef3112SGuenter Roeck  * be created automatically.
421939ef3112SGuenter Roeck  *
422039ef3112SGuenter Roeck  * A "dev" file will be created, showing the dev_t for the device, if
422139ef3112SGuenter Roeck  * the dev_t is not 0,0.
422239ef3112SGuenter Roeck  * If a pointer to a parent struct device is passed in, the newly created
422339ef3112SGuenter Roeck  * struct device will be a child of that device in sysfs.
422439ef3112SGuenter Roeck  * The pointer to the struct device will be returned from the call.
422539ef3112SGuenter Roeck  * Any further sysfs files that might be required can be created using this
422639ef3112SGuenter Roeck  * pointer.
422739ef3112SGuenter Roeck  *
422839ef3112SGuenter Roeck  * Returns &struct device pointer on success, or ERR_PTR() on error.
422939ef3112SGuenter Roeck  *
423039ef3112SGuenter Roeck  * Note: the struct class passed to this function must have previously
423139ef3112SGuenter Roeck  * been created with a call to class_create().
423239ef3112SGuenter Roeck  */
423339ef3112SGuenter Roeck struct device *device_create_with_groups(struct class *class,
423439ef3112SGuenter Roeck 					 struct device *parent, dev_t devt,
423539ef3112SGuenter Roeck 					 void *drvdata,
423639ef3112SGuenter Roeck 					 const struct attribute_group **groups,
423739ef3112SGuenter Roeck 					 const char *fmt, ...)
423839ef3112SGuenter Roeck {
423939ef3112SGuenter Roeck 	va_list vargs;
424039ef3112SGuenter Roeck 	struct device *dev;
424139ef3112SGuenter Roeck 
424239ef3112SGuenter Roeck 	va_start(vargs, fmt);
424339ef3112SGuenter Roeck 	dev = device_create_groups_vargs(class, parent, devt, drvdata, groups,
424439ef3112SGuenter Roeck 					 fmt, vargs);
424539ef3112SGuenter Roeck 	va_end(vargs);
424639ef3112SGuenter Roeck 	return dev;
424739ef3112SGuenter Roeck }
424839ef3112SGuenter Roeck EXPORT_SYMBOL_GPL(device_create_with_groups);
424939ef3112SGuenter Roeck 
4250775b64d2SRafael J. Wysocki /**
4251775b64d2SRafael J. Wysocki  * device_destroy - removes a device that was created with device_create()
4252775b64d2SRafael J. Wysocki  * @class: pointer to the struct class that this device was registered with
4253775b64d2SRafael J. Wysocki  * @devt: the dev_t of the device that was previously registered
4254775b64d2SRafael J. Wysocki  *
4255775b64d2SRafael J. Wysocki  * This call unregisters and cleans up a device that was created with a
4256775b64d2SRafael J. Wysocki  * call to device_create().
4257775b64d2SRafael J. Wysocki  */
4258775b64d2SRafael J. Wysocki void device_destroy(struct class *class, dev_t devt)
4259775b64d2SRafael J. Wysocki {
4260775b64d2SRafael J. Wysocki 	struct device *dev;
4261775b64d2SRafael J. Wysocki 
42624495dfddSSuzuki K Poulose 	dev = class_find_device_by_devt(class, devt);
4263cd35449bSDave Young 	if (dev) {
4264cd35449bSDave Young 		put_device(dev);
426523681e47SGreg Kroah-Hartman 		device_unregister(dev);
426623681e47SGreg Kroah-Hartman 	}
4267cd35449bSDave Young }
426823681e47SGreg Kroah-Hartman EXPORT_SYMBOL_GPL(device_destroy);
4269a2de48caSGreg Kroah-Hartman 
4270a2de48caSGreg Kroah-Hartman /**
4271a2de48caSGreg Kroah-Hartman  * device_rename - renames a device
4272a2de48caSGreg Kroah-Hartman  * @dev: the pointer to the struct device to be renamed
4273a2de48caSGreg Kroah-Hartman  * @new_name: the new name of the device
4274030c1d2bSEric W. Biederman  *
4275030c1d2bSEric W. Biederman  * It is the responsibility of the caller to provide mutual
4276030c1d2bSEric W. Biederman  * exclusion between two different calls of device_rename
4277030c1d2bSEric W. Biederman  * on the same device to ensure that new_name is valid and
4278030c1d2bSEric W. Biederman  * won't conflict with other devices.
4279c6c0ac66SMichael Ellerman  *
4280a5462516STimur Tabi  * Note: Don't call this function.  Currently, the networking layer calls this
4281a5462516STimur Tabi  * function, but that will change.  The following text from Kay Sievers offers
4282a5462516STimur Tabi  * some insight:
4283a5462516STimur Tabi  *
4284a5462516STimur Tabi  * Renaming devices is racy at many levels, symlinks and other stuff are not
4285a5462516STimur Tabi  * replaced atomically, and you get a "move" uevent, but it's not easy to
4286a5462516STimur Tabi  * connect the event to the old and new device. Device nodes are not renamed at
4287a5462516STimur Tabi  * all, there isn't even support for that in the kernel now.
4288a5462516STimur Tabi  *
4289a5462516STimur Tabi  * In the meantime, during renaming, your target name might be taken by another
4290a5462516STimur Tabi  * driver, creating conflicts. Or the old name is taken directly after you
4291a5462516STimur Tabi  * renamed it -- then you get events for the same DEVPATH, before you even see
4292a5462516STimur Tabi  * the "move" event. It's just a mess, and nothing new should ever rely on
4293a5462516STimur Tabi  * kernel device renaming. Besides that, it's not even implemented now for
4294a5462516STimur Tabi  * other things than (driver-core wise very simple) network devices.
4295a5462516STimur Tabi  *
4296a5462516STimur Tabi  * We are currently about to change network renaming in udev to completely
4297a5462516STimur Tabi  * disallow renaming of devices in the same namespace as the kernel uses,
4298a5462516STimur Tabi  * because we can't solve the problems properly, that arise with swapping names
4299a5462516STimur Tabi  * of multiple interfaces without races. Means, renaming of eth[0-9]* will only
4300a5462516STimur Tabi  * be allowed to some other name than eth[0-9]*, for the aforementioned
4301a5462516STimur Tabi  * reasons.
4302a5462516STimur Tabi  *
4303a5462516STimur Tabi  * Make up a "real" name in the driver before you register anything, or add
4304a5462516STimur Tabi  * some other attributes for userspace to find the device, or use udev to add
4305a5462516STimur Tabi  * symlinks -- but never rename kernel devices later, it's a complete mess. We
4306a5462516STimur Tabi  * don't even want to get into that and try to implement the missing pieces in
4307a5462516STimur Tabi  * the core. We really have other pieces to fix in the driver core mess. :)
4308a2de48caSGreg Kroah-Hartman  */
43096937e8f8SJohannes Berg int device_rename(struct device *dev, const char *new_name)
4310a2de48caSGreg Kroah-Hartman {
43114b30ee58STejun Heo 	struct kobject *kobj = &dev->kobj;
43122ee97cafSCornelia Huck 	char *old_device_name = NULL;
4313a2de48caSGreg Kroah-Hartman 	int error;
4314a2de48caSGreg Kroah-Hartman 
4315a2de48caSGreg Kroah-Hartman 	dev = get_device(dev);
4316a2de48caSGreg Kroah-Hartman 	if (!dev)
4317a2de48caSGreg Kroah-Hartman 		return -EINVAL;
4318a2de48caSGreg Kroah-Hartman 
431969df7533Sethan.zhao 	dev_dbg(dev, "renaming to %s\n", new_name);
4320a2de48caSGreg Kroah-Hartman 
43211fa5ae85SKay Sievers 	old_device_name = kstrdup(dev_name(dev), GFP_KERNEL);
43222ee97cafSCornelia Huck 	if (!old_device_name) {
4323952ab431SJesper Juhl 		error = -ENOMEM;
43242ee97cafSCornelia Huck 		goto out;
4325952ab431SJesper Juhl 	}
4326a2de48caSGreg Kroah-Hartman 
4327f349cf34SEric W. Biederman 	if (dev->class) {
43284b30ee58STejun Heo 		error = sysfs_rename_link_ns(&dev->class->p->subsys.kobj,
43294b30ee58STejun Heo 					     kobj, old_device_name,
43304b30ee58STejun Heo 					     new_name, kobject_namespace(kobj));
4331f349cf34SEric W. Biederman 		if (error)
4332f349cf34SEric W. Biederman 			goto out;
4333f349cf34SEric W. Biederman 	}
433439aba963SKay Sievers 
43354b30ee58STejun Heo 	error = kobject_rename(kobj, new_name);
43361fa5ae85SKay Sievers 	if (error)
43372ee97cafSCornelia Huck 		goto out;
4338a2de48caSGreg Kroah-Hartman 
43392ee97cafSCornelia Huck out:
4340a2de48caSGreg Kroah-Hartman 	put_device(dev);
4341a2de48caSGreg Kroah-Hartman 
43422ee97cafSCornelia Huck 	kfree(old_device_name);
4343a2de48caSGreg Kroah-Hartman 
4344a2de48caSGreg Kroah-Hartman 	return error;
4345a2de48caSGreg Kroah-Hartman }
4346a2807dbcSJohannes Berg EXPORT_SYMBOL_GPL(device_rename);
43478a82472fSCornelia Huck 
43488a82472fSCornelia Huck static int device_move_class_links(struct device *dev,
43498a82472fSCornelia Huck 				   struct device *old_parent,
43508a82472fSCornelia Huck 				   struct device *new_parent)
43518a82472fSCornelia Huck {
4352f7f3461dSGreg Kroah-Hartman 	int error = 0;
43538a82472fSCornelia Huck 
4354f7f3461dSGreg Kroah-Hartman 	if (old_parent)
4355f7f3461dSGreg Kroah-Hartman 		sysfs_remove_link(&dev->kobj, "device");
4356f7f3461dSGreg Kroah-Hartman 	if (new_parent)
4357f7f3461dSGreg Kroah-Hartman 		error = sysfs_create_link(&dev->kobj, &new_parent->kobj,
4358f7f3461dSGreg Kroah-Hartman 					  "device");
4359f7f3461dSGreg Kroah-Hartman 	return error;
43608a82472fSCornelia Huck }
43618a82472fSCornelia Huck 
43628a82472fSCornelia Huck /**
43638a82472fSCornelia Huck  * device_move - moves a device to a new parent
43648a82472fSCornelia Huck  * @dev: the pointer to the struct device to be moved
436513509860SWolfram Sang  * @new_parent: the new parent of the device (can be NULL)
4366ffa6a705SCornelia Huck  * @dpm_order: how to reorder the dpm_list
43678a82472fSCornelia Huck  */
4368ffa6a705SCornelia Huck int device_move(struct device *dev, struct device *new_parent,
4369ffa6a705SCornelia Huck 		enum dpm_order dpm_order)
43708a82472fSCornelia Huck {
43718a82472fSCornelia Huck 	int error;
43728a82472fSCornelia Huck 	struct device *old_parent;
4373c744aeaeSCornelia Huck 	struct kobject *new_parent_kobj;
43748a82472fSCornelia Huck 
43758a82472fSCornelia Huck 	dev = get_device(dev);
43768a82472fSCornelia Huck 	if (!dev)
43778a82472fSCornelia Huck 		return -EINVAL;
43788a82472fSCornelia Huck 
4379ffa6a705SCornelia Huck 	device_pm_lock();
43808a82472fSCornelia Huck 	new_parent = get_device(new_parent);
4381c744aeaeSCornelia Huck 	new_parent_kobj = get_device_parent(dev, new_parent);
438284d0c27dSTetsuo Handa 	if (IS_ERR(new_parent_kobj)) {
438384d0c27dSTetsuo Handa 		error = PTR_ERR(new_parent_kobj);
438484d0c27dSTetsuo Handa 		put_device(new_parent);
438584d0c27dSTetsuo Handa 		goto out;
438684d0c27dSTetsuo Handa 	}
438763b6971aSCornelia Huck 
43881e0b2cf9SKay Sievers 	pr_debug("device: '%s': %s: moving to '%s'\n", dev_name(dev),
43891e0b2cf9SKay Sievers 		 __func__, new_parent ? dev_name(new_parent) : "<NULL>");
4390c744aeaeSCornelia Huck 	error = kobject_move(&dev->kobj, new_parent_kobj);
43918a82472fSCornelia Huck 	if (error) {
439263b6971aSCornelia Huck 		cleanup_glue_dir(dev, new_parent_kobj);
43938a82472fSCornelia Huck 		put_device(new_parent);
43948a82472fSCornelia Huck 		goto out;
43958a82472fSCornelia Huck 	}
43968a82472fSCornelia Huck 	old_parent = dev->parent;
43978a82472fSCornelia Huck 	dev->parent = new_parent;
43988a82472fSCornelia Huck 	if (old_parent)
4399f791b8c8SGreg Kroah-Hartman 		klist_remove(&dev->p->knode_parent);
44000d358f22SYinghai Lu 	if (new_parent) {
4401f791b8c8SGreg Kroah-Hartman 		klist_add_tail(&dev->p->knode_parent,
4402f791b8c8SGreg Kroah-Hartman 			       &new_parent->p->klist_children);
44030d358f22SYinghai Lu 		set_dev_node(dev, dev_to_node(new_parent));
44040d358f22SYinghai Lu 	}
44050d358f22SYinghai Lu 
4406bdd4034dSRabin Vincent 	if (dev->class) {
44078a82472fSCornelia Huck 		error = device_move_class_links(dev, old_parent, new_parent);
44088a82472fSCornelia Huck 		if (error) {
44098a82472fSCornelia Huck 			/* We ignore errors on cleanup since we're hosed anyway... */
44108a82472fSCornelia Huck 			device_move_class_links(dev, new_parent, old_parent);
44118a82472fSCornelia Huck 			if (!kobject_move(&dev->kobj, &old_parent->kobj)) {
4412c744aeaeSCornelia Huck 				if (new_parent)
4413f791b8c8SGreg Kroah-Hartman 					klist_remove(&dev->p->knode_parent);
44140d358f22SYinghai Lu 				dev->parent = old_parent;
44150d358f22SYinghai Lu 				if (old_parent) {
4416f791b8c8SGreg Kroah-Hartman 					klist_add_tail(&dev->p->knode_parent,
4417f791b8c8SGreg Kroah-Hartman 						       &old_parent->p->klist_children);
44180d358f22SYinghai Lu 					set_dev_node(dev, dev_to_node(old_parent));
44190d358f22SYinghai Lu 				}
44208a82472fSCornelia Huck 			}
442163b6971aSCornelia Huck 			cleanup_glue_dir(dev, new_parent_kobj);
44228a82472fSCornelia Huck 			put_device(new_parent);
44238a82472fSCornelia Huck 			goto out;
44248a82472fSCornelia Huck 		}
4425bdd4034dSRabin Vincent 	}
4426ffa6a705SCornelia Huck 	switch (dpm_order) {
4427ffa6a705SCornelia Huck 	case DPM_ORDER_NONE:
4428ffa6a705SCornelia Huck 		break;
4429ffa6a705SCornelia Huck 	case DPM_ORDER_DEV_AFTER_PARENT:
4430ffa6a705SCornelia Huck 		device_pm_move_after(dev, new_parent);
443152cdbdd4SGrygorii Strashko 		devices_kset_move_after(dev, new_parent);
4432ffa6a705SCornelia Huck 		break;
4433ffa6a705SCornelia Huck 	case DPM_ORDER_PARENT_BEFORE_DEV:
4434ffa6a705SCornelia Huck 		device_pm_move_before(new_parent, dev);
443552cdbdd4SGrygorii Strashko 		devices_kset_move_before(new_parent, dev);
4436ffa6a705SCornelia Huck 		break;
4437ffa6a705SCornelia Huck 	case DPM_ORDER_DEV_LAST:
4438ffa6a705SCornelia Huck 		device_pm_move_last(dev);
443952cdbdd4SGrygorii Strashko 		devices_kset_move_last(dev);
4440ffa6a705SCornelia Huck 		break;
4441ffa6a705SCornelia Huck 	}
4442bdd4034dSRabin Vincent 
44438a82472fSCornelia Huck 	put_device(old_parent);
44448a82472fSCornelia Huck out:
4445ffa6a705SCornelia Huck 	device_pm_unlock();
44468a82472fSCornelia Huck 	put_device(dev);
44478a82472fSCornelia Huck 	return error;
44488a82472fSCornelia Huck }
44498a82472fSCornelia Huck EXPORT_SYMBOL_GPL(device_move);
445037b0c020SGreg Kroah-Hartman 
4451b8f33e5dSChristian Brauner static int device_attrs_change_owner(struct device *dev, kuid_t kuid,
4452b8f33e5dSChristian Brauner 				     kgid_t kgid)
4453b8f33e5dSChristian Brauner {
4454b8f33e5dSChristian Brauner 	struct kobject *kobj = &dev->kobj;
4455b8f33e5dSChristian Brauner 	struct class *class = dev->class;
4456b8f33e5dSChristian Brauner 	const struct device_type *type = dev->type;
4457b8f33e5dSChristian Brauner 	int error;
4458b8f33e5dSChristian Brauner 
4459b8f33e5dSChristian Brauner 	if (class) {
4460b8f33e5dSChristian Brauner 		/*
4461b8f33e5dSChristian Brauner 		 * Change the device groups of the device class for @dev to
4462b8f33e5dSChristian Brauner 		 * @kuid/@kgid.
4463b8f33e5dSChristian Brauner 		 */
4464b8f33e5dSChristian Brauner 		error = sysfs_groups_change_owner(kobj, class->dev_groups, kuid,
4465b8f33e5dSChristian Brauner 						  kgid);
4466b8f33e5dSChristian Brauner 		if (error)
4467b8f33e5dSChristian Brauner 			return error;
4468b8f33e5dSChristian Brauner 	}
4469b8f33e5dSChristian Brauner 
4470b8f33e5dSChristian Brauner 	if (type) {
4471b8f33e5dSChristian Brauner 		/*
4472b8f33e5dSChristian Brauner 		 * Change the device groups of the device type for @dev to
4473b8f33e5dSChristian Brauner 		 * @kuid/@kgid.
4474b8f33e5dSChristian Brauner 		 */
4475b8f33e5dSChristian Brauner 		error = sysfs_groups_change_owner(kobj, type->groups, kuid,
4476b8f33e5dSChristian Brauner 						  kgid);
4477b8f33e5dSChristian Brauner 		if (error)
4478b8f33e5dSChristian Brauner 			return error;
4479b8f33e5dSChristian Brauner 	}
4480b8f33e5dSChristian Brauner 
4481b8f33e5dSChristian Brauner 	/* Change the device groups of @dev to @kuid/@kgid. */
4482b8f33e5dSChristian Brauner 	error = sysfs_groups_change_owner(kobj, dev->groups, kuid, kgid);
4483b8f33e5dSChristian Brauner 	if (error)
4484b8f33e5dSChristian Brauner 		return error;
4485b8f33e5dSChristian Brauner 
4486b8f33e5dSChristian Brauner 	if (device_supports_offline(dev) && !dev->offline_disabled) {
4487b8f33e5dSChristian Brauner 		/* Change online device attributes of @dev to @kuid/@kgid. */
4488b8f33e5dSChristian Brauner 		error = sysfs_file_change_owner(kobj, dev_attr_online.attr.name,
4489b8f33e5dSChristian Brauner 						kuid, kgid);
4490b8f33e5dSChristian Brauner 		if (error)
4491b8f33e5dSChristian Brauner 			return error;
4492b8f33e5dSChristian Brauner 	}
4493b8f33e5dSChristian Brauner 
4494b8f33e5dSChristian Brauner 	return 0;
4495b8f33e5dSChristian Brauner }
4496b8f33e5dSChristian Brauner 
4497b8f33e5dSChristian Brauner /**
4498b8f33e5dSChristian Brauner  * device_change_owner - change the owner of an existing device.
4499b8f33e5dSChristian Brauner  * @dev: device.
4500b8f33e5dSChristian Brauner  * @kuid: new owner's kuid
4501b8f33e5dSChristian Brauner  * @kgid: new owner's kgid
4502b8f33e5dSChristian Brauner  *
4503b8f33e5dSChristian Brauner  * This changes the owner of @dev and its corresponding sysfs entries to
4504b8f33e5dSChristian Brauner  * @kuid/@kgid. This function closely mirrors how @dev was added via driver
4505b8f33e5dSChristian Brauner  * core.
4506b8f33e5dSChristian Brauner  *
4507b8f33e5dSChristian Brauner  * Returns 0 on success or error code on failure.
4508b8f33e5dSChristian Brauner  */
4509b8f33e5dSChristian Brauner int device_change_owner(struct device *dev, kuid_t kuid, kgid_t kgid)
4510b8f33e5dSChristian Brauner {
4511b8f33e5dSChristian Brauner 	int error;
4512b8f33e5dSChristian Brauner 	struct kobject *kobj = &dev->kobj;
4513b8f33e5dSChristian Brauner 
4514b8f33e5dSChristian Brauner 	dev = get_device(dev);
4515b8f33e5dSChristian Brauner 	if (!dev)
4516b8f33e5dSChristian Brauner 		return -EINVAL;
4517b8f33e5dSChristian Brauner 
4518b8f33e5dSChristian Brauner 	/*
4519b8f33e5dSChristian Brauner 	 * Change the kobject and the default attributes and groups of the
4520b8f33e5dSChristian Brauner 	 * ktype associated with it to @kuid/@kgid.
4521b8f33e5dSChristian Brauner 	 */
4522b8f33e5dSChristian Brauner 	error = sysfs_change_owner(kobj, kuid, kgid);
4523b8f33e5dSChristian Brauner 	if (error)
4524b8f33e5dSChristian Brauner 		goto out;
4525b8f33e5dSChristian Brauner 
4526b8f33e5dSChristian Brauner 	/*
4527b8f33e5dSChristian Brauner 	 * Change the uevent file for @dev to the new owner. The uevent file
4528b8f33e5dSChristian Brauner 	 * was created in a separate step when @dev got added and we mirror
4529b8f33e5dSChristian Brauner 	 * that step here.
4530b8f33e5dSChristian Brauner 	 */
4531b8f33e5dSChristian Brauner 	error = sysfs_file_change_owner(kobj, dev_attr_uevent.attr.name, kuid,
4532b8f33e5dSChristian Brauner 					kgid);
4533b8f33e5dSChristian Brauner 	if (error)
4534b8f33e5dSChristian Brauner 		goto out;
4535b8f33e5dSChristian Brauner 
4536b8f33e5dSChristian Brauner 	/*
4537b8f33e5dSChristian Brauner 	 * Change the device groups, the device groups associated with the
4538b8f33e5dSChristian Brauner 	 * device class, and the groups associated with the device type of @dev
4539b8f33e5dSChristian Brauner 	 * to @kuid/@kgid.
4540b8f33e5dSChristian Brauner 	 */
4541b8f33e5dSChristian Brauner 	error = device_attrs_change_owner(dev, kuid, kgid);
4542b8f33e5dSChristian Brauner 	if (error)
4543b8f33e5dSChristian Brauner 		goto out;
4544b8f33e5dSChristian Brauner 
45453b52fc5dSChristian Brauner 	error = dpm_sysfs_change_owner(dev, kuid, kgid);
45463b52fc5dSChristian Brauner 	if (error)
45473b52fc5dSChristian Brauner 		goto out;
45483b52fc5dSChristian Brauner 
4549b8f33e5dSChristian Brauner #ifdef CONFIG_BLOCK
4550b8f33e5dSChristian Brauner 	if (sysfs_deprecated && dev->class == &block_class)
4551b8f33e5dSChristian Brauner 		goto out;
4552b8f33e5dSChristian Brauner #endif
4553b8f33e5dSChristian Brauner 
4554b8f33e5dSChristian Brauner 	/*
4555b8f33e5dSChristian Brauner 	 * Change the owner of the symlink located in the class directory of
4556b8f33e5dSChristian Brauner 	 * the device class associated with @dev which points to the actual
4557b8f33e5dSChristian Brauner 	 * directory entry for @dev to @kuid/@kgid. This ensures that the
4558b8f33e5dSChristian Brauner 	 * symlink shows the same permissions as its target.
4559b8f33e5dSChristian Brauner 	 */
4560b8f33e5dSChristian Brauner 	error = sysfs_link_change_owner(&dev->class->p->subsys.kobj, &dev->kobj,
4561b8f33e5dSChristian Brauner 					dev_name(dev), kuid, kgid);
4562b8f33e5dSChristian Brauner 	if (error)
4563b8f33e5dSChristian Brauner 		goto out;
4564b8f33e5dSChristian Brauner 
4565b8f33e5dSChristian Brauner out:
4566b8f33e5dSChristian Brauner 	put_device(dev);
4567b8f33e5dSChristian Brauner 	return error;
4568b8f33e5dSChristian Brauner }
4569b8f33e5dSChristian Brauner EXPORT_SYMBOL_GPL(device_change_owner);
4570b8f33e5dSChristian Brauner 
457137b0c020SGreg Kroah-Hartman /**
457237b0c020SGreg Kroah-Hartman  * device_shutdown - call ->shutdown() on each device to shutdown.
457337b0c020SGreg Kroah-Hartman  */
457437b0c020SGreg Kroah-Hartman void device_shutdown(void)
457537b0c020SGreg Kroah-Hartman {
4576f123db8eSBenson Leung 	struct device *dev, *parent;
457737b0c020SGreg Kroah-Hartman 
45783297c8fcSPingfan Liu 	wait_for_device_probe();
45793297c8fcSPingfan Liu 	device_block_probing();
45803297c8fcSPingfan Liu 
458165650b35SRafael J. Wysocki 	cpufreq_suspend();
458265650b35SRafael J. Wysocki 
45836245838fSHugh Daschbach 	spin_lock(&devices_kset->list_lock);
45846245838fSHugh Daschbach 	/*
45856245838fSHugh Daschbach 	 * Walk the devices list backward, shutting down each in turn.
45866245838fSHugh Daschbach 	 * Beware that device unplug events may also start pulling
45876245838fSHugh Daschbach 	 * devices offline, even as the system is shutting down.
45886245838fSHugh Daschbach 	 */
45896245838fSHugh Daschbach 	while (!list_empty(&devices_kset->list)) {
45906245838fSHugh Daschbach 		dev = list_entry(devices_kset->list.prev, struct device,
45916245838fSHugh Daschbach 				kobj.entry);
4592d1c6c030SMing Lei 
4593d1c6c030SMing Lei 		/*
4594d1c6c030SMing Lei 		 * hold reference count of device's parent to
4595d1c6c030SMing Lei 		 * prevent it from being freed because parent's
4596d1c6c030SMing Lei 		 * lock is to be held
4597d1c6c030SMing Lei 		 */
4598f123db8eSBenson Leung 		parent = get_device(dev->parent);
45996245838fSHugh Daschbach 		get_device(dev);
46006245838fSHugh Daschbach 		/*
46016245838fSHugh Daschbach 		 * Make sure the device is off the kset list, in the
46026245838fSHugh Daschbach 		 * event that dev->*->shutdown() doesn't remove it.
46036245838fSHugh Daschbach 		 */
46046245838fSHugh Daschbach 		list_del_init(&dev->kobj.entry);
46056245838fSHugh Daschbach 		spin_unlock(&devices_kset->list_lock);
4606fe6b91f4SAlan Stern 
4607d1c6c030SMing Lei 		/* hold lock to avoid race with probe/release */
4608f123db8eSBenson Leung 		if (parent)
4609f123db8eSBenson Leung 			device_lock(parent);
4610d1c6c030SMing Lei 		device_lock(dev);
4611d1c6c030SMing Lei 
4612fe6b91f4SAlan Stern 		/* Don't allow any more runtime suspends */
4613fe6b91f4SAlan Stern 		pm_runtime_get_noresume(dev);
4614fe6b91f4SAlan Stern 		pm_runtime_barrier(dev);
46156245838fSHugh Daschbach 
46167521621eSMichal Suchanek 		if (dev->class && dev->class->shutdown_pre) {
4617f77af151SJosh Zimmerman 			if (initcall_debug)
46187521621eSMichal Suchanek 				dev_info(dev, "shutdown_pre\n");
46197521621eSMichal Suchanek 			dev->class->shutdown_pre(dev);
46207521621eSMichal Suchanek 		}
46217521621eSMichal Suchanek 		if (dev->bus && dev->bus->shutdown) {
46220246c4faSShuoX Liu 			if (initcall_debug)
46230246c4faSShuoX Liu 				dev_info(dev, "shutdown\n");
462437b0c020SGreg Kroah-Hartman 			dev->bus->shutdown(dev);
462537b0c020SGreg Kroah-Hartman 		} else if (dev->driver && dev->driver->shutdown) {
46260246c4faSShuoX Liu 			if (initcall_debug)
46270246c4faSShuoX Liu 				dev_info(dev, "shutdown\n");
462837b0c020SGreg Kroah-Hartman 			dev->driver->shutdown(dev);
462937b0c020SGreg Kroah-Hartman 		}
4630d1c6c030SMing Lei 
4631d1c6c030SMing Lei 		device_unlock(dev);
4632f123db8eSBenson Leung 		if (parent)
4633f123db8eSBenson Leung 			device_unlock(parent);
4634d1c6c030SMing Lei 
46356245838fSHugh Daschbach 		put_device(dev);
4636f123db8eSBenson Leung 		put_device(parent);
46376245838fSHugh Daschbach 
46386245838fSHugh Daschbach 		spin_lock(&devices_kset->list_lock);
463937b0c020SGreg Kroah-Hartman 	}
46406245838fSHugh Daschbach 	spin_unlock(&devices_kset->list_lock);
464137b0c020SGreg Kroah-Hartman }
464299bcf217SJoe Perches 
464399bcf217SJoe Perches /*
464499bcf217SJoe Perches  * Device logging functions
464599bcf217SJoe Perches  */
464699bcf217SJoe Perches 
464799bcf217SJoe Perches #ifdef CONFIG_PRINTK
464874caba7fSJohn Ogness static void
464974caba7fSJohn Ogness set_dev_info(const struct device *dev, struct dev_printk_info *dev_info)
465099bcf217SJoe Perches {
4651c4e00daaSKay Sievers 	const char *subsys;
465274caba7fSJohn Ogness 
465374caba7fSJohn Ogness 	memset(dev_info, 0, sizeof(*dev_info));
465499bcf217SJoe Perches 
4655c4e00daaSKay Sievers 	if (dev->class)
4656c4e00daaSKay Sievers 		subsys = dev->class->name;
4657c4e00daaSKay Sievers 	else if (dev->bus)
4658c4e00daaSKay Sievers 		subsys = dev->bus->name;
4659c4e00daaSKay Sievers 	else
466074caba7fSJohn Ogness 		return;
4661c4e00daaSKay Sievers 
466274caba7fSJohn Ogness 	strscpy(dev_info->subsystem, subsys, sizeof(dev_info->subsystem));
4663c4e00daaSKay Sievers 
4664c4e00daaSKay Sievers 	/*
4665c4e00daaSKay Sievers 	 * Add device identifier DEVICE=:
4666c4e00daaSKay Sievers 	 *   b12:8         block dev_t
4667c4e00daaSKay Sievers 	 *   c127:3        char dev_t
4668c4e00daaSKay Sievers 	 *   n8            netdev ifindex
4669c4e00daaSKay Sievers 	 *   +sound:card0  subsystem:devname
4670c4e00daaSKay Sievers 	 */
4671c4e00daaSKay Sievers 	if (MAJOR(dev->devt)) {
4672c4e00daaSKay Sievers 		char c;
4673c4e00daaSKay Sievers 
4674c4e00daaSKay Sievers 		if (strcmp(subsys, "block") == 0)
4675c4e00daaSKay Sievers 			c = 'b';
4676c4e00daaSKay Sievers 		else
4677c4e00daaSKay Sievers 			c = 'c';
467874caba7fSJohn Ogness 
467974caba7fSJohn Ogness 		snprintf(dev_info->device, sizeof(dev_info->device),
468074caba7fSJohn Ogness 			 "%c%u:%u", c, MAJOR(dev->devt), MINOR(dev->devt));
4681c4e00daaSKay Sievers 	} else if (strcmp(subsys, "net") == 0) {
4682c4e00daaSKay Sievers 		struct net_device *net = to_net_dev(dev);
4683c4e00daaSKay Sievers 
468474caba7fSJohn Ogness 		snprintf(dev_info->device, sizeof(dev_info->device),
468574caba7fSJohn Ogness 			 "n%u", net->ifindex);
4686c4e00daaSKay Sievers 	} else {
468774caba7fSJohn Ogness 		snprintf(dev_info->device, sizeof(dev_info->device),
468874caba7fSJohn Ogness 			 "+%s:%s", subsys, dev_name(dev));
4689c4e00daaSKay Sievers 	}
469099bcf217SJoe Perches }
4691798efc60SJoe Perches 
469205e4e5b8SJoe Perches int dev_vprintk_emit(int level, const struct device *dev,
469305e4e5b8SJoe Perches 		     const char *fmt, va_list args)
469405e4e5b8SJoe Perches {
469574caba7fSJohn Ogness 	struct dev_printk_info dev_info;
469605e4e5b8SJoe Perches 
469774caba7fSJohn Ogness 	set_dev_info(dev, &dev_info);
469805e4e5b8SJoe Perches 
469974caba7fSJohn Ogness 	return vprintk_emit(0, level, &dev_info, fmt, args);
470005e4e5b8SJoe Perches }
470105e4e5b8SJoe Perches EXPORT_SYMBOL(dev_vprintk_emit);
470205e4e5b8SJoe Perches 
470305e4e5b8SJoe Perches int dev_printk_emit(int level, const struct device *dev, const char *fmt, ...)
470405e4e5b8SJoe Perches {
470505e4e5b8SJoe Perches 	va_list args;
470605e4e5b8SJoe Perches 	int r;
470705e4e5b8SJoe Perches 
470805e4e5b8SJoe Perches 	va_start(args, fmt);
470905e4e5b8SJoe Perches 
471005e4e5b8SJoe Perches 	r = dev_vprintk_emit(level, dev, fmt, args);
471105e4e5b8SJoe Perches 
471205e4e5b8SJoe Perches 	va_end(args);
471305e4e5b8SJoe Perches 
471405e4e5b8SJoe Perches 	return r;
471505e4e5b8SJoe Perches }
471605e4e5b8SJoe Perches EXPORT_SYMBOL(dev_printk_emit);
471705e4e5b8SJoe Perches 
4718d1f1052cSJoe Perches static void __dev_printk(const char *level, const struct device *dev,
4719798efc60SJoe Perches 			struct va_format *vaf)
4720798efc60SJoe Perches {
4721d1f1052cSJoe Perches 	if (dev)
4722d1f1052cSJoe Perches 		dev_printk_emit(level[1] - '0', dev, "%s %s: %pV",
4723798efc60SJoe Perches 				dev_driver_string(dev), dev_name(dev), vaf);
4724d1f1052cSJoe Perches 	else
4725d1f1052cSJoe Perches 		printk("%s(NULL device *): %pV", level, vaf);
4726798efc60SJoe Perches }
472799bcf217SJoe Perches 
4728ad7d61f1SChris Down void _dev_printk(const char *level, const struct device *dev,
472999bcf217SJoe Perches 		 const char *fmt, ...)
473099bcf217SJoe Perches {
473199bcf217SJoe Perches 	struct va_format vaf;
473299bcf217SJoe Perches 	va_list args;
473399bcf217SJoe Perches 
473499bcf217SJoe Perches 	va_start(args, fmt);
473599bcf217SJoe Perches 
473699bcf217SJoe Perches 	vaf.fmt = fmt;
473799bcf217SJoe Perches 	vaf.va = &args;
473899bcf217SJoe Perches 
4739d1f1052cSJoe Perches 	__dev_printk(level, dev, &vaf);
4740798efc60SJoe Perches 
474199bcf217SJoe Perches 	va_end(args);
474299bcf217SJoe Perches }
4743ad7d61f1SChris Down EXPORT_SYMBOL(_dev_printk);
474499bcf217SJoe Perches 
474599bcf217SJoe Perches #define define_dev_printk_level(func, kern_level)		\
4746d1f1052cSJoe Perches void func(const struct device *dev, const char *fmt, ...)	\
474799bcf217SJoe Perches {								\
474899bcf217SJoe Perches 	struct va_format vaf;					\
474999bcf217SJoe Perches 	va_list args;						\
475099bcf217SJoe Perches 								\
475199bcf217SJoe Perches 	va_start(args, fmt);					\
475299bcf217SJoe Perches 								\
475399bcf217SJoe Perches 	vaf.fmt = fmt;						\
475499bcf217SJoe Perches 	vaf.va = &args;						\
475599bcf217SJoe Perches 								\
4756d1f1052cSJoe Perches 	__dev_printk(kern_level, dev, &vaf);			\
4757798efc60SJoe Perches 								\
475899bcf217SJoe Perches 	va_end(args);						\
475999bcf217SJoe Perches }								\
476099bcf217SJoe Perches EXPORT_SYMBOL(func);
476199bcf217SJoe Perches 
4762663336eeSJoe Perches define_dev_printk_level(_dev_emerg, KERN_EMERG);
4763663336eeSJoe Perches define_dev_printk_level(_dev_alert, KERN_ALERT);
4764663336eeSJoe Perches define_dev_printk_level(_dev_crit, KERN_CRIT);
4765663336eeSJoe Perches define_dev_printk_level(_dev_err, KERN_ERR);
4766663336eeSJoe Perches define_dev_printk_level(_dev_warn, KERN_WARNING);
4767663336eeSJoe Perches define_dev_printk_level(_dev_notice, KERN_NOTICE);
476899bcf217SJoe Perches define_dev_printk_level(_dev_info, KERN_INFO);
476999bcf217SJoe Perches 
477099bcf217SJoe Perches #endif
477197badf87SRafael J. Wysocki 
4772a787e540SAndrzej Hajda /**
4773a787e540SAndrzej Hajda  * dev_err_probe - probe error check and log helper
4774a787e540SAndrzej Hajda  * @dev: the pointer to the struct device
4775a787e540SAndrzej Hajda  * @err: error value to test
4776a787e540SAndrzej Hajda  * @fmt: printf-style format string
4777a787e540SAndrzej Hajda  * @...: arguments as specified in the format string
4778a787e540SAndrzej Hajda  *
4779a787e540SAndrzej Hajda  * This helper implements common pattern present in probe functions for error
4780a787e540SAndrzej Hajda  * checking: print debug or error message depending if the error value is
4781a787e540SAndrzej Hajda  * -EPROBE_DEFER and propagate error upwards.
4782d090b70eSAndrzej Hajda  * In case of -EPROBE_DEFER it sets also defer probe reason, which can be
4783d090b70eSAndrzej Hajda  * checked later by reading devices_deferred debugfs attribute.
4784074b3aadSMauro Carvalho Chehab  * It replaces code sequence::
4785074b3aadSMauro Carvalho Chehab  *
4786a787e540SAndrzej Hajda  * 	if (err != -EPROBE_DEFER)
4787a787e540SAndrzej Hajda  * 		dev_err(dev, ...);
4788a787e540SAndrzej Hajda  * 	else
4789a787e540SAndrzej Hajda  * 		dev_dbg(dev, ...);
4790a787e540SAndrzej Hajda  * 	return err;
4791074b3aadSMauro Carvalho Chehab  *
4792074b3aadSMauro Carvalho Chehab  * with::
4793074b3aadSMauro Carvalho Chehab  *
4794a787e540SAndrzej Hajda  * 	return dev_err_probe(dev, err, ...);
4795a787e540SAndrzej Hajda  *
47967065f922SDouglas Anderson  * Note that it is deemed acceptable to use this function for error
47977065f922SDouglas Anderson  * prints during probe even if the @err is known to never be -EPROBE_DEFER.
47987065f922SDouglas Anderson  * The benefit compared to a normal dev_err() is the standardized format
47997065f922SDouglas Anderson  * of the error code and the fact that the error code is returned.
48007065f922SDouglas Anderson  *
4801a787e540SAndrzej Hajda  * Returns @err.
4802a787e540SAndrzej Hajda  *
4803a787e540SAndrzej Hajda  */
4804a787e540SAndrzej Hajda int dev_err_probe(const struct device *dev, int err, const char *fmt, ...)
4805a787e540SAndrzej Hajda {
4806a787e540SAndrzej Hajda 	struct va_format vaf;
4807a787e540SAndrzej Hajda 	va_list args;
4808a787e540SAndrzej Hajda 
4809a787e540SAndrzej Hajda 	va_start(args, fmt);
4810a787e540SAndrzej Hajda 	vaf.fmt = fmt;
4811a787e540SAndrzej Hajda 	vaf.va = &args;
4812a787e540SAndrzej Hajda 
4813d090b70eSAndrzej Hajda 	if (err != -EPROBE_DEFER) {
4814693a8e93SMichał Mirosław 		dev_err(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
4815d090b70eSAndrzej Hajda 	} else {
4816d090b70eSAndrzej Hajda 		device_set_deferred_probe_reason(dev, &vaf);
4817693a8e93SMichał Mirosław 		dev_dbg(dev, "error %pe: %pV", ERR_PTR(err), &vaf);
4818d090b70eSAndrzej Hajda 	}
4819a787e540SAndrzej Hajda 
4820a787e540SAndrzej Hajda 	va_end(args);
4821a787e540SAndrzej Hajda 
4822a787e540SAndrzej Hajda 	return err;
4823a787e540SAndrzej Hajda }
4824a787e540SAndrzej Hajda EXPORT_SYMBOL_GPL(dev_err_probe);
4825a787e540SAndrzej Hajda 
482697badf87SRafael J. Wysocki static inline bool fwnode_is_primary(struct fwnode_handle *fwnode)
482797badf87SRafael J. Wysocki {
482897badf87SRafael J. Wysocki 	return fwnode && !IS_ERR(fwnode->secondary);
482997badf87SRafael J. Wysocki }
483097badf87SRafael J. Wysocki 
483197badf87SRafael J. Wysocki /**
483297badf87SRafael J. Wysocki  * set_primary_fwnode - Change the primary firmware node of a given device.
483397badf87SRafael J. Wysocki  * @dev: Device to handle.
483497badf87SRafael J. Wysocki  * @fwnode: New primary firmware node of the device.
483597badf87SRafael J. Wysocki  *
483697badf87SRafael J. Wysocki  * Set the device's firmware node pointer to @fwnode, but if a secondary
483797badf87SRafael J. Wysocki  * firmware node of the device is present, preserve it.
48383f7bddafSBard Liao  *
48393f7bddafSBard Liao  * Valid fwnode cases are:
48403f7bddafSBard Liao  *  - primary --> secondary --> -ENODEV
48413f7bddafSBard Liao  *  - primary --> NULL
48423f7bddafSBard Liao  *  - secondary --> -ENODEV
48433f7bddafSBard Liao  *  - NULL
484497badf87SRafael J. Wysocki  */
484597badf87SRafael J. Wysocki void set_primary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
484697badf87SRafael J. Wysocki {
484799aed922SAndy Shevchenko 	struct device *parent = dev->parent;
484897badf87SRafael J. Wysocki 	struct fwnode_handle *fn = dev->fwnode;
484997badf87SRafael J. Wysocki 
4850c15e1bddSHeikki Krogerus 	if (fwnode) {
485197badf87SRafael J. Wysocki 		if (fwnode_is_primary(fn))
485297badf87SRafael J. Wysocki 			fn = fn->secondary;
485397badf87SRafael J. Wysocki 
485455f89a8aSMika Westerberg 		if (fn) {
485555f89a8aSMika Westerberg 			WARN_ON(fwnode->secondary);
485697badf87SRafael J. Wysocki 			fwnode->secondary = fn;
485755f89a8aSMika Westerberg 		}
485897badf87SRafael J. Wysocki 		dev->fwnode = fwnode;
485997badf87SRafael J. Wysocki 	} else {
4860c15e1bddSHeikki Krogerus 		if (fwnode_is_primary(fn)) {
4861c15e1bddSHeikki Krogerus 			dev->fwnode = fn->secondary;
48623f7bddafSBard Liao 			/* Set fn->secondary = NULL, so fn remains the primary fwnode */
486399aed922SAndy Shevchenko 			if (!(parent && fn == parent->fwnode))
486447f44699SBard Liao 				fn->secondary = NULL;
4865c15e1bddSHeikki Krogerus 		} else {
4866c15e1bddSHeikki Krogerus 			dev->fwnode = NULL;
4867c15e1bddSHeikki Krogerus 		}
486897badf87SRafael J. Wysocki 	}
486997badf87SRafael J. Wysocki }
487097badf87SRafael J. Wysocki EXPORT_SYMBOL_GPL(set_primary_fwnode);
487197badf87SRafael J. Wysocki 
487297badf87SRafael J. Wysocki /**
487397badf87SRafael J. Wysocki  * set_secondary_fwnode - Change the secondary firmware node of a given device.
487497badf87SRafael J. Wysocki  * @dev: Device to handle.
487597badf87SRafael J. Wysocki  * @fwnode: New secondary firmware node of the device.
487697badf87SRafael J. Wysocki  *
487797badf87SRafael J. Wysocki  * If a primary firmware node of the device is present, set its secondary
487897badf87SRafael J. Wysocki  * pointer to @fwnode.  Otherwise, set the device's firmware node pointer to
487997badf87SRafael J. Wysocki  * @fwnode.
488097badf87SRafael J. Wysocki  */
488197badf87SRafael J. Wysocki void set_secondary_fwnode(struct device *dev, struct fwnode_handle *fwnode)
488297badf87SRafael J. Wysocki {
488397badf87SRafael J. Wysocki 	if (fwnode)
488497badf87SRafael J. Wysocki 		fwnode->secondary = ERR_PTR(-ENODEV);
488597badf87SRafael J. Wysocki 
488697badf87SRafael J. Wysocki 	if (fwnode_is_primary(dev->fwnode))
488797badf87SRafael J. Wysocki 		dev->fwnode->secondary = fwnode;
488897badf87SRafael J. Wysocki 	else
488997badf87SRafael J. Wysocki 		dev->fwnode = fwnode;
489097badf87SRafael J. Wysocki }
489196489ae1SAndy Shevchenko EXPORT_SYMBOL_GPL(set_secondary_fwnode);
48924e75e1d7SJohan Hovold 
48934e75e1d7SJohan Hovold /**
48944e75e1d7SJohan Hovold  * device_set_of_node_from_dev - reuse device-tree node of another device
48954e75e1d7SJohan Hovold  * @dev: device whose device-tree node is being set
48964e75e1d7SJohan Hovold  * @dev2: device whose device-tree node is being reused
48974e75e1d7SJohan Hovold  *
48984e75e1d7SJohan Hovold  * Takes another reference to the new device-tree node after first dropping
48994e75e1d7SJohan Hovold  * any reference held to the old node.
49004e75e1d7SJohan Hovold  */
49014e75e1d7SJohan Hovold void device_set_of_node_from_dev(struct device *dev, const struct device *dev2)
49024e75e1d7SJohan Hovold {
49034e75e1d7SJohan Hovold 	of_node_put(dev->of_node);
49044e75e1d7SJohan Hovold 	dev->of_node = of_node_get(dev2->of_node);
49054e75e1d7SJohan Hovold 	dev->of_node_reused = true;
49064e75e1d7SJohan Hovold }
49074e75e1d7SJohan Hovold EXPORT_SYMBOL_GPL(device_set_of_node_from_dev);
490865b66682SSuzuki K Poulose 
490943e76d46SIoana Ciornei void device_set_node(struct device *dev, struct fwnode_handle *fwnode)
491043e76d46SIoana Ciornei {
491143e76d46SIoana Ciornei 	dev->fwnode = fwnode;
491243e76d46SIoana Ciornei 	dev->of_node = to_of_node(fwnode);
491343e76d46SIoana Ciornei }
491443e76d46SIoana Ciornei EXPORT_SYMBOL_GPL(device_set_node);
491543e76d46SIoana Ciornei 
49166cda08a2SSuzuki K Poulose int device_match_name(struct device *dev, const void *name)
49176cda08a2SSuzuki K Poulose {
49186cda08a2SSuzuki K Poulose 	return sysfs_streq(dev_name(dev), name);
49196cda08a2SSuzuki K Poulose }
49206cda08a2SSuzuki K Poulose EXPORT_SYMBOL_GPL(device_match_name);
49216cda08a2SSuzuki K Poulose 
492265b66682SSuzuki K Poulose int device_match_of_node(struct device *dev, const void *np)
492365b66682SSuzuki K Poulose {
492465b66682SSuzuki K Poulose 	return dev->of_node == np;
492565b66682SSuzuki K Poulose }
492665b66682SSuzuki K Poulose EXPORT_SYMBOL_GPL(device_match_of_node);
492767843bbaSSuzuki K Poulose 
492867843bbaSSuzuki K Poulose int device_match_fwnode(struct device *dev, const void *fwnode)
492967843bbaSSuzuki K Poulose {
493067843bbaSSuzuki K Poulose 	return dev_fwnode(dev) == fwnode;
493167843bbaSSuzuki K Poulose }
493267843bbaSSuzuki K Poulose EXPORT_SYMBOL_GPL(device_match_fwnode);
49334495dfddSSuzuki K Poulose 
49344495dfddSSuzuki K Poulose int device_match_devt(struct device *dev, const void *pdevt)
49354495dfddSSuzuki K Poulose {
49364495dfddSSuzuki K Poulose 	return dev->devt == *(dev_t *)pdevt;
49374495dfddSSuzuki K Poulose }
49384495dfddSSuzuki K Poulose EXPORT_SYMBOL_GPL(device_match_devt);
493900500147SSuzuki K Poulose 
494000500147SSuzuki K Poulose int device_match_acpi_dev(struct device *dev, const void *adev)
494100500147SSuzuki K Poulose {
494200500147SSuzuki K Poulose 	return ACPI_COMPANION(dev) == adev;
494300500147SSuzuki K Poulose }
494400500147SSuzuki K Poulose EXPORT_SYMBOL(device_match_acpi_dev);
49456bf85ba9SSuzuki K Poulose 
4946a164ff53SAndy Shevchenko int device_match_acpi_handle(struct device *dev, const void *handle)
4947a164ff53SAndy Shevchenko {
4948a164ff53SAndy Shevchenko 	return ACPI_HANDLE(dev) == handle;
4949a164ff53SAndy Shevchenko }
4950a164ff53SAndy Shevchenko EXPORT_SYMBOL(device_match_acpi_handle);
4951a164ff53SAndy Shevchenko 
49526bf85ba9SSuzuki K Poulose int device_match_any(struct device *dev, const void *unused)
49536bf85ba9SSuzuki K Poulose {
49546bf85ba9SSuzuki K Poulose 	return 1;
49556bf85ba9SSuzuki K Poulose }
49566bf85ba9SSuzuki K Poulose EXPORT_SYMBOL_GPL(device_match_any);
4957