[PATCH 04/12] drm: provide a pci probe function for non modesetting devices

2012-02-02 Thread Sascha Hauer
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

2012-02-02 Thread Sascha Hauer
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
+++