Commit 845417b3 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen
Browse files

drm/omap: dss: Move DSS mgr ops and private data to dss_device



The DSS manager ops and private data pointer are specific to a DSS
instance. Store them in the dss_device structure instead of global
variable.

Signed-off-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent f324b279
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -269,6 +269,8 @@ struct dss_device {

	struct dispc_device *dispc;
	const struct dispc_ops *dispc_ops;
	const struct dss_mgr_ops *mgr_ops;
	struct omap_drm_private *mgr_ops_priv;
};

/* core */
+3 −2
Original line number Diff line number Diff line
@@ -574,9 +574,10 @@ struct dss_mgr_ops {
			void (*handler)(void *), void *data);
};

int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
int dss_install_mgr_ops(struct dss_device *dss,
			const struct dss_mgr_ops *mgr_ops,
			struct omap_drm_private *priv);
void dss_uninstall_mgr_ops(void);
void dss_uninstall_mgr_ops(struct dss_device *dss);

int dss_mgr_connect(struct omap_dss_device *dssdev,
		    struct omap_dss_device *dst);
+33 −25
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/slab.h>
#include <linux/of.h>

#include "dss.h"
#include "omapdss.h"

static DEFINE_MUTEX(output_lock);
@@ -99,32 +100,30 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
}
EXPORT_SYMBOL(omapdss_find_output_from_display);

static const struct dss_mgr_ops *dss_mgr_ops;
static struct omap_drm_private *dss_mgr_ops_priv;

int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
int dss_install_mgr_ops(struct dss_device *dss,
			const struct dss_mgr_ops *mgr_ops,
			struct omap_drm_private *priv)
{
	if (dss_mgr_ops)
	if (dss->mgr_ops)
		return -EBUSY;

	dss_mgr_ops = mgr_ops;
	dss_mgr_ops_priv = priv;
	dss->mgr_ops = mgr_ops;
	dss->mgr_ops_priv = priv;

	return 0;
}
EXPORT_SYMBOL(dss_install_mgr_ops);

void dss_uninstall_mgr_ops(void)
void dss_uninstall_mgr_ops(struct dss_device *dss)
{
	dss_mgr_ops = NULL;
	dss_mgr_ops_priv = NULL;
	dss->mgr_ops = NULL;
	dss->mgr_ops_priv = NULL;
}
EXPORT_SYMBOL(dss_uninstall_mgr_ops);

int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst)
{
	return dss_mgr_ops->connect(dss_mgr_ops_priv,
	return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
					     dssdev->dispc_channel, dst);
}
EXPORT_SYMBOL(dss_mgr_connect);
@@ -132,47 +131,54 @@ EXPORT_SYMBOL(dss_mgr_connect);
void dss_mgr_disconnect(struct omap_dss_device *dssdev,
			struct omap_dss_device *dst)
{
	dss_mgr_ops->disconnect(dss_mgr_ops_priv, dssdev->dispc_channel, dst);
	dssdev->dss->mgr_ops->disconnect(dssdev->dss->mgr_ops_priv,
					 dssdev->dispc_channel, dst);
}
EXPORT_SYMBOL(dss_mgr_disconnect);

void dss_mgr_set_timings(struct omap_dss_device *dssdev,
			 const struct videomode *vm)
{
	dss_mgr_ops->set_timings(dss_mgr_ops_priv, dssdev->dispc_channel, vm);
	dssdev->dss->mgr_ops->set_timings(dssdev->dss->mgr_ops_priv,
					  dssdev->dispc_channel, vm);
}
EXPORT_SYMBOL(dss_mgr_set_timings);

void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
		const struct dss_lcd_mgr_config *config)
{
	dss_mgr_ops->set_lcd_config(dss_mgr_ops_priv,
	dssdev->dss->mgr_ops->set_lcd_config(dssdev->dss->mgr_ops_priv,
					     dssdev->dispc_channel, config);
}
EXPORT_SYMBOL(dss_mgr_set_lcd_config);

int dss_mgr_enable(struct omap_dss_device *dssdev)
{
	return dss_mgr_ops->enable(dss_mgr_ops_priv, dssdev->dispc_channel);
	return dssdev->dss->mgr_ops->enable(dssdev->dss->mgr_ops_priv,
					    dssdev->dispc_channel);
}
EXPORT_SYMBOL(dss_mgr_enable);

void dss_mgr_disable(struct omap_dss_device *dssdev)
{
	dss_mgr_ops->disable(dss_mgr_ops_priv, dssdev->dispc_channel);
	dssdev->dss->mgr_ops->disable(dssdev->dss->mgr_ops_priv,
				      dssdev->dispc_channel);
}
EXPORT_SYMBOL(dss_mgr_disable);

void dss_mgr_start_update(struct omap_dss_device *dssdev)
{
	dss_mgr_ops->start_update(dss_mgr_ops_priv, dssdev->dispc_channel);
	dssdev->dss->mgr_ops->start_update(dssdev->dss->mgr_ops_priv,
					   dssdev->dispc_channel);
}
EXPORT_SYMBOL(dss_mgr_start_update);

int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev,
		void (*handler)(void *), void *data)
{
	return dss_mgr_ops->register_framedone_handler(dss_mgr_ops_priv,
	struct dss_device *dss = dssdev->dss;

	return dss->mgr_ops->register_framedone_handler(dss->mgr_ops_priv,
							dssdev->dispc_channel,
							handler, data);
}
@@ -181,7 +187,9 @@ EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
		void (*handler)(void *), void *data)
{
	dss_mgr_ops->unregister_framedone_handler(dss_mgr_ops_priv,
	struct dss_device *dss = dssdev->dss;

	dss->mgr_ops->unregister_framedone_handler(dss->mgr_ops_priv,
						   dssdev->dispc_channel,
						   handler, data);
}
+3 −3
Original line number Diff line number Diff line
@@ -683,12 +683,12 @@ void omap_crtc_pre_init(struct omap_drm_private *priv)
{
	memset(omap_crtcs, 0, sizeof(omap_crtcs));

	dss_install_mgr_ops(&mgr_ops, priv);
	dss_install_mgr_ops(priv->dss, &mgr_ops, priv);
}

void omap_crtc_pre_uninit(void)
void omap_crtc_pre_uninit(struct omap_drm_private *priv)
{
	dss_uninstall_mgr_ops();
	dss_uninstall_mgr_ops(priv->dss);
}

/* initialize crtc */
+1 −1
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@ struct videomode;
struct videomode *omap_crtc_timings(struct drm_crtc *crtc);
enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
void omap_crtc_pre_init(struct omap_drm_private *priv);
void omap_crtc_pre_uninit(void);
void omap_crtc_pre_uninit(struct omap_drm_private *priv);
struct drm_crtc *omap_crtc_init(struct drm_device *dev,
		struct drm_plane *plane, struct omap_dss_device *dssdev);
int omap_crtc_wait_pending(struct drm_crtc *crtc);
Loading