diff options
Diffstat (limited to 'drivers/base/base.h')
| -rw-r--r-- | drivers/base/base.h | 114 | 
1 files changed, 67 insertions, 47 deletions
diff --git a/drivers/base/base.h b/drivers/base/base.h index 726a12a244c0..eb4c0ace9242 100644 --- a/drivers/base/base.h +++ b/drivers/base/base.h @@ -27,11 +27,13 @@   *                 on this bus.   * @bus - pointer back to the struct bus_type that this structure is associated   *        with. + * @dev_root: Default device to use as the parent.   *   * @glue_dirs - "glue" directory to put in-between the parent device to   *              avoid namespace conflicts   * @class - pointer back to the struct class that this structure is associated   *          with. + * @lock_key:	Lock class key for use by the lock validator   *   * This structure is the one that is the actual kobject allowing struct   * bus_type/class to be statically allocated safely.  Nothing outside of the @@ -48,10 +50,11 @@ struct subsys_private {  	struct klist klist_drivers;  	struct blocking_notifier_head bus_notifier;  	unsigned int drivers_autoprobe:1; -	struct bus_type *bus; +	const struct bus_type *bus; +	struct device *dev_root;  	struct kset glue_dirs; -	struct class *class; +	const struct class *class;  	struct lock_class_key lock_key;  }; @@ -70,6 +73,8 @@ static inline void subsys_put(struct subsys_private *sp)  		kset_put(&sp->subsys);  } +struct subsys_private *class_to_subsys(const struct class *class); +  struct driver_private {  	struct kobject kobj;  	struct klist klist_devices; @@ -122,69 +127,73 @@ struct device_private {  	container_of(obj, struct device_private, knode_class)  /* initialisation functions */ -extern int devices_init(void); -extern int buses_init(void); -extern int classes_init(void); -extern int firmware_init(void); +int devices_init(void); +int buses_init(void); +int classes_init(void); +int firmware_init(void);  #ifdef CONFIG_SYS_HYPERVISOR -extern int hypervisor_init(void); +int hypervisor_init(void);  #else  static inline int hypervisor_init(void) { return 0; }  #endif -extern int platform_bus_init(void); -extern void cpu_dev_init(void); -extern void container_dev_init(void); +int platform_bus_init(void); +void cpu_dev_init(void); +void container_dev_init(void);  #ifdef CONFIG_AUXILIARY_BUS -extern void auxiliary_bus_init(void); +void auxiliary_bus_init(void);  #else  static inline void auxiliary_bus_init(void) { }  #endif  struct kobject *virtual_device_parent(struct device *dev); -extern int bus_add_device(struct device *dev); -extern void bus_probe_device(struct device *dev); -extern void bus_remove_device(struct device *dev); +int bus_add_device(struct device *dev); +void bus_probe_device(struct device *dev); +void bus_remove_device(struct device *dev);  void bus_notify(struct device *dev, enum bus_notifier_event value);  bool bus_is_registered(const struct bus_type *bus); -extern int bus_add_driver(struct device_driver *drv); -extern void bus_remove_driver(struct device_driver *drv); -extern void device_release_driver_internal(struct device *dev, -					   struct device_driver *drv, -					   struct device *parent); +int bus_add_driver(struct device_driver *drv); +void bus_remove_driver(struct device_driver *drv); +void device_release_driver_internal(struct device *dev, struct device_driver *drv, +				    struct device *parent); -extern void driver_detach(struct device_driver *drv); -extern void driver_deferred_probe_del(struct device *dev); -extern void device_set_deferred_probe_reason(const struct device *dev, -					     struct va_format *vaf); +void driver_detach(struct device_driver *drv); +void driver_deferred_probe_del(struct device *dev); +void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf);  static inline int driver_match_device(struct device_driver *drv,  				      struct device *dev)  {  	return drv->bus->match ? drv->bus->match(dev, drv) : 1;  } -extern int driver_add_groups(struct device_driver *drv, -			     const struct attribute_group **groups); -extern void driver_remove_groups(struct device_driver *drv, -				 const struct attribute_group **groups); +static inline void dev_sync_state(struct device *dev) +{ +	if (dev->bus->sync_state) +		dev->bus->sync_state(dev); +	else if (dev->driver && dev->driver->sync_state) +		dev->driver->sync_state(dev); +} + +int driver_add_groups(struct device_driver *drv, const struct attribute_group **groups); +void driver_remove_groups(struct device_driver *drv, const struct attribute_group **groups);  void device_driver_detach(struct device *dev); -extern int devres_release_all(struct device *dev); -extern void device_block_probing(void); -extern void device_unblock_probing(void); -extern void deferred_probe_extend_timeout(void); -extern void driver_deferred_probe_trigger(void); +int devres_release_all(struct device *dev); +void device_block_probing(void); +void device_unblock_probing(void); +void deferred_probe_extend_timeout(void); +void driver_deferred_probe_trigger(void);  const char *device_get_devnode(const struct device *dev, umode_t *mode,  			       kuid_t *uid, kgid_t *gid, const char **tmp);  /* /sys/devices directory */  extern struct kset *devices_kset; -extern void devices_kset_move_last(struct device *dev); +void devices_kset_move_last(struct device *dev);  #if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS) -extern void module_add_driver(struct module *mod, struct device_driver *drv); -extern void module_remove_driver(struct device_driver *drv); +void module_add_driver(struct module *mod, struct device_driver *drv); +void module_remove_driver(struct device_driver *drv);  #else  static inline void module_add_driver(struct module *mod,  				     struct device_driver *drv) { } @@ -192,23 +201,34 @@ static inline void module_remove_driver(struct device_driver *drv) { }  #endif  #ifdef CONFIG_DEVTMPFS -extern int devtmpfs_init(void); +int devtmpfs_init(void);  #else  static inline int devtmpfs_init(void) { return 0; }  #endif +#ifdef CONFIG_BLOCK +extern struct class block_class; +static inline bool is_blockdev(struct device *dev) +{ +	return dev->class == &block_class; +} +#else +static inline bool is_blockdev(struct device *dev) { return false; } +#endif +  /* Device links support */ -extern int device_links_read_lock(void); -extern void device_links_read_unlock(int idx); -extern int device_links_read_lock_held(void); -extern int device_links_check_suppliers(struct device *dev); -extern void device_links_force_bind(struct device *dev); -extern void device_links_driver_bound(struct device *dev); -extern void device_links_driver_cleanup(struct device *dev); -extern void device_links_no_driver(struct device *dev); -extern bool device_links_busy(struct device *dev); -extern void device_links_unbind_consumers(struct device *dev); -extern void fw_devlink_drivers_done(void); +int device_links_read_lock(void); +void device_links_read_unlock(int idx); +int device_links_read_lock_held(void); +int device_links_check_suppliers(struct device *dev); +void device_links_force_bind(struct device *dev); +void device_links_driver_bound(struct device *dev); +void device_links_driver_cleanup(struct device *dev); +void device_links_no_driver(struct device *dev); +bool device_links_busy(struct device *dev); +void device_links_unbind_consumers(struct device *dev); +void fw_devlink_drivers_done(void); +void fw_devlink_probing_done(void);  /* device pm support */  void device_pm_move_to_tail(struct device *dev);  |