mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
[PATCH] PCI: automatically set device_driver.owner
A nice feature of sysfs is that it can create the symlink from the driver to the module that is contained in it. It requires that the device_driver.owner is set, what is not the case for many PCI drivers. This patch allows pci_register_driver to set automatically the device_driver.owner for any PCI driver. Credits to Al Viro who suggested the method. Signed-off-by: Laurent Riffard <laurent.riffard@free.fr> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> -- drivers/ide/setup-pci.c | 12 +++++++----- drivers/pci/pci-driver.c | 9 +++++---- include/linux/ide.h | 3 ++- include/linux/pci.h | 10 ++++++++-- 4 files changed, 22 insertions(+), 12 deletions(-)
This commit is contained in:
parent
f8eb1005a5
commit
863b18f4b5
4 changed files with 22 additions and 12 deletions
|
@ -787,8 +787,9 @@ static int pre_init = 1; /* Before first ordered IDE scan */
|
||||||
static LIST_HEAD(ide_pci_drivers);
|
static LIST_HEAD(ide_pci_drivers);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ide_register_pci_driver - attach IDE driver
|
* __ide_register_pci_driver - attach IDE driver
|
||||||
* @driver: pci driver
|
* @driver: pci driver
|
||||||
|
* @module: owner module of the driver
|
||||||
*
|
*
|
||||||
* Registers a driver with the IDE layer. The IDE layer arranges that
|
* Registers a driver with the IDE layer. The IDE layer arranges that
|
||||||
* boot time setup is done in the expected device order and then
|
* boot time setup is done in the expected device order and then
|
||||||
|
@ -801,15 +802,16 @@ static LIST_HEAD(ide_pci_drivers);
|
||||||
* Returns are the same as for pci_register_driver
|
* Returns are the same as for pci_register_driver
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ide_pci_register_driver(struct pci_driver *driver)
|
int __ide_pci_register_driver(struct pci_driver *driver, struct module *module)
|
||||||
{
|
{
|
||||||
if(!pre_init)
|
if(!pre_init)
|
||||||
return pci_module_init(driver);
|
return __pci_register_driver(driver, module);
|
||||||
|
driver->driver.owner = module;
|
||||||
list_add_tail(&driver->node, &ide_pci_drivers);
|
list_add_tail(&driver->node, &ide_pci_drivers);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(ide_pci_register_driver);
|
EXPORT_SYMBOL_GPL(__ide_pci_register_driver);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ide_unregister_pci_driver - unregister an IDE driver
|
* ide_unregister_pci_driver - unregister an IDE driver
|
||||||
|
@ -897,6 +899,6 @@ void __init ide_scan_pcibus (int scan_direction)
|
||||||
{
|
{
|
||||||
list_del(l);
|
list_del(l);
|
||||||
d = list_entry(l, struct pci_driver, node);
|
d = list_entry(l, struct pci_driver, node);
|
||||||
pci_register_driver(d);
|
__pci_register_driver(d, d->driver.owner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -364,15 +364,16 @@ static struct kobj_type pci_driver_kobj_type = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pci_register_driver - register a new pci driver
|
* __pci_register_driver - register a new pci driver
|
||||||
* @drv: the driver structure to register
|
* @drv: the driver structure to register
|
||||||
|
* @owner: owner module of drv
|
||||||
*
|
*
|
||||||
* Adds the driver structure to the list of registered drivers.
|
* Adds the driver structure to the list of registered drivers.
|
||||||
* Returns a negative value on error, otherwise 0.
|
* Returns a negative value on error, otherwise 0.
|
||||||
* If no error occurred, the driver remains registered even if
|
* If no error occurred, the driver remains registered even if
|
||||||
* no device was claimed during registration.
|
* no device was claimed during registration.
|
||||||
*/
|
*/
|
||||||
int pci_register_driver(struct pci_driver *drv)
|
int __pci_register_driver(struct pci_driver *drv, struct module *owner)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
@ -389,7 +390,7 @@ int pci_register_driver(struct pci_driver *drv)
|
||||||
printk(KERN_WARNING "Warning: PCI driver %s has a struct "
|
printk(KERN_WARNING "Warning: PCI driver %s has a struct "
|
||||||
"device_driver shutdown method, please update!\n",
|
"device_driver shutdown method, please update!\n",
|
||||||
drv->name);
|
drv->name);
|
||||||
drv->driver.owner = drv->owner;
|
drv->driver.owner = owner;
|
||||||
drv->driver.kobj.ktype = &pci_driver_kobj_type;
|
drv->driver.kobj.ktype = &pci_driver_kobj_type;
|
||||||
|
|
||||||
spin_lock_init(&drv->dynids.lock);
|
spin_lock_init(&drv->dynids.lock);
|
||||||
|
@ -526,7 +527,7 @@ postcore_initcall(pci_driver_init);
|
||||||
|
|
||||||
EXPORT_SYMBOL(pci_match_id);
|
EXPORT_SYMBOL(pci_match_id);
|
||||||
EXPORT_SYMBOL(pci_match_device);
|
EXPORT_SYMBOL(pci_match_device);
|
||||||
EXPORT_SYMBOL(pci_register_driver);
|
EXPORT_SYMBOL(__pci_register_driver);
|
||||||
EXPORT_SYMBOL(pci_unregister_driver);
|
EXPORT_SYMBOL(pci_unregister_driver);
|
||||||
EXPORT_SYMBOL(pci_dev_driver);
|
EXPORT_SYMBOL(pci_dev_driver);
|
||||||
EXPORT_SYMBOL(pci_bus_type);
|
EXPORT_SYMBOL(pci_bus_type);
|
||||||
|
|
|
@ -1329,7 +1329,8 @@ void ide_init_disk(struct gendisk *, ide_drive_t *);
|
||||||
extern int ideprobe_init(void);
|
extern int ideprobe_init(void);
|
||||||
|
|
||||||
extern void ide_scan_pcibus(int scan_direction) __init;
|
extern void ide_scan_pcibus(int scan_direction) __init;
|
||||||
extern int ide_pci_register_driver(struct pci_driver *driver);
|
extern int __ide_pci_register_driver(struct pci_driver *driver, struct module *owner);
|
||||||
|
#define ide_pci_register_driver(d) __ide_pci_register_driver(d, THIS_MODULE)
|
||||||
extern void ide_pci_unregister_driver(struct pci_driver *driver);
|
extern void ide_pci_unregister_driver(struct pci_driver *driver);
|
||||||
void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
|
void ide_pci_setup_ports(struct pci_dev *, struct ide_pci_device_s *, int, ata_index_t *);
|
||||||
extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
|
extern void ide_setup_pci_noise (struct pci_dev *dev, struct ide_pci_device_s *d);
|
||||||
|
|
|
@ -433,8 +433,13 @@ int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
|
||||||
void *alignf_data);
|
void *alignf_data);
|
||||||
void pci_enable_bridges(struct pci_bus *bus);
|
void pci_enable_bridges(struct pci_bus *bus);
|
||||||
|
|
||||||
/* New-style probing supporting hot-pluggable devices */
|
/* Proper probing supporting hot-pluggable devices */
|
||||||
int pci_register_driver(struct pci_driver *);
|
int __pci_register_driver(struct pci_driver *, struct module *);
|
||||||
|
static inline int pci_register_driver(struct pci_driver *driver)
|
||||||
|
{
|
||||||
|
return __pci_register_driver(driver, THIS_MODULE);
|
||||||
|
}
|
||||||
|
|
||||||
void pci_unregister_driver(struct pci_driver *);
|
void pci_unregister_driver(struct pci_driver *);
|
||||||
void pci_remove_behind_bridge(struct pci_dev *);
|
void pci_remove_behind_bridge(struct pci_dev *);
|
||||||
struct pci_driver *pci_dev_driver(const struct pci_dev *);
|
struct pci_driver *pci_dev_driver(const struct pci_dev *);
|
||||||
|
@ -548,6 +553,7 @@ static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
|
||||||
static inline void pci_disable_device(struct pci_dev *dev) { }
|
static inline void pci_disable_device(struct pci_dev *dev) { }
|
||||||
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
|
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
|
||||||
static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
|
static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
|
||||||
|
static inline int __pci_register_driver(struct pci_driver *drv, struct module *owner) { return 0;}
|
||||||
static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
|
static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
|
||||||
static inline void pci_unregister_driver(struct pci_driver *drv) { }
|
static inline void pci_unregister_driver(struct pci_driver *drv) { }
|
||||||
static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
|
static inline int pci_find_capability (struct pci_dev *dev, int cap) {return 0; }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue