Merge airlied/drm-next into drm-misc-next
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 3 Oct 2017 09:09:16 +0000 (11:09 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 3 Oct 2017 09:09:16 +0000 (11:09 +0200)
Just catching up with upstream.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
41 files changed:
Documentation/gpu/todo.rst
drivers/dma-buf/dma-buf.c
drivers/gpu/drm/armada/armada_510.c
drivers/gpu/drm/armada/armada_drv.c
drivers/gpu/drm/armada/armada_fb.c
drivers/gpu/drm/armada/armada_fbdev.c
drivers/gpu/drm/armada/armada_gem.c
drivers/gpu/drm/drm_agpsupport.c
drivers/gpu/drm/drm_connector.c
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_fb_cma_helper.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_of.c
drivers/gpu/drm/drm_pci.c
drivers/gpu/drm/drm_prime.c
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
drivers/gpu/drm/meson/meson_drv.c
drivers/gpu/drm/mxsfb/mxsfb_drv.c
drivers/gpu/drm/rcar-du/rcar_du_kms.c
drivers/gpu/drm/rockchip/cdn-dp-core.c
drivers/gpu/drm/rockchip/rockchip_drm_gem.c
drivers/gpu/drm/rockchip/rockchip_lvds.c
drivers/gpu/drm/shmobile/shmob_drm_kms.c
drivers/gpu/drm/sun4i/sun4i_framebuffer.c
drivers/gpu/drm/tilcdc/tilcdc_crtc.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tinydrm/core/tinydrm-core.c
drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c
drivers/gpu/drm/tinydrm/mipi-dbi.c
drivers/gpu/drm/tinydrm/repaper.c
drivers/gpu/drm/tinydrm/st7586.c
drivers/gpu/drm/tve200/tve200_display.c
drivers/gpu/drm/tve200/tve200_drv.c
drivers/gpu/drm/vc4/vc4_dsi.c
drivers/gpu/drm/virtio/virtgpu_display.c
drivers/gpu/drm/virtio/virtgpu_gem.c
drivers/gpu/drm/virtio/virtgpu_ioctl.c
include/drm/drm_drv.h
include/drm/drm_fb_cma_helper.h
scripts/coccinelle/api/drm-get-put.cocci

index de9512a..92ee2f9 100644 (file)
@@ -184,12 +184,6 @@ Contact: Sean Paul, Maintainer of the driver you plan to convert
 Core refactorings
 =================
 
-Use new IDR deletion interface to clean up drm_gem_handle_delete()
-------------------------------------------------------------------
-
-See the "This is gross" comment -- apparently the IDR system now can return an
-error code instead of oopsing.
-
 Clean up the DRM header mess
 ----------------------------
 
@@ -357,7 +351,16 @@ those drivers as simple as possible, so lots of room for refactoring:
 - backlight helpers, probably best to put them into a new drm_backlight.c.
   This is because drivers/video is de-facto unmaintained. We could also
   move drivers/video/backlight to drivers/gpu/backlight and take it all
-  over within drm-misc, but that's more work.
+  over within drm-misc, but that's more work. Backlight helpers require a fair
+  bit of reworking and refactoring. A simple example is the enabling of a backlight.
+  Tinydrm has helpers for this. It would be good if other drivers can also use the
+  helper. However, there are various cases we need to consider i.e different
+  drivers seem to have different ways of enabling/disabling a backlight.
+  We also need to consider the backlight drivers (like gpio_backlight). The situation
+  is further complicated by the fact that the backlight is tied to fbdev
+  via fb_notifier_callback() which has complicated logic. For further details, refer
+  to the following discussion thread:
+  https://groups.google.com/forum/#!topic/outreachy-kernel/8rBe30lwtdA
 
 - spi helpers, probably best put into spi core/helper code. Thierry said
   the spi maintainer is fast&reactive, so shouldn't be a big issue.
index 4a038dc..bc1cb28 100644 (file)
@@ -625,7 +625,7 @@ EXPORT_SYMBOL_GPL(dma_buf_detach);
 struct sg_table *dma_buf_map_attachment(struct dma_buf_attachment *attach,
                                        enum dma_data_direction direction)
 {
-       struct sg_table *sg_table = ERR_PTR(-EINVAL);
+       struct sg_table *sg_table;
 
        might_sleep();
 
index ad3d2eb..41a784f 100644 (file)
@@ -9,7 +9,6 @@
  */
 #include <linux/clk.h>
 #include <linux/io.h>
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include "armada_crtc.h"
 #include "armada_drm.h"
index 2fbd9d3..2d45103 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/component.h>
 #include <linux/module.h>
 #include <linux/of_graph.h>
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_of.h>
 #include "armada_crtc.h"
index 92e6b08..b9e1637 100644 (file)
@@ -5,7 +5,6 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
-#include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
 #include "armada_drm.h"
index 29c7d04..10e3fd8 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 
-#include <drm/drmP.h>
 #include <drm/drm_fb_helper.h>
 #include "armada_crtc.h"
 #include "armada_drm.h"
index 7983538..7837e6a 100644 (file)
@@ -8,7 +8,6 @@
 #include <linux/dma-buf.h>
 #include <linux/dma-mapping.h>
 #include <linux/shmem_fs.h>
-#include <drm/drmP.h>
 #include "armada_drm.h"
 #include "armada_gem.h"
 #include <drm/armada_drm.h>
index c899534..737f028 100644 (file)
@@ -70,7 +70,6 @@ int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info)
 
        return 0;
 }
-
 EXPORT_SYMBOL(drm_agp_info);
 
 int drm_agp_info_ioctl(struct drm_device *dev, void *data,
@@ -95,18 +94,18 @@ int drm_agp_info_ioctl(struct drm_device *dev, void *data,
  * Verifies the AGP device hasn't been acquired before and calls
  * \c agp_backend_acquire.
  */
-int drm_agp_acquire(struct drm_device * dev)
+int drm_agp_acquire(struct drm_device *dev)
 {
        if (!dev->agp)
                return -ENODEV;
        if (dev->agp->acquired)
                return -EBUSY;
-       if (!(dev->agp->bridge = agp_backend_acquire(dev->pdev)))
+       dev->agp->bridge = agp_backend_acquire(dev->pdev);
+       if (!dev->agp->bridge)
                return -ENODEV;
        dev->agp->acquired = 1;
        return 0;
 }
-
 EXPORT_SYMBOL(drm_agp_acquire);
 
 /**
@@ -135,7 +134,7 @@ int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
  *
  * Verifies the AGP device has been acquired and calls \c agp_backend_release.
  */
-int drm_agp_release(struct drm_device * dev)
+int drm_agp_release(struct drm_device *dev)
 {
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
@@ -161,7 +160,7 @@ int drm_agp_release_ioctl(struct drm_device *dev, void *data,
  * Verifies the AGP device has been acquired but not enabled, and calls
  * \c agp_enable.
  */
-int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode)
+int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode)
 {
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
@@ -171,7 +170,6 @@ int drm_agp_enable(struct drm_device * dev, struct drm_agp_mode mode)
        dev->agp->enabled = 1;
        return 0;
 }
-
 EXPORT_SYMBOL(drm_agp_enable);
 
 int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
@@ -203,12 +201,14 @@ int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request)
 
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
-       if (!(entry = kzalloc(sizeof(*entry), GFP_KERNEL)))
+       entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+       if (!entry)
                return -ENOMEM;
 
        pages = (request->size + PAGE_SIZE - 1) / PAGE_SIZE;
        type = (u32) request->type;
-       if (!(memory = agp_allocate_memory(dev->agp->bridge, pages, type))) {
+       memory = agp_allocate_memory(dev->agp->bridge, pages, type);
+       if (!memory) {
                kfree(entry);
                return -ENOMEM;
        }
@@ -244,8 +244,8 @@ int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
  *
  * Walks through drm_agp_head::memory until finding a matching handle.
  */
-static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device * dev,
-                                          unsigned long handle)
+static struct drm_agp_mem *drm_agp_lookup_entry(struct drm_device *dev,
+                                               unsigned long handle)
 {
        struct drm_agp_mem *entry;
 
@@ -275,9 +275,8 @@ int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request)
 
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
-       if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
-               return -EINVAL;
-       if (!entry->bound)
+       entry = drm_agp_lookup_entry(dev, request->handle);
+       if (!entry || !entry->bound)
                return -EINVAL;
        ret = drm_unbind_agp(entry->memory);
        if (ret == 0)
@@ -316,12 +315,12 @@ int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request)
 
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
-       if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
-               return -EINVAL;
-       if (entry->bound)
+       entry = drm_agp_lookup_entry(dev, request->handle);
+       if (!entry || entry->bound)
                return -EINVAL;
        page = (request->offset + PAGE_SIZE - 1) / PAGE_SIZE;
-       if ((retcode = drm_bind_agp(entry->memory, page)))
+       retcode = drm_bind_agp(entry->memory, page);
+       if (retcode)
                return retcode;
        entry->bound = dev->agp->base + (page << PAGE_SHIFT);
        DRM_DEBUG("base = 0x%lx entry->bound = 0x%lx\n",
@@ -359,7 +358,8 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
 
        if (!dev->agp || !dev->agp->acquired)
                return -EINVAL;
-       if (!(entry = drm_agp_lookup_entry(dev, request->handle)))
+       entry = drm_agp_lookup_entry(dev, request->handle);
+       if (!entry)
                return -EINVAL;
        if (entry->bound)
                drm_unbind_agp(entry->memory);
@@ -373,7 +373,6 @@ int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request)
 EXPORT_SYMBOL(drm_agp_free);
 
 
-
 int drm_agp_free_ioctl(struct drm_device *dev, void *data,
                       struct drm_file *file_priv)
 {
@@ -398,11 +397,13 @@ struct drm_agp_head *drm_agp_init(struct drm_device *dev)
 {
        struct drm_agp_head *head = NULL;
 
-       if (!(head = kzalloc(sizeof(*head), GFP_KERNEL)))
+       head = kzalloc(sizeof(*head), GFP_KERNEL);
+       if (!head)
                return NULL;
        head->bridge = agp_find_bridge(dev->pdev);
        if (!head->bridge) {
-               if (!(head->bridge = agp_backend_acquire(dev->pdev))) {
+               head->bridge = agp_backend_acquire(dev->pdev);
+               if (!head->bridge) {
                        kfree(head);
                        return NULL;
                }
index bb2e60f..d8ca526 100644 (file)
@@ -719,6 +719,29 @@ DRM_ENUM_NAME_FN(drm_get_tv_subconnector_name,
  *     callback. For atomic drivers the remapping to the "ACTIVE" property is
  *     implemented in the DRM core.  This is the only standard connector
  *     property that userspace can change.
+ *
+ *     Note that this property cannot be set through the MODE_ATOMIC ioctl,
+ *     userspace must use "ACTIVE" on the CRTC instead.
+ *
+ *     WARNING:
+ *
+ *     For userspace also running on legacy drivers the "DPMS" semantics are a
+ *     lot more complicated. First, userspace cannot rely on the "DPMS" value
+ *     returned by the GETCONNECTOR actually reflecting reality, because many
+ *     drivers fail to update it. For atomic drivers this is taken care of in
+ *     drm_atomic_helper_update_legacy_modeset_state().
+ *
+ *     The second issue is that the DPMS state is only well-defined when the
+ *     connector is connected to a CRTC. In atomic the DRM core enforces that
+ *     "ACTIVE" is off in such a case, no such checks exists for "DPMS".
+ *
+ *     Finally, when enabling an output using the legacy SETCONFIG ioctl then
+ *     "DPMS" is forced to ON. But see above, that might not be reflected in
+ *     the software value on legacy drivers.
+ *
+ *     Summarizing: Only set "DPMS" when the connector is known to be enabled,
+ *     assume that a successful SETCONFIG call also sets "DPMS" to on, and
+ *     never read back the value of "DPMS" because it can be incorrect.
  * PATH:
  *     Connector path property to identify how this sink is physically
  *     connected. Used by DP MST. This should be set by calling
index be38ac7..c0292e5 100644 (file)
@@ -286,13 +286,13 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
        spin_lock_irqsave(&drm_minor_lock, flags);
        minor = idr_find(&drm_minors_idr, minor_id);
        if (minor)
-               drm_dev_ref(minor->dev);
+               drm_dev_get(minor->dev);
        spin_unlock_irqrestore(&drm_minor_lock, flags);
 
        if (!minor) {
                return ERR_PTR(-ENODEV);
        } else if (drm_dev_is_unplugged(minor->dev)) {
-               drm_dev_unref(minor->dev);
+               drm_dev_put(minor->dev);
                return ERR_PTR(-ENODEV);
        }
 
@@ -301,7 +301,7 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
 
 void drm_minor_release(struct drm_minor *minor)
 {
-       drm_dev_unref(minor->dev);
+       drm_dev_put(minor->dev);
 }
 
 /**
@@ -326,11 +326,11 @@ void drm_minor_release(struct drm_minor *minor)
  * When cleaning up a device instance everything needs to be done in reverse:
  * First unpublish the device instance with drm_dev_unregister(). Then clean up
  * any other resources allocated at device initialization and drop the driver's
- * reference to &drm_device using drm_dev_unref().
+ * reference to &drm_device using drm_dev_put().
  *
  * Note that the lifetime rules for &drm_device instance has still a lot of
  * historical baggage. Hence use the reference counting provided by
- * drm_dev_ref() and drm_dev_unref() only carefully.
+ * drm_dev_get() and drm_dev_put() only carefully.
  *
  * It is recommended that drivers embed &struct drm_device into their own device
  * structure, which is supported through drm_dev_init().
@@ -345,7 +345,7 @@ void drm_minor_release(struct drm_minor *minor)
  * Cleans up all DRM device, calling drm_lastclose().
  *
  * Note: Use of this function is deprecated. It will eventually go away
- * completely.  Please use drm_dev_unregister() and drm_dev_unref() explicitly
+ * completely.  Please use drm_dev_unregister() and drm_dev_put() explicitly
  * instead to make sure that the device isn't userspace accessible any more
  * while teardown is in progress, ensuring that userspace can't access an
  * inconsistent state.
@@ -360,7 +360,7 @@ void drm_put_dev(struct drm_device *dev)
        }
 
        drm_dev_unregister(dev);
-       drm_dev_unref(dev);
+       drm_dev_put(dev);
 }
 EXPORT_SYMBOL(drm_put_dev);
 
@@ -386,7 +386,7 @@ void drm_dev_unplug(struct drm_device *dev)
        mutex_lock(&drm_global_mutex);
        drm_device_set_unplugged(dev);
        if (dev->open_count == 0)
-               drm_dev_unref(dev);
+               drm_dev_put(dev);
        mutex_unlock(&drm_global_mutex);
 }
 EXPORT_SYMBOL(drm_dev_unplug);
@@ -475,8 +475,8 @@ static void drm_fs_inode_free(struct inode *inode)
  * initialization sequence to make sure userspace can't access an inconsistent
  * state.
  *
- * The initial ref-count of the object is 1. Use drm_dev_ref() and
- * drm_dev_unref() to take and drop further ref-counts.
+ * The initial ref-count of the object is 1. Use drm_dev_get() and
+ * drm_dev_put() to take and drop further ref-counts.
  *
  * Note that for purely virtual devices @parent can be NULL.
  *
@@ -626,8 +626,8 @@ EXPORT_SYMBOL(drm_dev_fini);
  * initialization sequence to make sure userspace can't access an inconsistent
  * state.
  *
- * The initial ref-count of the object is 1. Use drm_dev_ref() and
- * drm_dev_unref() to take and drop further ref-counts.
+ * The initial ref-count of the object is 1. Use drm_dev_get() and
+ * drm_dev_put() to take and drop further ref-counts.
  *
  * Note that for purely virtual devices @parent can be NULL.
  *
@@ -670,36 +670,49 @@ static void drm_dev_release(struct kref *ref)
 }
 
 /**
- * drm_dev_ref - Take reference of a DRM device
+ * drm_dev_get - Take reference of a DRM device
  * @dev: device to take reference of or NULL
  *
  * This increases the ref-count of @dev by one. You *must* already own a
- * reference when calling this. Use drm_dev_unref() to drop this reference
+ * reference when calling this. Use drm_dev_put() to drop this reference
  * again.
  *
  * This function never fails. However, this function does not provide *any*
  * guarantee whether the device is alive or running. It only provides a
  * reference to the object and the memory associated with it.
  */
-void drm_dev_ref(struct drm_device *dev)
+void drm_dev_get(struct drm_device *dev)
 {
        if (dev)
                kref_get(&dev->ref);
 }
-EXPORT_SYMBOL(drm_dev_ref);
+EXPORT_SYMBOL(drm_dev_get);
 
 /**
- * drm_dev_unref - Drop reference of a DRM device
+ * drm_dev_put - Drop reference of a DRM device
  * @dev: device to drop reference of or NULL
  *
  * This decreases the ref-count of @dev by one. The device is destroyed if the
  * ref-count drops to zero.
  */
-void drm_dev_unref(struct drm_device *dev)
+void drm_dev_put(struct drm_device *dev)
 {
        if (dev)
                kref_put(&dev->ref, drm_dev_release);
 }
+EXPORT_SYMBOL(drm_dev_put);
+
+/**
+ * drm_dev_unref - Drop reference of a DRM device
+ * @dev: device to drop reference of or NULL
+ *
+ * This is a compatibility alias for drm_dev_put() and should not be used by new
+ * code.
+ */
+void drm_dev_unref(struct drm_device *dev)
+{
+       drm_dev_put(dev);
+}
 EXPORT_SYMBOL(drm_dev_unref);
 
 static int create_compat_control_link(struct drm_device *dev)
@@ -839,7 +852,7 @@ EXPORT_SYMBOL(drm_dev_register);
  *
  * 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_unref() to drop their final reference.
+ * drm_dev_put() 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.
index f2ee883..0e3c141 100644 (file)
@@ -38,7 +38,7 @@ struct drm_fbdev_cma {
  * Provides helper functions for creating a cma (contiguous memory allocator)
  * backed framebuffer.
  *
- * drm_fb_cma_create() is used in the &drm_mode_config_funcs.fb_create
+ * drm_gem_fb_create() is used in the &drm_mode_config_funcs.fb_create
  * callback function to create a cma backed framebuffer.
  *
  * An fbdev framebuffer backed by cma is also available by calling
@@ -61,8 +61,8 @@ struct drm_fbdev_cma {
  *     }
  *
  *     static struct drm_framebuffer_funcs driver_fb_funcs = {
- *         .destroy       = drm_fb_cma_destroy,
- *         .create_handle = drm_fb_cma_create_handle,
+ *         .destroy       = drm_gem_fb_destroy,
+ *         .create_handle = drm_gem_fb_create_handle,
  *         .dirty         = driver_fb_dirty,
  *     };
  *
@@ -80,57 +80,6 @@ static inline struct drm_fbdev_cma *to_fbdev_cma(struct drm_fb_helper *helper)
        return container_of(helper, struct drm_fbdev_cma, fb_helper);
 }
 
-void drm_fb_cma_destroy(struct drm_framebuffer *fb)
-{
-       drm_gem_fb_destroy(fb);
-}
-EXPORT_SYMBOL(drm_fb_cma_destroy);
-
-int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
-       struct drm_file *file_priv, unsigned int *handle)
-{
-       return drm_gem_fb_create_handle(fb, file_priv, handle);
-}
-EXPORT_SYMBOL(drm_fb_cma_create_handle);
-
-/**
- * drm_fb_cma_create_with_funcs() - helper function for the
- *                                  &drm_mode_config_funcs.fb_create
- *                                  callback
- * @dev: DRM device
- * @file_priv: drm file for the ioctl call
- * @mode_cmd: metadata from the userspace fb creation request
- * @funcs: vtable to be used for the new framebuffer object
- *
- * This can be used to set &drm_framebuffer_funcs for drivers that need the
- * &drm_framebuffer_funcs.dirty callback. Use drm_fb_cma_create() if you don't
- * need to change &drm_framebuffer_funcs.
- */
-struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
-       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
-       const struct drm_framebuffer_funcs *funcs)
-{
-       return drm_gem_fb_create_with_funcs(dev, file_priv, mode_cmd, funcs);
-}
-EXPORT_SYMBOL_GPL(drm_fb_cma_create_with_funcs);
-
-/**
- * drm_fb_cma_create() - &drm_mode_config_funcs.fb_create callback function
- * @dev: DRM device
- * @file_priv: drm file for the ioctl call
- * @mode_cmd: metadata from the userspace fb creation request
- *
- * If your hardware has special alignment or pitch requirements these should be
- * checked before calling this function. Use drm_fb_cma_create_with_funcs() if
- * you need to set &drm_framebuffer_funcs.dirty.
- */
-struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
-       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
-{
-       return drm_gem_fb_create(dev, file_priv, mode_cmd);
-}
-EXPORT_SYMBOL_GPL(drm_fb_cma_create);
-
 /**
  * drm_fb_cma_get_gem_obj() - Get CMA GEM object for framebuffer
  * @fb: The framebuffer
@@ -181,26 +130,6 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb,
 }
 EXPORT_SYMBOL_GPL(drm_fb_cma_get_gem_addr);
 
-/**
- * drm_fb_cma_prepare_fb() - Prepare CMA framebuffer
- * @plane: Which plane
- * @state: Plane state attach fence to
- *
- * This should be set as the &struct drm_plane_helper_funcs.prepare_fb hook.
- *
- * This function checks if the plane FB has an dma-buf attached, extracts
- * the exclusive fence and attaches it to plane state for the atomic helper
- * to wait on.
- *
- * There is no need for cleanup_fb for CMA based framebuffer drivers.
- */
-int drm_fb_cma_prepare_fb(struct drm_plane *plane,
-                         struct drm_plane_state *state)
-{
-       return drm_gem_fb_prepare_fb(plane, state);
-}
-EXPORT_SYMBOL_GPL(drm_fb_cma_prepare_fb);
-
 #ifdef CONFIG_DEBUG_FS
 static void drm_fb_cma_describe(struct drm_framebuffer *fb, struct seq_file *m)
 {
index 7199bba..811f6d2 100644 (file)
@@ -282,15 +282,6 @@ drm_gem_handle_delete(struct drm_file *filp, u32 handle)
 {
        struct drm_gem_object *obj;
 
-       /* This is gross. The idr system doesn't let us try a delete and
-        * return an error code.  It just spews if you fail at deleting.
-        * So, we have to grab a lock around finding the object and then
-        * doing the delete on it and dropping the refcount, or the user
-        * could race us to double-decrement the refcount and cause a
-        * use-after-free later.  Given the frequency of our handle lookups,
-        * we may want to use ida for number allocation and a hash table
-        * for the pointers, anyway.
-        */
        spin_lock(&filp->table_lock);
 
        /* Check if we currently have a reference on the object */
index 8dafbdf..4c191c0 100644 (file)
@@ -233,6 +233,8 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
 
        if (!panel && !bridge)
                return -EINVAL;
+       if (panel)
+               *panel = NULL;
 
        remote = of_graph_get_remote_node(np, port, endpoint);
        if (!remote)
index 1235c98..4db9c51 100644 (file)
@@ -274,7 +274,7 @@ err_agp:
        drm_pci_agp_destroy(dev);
        pci_disable_device(pdev);
 err_free:
-       drm_dev_unref(dev);
+       drm_dev_put(dev);
        return ret;
 }
 EXPORT_SYMBOL(drm_get_pci_dev);
index 22408ba..8de93a2 100644 (file)
@@ -318,7 +318,7 @@ struct dma_buf *drm_gem_dmabuf_export(struct drm_device *dev,
        if (IS_ERR(dma_buf))
                return dma_buf;
 
-       drm_dev_ref(dev);
+       drm_dev_get(dev);
        drm_gem_object_get(exp_info->priv);
 
        return dma_buf;
@@ -342,7 +342,7 @@ void drm_gem_dmabuf_release(struct dma_buf *dma_buf)
        /* drop the reference on the export fd holds */
        drm_gem_object_put_unlocked(obj);
 
-       drm_dev_unref(dev);
+       drm_dev_put(dev);
 }
 EXPORT_SYMBOL(drm_gem_dmabuf_release);
 
index d9d6cc1..ddc68e4 100644 (file)
@@ -13,6 +13,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include "fsl_dcu_drm_crtc.h"
 #include "fsl_dcu_drm_drv.h"
@@ -20,7 +21,7 @@
 static const struct drm_mode_config_funcs fsl_dcu_drm_mode_config_funcs = {
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = drm_atomic_helper_commit,
-       .fb_create = drm_fb_cma_create,
+       .fb_create = drm_gem_fb_create,
 };
 
 int fsl_dcu_drm_modeset_init(struct fsl_dcu_drm_device *fsl_dev)
index e27352c..c19ab4f 100644 (file)
@@ -22,6 +22,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_gem_cma_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_of.h>
@@ -56,7 +57,7 @@ static void kirin_fbdev_output_poll_changed(struct drm_device *dev)
 }
 
 static const struct drm_mode_config_funcs kirin_drm_mode_config_funcs = {
-       .fb_create = drm_fb_cma_create,
+       .fb_create = drm_gem_fb_create,
        .output_poll_changed = kirin_fbdev_output_poll_changed,
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = drm_atomic_helper_commit,
index 7742c7d..3b804fd 100644 (file)
@@ -34,6 +34,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_rect.h>
 #include <drm/drm_fb_helper.h>
@@ -78,7 +79,7 @@ static const struct drm_mode_config_funcs meson_mode_config_funcs = {
        .output_poll_changed = meson_fb_output_poll_changed,
        .atomic_check        = drm_atomic_helper_check,
        .atomic_commit       = drm_atomic_helper_commit,
-       .fb_create           = drm_fb_cma_create,
+       .fb_create           = drm_gem_fb_create,
 };
 
 static irqreturn_t meson_irq(int irq, void *arg)
index 7fbad9c..1207ffe 100644 (file)
@@ -35,6 +35,7 @@
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_simple_kms_helper.h>
@@ -92,7 +93,7 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb)
 }
 
 static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = {
-       .fb_create              = drm_fb_cma_create,
+       .fb_create              = drm_gem_fb_create,
        .atomic_check           = drm_atomic_helper_check,
        .atomic_commit          = drm_atomic_helper_commit,
 };
@@ -127,7 +128,7 @@ static void mxsfb_pipe_update(struct drm_simple_display_pipe *pipe,
 static int mxsfb_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
                                 struct drm_plane_state *plane_state)
 {
-       return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
+       return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
 }
 
 static struct drm_simple_display_pipe_funcs mxsfb_funcs = {
index 7278b97..566d1a9 100644 (file)
@@ -18,6 +18,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include <linux/of_graph.h>
 #include <linux/wait.h>
@@ -213,7 +214,7 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
                }
        }
 
-       return drm_fb_cma_create(dev, file_priv, mode_cmd);
+       return drm_gem_fb_create(dev, file_priv, mode_cmd);
 }
 
 static void rcar_du_output_poll_changed(struct drm_device *dev)
index a57da05..275844d 100644 (file)
@@ -287,14 +287,6 @@ static int cdn_dp_connector_get_modes(struct drm_connector *connector)
        return ret;
 }
 
-static struct drm_encoder *
-cdn_dp_connector_best_encoder(struct drm_connector *connector)
-{
-       struct cdn_dp_device *dp = connector_to_dp(connector);
-
-       return &dp->encoder;
-}
-
 static int cdn_dp_connector_mode_valid(struct drm_connector *connector,
                                       struct drm_display_mode *mode)
 {
@@ -346,7 +338,6 @@ static int cdn_dp_connector_mode_valid(struct drm_connector *connector,
 
 static struct drm_connector_helper_funcs cdn_dp_connector_helper_funcs = {
        .get_modes = cdn_dp_connector_get_modes,
-       .best_encoder = cdn_dp_connector_best_encoder,
        .mode_valid = cdn_dp_connector_mode_valid,
 };
 
index 1869c8b..1d96555 100644 (file)
@@ -220,7 +220,7 @@ static int rockchip_drm_gem_object_mmap_iommu(struct drm_gem_object *obj,
 {
        struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);
        unsigned int i, count = obj->size >> PAGE_SHIFT;
-       unsigned long user_count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
+       unsigned long user_count = vma_pages(vma);
        unsigned long uaddr = vma->vm_start;
        unsigned long offset = vma->vm_pgoff;
        unsigned long end = user_count + offset;
index c5fbe53..84911bd 100644 (file)
@@ -346,7 +346,7 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
        struct drm_connector *connector;
        struct device_node *remote = NULL;
        struct device_node  *port, *endpoint;
-       int ret;
+       int ret = 0, child_count = 0;
        const char *name;
        u32 endpoint_id;
 
@@ -358,15 +358,20 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
                return -EINVAL;
        }
        for_each_child_of_node(port, endpoint) {
+               child_count++;
                of_property_read_u32(endpoint, "reg", &endpoint_id);
                ret = drm_of_find_panel_or_bridge(dev->of_node, 1, endpoint_id,
                                                  &lvds->panel, &lvds->bridge);
                if (!ret)
                        break;
        }
-       if (ret) {
+       if (!child_count) {
+               DRM_DEV_ERROR(dev, "lvds port does not have any children\n");
+               ret = -EINVAL;
+               goto err_put_port;
+       } else if (ret) {
                DRM_DEV_ERROR(dev, "failed to find panel and bridge node\n");
-               ret  = -EPROBE_DEFER;
+               ret = -EPROBE_DEFER;
                goto err_put_port;
        }
        if (lvds->panel)
index 388a0fc..d36919b 100644 (file)
@@ -16,6 +16,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 
 #include <video/sh_mobile_meram.h>
 
@@ -131,7 +132,7 @@ shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
                }
        }
 
-       return drm_fb_cma_create(dev, file_priv, mode_cmd);
+       return drm_gem_fb_create(dev, file_priv, mode_cmd);
 }
 
 static const struct drm_mode_config_funcs shmob_drm_mode_config_funcs = {
index 9872e0f..2992f0a 100644 (file)
@@ -12,6 +12,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_fb_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drmP.h>
 
 #include "sun4i_drv.h"
@@ -28,7 +29,7 @@ static const struct drm_mode_config_funcs sun4i_de_mode_config_funcs = {
        .output_poll_changed    = sun4i_de_output_poll_changed,
        .atomic_check           = drm_atomic_helper_check,
        .atomic_commit          = drm_atomic_helper_commit,
-       .fb_create              = drm_fb_cma_create,
+       .fb_create              = drm_gem_fb_create,
 };
 
 struct drm_fbdev_cma *sun4i_framebuffer_init(struct drm_device *drm)
index 406fe45..d2589f3 100644 (file)
@@ -75,7 +75,7 @@ static void unref_worker(struct drm_flip_work *work, void *val)
        struct drm_device *dev = tilcdc_crtc->base.dev;
 
        mutex_lock(&dev->mode_config.mutex);
-       drm_framebuffer_unreference(val);
+       drm_framebuffer_put(val);
        mutex_unlock(&dev->mode_config.mutex);
 }
 
@@ -456,7 +456,7 @@ static void tilcdc_crtc_set_mode(struct drm_crtc *crtc)
 
        set_scanout(crtc, fb);
 
-       drm_framebuffer_reference(fb);
+       drm_framebuffer_get(fb);
 
        crtc->hwmode = crtc->state->adjusted_mode;
 }
@@ -633,7 +633,7 @@ int tilcdc_crtc_update_fb(struct drm_crtc *crtc,
                return -EBUSY;
        }
 
-       drm_framebuffer_reference(fb);
+       drm_framebuffer_get(fb);
 
        crtc->primary->fb = fb;
        tilcdc_crtc->event = event;
index 146ac9a..72ce063 100644 (file)
@@ -226,7 +226,7 @@ static void tilcdc_fini(struct drm_device *dev)
 
        pm_runtime_disable(dev->dev);
 
-       drm_dev_unref(dev);
+       drm_dev_put(dev);
 }
 
 static int tilcdc_init(struct drm_driver *ddrv, struct device *dev)
index 551709e..1a8a57c 100644 (file)
@@ -10,6 +10,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/tinydrm/tinydrm.h>
 #include <linux/device.h>
 #include <linux/dma-buf.h>
@@ -128,7 +129,7 @@ tinydrm_fb_create(struct drm_device *drm, struct drm_file *file_priv,
 {
        struct tinydrm_device *tdev = drm->dev_private;
 
-       return drm_fb_cma_create_with_funcs(drm, file_priv, mode_cmd,
+       return drm_gem_fb_create_with_funcs(drm, file_priv, mode_cmd,
                                            tdev->fb_funcs);
 }
 
index 177e9d8..fc447c9 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_modes.h>
 #include <drm/tinydrm/tinydrm.h>
 
@@ -144,7 +145,7 @@ EXPORT_SYMBOL(tinydrm_display_pipe_update);
  * @pipe: Simple display pipe
  * @plane_state: Plane state
  *
- * This function uses drm_fb_cma_prepare_fb() to check if the plane FB has an
+ * This function uses drm_gem_fb_prepare_fb() to check if the plane FB has an
  * dma-buf attached, extracts the exclusive fence and attaches it to plane
  * state for the atomic helper to wait on. Drivers can use this as their
  * &drm_simple_display_pipe_funcs->prepare_fb callback.
@@ -152,7 +153,7 @@ EXPORT_SYMBOL(tinydrm_display_pipe_update);
 int tinydrm_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
                                    struct drm_plane_state *plane_state)
 {
-       return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
+       return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
 }
 EXPORT_SYMBOL(tinydrm_display_pipe_prepare_fb);
 
index f0dedc2..d43e992 100644 (file)
@@ -9,6 +9,7 @@
  * (at your option) any later version.
  */
 
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/tinydrm/mipi-dbi.h>
 #include <drm/tinydrm/tinydrm-helpers.h>
 #include <linux/debugfs.h>
@@ -253,8 +254,8 @@ out_unlock:
 }
 
 static const struct drm_framebuffer_funcs mipi_dbi_fb_funcs = {
-       .destroy        = drm_fb_cma_destroy,
-       .create_handle  = drm_fb_cma_create_handle,
+       .destroy        = drm_gem_fb_destroy,
+       .create_handle  = drm_gem_fb_create_handle,
        .dirty          = mipi_dbi_fb_dirty,
 };
 
index 5fbe147..340198f 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/spi/spi.h>
 #include <linux/thermal.h>
 
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/tinydrm/tinydrm.h>
 #include <drm/tinydrm/tinydrm-helpers.h>
 
@@ -636,8 +637,8 @@ out_unlock:
 }
 
 static const struct drm_framebuffer_funcs repaper_fb_funcs = {
-       .destroy        = drm_fb_cma_destroy,
-       .create_handle  = drm_fb_cma_create_handle,
+       .destroy        = drm_gem_fb_destroy,
+       .create_handle  = drm_gem_fb_create_handle,
        .dirty          = repaper_fb_dirty,
 };
 
index 07b4d31..da9c0d8 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/spi/spi.h>
 #include <video/mipi_display.h>
 
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/tinydrm/mipi-dbi.h>
 #include <drm/tinydrm/tinydrm-helpers.h>
 
@@ -167,8 +168,8 @@ out_unlock:
 }
 
 static const struct drm_framebuffer_funcs st7586_fb_funcs = {
-       .destroy        = drm_fb_cma_destroy,
-       .create_handle  = drm_fb_cma_create_handle,
+       .destroy        = drm_gem_fb_destroy,
+       .create_handle  = drm_gem_fb_create_handle,
        .dirty          = st7586_fb_dirty,
 };
 
index 18457de..2c668bd 100644 (file)
@@ -21,6 +21,7 @@
 #include <drm/drmP.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 
 #include "tve200_drm.h"
@@ -221,7 +222,7 @@ static void tve200_display_enable(struct drm_simple_display_pipe *pipe,
        drm_crtc_vblank_on(crtc);
 }
 
-void tve200_display_disable(struct drm_simple_display_pipe *pipe)
+static void tve200_display_disable(struct drm_simple_display_pipe *pipe)
 {
        struct drm_crtc *crtc = &pipe->crtc;
        struct drm_device *drm = crtc->dev;
@@ -290,10 +291,10 @@ void tve200_disable_vblank(struct drm_device *drm, unsigned int crtc)
 static int tve200_display_prepare_fb(struct drm_simple_display_pipe *pipe,
                                    struct drm_plane_state *plane_state)
 {
-       return drm_fb_cma_prepare_fb(&pipe->plane, plane_state);
+       return drm_gem_fb_prepare_fb(&pipe->plane, plane_state);
 }
 
-const struct drm_simple_display_pipe_funcs tve200_display_funcs = {
+static const struct drm_simple_display_pipe_funcs tve200_display_funcs = {
        .check = tve200_display_check,
        .enable = tve200_display_enable,
        .disable = tve200_display_disable,
index eae38b6..bd6c945 100644 (file)
@@ -45,6 +45,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_gem_cma_helper.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_of.h>
@@ -55,7 +56,7 @@
 #define DRIVER_DESC      "DRM module for Faraday TVE200"
 
 static const struct drm_mode_config_funcs mode_config_funcs = {
-       .fb_create = drm_fb_cma_create,
+       .fb_create = drm_gem_fb_create,
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = drm_atomic_helper_commit,
 };
@@ -225,7 +226,7 @@ static int tve200_probe(struct platform_device *pdev)
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        priv->regs = devm_ioremap_resource(dev, res);
-       if (!priv->regs) {
+       if (IS_ERR(priv->regs)) {
                dev_err(dev, "%s failed mmio\n", __func__);
                ret = -EINVAL;
                goto clk_disable;
index d1e0dc9..925c726 100644 (file)
@@ -33,6 +33,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_mipi_dsi.h>
+#include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 #include <linux/clk.h>
 #include <linux/clk-provider.h>
@@ -504,7 +505,6 @@ struct vc4_dsi {
        struct mipi_dsi_host dsi_host;
        struct drm_encoder *encoder;
        struct drm_bridge *bridge;
-       bool is_panel_bridge;
 
        void __iomem *regs;
 
@@ -866,7 +866,8 @@ static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder *encoder,
        adjusted_mode->clock = pixel_clock_hz / 1000 + 1;
 
        /* Given the new pixel clock, adjust HFP to keep vrefresh the same. */
-       adjusted_mode->htotal = pixel_clock_hz / (mode->vrefresh * mode->vtotal);
+       adjusted_mode->htotal = adjusted_mode->clock * mode->htotal /
+                               mode->clock;
        adjusted_mode->hsync_end += adjusted_mode->htotal - mode->htotal;
        adjusted_mode->hsync_start += adjusted_mode->htotal - mode->htotal;
 
@@ -1288,7 +1289,6 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
                               struct mipi_dsi_device *device)
 {
        struct vc4_dsi *dsi = host_to_dsi(host);
-       int ret = 0;
 
        dsi->lanes = device->lanes;
        dsi->channel = device->channel;
@@ -1323,34 +1323,12 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
                return 0;
        }
 
-       dsi->bridge = of_drm_find_bridge(device->dev.of_node);
-       if (!dsi->bridge) {
-               struct drm_panel *panel =
-                       of_drm_find_panel(device->dev.of_node);
-
-               dsi->bridge = drm_panel_bridge_add(panel,
-                                                  DRM_MODE_CONNECTOR_DSI);
-               if (IS_ERR(dsi->bridge)) {
-                       ret = PTR_ERR(dsi->bridge);
-                       dsi->bridge = NULL;
-                       return ret;
-               }
-               dsi->is_panel_bridge = true;
-       }
-
-       return drm_bridge_attach(dsi->encoder, dsi->bridge, NULL);
+       return 0;
 }
 
 static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
                               struct mipi_dsi_device *device)
 {
-       struct vc4_dsi *dsi = host_to_dsi(host);
-
-       if (dsi->is_panel_bridge) {
-               drm_panel_bridge_remove(dsi->bridge);
-               dsi->bridge = NULL;
-       }
-
        return 0;
 }
 
@@ -1492,16 +1470,13 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
        struct platform_device *pdev = to_platform_device(dev);
        struct drm_device *drm = dev_get_drvdata(master);
        struct vc4_dev *vc4 = to_vc4_dev(drm);
-       struct vc4_dsi *dsi;
+       struct vc4_dsi *dsi = dev_get_drvdata(dev);
        struct vc4_dsi_encoder *vc4_dsi_encoder;
+       struct drm_panel *panel;
        const struct of_device_id *match;
        dma_cap_mask_t dma_mask;
        int ret;
 
-       dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
-       if (!dsi)
-               return -ENOMEM;
-
        match = of_match_device(vc4_dsi_dt_match, dev);
        if (!match)
                return -ENODEV;
@@ -1516,7 +1491,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
        vc4_dsi_encoder->dsi = dsi;
        dsi->encoder = &vc4_dsi_encoder->base.base;
 
-       dsi->pdev = pdev;
        dsi->regs = vc4_ioremap_regs(pdev, 0);
        if (IS_ERR(dsi->regs))
                return PTR_ERR(dsi->regs);
@@ -1597,6 +1571,18 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
                return ret;
        }
 
+       ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0,
+                                         &panel, &dsi->bridge);
+       if (ret)
+               return ret;
+
+       if (panel) {
+               dsi->bridge = devm_drm_panel_bridge_add(dev, panel,
+                                                       DRM_MODE_CONNECTOR_DSI);
+               if (IS_ERR(dsi->bridge))
+                       return PTR_ERR(dsi->bridge);
+       }
+
        /* The esc clock rate is supposed to always be 100Mhz. */
        ret = clk_set_rate(dsi->escape_clock, 100 * 1000000);
        if (ret) {
@@ -1615,12 +1601,11 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data)
                         DRM_MODE_ENCODER_DSI, NULL);
        drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs);
 
-       dsi->dsi_host.ops = &vc4_dsi_host_ops;
-       dsi->dsi_host.dev = dev;
-
-       mipi_dsi_host_register(&dsi->dsi_host);
-
-       dev_set_drvdata(dev, dsi);
+       ret = drm_bridge_attach(dsi->encoder, dsi->bridge, NULL);
+       if (ret) {
+               dev_err(dev, "bridge attach failed: %d\n", ret);
+               return ret;
+       }
 
        pm_runtime_enable(dev);
 
@@ -1638,8 +1623,6 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master,
 
        vc4_dsi_encoder_destroy(dsi->encoder);
 
-       mipi_dsi_host_unregister(&dsi->dsi_host);
-
        if (dsi->port == 1)
                vc4->dsi1 = NULL;
 }
@@ -1651,12 +1634,47 @@ static const struct component_ops vc4_dsi_ops = {
 
 static int vc4_dsi_dev_probe(struct platform_device *pdev)
 {
-       return component_add(&pdev->dev, &vc4_dsi_ops);
+       struct device *dev = &pdev->dev;
+       struct vc4_dsi *dsi;
+       int ret;
+
+       dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
+       if (!dsi)
+               return -ENOMEM;
+       dev_set_drvdata(dev, dsi);
+
+       dsi->pdev = pdev;
+
+       /* Note, the initialization sequence for DSI and panels is
+        * tricky.  The component bind above won't get past its
+        * -EPROBE_DEFER until the panel/bridge probes.  The
+        * panel/bridge will return -EPROBE_DEFER until it has a
+        * mipi_dsi_host to register its device to.  So, we register
+        * the host during pdev probe time, so vc4 as a whole can then
+        * -EPROBE_DEFER its component bind process until the panel
+        * successfully attaches.
+        */
+       dsi->dsi_host.ops = &vc4_dsi_host_ops;
+       dsi->dsi_host.dev = dev;
+       mipi_dsi_host_register(&dsi->dsi_host);
+
+       ret = component_add(&pdev->dev, &vc4_dsi_ops);
+       if (ret) {
+               mipi_dsi_host_unregister(&dsi->dsi_host);
+               return ret;
+       }
+
+       return 0;
 }
 
 static int vc4_dsi_dev_remove(struct platform_device *pdev)
 {
+       struct device *dev = &pdev->dev;
+       struct vc4_dsi *dsi = dev_get_drvdata(dev);
+
        component_del(&pdev->dev, &vc4_dsi_ops);
+       mipi_dsi_host_unregister(&dsi->dsi_host);
+
        return 0;
 }
 
index b6d5205..41b0930 100644 (file)
@@ -53,7 +53,7 @@ static void virtio_gpu_user_framebuffer_destroy(struct drm_framebuffer *fb)
        struct virtio_gpu_framebuffer *virtio_gpu_fb
                = to_virtio_gpu_framebuffer(fb);
 
-       drm_gem_object_unreference_unlocked(virtio_gpu_fb->obj);
+       drm_gem_object_put_unlocked(virtio_gpu_fb->obj);
        drm_framebuffer_cleanup(fb);
        kfree(virtio_gpu_fb);
 }
@@ -327,7 +327,7 @@ virtio_gpu_user_framebuffer_create(struct drm_device *dev,
        ret = virtio_gpu_framebuffer_init(dev, virtio_gpu_fb, mode_cmd, obj);
        if (ret) {
                kfree(virtio_gpu_fb);
-               drm_gem_object_unreference_unlocked(obj);
+               drm_gem_object_put_unlocked(obj);
                return NULL;
        }
 
index 72ad7b1..92fb277 100644 (file)
@@ -72,7 +72,7 @@ int virtio_gpu_gem_create(struct drm_file *file,
        *obj_p = &obj->gem_base;
 
        /* drop reference from allocate - handle holds it now */
-       drm_gem_object_unreference_unlocked(&obj->gem_base);
+       drm_gem_object_put_unlocked(&obj->gem_base);
 
        *handle_p = handle;
        return 0;
@@ -130,7 +130,7 @@ int virtio_gpu_mode_dumb_mmap(struct drm_file *file_priv,
                return -ENOENT;
        obj = gem_to_virtio_gpu_obj(gobj);
        *offset_p = virtio_gpu_object_mmap_offset(obj);
-       drm_gem_object_unreference_unlocked(gobj);
+       drm_gem_object_put_unlocked(gobj);
        return 0;
 }
 
index b94bd54..0528edb 100644 (file)
@@ -86,7 +86,7 @@ static void virtio_gpu_unref_list(struct list_head *head)
                bo = buf->bo;
                qobj = container_of(bo, struct virtio_gpu_object, tbo);
 
-               drm_gem_object_unreference_unlocked(&qobj->gem_base);
+               drm_gem_object_put_unlocked(&qobj->gem_base);
        }
 }
 
@@ -304,7 +304,7 @@ static int virtio_gpu_resource_create_ioctl(struct drm_device *dev, void *data,
                }
                return ret;
        }
-       drm_gem_object_unreference_unlocked(obj);
+       drm_gem_object_put_unlocked(obj);
 
        rc->res_handle = res_id; /* similiar to a VM address */
        rc->bo_handle = handle;
@@ -341,7 +341,7 @@ static int virtio_gpu_resource_info_ioctl(struct drm_device *dev, void *data,
 
        ri->size = qobj->gem_base.size;
        ri->res_handle = qobj->hw_res_handle;
-       drm_gem_object_unreference_unlocked(gobj);
+       drm_gem_object_put_unlocked(gobj);
        return 0;
 }
 
@@ -389,7 +389,7 @@ static int virtio_gpu_transfer_from_host_ioctl(struct drm_device *dev,
 out_unres:
        virtio_gpu_object_unreserve(qobj);
 out:
-       drm_gem_object_unreference_unlocked(gobj);
+       drm_gem_object_put_unlocked(gobj);
        return ret;
 }
 
@@ -439,7 +439,7 @@ static int virtio_gpu_transfer_to_host_ioctl(struct drm_device *dev, void *data,
 out_unres:
        virtio_gpu_object_unreserve(qobj);
 out:
-       drm_gem_object_unreference_unlocked(gobj);
+       drm_gem_object_put_unlocked(gobj);
        return ret;
 }
 
@@ -462,7 +462,7 @@ static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data,
                nowait = true;
        ret = virtio_gpu_object_wait(qobj, nowait);
 
-       drm_gem_object_unreference_unlocked(gobj);
+       drm_gem_object_put_unlocked(gobj);
        return ret;
 }
 
index 71bbaae..ee06ecd 100644 (file)
@@ -155,7 +155,7 @@ struct drm_driver {
         * reverse order of the initialization.  Similarly to the load
         * hook, this handler is deprecated and its usage should be
         * dropped in favor of an open-coded teardown function at the
-        * driver layer.  See drm_dev_unregister() and drm_dev_unref()
+        * driver layer.  See drm_dev_unregister() and drm_dev_put()
         * for the proper way to remove a &struct drm_device.
         *
         * The unload() hook is called right after unregistering
@@ -611,7 +611,8 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
 int drm_dev_register(struct drm_device *dev, unsigned long flags);
 void drm_dev_unregister(struct drm_device *dev);
 
-void drm_dev_ref(struct drm_device *dev);
+void drm_dev_get(struct drm_device *dev);
+void drm_dev_put(struct drm_device *dev);
 void drm_dev_unref(struct drm_device *dev);
 void drm_put_dev(struct drm_device *dev);
 void drm_dev_unplug(struct drm_device *dev);
index a323781..023f052 100644 (file)
@@ -28,16 +28,6 @@ void drm_fbdev_cma_set_suspend(struct drm_fbdev_cma *fbdev_cma, bool state);
 void drm_fbdev_cma_set_suspend_unlocked(struct drm_fbdev_cma *fbdev_cma,
                                        bool state);
 
-void drm_fb_cma_destroy(struct drm_framebuffer *fb);
-int drm_fb_cma_create_handle(struct drm_framebuffer *fb,
-       struct drm_file *file_priv, unsigned int *handle);
-
-struct drm_framebuffer *drm_fb_cma_create_with_funcs(struct drm_device *dev,
-       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd,
-       const struct drm_framebuffer_funcs *funcs);
-struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
-       struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
-
 struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
        unsigned int plane);
 
@@ -45,9 +35,6 @@ dma_addr_t drm_fb_cma_get_gem_addr(struct drm_framebuffer *fb,
                                   struct drm_plane_state *state,
                                   unsigned int plane);
 
-int drm_fb_cma_prepare_fb(struct drm_plane *plane,
-                         struct drm_plane_state *state);
-
 #ifdef CONFIG_DEBUG_FS
 struct seq_file;
 
index 0c7a926..dc10dee 100644 (file)
@@ -50,6 +50,9 @@ expression object;
 |
 - drm_property_unreference_blob(object)
 + drm_property_blob_put(object)
+|
+- drm_dev_unref(object)
++ drm_dev_put(object)
 )
 
 @r depends on report@
@@ -81,6 +84,8 @@ drm_gem_object_unreference_unlocked(object)
 drm_property_unreference_blob@p(object)
 |
 drm_property_reference_blob@p(object)
+|
+drm_dev_unref@p(object)
 )
 
 @script:python depends on report@