Merge v5.3-rc1 into drm-misc-next
[linux-2.6-block.git] / drivers / gpu / drm / armada / armada_drv.c
index 4a6e8ed0592502ec5c00e0ad28a6b0fd8abb0833..055c92bc88bf53d1f912d91f7723c53ef775da63 100644 (file)
@@ -40,8 +40,7 @@ static struct drm_driver armada_drm_driver = {
        .name                   = "armada-drm",
        .desc                   = "Armada SoC DRM",
        .date                   = "20120730",
-       .driver_features        = DRIVER_GEM | DRIVER_MODESET |
-                                 DRIVER_PRIME | DRIVER_ATOMIC,
+       .driver_features        = DRIVER_GEM | DRIVER_MODESET | DRIVER_ATOMIC,
        .ioctls                 = armada_ioctls,
        .fops                   = &armada_drm_fops,
 };
@@ -97,6 +96,17 @@ static int armada_drm_bind(struct device *dev)
                return ret;
        }
 
+       /* Remove early framebuffers */
+       ret = drm_fb_helper_remove_conflicting_framebuffers(NULL,
+                                                           "armada-drm-fb",
+                                                           false);
+       if (ret) {
+               dev_err(dev, "[" DRM_NAME ":%s] can't kick out simple-fb: %d\n",
+                       __func__, ret);
+               kfree(priv);
+               return ret;
+       }
+
        priv->drm.dev_private = priv;
 
        dev_set_drvdata(dev, &priv->drm);
@@ -168,6 +178,8 @@ static void armada_drm_unbind(struct device *dev)
 
        drm_dev_unregister(&priv->drm);
 
+       drm_atomic_helper_shutdown(&priv->drm);
+
        component_unbind_all(dev, &priv->drm);
 
        drm_mode_config_cleanup(&priv->drm);
@@ -188,23 +200,15 @@ static int compare_dev_name(struct device *dev, void *data)
 }
 
 static void armada_add_endpoints(struct device *dev,
-       struct component_match **match, struct device_node *port)
+       struct component_match **match, struct device_node *dev_node)
 {
        struct device_node *ep, *remote;
 
-       for_each_child_of_node(port, ep) {
+       for_each_endpoint_of_node(dev_node, ep) {
                remote = of_graph_get_remote_port_parent(ep);
-               if (!remote || !of_device_is_available(remote)) {
-                       of_node_put(remote);
-                       continue;
-               } else if (!of_device_is_available(remote->parent)) {
-                       dev_warn(dev, "parent device of %pOF is not available\n",
-                                remote);
-                       of_node_put(remote);
-                       continue;
-               }
-
-               drm_of_component_match_add(dev, match, compare_of, remote);
+               if (remote && of_device_is_available(remote))
+                       drm_of_component_match_add(dev, match, compare_of,
+                                                  remote);
                of_node_put(remote);
        }
 }
@@ -226,7 +230,6 @@ static int armada_drm_probe(struct platform_device *pdev)
 
        if (dev->platform_data) {
                char **devices = dev->platform_data;
-               struct device_node *port;
                struct device *d;
                int i;
 
@@ -242,10 +245,8 @@ static int armada_drm_probe(struct platform_device *pdev)
                for (i = 0; devices[i]; i++) {
                        d = bus_find_device_by_name(&platform_bus_type, NULL,
                                                    devices[i]);
-                       if (d && d->of_node) {
-                               for_each_child_of_node(d->of_node, port)
-                                       armada_add_endpoints(dev, &match, port);
-                       }
+                       if (d && d->of_node)
+                               armada_add_endpoints(dev, &match, d->of_node);
                        put_device(d);
                }
        }