#include <linux/slab.h>
 #include <linux/of.h>
 
+#include "dss.h"
 #include "omapdss.h"
 
 static DEFINE_MUTEX(output_lock);
 }
 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,
-                                   dssdev->dispc_channel, dst);
+       return dssdev->dss->mgr_ops->connect(dssdev->dss->mgr_ops_priv,
+                                            dssdev->dispc_channel, dst);
 }
 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->dispc_channel, config);
+       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,
-                                                      dssdev->dispc_channel,
-                                                      handler, data);
+       struct dss_device *dss = dssdev->dss;
+
+       return dss->mgr_ops->register_framedone_handler(dss->mgr_ops_priv,
+                                                       dssdev->dispc_channel,
+                                                       handler, data);
 }
 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,
-                                                 dssdev->dispc_channel,
-                                                 handler, data);
+       struct dss_device *dss = dssdev->dss;
+
+       dss->mgr_ops->unregister_framedone_handler(dss->mgr_ops_priv,
+                                                  dssdev->dispc_channel,
+                                                  handler, data);
 }
 EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler);