if (!minor) {
                return ERR_PTR(-ENODEV);
-       } else if (drm_device_is_unplugged(minor->dev)) {
+       } else if (drm_dev_is_unplugged(minor->dev)) {
                drm_dev_unref(minor->dev);
                return ERR_PTR(-ENODEV);
        }
 }
 EXPORT_SYMBOL(drm_put_dev);
 
-void drm_unplug_dev(struct drm_device *dev)
+static void drm_device_set_unplugged(struct drm_device *dev)
+{
+       smp_wmb();
+       atomic_set(&dev->unplugged, 1);
+}
+
+/**
+ * drm_dev_unplug - unplug a DRM device
+ * @dev: DRM device
+ *
+ * This unplugs a hotpluggable DRM device, which makes it inaccessible to
+ * userspace operations. Entry-points can use drm_dev_is_unplugged(). This
+ * essentially unregisters the device like drm_dev_unregister(), but can be
+ * called while there are still open users of @dev.
+ */
+void drm_dev_unplug(struct drm_device *dev)
 {
        /* for a USB device */
        if (drm_core_check_feature(dev, DRIVER_MODESET))
        }
        mutex_unlock(&drm_global_mutex);
 }
-EXPORT_SYMBOL(drm_unplug_dev);
+EXPORT_SYMBOL(drm_dev_unplug);
 
 /*
  * DRM internal mount
  * drm_dev_register() but does not deallocate the device. The caller must call
  * drm_dev_unref() to drop their final reference.
  *
+ * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
+ * which can be called while there are still open users of @dev.
+ *
  * This should be called first in the device teardown code to make sure
  * userspace can't access the device instance any more.
  */
 
 
        if (!--dev->open_count) {
                drm_lastclose(dev);
-               if (drm_device_is_unplugged(dev))
+               if (drm_dev_is_unplugged(dev))
                        drm_put_dev(dev);
        }
        mutex_unlock(&drm_global_mutex);
 
        struct drm_vma_offset_node *node;
        int ret;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        drm_vma_offset_lock_lookup(dev->vma_offset_manager);
 
        struct drm_device *dev = priv->minor->dev;
        struct drm_vma_offset_node *node;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        drm_vma_offset_lock_lookup(dev->vma_offset_manager);
 
        struct drm_device *dev = file_priv->minor->dev;
        int retcode;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        retcode = drm_ioctl_permit(flags, file_priv);
 
        dev = file_priv->minor->dev;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
 
        struct drm_device *dev = priv->minor->dev;
        int ret;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        mutex_lock(&dev->struct_mutex);
 
 static enum drm_connector_status
 tinydrm_connector_detect(struct drm_connector *connector, bool force)
 {
-       if (drm_device_is_unplugged(connector->dev))
+       if (drm_dev_is_unplugged(connector->dev))
                return connector_status_disconnected;
 
        return connector->status;
 
 static enum drm_connector_status
 udl_detect(struct drm_connector *connector, bool force)
 {
-       if (drm_device_is_unplugged(connector->dev))
+       if (drm_dev_is_unplugged(connector->dev))
                return connector_status_disconnected;
        return connector_status_connected;
 }
 
        drm_kms_helper_poll_disable(dev);
        udl_fbdev_unplug(dev);
        udl_drop_usb(dev);
-       drm_unplug_dev(dev);
+       drm_dev_unplug(dev);
 }
 
 /*
 
        struct udl_device *udl = dev->dev_private;
 
        /* If the USB device is gone, we don't accept new opens */
-       if (drm_device_is_unplugged(udl->ddev))
+       if (drm_dev_is_unplugged(udl->ddev))
                return -ENODEV;
 
        ufbdev->fb_count++;
 
        return ((dev->driver->driver_features & feature) ? 1 : 0);
 }
 
-static inline void drm_device_set_unplugged(struct drm_device *dev)
-{
-       smp_wmb();
-       atomic_set(&dev->unplugged, 1);
-}
-
-static inline int drm_device_is_unplugged(struct drm_device *dev)
-{
-       int ret = atomic_read(&dev->unplugged);
-       smp_rmb();
-       return ret;
-}
-
 /******************************************************************/
 /** \name Internal function definitions */
 /*@{*/
 
 #include <linux/list.h>
 #include <linux/irqreturn.h>
 
-struct drm_device;
+#include <drm/drm_device.h>
+
 struct drm_file;
 struct drm_gem_object;
 struct drm_master;
 void drm_dev_ref(struct drm_device *dev);
 void drm_dev_unref(struct drm_device *dev);
 void drm_put_dev(struct drm_device *dev);
-void drm_unplug_dev(struct drm_device *dev);
+void drm_dev_unplug(struct drm_device *dev);
+
+/**
+ * drm_dev_is_unplugged - is a DRM device unplugged
+ * @dev: DRM device
+ *
+ * This function can be called to check whether a hotpluggable is unplugged.
+ * Unplugging itself is singalled through drm_dev_unplug(). If a device is
+ * unplugged, these two functions guarantee that any store before calling
+ * drm_dev_unplug() is visible to callers of this function after it completes
+ */
+static inline int drm_dev_is_unplugged(struct drm_device *dev)
+{
+       int ret = atomic_read(&dev->unplugged);
+       smp_rmb();
+       return ret;
+}
+
 
 int drm_dev_set_unique(struct drm_device *dev, const char *name);