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

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
...@@ -269,6 +269,8 @@ struct dss_device { ...@@ -269,6 +269,8 @@ struct dss_device {
struct dispc_device *dispc; struct dispc_device *dispc;
const struct dispc_ops *dispc_ops; const struct dispc_ops *dispc_ops;
const struct dss_mgr_ops *mgr_ops;
struct omap_drm_private *mgr_ops_priv;
}; };
/* core */ /* core */
......
...@@ -574,9 +574,10 @@ struct dss_mgr_ops { ...@@ -574,9 +574,10 @@ struct dss_mgr_ops {
void (*handler)(void *), void *data); 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); 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, int dss_mgr_connect(struct omap_dss_device *dssdev,
struct omap_dss_device *dst); struct omap_dss_device *dst);
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h> #include <linux/of.h>
#include "dss.h"
#include "omapdss.h" #include "omapdss.h"
static DEFINE_MUTEX(output_lock); static DEFINE_MUTEX(output_lock);
...@@ -99,32 +100,30 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device ...@@ -99,32 +100,30 @@ struct omap_dss_device *omapdss_find_output_from_display(struct omap_dss_device
} }
EXPORT_SYMBOL(omapdss_find_output_from_display); EXPORT_SYMBOL(omapdss_find_output_from_display);
static const struct dss_mgr_ops *dss_mgr_ops; int dss_install_mgr_ops(struct dss_device *dss,
static struct omap_drm_private *dss_mgr_ops_priv; const struct dss_mgr_ops *mgr_ops,
int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
struct omap_drm_private *priv) struct omap_drm_private *priv)
{ {
if (dss_mgr_ops) if (dss->mgr_ops)
return -EBUSY; return -EBUSY;
dss_mgr_ops = mgr_ops; dss->mgr_ops = mgr_ops;
dss_mgr_ops_priv = priv; dss->mgr_ops_priv = priv;
return 0; return 0;
} }
EXPORT_SYMBOL(dss_install_mgr_ops); 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 = NULL;
dss_mgr_ops_priv = NULL; dss->mgr_ops_priv = NULL;
} }
EXPORT_SYMBOL(dss_uninstall_mgr_ops); EXPORT_SYMBOL(dss_uninstall_mgr_ops);
int dss_mgr_connect(struct omap_dss_device *dssdev, struct omap_dss_device *dst) 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); dssdev->dispc_channel, dst);
} }
EXPORT_SYMBOL(dss_mgr_connect); EXPORT_SYMBOL(dss_mgr_connect);
...@@ -132,47 +131,54 @@ EXPORT_SYMBOL(dss_mgr_connect); ...@@ -132,47 +131,54 @@ EXPORT_SYMBOL(dss_mgr_connect);
void dss_mgr_disconnect(struct omap_dss_device *dssdev, void dss_mgr_disconnect(struct omap_dss_device *dssdev,
struct omap_dss_device *dst) 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); EXPORT_SYMBOL(dss_mgr_disconnect);
void dss_mgr_set_timings(struct omap_dss_device *dssdev, void dss_mgr_set_timings(struct omap_dss_device *dssdev,
const struct videomode *vm) 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); EXPORT_SYMBOL(dss_mgr_set_timings);
void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev, void dss_mgr_set_lcd_config(struct omap_dss_device *dssdev,
const struct dss_lcd_mgr_config *config) 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); dssdev->dispc_channel, config);
} }
EXPORT_SYMBOL(dss_mgr_set_lcd_config); EXPORT_SYMBOL(dss_mgr_set_lcd_config);
int dss_mgr_enable(struct omap_dss_device *dssdev) 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); EXPORT_SYMBOL(dss_mgr_enable);
void dss_mgr_disable(struct omap_dss_device *dssdev) 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); EXPORT_SYMBOL(dss_mgr_disable);
void dss_mgr_start_update(struct omap_dss_device *dssdev) 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); EXPORT_SYMBOL(dss_mgr_start_update);
int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev, int dss_mgr_register_framedone_handler(struct omap_dss_device *dssdev,
void (*handler)(void *), void *data) 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, dssdev->dispc_channel,
handler, data); handler, data);
} }
...@@ -181,7 +187,9 @@ EXPORT_SYMBOL(dss_mgr_register_framedone_handler); ...@@ -181,7 +187,9 @@ EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev, void dss_mgr_unregister_framedone_handler(struct omap_dss_device *dssdev,
void (*handler)(void *), void *data) 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, dssdev->dispc_channel,
handler, data); handler, data);
} }
......
...@@ -683,12 +683,12 @@ void omap_crtc_pre_init(struct omap_drm_private *priv) ...@@ -683,12 +683,12 @@ void omap_crtc_pre_init(struct omap_drm_private *priv)
{ {
memset(omap_crtcs, 0, sizeof(omap_crtcs)); 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 */ /* initialize crtc */
......
...@@ -33,7 +33,7 @@ struct videomode; ...@@ -33,7 +33,7 @@ struct videomode;
struct videomode *omap_crtc_timings(struct drm_crtc *crtc); struct videomode *omap_crtc_timings(struct drm_crtc *crtc);
enum omap_channel omap_crtc_channel(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_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_crtc *omap_crtc_init(struct drm_device *dev,
struct drm_plane *plane, struct omap_dss_device *dssdev); struct drm_plane *plane, struct omap_dss_device *dssdev);
int omap_crtc_wait_pending(struct drm_crtc *crtc); int omap_crtc_wait_pending(struct drm_crtc *crtc);
......
...@@ -638,7 +638,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) ...@@ -638,7 +638,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
destroy_workqueue(priv->wq); destroy_workqueue(priv->wq);
omap_disconnect_dssdevs(ddev); omap_disconnect_dssdevs(ddev);
err_crtc_uninit: err_crtc_uninit:
omap_crtc_pre_uninit(); omap_crtc_pre_uninit(priv);
drm_dev_unref(ddev); drm_dev_unref(ddev);
return ret; return ret;
} }
...@@ -666,7 +666,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv) ...@@ -666,7 +666,7 @@ static void omapdrm_cleanup(struct omap_drm_private *priv)
destroy_workqueue(priv->wq); destroy_workqueue(priv->wq);
omap_disconnect_dssdevs(ddev); omap_disconnect_dssdevs(ddev);
omap_crtc_pre_uninit(); omap_crtc_pre_uninit(priv);
drm_dev_unref(ddev); drm_dev_unref(ddev);
} }
......
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