Commit 863b18f4 authored by Laurent riffard's avatar Laurent riffard Committed by Greg Kroah-Hartman
Browse files

[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: default avatarLaurent Riffard <laurent.riffard@free.fr>
Signed-off-by: default avatarGreg 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(-)
parent f8eb1005
...@@ -787,8 +787,9 @@ static int pre_init = 1; /* Before first ordered IDE scan */ ...@@ -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); ...@@ -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) ...@@ -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 = { ...@@ -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) ...@@ -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); ...@@ -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 *); ...@@ -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, ...@@ -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; } ...@@ -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; }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment