Commit f2ea5577 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen

drm/omap: Don't call .detect() operation recursively

Instead of calling the .detect() operation recursively from the display
device back to the first device that provides hot plug detection
support, iterate over the devices manually in the DRM connector
.detect() implementation. 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 09e5bb6d
...@@ -372,6 +372,8 @@ static int dvic_probe(struct platform_device *pdev) ...@@ -372,6 +372,8 @@ static int dvic_probe(struct platform_device *pdev)
dssdev->type = OMAP_DISPLAY_TYPE_DVI; dssdev->type = OMAP_DISPLAY_TYPE_DVI;
dssdev->owner = THIS_MODULE; dssdev->owner = THIS_MODULE;
dssdev->of_ports = BIT(0); dssdev->of_ports = BIT(0);
dssdev->ops_flags = ddata->hpd_gpio || ddata->i2c_adapter
? OMAP_DSS_DEVICE_OP_DETECT : 0;
omapdss_display_init(dssdev); omapdss_display_init(dssdev);
omapdss_device_register(dssdev); omapdss_device_register(dssdev);
......
...@@ -141,10 +141,7 @@ static bool hdmic_detect(struct omap_dss_device *dssdev) ...@@ -141,10 +141,7 @@ static bool hdmic_detect(struct omap_dss_device *dssdev)
struct omap_dss_device *src = dssdev->src; struct omap_dss_device *src = dssdev->src;
bool connected; bool connected;
if (ddata->hpd_gpio) connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
else
connected = src->ops->detect(src);
if (!connected && src->ops->hdmi.lost_hotplug) if (!connected && src->ops->hdmi.lost_hotplug)
src->ops->hdmi.lost_hotplug(src); src->ops->hdmi.lost_hotplug(src);
return connected; return connected;
...@@ -317,6 +314,7 @@ static int hdmic_probe(struct platform_device *pdev) ...@@ -317,6 +314,7 @@ static int hdmic_probe(struct platform_device *pdev)
dssdev->type = OMAP_DISPLAY_TYPE_HDMI; dssdev->type = OMAP_DISPLAY_TYPE_HDMI;
dssdev->owner = THIS_MODULE; dssdev->owner = THIS_MODULE;
dssdev->of_ports = BIT(0); dssdev->of_ports = BIT(0);
dssdev->ops_flags = ddata->hpd_gpio ? OMAP_DSS_DEVICE_OP_DETECT : 0;
omapdss_display_init(dssdev); omapdss_display_init(dssdev);
omapdss_device_register(dssdev); omapdss_device_register(dssdev);
......
...@@ -132,8 +132,9 @@ static bool tpd_detect(struct omap_dss_device *dssdev) ...@@ -132,8 +132,9 @@ static bool tpd_detect(struct omap_dss_device *dssdev)
{ {
struct panel_drv_data *ddata = to_panel_data(dssdev); struct panel_drv_data *ddata = to_panel_data(dssdev);
struct omap_dss_device *src = dssdev->src; struct omap_dss_device *src = dssdev->src;
bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio); bool connected;
connected = gpiod_get_value_cansleep(ddata->hpd_gpio);
if (!connected && src->ops->hdmi.lost_hotplug) if (!connected && src->ops->hdmi.lost_hotplug)
src->ops->hdmi.lost_hotplug(src); src->ops->hdmi.lost_hotplug(src);
return connected; return connected;
...@@ -288,6 +289,7 @@ static int tpd_probe(struct platform_device *pdev) ...@@ -288,6 +289,7 @@ static int tpd_probe(struct platform_device *pdev)
dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI; dssdev->output_type = OMAP_DISPLAY_TYPE_HDMI;
dssdev->owner = THIS_MODULE; dssdev->owner = THIS_MODULE;
dssdev->of_ports = BIT(1) | BIT(0); dssdev->of_ports = BIT(1) | BIT(0);
dssdev->ops_flags = OMAP_DSS_DEVICE_OP_DETECT;
dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1); dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
if (IS_ERR(dssdev->next)) { if (IS_ERR(dssdev->next)) {
......
...@@ -61,26 +61,36 @@ static enum drm_connector_status omap_connector_detect( ...@@ -61,26 +61,36 @@ static enum drm_connector_status omap_connector_detect(
struct drm_connector *connector, bool force) struct drm_connector *connector, bool force)
{ {
struct omap_connector *omap_connector = to_omap_connector(connector); struct omap_connector *omap_connector = to_omap_connector(connector);
struct omap_dss_device *dssdev = omap_connector->dssdev; struct omap_dss_device *dssdev;
enum drm_connector_status ret; enum drm_connector_status status;
for (dssdev = omap_connector->dssdev; dssdev; dssdev = dssdev->src) {
if (dssdev->ops_flags & OMAP_DSS_DEVICE_OP_DETECT)
break;
}
if (dssdev->ops->detect) { if (dssdev) {
if (dssdev->ops->detect(dssdev)) if (dssdev->ops->detect(dssdev))
ret = connector_status_connected; status = connector_status_connected;
else else
ret = connector_status_disconnected; status = connector_status_disconnected;
} else if (dssdev->type == OMAP_DISPLAY_TYPE_DPI ||
dssdev->type == OMAP_DISPLAY_TYPE_DBI ||
dssdev->type == OMAP_DISPLAY_TYPE_SDI ||
dssdev->type == OMAP_DISPLAY_TYPE_DSI) {
ret = connector_status_connected;
} else { } else {
ret = connector_status_unknown; switch (omap_connector->dssdev->type) {
case OMAP_DISPLAY_TYPE_DPI:
case OMAP_DISPLAY_TYPE_DBI:
case OMAP_DISPLAY_TYPE_SDI:
case OMAP_DISPLAY_TYPE_DSI:
status = connector_status_connected;
break;
default:
status = connector_status_unknown;
break;
}
} }
VERB("%s: %d (force=%d)", omap_connector->dssdev->name, ret, force); VERB("%s: %d (force=%d)", omap_connector->dssdev->name, status, force);
return ret; return status;
} }
static void omap_connector_destroy(struct drm_connector *connector) static void omap_connector_destroy(struct drm_connector *connector)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment