apply.c revision 5d5a97a6fbf98f82ae50c837eba3ebcfea0902f8
158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/*
258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Copyright (C) 2011 Texas Instruments
358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it
658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by
758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the Free Software Foundation.
858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT
1058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * more details.
1358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
1458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * You should have received a copy of the GNU General Public License along with
1558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * this program.  If not, see <http://www.gnu.org/licenses/>.
1658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
1758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
1858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#define DSS_SUBSYS_NAME "APPLY"
1958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/kernel.h>
2158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/slab.h>
2258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/spinlock.h>
2358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/jiffies.h>
2458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <video/omapdss.h>
2658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss.h"
2858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss_features.h"
2958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
3058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/*
3158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * We have 4 levels of cache for the dispc settings. First two are in SW and
3258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the latter two in HW.
3358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
3458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
3558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |overlay/manager_info|
3658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
3758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *        apply()
3958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
41d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * |       info         |
4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
44f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen *      write_regs()
4558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |  shadow registers  |
4858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable
5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |      registers     |
5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
57c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data {
58c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
59c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	bool user_info_dirty;
60c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct omap_overlay_info user_info;
61c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
6258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* If true, cache changed, but not written to shadow registers. Set
6358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * in apply(), cleared when registers written. */
6458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool dirty;
6558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* If true, shadow registers contain changed values not yet in real
6658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * registers. Set when writing to shadow registers, cleared at
6758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * VSYNC/EVSYNC */
6858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool shadow_dirty;
6958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info info;
7158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 fifo_low;
7358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 fifo_high;
74aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
75aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool extra_info_dirty;
76aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool shadow_extra_info_dirty;
77aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
78aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool enabled;
795d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	enum omap_channel channel;
8058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
8158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
82af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data {
83388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
84388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	bool user_info_dirty;
85388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct omap_overlay_manager_info user_info;
86388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
8758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* If true, cache changed, but not written to shadow registers. Set
8858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * in apply(), cleared when registers written. */
8958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool dirty;
9058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* If true, shadow registers contain changed values not yet in real
9158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * registers. Set when writing to shadow registers, cleared at
9258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	 * VSYNC/EVSYNC */
9358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool shadow_dirty;
9458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_manager_info info;
9658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	/* If true, GO bit is up and shadow registers cannot be written.
9843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	 * Never true for manual update displays */
9943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	bool busy;
10043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
10134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	/* If true, dispc output is enabled */
10234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	bool updating;
10334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
104bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	/* If true, a display is enabled using this manager */
105bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	bool enabled;
10658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
10758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
10858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct {
109c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
110af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
11158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
11258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool irq_enabled;
113d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data;
11458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */
116063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock;
1175558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */
1185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock);
119063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen
12075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void);
12175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
122c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl)
123c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{
124d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.ovl_priv_data_array[ovl->id];
125c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen}
126c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen
127af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
128af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{
129d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.mgr_priv_data_array[mgr->id];
130af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen}
131af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen
13258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void)
13358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
134c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	const int num_ovls = dss_feat_get_num_ovls();
135c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	int i;
136c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
137063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock_init(&data_lock);
138c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	for (i = 0; i < num_ovls; ++i) {
140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		struct ovl_priv_data *op;
141c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op = &dss_data.ovl_priv_data_array[i];
143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->info.global_alpha = 255;
145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		switch (i) {
147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 0:
148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder = 0;
149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 1:
151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0;
153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 2:
155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0;
157c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
158c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 3:
159c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
160c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0;
161c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
162c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		}
163c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
164c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->user_info = op->info;
165c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	}
16658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
16758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
16858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl)
16958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
17058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
17158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
17258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
17358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr)
17458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
17558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
17658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
17758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
17875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void)
17975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
18075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
18175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
18275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
18375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
18475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
18575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
18675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay *ovl;
18775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
18875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
18975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mp = get_mgr_priv(mgr);
19075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
19175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled)
19275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			continue;
19375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
19434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mgr_manual_update(mgr)) {
19534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch FRAMEDONE */
19634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->updating)
19734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
19834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		} else {
19934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch GO bit going down */
20034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->busy)
20134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
20275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
20334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to write new values to registers */
20434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->dirty)
20534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
20675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
20734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			list_for_each_entry(ovl, &mgr->overlays, list) {
20834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				struct ovl_priv_data *op;
20975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
21034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				op = get_ovl_priv(ovl);
21175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
21234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				if (!op->enabled)
21334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					continue;
21475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
21534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				/* to write new values to registers */
21634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				if (op->dirty || op->extra_info_dirty)
21734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					return true;
21834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			}
21975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
22075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
22175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
22275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
22375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
22475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
22575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr)
22675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
22775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
22875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp;
22975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op;
23075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
23175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	mp = get_mgr_priv(mgr);
23275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
23375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (mp->shadow_dirty)
23475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return true;
23575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
23675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
23775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op = get_ovl_priv(ovl);
23875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (op->shadow_dirty || op->shadow_extra_info_dirty)
23975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			return true;
24075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
24175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
24275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
24375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
24475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
24558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
24658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
24758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
248af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
24958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
25058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
25158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
25258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev = mgr->device;
25358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
25458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
25558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
25658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
25758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (mgr_manual_update(mgr))
25858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
25958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
260bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(mgr->id);
26158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
262af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
26358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
26458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
26558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		unsigned long flags;
26658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
26758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
268063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
269af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		dirty = mp->dirty;
270af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		shadow_dirty = mp->shadow_dirty;
271063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
27258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
27358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
27458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
27558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
27658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
27758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
27858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
27958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
28058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
28158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
28258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
28358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
28458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() not finishing\n",
28558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					mgr->id);
28658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
28758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
28858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
28958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
29058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
29158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
29258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
29358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
29458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
29558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id);
29658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
29758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
29858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
29958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
30058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
30158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
30258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
30358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
30458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
30558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
306c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
30758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev;
30858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
30958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
31058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
31158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
31258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!ovl->manager)
31358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
31458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
31558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	dssdev = ovl->manager->device;
31658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
31758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
31858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
31958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
32058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (ovl_manual_update(ovl))
32158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
32258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
323bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(ovl->manager->id);
32458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
325c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
32658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
32758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
32858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		unsigned long flags;
32958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
33058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
331063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
332c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen		dirty = op->dirty;
333c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen		shadow_dirty = op->shadow_dirty;
334063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
33558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
33658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
33758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
33858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
33958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
34058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
34158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
34258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
34358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
34458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
34558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
34658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
34758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() not finishing\n",
34858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					ovl->id);
34958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
35058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
35158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
35258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
35358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
35458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
35558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
35658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
35758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
35858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id);
35958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
36058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
36158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
36258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
36358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
36458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
36558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
36675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl)
36758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
36875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
36958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info *oi;
37058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool ilace, replication;
37134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
37258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
37358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
374f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", ovl->id);
37558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
37675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!op->enabled || !op->dirty)
37775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
37858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
37975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	oi = &op->info;
38058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
38158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	replication = dss_use_replication(ovl->manager->device, oi->color_mode);
38258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
38358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	ilace = ovl->manager->device->type == OMAP_DISPLAY_TYPE_VENC;
38458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
385f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	r = dispc_ovl_setup(ovl->id, oi, ilace, replication);
38658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (r) {
38775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/*
38875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * We can't do much here, as this function can be called from
38975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * vsync interrupt.
39075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 */
391f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen		DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id);
39275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
39375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/* This will leave fifo configurations in a nonoptimal state */
39475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op->enabled = false;
39575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_ovl_enable(ovl->id, false);
39675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
39758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
39858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
399c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high);
40058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
40134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
40234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
40375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	op->dirty = false;
40434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
40534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		op->shadow_dirty = true;
40658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
40758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
408aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl)
409aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
410aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
41134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
412aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
413aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	DSSDBGF("%d", ovl->id);
414aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
41575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!op->extra_info_dirty)
41675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
41775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
418aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	/* note: write also when op->enabled == false, so that the ovl gets
419aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	 * disabled */
420aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
421aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	dispc_ovl_enable(ovl->id, op->enabled);
4225d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	dispc_ovl_set_channel_out(ovl->id, op->channel);
42375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
42434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
42534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
42675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	op->extra_info_dirty = false;
42734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
42834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		op->shadow_extra_info_dirty = true;
429aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
430aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
431f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
43258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
43375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
43475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
43558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
436f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", mgr->id);
43758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
43875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mp->enabled)
43975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
44058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
44175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	WARN_ON(mp->busy);
44258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
44358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Commit overlay settings */
44475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
44575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_ovl_write_regs(ovl);
446aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		dss_ovl_write_regs_extra(ovl);
447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
44975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (mp->dirty) {
45075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_setup(mgr->id, &mp->info);
45158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
452af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp->dirty = false;
45334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mp->updating)
45434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			mp->shadow_dirty = true;
45558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
45675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
45775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
45875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void)
45975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
46075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
46175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
46258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
46358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
46475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
46575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
46675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
467af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
468af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp = get_mgr_priv(mgr);
46958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
47075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
47158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			continue;
47258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
47375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_mgr_write_regs(mgr);
47475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
47575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (need_go(mgr)) {
47643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			mp->busy = true;
47758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
47875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			if (!dss_data.irq_enabled && need_isr())
47975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen				dss_register_vsync_isr();
48058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
48175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			dispc_mgr_go(mgr->id);
48275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
48375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
48458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
48558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
48658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr)
48758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
488af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
489e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
490e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
491e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
49258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	WARN_ON(mp->updating);
49434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
49575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_mgr_write_regs(mgr);
49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = true;
49858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
50034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		dss_register_vsync_isr();
50158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5027797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen	dispc_mgr_enable(mgr->id, true);
503e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
504e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
50658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
507dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask);
508dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
509dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void)
510dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
511bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
512dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
513bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
514dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
515bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
516bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
517bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
518dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
51934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
52034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
52134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
522dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
523dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
524dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
525d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = true;
526dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
527dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
528dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void)
529dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
530bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
531dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
532bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
533dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
534bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
535bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
536bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
537dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
53834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
53934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
54034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
541dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask);
542dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
543dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
544d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = false;
545dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
546dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
5477609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
54858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
549c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct omap_overlay *ovl;
550af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
551c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
5527609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
5537609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	mp = get_mgr_priv(mgr);
5547609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	mp->shadow_dirty = false;
5557609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
5567609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
5577609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		op = get_ovl_priv(ovl);
5587609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		op->shadow_dirty = false;
5597609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		op->shadow_extra_info_dirty = false;
5607609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	}
5617609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen}
5627609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
5637609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask)
5647609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{
56558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
56675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
56758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
568063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock(&data_lock);
56958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5707609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	/* clear busy, updating flags, shadow_dirty flags */
57143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
5727609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct omap_overlay_manager *mgr;
5737609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct mgr_priv_data *mp;
5747609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
57543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
57643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mp = get_mgr_priv(mgr);
57743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
5787609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mp->enabled)
57943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			continue;
58043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
5817609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		mp->updating = dispc_mgr_is_enabled(i);
58258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5837609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mgr_manual_update(mgr)) {
5847609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			mp->busy = dispc_mgr_go_busy(i);
58543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
5867609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			if (!mp->busy)
5877609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
5887609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		} else {
5897609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			if (!mp->updating)
5907609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
5917609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		}
59258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
59358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
59475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
59558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
59675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!need_isr())
59775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_unregister_vsync_isr();
59858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
599063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock(&data_lock);
60058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
60158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6025738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl)
60358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
604c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
60558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
606c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
60758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
608c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	if (!op->user_info_dirty)
6095738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen		return;
61058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
611c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = false;
612c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op->dirty = true;
613c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->info = op->user_info;
61458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
61558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
61658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr)
61758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
618af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
61958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
620af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
62158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
62258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (mgr->device_changed) {
62358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		mgr->device_changed = false;
624388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen		mp->user_info_dirty  = true;
62558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
62658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
627388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	if (!mp->user_info_dirty)
62858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return;
62958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
630388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = false;
631af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp->dirty = true;
632388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->info = mp->user_info;
63358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
63458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
63558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl_fifos(struct omap_overlay *ovl)
63658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
637c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
63858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev;
63958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 size, burst_size;
64058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
641c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
64258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	dssdev = ovl->manager->device;
64458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	size = dispc_ovl_get_fifo_size(ovl->id);
64658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	burst_size = dispc_ovl_get_burst_size(ovl->id);
64858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	switch (dssdev->type) {
65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DPI:
65158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DBI:
65258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_SDI:
65358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_VENC:
65458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_HDMI:
65558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		default_get_overlay_fifo_thresholds(ovl->id, size,
656c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen				burst_size, &op->fifo_low,
657c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen				&op->fifo_high);
65858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		break;
65958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_DSI
66058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DSI:
66158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		dsi_get_overlay_fifo_thresholds(ovl->id, size,
662c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen				burst_size, &op->fifo_low,
663c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen				&op->fifo_high);
66458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		break;
66558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#endif
66658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	default:
66758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		BUG();
66858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
66958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
67058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
67158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
67258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
67307e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	int r;
67458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long flags;
67507e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	struct omap_overlay *ovl;
67658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
67758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
67858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
67958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	r = dispc_runtime_get();
68058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (r)
68158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return r;
68258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
683063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
68458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
68558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Configure overlays */
68607e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
68758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		omap_dss_mgr_apply_ovl(ovl);
68858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
68958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Configure manager */
69058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	omap_dss_mgr_apply_mgr(mgr);
69158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Configure overlay fifos */
69307e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
69458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		omap_dss_mgr_apply_ovl_fifos(ovl);
69558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
69758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
698063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
69958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
70058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	dispc_runtime_put();
70158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
70258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
70358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
70458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7057797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_enable(struct omap_overlay_manager *mgr)
7067797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
707bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
708bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
709bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
7105558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
7115558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
712bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
713bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
714bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = true;
715bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
71675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
71775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
71834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!mgr_manual_update(mgr))
71934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mp->updating = true;
72034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
721bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
7225558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
72375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mgr_manual_update(mgr))
72475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_enable(mgr->id, true);
72575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
7265558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
7277797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
7287797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
7297797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr)
7307797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
731bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
732bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
733bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
7345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
7355558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
7369a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen	if (!mgr_manual_update(mgr))
7379a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen		dispc_mgr_enable(mgr->id, false);
738bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
739bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
740bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
74134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = false;
742bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = false;
743bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
744bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
7455558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
7465558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
7477797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
7487797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
749eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr,
750eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
751eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
752388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
753e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
754e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
755e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
756e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
757388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info = *info;
758388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = true;
759eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
760e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
761e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
762eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
763eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
764eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
765eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr,
766eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
767eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
768388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
769e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
770e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
771e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
772e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
773388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	*info = mp->user_info;
774e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
775e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
776eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
777eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
778eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr,
779eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_dss_device *dssdev)
780eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
781eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	int r;
782eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
7835558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
7845558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
785eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (dssdev->manager) {
786eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' already has a manager '%s'\n",
787eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, dssdev->manager->name);
7885558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
7895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
790eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
791eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
792eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if ((mgr->supported_displays & dssdev->type) == 0) {
793eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' does not support manager '%s'\n",
794eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, mgr->name);
7955558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
7965558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
797eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
798eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
799eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	dssdev->manager = mgr;
800eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = dssdev;
801eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device_changed = true;
802eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
8035558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8045558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
805eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
8065558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
8075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
809eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
810eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
811eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr)
812eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
8135558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
8145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
8155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
8165558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
817eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (!mgr->device) {
818eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("failed to unset display, display not set.\n");
8195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
8205558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
821eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
822eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
823eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	/*
824eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * Don't allow currently enabled displays to have the overlay manager
825eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * pulled out from underneath them
826eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 */
8275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) {
8285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
8295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
8305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	}
831eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
832eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device->manager = NULL;
833eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = NULL;
834eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device_changed = true;
835eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
8365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
838eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
8395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
8405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
842eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
843eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
844eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
845eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
846f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl,
847f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
848f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
849c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
850e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
851e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
852e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
853e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
854c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info = *info;
855c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = true;
856f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
857e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
858e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
859f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
860f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
861f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
862f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl,
863f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
864f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
865c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
866e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
867e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
868e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
869e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
870c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	*info = op->user_info;
871e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
872e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
873f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
874f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
875f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl,
876f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_manager *mgr)
877f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
878aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
879aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
8805558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
8815558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
882f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!mgr)
883f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		return -EINVAL;
884f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
8855558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
8865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
887f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (ovl->manager) {
888f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay '%s' already has a manager '%s'\n",
889f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen				ovl->name, ovl->manager->name);
8905558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
8915558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
892f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
893f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
894aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
895aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
896aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
897aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
898f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to change the manager\n");
8995558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
901f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
902f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
9035d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = mgr->id;
9045d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->extra_info_dirty = true;
9055d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
906f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = mgr;
907f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_add_tail(&ovl->list, &mgr->overlays);
908f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
909aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
910aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
911f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	/* XXX: When there is an overlay on a DSI manual update display, and
912f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay is first disabled, then moved to tv, and enabled, we
913f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * seem to get SYNC_LOST_DIGIT error.
914f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
915f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Waiting doesn't seem to help, but updating the manual update display
916f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * after disabling the overlay seems to fix this. This hints that the
917f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * overlay is perhaps somehow tied to the LCD output until the output
918f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * is updated.
919f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
920f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Userspace workaround for this is to update the LCD after disabling
921f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay, but before moving the overlay to TV.
922f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 */
923f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
9245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
9255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
926f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
9275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
9285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
9295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
930f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
931f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
932f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl)
933f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
934aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
935aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
9365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
9375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
9385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
9395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
940f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!ovl->manager) {
941f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("failed to detach overlay: manager not set\n");
9425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
944f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
945f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
946aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
947aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
948aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
949aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
950f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to unset the manager\n");
9515558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9525558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
953f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
954f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
9555d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = -1;
9565d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
957f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = NULL;
958f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_del(&ovl->list);
959f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
960aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
961aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
962aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
963aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
964aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
965aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
966aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
967aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
968aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
969aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
970aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl)
971aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
972aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
973aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
974aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool e;
975aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
976aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
977aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
978aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	e = op->enabled;
979aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
980aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
981aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
982aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return e;
983aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
984aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
985aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl)
986aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
987aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
988aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
989aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
990aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
991aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
992aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
993aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (ovl->manager == NULL || ovl->manager->device == NULL) {
994aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
995aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
996aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
997aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
998aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
999aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1000aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	op->enabled = true;
1001aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	op->extra_info_dirty = true;
1002aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
100375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
100475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1005aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1006aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1007aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1008aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1009aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1010aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1011aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1012aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1013aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1014aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1015aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl)
1016aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1017aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1018aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1019aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1020aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1021aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1022aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1023aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (ovl->manager == NULL || ovl->manager->device == NULL) {
1024aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1025aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1026aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1027aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1028aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1029aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1030aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	op->enabled = false;
1031aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	op->extra_info_dirty = true;
1032aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
103375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
103475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1035aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1036aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
10375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1039f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1040aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
10415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
10425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1044f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1045f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1046