drm: omapdrm: dss: Pass omap_drm_private pointer to dss_mgr_ops
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 13 Feb 2018 12:00:39 +0000 (14:00 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 1 Mar 2018 07:18:18 +0000 (09:18 +0200)
The dss_mgr_ops operations implemented by the omapdrm side have to look
up the omap_crtc objects from global variables as they are only passed a
channel number. In order to remove global variables in the omapdrm
driver pass the omap_drm_private pointer to the dss_mgr_ops. This
requires storing a pointer to the omap_drm_private in a global variable
on the DSS side as a temporary measure until the omapdrm and omapdss
drivers get merged.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
drivers/gpu/drm/omapdrm/dss/omapdss.h
drivers/gpu/drm/omapdrm/dss/output.c
drivers/gpu/drm/omapdrm/omap_crtc.c
drivers/gpu/drm/omapdrm/omap_crtc.h
drivers/gpu/drm/omapdrm/omap_drv.c

index aeaa337..318641f 100644 (file)
@@ -59,6 +59,7 @@
 #define DISPC_IRQ_ACBIAS_COUNT_STAT3   (1 << 29)
 #define DISPC_IRQ_FRAMEDONE3           (1 << 30)
 
+struct omap_drm_private;
 struct omap_dss_device;
 struct dss_lcd_mgr_config;
 struct snd_aes_iec958;
@@ -635,25 +636,35 @@ struct device_node *dss_of_port_get_parent_device(struct device_node *port);
 u32 dss_of_port_get_port_number(struct device_node *port);
 
 struct dss_mgr_ops {
-       int (*connect)(enum omap_channel channel,
-               struct omap_dss_device *dst);
-       void (*disconnect)(enum omap_channel channel,
-               struct omap_dss_device *dst);
-
-       void (*start_update)(enum omap_channel channel);
-       int (*enable)(enum omap_channel channel);
-       void (*disable)(enum omap_channel channel);
-       void (*set_timings)(enum omap_channel channel,
-                       const struct videomode *vm);
-       void (*set_lcd_config)(enum omap_channel channel,
-                       const struct dss_lcd_mgr_config *config);
-       int (*register_framedone_handler)(enum omap_channel channel,
+       int (*connect)(struct omap_drm_private *priv,
+                      enum omap_channel channel,
+                      struct omap_dss_device *dst);
+       void (*disconnect)(struct omap_drm_private *priv,
+                          enum omap_channel channel,
+                          struct omap_dss_device *dst);
+
+       void (*start_update)(struct omap_drm_private *priv,
+                            enum omap_channel channel);
+       int (*enable)(struct omap_drm_private *priv,
+                     enum omap_channel channel);
+       void (*disable)(struct omap_drm_private *priv,
+                       enum omap_channel channel);
+       void (*set_timings)(struct omap_drm_private *priv,
+                           enum omap_channel channel,
+                           const struct videomode *vm);
+       void (*set_lcd_config)(struct omap_drm_private *priv,
+                              enum omap_channel channel,
+                              const struct dss_lcd_mgr_config *config);
+       int (*register_framedone_handler)(struct omap_drm_private *priv,
+                       enum omap_channel channel,
                        void (*handler)(void *), void *data);
-       void (*unregister_framedone_handler)(enum omap_channel channel,
+       void (*unregister_framedone_handler)(struct omap_drm_private *priv,
+                       enum omap_channel channel,
                        void (*handler)(void *), void *data);
 };
 
-int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops);
+int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops,
+                       struct omap_drm_private *priv);
 void dss_uninstall_mgr_ops(void);
 
 int dss_mgr_connect(struct omap_dss_device *dssdev,
index 9ff29de..96b9d4c 100644 (file)
@@ -170,13 +170,16 @@ 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(const struct dss_mgr_ops *mgr_ops,
+                       struct omap_drm_private *priv)
 {
        if (dss_mgr_ops)
                return -EBUSY;
 
        dss_mgr_ops = mgr_ops;
+       dss_mgr_ops_priv = priv;
 
        return 0;
 }
@@ -185,58 +188,62 @@ EXPORT_SYMBOL(dss_install_mgr_ops);
 void dss_uninstall_mgr_ops(void)
 {
        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(dssdev->dispc_channel, dst);
+       return dss_mgr_ops->connect(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(dssdev->dispc_channel, dst);
+       dss_mgr_ops->disconnect(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(dssdev->dispc_channel, vm);
+       dss_mgr_ops->set_timings(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(dssdev->dispc_channel, config);
+       dss_mgr_ops->set_lcd_config(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(dssdev->dispc_channel);
+       return dss_mgr_ops->enable(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(dssdev->dispc_channel);
+       dss_mgr_ops->disable(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(dssdev->dispc_channel);
+       dss_mgr_ops->start_update(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(dssdev->dispc_channel,
+       return dss_mgr_ops->register_framedone_handler(dss_mgr_ops_priv,
+                                                      dssdev->dispc_channel,
                                                       handler, data);
 }
 EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
@@ -244,7 +251,8 @@ 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(dssdev->dispc_channel,
+       dss_mgr_ops->unregister_framedone_handler(dss_mgr_ops_priv,
+                                                 dssdev->dispc_channel,
                                                  handler, data);
 }
 EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler);
index 95615a8..61d8d17 100644 (file)
@@ -113,7 +113,8 @@ static struct omap_crtc *omap_crtcs[8];
 static struct omap_dss_device *omap_crtc_output[8];
 
 /* we can probably ignore these until we support command-mode panels: */
-static int omap_crtc_dss_connect(enum omap_channel channel,
+static int omap_crtc_dss_connect(struct omap_drm_private *priv,
+               enum omap_channel channel,
                struct omap_dss_device *dst)
 {
        const struct dispc_ops *dispc_ops = dispc_get_ops();
@@ -130,14 +131,16 @@ static int omap_crtc_dss_connect(enum omap_channel channel,
        return 0;
 }
 
-static void omap_crtc_dss_disconnect(enum omap_channel channel,
+static void omap_crtc_dss_disconnect(struct omap_drm_private *priv,
+               enum omap_channel channel,
                struct omap_dss_device *dst)
 {
        omap_crtc_output[channel] = NULL;
        dst->dispc_channel_connected = false;
 }
 
-static void omap_crtc_dss_start_update(enum omap_channel channel)
+static void omap_crtc_dss_start_update(struct omap_drm_private *priv,
+                                      enum omap_channel channel)
 {
 }
 
@@ -207,10 +210,10 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable)
 }
 
 
-static int omap_crtc_dss_enable(enum omap_channel channel)
+static int omap_crtc_dss_enable(struct omap_drm_private *priv,
+                               enum omap_channel channel)
 {
        struct omap_crtc *omap_crtc = omap_crtcs[channel];
-       struct omap_drm_private *priv = omap_crtc->base.dev->dev_private;
 
        priv->dispc_ops->mgr_set_timings(omap_crtc->channel, &omap_crtc->vm);
        omap_crtc_set_enabled(&omap_crtc->base, true);
@@ -218,14 +221,16 @@ static int omap_crtc_dss_enable(enum omap_channel channel)
        return 0;
 }
 
-static void omap_crtc_dss_disable(enum omap_channel channel)
+static void omap_crtc_dss_disable(struct omap_drm_private *priv,
+                                 enum omap_channel channel)
 {
        struct omap_crtc *omap_crtc = omap_crtcs[channel];
 
        omap_crtc_set_enabled(&omap_crtc->base, false);
 }
 
-static void omap_crtc_dss_set_timings(enum omap_channel channel,
+static void omap_crtc_dss_set_timings(struct omap_drm_private *priv,
+               enum omap_channel channel,
                const struct videomode *vm)
 {
        struct omap_crtc *omap_crtc = omap_crtcs[channel];
@@ -233,25 +238,25 @@ static void omap_crtc_dss_set_timings(enum omap_channel channel,
        omap_crtc->vm = *vm;
 }
 
-static void omap_crtc_dss_set_lcd_config(enum omap_channel channel,
+static void omap_crtc_dss_set_lcd_config(struct omap_drm_private *priv,
+               enum omap_channel channel,
                const struct dss_lcd_mgr_config *config)
 {
        struct omap_crtc *omap_crtc = omap_crtcs[channel];
-       struct omap_drm_private *priv = omap_crtc->base.dev->dev_private;
 
        DBG("%s", omap_crtc->name);
        priv->dispc_ops->mgr_set_lcd_config(omap_crtc->channel, config);
 }
 
 static int omap_crtc_dss_register_framedone(
-               enum omap_channel channel,
+               struct omap_drm_private *priv, enum omap_channel channel,
                void (*handler)(void *), void *data)
 {
        return 0;
 }
 
 static void omap_crtc_dss_unregister_framedone(
-               enum omap_channel channel,
+               struct omap_drm_private *priv, enum omap_channel channel,
                void (*handler)(void *), void *data)
 {
 }
@@ -669,11 +674,11 @@ static const char *channel_names[] = {
        [OMAP_DSS_CHANNEL_LCD3] = "lcd3",
 };
 
-void omap_crtc_pre_init(void)
+void omap_crtc_pre_init(struct omap_drm_private *priv)
 {
        memset(omap_crtcs, 0, sizeof(omap_crtcs));
 
-       dss_install_mgr_ops(&mgr_ops);
+       dss_install_mgr_ops(&mgr_ops, priv);
 }
 
 void omap_crtc_pre_uninit(void)
index 7f01e73..eaab2d7 100644 (file)
@@ -32,7 +32,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(void);
+void omap_crtc_pre_init(struct omap_drm_private *priv);
 void omap_crtc_pre_uninit(void);
 struct drm_crtc *omap_crtc_init(struct drm_device *dev,
                struct drm_plane *plane, struct omap_dss_device *dssdev);
index b571cc0..39e78f7 100644 (file)
@@ -521,7 +521,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
 
        priv->dev = dev;
 
-       omap_crtc_pre_init();
+       omap_crtc_pre_init(priv);
 
        ret = omap_connect_dssdevs();
        if (ret)