[PATCH V3 2/2] video: drm: exynos: Add device tree support
Leela Krishna Amudala
l.krishna at samsung.com
Tue Sep 4 09:44:58 PDT 2012
Hello Inki Dae,
On Tue, Sep 4, 2012 at 7:42 PM, InKi Dae <inki.dae at samsung.com> wrote:
>
> 2012/8/16 Leela Krishna Amudala <l.krishna at samsung.com>:
> > Add device tree based discovery support for DRM-FIMD driver.
> >
> > Signed-off-by: Leela Krishna Amudala <l.krishna at samsung.com>
> > ---
> > Documentation/devicetree/bindings/fb/drm-fimd.txt | 80
> > +++++++++++++++++
> > drivers/gpu/drm/exynos/exynos_drm_fimd.c | 95
> > ++++++++++++++++++++-
> > 2 files changed, 173 insertions(+), 2 deletions(-)
> > create mode 100644 Documentation/devicetree/bindings/fb/drm-fimd.txt
> >
> > diff --git a/Documentation/devicetree/bindings/fb/drm-fimd.txt
> > b/Documentation/devicetree/bindings/fb/drm-fimd.txt
> > new file mode 100644
> > index 0000000..8ad8814
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/fb/drm-fimd.txt
> > @@ -0,0 +1,80 @@
> > +* Samsung Display Controller using DRM frame work
> > +
> > +The display controller is used to transfer image data from memory to an
> > +external LCD driver interface. It supports various color formats such
> > as
> > +rgb and yuv.
> > +
> > +Required properties:
> > + - compatible: Should be "samsung,exynos5-drm" for fimd using DRM frame
> > work.
> > + - reg: physical base address of the controller and length of memory
> > + mapped region.
> > + - interrupts: Three interrupts should be specified. The interrupts
> > should be
> > + specified in the following order.
> > + - VSYNC interrupt
> > + - FIFO level interrupt
> > + - FIMD System Interrupt
> > +
> > + - samsung,fimd-display: This property should specify the phandle of
> > the
> > + display device node which holds the video interface timing with the
> > + below mentioned properties.
> > +
> > + - lcd-htiming: Specifies the horizontal timing for the overlay. The
> > + horizontal timing includes four parameters in the following order.
> > +
> > + - horizontal back porch (in number of lcd clocks)
> > + - horizontal front porch (in number of lcd clocks)
> > + - hsync pulse width (in number of lcd clocks)
> > + - Display panels X resolution.
> > +
> > + - lcd-vtiming: Specifies the vertical timing for the overlay. The
> > + vertical timing includes four parameters in the following order.
> > +
> > + - vertical back porch (in number of lcd lines)
> > + - vertical front porch (in number of lcd lines)
> > + - vsync pulse width (in number of lcd clocks)
> > + - Display panels Y resolution.
> > +
> > +
> > + - samsung,default-window: Specifies the default window number of the
> > fimd controller.
> > +
> > + - samsung,fimd-win-bpp: Specifies the bits per pixel.
> > +
> > +Optional properties:
> > + - supports-mipi-panel: Specifies the lcd is mipi panel type
> > + - samsung,fimd-vidout-rgb: Video output format is RGB.
> > + - samsung,fimd-inv-vclk: invert video clock polarity.
> > + - samsung,fimd-frame-rate: Number of video frames per second.
> > +
> > +Example:
> > +
> > + The following is an example for the fimd controller is split
> > into
> > + two portions. The SoC specific portion can be specified in the
> > SoC
> > + specific dts file. The board specific portion can be specified
> > in the
> > + board specific dts file.
> > +
> > + - SoC Specific portion
> > +
> > + fimd {
> > + compatible = "samsung,exynos5-drm";
> > + interrupt-parent = <&combiner>;
> > + reg = <0x14400000 0x40000>;
> > + interrupts = <18 5>, <18 4>, <18 6>;
> > + };
> > +
> > + - Board Specific portion
> > +
> > + lcd_fimd0: lcd_panel0 {
> > + lcd-htiming = <4 4 4 480>;
> > + lcd-vtiming = <4 4 4 320>;
> > + supports-mipi-panel;
> > + };
> > +
> > + fimd {
> > + samsung,fimd-display = <&lcd_fimd0>;
> > + samsung,fimd-vidout-rgb;
> > + samsung,fimd-inv-vclk;
> > + samsung,fimd-frame-rate = <60>;
> > + samsung,default-window = <0>;
> > + samsung,fimd-win-bpp = <32>;
> > + };
> > +
> > diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> > b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
> > index 8379c59..1753846 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 <video/samsung_fimd.h>
> > #include <drm/exynos_drm.h>
> > @@ -103,9 +104,18 @@ struct fimd_context {
> > struct exynos_drm_panel_info *panel;
> > };
> >
> > +static const struct of_device_id drm_fimd_dt_match[];
> > +
> > static inline struct drm_fimd_driver_data *drm_fimd_get_driver_data(
> > struct platform_device *pdev)
> > {
> > +#ifdef CONFIG_OF
> > + if (pdev->dev.of_node) {
> > + const struct of_device_id *match;
> > + match = of_match_node(drm_fimd_dt_match,
> > pdev->dev.of_node);
> > + return (struct drm_fimd_driver_data *)match->data;
> > + }
> > +#endif
> > return (struct drm_fimd_driver_data *)
> > platform_get_device_id(pdev)->driver_data;
> > }
> > @@ -821,12 +831,79 @@ 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 = devm_kzalloc(dev, 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(np, "samsung,fimd-frame-rate",
> > + &pd->panel.timing.refresh);
> > +
> > + of_property_read_u32(np, "samsung,default-window",
> > &pd->default_win);
> > +
> > + of_property_read_u32(np, "samsung,fimd-win-bpp", &pd->bpp);
> > +
> > + return pd;
> > +}
> > +#else
> > +static int exynos_drm_fimd_pdata *drm_fimd_dt_parse_pdata(struct device
> > *dev)
>
> use 'struct' instead of 'int'. maybe it's your mistake.
>
Yes, This is my mistake, will change in next version.
Thanks for reviewing the patch.
> >
> > _______________________________________________
> > dri-devel mailing list
> > dri-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/dri-devel
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
More information about the dri-devel
mailing list