linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/10] drm/exynos: prepare multiple display controllers
@ 2011-11-04 12:09 Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 01/10] drm/exynos: added padding to be 64-bit align Seung-Woo Kim
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

This patch is preparing multiple display controllers, FIMD and HDMI.
- added padding into ioctl structure to be 64 bit align
- added kms poll to handle hpd event
- fixed converting between display mode and timing
- fixed connector and crtc callbacks to call proper display driver
- code clean

based git repository is below:
git://people.freedesktop.org/~airlied/linux.git
branch name: drm-core-next
base commit-id: 1717c0e23f411147490c7a3312b894f0ea9a5fb1

Inki Dae (3):
  drm/exynos: added padding to be 64-bit align.
  drm/exynos: added manager object to connector
  drm/exynos: changed exynos_drm_display to exynos_drm_display_ops

Joonyoung Shim (1):
  drm/exynos: restored kernel_fb_list when reiniting fb_helper

Seung-Woo Kim (6):
  drm/exynos: added kms poll for handling hpd event
  drm/exynos: fixed connector flag with hpd and interlace scan for hdmi
  drm/exynos: fixed converting between display mode and timing
  drm/exynos: removed meaningless parameter from fbdev update
  drm/exynos: added crtc dpms for disable crtc
  drm/exynos: checked for null pointer

 drivers/gpu/drm/exynos/exynos_drm_connector.c |   78 ++++++++++++++++++-------
 drivers/gpu/drm/exynos/exynos_drm_crtc.c      |   16 ++++-
 drivers/gpu/drm/exynos/exynos_drm_drv.c       |    5 ++
 drivers/gpu/drm/exynos/exynos_drm_drv.h       |    4 +-
 drivers/gpu/drm/exynos/exynos_drm_encoder.c   |   64 +++++++++++++++++----
 drivers/gpu/drm/exynos/exynos_drm_encoder.h   |    1 +
 drivers/gpu/drm/exynos/exynos_drm_fb.c        |   12 ++++
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c     |   29 ++++++---
 drivers/gpu/drm/exynos/exynos_drm_fimd.c      |    4 +-
 include/drm/exynos_drm.h                      |    2 +
 10 files changed, 165 insertions(+), 50 deletions(-)

-- 
1.7.4.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 01/10] drm/exynos: added padding to be 64-bit align.
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 02/10] drm/exynos: added kms poll for handling hpd event Seung-Woo Kim
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

From: Inki Dae <inki.dae@samsung.com>

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 include/drm/exynos_drm.h |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/include/drm/exynos_drm.h b/include/drm/exynos_drm.h
index 874c4d2..1d161cb 100644
--- a/include/drm/exynos_drm.h
+++ b/include/drm/exynos_drm.h
@@ -36,11 +36,13 @@
  *	- this size value would be page-aligned internally.
  * @flags: user request for setting memory type or cache attributes.
  * @handle: returned handle for the object.
+ * @pad: just padding to be 64-bit aligned.
  */
 struct drm_exynos_gem_create {
 	unsigned int size;
 	unsigned int flags;
 	unsigned int handle;
+	unsigned int pad;
 };
 
 /**
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 02/10] drm/exynos: added kms poll for handling hpd event
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 01/10] drm/exynos: added padding to be 64-bit align Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 03/10] drm/exynos: fixed connector flag with hpd and interlace scan for hdmi Seung-Woo Kim
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

this patch adds kms poll infrastructure to handle hotplug detection event

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_drv.c |    5 +++++
 drivers/gpu/drm/exynos/exynos_drm_fb.c  |   12 ++++++++++++
 2 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c
index 83810cb..53e2216 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c
@@ -27,6 +27,7 @@
 
 #include "drmP.h"
 #include "drm.h"
+#include "drm_crtc_helper.h"
 
 #include <drm/exynos_drm.h>
 
@@ -61,6 +62,9 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
 
 	drm_mode_config_init(dev);
 
+	/* init kms poll for handling hpd */
+	drm_kms_helper_poll_init(dev);
+
 	exynos_drm_mode_config_init(dev);
 
 	/*
@@ -116,6 +120,7 @@ static int exynos_drm_unload(struct drm_device *dev)
 	exynos_drm_fbdev_fini(dev);
 	exynos_drm_device_unregister(dev);
 	drm_vblank_cleanup(dev);
+	drm_kms_helper_poll_fini(dev);
 	drm_mode_config_cleanup(dev);
 	kfree(dev->dev_private);
 
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
index 48d29cf..7d91a54 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
@@ -29,7 +29,9 @@
 #include "drmP.h"
 #include "drm_crtc.h"
 #include "drm_crtc_helper.h"
+#include "drm_fb_helper.h"
 
+#include "exynos_drm_drv.h"
 #include "exynos_drm_fb.h"
 #include "exynos_drm_buf.h"
 #include "exynos_drm_gem.h"
@@ -238,8 +240,18 @@ struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb)
 	return entry;
 }
 
+static void exynos_drm_output_poll_changed(struct drm_device *dev)
+{
+	struct exynos_drm_private *private = dev->dev_private;
+	struct drm_fb_helper *fb_helper = private->fb_helper;
+
+	if (fb_helper)
+		drm_fb_helper_hotplug_event(fb_helper);
+}
+
 static struct drm_mode_config_funcs exynos_drm_mode_config_funcs = {
 	.fb_create = exynos_drm_fb_create,
+	.output_poll_changed = exynos_drm_output_poll_changed,
 };
 
 void exynos_drm_mode_config_init(struct drm_device *dev)
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 03/10] drm/exynos: fixed connector flag with hpd and interlace scan for hdmi
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 01/10] drm/exynos: added padding to be 64-bit align Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 02/10] drm/exynos: added kms poll for handling hpd event Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 04/10] drm/exynos: fixed converting between display mode and timing Seung-Woo Kim
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

hdmi display in exynos supports hotplug event and interlace scan mode

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_connector.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index 985d9e7..d1a459f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -254,6 +254,8 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
 	switch (manager->display->type) {
 	case EXYNOS_DISPLAY_TYPE_HDMI:
 		type = DRM_MODE_CONNECTOR_HDMIA;
+		connector->interlace_allowed = true;
+		connector->polled = DRM_CONNECTOR_POLL_HPD;
 		break;
 	default:
 		type = DRM_MODE_CONNECTOR_Unknown;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 04/10] drm/exynos: fixed converting between display mode and timing
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (2 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 03/10] drm/exynos: fixed connector flag with hpd and interlace scan for hdmi Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 05/10] drm/exynos: added manager object to connector Seung-Woo Kim
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

missing members are added into converting function between timing and display
mode and refresh rate of display mode is calculated by drm mode function.

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_connector.c |    9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index d1a459f..7ca1274 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -47,6 +47,7 @@ convert_to_display_mode(struct drm_display_mode *mode,
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
 	mode->clock = timing->pixclock / 1000;
+	mode->vrefresh = timing->refresh;
 
 	mode->hdisplay = timing->xres;
 	mode->hsync_start = mode->hdisplay + timing->left_margin;
@@ -57,6 +58,12 @@ convert_to_display_mode(struct drm_display_mode *mode,
 	mode->vsync_start = mode->vdisplay + timing->upper_margin;
 	mode->vsync_end = mode->vsync_start + timing->vsync_len;
 	mode->vtotal = mode->vsync_end + timing->lower_margin;
+
+	if (timing->vmode & FB_VMODE_INTERLACED)
+		mode->flags |= DRM_MODE_FLAG_INTERLACE;
+
+	if (timing->vmode & FB_VMODE_DOUBLE)
+		mode->flags |= DRM_MODE_FLAG_DBLSCAN;
 }
 
 /* convert drm_display_mode to exynos_video_timings */
@@ -69,7 +76,7 @@ convert_to_video_timing(struct fb_videomode *timing,
 	memset(timing, 0, sizeof(*timing));
 
 	timing->pixclock = mode->clock * 1000;
-	timing->refresh = mode->vrefresh;
+	timing->refresh = drm_mode_vrefresh(mode);
 
 	timing->xres = mode->hdisplay;
 	timing->left_margin = mode->hsync_start - mode->hdisplay;
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 05/10] drm/exynos: added manager object to connector
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (3 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 04/10] drm/exynos: fixed converting between display mode and timing Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 06/10] drm/exynos: changed exynos_drm_display to exynos_drm_display_ops Seung-Woo Kim
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

From: Inki Dae <inki.dae@samsung.com>

connector contains some contents for display controller so the connector also
should be able to access contoroller through manager.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_connector.c |   38 ++++++++++++++++++++----
 drivers/gpu/drm/exynos/exynos_drm_encoder.c   |    3 +-
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index 7ca1274..d33f803 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -37,6 +37,8 @@
 
 struct exynos_drm_connector {
 	struct drm_connector	drm_connector;
+	uint32_t		encoder_id;
+	struct exynos_drm_manager *manager;
 };
 
 /* convert exynos_video_timings to drm_display_mode */
@@ -99,8 +101,9 @@ convert_to_video_timing(struct fb_videomode *timing,
 
 static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 {
-	struct exynos_drm_manager *manager =
-				exynos_drm_get_manager(connector->encoder);
+	struct exynos_drm_connector *exynos_connector =
+					to_exynos_connector(connector);
+	struct exynos_drm_manager *manager = exynos_connector->manager;
 	struct exynos_drm_display *display = manager->display;
 	unsigned int count;
 
@@ -169,8 +172,9 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
 					    struct drm_display_mode *mode)
 {
-	struct exynos_drm_manager *manager =
-				exynos_drm_get_manager(connector->encoder);
+	struct exynos_drm_connector *exynos_connector =
+					to_exynos_connector(connector);
+	struct exynos_drm_manager *manager = exynos_connector->manager;
 	struct exynos_drm_display *display = manager->display;
 	struct fb_videomode timing;
 	int ret = MODE_BAD;
@@ -188,9 +192,25 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
 
 struct drm_encoder *exynos_drm_best_encoder(struct drm_connector *connector)
 {
+	struct drm_device *dev = connector->dev;
+	struct exynos_drm_connector *exynos_connector =
+					to_exynos_connector(connector);
+	struct drm_mode_object *obj;
+	struct drm_encoder *encoder;
+
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
-	return connector->encoder;
+	obj = drm_mode_object_find(dev, exynos_connector->encoder_id,
+				   DRM_MODE_OBJECT_ENCODER);
+	if (!obj) {
+		DRM_DEBUG_KMS("Unknown ENCODER ID %d\n",
+				exynos_connector->encoder_id);
+		return NULL;
+	}
+
+	encoder = obj_to_encoder(obj);
+
+	return encoder;
 }
 
 static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {
@@ -203,8 +223,9 @@ static struct drm_connector_helper_funcs exynos_connector_helper_funcs = {
 static enum drm_connector_status
 exynos_drm_connector_detect(struct drm_connector *connector, bool force)
 {
-	struct exynos_drm_manager *manager =
-				exynos_drm_get_manager(connector->encoder);
+	struct exynos_drm_connector *exynos_connector =
+					to_exynos_connector(connector);
+	struct exynos_drm_manager *manager = exynos_connector->manager;
 	struct exynos_drm_display *display = manager->display;
 	enum drm_connector_status status = connector_status_disconnected;
 
@@ -276,7 +297,10 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
 	if (err)
 		goto err_connector;
 
+	exynos_connector->encoder_id = encoder->base.id;
+	exynos_connector->manager = manager;
 	connector->encoder = encoder;
+
 	err = drm_mode_connector_attach_encoder(connector, encoder);
 	if (err) {
 		DRM_ERROR("failed to attach a connector to a encoder\n");
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
index 7cf6fa8..4e5535b 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
@@ -58,7 +58,8 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
 
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
 		if (connector->encoder == encoder) {
-			struct exynos_drm_display *display = manager->display;
+			struct exynos_drm_display *display =
+							manager->display;
 
 			if (display && display->power_on)
 				display->power_on(manager->dev, mode);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 06/10] drm/exynos: changed exynos_drm_display to exynos_drm_display_ops
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (4 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 05/10] drm/exynos: added manager object to connector Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 07/10] drm/exynos: restored kernel_fb_list when reiniting fb_helper Seung-Woo Kim
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

From: Inki Dae <inki.dae@samsung.com>

exynos_drm_display has function pointes so exynos_drm_display_ops is better
to describe.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_connector.c |   29 +++++++++++++------------
 drivers/gpu/drm/exynos/exynos_drm_drv.h       |    4 +-
 drivers/gpu/drm/exynos/exynos_drm_encoder.c   |    8 +++---
 drivers/gpu/drm/exynos/exynos_drm_fimd.c      |    4 +-
 4 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c
index d33f803..d620b07 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_connector.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c
@@ -104,13 +104,13 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 	struct exynos_drm_connector *exynos_connector =
 					to_exynos_connector(connector);
 	struct exynos_drm_manager *manager = exynos_connector->manager;
-	struct exynos_drm_display *display = manager->display;
+	struct exynos_drm_display_ops *display_ops = manager->display_ops;
 	unsigned int count;
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
-	if (!display) {
-		DRM_DEBUG_KMS("display is null.\n");
+	if (!display_ops) {
+		DRM_DEBUG_KMS("display_ops is null.\n");
 		return 0;
 	}
 
@@ -122,7 +122,7 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 	 * P.S. in case of lcd panel, count is always 1 if success
 	 * because lcd panel has only one mode.
 	 */
-	if (display->get_edid) {
+	if (display_ops->get_edid) {
 		int ret;
 		void *edid;
 
@@ -132,7 +132,7 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 			return 0;
 		}
 
-		ret = display->get_edid(manager->dev, connector,
+		ret = display_ops->get_edid(manager->dev, connector,
 						edid, MAX_EDID);
 		if (ret < 0) {
 			DRM_ERROR("failed to get edid data.\n");
@@ -150,8 +150,8 @@ static int exynos_drm_connector_get_modes(struct drm_connector *connector)
 		struct drm_display_mode *mode = drm_mode_create(connector->dev);
 		struct fb_videomode *timing;
 
-		if (display->get_timing)
-			timing = display->get_timing(manager->dev);
+		if (display_ops->get_timing)
+			timing = display_ops->get_timing(manager->dev);
 		else {
 			drm_mode_destroy(connector->dev, mode);
 			return 0;
@@ -175,7 +175,7 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
 	struct exynos_drm_connector *exynos_connector =
 					to_exynos_connector(connector);
 	struct exynos_drm_manager *manager = exynos_connector->manager;
-	struct exynos_drm_display *display = manager->display;
+	struct exynos_drm_display_ops *display_ops = manager->display_ops;
 	struct fb_videomode timing;
 	int ret = MODE_BAD;
 
@@ -183,8 +183,8 @@ static int exynos_drm_connector_mode_valid(struct drm_connector *connector,
 
 	convert_to_video_timing(&timing, mode);
 
-	if (display && display->check_timing)
-		if (!display->check_timing(manager->dev, (void *)&timing))
+	if (display_ops && display_ops->check_timing)
+		if (!display_ops->check_timing(manager->dev, (void *)&timing))
 			ret = MODE_OK;
 
 	return ret;
@@ -226,13 +226,14 @@ exynos_drm_connector_detect(struct drm_connector *connector, bool force)
 	struct exynos_drm_connector *exynos_connector =
 					to_exynos_connector(connector);
 	struct exynos_drm_manager *manager = exynos_connector->manager;
-	struct exynos_drm_display *display = manager->display;
+	struct exynos_drm_display_ops *display_ops =
+					manager->display_ops;
 	enum drm_connector_status status = connector_status_disconnected;
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
-	if (display && display->is_connected) {
-		if (display->is_connected(manager->dev))
+	if (display_ops && display_ops->is_connected) {
+		if (display_ops->is_connected(manager->dev))
 			status = connector_status_connected;
 		else
 			status = connector_status_disconnected;
@@ -279,7 +280,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev,
 
 	connector = &exynos_connector->drm_connector;
 
-	switch (manager->display->type) {
+	switch (manager->display_ops->type) {
 	case EXYNOS_DISPLAY_TYPE_HDMI:
 		type = DRM_MODE_CONNECTOR_HDMIA;
 		connector->interlace_allowed = true;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
index c03683f..1575e5f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
@@ -130,7 +130,7 @@ struct exynos_drm_overlay {
  * @check_timing: check if timing is valid or not.
  * @power_on: display device on or off.
  */
-struct exynos_drm_display {
+struct exynos_drm_display_ops {
 	enum exynos_drm_output_type type;
 	bool (*is_connected)(struct device *dev);
 	int (*get_edid)(struct device *dev, struct drm_connector *connector,
@@ -178,7 +178,7 @@ struct exynos_drm_manager {
 	int pipe;
 	struct exynos_drm_manager_ops *ops;
 	struct exynos_drm_overlay_ops *overlay_ops;
-	struct exynos_drm_display *display;
+	struct exynos_drm_display_ops *display_ops;
 };
 
 /*
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
index 4e5535b..0034fa7 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
@@ -58,11 +58,11 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
 
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
 		if (connector->encoder == encoder) {
-			struct exynos_drm_display *display =
-							manager->display;
+			struct exynos_drm_display_ops *display_ops =
+							manager->display_ops;
 
-			if (display && display->power_on)
-				display->power_on(manager->dev, mode);
+			if (display_ops && display_ops->power_on)
+				display_ops->power_on(manager->dev, mode);
 		}
 	}
 }
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
index 4659c88..f2d883f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c
@@ -124,7 +124,7 @@ static int fimd_display_power_on(struct device *dev, int mode)
 	return 0;
 }
 
-static struct exynos_drm_display fimd_display = {
+static struct exynos_drm_display_ops fimd_display_ops = {
 	.type = EXYNOS_DISPLAY_TYPE_LCD,
 	.is_connected = fimd_display_is_connected,
 	.get_timing = fimd_get_timing,
@@ -731,7 +731,7 @@ static int __devinit fimd_probe(struct platform_device *pdev)
 	subdrv->manager.pipe = -1;
 	subdrv->manager.ops = &fimd_manager_ops;
 	subdrv->manager.overlay_ops = &fimd_overlay_ops;
-	subdrv->manager.display = &fimd_display;
+	subdrv->manager.display_ops = &fimd_display_ops;
 	subdrv->manager.dev = dev;
 
 	platform_set_drvdata(pdev, ctx);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 07/10] drm/exynos: restored kernel_fb_list when reiniting fb_helper
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (5 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 06/10] drm/exynos: changed exynos_drm_display to exynos_drm_display_ops Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 08/10] drm/exynos: removed meaningless parameter from fbdev update Seung-Woo Kim
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

From: Joonyoung Shim <jy0922.shim@samsung.com>

during recreating exynos_drm_fbdev as a new display device probes,
fb_helper is reinitialized but kernel fb is not changed
so kernel_fb_list should be restored after fb_helper is reinitialized.

Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 1f4b3d1..74092a8 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -405,6 +405,18 @@ int exynos_drm_fbdev_reinit(struct drm_device *dev)
 	fb_helper = private->fb_helper;
 
 	if (fb_helper) {
+		struct list_head temp_list;
+
+		INIT_LIST_HEAD(&temp_list);
+
+		/*
+		 * fb_helper is reintialized but kernel fb is reused
+		 * so kernel_fb_list need to be backuped and restored
+		 */
+		if (!list_empty(&fb_helper->kernel_fb_list))
+			list_replace_init(&fb_helper->kernel_fb_list,
+					&temp_list);
+
 		drm_fb_helper_fini(fb_helper);
 
 		ret = drm_fb_helper_init(dev, fb_helper,
@@ -414,6 +426,9 @@ int exynos_drm_fbdev_reinit(struct drm_device *dev)
 			return ret;
 		}
 
+		if (!list_empty(&temp_list))
+			list_replace(&temp_list, &fb_helper->kernel_fb_list);
+
 		ret = drm_fb_helper_single_add_all_connectors(fb_helper);
 		if (ret < 0) {
 			DRM_ERROR("failed to add fb helper to connectors\n");
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 08/10] drm/exynos: removed meaningless parameter from fbdev update
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (6 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 07/10] drm/exynos: restored kernel_fb_list when reiniting fb_helper Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 09/10] drm/exynos: added crtc dpms for disable crtc Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 10/10] drm/exynos: checked for null pointer Seung-Woo Kim
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

drm_framebuffer already has width and height so they are meaningless as
parameters when updating fb_info.

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_fbdev.c |   14 +++++---------
 1 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index 74092a8..0effd77 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -85,15 +85,13 @@ static struct fb_ops exynos_drm_fb_ops = {
 };
 
 static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
-				     struct drm_framebuffer *fb,
-				     unsigned int fb_width,
-				     unsigned int fb_height)
+				     struct drm_framebuffer *fb)
 {
 	struct fb_info *fbi = helper->fbdev;
 	struct drm_device *dev = helper->dev;
 	struct exynos_drm_fbdev *exynos_fb = to_exynos_fbdev(helper);
 	struct exynos_drm_buf_entry *entry;
-	unsigned int size = fb_width * fb_height * (fb->bits_per_pixel >> 3);
+	unsigned int size = fb->width * fb->height * (fb->bits_per_pixel >> 3);
 	unsigned long offset;
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
@@ -101,7 +99,7 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
 	exynos_fb->fb = fb;
 
 	drm_fb_helper_fill_fix(fbi, fb->pitch, fb->depth);
-	drm_fb_helper_fill_var(fbi, helper, fb_width, fb_height);
+	drm_fb_helper_fill_var(fbi, helper, fb->width, fb->height);
 
 	entry = exynos_drm_fb_get_buf(fb);
 	if (!entry) {
@@ -171,8 +169,7 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper,
 		goto out;
 	}
 
-	ret = exynos_drm_fbdev_update(helper, helper->fb, sizes->fb_width,
-			sizes->fb_height);
+	ret = exynos_drm_fbdev_update(helper, helper->fb);
 	if (ret < 0)
 		fb_dealloc_cmap(&fbi->cmap);
 
@@ -235,8 +232,7 @@ static int exynos_drm_fbdev_recreate(struct drm_fb_helper *helper,
 	}
 
 	helper->fb = exynos_fbdev->fb;
-	return exynos_drm_fbdev_update(helper, helper->fb, sizes->fb_width,
-			sizes->fb_height);
+	return exynos_drm_fbdev_update(helper, helper->fb);
 }
 
 static int exynos_drm_fbdev_probe(struct drm_fb_helper *helper,
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 09/10] drm/exynos: added crtc dpms for disable crtc
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (7 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 08/10] drm/exynos: removed meaningless parameter from fbdev update Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  2011-11-04 12:09 ` [PATCH 10/10] drm/exynos: checked for null pointer Seung-Woo Kim
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

crtc dpms is called as destroying attached fb so dpms off sould be processed.
crtc dpms also can be called after crtc is detached from encoder so pipe value
of manager is used to find display controller for this case

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_crtc.c    |   16 ++++++--
 drivers/gpu/drm/exynos/exynos_drm_encoder.c |   53 +++++++++++++++++++++++----
 drivers/gpu/drm/exynos/exynos_drm_encoder.h |    1 +
 3 files changed, 59 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
index 9337e5e..db541a5 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c
@@ -85,7 +85,8 @@ static void exynos_drm_crtc_apply(struct drm_crtc *crtc)
 
 	exynos_drm_fn_encoder(crtc, overlay,
 			exynos_drm_encoder_crtc_mode_set);
-	exynos_drm_fn_encoder(crtc, NULL, exynos_drm_encoder_crtc_commit);
+	exynos_drm_fn_encoder(crtc, &exynos_crtc->pipe,
+			exynos_drm_encoder_crtc_commit);
 }
 
 static int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
@@ -171,9 +172,13 @@ static int exynos_drm_crtc_update(struct drm_crtc *crtc)
 
 static void exynos_drm_crtc_dpms(struct drm_crtc *crtc, int mode)
 {
-	DRM_DEBUG_KMS("%s\n", __FILE__);
+	DRM_DEBUG_KMS("crtc[%d] mode[%d]\n", crtc->base.id, mode);
 
-	/* TODO */
+	if (mode == DRM_MODE_DPMS_OFF) {
+		DRM_DEBUG_KMS("crtc[%d] disable\n", crtc->base.id);
+		exynos_drm_fn_encoder(crtc, NULL,
+				exynos_drm_encoder_crtc_disable);
+	}
 }
 
 static void exynos_drm_crtc_prepare(struct drm_crtc *crtc)
@@ -185,9 +190,12 @@ static void exynos_drm_crtc_prepare(struct drm_crtc *crtc)
 
 static void exynos_drm_crtc_commit(struct drm_crtc *crtc)
 {
+	struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
+
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
-	/* drm framework doesn't check NULL. */
+	exynos_drm_fn_encoder(crtc, &exynos_crtc->pipe,
+			exynos_drm_encoder_crtc_commit);
 }
 
 static bool
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
index 0034fa7..4092f41 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
@@ -61,6 +61,8 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
 			struct exynos_drm_display_ops *display_ops =
 							manager->display_ops;
 
+			DRM_DEBUG_KMS("connector[%d] dpms[%d]\n",
+					connector->base.id, mode);
 			if (display_ops && display_ops->power_on)
 				display_ops->power_on(manager->dev, mode);
 		}
@@ -117,15 +119,11 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder)
 {
 	struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
 	struct exynos_drm_manager_ops *manager_ops = manager->ops;
-	struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
 
 	DRM_DEBUG_KMS("%s\n", __FILE__);
 
 	if (manager_ops && manager_ops->commit)
 		manager_ops->commit(manager->dev);
-
-	if (overlay_ops && overlay_ops->commit)
-		overlay_ops->commit(manager->dev);
 }
 
 static struct drm_crtc *
@@ -209,10 +207,30 @@ void exynos_drm_fn_encoder(struct drm_crtc *crtc, void *data,
 {
 	struct drm_device *dev = crtc->dev;
 	struct drm_encoder *encoder;
+	struct exynos_drm_private *private = dev->dev_private;
+	struct exynos_drm_manager *manager;
 
 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
-		if (encoder->crtc != crtc)
-			continue;
+		/*
+		 * if crtc is detached from encoder, check pipe,
+		 * otherwise check crtc attached to encoder
+		 */
+		if (!encoder->crtc) {
+			manager = to_exynos_encoder(encoder)->manager;
+			if (manager->pipe < 0 ||
+					private->crtc[manager->pipe] != crtc)
+				continue;
+
+			/*
+			 * crtc is already detached from encoder and last
+			 * function for detaching is properly selected, so
+			 * clear pipe from manager to prevent repeating call
+			 */
+			manager->pipe = -1;
+		} else {
+			if (encoder->crtc != crtc)
+				continue;
+		}
 
 		fn(encoder, data);
 	}
@@ -251,8 +269,18 @@ void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data)
 	struct exynos_drm_manager *manager =
 		to_exynos_encoder(encoder)->manager;
 	struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
+	int crtc = *(int *)data;
+
+	DRM_DEBUG_KMS("%s\n", __FILE__);
 
-	overlay_ops->commit(manager->dev);
+	/*
+	 * when crtc is detached from encoder, this pipe is used
+	 * to select manager operation
+	 */
+	manager->pipe = crtc;
+
+	if (overlay_ops && overlay_ops->commit)
+		overlay_ops->commit(manager->dev);
 }
 
 void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data)
@@ -265,6 +293,17 @@ void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data)
 	overlay_ops->mode_set(manager->dev, overlay);
 }
 
+void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data)
+{
+	struct exynos_drm_manager *manager =
+		to_exynos_encoder(encoder)->manager;
+	struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
+
+	DRM_DEBUG_KMS("\n");
+
+	overlay_ops->disable(manager->dev);
+}
+
 MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
 MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
 MODULE_AUTHOR("Seung-Woo Kim <sw0312.kim@samsung.com>");
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h b/drivers/gpu/drm/exynos/exynos_drm_encoder.h
index 5ecd645..a22acfb 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h
@@ -41,5 +41,6 @@ void exynos_drm_enable_vblank(struct drm_encoder *encoder, void *data);
 void exynos_drm_disable_vblank(struct drm_encoder *encoder, void *data);
 void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data);
 void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data);
+void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data);
 
 #endif
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 10/10] drm/exynos: checked for null pointer
  2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
                   ` (8 preceding siblings ...)
  2011-11-04 12:09 ` [PATCH 09/10] drm/exynos: added crtc dpms for disable crtc Seung-Woo Kim
@ 2011-11-04 12:09 ` Seung-Woo Kim
  9 siblings, 0 replies; 11+ messages in thread
From: Seung-Woo Kim @ 2011-11-04 12:09 UTC (permalink / raw)
  To: dri-devel, linux-kernel, airlied
  Cc: sw0312.kim, kyungmin.park, jy0922.shim, inki.dae

Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_encoder.c |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
index 4092f41..2d7a03c 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c
@@ -290,7 +290,8 @@ void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data)
 	struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
 	struct exynos_drm_overlay *overlay = data;
 
-	overlay_ops->mode_set(manager->dev, overlay);
+	if (overlay_ops && overlay_ops->mode_set)
+		overlay_ops->mode_set(manager->dev, overlay);
 }
 
 void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data)
@@ -301,7 +302,8 @@ void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data)
 
 	DRM_DEBUG_KMS("\n");
 
-	overlay_ops->disable(manager->dev);
+	if (overlay_ops && overlay_ops->disable)
+		overlay_ops->disable(manager->dev);
 }
 
 MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-11-04 12:12 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-04 12:09 [PATCH 00/10] drm/exynos: prepare multiple display controllers Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 01/10] drm/exynos: added padding to be 64-bit align Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 02/10] drm/exynos: added kms poll for handling hpd event Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 03/10] drm/exynos: fixed connector flag with hpd and interlace scan for hdmi Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 04/10] drm/exynos: fixed converting between display mode and timing Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 05/10] drm/exynos: added manager object to connector Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 06/10] drm/exynos: changed exynos_drm_display to exynos_drm_display_ops Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 07/10] drm/exynos: restored kernel_fb_list when reiniting fb_helper Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 08/10] drm/exynos: removed meaningless parameter from fbdev update Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 09/10] drm/exynos: added crtc dpms for disable crtc Seung-Woo Kim
2011-11-04 12:09 ` [PATCH 10/10] drm/exynos: checked for null pointer Seung-Woo Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).