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

Commit ebfb821d authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm/tegra/for-4.16-rc7-fixes' of...

Merge tag 'drm/tegra/for-4.16-rc7-fixes' of git://anongit.freedesktop.org/tegra/linux into drm-fixes

drm/tegra: Fixes for v4.16-rc7

This contains two small fixes for the alpha blending support that was
merged into v4.16-rc1 and a fix for connector reference leaks caused by
the fact that display pipelines are no longer automatically disabled if
the framebuffer is removed.

Furthermore this contains a fix for a crash on IOMMU detach at driver
unbind time and a regulator enable/disable unbalance fix.

* tag 'drm/tegra/for-4.16-rc7-fixes' of git://anongit.freedesktop.org/tegra/linux:
  drm/tegra: Shutdown on driver unbind
  drm/tegra: dsi: Don't disable regulator on ->exit()
  drm/tegra: dc: Detach IOMMU group from domain only once
  drm/tegra: plane: Correct legacy blending
  drm/tegra: plane: Fix RGB565 format on older Tegra
parents c698ca52 192b4af6
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -1903,8 +1903,12 @@ static int tegra_dc_init(struct host1x_client *client)
	if (!IS_ERR(primary))
		drm_plane_cleanup(primary);

	if (group && tegra->domain) {
		iommu_detach_group(tegra->domain, group);
	if (group && dc->domain) {
		if (group == tegra->group) {
			iommu_detach_group(dc->domain, group);
			tegra->group = NULL;
		}

		dc->domain = NULL;
	}

@@ -1913,8 +1917,10 @@ static int tegra_dc_init(struct host1x_client *client)

static int tegra_dc_exit(struct host1x_client *client)
{
	struct drm_device *drm = dev_get_drvdata(client->parent);
	struct iommu_group *group = iommu_group_get(client->dev);
	struct tegra_dc *dc = host1x_client_to_dc(client);
	struct tegra_drm *tegra = drm->dev_private;
	int err;

	devm_free_irq(dc->dev, dc->irq, dc);
@@ -1926,7 +1932,11 @@ static int tegra_dc_exit(struct host1x_client *client)
	}

	if (group && dc->domain) {
		if (group == tegra->group) {
			iommu_detach_group(dc->domain, group);
			tegra->group = NULL;
		}

		dc->domain = NULL;
	}

+1 −0
Original line number Diff line number Diff line
@@ -250,6 +250,7 @@ static void tegra_drm_unload(struct drm_device *drm)

	drm_kms_helper_poll_fini(drm);
	tegra_drm_fb_exit(drm);
	drm_atomic_helper_shutdown(drm);
	drm_mode_config_cleanup(drm);

	err = host1x_device_exit(device);
+0 −1
Original line number Diff line number Diff line
@@ -1072,7 +1072,6 @@ static int tegra_dsi_exit(struct host1x_client *client)
	struct tegra_dsi *dsi = host1x_client_to_dsi(client);

	tegra_output_exit(&dsi->output);
	regulator_disable(dsi->vdd);

	return 0;
}
+6 −3
Original line number Diff line number Diff line
@@ -297,6 +297,10 @@ int tegra_plane_format_get_alpha(unsigned int opaque, unsigned int *alpha)
	case WIN_COLOR_DEPTH_B8G8R8X8:
		*alpha = WIN_COLOR_DEPTH_B8G8R8A8;
		return 0;

	case WIN_COLOR_DEPTH_B5G6R5:
		*alpha = opaque;
		return 0;
	}

	return -EINVAL;
@@ -330,9 +334,6 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra,
	unsigned int zpos[2];
	unsigned int i;

	for (i = 0; i < 3; i++)
		state->dependent[i] = false;

	for (i = 0; i < 2; i++)
		zpos[i] = 0;

@@ -346,6 +347,8 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra,

		index = tegra_plane_get_overlap_index(tegra, p);

		state->dependent[index] = false;

		/*
		 * If any of the other planes is on top of this plane and uses
		 * a format with an alpha component, mark this plane as being