apply.c revision e70f98acaa84ec9ad55e544d0dc8b2d0a36bbeca
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 *
340b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *       set_info()
350b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *          v
3658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
370b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * |     user_info      |
3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
3958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *        apply()
4158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
43d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * |       info         |
4458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
46f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen *      write_regs()
4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |  shadow registers  |
5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable
5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |      registers     |
5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
5858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
59c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data {
60c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
61c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	bool user_info_dirty;
62c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct omap_overlay_info user_info;
63c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
640b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
6558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info info;
6658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
670b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
680b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
69aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool extra_info_dirty;
70aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool shadow_extra_info_dirty;
71aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
72aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool enabled;
735d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	enum omap_channel channel;
746dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
7558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
7658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
77af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data {
78388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
79388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	bool user_info_dirty;
80388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct omap_overlay_manager_info user_info;
81388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
820b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
8358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_manager_info info;
8458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
850b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
860b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
8743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	/* If true, GO bit is up and shadow registers cannot be written.
8843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	 * Never true for manual update displays */
8943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	bool busy;
9043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	/* If true, dispc output is enabled */
9234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	bool updating;
9334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
94bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	/* If true, a display is enabled using this manager */
95bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	bool enabled;
9658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
9758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct {
99c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
100af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
10158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
10258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool irq_enabled;
103d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data;
10458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
105d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */
106063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock;
1075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */
1085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock);
109f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic DECLARE_COMPLETION(extra_updated_completion);
110063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen
11175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void);
11275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
113c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl)
114c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{
115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.ovl_priv_data_array[ovl->id];
116c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen}
117c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen
118af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
119af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{
120d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.mgr_priv_data_array[mgr->id];
121af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen}
122af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen
12358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void)
12458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
125c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	const int num_ovls = dss_feat_get_num_ovls();
126c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	int i;
127c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
128063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock_init(&data_lock);
129c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
130c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	for (i = 0; i < num_ovls; ++i) {
131c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		struct ovl_priv_data *op;
132c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
133c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op = &dss_data.ovl_priv_data_array[i];
134c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
135c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->info.global_alpha = 255;
136c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
137c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		switch (i) {
138c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 0:
139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder = 0;
140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
141c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 1:
142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0;
144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 2:
146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0;
148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 3:
150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0;
152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		}
154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->user_info = op->info;
156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	}
15758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
15858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
15958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl)
16058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
16158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
16258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
16358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
16458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr)
16558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
16658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
16758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
16858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
16975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void)
17075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
17175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
17275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
17375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
17475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
17575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
17675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
17775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay *ovl;
17875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
17975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
18075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mp = get_mgr_priv(mgr);
18175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
18275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled)
18375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			continue;
18475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
18534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mgr_manual_update(mgr)) {
18634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch FRAMEDONE */
18734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->updating)
18834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
18934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		} else {
19034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch GO bit going down */
19134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->busy)
19234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
19375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
19434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to write new values to registers */
1950b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			if (mp->info_dirty)
19634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
19775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
19834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			list_for_each_entry(ovl, &mgr->overlays, list) {
19934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				struct ovl_priv_data *op;
20075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
20134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				op = get_ovl_priv(ovl);
20275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
20334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				if (!op->enabled)
20434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					continue;
20575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
20634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				/* to write new values to registers */
2070b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen				if (op->info_dirty || op->extra_info_dirty)
20834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					return true;
20934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			}
21075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
21175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
21275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
21375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
21475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
21575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
21675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr)
21775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
21875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
21975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp;
22075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op;
22175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
22275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	mp = get_mgr_priv(mgr);
22375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
2240b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (mp->shadow_info_dirty)
22575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return true;
22675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
22775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
22875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op = get_ovl_priv(ovl);
2290b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		if (op->shadow_info_dirty || op->shadow_extra_info_dirty)
23075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			return true;
23175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
23275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
23375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
23475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
23575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
236f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* returns true if an extra_info field is currently being updated */
237f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic bool extra_info_update_ongoing(void)
238f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
239f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	const int num_ovls = omap_dss_get_num_overlays();
240f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	struct ovl_priv_data *op;
241f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	struct omap_overlay *ovl;
242f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	struct mgr_priv_data *mp;
243f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	int i;
244f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool eid;
245f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
246f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	for (i = 0; i < num_ovls; ++i) {
247f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		ovl = omap_dss_get_overlay(i);
248f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		op = get_ovl_priv(ovl);
249f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
250f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (!op->enabled)
251f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
252f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
253f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		mp = get_mgr_priv(ovl->manager);
254f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
255f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (!mp->enabled)
256f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
257f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
258f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		eid = op->extra_info_dirty || op->shadow_extra_info_dirty;
259f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
260f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (!eid)
261f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
262f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
263f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (ovl_manual_update(ovl) && !mp->updating)
264f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
265f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
266f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		return true;
267f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
268f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
269f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	return false;
270f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
271f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
272f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* wait until no extra_info updates are pending */
273f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic void wait_pending_extra_info_updates(void)
274f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
275f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool updating;
276f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long flags;
277f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long t;
278f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
279f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
280f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
281f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	updating = extra_info_update_ongoing();
282f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
283f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!updating) {
284f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
285f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		return;
286f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
287f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
288f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	init_completion(&extra_updated_completion);
289f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
290f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
291f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
292f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	t = msecs_to_jiffies(500);
293f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	wait_for_completion_timeout(&extra_updated_completion, t);
294f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
295f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	updating = extra_info_update_ongoing();
296f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
297f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	WARN_ON(updating);
298f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
299f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
30058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
30158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
30258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
303af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
30458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
30558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
30658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
30758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev = mgr->device;
30858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
30958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
31058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
31158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
31258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (mgr_manual_update(mgr))
31358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
31458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
315bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(mgr->id);
31658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
317af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
31858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
31958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
32058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		unsigned long flags;
32158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
32258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
323063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
3240b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = mp->info_dirty;
3250b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = mp->shadow_info_dirty;
326063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
32758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
32858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
32958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
33058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
33158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
33258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
33358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
33458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
33558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
33658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
33758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
33858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
33958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() not finishing\n",
34058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					mgr->id);
34158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
34258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
34358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
34458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
34558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
34658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
34758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
34858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
34958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
35058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id);
35158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
35258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
35358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
35458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
35558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
35658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
35758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
35858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
35958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
36058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
361c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
36258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev;
36358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
36458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
36558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
36658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
36758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!ovl->manager)
36858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
36958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
37058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	dssdev = ovl->manager->device;
37158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
37258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE)
37358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
37458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
37558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (ovl_manual_update(ovl))
37658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
37758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
378bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(ovl->manager->id);
37958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
380c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
38158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
38258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
38358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		unsigned long flags;
38458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
38558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
386063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
3870b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = op->info_dirty;
3880b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = op->shadow_info_dirty;
389063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
39058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
39158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
39258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
39358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
39458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
39558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
39658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
39758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
39858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
39958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
40058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
40158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
40258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() not finishing\n",
40358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					ovl->id);
40458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
40558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
40658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
40758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
40858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
40958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
41058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
41158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
41258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
41358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id);
41458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
41558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
41658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
41758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
41858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
41958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
42058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
42175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl)
42258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
42375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
42458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info *oi;
42558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool ilace, replication;
42634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
42758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
42858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
429f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", ovl->id);
43058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
4310b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (!op->enabled || !op->info_dirty)
43275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
43358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
43475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	oi = &op->info;
43558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
43658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	replication = dss_use_replication(ovl->manager->device, oi->color_mode);
43758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
43858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	ilace = ovl->manager->device->type == OMAP_DISPLAY_TYPE_VENC;
43958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
440f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	r = dispc_ovl_setup(ovl->id, oi, ilace, replication);
44158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (r) {
44275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/*
44375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * We can't do much here, as this function can be called from
44475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * vsync interrupt.
44575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 */
446f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen		DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id);
44775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
44875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/* This will leave fifo configurations in a nonoptimal state */
44975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op->enabled = false;
45075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_ovl_enable(ovl->id, false);
45175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
45258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
45358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
45434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
45534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
4560b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = false;
45734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
4580b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		op->shadow_info_dirty = true;
45958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
46058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
461aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl)
462aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
463aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
46434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
465aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
466aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	DSSDBGF("%d", ovl->id);
467aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
46875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!op->extra_info_dirty)
46975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
47075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
471aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	/* note: write also when op->enabled == false, so that the ovl gets
472aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	 * disabled */
473aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
474aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	dispc_ovl_enable(ovl->id, op->enabled);
4755d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	dispc_ovl_set_channel_out(ovl->id, op->channel);
4766dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high);
47775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
47834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
47934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
48075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	op->extra_info_dirty = false;
48134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
48234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		op->shadow_extra_info_dirty = true;
483aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
484aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
485f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
48658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
48775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
48875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
48958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
490f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", mgr->id);
49158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mp->enabled)
49375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
49458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	WARN_ON(mp->busy);
49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Commit overlay settings */
49875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
49975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_ovl_write_regs(ovl);
500aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		dss_ovl_write_regs_extra(ovl);
501aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
502aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
5030b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (mp->info_dirty) {
50475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_setup(mgr->id, &mp->info);
50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5060b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		mp->info_dirty = false;
50734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mp->updating)
5080b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			mp->shadow_info_dirty = true;
50958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
51075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
51175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
51275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void)
51375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
51475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
51575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
51658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
51758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
51875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
51975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
52075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
521af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
522af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp = get_mgr_priv(mgr);
52358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
52475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
52558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			continue;
52658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
52775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_mgr_write_regs(mgr);
52875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
52975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (need_go(mgr)) {
53043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			mp->busy = true;
53158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
53275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			if (!dss_data.irq_enabled && need_isr())
53375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen				dss_register_vsync_isr();
53458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
53575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			dispc_mgr_go(mgr->id);
53675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
53775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
53858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
53958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
54058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr)
54158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
542af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
543e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
544e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
545e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
54658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
54734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	WARN_ON(mp->updating);
54834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
54975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_mgr_write_regs(mgr);
55058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
55134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = true;
55258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
55334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
55434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		dss_register_vsync_isr();
55558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5567797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen	dispc_mgr_enable(mgr->id, true);
557e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
558e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
55958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
56058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
561dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask);
562dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
563dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void)
564dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
565bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
566dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
567bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
568dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
569bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
570bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
571bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
572dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
57334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
57434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
57534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
576dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
577dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
578dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
579d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = true;
580dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
581dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
582dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void)
583dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
584bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
585dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
586bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
587dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
588bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
589bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
590bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
591dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
59234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
59334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
59434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
595dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask);
596dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
597dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
598d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = false;
599dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
600dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
6017609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
60258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
603c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct omap_overlay *ovl;
604af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
605c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
6067609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
6077609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	mp = get_mgr_priv(mgr);
6080b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	mp->shadow_info_dirty = false;
6097609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
6107609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
6117609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		op = get_ovl_priv(ovl);
6120b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		op->shadow_info_dirty = false;
6137609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		op->shadow_extra_info_dirty = false;
6147609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	}
6157609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen}
6167609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
6177609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask)
6187609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{
61958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
62075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
621f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool extra_updating;
62258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
623063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock(&data_lock);
62458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6257609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	/* clear busy, updating flags, shadow_dirty flags */
62643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
6277609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct omap_overlay_manager *mgr;
6287609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct mgr_priv_data *mp;
6297609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
63043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
63143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mp = get_mgr_priv(mgr);
63243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
6337609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mp->enabled)
63443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			continue;
63543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
6367609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		mp->updating = dispc_mgr_is_enabled(i);
63758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6387609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mgr_manual_update(mgr)) {
6397609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			mp->busy = dispc_mgr_go_busy(i);
64043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
6417609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			if (!mp->busy)
6427609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
6437609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		} else {
6447609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			if (!mp->updating)
6457609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
6467609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		}
64758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
64858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
651f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	extra_updating = extra_info_update_ongoing();
652f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!extra_updating)
653f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		complete_all(&extra_updated_completion);
654f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
65575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!need_isr())
65675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_unregister_vsync_isr();
65758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
658063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock(&data_lock);
65958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
66058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6615738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl)
66258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
663c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
66458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
665c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
66658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
667c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	if (!op->user_info_dirty)
6685738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen		return;
66958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
670c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = false;
6710b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = true;
672c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->info = op->user_info;
67358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
67458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
67558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr)
67658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
677af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
67858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
679af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
68058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
681388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	if (!mp->user_info_dirty)
68258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return;
68358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
684388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = false;
6850b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	mp->info_dirty = true;
686388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->info = mp->user_info;
68758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
68858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6896dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
69058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
6916dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	unsigned long flags;
6926dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct omap_overlay *ovl;
6936dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
6946dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
6956dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
6966dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
6976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
6986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure overlays */
6996dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
7006dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		omap_dss_mgr_apply_ovl(ovl);
7016dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
7026dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure manager */
7036dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	omap_dss_mgr_apply_mgr(mgr);
7046dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
7056dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_write_regs();
7066dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
7076dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
7086dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
709e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen	return 0;
7106dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen}
7116dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
712841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable)
713841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{
714841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	struct ovl_priv_data *op;
715841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
716841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op = get_ovl_priv(ovl);
717841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
718841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	if (op->enabled == enable)
719841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen		return;
720841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
721841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->enabled = enable;
722841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->extra_info_dirty = true;
723841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen}
724841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
7256dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl)
7266dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{
7276dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
72858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_dss_device *dssdev;
72958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 size, burst_size;
7306dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
73158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
73258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	dssdev = ovl->manager->device;
73358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
73458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	size = dispc_ovl_get_fifo_size(ovl->id);
73558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
73658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	burst_size = dispc_ovl_get_burst_size(ovl->id);
73758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
73858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	switch (dssdev->type) {
73958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DPI:
74058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DBI:
74158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_SDI:
74258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_VENC:
74358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_HDMI:
74458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		default_get_overlay_fifo_thresholds(ovl->id, size,
7456dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen				burst_size, &fifo_low, &fifo_high);
74658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		break;
74758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_DSI
74858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	case OMAP_DISPLAY_TYPE_DSI:
74958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		dsi_get_overlay_fifo_thresholds(ovl->id, size,
7506dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen				burst_size, &fifo_low, &fifo_high);
75158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		break;
75258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#endif
75358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	default:
75458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		BUG();
75558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
7566dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
7576dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	op->fifo_low = fifo_low;
7586dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	op->fifo_high = fifo_high;
7596dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	op->extra_info_dirty = true;
76058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
76158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7626dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr)
76358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
76407e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	struct omap_overlay *ovl;
7656dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct ovl_priv_data *op;
7666dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct mgr_priv_data *mp;
76758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7686dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	mp = get_mgr_priv(mgr);
76958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7706dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	if (!mp->enabled)
7716dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		return;
77258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7736dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
7746dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		op = get_ovl_priv(ovl);
77558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7766dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		if (!op->enabled)
7776dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen			continue;
77858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7796dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		dss_ovl_setup_fifo(ovl);
7806dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	}
78158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
78258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7837797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_enable(struct omap_overlay_manager *mgr)
7847797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
785bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
786bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
787bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
7885558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
7895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
790e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (mp->enabled)
791e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
792e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
793bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
794bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
795bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = true;
796bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
7976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_mgr_setup_fifos(mgr);
7986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
79975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
80075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
80134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!mgr_manual_update(mgr))
80234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mp->updating = true;
80334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
804bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
8055558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
80675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mgr_manual_update(mgr))
80775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_enable(mgr->id, true);
80875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
809e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
8105558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8117797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
8127797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
8137797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr)
8147797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
815bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
816bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
817bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
8185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
8195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
820e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!mp->enabled)
821e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
822e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
8239a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen	if (!mgr_manual_update(mgr))
8249a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen		dispc_mgr_enable(mgr->id, false);
825bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
826bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
827bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
82834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = false;
829bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = false;
830bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
831bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
8325558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
833e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
8345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8357797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
8367797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
837eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr,
838eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
839eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
840388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
841e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
842e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
843e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
844e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
845388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info = *info;
846388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = true;
847eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
848e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
849e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
850eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
851eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
852eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
853eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr,
854eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
855eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
856388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
857e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
858e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
859e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
860e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
861388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	*info = mp->user_info;
862e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
863e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
864eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
865eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
866eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr,
867eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_dss_device *dssdev)
868eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
869eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	int r;
870eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
8715558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
8725558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
873eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (dssdev->manager) {
874eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' already has a manager '%s'\n",
875eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, dssdev->manager->name);
8765558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
8775558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
878eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
879eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
880eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if ((mgr->supported_displays & dssdev->type) == 0) {
881eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' does not support manager '%s'\n",
882eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, mgr->name);
8835558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
8845558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
885eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
886eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
887eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	dssdev->manager = mgr;
888eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = dssdev;
889eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
8905558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8915558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
892eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
8935558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
8945558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
8955558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
896eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
897eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
898eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr)
899eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
9005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
9015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
9025558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
9035558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
904eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (!mgr->device) {
905eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("failed to unset display, display not set.\n");
9065558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
908eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
909eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
910eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	/*
911eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * Don't allow currently enabled displays to have the overlay manager
912eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * pulled out from underneath them
913eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 */
9145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) {
9155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9165558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
9175558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	}
918eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
919eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device->manager = NULL;
920eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = NULL;
921eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
9225558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
9235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
924eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
9255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
9265558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
9275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
928eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
929eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
930eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
931eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
932f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl,
933f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
934f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
935c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
936e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
937e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
938e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
939e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
940c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info = *info;
941c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = true;
942f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
943e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
944e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
945f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
946f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
947f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
948f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl,
949f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
950f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
951c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
952e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
953e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
954e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
955e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
956c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	*info = op->user_info;
957e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
958e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
959f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
960f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
961f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl,
962f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_manager *mgr)
963f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
964aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
965aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
9665558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
9675558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
968f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!mgr)
969f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		return -EINVAL;
970f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
9715558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
9725558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
973f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (ovl->manager) {
974f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay '%s' already has a manager '%s'\n",
975f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen				ovl->name, ovl->manager->name);
9765558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9775558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
978f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
979f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
980aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
981aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
982aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
983aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
984f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to change the manager\n");
9855558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
9865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
987f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
988f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
9895d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = mgr->id;
9905d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->extra_info_dirty = true;
9915d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
992f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = mgr;
993f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_add_tail(&ovl->list, &mgr->overlays);
994f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
995aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
996aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
997f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	/* XXX: When there is an overlay on a DSI manual update display, and
998f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay is first disabled, then moved to tv, and enabled, we
999f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * seem to get SYNC_LOST_DIGIT error.
1000f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1001f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Waiting doesn't seem to help, but updating the manual update display
1002f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * after disabling the overlay seems to fix this. This hints that the
1003f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * overlay is perhaps somehow tied to the LCD output until the output
1004f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * is updated.
1005f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1006f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Userspace workaround for this is to update the LCD after disabling
1007f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay, but before moving the overlay to TV.
1008f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 */
1009f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
10105558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10115558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1012f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
10135558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
10145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1016f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1017f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1018f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl)
1019f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1020aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1021aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
10225558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
10235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
10245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1026f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!ovl->manager) {
1027f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("failed to detach overlay: manager not set\n");
10285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
10295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1030f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1031f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1032aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1033aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1034aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1035aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1036f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to unset the manager\n");
10375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
10385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1039f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1040f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
10415d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = -1;
10425d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1043f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = NULL;
1044f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_del(&ovl->list);
1045f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1046aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1047aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1048aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1049aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1050aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1051aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1052aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1053aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1054aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1055aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1056aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl)
1057aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1058aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1059aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1060aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool e;
1061aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1062aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1063aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1064aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	e = op->enabled;
1065aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1066aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1067aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1068aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return e;
1069aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1070aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1071aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl)
1072aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1073aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1074aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1075aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1076aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1077aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1078aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1079e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (op->enabled) {
1080e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
1081e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto err;
1082e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1083e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
1084aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (ovl->manager == NULL || ovl->manager->device == NULL) {
1085aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1086aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1087aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1088aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1089aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1090aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1091841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	dss_apply_ovl_enable(ovl, true);
1092aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
10936dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_ovl_setup_fifo(ovl);
10946dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
109575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
109675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1097aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1098aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1099aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1100aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1101aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1102aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1103aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1104aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1105aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1106aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1107aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl)
1108aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1109aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1110aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1111aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1112aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1113aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1114aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1115e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!op->enabled) {
1116e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
1117e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto err;
1118e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1119e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
1120aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (ovl->manager == NULL || ovl->manager->device == NULL) {
1121aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1122aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1123aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1124aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1125aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1126aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1127841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	dss_apply_ovl_enable(ovl, false);
1128aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
112975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
113075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1131aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1132aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
11335558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1135f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1136aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
11375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
11385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1140f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1141f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1142