Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27d62452 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen
Browse files

drm/omap: dss: Acquire next dssdev at probe time



Look up the next dssdev at probe time based on device tree links for all
DSS outputs and encoders. This will be used to reverse the order of the
dssdev connect and disconnect call chains.

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 c8719326
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -169,6 +169,13 @@ static int opa362_probe(struct platform_device *pdev)
	dssdev->owner = THIS_MODULE;
	dssdev->of_ports = BIT(1) | BIT(0);

	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
	if (IS_ERR(dssdev->next)) {
		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
			dev_err(&pdev->dev, "failed to find video sink\n");
		return PTR_ERR(dssdev->next);
	}

	omapdss_device_register(dssdev);

	return 0;
@@ -179,6 +186,8 @@ static int __exit opa362_remove(struct platform_device *pdev)
	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
	struct omap_dss_device *dssdev = &ddata->dssdev;

	if (dssdev->next)
		omapdss_device_put(dssdev->next);
	omapdss_device_unregister(&ddata->dssdev);

	WARN_ON(omapdss_device_is_enabled(dssdev));
+9 −0
Original line number Diff line number Diff line
@@ -192,6 +192,13 @@ static int tfp410_probe(struct platform_device *pdev)
	dssdev->owner = THIS_MODULE;
	dssdev->of_ports = BIT(1) | BIT(0);

	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
	if (IS_ERR(dssdev->next)) {
		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
			dev_err(&pdev->dev, "failed to find video sink\n");
		return PTR_ERR(dssdev->next);
	}

	omapdss_device_register(dssdev);

	return 0;
@@ -202,6 +209,8 @@ static int __exit tfp410_remove(struct platform_device *pdev)
	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
	struct omap_dss_device *dssdev = &ddata->dssdev;

	if (dssdev->next)
		omapdss_device_put(dssdev->next);
	omapdss_device_unregister(&ddata->dssdev);

	WARN_ON(omapdss_device_is_enabled(dssdev));
+9 −0
Original line number Diff line number Diff line
@@ -301,6 +301,13 @@ static int tpd_probe(struct platform_device *pdev)
	dssdev->owner = THIS_MODULE;
	dssdev->of_ports = BIT(1) | BIT(0);

	dssdev->next = omapdss_of_find_connected_device(pdev->dev.of_node, 1);
	if (IS_ERR(dssdev->next)) {
		if (PTR_ERR(dssdev->next) != -EPROBE_DEFER)
			dev_err(&pdev->dev, "failed to find video sink\n");
		return PTR_ERR(dssdev->next);
	}

	omapdss_device_register(dssdev);

	return 0;
@@ -311,6 +318,8 @@ static int __exit tpd_remove(struct platform_device *pdev)
	struct panel_drv_data *ddata = platform_get_drvdata(pdev);
	struct omap_dss_device *dssdev = &ddata->dssdev;

	if (dssdev->next)
		omapdss_device_put(dssdev->next);
	omapdss_device_unregister(&ddata->dssdev);

	WARN_ON(omapdss_device_is_enabled(dssdev));
+13 −4
Original line number Diff line number Diff line
@@ -688,7 +688,7 @@ static const struct omap_dss_device_ops dpi_ops = {
	.set_timings = dpi_set_timings,
};

static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
static int dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
{
	struct omap_dss_device *out = &dpi->output;
	u32 port_num = 0;
@@ -717,7 +717,16 @@ static void dpi_init_output_port(struct dpi_data *dpi, struct device_node *port)
	out->ops = &dpi_ops;
	out->owner = THIS_MODULE;

	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
	if (IS_ERR(out->next)) {
		if (PTR_ERR(out->next) != -EPROBE_DEFER)
			dev_err(out->dev, "failed to find video sink\n");
		return PTR_ERR(out->next);
	}

	omapdss_device_register(out);

	return 0;
}

static void dpi_uninit_output_port(struct device_node *port)
@@ -725,6 +734,8 @@ static void dpi_uninit_output_port(struct device_node *port)
	struct dpi_data *dpi = port->data;
	struct omap_dss_device *out = &dpi->output;

	if (out->next)
		omapdss_device_put(out->next);
	omapdss_device_unregister(out);
}

@@ -760,9 +771,7 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev,

	mutex_init(&dpi->lock);

	dpi_init_output_port(dpi, port);

	return 0;
	return dpi_init_output_port(dpi, port);
}

void dpi_uninit_port(struct device_node *port)
+16 −2
Original line number Diff line number Diff line
@@ -5165,7 +5165,7 @@ static const struct component_ops dsi_component_ops = {
 * Probe & Remove, Suspend & Resume
 */

static void dsi_init_output(struct dsi_data *dsi)
static int dsi_init_output(struct dsi_data *dsi)
{
	struct omap_dss_device *out = &dsi->output;

@@ -5180,13 +5180,24 @@ static void dsi_init_output(struct dsi_data *dsi)
	out->owner = THIS_MODULE;
	out->of_ports = BIT(0);

	out->next = omapdss_of_find_connected_device(out->dev->of_node, 0);
	if (IS_ERR(out->next)) {
		if (PTR_ERR(out->next) != -EPROBE_DEFER)
			dev_err(out->dev, "failed to find video sink\n");
		return PTR_ERR(out->next);
	}

	omapdss_device_register(out);

	return 0;
}

static void dsi_uninit_output(struct dsi_data *dsi)
{
	struct omap_dss_device *out = &dsi->output;

	if (out->next)
		omapdss_device_put(out->next);
	omapdss_device_unregister(out);
}

@@ -5431,7 +5442,9 @@ static int dsi_probe(struct platform_device *pdev)
	else
		dsi->num_lanes_supported = 3;

	dsi_init_output(dsi);
	r = dsi_init_output(dsi);
	if (r)
		goto err_pm_disable;

	r = dsi_probe_of(dsi);
	if (r) {
@@ -5451,6 +5464,7 @@ static int dsi_probe(struct platform_device *pdev)

err_uninit_output:
	dsi_uninit_output(dsi);
err_pm_disable:
	pm_runtime_disable(dev);
	return r;
}
Loading