Commit ebfb821d authored by Dave Airlie's avatar Dave Airlie

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
...@@ -1903,8 +1903,12 @@ static int tegra_dc_init(struct host1x_client *client) ...@@ -1903,8 +1903,12 @@ static int tegra_dc_init(struct host1x_client *client)
if (!IS_ERR(primary)) if (!IS_ERR(primary))
drm_plane_cleanup(primary); drm_plane_cleanup(primary);
if (group && tegra->domain) { if (group && dc->domain) {
iommu_detach_group(tegra->domain, group); if (group == tegra->group) {
iommu_detach_group(dc->domain, group);
tegra->group = NULL;
}
dc->domain = NULL; dc->domain = NULL;
} }
...@@ -1913,8 +1917,10 @@ static int tegra_dc_init(struct host1x_client *client) ...@@ -1913,8 +1917,10 @@ static int tegra_dc_init(struct host1x_client *client)
static int tegra_dc_exit(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 iommu_group *group = iommu_group_get(client->dev);
struct tegra_dc *dc = host1x_client_to_dc(client); struct tegra_dc *dc = host1x_client_to_dc(client);
struct tegra_drm *tegra = drm->dev_private;
int err; int err;
devm_free_irq(dc->dev, dc->irq, dc); devm_free_irq(dc->dev, dc->irq, dc);
...@@ -1926,7 +1932,11 @@ static int tegra_dc_exit(struct host1x_client *client) ...@@ -1926,7 +1932,11 @@ static int tegra_dc_exit(struct host1x_client *client)
} }
if (group && dc->domain) { if (group && dc->domain) {
iommu_detach_group(dc->domain, group); if (group == tegra->group) {
iommu_detach_group(dc->domain, group);
tegra->group = NULL;
}
dc->domain = NULL; dc->domain = NULL;
} }
......
...@@ -250,6 +250,7 @@ static void tegra_drm_unload(struct drm_device *drm) ...@@ -250,6 +250,7 @@ static void tegra_drm_unload(struct drm_device *drm)
drm_kms_helper_poll_fini(drm); drm_kms_helper_poll_fini(drm);
tegra_drm_fb_exit(drm); tegra_drm_fb_exit(drm);
drm_atomic_helper_shutdown(drm);
drm_mode_config_cleanup(drm); drm_mode_config_cleanup(drm);
err = host1x_device_exit(device); err = host1x_device_exit(device);
......
...@@ -1072,7 +1072,6 @@ static int tegra_dsi_exit(struct host1x_client *client) ...@@ -1072,7 +1072,6 @@ static int tegra_dsi_exit(struct host1x_client *client)
struct tegra_dsi *dsi = host1x_client_to_dsi(client); struct tegra_dsi *dsi = host1x_client_to_dsi(client);
tegra_output_exit(&dsi->output); tegra_output_exit(&dsi->output);
regulator_disable(dsi->vdd);
return 0; return 0;
} }
......
...@@ -297,6 +297,10 @@ int tegra_plane_format_get_alpha(unsigned int opaque, unsigned int *alpha) ...@@ -297,6 +297,10 @@ int tegra_plane_format_get_alpha(unsigned int opaque, unsigned int *alpha)
case WIN_COLOR_DEPTH_B8G8R8X8: case WIN_COLOR_DEPTH_B8G8R8X8:
*alpha = WIN_COLOR_DEPTH_B8G8R8A8; *alpha = WIN_COLOR_DEPTH_B8G8R8A8;
return 0; return 0;
case WIN_COLOR_DEPTH_B5G6R5:
*alpha = opaque;
return 0;
} }
return -EINVAL; return -EINVAL;
...@@ -330,9 +334,6 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra, ...@@ -330,9 +334,6 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra,
unsigned int zpos[2]; unsigned int zpos[2];
unsigned int i; unsigned int i;
for (i = 0; i < 3; i++)
state->dependent[i] = false;
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
zpos[i] = 0; zpos[i] = 0;
...@@ -346,6 +347,8 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra, ...@@ -346,6 +347,8 @@ void tegra_plane_check_dependent(struct tegra_plane *tegra,
index = tegra_plane_get_overlap_index(tegra, p); 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 * 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 * a format with an alpha component, mark this plane as being
......
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