[PATCH 7/9] drm: add Rockchip Soc rk3288 lvds connector

2014-08-03 Thread mark yao
Signed-off-by: mark yao 
---
 drivers/gpu/drm/rockchip/Kconfig |1 +
 drivers/gpu/drm/rockchip/Makefile|2 +-
 drivers/gpu/drm/rockchip/connector/Kconfig   |8 +
 drivers/gpu/drm/rockchip/connector/Makefile  |4 +
 drivers/gpu/drm/rockchip/connector/rk3288_lvds.c |  332 ++
 drivers/gpu/drm/rockchip/connector/rk3288_lvds.h |   50 
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c  |   13 +
 drivers/gpu/drm/rockchip/rockchip_drm_drv.h  |3 +
 8 files changed, 412 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/rockchip/connector/Kconfig
 create mode 100644 drivers/gpu/drm/rockchip/connector/Makefile
 create mode 100644 drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
 create mode 100644 drivers/gpu/drm/rockchip/connector/rk3288_lvds.h

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index ccce827..407cbb6 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -40,3 +40,4 @@ config DRM_ROCKCHIP_CONNECTOR
  such as lcd plane, lvds, edp , mipi, etc.
 
 source "drivers/gpu/drm/rockchip/lcdc/Kconfig"
+source "drivers/gpu/drm/rockchip/connector/Kconfig"
diff --git a/drivers/gpu/drm/rockchip/Makefile 
b/drivers/gpu/drm/rockchip/Makefile
index 6d49edc..7d5877a 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -8,6 +8,6 @@ rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_gem.o \
rockchip_drm_fb.o rockchip_drm_fbdev.o \
rockchip_panel.o
 
-obj-$(CONFIG_DRM_ROCKCHIP_CONNECTOR) += rockchip_drm_connector.o
+obj-$(CONFIG_DRM_ROCKCHIP_CONNECTOR) += rockchip_drm_connector.o connector/
 obj-$(CONFIG_DRM_ROCKCHIP_LCDC) += rockchip_drm_lcdc.o lcdc/
 obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o
diff --git a/drivers/gpu/drm/rockchip/connector/Kconfig 
b/drivers/gpu/drm/rockchip/connector/Kconfig
new file mode 100644
index 000..248942f
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/Kconfig
@@ -0,0 +1,8 @@
+config RK3288_LVDS
+   bool "RK3288 lvds connector support"
+   depends on DRM_ROCKCHIP_CONNECTOR
+   help
+ Choose this option if you have a rk3288 lvds connector.
+ rk3288 lvds transmitter support ttl rgb, lvds and dual lvds
+ mode, dual lvds mode is support for the plane which need dual
+ lvds channels.
diff --git a/drivers/gpu/drm/rockchip/connector/Makefile 
b/drivers/gpu/drm/rockchip/connector/Makefile
new file mode 100644
index 000..dcfbdef
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/Makefile
@@ -0,0 +1,4 @@
+#
+# Makefile for display connector like lvds edp mipi
+#
+obj-$(CONFIG_RK3288_LVDS)  += rk3288_lvds.o
diff --git a/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c 
b/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
new file mode 100644
index 000..3ca4c6f
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
@@ -0,0 +1,332 @@
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author:
+ *  hjc 
+ *  mark yao 
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+
+#include "../rockchip_drm_connector.h"
+#include "../rockchip_drm_lcdc.h"
+#include "rk3288_lvds.h"
+
+/*
+ * @grf_offset: offset inside the grf regmap for setting the rockchip lvds
+ */
+struct rk3288_lvds_soc_data {
+   int grf_gpio1d_iomux;
+   int grf_soc_con6;
+   int grf_soc_con7;
+};
+
+struct rk3288_lvds {
+   void *base;
+   int format;
+   struct drm_display_mode mode;
+   struct device *dev;
+   void __iomem *regs;
+   struct regmap *grf;
+   struct rk3288_lvds_soc_data *soc_data;
+   struct clk *pclk;
+   bool standby;
+};
+
+static inline void lvds_writel(struct rk3288_lvds *lvds, u32 offset, u32 val)
+{
+   writel_relaxed(val, lvds->regs + offset);
+   writel_relaxed(val, lvds->regs + offset + 0x100);
+}
+
+static inline int lvds_name_to_format(const char *s)
+{
+   if (!s)
+   return 0;
+
+   if (strncmp(s, "jeida", 6) == 0)
+   return LVDS_FORMAT_JEIDA;
+   else if (strncmp(s, "vesa", 6) == 0)
+   return LVDS_FORMAT_VESA;
+
+   return 0;
+}
+
+static void rk3288_lvds_disable(struct rockchip_connector *conn)
+{
+   struct rk3288_lvds *lvds = conn->priv;
+   int ret = 0;
+
+   if (lvds->standby)
+ 

[PATCH 7/9] drm: add Rockchip Soc rk3288 lvds connector

2014-08-03 Thread mark yao
Signed-off-by: mark yao y...@rock-chips.com
---
 drivers/gpu/drm/rockchip/Kconfig |1 +
 drivers/gpu/drm/rockchip/Makefile|2 +-
 drivers/gpu/drm/rockchip/connector/Kconfig   |8 +
 drivers/gpu/drm/rockchip/connector/Makefile  |4 +
 drivers/gpu/drm/rockchip/connector/rk3288_lvds.c |  332 ++
 drivers/gpu/drm/rockchip/connector/rk3288_lvds.h |   50 
 drivers/gpu/drm/rockchip/rockchip_drm_drv.c  |   13 +
 drivers/gpu/drm/rockchip/rockchip_drm_drv.h  |3 +
 8 files changed, 412 insertions(+), 1 deletion(-)
 create mode 100644 drivers/gpu/drm/rockchip/connector/Kconfig
 create mode 100644 drivers/gpu/drm/rockchip/connector/Makefile
 create mode 100644 drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
 create mode 100644 drivers/gpu/drm/rockchip/connector/rk3288_lvds.h

diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig
index ccce827..407cbb6 100644
--- a/drivers/gpu/drm/rockchip/Kconfig
+++ b/drivers/gpu/drm/rockchip/Kconfig
@@ -40,3 +40,4 @@ config DRM_ROCKCHIP_CONNECTOR
  such as lcd plane, lvds, edp , mipi, etc.
 
 source drivers/gpu/drm/rockchip/lcdc/Kconfig
+source drivers/gpu/drm/rockchip/connector/Kconfig
diff --git a/drivers/gpu/drm/rockchip/Makefile 
b/drivers/gpu/drm/rockchip/Makefile
index 6d49edc..7d5877a 100644
--- a/drivers/gpu/drm/rockchip/Makefile
+++ b/drivers/gpu/drm/rockchip/Makefile
@@ -8,6 +8,6 @@ rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_gem.o \
rockchip_drm_fb.o rockchip_drm_fbdev.o \
rockchip_panel.o
 
-obj-$(CONFIG_DRM_ROCKCHIP_CONNECTOR) += rockchip_drm_connector.o
+obj-$(CONFIG_DRM_ROCKCHIP_CONNECTOR) += rockchip_drm_connector.o connector/
 obj-$(CONFIG_DRM_ROCKCHIP_LCDC) += rockchip_drm_lcdc.o lcdc/
 obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o
diff --git a/drivers/gpu/drm/rockchip/connector/Kconfig 
b/drivers/gpu/drm/rockchip/connector/Kconfig
new file mode 100644
index 000..248942f
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/Kconfig
@@ -0,0 +1,8 @@
+config RK3288_LVDS
+   bool RK3288 lvds connector support
+   depends on DRM_ROCKCHIP_CONNECTOR
+   help
+ Choose this option if you have a rk3288 lvds connector.
+ rk3288 lvds transmitter support ttl rgb, lvds and dual lvds
+ mode, dual lvds mode is support for the plane which need dual
+ lvds channels.
diff --git a/drivers/gpu/drm/rockchip/connector/Makefile 
b/drivers/gpu/drm/rockchip/connector/Makefile
new file mode 100644
index 000..dcfbdef
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/Makefile
@@ -0,0 +1,4 @@
+#
+# Makefile for display connector like lvds edp mipi
+#
+obj-$(CONFIG_RK3288_LVDS)  += rk3288_lvds.o
diff --git a/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c 
b/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
new file mode 100644
index 000..3ca4c6f
--- /dev/null
+++ b/drivers/gpu/drm/rockchip/connector/rk3288_lvds.c
@@ -0,0 +1,332 @@
+/*
+ * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
+ * Author:
+ *  hjc h...@rock-chips.com
+ *  mark yao mark@rock-chips.com
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include linux/module.h
+#include linux/kernel.h
+#include linux/init.h
+#include linux/device.h
+#include linux/errno.h
+#include linux/string.h
+#include linux/mm.h
+#include linux/slab.h
+#include linux/delay.h
+#include linux/platform_device.h
+#include linux/clk.h
+#include linux/mfd/syscon.h
+#include linux/regmap.h
+
+#include video/display_timing.h
+
+#include ../rockchip_drm_connector.h
+#include ../rockchip_drm_lcdc.h
+#include rk3288_lvds.h
+
+/*
+ * @grf_offset: offset inside the grf regmap for setting the rockchip lvds
+ */
+struct rk3288_lvds_soc_data {
+   int grf_gpio1d_iomux;
+   int grf_soc_con6;
+   int grf_soc_con7;
+};
+
+struct rk3288_lvds {
+   void *base;
+   int format;
+   struct drm_display_mode mode;
+   struct device *dev;
+   void __iomem *regs;
+   struct regmap *grf;
+   struct rk3288_lvds_soc_data *soc_data;
+   struct clk *pclk;
+   bool standby;
+};
+
+static inline void lvds_writel(struct rk3288_lvds *lvds, u32 offset, u32 val)
+{
+   writel_relaxed(val, lvds-regs + offset);
+   writel_relaxed(val, lvds-regs + offset + 0x100);
+}
+
+static inline int lvds_name_to_format(const char *s)
+{
+   if (!s)
+   return 0;
+
+   if (strncmp(s, jeida, 6) == 0)
+   return LVDS_FORMAT_JEIDA;
+   else if (strncmp(s, vesa, 6) ==