Commit 90279e95 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen
Browse files

drm/omap: Don't call EDID read operation recursively



Instead of calling the EDID read operation (.read_edid()) recursively
from the display device back to the first device that provides EDID read
support, iterate over the devices manually in the DRM connector code.
This moves the complexity to a single central location and simplifies
the logic in omap_dss_device drivers.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent f006325c
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -166,12 +166,6 @@ static int dvic_read_edid(struct omap_dss_device *dssdev,
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	int r, l, bytes_read;

	if (ddata->hpd_gpio && !gpiod_get_value_cansleep(ddata->hpd_gpio))
		return -ENODEV;

	if (!ddata->i2c_adapter)
		return -ENODEV;

	l = min(EDID_LENGTH, len);
	r = dvic_ddc_read(ddata->i2c_adapter, edid, l, 0);
	if (r)
@@ -341,10 +335,11 @@ static int dvic_probe(struct platform_device *pdev)
	dssdev->of_ports = BIT(0);

	if (ddata->hpd_gpio)
		dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT
		dssdev->ops_flags |= OMAP_DSS_DEVICE_OP_DETECT
				  |  OMAP_DSS_DEVICE_OP_HPD;
	else if (ddata->i2c_adapter)
		dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT;
	if (ddata->i2c_adapter)
		dssdev->ops_flags |= OMAP_DSS_DEVICE_OP_DETECT
				  |  OMAP_DSS_DEVICE_OP_EDID;

	omapdss_display_init(dssdev);
	omapdss_device_register(dssdev);
+0 −11
Original line number Diff line number Diff line
@@ -15,8 +15,6 @@
#include <linux/platform_device.h>
#include <linux/slab.h>

#include <drm/drm_edid.h>

#include "../dss/omapdss.h"

static const struct videomode hdmic_default_vm = {
@@ -126,14 +124,6 @@ static int hdmic_check_timings(struct omap_dss_device *dssdev,
	return src->ops->check_timings(src, vm);
}

static int hdmic_read_edid(struct omap_dss_device *dssdev,
		u8 *edid, int len)
{
	struct omap_dss_device *src = dssdev->src;

	return src->ops->read_edid(src, edid, len);
}

static bool hdmic_detect(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -190,7 +180,6 @@ static const struct omap_dss_device_ops hdmic_ops = {
	.get_timings		= hdmic_get_timings,
	.check_timings		= hdmic_check_timings,

	.read_edid		= hdmic_read_edid,
	.detect			= hdmic_detect,
	.register_hpd_cb	= hdmic_register_hpd_cb,
	.unregister_hpd_cb	= hdmic_unregister_hpd_cb,
+0 −13
Original line number Diff line number Diff line
@@ -115,18 +115,6 @@ static int tpd_check_timings(struct omap_dss_device *dssdev,
	return src->ops->check_timings(src, vm);
}

static int tpd_read_edid(struct omap_dss_device *dssdev,
		u8 *edid, int len)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	struct omap_dss_device *src = dssdev->src;

	if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
		return -ENODEV;

	return src->ops->read_edid(src, edid, len);
}

static bool tpd_detect(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -180,7 +168,6 @@ static const struct omap_dss_device_ops tpd_ops = {
	.disable		= tpd_disable,
	.check_timings		= tpd_check_timings,
	.set_timings		= tpd_set_timings,
	.read_edid		= tpd_read_edid,
	.detect			= tpd_detect,
	.register_hpd_cb	= tpd_register_hpd_cb,
	.unregister_hpd_cb	= tpd_unregister_hpd_cb,
+1 −0
Original line number Diff line number Diff line
@@ -711,6 +711,7 @@ static int hdmi4_init_output(struct omap_hdmi *hdmi)
	out->ops = &hdmi_ops;
	out->owner = THIS_MODULE;
	out->of_ports = BIT(0);
	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;

	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
	if (IS_ERR(out->next)) {
+1 −0
Original line number Diff line number Diff line
@@ -703,6 +703,7 @@ static int hdmi5_init_output(struct omap_hdmi *hdmi)
	out->ops = &hdmi_ops;
	out->owner = THIS_MODULE;
	out->of_ports = BIT(0);
	out->ops_flags = OMAP_DSS_DEVICE_OP_EDID;

	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
	if (IS_ERR(out->next)) {
Loading