2011-05-27 06:08:35 +08:00
|
|
|
#include <linux/notifier.h>
|
2005-10-14 00:54:41 +08:00
|
|
|
|
2007-11-02 10:41:16 +08:00
|
|
|
/**
|
2010-11-16 06:13:18 +08:00
|
|
|
* struct subsys_private - structure to hold the private to the driver core portions of the bus_type/class structure.
|
2007-11-02 10:41:16 +08:00
|
|
|
*
|
2010-11-16 06:13:18 +08:00
|
|
|
* @subsys - the struct kset that defines this subsystem
|
2011-12-15 06:29:38 +08:00
|
|
|
* @devices_kset - the subsystem's 'devices' directory
|
|
|
|
* @interfaces - list of subsystem interfaces associated
|
|
|
|
* @mutex - protect the devices, and interfaces lists.
|
2010-11-16 06:13:18 +08:00
|
|
|
*
|
|
|
|
* @drivers_kset - the list of drivers associated
|
2007-11-02 10:41:16 +08:00
|
|
|
* @klist_devices - the klist to iterate over the @devices_kset
|
|
|
|
* @klist_drivers - the klist to iterate over the @drivers_kset
|
|
|
|
* @bus_notifier - the bus notifier list for anything that cares about things
|
2010-11-16 06:13:18 +08:00
|
|
|
* on this bus.
|
2007-11-02 10:41:16 +08:00
|
|
|
* @bus - pointer back to the struct bus_type that this structure is associated
|
2010-11-16 06:13:18 +08:00
|
|
|
* with.
|
|
|
|
*
|
|
|
|
* @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.
|
2007-11-02 10:41:16 +08:00
|
|
|
*
|
|
|
|
* This structure is the one that is the actual kobject allowing struct
|
2010-11-16 06:13:18 +08:00
|
|
|
* bus_type/class to be statically allocated safely. Nothing outside of the
|
|
|
|
* driver core should ever touch these fields.
|
2007-11-02 10:41:16 +08:00
|
|
|
*/
|
2010-11-16 06:13:18 +08:00
|
|
|
struct subsys_private {
|
2007-11-02 10:41:16 +08:00
|
|
|
struct kset subsys;
|
|
|
|
struct kset *devices_kset;
|
2011-12-15 06:29:38 +08:00
|
|
|
struct list_head interfaces;
|
|
|
|
struct mutex mutex;
|
2010-11-16 06:13:18 +08:00
|
|
|
|
|
|
|
struct kset *drivers_kset;
|
2007-11-02 10:41:16 +08:00
|
|
|
struct klist klist_devices;
|
|
|
|
struct klist klist_drivers;
|
|
|
|
struct blocking_notifier_head bus_notifier;
|
|
|
|
unsigned int drivers_autoprobe:1;
|
|
|
|
struct bus_type *bus;
|
2010-11-16 06:13:18 +08:00
|
|
|
|
|
|
|
struct kset glue_dirs;
|
|
|
|
struct class *class;
|
2007-11-02 10:41:16 +08:00
|
|
|
};
|
2010-11-16 06:13:18 +08:00
|
|
|
#define to_subsys_private(obj) container_of(obj, struct subsys_private, subsys.kobj)
|
2007-11-02 10:41:16 +08:00
|
|
|
|
2007-11-29 07:59:15 +08:00
|
|
|
struct driver_private {
|
|
|
|
struct kobject kobj;
|
|
|
|
struct klist klist_devices;
|
|
|
|
struct klist_node knode_bus;
|
|
|
|
struct module_kobject *mkobj;
|
|
|
|
struct device_driver *driver;
|
|
|
|
};
|
|
|
|
#define to_driver(obj) container_of(obj, struct driver_private, kobj)
|
2005-10-14 00:54:41 +08:00
|
|
|
|
2008-12-17 04:23:36 +08:00
|
|
|
/**
|
|
|
|
* struct device_private - structure to hold the private to the driver core portions of the device structure.
|
|
|
|
*
|
2008-12-17 04:24:56 +08:00
|
|
|
* @klist_children - klist containing all children of this device
|
|
|
|
* @knode_parent - node in sibling list
|
2008-12-17 04:25:49 +08:00
|
|
|
* @knode_driver - node in driver list
|
2008-12-17 04:26:21 +08:00
|
|
|
* @knode_bus - node in bus list
|
2012-03-09 04:17:22 +08:00
|
|
|
* @deferred_probe - entry in deferred_probe_list which is used to retry the
|
|
|
|
* binding of drivers which were unable to get all the resources needed by
|
|
|
|
* the device; typically because it depends on another driver getting
|
|
|
|
* probed first.
|
2009-05-12 05:16:57 +08:00
|
|
|
* @driver_data - private pointer for driver specific info. Will turn into a
|
|
|
|
* list soon.
|
2008-12-17 04:23:36 +08:00
|
|
|
* @device - pointer back to the struct class that this structure is
|
|
|
|
* associated with.
|
|
|
|
*
|
|
|
|
* Nothing outside of the driver core should ever touch these fields.
|
|
|
|
*/
|
|
|
|
struct device_private {
|
2008-12-17 04:24:56 +08:00
|
|
|
struct klist klist_children;
|
|
|
|
struct klist_node knode_parent;
|
2008-12-17 04:25:49 +08:00
|
|
|
struct klist_node knode_driver;
|
2008-12-17 04:26:21 +08:00
|
|
|
struct klist_node knode_bus;
|
2012-03-09 04:17:22 +08:00
|
|
|
struct list_head deferred_probe;
|
2009-05-12 05:16:57 +08:00
|
|
|
void *driver_data;
|
2008-12-17 04:23:36 +08:00
|
|
|
struct device *device;
|
|
|
|
};
|
2008-12-17 04:24:56 +08:00
|
|
|
#define to_device_private_parent(obj) \
|
|
|
|
container_of(obj, struct device_private, knode_parent)
|
2008-12-17 04:25:49 +08:00
|
|
|
#define to_device_private_driver(obj) \
|
|
|
|
container_of(obj, struct device_private, knode_driver)
|
2008-12-17 04:26:21 +08:00
|
|
|
#define to_device_private_bus(obj) \
|
|
|
|
container_of(obj, struct device_private, knode_bus)
|
2008-12-17 04:23:36 +08:00
|
|
|
|
2009-05-12 05:16:57 +08:00
|
|
|
extern int device_private_init(struct device *dev);
|
|
|
|
|
2007-11-02 10:41:16 +08:00
|
|
|
/* initialisation functions */
|
2005-10-14 00:54:41 +08:00
|
|
|
extern int devices_init(void);
|
|
|
|
extern int buses_init(void);
|
|
|
|
extern int classes_init(void);
|
|
|
|
extern int firmware_init(void);
|
2006-05-09 18:53:49 +08:00
|
|
|
#ifdef CONFIG_SYS_HYPERVISOR
|
|
|
|
extern int hypervisor_init(void);
|
|
|
|
#else
|
|
|
|
static inline int hypervisor_init(void) { return 0; }
|
|
|
|
#endif
|
2005-10-14 00:54:41 +08:00
|
|
|
extern int platform_bus_init(void);
|
2012-01-10 10:59:49 +08:00
|
|
|
extern void cpu_dev_init(void);
|
2005-10-14 00:54:41 +08:00
|
|
|
|
2013-03-13 02:30:05 +08:00
|
|
|
struct kobject *virtual_device_parent(struct device *dev);
|
|
|
|
|
2008-01-25 14:50:12 +08:00
|
|
|
extern int bus_add_device(struct device *dev);
|
2009-07-31 03:27:18 +08:00
|
|
|
extern void bus_probe_device(struct device *dev);
|
2008-01-25 14:50:12 +08:00
|
|
|
extern void bus_remove_device(struct device *dev);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-01-25 14:50:12 +08:00
|
|
|
extern int bus_add_driver(struct device_driver *drv);
|
|
|
|
extern void bus_remove_driver(struct device_driver *drv);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2008-01-25 14:50:12 +08:00
|
|
|
extern void driver_detach(struct device_driver *drv);
|
|
|
|
extern int driver_probe_device(struct device_driver *drv, struct device *dev);
|
2012-03-05 23:47:41 +08:00
|
|
|
extern void driver_deferred_probe_del(struct device *dev);
|
2009-01-21 23:27:47 +08:00
|
|
|
static inline int driver_match_device(struct device_driver *drv,
|
|
|
|
struct device *dev)
|
|
|
|
{
|
2009-03-27 21:50:00 +08:00
|
|
|
return drv->bus->match ? drv->bus->match(dev, drv) : 1;
|
2009-01-21 23:27:47 +08:00
|
|
|
}
|
2005-03-22 02:52:54 +08:00
|
|
|
|
2013-08-09 06:22:56 +08:00
|
|
|
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);
|
|
|
|
|
2013-08-09 06:22:55 +08:00
|
|
|
extern int device_add_groups(struct device *dev,
|
|
|
|
const struct attribute_group **groups);
|
|
|
|
extern void device_remove_groups(struct device *dev,
|
|
|
|
const struct attribute_group **groups);
|
|
|
|
|
2006-06-21 04:59:20 +08:00
|
|
|
extern char *make_class_name(const char *name, struct kobject *kobj);
|
2005-04-17 06:20:36 +08:00
|
|
|
|
2007-06-18 07:42:54 +08:00
|
|
|
extern int devres_release_all(struct device *dev);
|
2007-04-14 04:15:19 +08:00
|
|
|
|
2011-12-15 06:29:38 +08:00
|
|
|
/* /sys/devices directory */
|
2007-11-01 23:29:06 +08:00
|
|
|
extern struct kset *devices_kset;
|
2007-11-29 04:23:18 +08:00
|
|
|
|
2008-01-01 02:05:43 +08:00
|
|
|
#if defined(CONFIG_MODULES) && defined(CONFIG_SYSFS)
|
2007-11-29 04:23:18 +08:00
|
|
|
extern void module_add_driver(struct module *mod, struct device_driver *drv);
|
|
|
|
extern void module_remove_driver(struct device_driver *drv);
|
|
|
|
#else
|
|
|
|
static inline void module_add_driver(struct module *mod,
|
|
|
|
struct device_driver *drv) { }
|
|
|
|
static inline void module_remove_driver(struct device_driver *drv) { }
|
|
|
|
#endif
|
Driver Core: devtmpfs - kernel-maintained tmpfs-based /dev
Devtmpfs lets the kernel create a tmpfs instance called devtmpfs
very early at kernel initialization, before any driver-core device
is registered. Every device with a major/minor will provide a
device node in devtmpfs.
Devtmpfs can be changed and altered by userspace at any time,
and in any way needed - just like today's udev-mounted tmpfs.
Unmodified udev versions will run just fine on top of it, and will
recognize an already existing kernel-created device node and use it.
The default node permissions are root:root 0600. Proper permissions
and user/group ownership, meaningful symlinks, all other policy still
needs to be applied by userspace.
If a node is created by devtmps, devtmpfs will remove the device node
when the device goes away. If the device node was created by
userspace, or the devtmpfs created node was replaced by userspace, it
will no longer be removed by devtmpfs.
If it is requested to auto-mount it, it makes init=/bin/sh work
without any further userspace support. /dev will be fully populated
and dynamic, and always reflect the current device state of the kernel.
With the commonly used dynamic device numbers, it solves the problem
where static devices nodes may point to the wrong devices.
It is intended to make the initial bootup logic simpler and more robust,
by de-coupling the creation of the inital environment, to reliably run
userspace processes, from a complex userspace bootstrap logic to provide
a working /dev.
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Jan Blunck <jblunck@suse.de>
Tested-By: Harald Hoyer <harald@redhat.com>
Tested-By: Scott James Remnant <scott@ubuntu.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2009-04-30 21:23:42 +08:00
|
|
|
|
|
|
|
#ifdef CONFIG_DEVTMPFS
|
|
|
|
extern int devtmpfs_init(void);
|
|
|
|
#else
|
|
|
|
static inline int devtmpfs_init(void) { return 0; }
|
|
|
|
#endif
|