[PATCH 04/12] drm: provide a pci probe function for non modesetting devices
This way we do not need the legacy handcrafted probe mechanism anymore and can remove it. Signed-off-by: Sascha Hauer --- drivers/gpu/drm/drm_pci.c | 41 +- drivers/gpu/drm/i810/i810_drv.c | 16 + drivers/gpu/drm/mga/mga_drv.c | 16 + drivers/gpu/drm/r128/r128_drv.c | 16 + drivers/gpu/drm/savage/savage_drv.c | 16 + drivers/gpu/drm/sis/sis_drv.c | 16 + drivers/gpu/drm/tdfx/tdfx_drv.c | 16 + 7 files changed, 98 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index f2e8019..b53427e 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c @@ -363,8 +363,6 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, goto err_g4; } - list_add_tail(>driver_item, >device_list); - DRM_INFO("Initialized %s %d.%d.%d %s for %s on minor %d\n", driver->name, driver->major, driver->minor, driver->patchlevel, driver->date, pci_name(pdev), dev->primary->index); @@ -399,41 +397,12 @@ EXPORT_SYMBOL(drm_get_pci_dev); */ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) { - struct pci_dev *pdev = NULL; - const struct pci_device_id *pid; - int i; - DRM_DEBUG("\n"); INIT_LIST_HEAD(>device_list); driver->bus = _pci_bus; - if (driver->driver_features & DRIVER_MODESET) - return pci_register_driver(pdriver); - - /* If not using KMS, fall back to stealth mode manual scanning. */ - for (i = 0; pdriver->id_table[i].vendor != 0; i++) { - pid = >id_table[i]; - - /* Loop around setting up a DRM device for each PCI device -* matching our ID and device class. If we had the internal -* function that pci_get_subsys and pci_get_class used, we'd -* be able to just pass pid in instead of doing a two-stage -* thing. -*/ - pdev = NULL; - while ((pdev = - pci_get_subsys(pid->vendor, pid->device, pid->subvendor, - pid->subdevice, pdev)) != NULL) { - if ((pdev->class & pid->class_mask) != pid->class) - continue; - - /* stealth mode requires a manual probe */ - pci_dev_get(pdev); - drm_get_pci_dev(pdev, pid, driver); - } - } - return 0; + return pci_register_driver(pdriver); } #else @@ -450,15 +419,9 @@ EXPORT_SYMBOL(drm_pci_init); /*@}*/ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver) { - struct drm_device *dev, *tmp; DRM_DEBUG("\n"); - if (driver->driver_features & DRIVER_MODESET) { - pci_unregister_driver(pdriver); - } else { - list_for_each_entry_safe(dev, tmp, >device_list, driver_item) - drm_put_dev(dev); - } + pci_unregister_driver(pdriver); DRM_INFO("Module unloaded\n"); } EXPORT_SYMBOL(drm_pci_exit); diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index ec12f7d..94f0660 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c @@ -75,7 +75,23 @@ static struct drm_driver driver = { .patchlevel = DRIVER_PATCHLEVEL, }; +static int __devinit +i810_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + return drm_get_pci_dev(pdev, ent, ); +} + +static void +i810_pci_remove(struct pci_dev *pdev) +{ + struct drm_device *dev = pci_get_drvdata(pdev); + + drm_put_dev(dev); +} + static struct pci_driver i810_pci_driver = { + .probe = i810_pci_probe, + .remove = i810_pci_remove, .name = DRIVER_NAME, .id_table = pciidlist, }; diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c index f9a925d..45d848a 100644 --- a/drivers/gpu/drm/mga/mga_drv.c +++ b/drivers/gpu/drm/mga/mga_drv.c @@ -87,7 +87,23 @@ static struct drm_driver driver = { .patchlevel = DRIVER_PATCHLEVEL, }; +static int __devinit +mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + return drm_get_pci_dev(pdev, ent, ); +} + +static void +mga_pci_remove(struct pci_dev *pdev) +{ + struct drm_device *dev = pci_get_drvdata(pdev); + + drm_put_dev(dev); +} + static struct pci_driver mga_pci_driver = { + .probe = mga_pci_probe, + .remove = mga_pci_remove, .name = DRIVER_NAME, .id_table = pciidlist, }; diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c index 6a5f439..257f8eb 100644 --- a/drivers/gpu/drm/r128/r128_drv.c +++ b/drivers/gpu/drm/r128/r128_drv.c @@ -88,7
[PATCH 04/12] drm: provide a pci probe function for non modesetting devices
This way we do not need the legacy handcrafted probe mechanism anymore and can remove it. Signed-off-by: Sascha Hauer s.ha...@pengutronix.de --- drivers/gpu/drm/drm_pci.c | 41 +- drivers/gpu/drm/i810/i810_drv.c | 16 + drivers/gpu/drm/mga/mga_drv.c | 16 + drivers/gpu/drm/r128/r128_drv.c | 16 + drivers/gpu/drm/savage/savage_drv.c | 16 + drivers/gpu/drm/sis/sis_drv.c | 16 + drivers/gpu/drm/tdfx/tdfx_drv.c | 16 + 7 files changed, 98 insertions(+), 39 deletions(-) diff --git a/drivers/gpu/drm/drm_pci.c b/drivers/gpu/drm/drm_pci.c index f2e8019..b53427e 100644 --- a/drivers/gpu/drm/drm_pci.c +++ b/drivers/gpu/drm/drm_pci.c @@ -363,8 +363,6 @@ int drm_get_pci_dev(struct pci_dev *pdev, const struct pci_device_id *ent, goto err_g4; } - list_add_tail(dev-driver_item, driver-device_list); - DRM_INFO(Initialized %s %d.%d.%d %s for %s on minor %d\n, driver-name, driver-major, driver-minor, driver-patchlevel, driver-date, pci_name(pdev), dev-primary-index); @@ -399,41 +397,12 @@ EXPORT_SYMBOL(drm_get_pci_dev); */ int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver) { - struct pci_dev *pdev = NULL; - const struct pci_device_id *pid; - int i; - DRM_DEBUG(\n); INIT_LIST_HEAD(driver-device_list); driver-bus = drm_pci_bus; - if (driver-driver_features DRIVER_MODESET) - return pci_register_driver(pdriver); - - /* If not using KMS, fall back to stealth mode manual scanning. */ - for (i = 0; pdriver-id_table[i].vendor != 0; i++) { - pid = pdriver-id_table[i]; - - /* Loop around setting up a DRM device for each PCI device -* matching our ID and device class. If we had the internal -* function that pci_get_subsys and pci_get_class used, we'd -* be able to just pass pid in instead of doing a two-stage -* thing. -*/ - pdev = NULL; - while ((pdev = - pci_get_subsys(pid-vendor, pid-device, pid-subvendor, - pid-subdevice, pdev)) != NULL) { - if ((pdev-class pid-class_mask) != pid-class) - continue; - - /* stealth mode requires a manual probe */ - pci_dev_get(pdev); - drm_get_pci_dev(pdev, pid, driver); - } - } - return 0; + return pci_register_driver(pdriver); } #else @@ -450,15 +419,9 @@ EXPORT_SYMBOL(drm_pci_init); /*@}*/ void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver) { - struct drm_device *dev, *tmp; DRM_DEBUG(\n); - if (driver-driver_features DRIVER_MODESET) { - pci_unregister_driver(pdriver); - } else { - list_for_each_entry_safe(dev, tmp, driver-device_list, driver_item) - drm_put_dev(dev); - } + pci_unregister_driver(pdriver); DRM_INFO(Module unloaded\n); } EXPORT_SYMBOL(drm_pci_exit); diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index ec12f7d..94f0660 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c @@ -75,7 +75,23 @@ static struct drm_driver driver = { .patchlevel = DRIVER_PATCHLEVEL, }; +static int __devinit +i810_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + return drm_get_pci_dev(pdev, ent, driver); +} + +static void +i810_pci_remove(struct pci_dev *pdev) +{ + struct drm_device *dev = pci_get_drvdata(pdev); + + drm_put_dev(dev); +} + static struct pci_driver i810_pci_driver = { + .probe = i810_pci_probe, + .remove = i810_pci_remove, .name = DRIVER_NAME, .id_table = pciidlist, }; diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c index f9a925d..45d848a 100644 --- a/drivers/gpu/drm/mga/mga_drv.c +++ b/drivers/gpu/drm/mga/mga_drv.c @@ -87,7 +87,23 @@ static struct drm_driver driver = { .patchlevel = DRIVER_PATCHLEVEL, }; +static int __devinit +mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) +{ + return drm_get_pci_dev(pdev, ent, driver); +} + +static void +mga_pci_remove(struct pci_dev *pdev) +{ + struct drm_device *dev = pci_get_drvdata(pdev); + + drm_put_dev(dev); +} + static struct pci_driver mga_pci_driver = { + .probe = mga_pci_probe, + .remove = mga_pci_remove, .name = DRIVER_NAME, .id_table = pciidlist, }; diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c index 6a5f439..257f8eb 100644 --- a/drivers/gpu/drm/r128/r128_drv.c +++