All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RFC 1/5] drm/edid: Add support to get edid early
       [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
@ 2015-08-14 15:49 ` Srinivas Kandagatla
  2015-08-17  7:52     ` Jani Nikula
  2015-08-14 15:50 ` [PATCH RFC 2/5] drm/edid: export edid_vendor() Srinivas Kandagatla
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-14 15:49 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: David Airlie, linux-kernel, linux-arm-msm, robdclark, bjorn,
	Srinivas Kandagatla

This patch adds support to get edid way early before the connector is
created, this is mainly used for panel drivers to auto-probe the panel
based on the vendor and product id from EDID.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/gpu/drm/drm_edid.c | 8 ++++++++
 include/drm/drm_crtc.h     | 1 +
 2 files changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 7087da3..30359cd 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1388,6 +1388,14 @@ struct edid *drm_get_edid(struct drm_connector *connector,
 }
 EXPORT_SYMBOL(drm_get_edid);
 
+struct edid *drm_get_edid_early(struct i2c_adapter *adapter)
+{
+	struct drm_connector dummy_connector;
+
+	return drm_get_edid(&dummy_connector, adapter);
+}
+EXPORT_SYMBOL(drm_get_edid_early);
+
 /**
  * drm_edid_duplicate - duplicate an EDID and the extensions
  * @edid: EDID to duplicate
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 57ca8cc..35d8763 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1330,6 +1330,7 @@ extern void drm_reinit_primary_mode_group(struct drm_device *dev);
 extern bool drm_probe_ddc(struct i2c_adapter *adapter);
 extern struct edid *drm_get_edid(struct drm_connector *connector,
 				 struct i2c_adapter *adapter);
+extern struct edid *drm_get_edid_early(struct i2c_adapter *adapter);
 extern struct edid *drm_edid_duplicate(const struct edid *edid);
 extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
 extern void drm_mode_config_init(struct drm_device *dev);
-- 
1.9.1

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

* [PATCH RFC 2/5] drm/edid: export edid_vendor()
       [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
  2015-08-14 15:49 ` [PATCH RFC 1/5] drm/edid: Add support to get edid early Srinivas Kandagatla
@ 2015-08-14 15:50 ` Srinivas Kandagatla
  2015-08-14 15:50 ` [PATCH RFC 3/5] drm/panel: simple-panel: Add panel picker support Srinivas Kandagatla
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-14 15:50 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: David Airlie, linux-kernel, linux-arm-msm, robdclark, bjorn,
	Srinivas Kandagatla

This patch exports edid_vendor() match function, so that other drivers
could use it for matching the vendor id.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/gpu/drm/drm_edid.c | 4 ++--
 include/drm/drm_crtc.h     | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 30359cd..e0376ad 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1417,7 +1417,7 @@ EXPORT_SYMBOL(drm_edid_duplicate);
  *
  * Returns true if @vendor is in @edid, false otherwise
  */
-static bool edid_vendor(struct edid *edid, char *vendor)
+bool edid_vendor(struct edid *edid, char *vendor)
 {
 	char edid_vendor[3];
 
@@ -1428,7 +1428,7 @@ static bool edid_vendor(struct edid *edid, char *vendor)
 
 	return !strncmp(edid_vendor, vendor, 3);
 }
-
+EXPORT_SYMBOL(edid_vendor);
 /**
  * edid_get_quirks - return quirk flags for a given EDID
  * @edid: EDID to process
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 35d8763..bb6dc61 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1332,6 +1332,7 @@ extern struct edid *drm_get_edid(struct drm_connector *connector,
 				 struct i2c_adapter *adapter);
 extern struct edid *drm_get_edid_early(struct i2c_adapter *adapter);
 extern struct edid *drm_edid_duplicate(const struct edid *edid);
+extern bool edid_vendor(struct edid *edid, char *vendor);
 extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
 extern void drm_mode_config_init(struct drm_device *dev);
 extern void drm_mode_config_reset(struct drm_device *dev);
-- 
1.9.1

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

* [PATCH RFC 3/5] drm/panel: simple-panel: Add panel picker support.
       [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
  2015-08-14 15:49 ` [PATCH RFC 1/5] drm/edid: Add support to get edid early Srinivas Kandagatla
  2015-08-14 15:50 ` [PATCH RFC 2/5] drm/edid: export edid_vendor() Srinivas Kandagatla
@ 2015-08-14 15:50 ` Srinivas Kandagatla
  2015-08-14 15:51 ` [PATCH RFC 4/5] drm/msm: mdp4 lvds: continue if the panel is not connected Srinivas Kandagatla
  2015-08-14 15:51 ` [PATCH RFC 5/5] drm/msm: mdp4 lvds: Check the panel node in detect_panel() Srinivas Kandagatla
  4 siblings, 0 replies; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-14 15:50 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: David Airlie, linux-kernel, linux-arm-msm, robdclark, bjorn,
	Srinivas Kandagatla

This patch adds panel picker support to simple-panel.

The idea of panel picker is to select the correct panel timings if it
supports probing edid via DDC bus, edid contains manufacture ID
and Manufacturer product code, so it can match against the panel_picker
entries to get the correct panel timings.

>From DT point of view the panel picker uses generic compatible string
"panel-simple", keeping the panel specific compatible strings still
supported.

Panels can be static entry in the DT, but practically development boards
like IFC6410 where developers can connect any LVDS panel which makes it
difficult to maintian the dt support for those panels in dts file.
With this dynamic probing via panel picker makes it easy to support such
use-cases.
This patch also adds panel presence detection based, if there is no
panel detected or panel picker could not find the panel then the driver
would mark the panel DT node as disabled so that the drm driver would
be able to take right decision based on that panel node status.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/gpu/drm/panel/panel-simple.c | 83 +++++++++++++++++++++++++++++++++++-
 1 file changed, 81 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c
index f94201b..6c503b2 100644
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -32,6 +32,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_panel.h>
+#include <drm/drm_edid.h>
 
 #include <video/display_timing.h>
 #include <video/videomode.h>
@@ -70,6 +71,18 @@ struct panel_desc {
 	u32 bus_format;
 };
 
+#define PANEL_PICKER_ENTRY(vend, pid, pdesc) \
+		.vendor = vend, \
+		.product_id = (pid), \
+		.data = (pdesc)
+
+/* Panel picker entry with vendor and product id */
+struct panel_picker_entry {
+	char vendor[4]; /* Vendor string */
+	int product_id; /* product id field */
+	const struct panel_desc *data;
+};
+
 struct panel_simple {
 	struct drm_panel base;
 	bool prepared;
@@ -84,6 +97,8 @@ struct panel_simple {
 	struct gpio_desc *enable_gpio;
 };
 
+static const struct panel_desc *panel_picker_find_panel(struct edid *edid);
+
 static inline struct panel_simple *to_panel_simple(struct drm_panel *panel)
 {
 	return container_of(panel, struct panel_simple, base);
@@ -276,11 +291,28 @@ static const struct drm_panel_funcs panel_simple_funcs = {
 	.get_timings = panel_simple_get_timings,
 };
 
+static void __init simple_panel_node_disable(struct device_node *node)
+{
+	struct property *prop;
+
+	prop = kzalloc(sizeof(*prop), GFP_KERNEL);
+	if (!prop)
+		return;
+
+	prop->name = "status";
+	prop->value = "disabled";
+	prop->length = strlen((char *)prop->value)+1;
+
+	of_update_property(node, prop);
+}
+
+
 static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 {
 	struct device_node *backlight, *ddc;
 	struct panel_simple *panel;
 	int err;
+	struct edid *edid;
 
 	panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL);
 	if (!panel)
@@ -288,7 +320,6 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 
 	panel->enabled = false;
 	panel->prepared = false;
-	panel->desc = desc;
 
 	panel->supply = devm_regulator_get(dev, "power");
 	if (IS_ERR(panel->supply))
@@ -316,7 +347,25 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 		panel->ddc = of_find_i2c_adapter_by_node(ddc);
 		of_node_put(ddc);
 
-		if (!panel->ddc) {
+		if (panel->ddc) {
+			/* detect panel presence */
+			if (!drm_probe_ddc(panel->ddc)) {
+				err = -ENODEV;
+				goto nodev;
+			}
+
+			/* get panel from edid */
+			if (of_device_is_compatible(dev->of_node,
+						"panel-simple")) {
+				edid = drm_get_edid_early(panel->ddc);
+				if (edid) {
+					desc = panel_picker_find_panel(edid);
+				} else {
+					err = -ENODEV;
+					goto nodev;
+				}
+			}
+		} else {
 			err = -EPROBE_DEFER;
 			goto free_backlight;
 		}
@@ -325,6 +374,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 	drm_panel_init(&panel->base);
 	panel->base.dev = dev;
 	panel->base.funcs = &panel_simple_funcs;
+	panel->desc = desc;
 
 	err = drm_panel_add(&panel->base);
 	if (err < 0)
@@ -334,6 +384,10 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
 
 	return 0;
 
+nodev:
+	/* mark the dt as disabled */
+	simple_panel_node_disable(dev->of_node);
+
 free_ddc:
 	if (panel->ddc)
 		put_device(&panel->ddc->dev);
@@ -1036,6 +1090,10 @@ static const struct panel_desc shelly_sca07010_bfn_lnn = {
 	.bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 };
 
+static const struct panel_picker_entry panel_picker_list[] = {
+	{ PANEL_PICKER_ENTRY("AUO", 0x10dc, &auo_b101xtn01) },
+};
+
 static const struct of_device_id platform_of_match[] = {
 	{
 		.compatible = "ampire,am800480r3tmqwa1h",
@@ -1125,11 +1183,32 @@ static const struct of_device_id platform_of_match[] = {
 		.compatible = "shelly,sca07010-bfn-lnn",
 		.data = &shelly_sca07010_bfn_lnn,
 	}, {
+		/* Panel Picker Vendor ID and Product ID based Lookup */
+		.compatible = "panel-simple",
+	}, {
 		/* sentinel */
 	}
 };
 MODULE_DEVICE_TABLE(of, platform_of_match);
 
+static const struct panel_desc *panel_picker_find_panel(struct edid *edid)
+{
+	int i;
+	const struct panel_desc *desc = NULL;
+
+	for (i = 0; i < ARRAY_SIZE(panel_picker_list); i++) {
+		const struct panel_picker_entry *vp = &panel_picker_list[i];
+
+		if (edid_vendor(edid, (char *)vp->vendor) &&
+				(EDID_PRODUCT_ID(edid) == vp->product_id)) {
+			desc = vp->data;
+			break;
+		}
+	}
+
+	return desc;
+}
+
 static int panel_simple_platform_probe(struct platform_device *pdev)
 {
 	const struct of_device_id *id;
-- 
1.9.1

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

* [PATCH RFC 4/5] drm/msm: mdp4 lvds: continue if the panel is not connected
       [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
                   ` (2 preceding siblings ...)
  2015-08-14 15:50 ` [PATCH RFC 3/5] drm/panel: simple-panel: Add panel picker support Srinivas Kandagatla
@ 2015-08-14 15:51 ` Srinivas Kandagatla
  2015-08-14 15:51 ` [PATCH RFC 5/5] drm/msm: mdp4 lvds: Check the panel node in detect_panel() Srinivas Kandagatla
  4 siblings, 0 replies; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-14 15:51 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: David Airlie, linux-kernel, linux-arm-msm, robdclark, bjorn,
	Srinivas Kandagatla

Two issues:

1> Intializing panel specific bits without actual panel presence.
2> Bailing out if the detect_panel() return -ENODEV.

With the existing code if detect_panel() returns an error code the
driver would bail out without doing anything, However it could continue
intializing hdmi related things. This patch adds two things.

1> moves the panel specific intialization only if the panel is detected
2> let the driver continue with hdmi intialization if detect_panel()
return -ENODEV.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 72 +++++++++++++++++++--------------
 1 file changed, 41 insertions(+), 31 deletions(-)

diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
index 601dcc0..ad02b8b 100644
--- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
@@ -313,45 +313,55 @@ static int modeset_init(struct mdp4_kms *mdp4_kms)
 	if (IS_ERR(panel)) {
 		ret = PTR_ERR(panel);
 		dev_err(dev->dev, "failed to detect LVDS panel: %d\n", ret);
-		goto fail;
-	}
+		/**
+		 * Only fail if there is panel but not ready yet
+		 * continue with other stuff if there is no panel connected.
+		 */
+		if (ret == -EPROBE_DEFER)
+			goto fail;
+	} else {
+		plane = mdp4_plane_init(dev, RGB2, true);
+		if (IS_ERR(plane)) {
+			dev_err(dev->dev,
+				"failed to construct plane for RGB2\n");
+			ret = PTR_ERR(plane);
+			goto fail;
+		}
 
-	plane = mdp4_plane_init(dev, RGB2, true);
-	if (IS_ERR(plane)) {
-		dev_err(dev->dev, "failed to construct plane for RGB2\n");
-		ret = PTR_ERR(plane);
-		goto fail;
-	}
+		crtc  = mdp4_crtc_init(dev, plane, priv->num_crtcs, 0, DMA_P);
+		if (IS_ERR(crtc)) {
+			dev_err(dev->dev,
+				"failed to construct crtc for DMA_P\n");
+			ret = PTR_ERR(crtc);
+			goto fail;
+		}
 
-	crtc  = mdp4_crtc_init(dev, plane, priv->num_crtcs, 0, DMA_P);
-	if (IS_ERR(crtc)) {
-		dev_err(dev->dev, "failed to construct crtc for DMA_P\n");
-		ret = PTR_ERR(crtc);
-		goto fail;
-	}
+		encoder = mdp4_lcdc_encoder_init(dev, panel);
+		if (IS_ERR(encoder)) {
+			dev_err(dev->dev,
+				"failed to construct LCDC encoder\n");
+			ret = PTR_ERR(encoder);
+			goto fail;
+		}
 
-	encoder = mdp4_lcdc_encoder_init(dev, panel);
-	if (IS_ERR(encoder)) {
-		dev_err(dev->dev, "failed to construct LCDC encoder\n");
-		ret = PTR_ERR(encoder);
-		goto fail;
-	}
+		/* LCDC can be hooked to DMA_P: */
+		encoder->possible_crtcs = 1 << priv->num_crtcs;
 
-	/* LCDC can be hooked to DMA_P: */
-	encoder->possible_crtcs = 1 << priv->num_crtcs;
+		priv->crtcs[priv->num_crtcs++] = crtc;
+		priv->encoders[priv->num_encoders++] = encoder;
 
-	priv->crtcs[priv->num_crtcs++] = crtc;
-	priv->encoders[priv->num_encoders++] = encoder;
+		connector = mdp4_lvds_connector_init(dev, panel, encoder);
+		if (IS_ERR(connector)) {
+			ret = PTR_ERR(connector);
+			dev_err(dev->dev,
+				"failed to initialize LVDS connector: %d\n",
+				ret);
+			goto fail;
+		}
 
-	connector = mdp4_lvds_connector_init(dev, panel, encoder);
-	if (IS_ERR(connector)) {
-		ret = PTR_ERR(connector);
-		dev_err(dev->dev, "failed to initialize LVDS connector: %d\n", ret);
-		goto fail;
+		priv->connectors[priv->num_connectors++] = connector;
 	}
 
-	priv->connectors[priv->num_connectors++] = connector;
-
 	/*
 	 * Setup DTV/HDMI path: RGB1 -> DMA_E -> DTV -> HDMI:
 	 */
-- 
1.9.1

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

* [PATCH RFC 5/5] drm/msm: mdp4 lvds: Check the panel node in detect_panel()
       [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
                   ` (3 preceding siblings ...)
  2015-08-14 15:51 ` [PATCH RFC 4/5] drm/msm: mdp4 lvds: continue if the panel is not connected Srinivas Kandagatla
@ 2015-08-14 15:51 ` Srinivas Kandagatla
  4 siblings, 0 replies; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-14 15:51 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: David Airlie, linux-kernel, linux-arm-msm, robdclark, bjorn,
	Srinivas Kandagatla

This patch checks if the panel node is disabled in DT or not, this would
let us return proper error code so that the driver could stop panel
specific intialization.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
---
 drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
index ad02b8b..167f402 100644
--- a/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c
@@ -262,6 +262,11 @@ static struct drm_panel *detect_panel(struct drm_device *dev)
 
 	of_node_put(endpoint);
 
+	if (!of_device_is_available(panel_node)) {
+		dev_err(dev->dev, "panel is not enabled in DT\n");
+		return ERR_PTR(-ENODEV);
+	}
+
 	panel = of_drm_find_panel(panel_node);
 	if (!panel) {
 		of_node_put(panel_node);
-- 
1.9.1

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

* Re: [PATCH RFC 1/5] drm/edid: Add support to get edid early
  2015-08-14 15:49 ` [PATCH RFC 1/5] drm/edid: Add support to get edid early Srinivas Kandagatla
@ 2015-08-17  7:52     ` Jani Nikula
  0 siblings, 0 replies; 8+ messages in thread
From: Jani Nikula @ 2015-08-17  7:52 UTC (permalink / raw)
  To: Thierry Reding, dri-devel
  Cc: linux-arm-msm, Srinivas Kandagatla, linux-kernel

On Fri, 14 Aug 2015, Srinivas Kandagatla <srinivas.kandagatla@linaro.org> wrote:
> This patch adds support to get edid way early before the connector is
> created, this is mainly used for panel drivers to auto-probe the panel
> based on the vendor and product id from EDID.
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> ---
>  drivers/gpu/drm/drm_edid.c | 8 ++++++++
>  include/drm/drm_crtc.h     | 1 +
>  2 files changed, 9 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 7087da3..30359cd 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1388,6 +1388,14 @@ struct edid *drm_get_edid(struct drm_connector *connector,
>  }
>  EXPORT_SYMBOL(drm_get_edid);
>  
> +struct edid *drm_get_edid_early(struct i2c_adapter *adapter)
> +{
> +	struct drm_connector dummy_connector;
> +
> +	return drm_get_edid(&dummy_connector, adapter);

This will oops the kernel on bad EDID.

BR,
Jani.


> +}
> +EXPORT_SYMBOL(drm_get_edid_early);
> +
>  /**
>   * drm_edid_duplicate - duplicate an EDID and the extensions
>   * @edid: EDID to duplicate
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 57ca8cc..35d8763 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -1330,6 +1330,7 @@ extern void drm_reinit_primary_mode_group(struct drm_device *dev);
>  extern bool drm_probe_ddc(struct i2c_adapter *adapter);
>  extern struct edid *drm_get_edid(struct drm_connector *connector,
>  				 struct i2c_adapter *adapter);
> +extern struct edid *drm_get_edid_early(struct i2c_adapter *adapter);
>  extern struct edid *drm_edid_duplicate(const struct edid *edid);
>  extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
>  extern void drm_mode_config_init(struct drm_device *dev);
> -- 
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH RFC 1/5] drm/edid: Add support to get edid early
@ 2015-08-17  7:52     ` Jani Nikula
  0 siblings, 0 replies; 8+ messages in thread
From: Jani Nikula @ 2015-08-17  7:52 UTC (permalink / raw)
  To: Srinivas Kandagatla, Thierry Reding, dri-devel
  Cc: linux-arm-msm, linux-kernel, Srinivas Kandagatla

On Fri, 14 Aug 2015, Srinivas Kandagatla <srinivas.kandagatla@linaro.org> wrote:
> This patch adds support to get edid way early before the connector is
> created, this is mainly used for panel drivers to auto-probe the panel
> based on the vendor and product id from EDID.
>
> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> ---
>  drivers/gpu/drm/drm_edid.c | 8 ++++++++
>  include/drm/drm_crtc.h     | 1 +
>  2 files changed, 9 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 7087da3..30359cd 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1388,6 +1388,14 @@ struct edid *drm_get_edid(struct drm_connector *connector,
>  }
>  EXPORT_SYMBOL(drm_get_edid);
>  
> +struct edid *drm_get_edid_early(struct i2c_adapter *adapter)
> +{
> +	struct drm_connector dummy_connector;
> +
> +	return drm_get_edid(&dummy_connector, adapter);

This will oops the kernel on bad EDID.

BR,
Jani.


> +}
> +EXPORT_SYMBOL(drm_get_edid_early);
> +
>  /**
>   * drm_edid_duplicate - duplicate an EDID and the extensions
>   * @edid: EDID to duplicate
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 57ca8cc..35d8763 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -1330,6 +1330,7 @@ extern void drm_reinit_primary_mode_group(struct drm_device *dev);
>  extern bool drm_probe_ddc(struct i2c_adapter *adapter);
>  extern struct edid *drm_get_edid(struct drm_connector *connector,
>  				 struct i2c_adapter *adapter);
> +extern struct edid *drm_get_edid_early(struct i2c_adapter *adapter);
>  extern struct edid *drm_edid_duplicate(const struct edid *edid);
>  extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
>  extern void drm_mode_config_init(struct drm_device *dev);
> -- 
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Jani Nikula, Intel Open Source Technology Center

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

* Re: [PATCH RFC 1/5] drm/edid: Add support to get edid early
  2015-08-17  7:52     ` Jani Nikula
  (?)
@ 2015-08-17  9:44     ` Srinivas Kandagatla
  -1 siblings, 0 replies; 8+ messages in thread
From: Srinivas Kandagatla @ 2015-08-17  9:44 UTC (permalink / raw)
  To: Jani Nikula, Thierry Reding, dri-devel; +Cc: linux-arm-msm, linux-kernel



On 17/08/15 08:52, Jani Nikula wrote:
> On Fri, 14 Aug 2015, Srinivas Kandagatla <srinivas.kandagatla@linaro.org> wrote:
>> This patch adds support to get edid way early before the connector is
>> created, this is mainly used for panel drivers to auto-probe the panel
>> based on the vendor and product id from EDID.
>>
>> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
>> ---
>>   drivers/gpu/drm/drm_edid.c | 8 ++++++++
>>   include/drm/drm_crtc.h     | 1 +
>>   2 files changed, 9 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
>> index 7087da3..30359cd 100644
>> --- a/drivers/gpu/drm/drm_edid.c
>> +++ b/drivers/gpu/drm/drm_edid.c
>> @@ -1388,6 +1388,14 @@ struct edid *drm_get_edid(struct drm_connector *connector,
>>   }
>>   EXPORT_SYMBOL(drm_get_edid);
>>
>> +struct edid *drm_get_edid_early(struct i2c_adapter *adapter)
>> +{
>> +	struct drm_connector dummy_connector;
>> +
>> +	return drm_get_edid(&dummy_connector, adapter);
>
> This will oops the kernel on bad EDID.
>
Thanks for quick review,

Yes, you are right it would blow up on dev_warn(connector->dev->dev, ...

May we can fix this if we are happy to take this approach of getting 
edid early.

--srini
> BR,
> Jani.
>
>
>> +}
>> +EXPORT_SYMBOL(drm_get_edid_early);
>> +
>>   /**
>>    * drm_edid_duplicate - duplicate an EDID and the extensions
>>    * @edid: EDID to duplicate
>> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>> index 57ca8cc..35d8763 100644
>> --- a/include/drm/drm_crtc.h
>> +++ b/include/drm/drm_crtc.h
>> @@ -1330,6 +1330,7 @@ extern void drm_reinit_primary_mode_group(struct drm_device *dev);
>>   extern bool drm_probe_ddc(struct i2c_adapter *adapter);
>>   extern struct edid *drm_get_edid(struct drm_connector *connector,
>>   				 struct i2c_adapter *adapter);
>> +extern struct edid *drm_get_edid_early(struct i2c_adapter *adapter);
>>   extern struct edid *drm_edid_duplicate(const struct edid *edid);
>>   extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
>>   extern void drm_mode_config_init(struct drm_device *dev);
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>

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

end of thread, other threads:[~2015-08-17  9:45 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <439567280-13491-1-git-send-email-srinivas.kandagatla@linaro.org>
2015-08-14 15:49 ` [PATCH RFC 1/5] drm/edid: Add support to get edid early Srinivas Kandagatla
2015-08-17  7:52   ` Jani Nikula
2015-08-17  7:52     ` Jani Nikula
2015-08-17  9:44     ` Srinivas Kandagatla
2015-08-14 15:50 ` [PATCH RFC 2/5] drm/edid: export edid_vendor() Srinivas Kandagatla
2015-08-14 15:50 ` [PATCH RFC 3/5] drm/panel: simple-panel: Add panel picker support Srinivas Kandagatla
2015-08-14 15:51 ` [PATCH RFC 4/5] drm/msm: mdp4 lvds: continue if the panel is not connected Srinivas Kandagatla
2015-08-14 15:51 ` [PATCH RFC 5/5] drm/msm: mdp4 lvds: Check the panel node in detect_panel() Srinivas Kandagatla

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.