<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>