Commit 64cb8179 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Tomi Valkeinen

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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
parent 28d79f3e
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#define DISPC_IRQ_ACBIAS_COUNT_STAT3 (1 << 29) #define DISPC_IRQ_ACBIAS_COUNT_STAT3 (1 << 29)
#define DISPC_IRQ_FRAMEDONE3 (1 << 30) #define DISPC_IRQ_FRAMEDONE3 (1 << 30)
struct omap_drm_private;
struct omap_dss_device; struct omap_dss_device;
struct dss_lcd_mgr_config; struct dss_lcd_mgr_config;
struct snd_aes_iec958; struct snd_aes_iec958;
...@@ -635,25 +636,35 @@ struct device_node *dss_of_port_get_parent_device(struct device_node *port); ...@@ -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); u32 dss_of_port_get_port_number(struct device_node *port);
struct dss_mgr_ops { struct dss_mgr_ops {
int (*connect)(enum omap_channel channel, int (*connect)(struct omap_drm_private *priv,
struct omap_dss_device *dst); enum omap_channel channel,
void (*disconnect)(enum omap_channel channel, struct omap_dss_device *dst);
struct omap_dss_device *dst); void (*disconnect)(struct omap_drm_private *priv,
enum omap_channel channel,
void (*start_update)(enum omap_channel channel); struct omap_dss_device *dst);
int (*enable)(enum omap_channel channel);
void (*disable)(enum omap_channel channel); void (*start_update)(struct omap_drm_private *priv,
void (*set_timings)(enum omap_channel channel, enum omap_channel channel);
const struct videomode *vm); int (*enable)(struct omap_drm_private *priv,
void (*set_lcd_config)(enum omap_channel channel, enum omap_channel channel);
const struct dss_lcd_mgr_config *config); void (*disable)(struct omap_drm_private *priv,
int (*register_framedone_handler)(enum omap_channel channel, 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 (*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); 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); void dss_uninstall_mgr_ops(void);
int dss_mgr_connect(struct omap_dss_device *dssdev, 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 ...@@ -170,13 +170,16 @@ 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; 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) if (dss_mgr_ops)
return -EBUSY; return -EBUSY;
dss_mgr_ops = mgr_ops; dss_mgr_ops = mgr_ops;
dss_mgr_ops_priv = priv;
return 0; return 0;
} }
...@@ -185,58 +188,62 @@ EXPORT_SYMBOL(dss_install_mgr_ops); ...@@ -185,58 +188,62 @@ EXPORT_SYMBOL(dss_install_mgr_ops);
void dss_uninstall_mgr_ops(void) void dss_uninstall_mgr_ops(void)
{ {
dss_mgr_ops = NULL; dss_mgr_ops = 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(dssdev->dispc_channel, dst); return dss_mgr_ops->connect(dss_mgr_ops_priv,
dssdev->dispc_channel, dst);
} }
EXPORT_SYMBOL(dss_mgr_connect); 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(dssdev->dispc_channel, dst); dss_mgr_ops->disconnect(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(dssdev->dispc_channel, vm); dss_mgr_ops->set_timings(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(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); 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(dssdev->dispc_channel); return dss_mgr_ops->enable(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(dssdev->dispc_channel); dss_mgr_ops->disable(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(dssdev->dispc_channel); dss_mgr_ops->start_update(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(dssdev->dispc_channel, return dss_mgr_ops->register_framedone_handler(dss_mgr_ops_priv,
dssdev->dispc_channel,
handler, data); handler, data);
} }
EXPORT_SYMBOL(dss_mgr_register_framedone_handler); EXPORT_SYMBOL(dss_mgr_register_framedone_handler);
...@@ -244,7 +251,8 @@ 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 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(dssdev->dispc_channel, dss_mgr_ops->unregister_framedone_handler(dss_mgr_ops_priv,
dssdev->dispc_channel,
handler, data); handler, data);
} }
EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler); EXPORT_SYMBOL(dss_mgr_unregister_framedone_handler);
...@@ -113,7 +113,8 @@ static struct omap_crtc *omap_crtcs[8]; ...@@ -113,7 +113,8 @@ static struct omap_crtc *omap_crtcs[8];
static struct omap_dss_device *omap_crtc_output[8]; static struct omap_dss_device *omap_crtc_output[8];
/* we can probably ignore these until we support command-mode panels: */ /* 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) struct omap_dss_device *dst)
{ {
const struct dispc_ops *dispc_ops = dispc_get_ops(); const struct dispc_ops *dispc_ops = dispc_get_ops();
...@@ -130,14 +131,16 @@ static int omap_crtc_dss_connect(enum omap_channel channel, ...@@ -130,14 +131,16 @@ static int omap_crtc_dss_connect(enum omap_channel channel,
return 0; 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) struct omap_dss_device *dst)
{ {
omap_crtc_output[channel] = NULL; omap_crtc_output[channel] = NULL;
dst->dispc_channel_connected = false; 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) ...@@ -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_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); priv->dispc_ops->mgr_set_timings(omap_crtc->channel, &omap_crtc->vm);
omap_crtc_set_enabled(&omap_crtc->base, true); omap_crtc_set_enabled(&omap_crtc->base, true);
...@@ -218,14 +221,16 @@ static int omap_crtc_dss_enable(enum omap_channel channel) ...@@ -218,14 +221,16 @@ static int omap_crtc_dss_enable(enum omap_channel channel)
return 0; 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]; struct omap_crtc *omap_crtc = omap_crtcs[channel];
omap_crtc_set_enabled(&omap_crtc->base, false); 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) const struct videomode *vm)
{ {
struct omap_crtc *omap_crtc = omap_crtcs[channel]; struct omap_crtc *omap_crtc = omap_crtcs[channel];
...@@ -233,25 +238,25 @@ static void omap_crtc_dss_set_timings(enum omap_channel channel, ...@@ -233,25 +238,25 @@ static void omap_crtc_dss_set_timings(enum omap_channel channel,
omap_crtc->vm = *vm; 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) const struct dss_lcd_mgr_config *config)
{ {
struct omap_crtc *omap_crtc = omap_crtcs[channel]; struct omap_crtc *omap_crtc = omap_crtcs[channel];
struct omap_drm_private *priv = omap_crtc->base.dev->dev_private;
DBG("%s", omap_crtc->name); DBG("%s", omap_crtc->name);
priv->dispc_ops->mgr_set_lcd_config(omap_crtc->channel, config); priv->dispc_ops->mgr_set_lcd_config(omap_crtc->channel, config);
} }
static int omap_crtc_dss_register_framedone( 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) void (*handler)(void *), void *data)
{ {
return 0; return 0;
} }
static void omap_crtc_dss_unregister_framedone( 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) void (*handler)(void *), void *data)
{ {
} }
...@@ -669,11 +674,11 @@ static const char *channel_names[] = { ...@@ -669,11 +674,11 @@ static const char *channel_names[] = {
[OMAP_DSS_CHANNEL_LCD3] = "lcd3", [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)); 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) void omap_crtc_pre_uninit(void)
......
...@@ -32,7 +32,7 @@ struct videomode; ...@@ -32,7 +32,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(void); void omap_crtc_pre_init(struct omap_drm_private *priv);
void omap_crtc_pre_uninit(void); void omap_crtc_pre_uninit(void);
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);
......
...@@ -521,7 +521,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev) ...@@ -521,7 +521,7 @@ static int omapdrm_init(struct omap_drm_private *priv, struct device *dev)
priv->dev = dev; priv->dev = dev;
omap_crtc_pre_init(); omap_crtc_pre_init(priv);
ret = omap_connect_dssdevs(); ret = omap_connect_dssdevs();
if (ret) if (ret)
......
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