Hi, On Tue, Feb 13, 2018 at 02:00:39PM +0200, Laurent Pinchart wrote: > 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@xxxxxxxxxxxxxxxx> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx> -- Sebastian > drivers/gpu/drm/omapdrm/dss/omapdss.h | 41 ++++++++++++++++++++++------------- > drivers/gpu/drm/omapdrm/dss/output.c | 28 +++++++++++++++--------- > drivers/gpu/drm/omapdrm/omap_crtc.c | 31 +++++++++++++++----------- > drivers/gpu/drm/omapdrm/omap_crtc.h | 2 +- > drivers/gpu/drm/omapdrm/omap_drv.c | 2 +- > 5 files changed, 64 insertions(+), 40 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h > index aeaa337b29c7..318641f5bc24 100644 > --- a/drivers/gpu/drm/omapdrm/dss/omapdss.h > +++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h > @@ -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, > diff --git a/drivers/gpu/drm/omapdrm/dss/output.c b/drivers/gpu/drm/omapdrm/dss/output.c > index 9ff29dea28ce..96b9d4cd505f 100644 > --- a/drivers/gpu/drm/omapdrm/dss/output.c > +++ b/drivers/gpu/drm/omapdrm/dss/output.c > @@ -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); > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c > index 95615a86e9f7..61d8d17a4243 100644 > --- a/drivers/gpu/drm/omapdrm/omap_crtc.c > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c > @@ -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) > diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.h b/drivers/gpu/drm/omapdrm/omap_crtc.h > index 7f01e730a050..eaab2d7f0324 100644 > --- a/drivers/gpu/drm/omapdrm/omap_crtc.h > +++ b/drivers/gpu/drm/omapdrm/omap_crtc.h > @@ -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); > diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c > index b571cc04e08d..39e78f765f7e 100644 > --- a/drivers/gpu/drm/omapdrm/omap_drv.c > +++ b/drivers/gpu/drm/omapdrm/omap_drv.c > @@ -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) > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel