Message ID | 1380705818-4065-6-git-send-email-dh.herrmann@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Oct 02, 2013 at 11:23:38AM +0200, David Herrmann wrote: > Analog to drm_dev_register(), we now provide drm_dev_unregister() which > does the reverse. drm_dev_put() is still in place and combines the calls > to drm_dev_unregister() and drm_dev_free() so buses don't have to change. > > *_get() and *_put() are used for reference-counting in the kernel. > However, drm_dev_put() definitely does not do any kind of ref-counting. > Hence, use the more appropriate *_register(), *_unregister(), *_alloc() > and *_free() names. > > Signed-off-by: David Herrmann <dh.herrmann@gmail.com> With the agp_init call moved back into pci code this series is Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> We still have a bit a midlayer smell here, and to correctly fix the init/cleanup order I think a bit more work is required. But this is a definit step up imo. -Daniel > --- > drivers/gpu/drm/drm_stub.c | 61 +++++++++++++++++++++++++++------------------- > include/drm/drmP.h | 1 + > 2 files changed, 37 insertions(+), 25 deletions(-) > > diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c > index 397ab90..a5290b7 100644 > --- a/drivers/gpu/drm/drm_stub.c > +++ b/drivers/gpu/drm/drm_stub.c > @@ -363,8 +363,6 @@ static void drm_unplug_minor(struct drm_minor *minor) > */ > void drm_put_dev(struct drm_device *dev) > { > - struct drm_map_list *r_list, *list_temp; > - > DRM_DEBUG("\n"); > > if (!dev) { > @@ -372,29 +370,7 @@ void drm_put_dev(struct drm_device *dev) > return; > } > > - drm_lastclose(dev); > - > - if (dev->driver->unload) > - dev->driver->unload(dev); > - > - if (dev->driver->bus->agp_destroy) > - dev->driver->bus->agp_destroy(dev); > - > - drm_vblank_cleanup(dev); > - > - list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) > - drm_rmmap(dev, r_list->map); > - > - if (drm_core_check_feature(dev, DRIVER_MODESET)) > - drm_put_minor(&dev->control); > - > - if (dev->render) > - drm_put_minor(&dev->render); > - > - drm_put_minor(&dev->primary); > - > - list_del(&dev->driver_item); > - > + drm_dev_unregister(dev); > drm_dev_free(dev); > } > EXPORT_SYMBOL(drm_put_dev); > @@ -595,3 +571,38 @@ out_unlock: > return ret; > } > EXPORT_SYMBOL(drm_dev_register); > + > +/** > + * drm_dev_unregister - Unregister DRM device > + * @dev: Device to unregister > + * > + * Unregister the DRM device from the system. This does the reverse of > + * drm_dev_register() but does not deallocate the device. The caller must call > + * drm_dev_free() to free all resources. > + */ > +void drm_dev_unregister(struct drm_device *dev) > +{ > + struct drm_map_list *r_list, *list_temp; > + > + drm_lastclose(dev); > + > + if (dev->driver->unload) > + dev->driver->unload(dev); > + > + if (dev->driver->bus->agp_destroy) > + dev->driver->bus->agp_destroy(dev); > + > + drm_vblank_cleanup(dev); > + > + list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) > + drm_rmmap(dev, r_list->map); > + > + if (dev->control) > + drm_put_minor(&dev->control); > + if (dev->render) > + drm_put_minor(&dev->render); > + drm_put_minor(&dev->primary); > + > + list_del(&dev->driver_item); > +} > +EXPORT_SYMBOL(drm_dev_unregister); > diff --git a/include/drm/drmP.h b/include/drm/drmP.h > index f4ec6b3..7516d22 100644 > --- a/include/drm/drmP.h > +++ b/include/drm/drmP.h > @@ -1649,6 +1649,7 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver, > struct device *parent); > void drm_dev_free(struct drm_device *dev); > int drm_dev_register(struct drm_device *dev); > +void drm_dev_unregister(struct drm_device *dev); > int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); > /*@}*/ > > -- > 1.8.4 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 397ab90..a5290b7 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c @@ -363,8 +363,6 @@ static void drm_unplug_minor(struct drm_minor *minor) */ void drm_put_dev(struct drm_device *dev) { - struct drm_map_list *r_list, *list_temp; - DRM_DEBUG("\n"); if (!dev) { @@ -372,29 +370,7 @@ void drm_put_dev(struct drm_device *dev) return; } - drm_lastclose(dev); - - if (dev->driver->unload) - dev->driver->unload(dev); - - if (dev->driver->bus->agp_destroy) - dev->driver->bus->agp_destroy(dev); - - drm_vblank_cleanup(dev); - - list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) - drm_rmmap(dev, r_list->map); - - if (drm_core_check_feature(dev, DRIVER_MODESET)) - drm_put_minor(&dev->control); - - if (dev->render) - drm_put_minor(&dev->render); - - drm_put_minor(&dev->primary); - - list_del(&dev->driver_item); - + drm_dev_unregister(dev); drm_dev_free(dev); } EXPORT_SYMBOL(drm_put_dev); @@ -595,3 +571,38 @@ out_unlock: return ret; } EXPORT_SYMBOL(drm_dev_register); + +/** + * drm_dev_unregister - Unregister DRM device + * @dev: Device to unregister + * + * Unregister the DRM device from the system. This does the reverse of + * drm_dev_register() but does not deallocate the device. The caller must call + * drm_dev_free() to free all resources. + */ +void drm_dev_unregister(struct drm_device *dev) +{ + struct drm_map_list *r_list, *list_temp; + + drm_lastclose(dev); + + if (dev->driver->unload) + dev->driver->unload(dev); + + if (dev->driver->bus->agp_destroy) + dev->driver->bus->agp_destroy(dev); + + drm_vblank_cleanup(dev); + + list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) + drm_rmmap(dev, r_list->map); + + if (dev->control) + drm_put_minor(&dev->control); + if (dev->render) + drm_put_minor(&dev->render); + drm_put_minor(&dev->primary); + + list_del(&dev->driver_item); +} +EXPORT_SYMBOL(drm_dev_unregister); diff --git a/include/drm/drmP.h b/include/drm/drmP.h index f4ec6b3..7516d22 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1649,6 +1649,7 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver, struct device *parent); void drm_dev_free(struct drm_device *dev); int drm_dev_register(struct drm_device *dev); +void drm_dev_unregister(struct drm_device *dev); int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type); /*@}*/
Analog to drm_dev_register(), we now provide drm_dev_unregister() which does the reverse. drm_dev_put() is still in place and combines the calls to drm_dev_unregister() and drm_dev_free() so buses don't have to change. *_get() and *_put() are used for reference-counting in the kernel. However, drm_dev_put() definitely does not do any kind of ref-counting. Hence, use the more appropriate *_register(), *_unregister(), *_alloc() and *_free() names. Signed-off-by: David Herrmann <dh.herrmann@gmail.com> --- drivers/gpu/drm/drm_stub.c | 61 +++++++++++++++++++++++++++------------------- include/drm/drmP.h | 1 + 2 files changed, 37 insertions(+), 25 deletions(-)