[PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-07 Thread Kyungmin Park
Hi,

On Fri, Jul 6, 2012 at 9:28 PM, Leela Krishna Amudala
 wrote:
> Add device tree based discovery support for DRM-FIMD driver.
>
> Signed-off-by: Leela Krishna Amudala 
>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index 29fdbfe..37769cf 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> @@ -18,6 +18,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>
>  #include 
>  #include 
> @@ -788,12 +789,84 @@ static int fimd_power_on(struct fimd_context *ctx, bool 
> enable)
> return 0;
>  }
>
> +#ifdef CONFIG_OF
> +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device 
> *dev)
> +{
> +   struct device_node *np = dev->of_node;
> +   struct device_node *disp_np;
> +   struct exynos_drm_fimd_pdata *pd;
> +   u32 data[4];
> +
> +   pd = kzalloc(sizeof(*pd), GFP_KERNEL);
> +   if (!pd) {
> +   dev_err(dev, "memory allocation for pdata failed\n");
> +   return ERR_PTR(-ENOMEM);
> +   }
> +
> +   if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL))
> +   pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB;
> +   if (of_get_property(np, "samsung,fimd-vidout-tv", NULL))
> +   pd->vidcon0 |= VIDCON0_VIDOUT_TV;
> +   if (of_get_property(np, "samsung,fimd-inv-hsync", NULL))
> +   pd->vidcon1 |= VIDCON1_INV_HSYNC;
> +   if (of_get_property(np, "samsung,fimd-inv-vsync", NULL))
> +   pd->vidcon1 |= VIDCON1_INV_VSYNC;
> +   if (of_get_property(np, "samsung,fimd-inv-vclk", NULL))
> +   pd->vidcon1 |= VIDCON1_INV_VCLK;
> +   if (of_get_property(np, "samsung,fimd-inv-vden", NULL))
> +   pd->vidcon1 |= VIDCON1_INV_VDEN;
> +
> +   disp_np = of_parse_phandle(np, "samsung,fimd-display", 0);
> +   if (!disp_np) {
> +   dev_err(dev, "unable to find display panel info\n");
> +   return ERR_PTR(-EINVAL);
> +   }
> +
> +   if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) {
> +   dev_err(dev, "invalid horizontal timing\n");
> +   return ERR_PTR(-EINVAL);
> +   }
> +   pd->panel.timing.left_margin = data[0];
> +   pd->panel.timing.right_margin = data[1];
> +   pd->panel.timing.hsync_len = data[2];
> +   pd->panel.timing.xres = data[3];
> +
> +   if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) {
> +   dev_err(dev, "invalid vertical timing\n");
> +   return ERR_PTR(-EINVAL);
> +   }
> +   pd->panel.timing.upper_margin = data[0];
> +   pd->panel.timing.lower_margin = data[1];
> +   pd->panel.timing.vsync_len = data[2];
> +   pd->panel.timing.yres = data[3];
> +
> +   of_property_read_u32(disp_np, "lcd-panel-type", >panel_type);
> +
> +   of_property_read_u32(np, "samsung,fimd-frame-rate",
> +   >panel.timing.refresh);
> +
> +   of_property_read_u32(np, "samsung, defalut-window", >default_win);
No space between after comma.
> +
> +   of_property_read_u32(np, "samsung,fimd-win-bpp", >bpp);
> +
> +   return pd;
> +}
> +#else
> +static int drm_fimd_dt_parse_pdata(struct device *dev,
> +   struct exynos_drm_fimd_pdata **pdata)
> +{
> +   return 0;
> +}
> +#endif /* CONFIG_OF */
> +
> +static const struct of_device_id drm_fimd_dt_match[];
> +
>  static int __devinit fimd_probe(struct platform_device *pdev)
>  {
> struct device *dev = >dev;
> struct fimd_context *ctx;
> struct exynos_drm_subdrv *subdrv;
> -   struct exynos_drm_fimd_pdata *pdata;
> +   struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data;
> struct exynos_drm_panel_info *panel;
> struct resource *res;
> int win;
> @@ -801,7 +874,11 @@ static int __devinit fimd_probe(struct platform_device 
> *pdev)
>
> DRM_DEBUG_KMS("%s\n", __FILE__);
>
> -   pdata = pdev->dev.platform_data;
> +   if (pdev->dev.of_node) {
> +   pdata = drm_fimd_dt_parse_pdata(>dev);
> +   if (IS_ERR(pdata))
> +   return PTR_ERR(pdata);
> +   }
> if (!pdata) {
> dev_err(dev, "no platform data specified\n");
> return -EINVAL;
> @@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
>  }
>  #endif
>
> +#ifdef CONFIG_OF
> +static const struct of_device_id drm_fimd_dt_match[] = {
> +   { .compatible = "samsung,exynos5-fb",
It's ambiguous. it's better to use "samsung,exynos5-drm".
Yes I know, previous it uses exynos4-fb to reduce the modification
with mainline. but correct name is exynoxX-drm.

Thank you,
Kyungmin Park
> +   .data = (void *)NULL },
> +   {},
> +};
> +MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
> +#endif
> +
>  static const struct dev_pm_ops fimd_pm_ops 

[PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-06 Thread Leela Krishna Amudala
Add device tree based discovery support for DRM-FIMD driver.

Signed-off-by: Leela Krishna Amudala 

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 29fdbfe..37769cf 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -18,6 +18,7 @@
 #include 
 #include 
 #include 
+#include 

 #include 
 #include 
@@ -788,12 +789,84 @@ static int fimd_power_on(struct fimd_context *ctx, bool 
enable)
return 0;
 }

+#ifdef CONFIG_OF
+static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device 
*dev)
+{
+   struct device_node *np = dev->of_node;
+   struct device_node *disp_np;
+   struct exynos_drm_fimd_pdata *pd;
+   u32 data[4];
+
+   pd = kzalloc(sizeof(*pd), GFP_KERNEL);
+   if (!pd) {
+   dev_err(dev, "memory allocation for pdata failed\n");
+   return ERR_PTR(-ENOMEM);
+   }
+
+   if (of_get_property(np, "samsung,fimd-vidout-rgb", NULL))
+   pd->vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB;
+   if (of_get_property(np, "samsung,fimd-vidout-tv", NULL))
+   pd->vidcon0 |= VIDCON0_VIDOUT_TV;
+   if (of_get_property(np, "samsung,fimd-inv-hsync", NULL))
+   pd->vidcon1 |= VIDCON1_INV_HSYNC;
+   if (of_get_property(np, "samsung,fimd-inv-vsync", NULL))
+   pd->vidcon1 |= VIDCON1_INV_VSYNC;
+   if (of_get_property(np, "samsung,fimd-inv-vclk", NULL))
+   pd->vidcon1 |= VIDCON1_INV_VCLK;
+   if (of_get_property(np, "samsung,fimd-inv-vden", NULL))
+   pd->vidcon1 |= VIDCON1_INV_VDEN;
+
+   disp_np = of_parse_phandle(np, "samsung,fimd-display", 0);
+   if (!disp_np) {
+   dev_err(dev, "unable to find display panel info\n");
+   return ERR_PTR(-EINVAL);
+   }
+
+   if (of_property_read_u32_array(disp_np, "lcd-htiming", data, 4)) {
+   dev_err(dev, "invalid horizontal timing\n");
+   return ERR_PTR(-EINVAL);
+   }
+   pd->panel.timing.left_margin = data[0];
+   pd->panel.timing.right_margin = data[1];
+   pd->panel.timing.hsync_len = data[2];
+   pd->panel.timing.xres = data[3];
+
+   if (of_property_read_u32_array(disp_np, "lcd-vtiming", data, 4)) {
+   dev_err(dev, "invalid vertical timing\n");
+   return ERR_PTR(-EINVAL);
+   }
+   pd->panel.timing.upper_margin = data[0];
+   pd->panel.timing.lower_margin = data[1];
+   pd->panel.timing.vsync_len = data[2];
+   pd->panel.timing.yres = data[3];
+
+   of_property_read_u32(disp_np, "lcd-panel-type", >panel_type);
+
+   of_property_read_u32(np, "samsung,fimd-frame-rate",
+   >panel.timing.refresh);
+
+   of_property_read_u32(np, "samsung, defalut-window", >default_win);
+
+   of_property_read_u32(np, "samsung,fimd-win-bpp", >bpp);
+
+   return pd;
+}
+#else
+static int drm_fimd_dt_parse_pdata(struct device *dev,
+   struct exynos_drm_fimd_pdata **pdata)
+{
+   return 0;
+}
+#endif /* CONFIG_OF */
+
+static const struct of_device_id drm_fimd_dt_match[];
+
 static int __devinit fimd_probe(struct platform_device *pdev)
 {
struct device *dev = >dev;
struct fimd_context *ctx;
struct exynos_drm_subdrv *subdrv;
-   struct exynos_drm_fimd_pdata *pdata;
+   struct exynos_drm_fimd_pdata *pdata = pdev->dev.platform_data;
struct exynos_drm_panel_info *panel;
struct resource *res;
int win;
@@ -801,7 +874,11 @@ static int __devinit fimd_probe(struct platform_device 
*pdev)

DRM_DEBUG_KMS("%s\n", __FILE__);

-   pdata = pdev->dev.platform_data;
+   if (pdev->dev.of_node) {
+   pdata = drm_fimd_dt_parse_pdata(>dev);
+   if (IS_ERR(pdata))
+   return PTR_ERR(pdata);
+   }
if (!pdata) {
dev_err(dev, "no platform data specified\n");
return -EINVAL;
@@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
 }
 #endif

+#ifdef CONFIG_OF
+static const struct of_device_id drm_fimd_dt_match[] = {
+   { .compatible = "samsung,exynos5-fb",
+   .data = (void *)NULL },
+   {},
+};
+MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
+#endif
+
 static const struct dev_pm_ops fimd_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL)
@@ -1018,5 +1104,6 @@ struct platform_driver fimd_driver = {
.name   = "exynos4-fb",
.owner  = THIS_MODULE,
.pm = _pm_ops,
+   .of_match_table = of_match_ptr(drm_fimd_dt_match),
},
 };
diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
index 6873358..fecaee8 100644
--- a/include/drm/exynos_drm.h
+++ b/include/drm/exynos_drm.h

[PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-06 Thread Olof Johansson
Hi,

On Fri, Jul 6, 2012 at 5:28 AM, Leela Krishna Amudala
 wrote:
>
> Add device tree based discovery support for DRM-FIMD driver.
>
> Signed-off-by: Leela Krishna Amudala 


This also needs to be sent to devicetree-discuss at lists.ozlabs.org, and
the device tree bindings need to be documented under
Documentation/devicetree/bindings.

I'll hold off comments on the bindings until the documentation piece
is available.


A couple of other nits:

>
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
> b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> index 29fdbfe..37769cf 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
[...]
> +   of_property_read_u32(np, "samsung, defalut-window", >default_win);

Two typos in one property.

[...]
> @@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
>  }
>  #endif
>
> +#ifdef CONFIG_OF
> +static const struct of_device_id drm_fimd_dt_match[] = {
> +   { .compatible = "samsung,exynos5-fb",
> +   .data = (void *)NULL },

No need to initialize data here.

> +   {},
> +};
> +MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
> +#endif
> +
>  static const struct dev_pm_ops fimd_pm_ops = {
> SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
> SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL)
> @@ -1018,5 +1104,6 @@ struct platform_driver fimd_driver = {
> .name   = "exynos4-fb",
> .owner  = THIS_MODULE,
> .pm = _pm_ops,
> +   .of_match_table = of_match_ptr(drm_fimd_dt_match),
> },
>  };
> diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
> index 6873358..fecaee8 100644
> --- a/include/drm/exynos_drm.h
> +++ b/include/drm/exynos_drm.h
> @@ -224,6 +224,11 @@ struct exynos_drm_panel_info {
> u32 height_mm;
>  };
>
> +enum disp_panel_type {
> +   MIPI_LCD,
> +   DP_LCD
> +};
> +
>  /**
>   * Platform Specific Structure for DRM based FIMD.
>   *
> @@ -237,6 +242,7 @@ struct exynos_drm_fimd_pdata {
> u32 vidcon1;
> unsigned intdefault_win;
> unsigned intbpp;
> +   enum disp_panel_typepanel_type;
>  };

This seems unrelated?


-Olof


[PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-06 Thread Leela Krishna Amudala
Add device tree based discovery support for DRM-FIMD driver.

Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 29fdbfe..37769cf 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -18,6 +18,7 @@
 #include linux/platform_device.h
 #include linux/clk.h
 #include linux/pm_runtime.h
+#include linux/of.h
 
 #include drm/exynos_drm.h
 #include plat/regs-fb-v4.h
@@ -788,12 +789,84 @@ static int fimd_power_on(struct fimd_context *ctx, bool 
enable)
return 0;
 }
 
+#ifdef CONFIG_OF
+static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device 
*dev)
+{
+   struct device_node *np = dev-of_node;
+   struct device_node *disp_np;
+   struct exynos_drm_fimd_pdata *pd;
+   u32 data[4];
+
+   pd = kzalloc(sizeof(*pd), GFP_KERNEL);
+   if (!pd) {
+   dev_err(dev, memory allocation for pdata failed\n);
+   return ERR_PTR(-ENOMEM);
+   }
+
+   if (of_get_property(np, samsung,fimd-vidout-rgb, NULL))
+   pd-vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB;
+   if (of_get_property(np, samsung,fimd-vidout-tv, NULL))
+   pd-vidcon0 |= VIDCON0_VIDOUT_TV;
+   if (of_get_property(np, samsung,fimd-inv-hsync, NULL))
+   pd-vidcon1 |= VIDCON1_INV_HSYNC;
+   if (of_get_property(np, samsung,fimd-inv-vsync, NULL))
+   pd-vidcon1 |= VIDCON1_INV_VSYNC;
+   if (of_get_property(np, samsung,fimd-inv-vclk, NULL))
+   pd-vidcon1 |= VIDCON1_INV_VCLK;
+   if (of_get_property(np, samsung,fimd-inv-vden, NULL))
+   pd-vidcon1 |= VIDCON1_INV_VDEN;
+
+   disp_np = of_parse_phandle(np, samsung,fimd-display, 0);
+   if (!disp_np) {
+   dev_err(dev, unable to find display panel info\n);
+   return ERR_PTR(-EINVAL);
+   }
+
+   if (of_property_read_u32_array(disp_np, lcd-htiming, data, 4)) {
+   dev_err(dev, invalid horizontal timing\n);
+   return ERR_PTR(-EINVAL);
+   }
+   pd-panel.timing.left_margin = data[0];
+   pd-panel.timing.right_margin = data[1];
+   pd-panel.timing.hsync_len = data[2];
+   pd-panel.timing.xres = data[3];
+
+   if (of_property_read_u32_array(disp_np, lcd-vtiming, data, 4)) {
+   dev_err(dev, invalid vertical timing\n);
+   return ERR_PTR(-EINVAL);
+   }
+   pd-panel.timing.upper_margin = data[0];
+   pd-panel.timing.lower_margin = data[1];
+   pd-panel.timing.vsync_len = data[2];
+   pd-panel.timing.yres = data[3];
+
+   of_property_read_u32(disp_np, lcd-panel-type, pd-panel_type);
+
+   of_property_read_u32(np, samsung,fimd-frame-rate,
+   pd-panel.timing.refresh);
+
+   of_property_read_u32(np, samsung, defalut-window, pd-default_win);
+
+   of_property_read_u32(np, samsung,fimd-win-bpp, pd-bpp);
+
+   return pd;
+}
+#else
+static int drm_fimd_dt_parse_pdata(struct device *dev,
+   struct exynos_drm_fimd_pdata **pdata)
+{
+   return 0;
+}
+#endif /* CONFIG_OF */
+
+static const struct of_device_id drm_fimd_dt_match[];
+
 static int __devinit fimd_probe(struct platform_device *pdev)
 {
struct device *dev = pdev-dev;
struct fimd_context *ctx;
struct exynos_drm_subdrv *subdrv;
-   struct exynos_drm_fimd_pdata *pdata;
+   struct exynos_drm_fimd_pdata *pdata = pdev-dev.platform_data;
struct exynos_drm_panel_info *panel;
struct resource *res;
int win;
@@ -801,7 +874,11 @@ static int __devinit fimd_probe(struct platform_device 
*pdev)
 
DRM_DEBUG_KMS(%s\n, __FILE__);
 
-   pdata = pdev-dev.platform_data;
+   if (pdev-dev.of_node) {
+   pdata = drm_fimd_dt_parse_pdata(pdev-dev);
+   if (IS_ERR(pdata))
+   return PTR_ERR(pdata);
+   }
if (!pdata) {
dev_err(dev, no platform data specified\n);
return -EINVAL;
@@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
 }
 #endif
 
+#ifdef CONFIG_OF
+static const struct of_device_id drm_fimd_dt_match[] = {
+   { .compatible = samsung,exynos5-fb,
+   .data = (void *)NULL },
+   {},
+};
+MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
+#endif
+
 static const struct dev_pm_ops fimd_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL)
@@ -1018,5 +1104,6 @@ struct platform_driver fimd_driver = {
.name   = exynos4-fb,
.owner  = THIS_MODULE,
.pm = fimd_pm_ops,
+   .of_match_table = of_match_ptr(drm_fimd_dt_match),
},
 };
diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
index 

Re: [PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-06 Thread Olof Johansson
Hi,

On Fri, Jul 6, 2012 at 5:28 AM, Leela Krishna Amudala
l.kris...@samsung.com wrote:

 Add device tree based discovery support for DRM-FIMD driver.

 Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com


This also needs to be sent to devicetree-disc...@lists.ozlabs.org, and
the device tree bindings need to be documented under
Documentation/devicetree/bindings.

I'll hold off comments on the bindings until the documentation piece
is available.


A couple of other nits:


 diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
 b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
 index 29fdbfe..37769cf 100644
 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
 +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
[...]
 +   of_property_read_u32(np, samsung, defalut-window, pd-default_win);

Two typos in one property.

[...]
 @@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
  }
  #endif

 +#ifdef CONFIG_OF
 +static const struct of_device_id drm_fimd_dt_match[] = {
 +   { .compatible = samsung,exynos5-fb,
 +   .data = (void *)NULL },

No need to initialize data here.

 +   {},
 +};
 +MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
 +#endif
 +
  static const struct dev_pm_ops fimd_pm_ops = {
 SET_SYSTEM_SLEEP_PM_OPS(fimd_suspend, fimd_resume)
 SET_RUNTIME_PM_OPS(fimd_runtime_suspend, fimd_runtime_resume, NULL)
 @@ -1018,5 +1104,6 @@ struct platform_driver fimd_driver = {
 .name   = exynos4-fb,
 .owner  = THIS_MODULE,
 .pm = fimd_pm_ops,
 +   .of_match_table = of_match_ptr(drm_fimd_dt_match),
 },
  };
 diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
 index 6873358..fecaee8 100644
 --- a/include/drm/exynos_drm.h
 +++ b/include/drm/exynos_drm.h
 @@ -224,6 +224,11 @@ struct exynos_drm_panel_info {
 u32 height_mm;
  };

 +enum disp_panel_type {
 +   MIPI_LCD,
 +   DP_LCD
 +};
 +
  /**
   * Platform Specific Structure for DRM based FIMD.
   *
 @@ -237,6 +242,7 @@ struct exynos_drm_fimd_pdata {
 u32 vidcon1;
 unsigned intdefault_win;
 unsigned intbpp;
 +   enum disp_panel_typepanel_type;
  };

This seems unrelated?


-Olof
___
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel


Re: [PATCH 1/2] video: drm: exynos: Add device tree support

2012-07-06 Thread Kyungmin Park
Hi,

On Fri, Jul 6, 2012 at 9:28 PM, Leela Krishna Amudala
l.kris...@samsung.com wrote:
 Add device tree based discovery support for DRM-FIMD driver.

 Signed-off-by: Leela Krishna Amudala l.kris...@samsung.com

 diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c 
 b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
 index 29fdbfe..37769cf 100644
 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
 +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
 @@ -18,6 +18,7 @@
  #include linux/platform_device.h
  #include linux/clk.h
  #include linux/pm_runtime.h
 +#include linux/of.h

  #include drm/exynos_drm.h
  #include plat/regs-fb-v4.h
 @@ -788,12 +789,84 @@ static int fimd_power_on(struct fimd_context *ctx, bool 
 enable)
 return 0;
  }

 +#ifdef CONFIG_OF
 +static struct exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device 
 *dev)
 +{
 +   struct device_node *np = dev-of_node;
 +   struct device_node *disp_np;
 +   struct exynos_drm_fimd_pdata *pd;
 +   u32 data[4];
 +
 +   pd = kzalloc(sizeof(*pd), GFP_KERNEL);
 +   if (!pd) {
 +   dev_err(dev, memory allocation for pdata failed\n);
 +   return ERR_PTR(-ENOMEM);
 +   }
 +
 +   if (of_get_property(np, samsung,fimd-vidout-rgb, NULL))
 +   pd-vidcon0 |= VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB;
 +   if (of_get_property(np, samsung,fimd-vidout-tv, NULL))
 +   pd-vidcon0 |= VIDCON0_VIDOUT_TV;
 +   if (of_get_property(np, samsung,fimd-inv-hsync, NULL))
 +   pd-vidcon1 |= VIDCON1_INV_HSYNC;
 +   if (of_get_property(np, samsung,fimd-inv-vsync, NULL))
 +   pd-vidcon1 |= VIDCON1_INV_VSYNC;
 +   if (of_get_property(np, samsung,fimd-inv-vclk, NULL))
 +   pd-vidcon1 |= VIDCON1_INV_VCLK;
 +   if (of_get_property(np, samsung,fimd-inv-vden, NULL))
 +   pd-vidcon1 |= VIDCON1_INV_VDEN;
 +
 +   disp_np = of_parse_phandle(np, samsung,fimd-display, 0);
 +   if (!disp_np) {
 +   dev_err(dev, unable to find display panel info\n);
 +   return ERR_PTR(-EINVAL);
 +   }
 +
 +   if (of_property_read_u32_array(disp_np, lcd-htiming, data, 4)) {
 +   dev_err(dev, invalid horizontal timing\n);
 +   return ERR_PTR(-EINVAL);
 +   }
 +   pd-panel.timing.left_margin = data[0];
 +   pd-panel.timing.right_margin = data[1];
 +   pd-panel.timing.hsync_len = data[2];
 +   pd-panel.timing.xres = data[3];
 +
 +   if (of_property_read_u32_array(disp_np, lcd-vtiming, data, 4)) {
 +   dev_err(dev, invalid vertical timing\n);
 +   return ERR_PTR(-EINVAL);
 +   }
 +   pd-panel.timing.upper_margin = data[0];
 +   pd-panel.timing.lower_margin = data[1];
 +   pd-panel.timing.vsync_len = data[2];
 +   pd-panel.timing.yres = data[3];
 +
 +   of_property_read_u32(disp_np, lcd-panel-type, pd-panel_type);
 +
 +   of_property_read_u32(np, samsung,fimd-frame-rate,
 +   pd-panel.timing.refresh);
 +
 +   of_property_read_u32(np, samsung, defalut-window, pd-default_win);
No space between after comma.
 +
 +   of_property_read_u32(np, samsung,fimd-win-bpp, pd-bpp);
 +
 +   return pd;
 +}
 +#else
 +static int drm_fimd_dt_parse_pdata(struct device *dev,
 +   struct exynos_drm_fimd_pdata **pdata)
 +{
 +   return 0;
 +}
 +#endif /* CONFIG_OF */
 +
 +static const struct of_device_id drm_fimd_dt_match[];
 +
  static int __devinit fimd_probe(struct platform_device *pdev)
  {
 struct device *dev = pdev-dev;
 struct fimd_context *ctx;
 struct exynos_drm_subdrv *subdrv;
 -   struct exynos_drm_fimd_pdata *pdata;
 +   struct exynos_drm_fimd_pdata *pdata = pdev-dev.platform_data;
 struct exynos_drm_panel_info *panel;
 struct resource *res;
 int win;
 @@ -801,7 +874,11 @@ static int __devinit fimd_probe(struct platform_device 
 *pdev)

 DRM_DEBUG_KMS(%s\n, __FILE__);

 -   pdata = pdev-dev.platform_data;
 +   if (pdev-dev.of_node) {
 +   pdata = drm_fimd_dt_parse_pdata(pdev-dev);
 +   if (IS_ERR(pdata))
 +   return PTR_ERR(pdata);
 +   }
 if (!pdata) {
 dev_err(dev, no platform data specified\n);
 return -EINVAL;
 @@ -1006,6 +1083,15 @@ static int fimd_runtime_resume(struct device *dev)
  }
  #endif

 +#ifdef CONFIG_OF
 +static const struct of_device_id drm_fimd_dt_match[] = {
 +   { .compatible = samsung,exynos5-fb,
It's ambiguous. it's better to use samsung,exynos5-drm.
Yes I know, previous it uses exynos4-fb to reduce the modification
with mainline. but correct name is exynoxX-drm.

Thank you,
Kyungmin Park
 +   .data = (void *)NULL },
 +   {},
 +};
 +MODULE_DEVICE_TABLE(of, drm_fimd_dt_match);
 +#endif
 +
  static const struct dev_pm_ops fimd_pm_ops = {