Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags   |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2004-2009 Greg Kroah-Hartman <gregkh@suse.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2008-2012 Novell Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (c) 2012-2019 Greg Kroah-Hartman <gregkh@linuxfoundation.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * Copyright (c) 2012-2019 Linux Foundation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * Core driver model functions and structures that should not be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  * shared outside of the drivers/base/ directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * struct subsys_private - structure to hold the private to the driver core portions of the bus_type/class structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * @subsys - the struct kset that defines this subsystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * @devices_kset - the subsystem's 'devices' directory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * @interfaces - list of subsystem interfaces associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * @mutex - protect the devices, and interfaces lists.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * @drivers_kset - the list of drivers associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * @klist_devices - the klist to iterate over the @devices_kset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * @klist_drivers - the klist to iterate over the @drivers_kset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * @bus_notifier - the bus notifier list for anything that cares about things
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *                 on this bus.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * @bus - pointer back to the struct bus_type that this structure is associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *        with.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * @glue_dirs - "glue" directory to put in-between the parent device to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  *              avoid namespace conflicts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  * @class - pointer back to the struct class that this structure is associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34)  *          with.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)  * This structure is the one that is the actual kobject allowing struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37)  * bus_type/class to be statically allocated safely.  Nothing outside of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38)  * driver core should ever touch these fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) struct subsys_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	struct kset subsys;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	struct kset *devices_kset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	struct list_head interfaces;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	struct mutex mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	struct kset *drivers_kset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	struct klist klist_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	struct klist klist_drivers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	struct blocking_notifier_head bus_notifier;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	unsigned int drivers_autoprobe:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	struct bus_type *bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	struct kset glue_dirs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	struct class *class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) #define to_subsys_private(obj) container_of(obj, struct subsys_private, subsys.kobj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) struct driver_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	struct kobject kobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	struct klist klist_devices;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	struct klist_node knode_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	struct module_kobject *mkobj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	struct device_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) #define to_driver(obj) container_of(obj, struct driver_private, kobj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68)  * struct device_private - structure to hold the private to the driver core portions of the device structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  * @klist_children - klist containing all children of this device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  * @knode_parent - node in sibling list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  * @knode_driver - node in driver list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  * @knode_bus - node in bus list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * @knode_class - node in class list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  * @deferred_probe - entry in deferred_probe_list which is used to retry the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  *	binding of drivers which were unable to get all the resources needed by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  *	the device; typically because it depends on another driver getting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78)  *	probed first.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79)  * @async_driver - pointer to device driver awaiting probe via async_probe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)  * @device - pointer back to the struct device that this structure is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81)  * associated with.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82)  * @dead - This device is currently either in the process of or has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83)  *	removed from the system. Any asynchronous events scheduled for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84)  *	device should exit without taking any action.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86)  * Nothing outside of the driver core should ever touch these fields.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) struct device_private {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	struct klist klist_children;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	struct klist_node knode_parent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	struct klist_node knode_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	struct klist_node knode_bus;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	struct klist_node knode_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	struct list_head deferred_probe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	struct device_driver *async_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	char *deferred_probe_reason;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	struct device *device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	u8 dead:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define to_device_private_parent(obj)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	container_of(obj, struct device_private, knode_parent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define to_device_private_driver(obj)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	container_of(obj, struct device_private, knode_driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define to_device_private_bus(obj)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	container_of(obj, struct device_private, knode_bus)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define to_device_private_class(obj)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	container_of(obj, struct device_private, knode_class)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* initialisation functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) extern int devices_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) extern int buses_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) extern int classes_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) extern int firmware_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #ifdef CONFIG_SYS_HYPERVISOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) extern int hypervisor_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) static inline int hypervisor_init(void) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) extern int platform_bus_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) extern void cpu_dev_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) extern void container_dev_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) struct kobject *virtual_device_parent(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) extern int bus_add_device(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) extern void bus_probe_device(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) extern void bus_remove_device(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) extern int bus_add_driver(struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) extern void bus_remove_driver(struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) extern void device_release_driver_internal(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 					   struct device_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 					   struct device *parent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) extern void driver_detach(struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) extern int driver_probe_device(struct device_driver *drv, struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) extern void driver_deferred_probe_del(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) extern void device_set_deferred_probe_reason(const struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 					     struct va_format *vaf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) static inline int driver_match_device(struct device_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 				      struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	return drv->bus->match ? drv->bus->match(dev, drv) : 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) extern bool driver_allows_async_probing(struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) extern int driver_add_groups(struct device_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 			     const struct attribute_group **groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) extern void driver_remove_groups(struct device_driver *drv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 				 const struct attribute_group **groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) int device_driver_attach(struct device_driver *drv, struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) void device_driver_detach(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) extern char *make_class_name(const char *name, struct kobject *kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) extern int devres_release_all(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) extern void device_block_probing(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) extern void device_unblock_probing(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* /sys/devices directory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) extern struct kset *devices_kset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) extern void devices_kset_move_last(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) extern void module_add_driver(struct module *mod, struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) extern void module_remove_driver(struct device_driver *drv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static inline void module_add_driver(struct module *mod,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 				     struct device_driver *drv) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) static inline void module_remove_driver(struct device_driver *drv) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #ifdef CONFIG_DEVTMPFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) extern int devtmpfs_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static inline int devtmpfs_init(void) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* Device links support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) extern int device_links_read_lock(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) extern void device_links_read_unlock(int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) extern int device_links_read_lock_held(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) extern int device_links_check_suppliers(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) extern void device_links_driver_bound(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) extern void device_links_driver_cleanup(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) extern void device_links_no_driver(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) extern bool device_links_busy(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) extern void device_links_unbind_consumers(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) /* device pm support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) void device_pm_move_to_tail(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #ifdef CONFIG_DEVTMPFS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) int devtmpfs_create_node(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) int devtmpfs_delete_node(struct device *dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) static inline int devtmpfs_create_node(struct device *dev) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) static inline int devtmpfs_delete_node(struct device *dev) { return 0; }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) #endif