[PATCH v3 5/5] drm/rockchip: Add support for Rockchip Soc EDP

2014-09-18 Thread Mark yao
This adds support for Rockchip soc edp found on rk3288

Signed-off-by: Mark Yao 
Signed-off-by: Jeff Chen 
---
Changes in v2:
- fix code sytle
- use some define from drm_dp_helper.h
- use panel-simple driver for primary display.
- remove unnecessary clock clk_24m_parent.

Changes in v3: None

 drivers/gpu/drm/rockchip/Kconfig |9 +
 drivers/gpu/drm/rockchip/Makefile|2 +
 drivers/gpu/drm/rockchip/rockchip_edp_core.c |  853 ++
 drivers/gpu/drm/rockchip/rockchip_edp_core.h |  309 +++
 drivers/gpu/drm/rockchip/rockchip_edp_reg.c  | 1202 ++
 drivers/gpu/drm/rockchip/rockchip_edp_reg.h  |  345 
 6 files changed, 2720 insertions(+)
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_core.c
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_core.h
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_reg.c
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_reg.h

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index 7146c80..04b1f8c 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -17,3 +17,12 @@ config DRM_ROCKCHIP
  management to userspace. This driver does not provides
  2D or 3D acceleration; acceleration is performed by other
  IP found on the SoC.
+
+config ROCKCHIP_EDP
+   bool "Rockchip edp support"
+   depends on DRM_ROCKCHIP
+   help
+ Choose this option if you have a Rockchip eDP.
+ Rockchip rk3288 SoC has eDP TX Controller can be used.
+ If you have an Embedded DisplayPort Panel, say Y to enable its
+ driver.
diff --git a/drivers/gpu/drm/rockchip/Makefile 
b/drivers/gpu/drm/rockchip/Makefile
index 6e6d468..a0fc3a1 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -7,4 +7,6 @@ ccflags-y := -Iinclude/drm -Idrivers/gpu/drm/rockchip
 rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o \
rockchip_drm_gem.o rockchip_drm_vop.o
 
+rockchipdrm-$(CONFIG_ROCKCHIP_EDP) += rockchip_edp_core.o rockchip_edp_reg.o
+
 obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o
diff --git a/drivers/gpu/drm/rockchip/rockchip_edp_core.c 
b/drivers/gpu/drm/rockchip/rockchip_edp_core.c
new file mode 100644
index 000..5450d1fa
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/rockchip_edp_core.c
@@ -0,0 +1,853 @@
+/*
+* Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+* Author:
+*  Andy yan 
+*  Jeff chen 
+*
+* based on exynos_dp_core.c
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*/
+
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+
+#include "rockchip_edp_core.h"
+
+#define connector_to_edp(c) \
+   container_of(c, struct rockchip_edp_device, connector)
+
+#define encoder_to_edp(c) \
+   container_of(c, struct rockchip_edp_device, encoder)
+
+static struct rockchip_edp_soc_data soc_data[2] = {
+   /* rk3288 */
+   {.grf_soc_con6 = 0x025c,
+.grf_soc_con12 = 0x0274},
+   /* no edp switching needed */
+   {.grf_soc_con6 = -1,
+.grf_soc_con12 = -1},
+};
+
+static const struct of_device_id rockchip_edp_dt_ids[] = {
+   {.compatible = "rockchip,rk3288-edp",
+.data = (void *)_data[0] },
+   {}
+};
+
+MODULE_DEVICE_TABLE(of, rockchip_edp_dt_ids);
+
+static int rockchip_edp_clk_enable(struct rockchip_edp_device *edp)
+{
+   int ret = 0;
+
+   if (!edp->clk_on) {
+   ret = clk_prepare_enable(edp->pclk);
+   if (ret < 0) {
+   dev_err(edp->dev, "cannot enable edp pclk %d\n", ret);
+   goto err_pclk;
+   }
+
+   ret = clk_prepare_enable(edp->clk_edp);
+   if (ret < 0) {
+   dev_err(edp->dev, "cannot enable clk_edp %d\n", ret);
+   goto err_clk_edp;
+   }
+
+   ret = clk_set_rate(edp->clk_24m, 2400);
+   if (ret < 0) {
+   dev_err(edp->dev, "cannot set edp clk_24m %d\n",
+   ret);
+   goto err_clk_24m;
+   }
+
+   ret = clk_prepare_enable(edp->clk_24m);
+   if (ret < 0) {
+   dev_err(edp->dev, "cannot enable edp clk_24m %d\n",
+   ret);
+   goto err_clk_24m;
+   }
+
+   edp->clk_on = true;
+   }
+
+   return 0;
+
+err_clk_24m:
+   clk_disable_unprepare(edp->clk_edp);
+err_clk_edp:
+   clk_disable_unprepare(edp->pclk);
+err_pclk:
+   edp->clk_on = false;
+
+   return 

[PATCH v3 5/5] drm/rockchip: Add support for Rockchip Soc EDP

2014-09-18 Thread Mark yao
This adds support for Rockchip soc edp found on rk3288

Signed-off-by: Mark Yao mark@rock-chips.com
Signed-off-by: Jeff Chen jeff.c...@rock-chips.com
---
Changes in v2:
- fix code sytle
- use some define from drm_dp_helper.h
- use panel-simple driver for primary display.
- remove unnecessary clock clk_24m_parent.

Changes in v3: None

 drivers/gpu/drm/rockchip/Kconfig |9 +
 drivers/gpu/drm/rockchip/Makefile|2 +
 drivers/gpu/drm/rockchip/rockchip_edp_core.c |  853 ++
 drivers/gpu/drm/rockchip/rockchip_edp_core.h |  309 +++
 drivers/gpu/drm/rockchip/rockchip_edp_reg.c  | 1202 ++
 drivers/gpu/drm/rockchip/rockchip_edp_reg.h  |  345 
 6 files changed, 2720 insertions(+)
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_core.c
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_core.h
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_reg.c
 create mode 100644 drivers/gpu/drm/rockchip/rockchip_edp_reg.h

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index 7146c80..04b1f8c 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -17,3 +17,12 @@ config DRM_ROCKCHIP
  management to userspace. This driver does not provides
  2D or 3D acceleration; acceleration is performed by other
  IP found on the SoC.
+
+config ROCKCHIP_EDP
+   bool Rockchip edp support
+   depends on DRM_ROCKCHIP
+   help
+ Choose this option if you have a Rockchip eDP.
+ Rockchip rk3288 SoC has eDP TX Controller can be used.
+ If you have an Embedded DisplayPort Panel, say Y to enable its
+ driver.
diff --git a/drivers/gpu/drm/rockchip/Makefile 
b/drivers/gpu/drm/rockchip/Makefile
index 6e6d468..a0fc3a1 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -7,4 +7,6 @@ ccflags-y := -Iinclude/drm -Idrivers/gpu/drm/rockchip
 rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o \
rockchip_drm_gem.o rockchip_drm_vop.o
 
+rockchipdrm-$(CONFIG_ROCKCHIP_EDP) += rockchip_edp_core.o rockchip_edp_reg.o
+
 obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o
diff --git a/drivers/gpu/drm/rockchip/rockchip_edp_core.c 
b/drivers/gpu/drm/rockchip/rockchip_edp_core.c
new file mode 100644
index 000..5450d1fa
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/rockchip_edp_core.c
@@ -0,0 +1,853 @@
+/*
+* Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+* Author:
+*  Andy yan andy@rock-chips.com
+*  Jeff chen jeff.c...@rock-chips.com
+*
+* based on exynos_dp_core.c
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*/
+
+#include drm/drmP.h
+#include drm/drm_crtc_helper.h
+#include drm/drm_panel.h
+#include drm/drm_of.h
+
+#include linux/component.h
+#include linux/clk.h
+#include linux/mfd/syscon.h
+#include linux/regmap.h
+#include linux/reset.h
+
+#include video/of_videomode.h
+#include video/videomode.h
+
+#include rockchip_edp_core.h
+
+#define connector_to_edp(c) \
+   container_of(c, struct rockchip_edp_device, connector)
+
+#define encoder_to_edp(c) \
+   container_of(c, struct rockchip_edp_device, encoder)
+
+static struct rockchip_edp_soc_data soc_data[2] = {
+   /* rk3288 */
+   {.grf_soc_con6 = 0x025c,
+.grf_soc_con12 = 0x0274},
+   /* no edp switching needed */
+   {.grf_soc_con6 = -1,
+.grf_soc_con12 = -1},
+};
+
+static const struct of_device_id rockchip_edp_dt_ids[] = {
+   {.compatible = rockchip,rk3288-edp,
+.data = (void *)soc_data[0] },
+   {}
+};
+
+MODULE_DEVICE_TABLE(of, rockchip_edp_dt_ids);
+
+static int rockchip_edp_clk_enable(struct rockchip_edp_device *edp)
+{
+   int ret = 0;
+
+   if (!edp-clk_on) {
+   ret = clk_prepare_enable(edp-pclk);
+   if (ret  0) {
+   dev_err(edp-dev, cannot enable edp pclk %d\n, ret);
+   goto err_pclk;
+   }
+
+   ret = clk_prepare_enable(edp-clk_edp);
+   if (ret  0) {
+   dev_err(edp-dev, cannot enable clk_edp %d\n, ret);
+   goto err_clk_edp;
+   }
+
+   ret = clk_set_rate(edp-clk_24m, 2400);
+   if (ret  0) {
+   dev_err(edp-dev, cannot set edp clk_24m %d\n,
+   ret);
+   goto err_clk_24m;
+   }
+
+   ret = clk_prepare_enable(edp-clk_24m);
+   if (ret  0) {
+   dev_err(edp-dev, cannot enable edp clk_24m %d\n,
+   ret);
+   goto err_clk_24m;
+   }
+
+