drm: omapdrm: dss: Pass omap_drm_private pointer to dss_mgr_ops
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>
This commit is contained in:

committed by
Tomi Valkeinen

parent
28d79f3e56
commit
64cb81797f
@@ -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);
|
||||
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)(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,
|
||||
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,
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user