Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74b65ec2 authored by Tomi Valkeinen's avatar Tomi Valkeinen
Browse files

OMAPDSS: add manager ops



The output drivers need some operations from the overlay managers, like
enable and set_timings. These will affect the dispc registers, and need
to be synchronized with the composition-side changes with overlays and
overlay managers.

We want to handle these calls in the apply.c in the compatibility mode,
but when in non-compat mode, the calls need to be handled by some other
component (e.g. omapdrm).

To make this possible, this patch creates a set of function pointers in
a dss_mgr_ops struct, that is used to redirect the calls into the
correct destination.

The non-compat users can install their mgr ops with
dss_install_mgr_ops() function.

Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 6abae7a1
Loading
Loading
Loading
Loading
+30 −6
Original line number Original line Diff line number Diff line
@@ -781,7 +781,7 @@ static void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
	}
	}
}
}


void dss_mgr_start_update(struct omap_overlay_manager *mgr)
static void dss_mgr_start_update_compat(struct omap_overlay_manager *mgr)
{
{
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	unsigned long flags;
	unsigned long flags;
@@ -1021,7 +1021,7 @@ static void dss_setup_fifos(void)
	}
	}
}
}


int dss_mgr_enable(struct omap_overlay_manager *mgr)
static int dss_mgr_enable_compat(struct omap_overlay_manager *mgr)
{
{
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	unsigned long flags;
	unsigned long flags;
@@ -1071,7 +1071,7 @@ int dss_mgr_enable(struct omap_overlay_manager *mgr)
	return r;
	return r;
}
}


void dss_mgr_disable(struct omap_overlay_manager *mgr)
static void dss_mgr_disable_compat(struct omap_overlay_manager *mgr)
{
{
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	struct mgr_priv_data *mp = get_mgr_priv(mgr);
	unsigned long flags;
	unsigned long flags;
@@ -1208,7 +1208,7 @@ static void dss_apply_mgr_timings(struct omap_overlay_manager *mgr,
	mp->extra_info_dirty = true;
	mp->extra_info_dirty = true;
}
}


void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
static void dss_mgr_set_timings_compat(struct omap_overlay_manager *mgr,
		const struct omap_video_timings *timings)
		const struct omap_video_timings *timings)
{
{
	unsigned long flags;
	unsigned long flags;
@@ -1236,7 +1236,7 @@ static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
	mp->extra_info_dirty = true;
	mp->extra_info_dirty = true;
}
}


void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
static void dss_mgr_set_lcd_config_compat(struct omap_overlay_manager *mgr,
		const struct dss_lcd_mgr_config *config)
		const struct dss_lcd_mgr_config *config)
{
{
	unsigned long flags;
	unsigned long flags;
@@ -1501,13 +1501,21 @@ static int dss_ovl_disable(struct omap_overlay *ovl)
	return r;
	return r;
}
}


static const struct dss_mgr_ops apply_mgr_ops = {
	.start_update = dss_mgr_start_update_compat,
	.enable = dss_mgr_enable_compat,
	.disable = dss_mgr_disable_compat,
	.set_timings = dss_mgr_set_timings_compat,
	.set_lcd_config = dss_mgr_set_lcd_config_compat,
};

static int compat_refcnt;
static int compat_refcnt;
static DEFINE_MUTEX(compat_init_lock);
static DEFINE_MUTEX(compat_init_lock);


int omapdss_compat_init(void)
int omapdss_compat_init(void)
{
{
	struct platform_device *pdev = dss_get_core_pdev();
	struct platform_device *pdev = dss_get_core_pdev();
	int i;
	int i, r;


	mutex_lock(&compat_init_lock);
	mutex_lock(&compat_init_lock);


@@ -1548,10 +1556,24 @@ int omapdss_compat_init(void)
		ovl->get_device = &dss_ovl_get_device;
		ovl->get_device = &dss_ovl_get_device;
	}
	}


	r = dss_install_mgr_ops(&apply_mgr_ops);
	if (r)
		goto err_mgr_ops;

out:
out:
	mutex_unlock(&compat_init_lock);
	mutex_unlock(&compat_init_lock);


	return 0;
	return 0;

err_mgr_ops:
	dss_uninit_overlay_managers(pdev);
	dss_uninit_overlays(pdev);

	compat_refcnt--;

	mutex_unlock(&compat_init_lock);

	return r;
}
}
EXPORT_SYMBOL(omapdss_compat_init);
EXPORT_SYMBOL(omapdss_compat_init);


@@ -1564,6 +1586,8 @@ void omapdss_compat_uninit(void)
	if (--compat_refcnt > 0)
	if (--compat_refcnt > 0)
		goto out;
		goto out;


	dss_uninstall_mgr_ops();

	dss_uninit_overlay_managers(pdev);
	dss_uninit_overlay_managers(pdev);
	dss_uninit_overlays(pdev);
	dss_uninit_overlays(pdev);
out:
out:
+13 −0
Original line number Original line Diff line number Diff line
@@ -523,4 +523,17 @@ static inline void dss_collect_irq_stats(u32 irqstatus, unsigned *irq_arr)
}
}
#endif
#endif


struct dss_mgr_ops {
	void (*start_update)(struct omap_overlay_manager *mgr);
	int (*enable)(struct omap_overlay_manager *mgr);
	void (*disable)(struct omap_overlay_manager *mgr);
	void (*set_timings)(struct omap_overlay_manager *mgr,
			const struct omap_video_timings *timings);
	void (*set_lcd_config)(struct omap_overlay_manager *mgr,
			const struct dss_lcd_mgr_config *config);
};

int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops);
void dss_uninstall_mgr_ops(void);

#endif
#endif
+44 −0
Original line number Original line Diff line number Diff line
@@ -113,3 +113,47 @@ struct omap_dss_output *omap_dss_get_output(enum omap_dss_output_id id)


	return NULL;
	return NULL;
}
}

static const struct dss_mgr_ops *dss_mgr_ops;

int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops)
{
	if (dss_mgr_ops)
		return -EBUSY;

	dss_mgr_ops = mgr_ops;

	return 0;
}

void dss_uninstall_mgr_ops(void)
{
	dss_mgr_ops = NULL;
}

void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
		const struct omap_video_timings *timings)
{
	dss_mgr_ops->set_timings(mgr, timings);
}

void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
		const struct dss_lcd_mgr_config *config)
{
	dss_mgr_ops->set_lcd_config(mgr, config);
}

int dss_mgr_enable(struct omap_overlay_manager *mgr)
{
	return dss_mgr_ops->enable(mgr);
}

void dss_mgr_disable(struct omap_overlay_manager *mgr)
{
	dss_mgr_ops->disable(mgr);
}

void dss_mgr_start_update(struct omap_overlay_manager *mgr)
{
	dss_mgr_ops->start_update(mgr);
}