9ac7849e35
Implement device resource management, in short, devres. A device driver can allocate arbirary size of devres data which is associated with a release function. On driver detach, release function is invoked on the devres data, then, devres data is freed. devreses are typed by associated release functions. Some devreses are better represented by single instance of the type while others need multiple instances sharing the same release function. Both usages are supported. devreses can be grouped using devres group such that a device driver can easily release acquired resources halfway through initialization or selectively release resources (e.g. resources for port 1 out of 4 ports). This patch adds devres core including documentation and the following managed interfaces. * alloc/free : devm_kzalloc(), devm_kzfree() * IO region : devm_request_region(), devm_release_region() * IRQ : devm_request_irq(), devm_free_irq() * DMA : dmam_alloc_coherent(), dmam_free_coherent(), dmam_declare_coherent_memory(), dmam_pool_create(), dmam_pool_destroy() * PCI : pcim_enable_device(), pcim_pin_device(), pci_is_managed() * iomap : devm_ioport_map(), devm_ioport_unmap(), devm_ioremap(), devm_ioremap_nocache(), devm_iounmap(), pcim_iomap_table(), pcim_iomap(), pcim_iounmap() Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
47 lines
1.4 KiB
C
47 lines
1.4 KiB
C
|
|
/* initialisation functions */
|
|
|
|
extern int devices_init(void);
|
|
extern int buses_init(void);
|
|
extern int classes_init(void);
|
|
extern int firmware_init(void);
|
|
#ifdef CONFIG_SYS_HYPERVISOR
|
|
extern int hypervisor_init(void);
|
|
#else
|
|
static inline int hypervisor_init(void) { return 0; }
|
|
#endif
|
|
extern int platform_bus_init(void);
|
|
extern int system_bus_init(void);
|
|
extern int cpu_dev_init(void);
|
|
extern int attribute_container_init(void);
|
|
|
|
extern int bus_add_device(struct device * dev);
|
|
extern int bus_attach_device(struct device * dev);
|
|
extern void bus_remove_device(struct device * dev);
|
|
extern struct bus_type *get_bus(struct bus_type * bus);
|
|
extern void put_bus(struct bus_type * bus);
|
|
|
|
extern int bus_add_driver(struct device_driver *);
|
|
extern void bus_remove_driver(struct device_driver *);
|
|
|
|
extern void driver_detach(struct device_driver * drv);
|
|
extern int driver_probe_device(struct device_driver *, struct device *);
|
|
|
|
extern void sysdev_shutdown(void);
|
|
extern int sysdev_suspend(pm_message_t state);
|
|
extern int sysdev_resume(void);
|
|
|
|
static inline struct class_device *to_class_dev(struct kobject *obj)
|
|
{
|
|
return container_of(obj, struct class_device, kobj);
|
|
}
|
|
|
|
static inline
|
|
struct class_device_attribute *to_class_dev_attr(struct attribute *_attr)
|
|
{
|
|
return container_of(_attr, struct class_device_attribute, attr);
|
|
}
|
|
|
|
extern char *make_class_name(const char *name, struct kobject *kobj);
|
|
|
|
extern void devres_release_all(struct device *dev);
|