Commit e75d0477 authored by Thierry Reding's avatar Thierry Reding
Browse files

drm/tegra: dc: Don't clean up unused display controller



Display controllers that don't own any windows and which therefore
aren't currently being assigned a primary plane are not registered
as a CRTC with the DRM framework. They request neither a syncpoint
nor an interrupt because they don't use them, so avoid cleaning up
those resources.

Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent 0cffbde2
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -1978,6 +1978,23 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)
	return IRQ_HANDLED;
}

static bool tegra_dc_has_window_groups(struct tegra_dc *dc)
{
	unsigned int i;

	if (!dc->soc->wgrps)
		return true;

	for (i = 0; i < dc->soc->num_wgrps; i++) {
		const struct tegra_windowgroup_soc *wgrp = &dc->soc->wgrps[i];

		if (wgrp->dc == dc->pipe && wgrp->num_windows > 0)
			return true;
	}

	return false;
}

static int tegra_dc_init(struct host1x_client *client)
{
	struct drm_device *drm = dev_get_drvdata(client->parent);
@@ -1993,22 +2010,8 @@ static int tegra_dc_init(struct host1x_client *client)
	 * assign a primary plane to them, which in turn will cause KMS to
	 * crash.
	 */
	if (dc->soc->wgrps) {
		bool has_wgrps = false;
		unsigned int i;

		for (i = 0; i < dc->soc->num_wgrps; i++) {
			const struct tegra_windowgroup_soc *wgrp = &dc->soc->wgrps[i];

			if (wgrp->dc == dc->pipe && wgrp->num_windows > 0) {
				has_wgrps = true;
				break;
			}
		}

		if (!has_wgrps)
	if (!tegra_dc_has_window_groups(dc))
		return 0;
	}

	dc->syncpt = host1x_syncpt_request(client, flags);
	if (!dc->syncpt)
@@ -2094,6 +2097,9 @@ static int tegra_dc_exit(struct host1x_client *client)
	struct tegra_dc *dc = host1x_client_to_dc(client);
	int err;

	if (!tegra_dc_has_window_groups(dc))
		return 0;

	devm_free_irq(dc->dev, dc->irq, dc);

	err = tegra_dc_rgb_exit(dc);