Skip to contentSkip to conversation

drm/msm: Initial add eDP support in msm drm driver (V3)

PATCH New Hai Li 1 participant 5 messages Dec 12, 2014 – Jan 7, 2015

Subsystems (3)
lore
Share & tools
lore

Hai Li

author
#0 lore raw

PATCH 1/2 drm/msm: Initial add eDP support in msm drm driver (V3)

This change adds a new eDP connector in msm drm driver. With this change, eDP panel can work with msm platform under drm framework.

---
 drivers/gpu/drm/msm/Makefile            |    6 +
 drivers/gpu/drm/msm/edp/edp.c           |  210 +++++
 drivers/gpu/drm/msm/edp/edp.h           |   84 ++
 drivers/gpu/drm/msm/edp/edp_aux.c       |  268 ++++++
 drivers/gpu/drm/msm/edp/edp_bridge.c    |  124 +++
 drivers/gpu/drm/msm/edp/edp_connector.c |  161 ++++
 drivers/gpu/drm/msm/edp/edp_ctrl.c      | 1390 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/msm/edp/edp_phy.c       |  106 +++
 drivers/gpu/drm/msm/msm_drv.h           |    6 +
 9 files changed, 2355 insertions(+)
 create mode 100644 drivers/gpu/drm/msm/edp/edp.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp.h
 create mode 100644 drivers/gpu/drm/msm/edp/edp_aux.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_bridge.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_connector.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_ctrl.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_phy.c
drivers/gpu/drm/msm/Makefile +6 -0
index 143d988..e5464a0 100644
@@ -16,6 +16,12 @@ msm-y := \
 	hdmi/hdmi_phy_8960.o \
 	hdmi/hdmi_phy_8x60.o \
 	hdmi/hdmi_phy_8x74.o \
+	edp/edp.o \
+	edp/edp_aux.o \
+	edp/edp_bridge.o \
+	edp/edp_connector.o \
+	edp/edp_ctrl.o \
+	edp/edp_phy.o \
 	mdp/mdp_format.o \
 	mdp/mdp_kms.o \
 	mdp/mdp4/mdp4_crtc.o \
drivers/gpu/drm/msm/edp/edp.c new file +210 -0

210 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp.h new file +84 -0

84 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_aux.c new file +268 -0

268 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_bridge.c new file +124 -0

124 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_connector.c new file +161 -0

161 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_ctrl.c new file +1390 -0

1,390 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_phy.c new file +106 -0

106 lines not on this page · raw message

drivers/gpu/drm/msm/msm_drv.h +6 -0
index 1363038..3b25dd8 100644
@@ -76,6 +76,12 @@ struct msm_drm_private {
 	 */
 	struct hdmi *hdmi;
 
+	/* eDP is for mdp5 only, but kms has not been created
+	 * when edp_bind() and edp_init() are called. Here is the only
+	 * place to keep the edp instance.
+	 */
+	struct msm_edp *edp;
+
 	/* when we have more than one 'msm_gpu' these need to be an array: */
 	struct msm_gpu *gpu;
 	struct msm_file_private *lastctx;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
author
#1 lore raw

PATCH 1/2 drm/msm: Initial add eDP support in msm drm driver (V3)

This change adds a new eDP connector in msm drm driver. With this change, eDP panel can work with msm platform under drm framework.

V1: Initial change

V2: Address Rob's comments
Use generated header file for register definitions Change to devm_* APIs

V3: Address Thierry's comments and rebase on top of atomic changes
Remove edp_bridge_mode_fixup
Remove backlight control code and rely on pwm-backlight Remove continuous splash screen support for now Change to gpiod_* APIs

---
 drivers/gpu/drm/msm/Makefile            |    6 +
 drivers/gpu/drm/msm/edp/edp.c           |  210 +++++
 drivers/gpu/drm/msm/edp/edp.h           |   84 ++
 drivers/gpu/drm/msm/edp/edp_aux.c       |  268 ++++++
 drivers/gpu/drm/msm/edp/edp_bridge.c    |  124 +++
 drivers/gpu/drm/msm/edp/edp_connector.c |  161 ++++
 drivers/gpu/drm/msm/edp/edp_ctrl.c      | 1390 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/msm/edp/edp_phy.c       |  106 +++
 drivers/gpu/drm/msm/msm_drv.h           |    6 +
 9 files changed, 2355 insertions(+)
 create mode 100644 drivers/gpu/drm/msm/edp/edp.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp.h
 create mode 100644 drivers/gpu/drm/msm/edp/edp_aux.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_bridge.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_connector.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_ctrl.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_phy.c
drivers/gpu/drm/msm/Makefile +6 -0
index 143d988..e5464a0 100644
@@ -16,6 +16,12 @@ msm-y := \
 	hdmi/hdmi_phy_8960.o \
 	hdmi/hdmi_phy_8x60.o \
 	hdmi/hdmi_phy_8x74.o \
+	edp/edp.o \
+	edp/edp_aux.o \
+	edp/edp_bridge.o \
+	edp/edp_connector.o \
+	edp/edp_ctrl.o \
+	edp/edp_phy.o \
 	mdp/mdp_format.o \
 	mdp/mdp_kms.o \
 	mdp/mdp4/mdp4_crtc.o \
drivers/gpu/drm/msm/edp/edp.c new file +210 -0

210 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp.h new file +84 -0

84 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_aux.c new file +268 -0

268 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_bridge.c new file +124 -0

124 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_connector.c new file +161 -0

161 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_ctrl.c new file +1390 -0

1,390 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_phy.c new file +106 -0

106 lines not on this page · raw message

drivers/gpu/drm/msm/msm_drv.h +6 -0
index 1363038..3b25dd8 100644
@@ -76,6 +76,12 @@ struct msm_drm_private {
 	 */
 	struct hdmi *hdmi;
 
+	/* eDP is for mdp5 only, but kms has not been created
+	 * when edp_bind() and edp_init() are called. Here is the only
+	 * place to keep the edp instance.
+	 */
+	struct msm_edp *edp;
+
 	/* when we have more than one 'msm_gpu' these need to be an array: */
 	struct msm_gpu *gpu;
 	struct msm_file_private *lastctx;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
author
#2 lore raw

PATCH 1/1 drm/msm: Initial add eDP support in msm drm driver (V4)

This change adds a new eDP connector in msm drm driver. With this change, eDP panel can work with msm platform under drm framework.

V1: Initial change

V2: Address Rob's comments
Use generated header file for register definitions Change to devm_* APIs

V3: Address Thierry's comments and rebase on top of atomic changes
Remove edp_bridge_mode_fixup
Remove backlight control code and rely on pwm-backlight Remove continuous splash screen support for now Change to gpiod_* APIs

V4: Fix kbuild test issue

---
 drivers/gpu/drm/msm/Makefile            |    6 +
 drivers/gpu/drm/msm/edp/edp.c           |  208 +++++
 drivers/gpu/drm/msm/edp/edp.h           |   84 ++
 drivers/gpu/drm/msm/edp/edp_aux.c       |  268 ++++++
 drivers/gpu/drm/msm/edp/edp_bridge.c    |  124 +++
 drivers/gpu/drm/msm/edp/edp_connector.c |  161 ++++
 drivers/gpu/drm/msm/edp/edp_ctrl.c      | 1390 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/msm/edp/edp_phy.c       |  106 +++
 drivers/gpu/drm/msm/msm_drv.h           |    6 +
 9 files changed, 2353 insertions(+)
 create mode 100644 drivers/gpu/drm/msm/edp/edp.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp.h
 create mode 100644 drivers/gpu/drm/msm/edp/edp_aux.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_bridge.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_connector.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_ctrl.c
 create mode 100644 drivers/gpu/drm/msm/edp/edp_phy.c
drivers/gpu/drm/msm/Makefile +6 -0
index 143d988..e5464a0 100644
@@ -16,6 +16,12 @@ msm-y := \
 	hdmi/hdmi_phy_8960.o \
 	hdmi/hdmi_phy_8x60.o \
 	hdmi/hdmi_phy_8x74.o \
+	edp/edp.o \
+	edp/edp_aux.o \
+	edp/edp_bridge.o \
+	edp/edp_connector.o \
+	edp/edp_ctrl.o \
+	edp/edp_phy.o \
 	mdp/mdp_format.o \
 	mdp/mdp_kms.o \
 	mdp/mdp4/mdp4_crtc.o \
drivers/gpu/drm/msm/edp/edp.c new file +208 -0

208 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp.h new file +84 -0

84 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_aux.c new file +268 -0

268 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_bridge.c new file +124 -0

124 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_connector.c new file +161 -0

161 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_ctrl.c new file +1390 -0

1,390 lines not on this page · raw message

drivers/gpu/drm/msm/edp/edp_phy.c new file +106 -0

106 lines not on this page · raw message

drivers/gpu/drm/msm/msm_drv.h +6 -0
index 1363038..3b25dd8 100644
@@ -76,6 +76,12 @@ struct msm_drm_private {
 	 */
 	struct hdmi *hdmi;
 
+	/* eDP is for mdp5 only, but kms has not been created
+	 * when edp_bind() and edp_init() are called. Here is the only
+	 * place to keep the edp instance.
+	 */
+	struct msm_edp *edp;
+
 	/* when we have more than one 'msm_gpu' these need to be an array: */
 	struct msm_gpu *gpu;
 	struct msm_file_private *lastctx;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
author
#3 lore raw

PATCH 2/2 drm/msm: Add the eDP connector in msm drm driver

In reply to Hai Li

Modified the hard-coded hdmi connector/encoder implementations in msm drm driver to support both edp and hdmi.

---
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c | 38 +++++++++++++++++++++++--
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c     | 43 ++++++++++++++++++++---------
 drivers/gpu/drm/msm/msm_drv.c               |  2 ++
 drivers/gpu/drm/msm/msm_drv.h               |  6 ++++
 4 files changed, 74 insertions(+), 15 deletions(-)
drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c +36 -2
index 3ce82be..dd2e5fa 100644
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  * Copyright (C) 2013 Red Hat
  * Author: Rob Clark <[email protected]>
  *
@@ -162,11 +163,13 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 {
 	struct mdp5_encoder *mdp5_encoder = to_mdp5_encoder(encoder);
 	struct mdp5_kms *mdp5_kms = get_kms(encoder);
+	struct drm_device *dev = encoder->dev;
+	struct drm_connector *connector;
 	int intf = mdp5_encoder->intf;
 	uint32_t dtv_hsync_skew, vsync_period, vsync_len, ctrl_pol;
 	uint32_t display_v_start, display_v_end;
 	uint32_t hsync_start_x, hsync_end_x;
-	uint32_t format;
+	uint32_t format = 0x2100;
 	unsigned long flags;
 
 	mode = adjusted_mode;
@@ -188,7 +191,28 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 	/* probably need to get DATA_EN polarity from panel.. */
 
 	dtv_hsync_skew = 0;  /* get this from panel? */
-	format = 0x213f;     /* get this from panel? */
+
+	/* Get color format from panel, default is 8bpc */
+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+		if (connector->encoder == encoder) {
+			switch (connector->display_info.bpc) {
+			case 4:
+				format |= 0;
+				break;
+			case 5:
+				format |= 0x15;
+				break;
+			case 6:
+				format |= 0x2A;
+				break;
+			case 8:
+			default:
+				format |= 0x3F;
+				break;
+			}
+			break;
+		}
+	}
 
 	hsync_start_x = (mode->htotal - mode->hsync_start);
 	hsync_end_x = mode->htotal - (mode->hsync_start - mode->hdisplay) - 1;
@@ -198,6 +222,16 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 	display_v_start = (mode->vtotal - mode->vsync_start) * mode->htotal + dtv_hsync_skew;
 	display_v_end = vsync_period - ((mode->vsync_start - mode->vdisplay) * mode->htotal) + dtv_hsync_skew - 1;
 
+	/*
+	 * For edp only:
+	 * DISPLAY_V_START = (VBP * HCYCLE) + HBP
+	 * DISPLAY_V_END = (VBP + VACTIVE) * HCYCLE - 1 - HFP
+	 */
+	if (mdp5_encoder->intf_id == INTF_eDP) {
+		display_v_start += mode->htotal - mode->hsync_start;
+		display_v_end -= mode->hsync_start - mode->hdisplay;
+	}
+
 	spin_lock_irqsave(&mdp5_encoder->intf_lock, flags);
 
 	mdp5_write(mdp5_kms, REG_MDP5_INTF_HSYNC_CTL(intf),
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +30 -13

63 lines not on this page · raw message

drivers/gpu/drm/msm/msm_drv.c +2 -0
index d2e0a73..6f8aaea 100644
@@ -1023,6 +1023,7 @@ static struct platform_driver msm_platform_driver = {
 static int __init msm_drm_register(void)
 {
 	DBG("init");
+	msm_edp_register();
 	hdmi_register();
 	adreno_register();
 	return platform_driver_register(&msm_platform_driver);
@@ -1034,6 +1035,7 @@ static void __exit msm_drm_unregister(void)
 	platform_driver_unregister(&msm_platform_driver);
 	hdmi_unregister();
 	adreno_unregister();
+	msm_edp_unregister();
 }
 
 module_init(msm_drm_register);
drivers/gpu/drm/msm/msm_drv.h +6 -0
index 3b25dd8..c83abf3 100644
@@ -224,6 +224,12 @@ int hdmi_modeset_init(struct hdmi *hdmi, struct drm_device *dev,
 void __init hdmi_register(void);
 void __exit hdmi_unregister(void);
 
+struct msm_edp;
+void __init msm_edp_register(void);
+void __exit msm_edp_unregister(void);
+int msm_edp_modeset_init(struct msm_edp *edp, struct drm_device *dev,
+		struct drm_encoder *encoder);
+
 #ifdef CONFIG_DEBUG_FS
 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m);
 void msm_gem_describe_objects(struct list_head *list, struct seq_file *m);
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation
author
#4 lore raw

PATCH 2/2 drm/msm: Add the eDP connector in msm drm driver (V2)

Modified the hard-coded hdmi connector/encoder implementations in msm drm driver to support both edp and hdmi.

V1: Initial change

V2: Address Thierry's change

---
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c | 38 +++++++++++++++++++++++--
 drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c     | 43 ++++++++++++++++++++---------
 drivers/gpu/drm/msm/msm_drv.c               |  2 ++
 drivers/gpu/drm/msm/msm_drv.h               |  6 ++++
 4 files changed, 74 insertions(+), 15 deletions(-)
drivers/gpu/drm/msm/mdp/mdp5/mdp5_encoder.c +36 -2
index 3ce82be..dd2e5fa 100644
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
  * Copyright (C) 2013 Red Hat
  * Author: Rob Clark <[email protected]>
  *
@@ -162,11 +163,13 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 {
 	struct mdp5_encoder *mdp5_encoder = to_mdp5_encoder(encoder);
 	struct mdp5_kms *mdp5_kms = get_kms(encoder);
+	struct drm_device *dev = encoder->dev;
+	struct drm_connector *connector;
 	int intf = mdp5_encoder->intf;
 	uint32_t dtv_hsync_skew, vsync_period, vsync_len, ctrl_pol;
 	uint32_t display_v_start, display_v_end;
 	uint32_t hsync_start_x, hsync_end_x;
-	uint32_t format;
+	uint32_t format = 0x2100;
 	unsigned long flags;
 
 	mode = adjusted_mode;
@@ -188,7 +191,28 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 	/* probably need to get DATA_EN polarity from panel.. */
 
 	dtv_hsync_skew = 0;  /* get this from panel? */
-	format = 0x213f;     /* get this from panel? */
+
+	/* Get color format from panel, default is 8bpc */
+	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
+		if (connector->encoder == encoder) {
+			switch (connector->display_info.bpc) {
+			case 4:
+				format |= 0;
+				break;
+			case 5:
+				format |= 0x15;
+				break;
+			case 6:
+				format |= 0x2A;
+				break;
+			case 8:
+			default:
+				format |= 0x3F;
+				break;
+			}
+			break;
+		}
+	}
 
 	hsync_start_x = (mode->htotal - mode->hsync_start);
 	hsync_end_x = mode->htotal - (mode->hsync_start - mode->hdisplay) - 1;
@@ -198,6 +222,16 @@ static void mdp5_encoder_mode_set(struct drm_encoder *encoder,
 	display_v_start = (mode->vtotal - mode->vsync_start) * mode->htotal + dtv_hsync_skew;
 	display_v_end = vsync_period - ((mode->vsync_start - mode->vdisplay) * mode->htotal) + dtv_hsync_skew - 1;
 
+	/*
+	 * For edp only:
+	 * DISPLAY_V_START = (VBP * HCYCLE) + HBP
+	 * DISPLAY_V_END = (VBP + VACTIVE) * HCYCLE - 1 - HFP
+	 */
+	if (mdp5_encoder->intf_id == INTF_eDP) {
+		display_v_start += mode->htotal - mode->hsync_start;
+		display_v_end -= mode->hsync_start - mode->hdisplay;
+	}
+
 	spin_lock_irqsave(&mdp5_encoder->intf_lock, flags);
 
 	mdp5_write(mdp5_kms, REG_MDP5_INTF_HSYNC_CTL(intf),
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +30 -13

63 lines not on this page · raw message

drivers/gpu/drm/msm/msm_drv.c +2 -0
index d2e0a73..6f8aaea 100644
@@ -1023,6 +1023,7 @@ static struct platform_driver msm_platform_driver = {
 static int __init msm_drm_register(void)
 {
 	DBG("init");
+	msm_edp_register();
 	hdmi_register();
 	adreno_register();
 	return platform_driver_register(&msm_platform_driver);
@@ -1034,6 +1035,7 @@ static void __exit msm_drm_unregister(void)
 	platform_driver_unregister(&msm_platform_driver);
 	hdmi_unregister();
 	adreno_unregister();
+	msm_edp_unregister();
 }
 
 module_init(msm_drm_register);
drivers/gpu/drm/msm/msm_drv.h +6 -0
index 3b25dd8..c83abf3 100644
@@ -224,6 +224,12 @@ int hdmi_modeset_init(struct hdmi *hdmi, struct drm_device *dev,
 void __init hdmi_register(void);
 void __exit hdmi_unregister(void);
 
+struct msm_edp;
+void __init msm_edp_register(void);
+void __exit msm_edp_unregister(void);
+int msm_edp_modeset_init(struct msm_edp *edp, struct drm_device *dev,
+		struct drm_encoder *encoder);
+
 #ifdef CONFIG_DEBUG_FS
 void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m);
 void msm_gem_describe_objects(struct list_head *list, struct seq_file *m);
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
hosted by The Linux Foundation