<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:宋体;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
        {font-family:"\@宋体";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";
        color:black;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";
        color:black;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";
        color:black;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;
        color:black;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";
        color:black;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.25in 1.0in 1.25in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body bgcolor="white" lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Hi Mark,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Thank you very much for your review!<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext"> Mark yao [mailto:mark.yao@rock-chips.com]
<br>
<b>Sent:</b> Wednesday, July 01, 2015 9:59 AM<br>
<b>To:</b> Wang Jianwei-B52261<br>
<b>Cc:</b> David Airlie; daniel.vetter@intel.com; stefan@agner.ch; dri-devel; linux-kernel; linux-arm-kernel@lists.infradead.org; Wang Jianwei-B52261<br>
<b>Subject:</b> Re: [PATCH v5 1/3] drm/layerscape: Add Freescale DCU DRM driver<o:p></o:p></span></p>
</div>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<pre><o:p> </o:p></pre>
<pre>From: Jianwei Wang <a href="mailto:b52261@freescale.com"><b52261@freescale.com></a><o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>This patch add support for Two Dimensional Animation and Compositing Engine (2D-ACE) on the Freescale SoCs.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>2D-ACE is a Freescale display controller. 2D-ACE describes the functionality of the module extremely well its name is a value that cannot be used as a token in programming languages.<o:p></o:p></pre>
<pre>Instead the valid token "DCU" is used to tag the register names and function names.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>The Display Controller Unit (DCU) module is a system master that fetches graphics stored in internal or external memory and displays them on a TFT LCD panel. A wide range of panel sizes is supported and the timing of the interface signals is highly configurable.<o:p></o:p></pre>
<pre>Graphics are read directly from memory and then blended in real-time, which allows for dynamic content creation with minimal CPU intervention.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>The features:<o:p></o:p></pre>
<pre>(1) Full RGB888 output to TFT LCD panel.<o:p></o:p></pre>
<pre>(2) For the current LCD panel, WQVGA "480x272" is supported.<o:p></o:p></pre>
<pre>(3) Blending of each pixel using up to 4 source layers dependent on size of panel.<o:p></o:p></pre>
<pre>(4) Each graphic layer can be placed with one pixel resolution in either axis.<o:p></o:p></pre>
<pre>(5) Each graphic layer support RGB565 and RGB888 direct colors without alpha channel and BGRA8888 BGRA4444 ARGB1555 direct colors with an alpha channel and YUV422 format.<o:p></o:p></pre>
<pre>(6) Each graphic layer support alpha blending with 8-bit resolution.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>This is a simplified version, only one primary plane, one framebuffer created for fbdev, one crtc, one connector for TFT LCD panel, an encoder.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Signed-off-by: Alison Wang <a href="mailto:b18965@freescale.com"><b18965@freescale.com></a><o:p></o:p></pre>
<pre>Signed-off-by: Xiubo Li <a href="mailto:lixiubo@cmss.chinamobile.com"><lixiubo@cmss.chinamobile.com></a><o:p></o:p></pre>
<pre>Signed-off-by: Jianwei Wang <a href="mailto:jianwei.wang@freescale.com"><jianwei.wang@freescale.com></a><o:p></o:p></pre>
<pre>---<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Changed in V5<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>- Update commit message<o:p></o:p></pre>
<pre>- Add layer registers initialization<o:p></o:p></pre>
<pre>- Remove unused functions<o:p></o:p></pre>
<pre>- Rename driver folder<o:p></o:p></pre>
<pre>- Move pixel clock control functions to fsl_dcu_drm_drv.c<o:p></o:p></pre>
<pre>- remove redundant enable the clock implicitly using regmap<o:p></o:p></pre>
<pre>- Add maintainer message<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Changed in V4:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>-This version doesn't have functionality changed  Just a minor adjustment.<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Changed in V3:<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>- Test driver on Vybrid board and add compatible string<o:p></o:p></pre>
<pre>- Remove unused functions<o:p></o:p></pre>
<pre>- set default crtc for encoder<o:p></o:p></pre>
<pre>- replace legacy functions with atomic help functions<o:p></o:p></pre>
<pre>- Set the unique name of the DRM device<o:p></o:p></pre>
<pre>- Implement irq handle function for vblank interrupt<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>Changed in v2:<o:p></o:p></pre>
<pre>- Add atomic support<o:p></o:p></pre>
<pre>- Modify bindings file<o:p></o:p></pre>
<pre>- Rename node for compatibility<o:p></o:p></pre>
<pre>- Move platform related code out for compatibility<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre> .../devicetree/bindings/drm/fsl-dcu/fsl,dcu.txt    |  50 +++<o:p></o:p></pre>
<pre> MAINTAINERS                                        |   8 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/Kconfig                            |   2 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/Makefile                           |   1 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/Kconfig                    |  17 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/Makefile                   |   7 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.c    | 194 +++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.h    |  30 ++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c         | 172 ++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h         |  22 ++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c          | 373 +++++++++++++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h          | 223 ++++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_fbdev.c        |  26 ++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c          |  42 +++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.h          |  17 +<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c        | 192 +++++++++++<o:p></o:p></pre>
<pre> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.h        |  23 ++<o:p></o:p></pre>
<pre> 17 files changed, 1399 insertions(+)<o:p></o:p></pre>
<pre> create mode 100644 Documentation/devicetree/bindings/drm/fsl-dcu/fsl,dcu.txt<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/Kconfig  create mode 100644 drivers/gpu/drm/fsl-dcu/Makefile  create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.h<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.h<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_fbdev.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_kms.h<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c<o:p></o:p></pre>
<pre> create mode 100644 drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.h<o:p></o:p></pre>
<pre><o:p> </o:p></pre>
<pre>diff --git a/Documentation/devicetree/bindings/drm/fsl-dcu/fsl,dcu.txt b/Documentation/devicetree/bindings/drm/fsl-dcu/fsl,dcu.txt<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..bdc7d5b<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/Documentation/devicetree/bindings/drm/fsl-dcu/fsl,dcu.txt<o:p></o:p></pre>
<pre>@@ -0,0 +1,49 @@<o:p></o:p></pre>
<pre>+Device Tree bindings for Freescale DCU DRM Driver<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+Required properties:<o:p></o:p></pre>
<pre>+- compatible:           Should be one of<o:p></o:p></pre>
<pre>+       * "fsl,ls1021a-dcu".<o:p></o:p></pre>
<pre>+       * "fsl,vf610-dcu".<o:p></o:p></pre>
<pre>+- reg:                  Address and length of the register set for dcu.<o:p></o:p></pre>
<pre>+- clocks:               From common clock binding: handle to dcu clock.<o:p></o:p></pre>
<pre>+- clock-names:          From common clock binding: Shall be "dcu".<o:p></o:p></pre>
<pre>+- display:              The phandle to display node.<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+Required properties:<o:p></o:p></pre>
<pre>+- bits-per-pixel:       <16> for RGB565,<o:p></o:p></pre>
<pre>+                       <24> for RGB888,<o:p></o:p></pre>
<pre>+                       <32> for RGB8888.<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+Required timing node for dispplay sub-node:<o:p></o:p></pre>
<pre>+- display-timings:      Refer to binding doc display-timing.txt for details.<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+Examples:<o:p></o:p></pre>
<pre>+dcu: dcu@2ce0000 {<o:p></o:p></pre>
<pre>+       compatible = "fsl,ls1021a-dcu";<o:p></o:p></pre>
<pre>+       reg = <0x0 0x2ce0000 0x0 0x10000>;<o:p></o:p></pre>
<pre>+       clocks = <&platform_clk 0>;<o:p></o:p></pre>
<pre>+       clock-names = "dcu";<o:p></o:p></pre>
<pre>+       big-endian;<o:p></o:p></pre>
<pre>+       display = <&display>;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       display: display@0 {<o:p></o:p></pre>
<pre>+               bits-per-pixel = <24>;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+               display-timings {<o:p></o:p></pre>
<pre>+                       native-mode = <&timing0>;<o:p></o:p></pre>
<pre>+                       timing0: nl4827hc19 {<o:p></o:p></pre>
<pre>+                              clock-frequency = <10870000>;<o:p></o:p></pre>
<pre>+                              hactive = <480>;<o:p></o:p></pre>
<pre>+                              vactive = <272>;<o:p></o:p></pre>
<pre>+                              hback-porch = <2>;<o:p></o:p></pre>
<pre>+                              hfront-porch = <2>;<o:p></o:p></pre>
<pre>+                              vback-porch = <1>;<o:p></o:p></pre>
<pre>+                              vfront-porch = <1>;<o:p></o:p></pre>
<pre>+                              hsync-len = <41>;<o:p></o:p></pre>
<pre>+                              vsync-len = <2>;<o:p></o:p></pre>
<pre>+                              hsync-active = <1>;<o:p></o:p></pre>
<pre>+                              vsync-active = <1>;<o:p></o:p></pre>
<pre>+                       };<o:p></o:p></pre>
<pre>+               };<o:p></o:p></pre>
<pre>+       };<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>diff --git a/MAINTAINERS b/MAINTAINERS<o:p></o:p></pre>
<pre>index 885be14..a6cff2f4 100644<o:p></o:p></pre>
<pre>--- a/MAINTAINERS<o:p></o:p></pre>
<pre>+++ b/MAINTAINERS<o:p></o:p></pre>
<pre>@@ -3398,6 +3398,14 @@ S:      Maintained<o:p></o:p></pre>
<pre> F:     drivers/gpu/drm/imx/<o:p></o:p></pre>
<pre> F:     Documentation/devicetree/bindings/drm/imx/<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+DRM DRIVERS FOR FREESCALE DCU<o:p></o:p></pre>
<pre>+M:     Jianwei Wang <a href="mailto:jianwei.wang@freescale.com"><jianwei.wang@freescale.com></a><o:p></o:p></pre>
<pre>+M:     Alison Wang <a href="mailto:alison.wang@freescale.com"><alison.wang@freescale.com></a><o:p></o:p></pre>
<pre>+L:     <a href="mailto:dri-devel@lists.freedesktop.org">dri-devel@lists.freedesktop.org</a><o:p></o:p></pre>
<pre>+S:     Supported<o:p></o:p></pre>
<pre>+F:     drivers/gpu/drm/fsl-dcu/<o:p></o:p></pre>
<pre>+F:     Documentation/devicetree/bindings/drm/fsl-dcu/<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> DRM DRIVERS FOR NVIDIA TEGRA<o:p></o:p></pre>
<pre> M:     Thierry Reding <a href="mailto:thierry.reding@gmail.com"><thierry.reding@gmail.com></a><o:p></o:p></pre>
<pre> M:     Terje Bergström <a href="mailto:tbergstrom@nvidia.com"><tbergstrom@nvidia.com></a><o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig index 151a050..e64cf18 100644<o:p></o:p></pre>
<pre>--- a/drivers/gpu/drm/Kconfig<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/Kconfig<o:p></o:p></pre>
<pre>@@ -199,6 +199,8 @@ source "drivers/gpu/drm/bochs/Kconfig"<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> source "drivers/gpu/drm/msm/Kconfig"<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre>+source "drivers/gpu/drm/fsl-dcu/Kconfig"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre> source "drivers/gpu/drm/tegra/Kconfig"<o:p></o:p></pre>
<pre> <o:p></o:p></pre>
<pre> source "drivers/gpu/drm/panel/Kconfig<a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">"<o:p></o:p></a></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 2c239b9..398eccf 100644<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">--- a/drivers/gpu/drm/Makefile<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">+++ b/drivers/gpu/drm/Makefile<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">@@ -56,6 +56,7 @@ obj-$(CONFIG_DRM_UDL) += udl/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_AST) += ast/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_ARMADA) += armada/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_ATMEL_HLCDC) += atmel-hlcdc/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">+obj-$(CONFIG_DRM_FSL_DCU) += fsl-dcu/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_RCAR_DU) += rcar-du/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_SHMOBILE) +=shmobile/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate"> obj-$(CONFIG_DRM_OMAP) += omapdrm/<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">diff --git a/drivers/gpu/drm/fsl-dcu/Kconfig b/drivers/gpu/drm/fsl-dcu/Kconfig new file mode 100644 index 0000000..e4f8df0<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">--- /dev/null<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">+++ b/drivers/gpu/drm/fsl-dcu/Kconfig<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">@@ -0,0 +1,17 @@<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">+config DRM_FSL_DCU<o:p></o:p></a></span></pre>
<pre><span class="MsoHyperlink"><a href="mailto:diff--gita/drivers/gpu/drm/Makefileb/drivers/gpu/drm/Makefileindex2c239b9..398eccf100644---a/drivers/gpu/drm/Makefile+++b/drivers/gpu/drm/Makefile@@-56,6+56,7@@obj-$(CONFIG_DRM_UDL)+=udl/obj-$(CONFIG_DRM_AST)+=ast/obj-$(CONFIG_DRM_ARMADA)+=armada/obj-$(CONFIG_DRM_ATMEL_HLCDC)+=atmel-hlcdc/+obj-$(CONFIG_DRM_FSL_DCU)+=fsl-dcu/obj-$(CONFIG_DRM_RCAR_DU)+=rcar-du/obj-$(CONFIG_DRM_SHMOBILE)+=shmobile/obj-$(CONFIG_DRM_OMAP)+=omapdrm/diff--gita/drivers/gpu/drm/fsl-dcu/Kconfigb/drivers/gpu/drm/fsl-dcu/Kconfignewfilemode100644index0000000..e4f8df0---/dev/null+++b/drivers/gpu/drm/fsl-dcu/Kconfig@@-0,0+1,17@@+configDRM_FSL_DCU+tristate">+       tristate "</a></span>DRM Support for Freescale DCU"<o:p></o:p></pre>
<pre>+       depends on DRM && OF && ARM<o:p></o:p></pre>
<pre>+       select DRM_KMS_HELPER<o:p></o:p></pre>
<pre>+       select DRM_KMS_CMA_HELPER<o:p></o:p></pre>
<pre>+       select VIDEOMODE_HELPERS<o:p></o:p></pre>
<pre>+       select BACKLIGHT_CLASS_DEVICE<o:p></o:p></pre>
<pre>+       select BACKLIGHT_LCD_SUPPORT<o:p></o:p></pre>
<pre>+       select REGMAP_MMIO<o:p></o:p></pre>
<pre>+       select DRM_KMS_FB_HELPER<o:p></o:p></pre>
<pre>+       select FB_SYS_FILLRECT<o:p></o:p></pre>
<pre>+       select FB_SYS_COPYAREA<o:p></o:p></pre>
<pre>+       select FB_SYS_IMAGEBLIT<o:p></o:p></pre>
<pre>+       select FB_SYS_FOPS<o:p></o:p></pre>
<pre>+       help<o:p></o:p></pre>
<pre>+         Choose this option if you have an Freescale DCU chipset.<o:p></o:p></pre>
<pre>+         If M is selected the module will be called fsl-dcu-drm.<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/Makefile b/drivers/gpu/drm/fsl-dcu/Makefile<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..336b4a6<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/Makefile<o:p></o:p></pre>
<pre>@@ -0,0 +1,7 @@<o:p></o:p></pre>
<pre>+fsl-dcu-drm-y := fsl_dcu_drm_drv.o \<o:p></o:p></pre>
<pre>+              fsl_dcu_drm_kms.o \<o:p></o:p></pre>
<pre>+              fsl_dcu_drm_connector.o \<o:p></o:p></pre>
<pre>+              fsl_dcu_drm_plane.o \<o:p></o:p></pre>
<pre>+              fsl_dcu_drm_crtc.o \<o:p></o:p></pre>
<pre>+              fsl_dcu_drm_fbdev.o<o:p></o:p></pre>
<pre>+obj-$(CONFIG_DRM_FSL_DCU)     += fsl-dcu-drm.o<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.c<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..799682d<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.c<o:p></o:p></pre>
<pre>@@ -0,0 +1,194 @@<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright 2015 Freescale Semiconductor, Inc.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Freescale DCU drm device driver<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This program is free software; you can redistribute it and/or modify<o:p></o:p></pre>
<pre>+ * it under the terms of the GNU General Public License as published by<o:p></o:p></pre>
<pre>+ * the Free Software Foundation; either version 2 of the License, or<o:p></o:p></pre>
<pre>+ * (at your option) any later version.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <linux/backlight.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drmP.h><o:p></o:p></pre>
<pre>+#include <drm/drm_atomic_helper.h><o:p></o:p></pre>
<pre>+#include <video/of_display_timing.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_drv.h"<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_connector.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_dpms(struct drm_encoder *encoder, int <o:p></o:p></pre>
<pre>+mode) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_mode_prepare(struct drm_encoder <o:p></o:p></pre>
<pre>+*encoder) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_mode_set(struct drm_encoder *encoder,<o:p></o:p></pre>
<pre>+                                       struct drm_display_mode *mode,<o:p></o:p></pre>
<pre>+                                       struct drm_display_mode *adjusted_mode) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_mode_commit(struct drm_encoder <o:p></o:p></pre>
<pre>+*encoder) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_disable(struct drm_encoder *encoder) { <o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int<o:p></o:p></pre>
<pre>+fsl_dcu_drm_encoder_atomic_check(struct drm_encoder *encoder,<o:p></o:p></pre>
<pre>+                               struct drm_crtc_state *crtc_state,<o:p></o:p></pre>
<pre>+                               struct drm_connector_state *conn_state) {<o:p></o:p></pre>
<pre>+       return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_encoder_destroy(struct drm_encoder *encoder) {<o:p></o:p></pre>
<pre>+       drm_encoder_cleanup(encoder);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_encoder_helper_funcs encoder_helper_funcs = {<o:p></o:p></pre>
<pre>+       .dpms = fsl_dcu_drm_encoder_dpms,<o:p></o:p></pre>
<pre>+       .prepare = fsl_dcu_drm_encoder_mode_prepare,<o:p></o:p></pre>
<pre>+       .commit = fsl_dcu_drm_encoder_mode_commit,<o:p></o:p></pre>
<pre>+       .mode_set = fsl_dcu_drm_encoder_mode_set,<o:p></o:p></pre>
<pre>+       .disable = fsl_dcu_drm_encoder_disable,<o:p></o:p></pre>
<pre>+       .atomic_check = fsl_dcu_drm_encoder_atomic_check, };<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_encoder_funcs encoder_funcs = {<o:p></o:p></pre>
<pre>+       .destroy = fsl_dcu_drm_encoder_destroy, };<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_encoder_create(struct fsl_dcu_drm_device *fsl_dev,<o:p></o:p></pre>
<pre>+                              struct drm_crtc *crtc)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+       struct drm_encoder *encoder = &fsl_dev->encoder;<o:p></o:p></pre>
<pre>+       int ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       encoder->possible_crtcs = 1;<o:p></o:p></pre>
<pre>+       ret = drm_encoder_init(fsl_dev->ddev, encoder, &encoder_funcs,<o:p></o:p></pre>
<pre>+                              DRM_MODE_ENCODER_LVDS);<o:p></o:p></pre>
<pre>+       if (ret < 0)<o:p></o:p></pre>
<pre>+               return ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       drm_encoder_helper_add(encoder, &encoder_helper_funcs);<o:p></o:p></pre>
<pre>+       encoder->crtc = crtc;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#define to_fsl_dcu_connector(connector) \<o:p></o:p></pre>
<pre>+       container_of(connector, struct fsl_dcu_drm_connector, connector)<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_connector_get_modes(struct drm_connector <o:p></o:p></pre>
<pre>+*connector) {<o:p></o:p></pre>
<pre>+       struct drm_device *dev = connector->dev;<o:p></o:p></pre>
<pre>+       struct device_node *display_np, *np = dev->dev->of_node;<o:p></o:p></pre>
<pre>+       struct drm_display_mode *mode = drm_mode_create(connector->dev);<o:p></o:p></pre>
<pre>+       int num_modes = 0;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+       if (np) {<o:p></o:p></pre>
<pre>+               display_np = of_parse_phandle(np, "display", 0);<o:p></o:p></pre>
<pre>+               if (!display_np) {<o:p></o:p></pre>
<pre>+                       dev_err(dev->dev, "failed to find display phandle\n");<o:p></o:p></pre>
<pre>+                       return num_modes;<o:p></o:p></pre>
<pre>+               }<o:p></o:p></pre>
</blockquote>
<p class="MsoNormal">Use panel-simple driver instead the display node timing I think is better.<br>
See Documentation/devicetree/bindings/panel/simple-panel.txt and<br>
       drivers/gpu/drm/panel/panel-simple.c<br>
<br>
Panel info add into panel driver, other people will easy to reuse the panel. <br>
<br>
<b><i><span style="color:#1F497D"> </span></i></b><span style="color:#1F497D">got it.</span><o:p></o:p></p>
<pre><o:p> </o:p></pre>
<pre>+             of_get_drm_display_mode(display_np, mode, OF_USE_NATIVE_MODE);<o:p></o:p></pre>
<pre>+             mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED,<o:p></o:p></pre>
<pre>+             drm_mode_probed_add(connector, mode);<o:p></o:p></pre>
<pre>+             num_modes++;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return num_modes;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_connector_mode_valid(struct drm_connector *connector,<o:p></o:p></pre>
<pre>+                                        struct drm_display_mode *mode) {<o:p></o:p></pre>
<pre>+      return MODE_OK;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static struct drm_encoder *<o:p></o:p></pre>
<pre>+fsl_dcu_drm_connector_best_encoder(struct drm_connector *connector) {<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_connector *fsl_con = <o:p></o:p></pre>
<pre>+to_fsl_dcu_connector(connector);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return fsl_con->encoder;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_connector_destroy(struct drm_connector <o:p></o:p></pre>
<pre>+*connector) {<o:p></o:p></pre>
<pre>+      drm_connector_unregister(connector);<o:p></o:p></pre>
<pre>+      drm_connector_cleanup(connector);<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static enum drm_connector_status<o:p></o:p></pre>
<pre>+fsl_dcu_drm_connector_detect(struct drm_connector *connector, bool <o:p></o:p></pre>
<pre>+force) {<o:p></o:p></pre>
<pre>+      return connector_status_connected;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_connector_funcs fsl_dcu_drm_connector_funcs = {<o:p></o:p></pre>
<pre>+      .dpms = drm_atomic_helper_connector_dpms,<o:p></o:p></pre>
<pre>+      .reset = drm_atomic_helper_connector_reset,<o:p></o:p></pre>
<pre>+      .detect = fsl_dcu_drm_connector_detect,<o:p></o:p></pre>
<pre>+      .fill_modes = drm_helper_probe_single_connector_modes,<o:p></o:p></pre>
<pre>+      .destroy = fsl_dcu_drm_connector_destroy,<o:p></o:p></pre>
<pre>+      .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,<o:p></o:p></pre>
<pre>+      .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_connector_helper_funcs connector_helper_funcs = {<o:p></o:p></pre>
<pre>+      .get_modes = fsl_dcu_drm_connector_get_modes,<o:p></o:p></pre>
<pre>+      .mode_valid = fsl_dcu_drm_connector_mode_valid,<o:p></o:p></pre>
<pre>+      .best_encoder = fsl_dcu_drm_connector_best_encoder,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_connector_create(struct fsl_dcu_drm_device *fsl_dev,<o:p></o:p></pre>
<pre>+                              struct drm_encoder *encoder)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      struct drm_connector *connector = &fsl_dev->connector.connector;<o:p></o:p></pre>
<pre>+      int ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dev->connector.encoder = encoder;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      connector->display_info.width_mm = 0;<o:p></o:p></pre>
<pre>+      connector->display_info.height_mm = 0;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      ret = drm_connector_init(fsl_dev->ddev, connector,<o:p></o:p></pre>
<pre>+                              &fsl_dcu_drm_connector_funcs,<o:p></o:p></pre>
<pre>+                              DRM_MODE_CONNECTOR_LVDS);<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             return ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      connector->dpms = DRM_MODE_DPMS_OFF;<o:p></o:p></pre>
<pre>+      drm_connector_helper_add(connector, &connector_helper_funcs);<o:p></o:p></pre>
<pre>+      ret = drm_connector_register(connector);<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             goto err_cleanup;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      ret = drm_mode_connector_attach_encoder(connector, encoder);<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             goto err_sysfs;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      connector->encoder = encoder;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      drm_object_property_set_value<o:p></o:p></pre>
<pre>+             (&connector->base, fsl_dev->ddev->mode_config.dpms_property,<o:p></o:p></pre>
<pre>+             DRM_MODE_DPMS_OFF);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+err_sysfs:<o:p></o:p></pre>
<pre>+      drm_connector_unregister(connector);<o:p></o:p></pre>
<pre>+err_cleanup:<o:p></o:p></pre>
<pre>+      drm_connector_cleanup(connector);<o:p></o:p></pre>
<pre>+      return ret;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.h b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.h<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..8141a29<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_connector.h<o:p></o:p></pre>
<pre>@@ -0,0 +1,30 @@<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright 2015 Freescale Semiconductor, Inc.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Freescale DCU drm device driver<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This program is free software; you can redistribute it and/or modify<o:p></o:p></pre>
<pre>+ * it under the terms of the GNU General Public License as published by<o:p></o:p></pre>
<pre>+ * the Free Software Foundation; either version 2 of the License, or<o:p></o:p></pre>
<pre>+ * (at your option) any later version.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#ifndef __FSL_DCU_DRM_CONNECTOR_H__<o:p></o:p></pre>
<pre>+#define __FSL_DCU_DRM_CONNECTOR_H__<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drmP.h><o:p></o:p></pre>
<pre>+#include <drm/drm_crtc.h><o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_crtc.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct fsl_dcu_drm_device;<o:p></o:p></pre>
<pre>+struct fsl_dcu_drm_connector {<o:p></o:p></pre>
<pre>+      struct drm_connector connector;<o:p></o:p></pre>
<pre>+      struct drm_encoder *encoder;<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_encoder_create(struct fsl_dcu_drm_device *fsl_dev,<o:p></o:p></pre>
<pre>+                            struct drm_crtc *crtc);<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_connector_create(struct fsl_dcu_drm_device *fsl_dev,<o:p></o:p></pre>
<pre>+                              struct drm_encoder *encoder);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#endif /* __FSL_DCU_DRM_CONNECTOR_H__ */<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..4065a7c<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c<o:p></o:p></pre>
<pre>@@ -0,0 +1,172 @@<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright 2015 Freescale Semiconductor, Inc.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Freescale DCU drm device driver<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This program is free software; you can redistribute it and/or modify<o:p></o:p></pre>
<pre>+ * it under the terms of the GNU General Public License as published by<o:p></o:p></pre>
<pre>+ * the Free Software Foundation; either version 2 of the License, or<o:p></o:p></pre>
<pre>+ * (at your option) any later version.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <linux/regmap.h><o:p></o:p></pre>
<pre>+#include <linux/clk.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drmP.h><o:p></o:p></pre>
<pre>+#include <drm/drm_atomic.h><o:p></o:p></pre>
<pre>+#include <drm/drm_atomic_helper.h><o:p></o:p></pre>
<pre>+#include <drm/drm_crtc.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_crtc.h"<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_drv.h"<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_plane.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#define to_fsl_dcu_crtc(c)   container_of(c, struct fsl_dcu_drm_crtc, crtc)<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) {<o:p></o:p></pre>
<pre>+      struct drm_device *dev = crtc->dev;<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;<o:p></o:p></pre>
<pre>+      struct drm_display_mode *mode = &crtc->state->mode;<o:p></o:p></pre>
<pre>+      uint32_t hbp, hfp, hsw, vbp, vfp, vsw, div, index;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      DBG(": set mode: %d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",<o:p></o:p></pre>
<pre>+          mode->base.id, mode->name,<o:p></o:p></pre>
<pre>+          mode->vrefresh, mode->clock,<o:p></o:p></pre>
<pre>+          mode->hdisplay, mode->hsync_start,<o:p></o:p></pre>
<pre>+          mode->hsync_end, mode->htotal,<o:p></o:p></pre>
<pre>+          mode->vdisplay, mode->vsync_start,<o:p></o:p></pre>
<pre>+          mode->vsync_end, mode->vtotal,<o:p></o:p></pre>
<pre>+          mode->type, mode->flags);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      index = drm_crtc_index(crtc);<o:p></o:p></pre>
<pre>+      div = (uint32_t)clk_get_rate(fsl_dev->clk) / mode->clock / 1000;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      /* Configure timings: */<o:p></o:p></pre>
<pre>+      hbp = mode->htotal - mode->hsync_end;<o:p></o:p></pre>
<pre>+      hfp = mode->hsync_start - mode->hdisplay;<o:p></o:p></pre>
<pre>+      hsw = mode->hsync_end - mode->hsync_start;<o:p></o:p></pre>
<pre>+      vbp = mode->vtotal - mode->vsync_end;<o:p></o:p></pre>
<pre>+      vfp = mode->vsync_start - mode->vdisplay;<o:p></o:p></pre>
<pre>+      vsw = mode->vsync_end - mode->vsync_start;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_HSYN_PARA,<o:p></o:p></pre>
<pre>+                  DCU_HSYN_PARA_BP(hbp) |<o:p></o:p></pre>
<pre>+                  DCU_HSYN_PARA_PW(hsw) |<o:p></o:p></pre>
<pre>+                  DCU_HSYN_PARA_FP(hfp));<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_VSYN_PARA,<o:p></o:p></pre>
<pre>+                  DCU_VSYN_PARA_BP(vbp) |<o:p></o:p></pre>
<pre>+                  DCU_VSYN_PARA_PW(vsw) |<o:p></o:p></pre>
<pre>+                  DCU_VSYN_PARA_FP(vfp));<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_DISP_SIZE,<o:p></o:p></pre>
<pre>+                  DCU_DISP_SIZE_DELTA_Y(mode->vdisplay) |<o:p></o:p></pre>
<pre>+                  DCU_DISP_SIZE_DELTA_X(mode->hdisplay));<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_DIV_RATIO, div);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, <o:p></o:p></pre>
<pre>+DCU_UPDATE_MODE_READREG); }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static bool fsl_dcu_drm_crtc_mode_fixup(struct drm_crtc *crtc,<o:p></o:p></pre>
<pre>+                                    const struct drm_display_mode *mode,<o:p></o:p></pre>
<pre>+                                    struct drm_display_mode *adjusted_mode) {<o:p></o:p></pre>
<pre>+      return true;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_crtc_prepare(struct drm_crtc *crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+/* Now enable the clocks, plane, pipe, and connectors that we set up. <o:p></o:p></pre>
<pre>+*/ static void fsl_dcu_drm_crtc_mode_commit(struct drm_crtc *crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_crtc_atomic_check(struct drm_crtc *crtc,<o:p></o:p></pre>
<pre>+                                     struct drm_crtc_state *state)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_crtc_atomic_begin(struct drm_crtc *crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_crtc_dpms(struct drm_crtc *crtc, int mode) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_crtc_funcs fsl_dcu_drm_crtc_funcs = {<o:p></o:p></pre>
<pre>+      .page_flip = drm_atomic_helper_page_flip,<o:p></o:p></pre>
<pre>+      .set_config = drm_atomic_helper_set_config,<o:p></o:p></pre>
<pre>+      .destroy = drm_crtc_cleanup,<o:p></o:p></pre>
<pre>+      .reset = drm_atomic_helper_crtc_reset,<o:p></o:p></pre>
<pre>+      .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state,<o:p></o:p></pre>
<pre>+      .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs = {<o:p></o:p></pre>
<pre>+      .disable = fsl_dcu_drm_disable_crtc,<o:p></o:p></pre>
<pre>+      .mode_fixup = fsl_dcu_drm_crtc_mode_fixup,<o:p></o:p></pre>
<pre>+      .mode_set = drm_helper_crtc_mode_set,<o:p></o:p></pre>
<pre>+      .mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb,<o:p></o:p></pre>
<pre>+      .mode_set_base = drm_helper_crtc_mode_set_base,<o:p></o:p></pre>
<pre>+      .prepare = fsl_dcu_drm_crtc_prepare,<o:p></o:p></pre>
<pre>+      .commit = fsl_dcu_drm_crtc_mode_commit,<o:p></o:p></pre>
<pre>+      .atomic_check = fsl_dcu_drm_crtc_atomic_check,<o:p></o:p></pre>
<pre>+      .atomic_begin = fsl_dcu_drm_crtc_atomic_begin,<o:p></o:p></pre>
<pre>+      .atomic_flush = fsl_dcu_drm_crtc_atomic_flush,<o:p></o:p></pre>
<pre>+      .dpms = fsl_dcu_drm_crtc_dpms,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_crtc_create(struct fsl_dcu_drm_device *fsl_dev) {<o:p></o:p></pre>
<pre>+      struct drm_plane *primary;<o:p></o:p></pre>
<pre>+      struct drm_crtc *crtc = &fsl_dev->crtc;<o:p></o:p></pre>
<pre>+      int i, ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      primary = fsl_dcu_drm_primary_create_plane(fsl_dev->ddev);<o:p></o:p></pre>
<pre>+      ret = drm_crtc_init_with_planes(fsl_dev->ddev, crtc, primary, NULL,<o:p></o:p></pre>
<pre>+                                    &fsl_dcu_drm_crtc_funcs);<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             return ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      drm_crtc_helper_add(crtc, &fsl_dcu_drm_crtc_helper_funcs);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      for (i = 0; i < DCU_TOTAL_LAYER_NUM; i++) {<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_1(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_2(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_3(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_4(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_5(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_6(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_7(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_8(i), 0);<o:p></o:p></pre>
<pre>+             regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_9(i), 0);<o:p></o:p></pre>
<pre>+             if (of_device_is_compatible(fsl_dev->np, "fsl,ls1021a-dcu"))<o:p></o:p></pre>
<pre>+                     regmap_write(fsl_dev->regmap, DCU_CTRLDESCLN_10(i), 0);<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_SYN_POL,<o:p></o:p></pre>
<pre>+                  DCU_SYN_POL_INV_VS_LOW | DCU_SYN_POL_INV_HS_LOW);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_BGND, DCU_BGND_R(0) |<o:p></o:p></pre>
<pre>+                  DCU_BGND_G(0) | DCU_BGND_B(0));<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_DCU_MODE,<o:p></o:p></pre>
<pre>+                  DCU_MODE_BLEND_ITER(1) | DCU_MODE_RASTER_EN);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_THRESHOLD,<o:p></o:p></pre>
<pre>+                  DCU_THRESHOLD_LS_BF_VS(BF_VS_VAL) |<o:p></o:p></pre>
<pre>+                  DCU_THRESHOLD_OUT_BUF_HIGH(BUF_MAX_VAL) |<o:p></o:p></pre>
<pre>+                  DCU_THRESHOLD_OUT_BUF_LOW(BUF_MIN_VAL));<o:p></o:p></pre>
<pre>+      regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,<o:p></o:p></pre>
<pre>+                        DCU_MODE_DCU_MODE_MASK,<o:p></o:p></pre>
<pre>+                        DCU_MODE_DCU_MODE(DCU_MODE_OFF));<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, <o:p></o:p></pre>
<pre>+DCU_UPDATE_MODE_READREG);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..193785f<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.h<o:p></o:p></pre>
<pre>@@ -0,0 +1,22 @@<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright 2015 Freescale Semiconductor, Inc.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Freescale DCU drm device driver<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This program is free software; you can redistribute it and/or modify<o:p></o:p></pre>
<pre>+ * it under the terms of the GNU General Public License as published by<o:p></o:p></pre>
<pre>+ * the Free Software Foundation; either version 2 of the License, or<o:p></o:p></pre>
<pre>+ * (at your option) any later version.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#ifndef __FSL_DCU_DRM_CRTC_H__<o:p></o:p></pre>
<pre>+#define __FSL_DCU_DRM_CRTC_H__<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drmP.h><o:p></o:p></pre>
<pre>+#include <drm/drm_crtc.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+struct fsl_dcu_drm_device;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+int fsl_dcu_drm_crtc_create(struct fsl_dcu_drm_device *fsl_dev);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#endif /* __FSL_DCU_DRM_CRTC_H__ */<o:p></o:p></pre>
<pre>diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c<o:p></o:p></pre>
<pre>new file mode 100644<o:p></o:p></pre>
<pre>index 0000000..1edf7be<o:p></o:p></pre>
<pre>--- /dev/null<o:p></o:p></pre>
<pre>+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c<o:p></o:p></pre>
<pre>@@ -0,0 +1,373 @@<o:p></o:p></pre>
<pre>+/*<o:p></o:p></pre>
<pre>+ * Copyright 2015 Freescale Semiconductor, Inc.<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * Freescale DCU drm device driver<o:p></o:p></pre>
<pre>+ *<o:p></o:p></pre>
<pre>+ * This program is free software; you can redistribute it and/or modify<o:p></o:p></pre>
<pre>+ * it under the terms of the GNU General Public License as published by<o:p></o:p></pre>
<pre>+ * the Free Software Foundation; either version 2 of the License, or<o:p></o:p></pre>
<pre>+ * (at your option) any later version.<o:p></o:p></pre>
<pre>+ */<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <linux/clk.h><o:p></o:p></pre>
<pre>+#include <linux/io.h><o:p></o:p></pre>
<pre>+#include <linux/mm.h><o:p></o:p></pre>
<pre>+#include <linux/module.h><o:p></o:p></pre>
<pre>+#include <linux/of_platform.h><o:p></o:p></pre>
<pre>+#include <linux/platform_device.h><o:p></o:p></pre>
<pre>+#include <linux/pm.h><o:p></o:p></pre>
<pre>+#include <linux/pm_runtime.h><o:p></o:p></pre>
<pre>+#include <linux/regmap.h><o:p></o:p></pre>
<pre>+#include <linux/mfd/syscon.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include <drm/drmP.h><o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_drv.h"<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_crtc.h"<o:p></o:p></pre>
<pre>+#include "fsl_dcu_drm_kms.h"<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_unload(struct drm_device *dev) {<o:p></o:p></pre>
<pre>+      drm_mode_config_cleanup(dev);<o:p></o:p></pre>
<pre>+      drm_vblank_cleanup(dev);<o:p></o:p></pre>
<pre>+      drm_irq_uninstall(dev);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      dev->dev_private = NULL;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static struct regmap_config fsl_dcu_regmap_config = {<o:p></o:p></pre>
<pre>+      .reg_bits = 32,<o:p></o:p></pre>
<pre>+      .reg_stride = 4,<o:p></o:p></pre>
<pre>+      .val_bits = 32,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_bypass_tcon(struct fsl_dcu_drm_device *fsl_dev,<o:p></o:p></pre>
<pre>+                            struct device_node *np)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      struct device_node *tcon_np;<o:p></o:p></pre>
<pre>+      struct platform_device *pdev;<o:p></o:p></pre>
<pre>+      struct clk *tcon_clk;<o:p></o:p></pre>
<pre>+      struct resource *res;<o:p></o:p></pre>
<pre>+      void __iomem *base;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      tcon_np = of_parse_phandle(np, "tcon-controller", 0);<o:p></o:p></pre>
<pre>+      if (!tcon_np)<o:p></o:p></pre>
<pre>+             return -EINVAL;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      pdev = of_find_device_by_node(tcon_np);<o:p></o:p></pre>
<pre>+      if (!pdev)<o:p></o:p></pre>
<pre>+             return -EINVAL;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      tcon_clk = devm_clk_get(&pdev->dev, "tcon");<o:p></o:p></pre>
<pre>+      if (IS_ERR(tcon_clk))<o:p></o:p></pre>
<pre>+             return PTR_ERR(tcon_clk);<o:p></o:p></pre>
<pre>+      clk_prepare_enable(tcon_clk);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);<o:p></o:p></pre>
<pre>+      if (!res)<o:p></o:p></pre>
<pre>+             return -ENODEV;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      base = devm_ioremap_resource(&pdev->dev, res);<o:p></o:p></pre>
<pre>+      if (IS_ERR(base))<o:p></o:p></pre>
<pre>+             return PTR_ERR(base);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dev->tcon_regmap = devm_regmap_init_mmio(&pdev->dev,<o:p></o:p></pre>
<pre>+                     base, &fsl_dcu_regmap_config);<o:p></o:p></pre>
<pre>+      if (IS_ERR(fsl_dev->tcon_regmap)) {<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "regmap init failed\n");<o:p></o:p></pre>
<pre>+             return PTR_ERR(fsl_dev->tcon_regmap);<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->tcon_regmap, TCON_CTRL1, TCON_BYPASS_ENABLE);<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void dcu_pixclk_enable(void)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      struct regmap *scfg_regmap;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      scfg_regmap = syscon_regmap_lookup_by_compatible("fsl,ls1021a-scfg");<o:p></o:p></pre>
<pre>+      if (IS_ERR(scfg_regmap)) {<o:p></o:p></pre>
<pre>+             pr_err("No syscfg phandle specified\n");<o:p></o:p></pre>
<pre>+             return;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(scfg_regmap, SCFG_PIXCLKCR, PXCK_ENABLE); }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_irq_init(struct drm_device *dev) {<o:p></o:p></pre>
<pre>+      struct platform_device *pdev = dev->platformdev;<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;<o:p></o:p></pre>
<pre>+      unsigned int int_mask;<o:p></o:p></pre>
<pre>+      int ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      ret = drm_irq_install(dev, platform_get_irq(dev->platformdev, 0));<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "failed to install IRQ handler\n");<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      dev->irq_enabled = true;<o:p></o:p></pre>
<pre>+      dev->vblank_disable_allowed = true;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0);<o:p></o:p></pre>
<pre>+      regmap_read(fsl_dev->regmap, DCU_INT_MASK, &int_mask);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_INT_MASK, int_mask &<o:p></o:p></pre>
<pre>+                  ~DCU_INT_MASK_VBLANK);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, <o:p></o:p></pre>
<pre>+DCU_UPDATE_MODE_READREG);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_load(struct drm_device *dev, unsigned long flags) {<o:p></o:p></pre>
<pre>+      struct platform_device *pdev = dev->platformdev;<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_device *fsl_dev;<o:p></o:p></pre>
<pre>+      struct resource *res;<o:p></o:p></pre>
<pre>+      void __iomem *base;<o:p></o:p></pre>
<pre>+      int ret;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dev = devm_kzalloc(&pdev->dev, sizeof(*fsl_dev), GFP_KERNEL);<o:p></o:p></pre>
<pre>+      if (!fsl_dev)<o:p></o:p></pre>
<pre>+             return -ENOMEM;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dev->dev = &pdev->dev;<o:p></o:p></pre>
<pre>+      fsl_dev->ddev = dev;<o:p></o:p></pre>
<pre>+      fsl_dev->np = pdev->dev.of_node;<o:p></o:p></pre>
<pre>+      dev->dev_private = fsl_dev;<o:p></o:p></pre>
<pre>+      dev_set_drvdata(dev->dev, fsl_dev);<o:p></o:p></pre>
<pre>+      drm_dev_set_unique(dev, dev_name(dev->dev));<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);<o:p></o:p></pre>
<pre>+      if (!res) {<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "could not get memory IO resource\n");<o:p></o:p></pre>
<pre>+             return -ENODEV;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      base = devm_ioremap_resource(&pdev->dev, res);<o:p></o:p></pre>
<pre>+      if (IS_ERR(base)) {<o:p></o:p></pre>
<pre>+             ret = PTR_ERR(base);<o:p></o:p></pre>
<pre>+             return ret;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dev->clk = devm_clk_get(&pdev->dev, "dcu");<o:p></o:p></pre>
<pre>+      if (IS_ERR(fsl_dev->clk)) {<o:p></o:p></pre>
<pre>+             ret = PTR_ERR(fsl_dev->clk);<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "could not get clock\n");<o:p></o:p></pre>
<pre>+             return ret;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+      clk_prepare_enable(fsl_dev->clk);<o:p></o:p></pre>
<pre>+      fsl_dev->regmap = devm_regmap_init_mmio(&pdev->dev, base,<o:p></o:p></pre>
<pre>+                     &fsl_dcu_regmap_config);<o:p></o:p></pre>
<pre>+      if (IS_ERR(fsl_dev->regmap)) {<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "regmap init failed\n");<o:p></o:p></pre>
<pre>+             return PTR_ERR(fsl_dev->regmap);<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      /* Put TCON in bypass mode, so the input signals from DCU are passed<o:p></o:p></pre>
<pre>+       * through TCON unchanged */<o:p></o:p></pre>
<pre>+      fsl_dcu_bypass_tcon(fsl_dev, fsl_dev->np);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      if (of_device_is_compatible(fsl_dev->np, "fsl,ls1021a-dcu"))<o:p></o:p></pre>
<pre>+             dcu_pixclk_enable();<o:p></o:p></pre>
<pre>+      ret = fsl_dcu_drm_modeset_init(fsl_dev);<o:p></o:p></pre>
<pre>+      if (ret < 0) {<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "failed to initialize mode setting\n");<o:p></o:p></pre>
<pre>+             return ret;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      ret = drm_vblank_init(dev, dev->mode_config.num_crtc);<o:p></o:p></pre>
<pre>+      if (ret < 0) {<o:p></o:p></pre>
<pre>+             dev_err(&pdev->dev, "failed to initialize vblank\n");<o:p></o:p></pre>
<pre>+             goto done;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      ret = fsl_dcu_drm_irq_init(dev);<o:p></o:p></pre>
<pre>+      if (ret < 0)<o:p></o:p></pre>
<pre>+             goto done;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      fsl_dcu_fbdev_init(dev);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+done:<o:p></o:p></pre>
<pre>+      if (ret)<o:p></o:p></pre>
<pre>+             fsl_dcu_unload(dev);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return ret;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_preclose(struct drm_device *dev, struct <o:p></o:p></pre>
<pre>+drm_file *file) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg) {<o:p></o:p></pre>
<pre>+      struct drm_device *dev = arg;<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;<o:p></o:p></pre>
<pre>+      unsigned int int_status;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_read(fsl_dev->regmap, DCU_INT_STATUS, &int_status);<o:p></o:p></pre>
<pre>+      if (int_status & DCU_INT_STATUS_VBLANK)<o:p></o:p></pre>
<pre>+             drm_handle_vblank(dev, 0);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0xffffffff);<o:p></o:p></pre>
<pre>+      regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, <o:p></o:p></pre>
<pre>+DCU_UPDATE_MODE_READREG);<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      return IRQ_HANDLED;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_enable_vblank(struct drm_device *dev, int crtc) <o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      return 0;<o:p></o:p></pre>
<pre>+}<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static void fsl_dcu_drm_disable_vblank(struct drm_device *dev, int <o:p></o:p></pre>
<pre>+crtc) { }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static const struct file_operations fsl_dcu_drm_fops = {<o:p></o:p></pre>
<pre>+      .owner         = THIS_MODULE,<o:p></o:p></pre>
<pre>+      .open          = drm_open,<o:p></o:p></pre>
<pre>+      .release       = drm_release,<o:p></o:p></pre>
<pre>+      .unlocked_ioctl = drm_ioctl,<o:p></o:p></pre>
<pre>+#ifdef CONFIG_COMPAT<o:p></o:p></pre>
<pre>+      .compat_ioctl  = drm_compat_ioctl,<o:p></o:p></pre>
<pre>+#endif<o:p></o:p></pre>
<pre>+      .poll          = drm_poll,<o:p></o:p></pre>
<pre>+      .read          = drm_read,<o:p></o:p></pre>
<pre>+      .llseek        = no_llseek,<o:p></o:p></pre>
<pre>+      .mmap          = drm_gem_cma_mmap,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static struct drm_driver fsl_dcu_drm_driver = {<o:p></o:p></pre>
<pre>+      .driver_features       = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET<o:p></o:p></pre>
<pre>+                             | DRIVER_PRIME,<o:p></o:p></pre>
<p class="MsoNormal"><br>
Your patch support atomic, I think driver_features need add DRIVER_ATOMIC<br>
<br>
<span style="color:#1F497D">Ok!</span><o:p></o:p></p>
<pre><o:p> </o:p></pre>
<pre>+      .load                  = fsl_dcu_load,<o:p></o:p></pre>
<pre>+      .unload                = fsl_dcu_unload,<o:p></o:p></pre>
<pre>+      .preclose              = fsl_dcu_drm_preclose,<o:p></o:p></pre>
<pre>+      .irq_handler           = fsl_dcu_drm_irq,<o:p></o:p></pre>
<pre>+      .get_vblank_counter    = drm_vblank_count,<o:p></o:p></pre>
<pre>+      .enable_vblank         = fsl_dcu_drm_enable_vblank,<o:p></o:p></pre>
<pre>+      .disable_vblank        = fsl_dcu_drm_disable_vblank,<o:p></o:p></pre>
<pre>+      .gem_free_object       = drm_gem_cma_free_object,<o:p></o:p></pre>
<pre>+      .gem_vm_ops            = &drm_gem_cma_vm_ops,<o:p></o:p></pre>
<pre>+      .prime_handle_to_fd    = drm_gem_prime_handle_to_fd,<o:p></o:p></pre>
<pre>+      .prime_fd_to_handle    = drm_gem_prime_fd_to_handle,<o:p></o:p></pre>
<pre>+      .gem_prime_import      = drm_gem_prime_import,<o:p></o:p></pre>
<pre>+      .gem_prime_export      = drm_gem_prime_export,<o:p></o:p></pre>
<pre>+      .gem_prime_get_sg_table        = drm_gem_cma_prime_get_sg_table,<o:p></o:p></pre>
<pre>+      .gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table,<o:p></o:p></pre>
<pre>+      .gem_prime_vmap        = drm_gem_cma_prime_vmap,<o:p></o:p></pre>
<pre>+      .gem_prime_vunmap      = drm_gem_cma_prime_vunmap,<o:p></o:p></pre>
<pre>+      .gem_prime_mmap        = drm_gem_cma_prime_mmap,<o:p></o:p></pre>
<pre>+      .dumb_create           = drm_gem_cma_dumb_create,<o:p></o:p></pre>
<pre>+      .dumb_map_offset       = drm_gem_cma_dumb_map_offset,<o:p></o:p></pre>
<pre>+      .dumb_destroy          = drm_gem_dumb_destroy,<o:p></o:p></pre>
<pre>+      .fops                  = &fsl_dcu_drm_fops,<o:p></o:p></pre>
<pre>+      .name                  = "fsl-dcu-drm",<o:p></o:p></pre>
<pre>+      .desc                  = "Freescale DCU DRM",<o:p></o:p></pre>
<pre>+      .date                  = "20150213",<o:p></o:p></pre>
<pre>+      .major                 = 1,<o:p></o:p></pre>
<pre>+      .minor                 = 0,<o:p></o:p></pre>
<pre>+};<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+#ifdef CONFIG_PM_SLEEP<o:p></o:p></pre>
<pre>+static void dcu_pixclk_disable(void)<o:p></o:p></pre>
<pre>+{<o:p></o:p></pre>
<pre>+      struct regmap *scfg_regmap;<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      scfg_regmap = syscon_regmap_lookup_by_compatible("fsl,ls1021a-scfg");<o:p></o:p></pre>
<pre>+      if (IS_ERR(scfg_regmap)) {<o:p></o:p></pre>
<pre>+             pr_err("No syscfg phandle specified\n");<o:p></o:p></pre>
<pre>+             return;<o:p></o:p></pre>
<pre>+      }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+      regmap_write(scfg_regmap, SCFG_PIXCLKCR, PXCK_DISABLE); }<o:p></o:p></pre>
<pre>+<o:p></o:p></pre>
<pre>+static int fsl_dcu_drm_pm_suspend(struct device *dev) {<o:p></o:p></pre>
<pre>+      struct fsl_dcu_drm_device *fsl_dev = dev_get_drvdata(dev);<o:p></o:p></pre>
<pre style="white-space:pre-wrap;orphans: auto;text-align:start;widows: 1;-webkit-text-stroke-width: 0px;word-spacing:0px">Andrzej Hajda told me at my drm driver:<o:p></o:p></pre>
<pre style="white-space:pre-wrap;orphans: auto;text-align:start;widows: 1;-webkit-text-stroke-width: 0px;word-spacing:0px"><i>  drm_dev can be NULL here, it can happen when system is suspended<o:p></o:p></i></pre>
<pre><i>  before all components are bound. It can also contain invalid pointer<o:p></o:p></i></pre>
<pre><i>  if after successfull drm initialization de-initialization happens for<o:p></o:p></i></pre>
<pre><i>  some reason.<o:p></o:p></i></pre>
<pre><i><o:p> </o:p></i></pre>
<pre><i>  Some workaround is to check for null here and set drvdata to null on<o:p></o:p></i></pre>
<pre><i>  master unbind. But I guess it should be protected somehow to avoid races<o:p></o:p></i></pre>
<pre><i>  in accessing drvdata.<o:p></o:p></i></pre>
<pre><i><o:p> </o:p></i></pre>
<pre><i>You didn't use components, but maybe </i>fsl_dev can be NULL for some reason as Andrzej said.<span style="color:#1F497D"><o:p></o:p></span></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span></i></b><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p></o:p></span></pre>
<pre>-- <o:p></o:p></pre>
<pre><span lang="ZH-CN" style="font-family:宋体">M</span>ark<o:p></o:p></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></i></b></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Ok, I’ll update these soon.<o:p></o:p></span></i></b></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></i></b></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">--<o:p></o:p></span></i></b></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">BR.<o:p></o:p></span></i></b></pre>
<pre><b><i><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Jianwei<o:p></o:p></span></i></b></pre>
</div>
</div>
</body>
</html>