Commit a5d704d3 authored by Dinghao Liu's avatar Dinghao Liu Committed by Tomi Valkeinen
Browse files

drm/omap: Fix runtime PM imbalance on error



pm_runtime_get_sync() increments the runtime PM usage counter
even when it returns an error code. However, users of its
direct wrappers in omapdrm assume that PM usage counter will
not change on error. Thus a pairing decrement is needed on
the error handling path for these wrappers to keep the counter
balanced.

Signed-off-by: default avatarDinghao Liu <dinghao.liu@zju.edu.cn>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200822065743.13671-1-dinghao.liu@zju.edu.cn
parent 1b409fda
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -653,8 +653,11 @@ int dispc_runtime_get(struct dispc_device *dispc)
	DSSDBG("dispc_runtime_get\n");

	r = pm_runtime_get_sync(&dispc->pdev->dev);
	WARN_ON(r < 0);
	return r < 0 ? r : 0;
	if (WARN_ON(r < 0)) {
		pm_runtime_put_noidle(&dispc->pdev->dev);
		return r;
	}
	return 0;
}

void dispc_runtime_put(struct dispc_device *dispc)
+5 −2
Original line number Diff line number Diff line
@@ -1112,8 +1112,11 @@ static int dsi_runtime_get(struct dsi_data *dsi)
	DSSDBG("dsi_runtime_get\n");

	r = pm_runtime_get_sync(dsi->dev);
	WARN_ON(r < 0);
	return r < 0 ? r : 0;
	if (WARN_ON(r < 0)) {
		pm_runtime_put_noidle(dsi->dev);
		return r;
	}
	return 0;
}

static void dsi_runtime_put(struct dsi_data *dsi)
+5 −2
Original line number Diff line number Diff line
@@ -858,8 +858,11 @@ int dss_runtime_get(struct dss_device *dss)
	DSSDBG("dss_runtime_get\n");

	r = pm_runtime_get_sync(&dss->pdev->dev);
	WARN_ON(r < 0);
	return r < 0 ? r : 0;
	if (WARN_ON(r < 0)) {
		pm_runtime_put_noidle(&dss->pdev->dev);
		return r;
	}
	return 0;
}

void dss_runtime_put(struct dss_device *dss)
+3 −3
Original line number Diff line number Diff line
@@ -43,10 +43,10 @@ static int hdmi_runtime_get(struct omap_hdmi *hdmi)
	DSSDBG("hdmi_runtime_get\n");

	r = pm_runtime_get_sync(&hdmi->pdev->dev);
	WARN_ON(r < 0);
	if (r < 0)
	if (WARN_ON(r < 0)) {
		pm_runtime_put_noidle(&hdmi->pdev->dev);
		return r;

	}
	return 0;
}

+3 −3
Original line number Diff line number Diff line
@@ -44,10 +44,10 @@ static int hdmi_runtime_get(struct omap_hdmi *hdmi)
	DSSDBG("hdmi_runtime_get\n");

	r = pm_runtime_get_sync(&hdmi->pdev->dev);
	WARN_ON(r < 0);
	if (r < 0)
	if (WARN_ON(r < 0)) {
		pm_runtime_put_noidle(&hdmi->pdev->dev);
		return r;

	}
	return 0;
}

Loading