]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'imx-drm-fixes-2016-05-24' of git://git.pengutronix.de/git/pza/linux into...
authorDave Airlie <airlied@redhat.com>
Wed, 25 May 2016 02:36:20 +0000 (12:36 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 25 May 2016 02:36:20 +0000 (12:36 +1000)
imx-drm probing fix

Commit 950b410dd1ab ("gpu: ipu-v3: Fix imx-ipuv3-crtc module autoloading")
broke probing of the imx-drm driver in the non-modular case because the
unset dev->of_node during probing of imx-ipuv3-crtc would cause the
component matching to fail. This patch patch instead matches against
an of_node pointer stored in platform data, allowing dev->of_node to
be left unset for the platform probed imx-ipuv3-crtc devices.

* tag 'imx-drm-fixes-2016-05-24' of git://git.pengutronix.de/git/pza/linux:
  drm/imx: Match imx-ipuv3-crtc components using device node in platform data

drivers/gpu/drm/imx/imx-drm-core.c
drivers/gpu/drm/imx/ipuv3-crtc.c
drivers/gpu/ipu-v3/ipu-common.c
include/video/imx-ipu-v3.h

index 1080019e7b17ad8062d188060effcc901454227d..1f14b602882b539500203c2c5b1573d82a0128f5 100644 (file)
@@ -25,6 +25,7 @@
 #include <drm/drm_fb_cma_helper.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_of.h>
+#include <video/imx-ipu-v3.h>
 
 #include "imx-drm.h"
 
@@ -437,6 +438,13 @@ static int compare_of(struct device *dev, void *data)
 {
        struct device_node *np = data;
 
+       /* Special case for DI, dev->of_node may not be set yet */
+       if (strcmp(dev->driver->name, "imx-ipuv3-crtc") == 0) {
+               struct ipu_client_platformdata *pdata = dev->platform_data;
+
+               return pdata->of_node == np;
+       }
+
        /* Special case for LDB, one device for two channels */
        if (of_node_cmp(np->name, "lvds-channel") == 0) {
                np = of_get_parent(np);
index dee8e8b3523b6adee24594589aaeb5d3f165ccfa..b2c30b8d981646719cbf3f3a1620aec834549b73 100644 (file)
@@ -473,7 +473,7 @@ static int ipu_crtc_init(struct ipu_crtc *ipu_crtc,
 
        ret = imx_drm_add_crtc(drm, &ipu_crtc->base, &ipu_crtc->imx_crtc,
                        &ipu_crtc->plane[0]->base, &ipu_crtc_helper_funcs,
-                       ipu_crtc->dev->of_node);
+                       pdata->of_node);
        if (ret) {
                dev_err(ipu_crtc->dev, "adding crtc failed with %d.\n", ret);
                goto err_put_resources;
index abb98c77bad25c6901b910095068a3aec5059311..99dcacf05b9986f97c44dbb1b962d47db85bf818 100644 (file)
@@ -997,7 +997,7 @@ struct ipu_platform_reg {
 };
 
 /* These must be in the order of the corresponding device tree port nodes */
-static const struct ipu_platform_reg client_reg[] = {
+static struct ipu_platform_reg client_reg[] = {
        {
                .pdata = {
                        .csi = 0,
@@ -1048,7 +1048,7 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
        mutex_unlock(&ipu_client_id_mutex);
 
        for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
-               const struct ipu_platform_reg *reg = &client_reg[i];
+               struct ipu_platform_reg *reg = &client_reg[i];
                struct platform_device *pdev;
                struct device_node *of_node;
 
@@ -1070,6 +1070,7 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
 
                pdev->dev.parent = dev;
 
+               reg->pdata.of_node = of_node;
                ret = platform_device_add_data(pdev, &reg->pdata,
                                               sizeof(reg->pdata));
                if (!ret)
index ad66589f2ae6ec6bd1290fb112b2e8947bef6d24..3a2a794017896994a42d370e59b14e7a492c37b9 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/videodev2.h>
 #include <linux/bitmap.h>
 #include <linux/fb.h>
+#include <linux/of.h>
 #include <media/v4l2-mediabus.h>
 #include <video/videomode.h>
 
@@ -345,6 +346,7 @@ struct ipu_client_platformdata {
        int dc;
        int dp;
        int dma[2];
+       struct device_node *of_node;
 };
 
 #endif /* __DRM_IPU_H__ */