Blob Blame History Raw
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Tue, 13 Feb 2018 14:00:41 +0200
Subject: drm: omapdrm: dss: Store dispc ops in dss_device structure
Git-commit: d3541ca81dbddeefa0c42df448211a9dbaef0843
Patch-mainline: v4.17-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

Remove the global dispc ops variable by storing it in the dss_device
structure.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/omapdrm/dss/base.c    |   13 ++++---------
 drivers/gpu/drm/omapdrm/dss/dispc.c   |    6 ++++--
 drivers/gpu/drm/omapdrm/dss/dss.h     |    2 ++
 drivers/gpu/drm/omapdrm/dss/omapdss.h |    3 +--
 drivers/gpu/drm/omapdrm/omap_crtc.c   |    4 +---
 drivers/gpu/drm/omapdrm/omap_drv.c    |    5 ++---
 6 files changed, 14 insertions(+), 19 deletions(-)

--- a/drivers/gpu/drm/omapdrm/dss/base.c
+++ b/drivers/gpu/drm/omapdrm/dss/base.c
@@ -18,10 +18,11 @@
 #include <linux/of.h>
 #include <linux/of_graph.h>
 #include <linux/list.h>
+
+#include "dss.h"
 #include "omapdss.h"
 
 static struct dss_device *dss_device;
-static const struct dispc_ops *ops;
 
 static struct list_head omapdss_comp_list;
 
@@ -43,15 +44,9 @@ void omapdss_set_dss(struct dss_device *
 }
 EXPORT_SYMBOL(omapdss_set_dss);
 
-void dispc_set_ops(const struct dispc_ops *o)
-{
-	ops = o;
-}
-EXPORT_SYMBOL(dispc_set_ops);
-
-const struct dispc_ops *dispc_get_ops(void)
+const struct dispc_ops *dispc_get_ops(struct dss_device *dss)
 {
-	return ops;
+	return dss->dispc_ops;
 }
 EXPORT_SYMBOL(dispc_get_ops);
 
--- a/drivers/gpu/drm/omapdrm/dss/dispc.c
+++ b/drivers/gpu/drm/omapdrm/dss/dispc.c
@@ -4622,7 +4622,7 @@ static int dispc_bind(struct device *dev
 
 	dispc_runtime_put();
 
-	dispc_set_ops(&dispc_ops);
+	dss->dispc_ops = &dispc_ops;
 
 	dispc.debugfs = dss_debugfs_create_file(dss, "dispc", dispc_dump_regs,
 						&dispc);
@@ -4637,9 +4637,11 @@ err_runtime_get:
 static void dispc_unbind(struct device *dev, struct device *master,
 			       void *data)
 {
+	struct dss_device *dss = dispc.dss;
+
 	dss_debugfs_remove_file(dispc.debugfs);
 
-	dispc_set_ops(NULL);
+	dss->dispc_ops = NULL;
 
 	pm_runtime_disable(dev);
 
--- a/drivers/gpu/drm/omapdrm/dss/dss.h
+++ b/drivers/gpu/drm/omapdrm/dss/dss.h
@@ -271,6 +271,8 @@ struct dss_device {
 	struct dss_pll *plls[4];
 	struct dss_pll	*video1_pll;
 	struct dss_pll	*video2_pll;
+
+	const struct dispc_ops *dispc_ops;
 };
 
 /* core */
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -733,8 +733,7 @@ struct dispc_ops {
 	const u32 *(*ovl_get_color_modes)(enum omap_plane_id plane);
 };
 
-void dispc_set_ops(const struct dispc_ops *o);
-const struct dispc_ops *dispc_get_ops(void);
+const struct dispc_ops *dispc_get_ops(struct dss_device *dss);
 
 bool omapdss_component_is_display(struct device_node *node);
 bool omapdss_component_is_output(struct device_node *node);
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -117,12 +117,10 @@ static int omap_crtc_dss_connect(struct
 		enum omap_channel channel,
 		struct omap_dss_device *dst)
 {
-	const struct dispc_ops *dispc_ops = dispc_get_ops();
-
 	if (omap_crtc_output[channel])
 		return -EINVAL;
 
-	if ((dispc_ops->mgr_get_supported_outputs(channel) & dst->id) == 0)
+	if (!(priv->dispc_ops->mgr_get_supported_outputs(channel) & dst->id))
 		return -EINVAL;
 
 	omap_crtc_output[channel] = dst;
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -520,6 +520,8 @@ static int omapdrm_init(struct omap_drm_
 	DBG("%s", dev_name(dev));
 
 	priv->dev = dev;
+	priv->dss = omapdss_get_dss();
+	priv->dispc_ops = dispc_get_ops(priv->dss);
 
 	omap_crtc_pre_init(priv);
 
@@ -527,9 +529,6 @@ static int omapdrm_init(struct omap_drm_
 	if (ret)
 		goto err_crtc_uninit;
 
-	priv->dss = omapdss_get_dss();
-	priv->dispc_ops = dispc_get_ops();
-
 	soc = soc_device_match(omapdrm_soc_devices);
 	priv->omaprev = soc ? (unsigned int)soc->data : 0;
 	priv->wq = alloc_ordered_workqueue("omapdrm", 0);