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>
218dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen#include <linux/module.h>
2258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/slab.h>
2358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/spinlock.h>
2458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/jiffies.h>
2558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <video/omapdss.h>
2758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss.h"
2958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss_features.h"
30bb39813413db782cc77b94d55cb5d044f42079dfTomi Valkeinen#include "dispc-compat.h"
3158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
3258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/*
3358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * We have 4 levels of cache for the dispc settings. First two are in SW and
3458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the latter two in HW.
3558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
360b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *       set_info()
370b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *          v
3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
390b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * |     user_info      |
4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *        apply()
4358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
45d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * |       info         |
4658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
48f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen *      write_regs()
4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |  shadow registers  |
5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable
5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |      registers     |
5858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
6058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
61c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data {
62c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
63c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	bool user_info_dirty;
64c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct omap_overlay_info user_info;
65c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
660b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
6758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info info;
6858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
690b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
700b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
71aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool extra_info_dirty;
72aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool shadow_extra_info_dirty;
73aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
74aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool enabled;
756dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
7682153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
7782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	/*
7882153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 * True if overlay is to be enabled. Used to check and calculate configs
7982153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 * for the overlay before it is enabled in the HW.
8082153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 */
8182153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	bool enabling;
8258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
8358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
84af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data {
85388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
86388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	bool user_info_dirty;
87388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct omap_overlay_manager_info user_info;
88388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
890b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
9058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_manager_info info;
9158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
920b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
930b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
9443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	/* If true, GO bit is up and shadow registers cannot be written.
9543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	 * Never true for manual update displays */
9643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	bool busy;
9743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	/* If true, dispc output is enabled */
9934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	bool updating;
10034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
101bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	/* If true, a display is enabled using this manager */
102bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	bool enabled;
10345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
10445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	bool extra_info_dirty;
10545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	bool shadow_extra_info_dirty;
10645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
10745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct omap_video_timings timings;
108f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct dss_lcd_mgr_config lcd_config;
1091550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
1101550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	void (*framedone_handler)(void *);
1111550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	void *framedone_handler_data;
11258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
11358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
11458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct {
115c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
116af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
11758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
11858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool irq_enabled;
119d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data;
12058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
121d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */
122063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock;
1235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */
1245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock);
125f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic DECLARE_COMPLETION(extra_updated_completion);
126063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen
12775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void);
12875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
129c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl)
130c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{
131d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.ovl_priv_data_array[ovl->id];
132c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen}
133c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen
134af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
135af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{
136d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.mgr_priv_data_array[mgr->id];
137af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen}
138af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen
1398dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenstatic void apply_init_priv(void)
14058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
141c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	const int num_ovls = dss_feat_get_num_ovls();
142f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp;
143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	int i;
144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
145063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock_init(&data_lock);
146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	for (i = 0; i < num_ovls; ++i) {
148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		struct ovl_priv_data *op;
149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op = &dss_data.ovl_priv_data_array[i];
151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
1527a53df2c08119c1a7008d8480205fb3e6859c721Tomi Valkeinen		op->info.color_mode = OMAP_DSS_COLOR_RGB16;
1537a53df2c08119c1a7008d8480205fb3e6859c721Tomi Valkeinen		op->info.rotation_type = OMAP_DSS_ROT_DMA;
1547a53df2c08119c1a7008d8480205fb3e6859c721Tomi Valkeinen
155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->info.global_alpha = 255;
156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
157c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		switch (i) {
158c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 0:
159c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder = 0;
160c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
161c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 1:
162c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
163c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0;
164c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
165c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 2:
166c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
167c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0;
168c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
169c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 3:
170c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
171c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0;
172c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
173c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		}
174c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
175c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->user_info = op->info;
176c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	}
177f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
178f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	/*
179f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 * Initialize some of the lcd_config fields for TV manager, this lets
180f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 * us prevent checking if the manager is LCD or TV at some places
181f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 */
182f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT];
183f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
184f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.video_port_width = 24;
185f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.clock_info.lck_div = 1;
186f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.clock_info.pck_div = 1;
18758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
18858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
18975bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja/*
19075bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * A LCD manager's stallmode decides whether it is in manual or auto update. TV
19175bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * manager is always auto update, stallmode field for TV manager is false by
19275bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * default
19375bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja */
19458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl)
19558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
19675bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(ovl->manager);
19775bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja
19875bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	return mp->lcd_config.stallmode;
19958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
20058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
20158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr)
20258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
20375bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
20475bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja
20575bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	return mp->lcd_config.stallmode;
20658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
20758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
20839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenstatic int dss_check_settings_low(struct omap_overlay_manager *mgr,
209228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja		bool applying)
21039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
21139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_info *oi;
21239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_manager_info *mi;
21339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay *ovl;
21439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_info *ois[MAX_DSS_OVERLAYS];
21539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct ovl_priv_data *op;
21639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct mgr_priv_data *mp;
21739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
21839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	mp = get_mgr_priv(mgr);
21939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
2205dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja	if (!mp->enabled)
2215dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja		return 0;
2225dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja
22339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (applying && mp->user_info_dirty)
22439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		mi = &mp->user_info;
22539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	else
22639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		mi = &mp->info;
22739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
22839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	/* collect the infos to be tested into the array */
22939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
23039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		op = get_ovl_priv(ovl);
23139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
23282153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen		if (!op->enabled && !op->enabling)
23339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = NULL;
23439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		else if (applying && op->user_info_dirty)
23539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = &op->user_info;
23639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		else
23739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = &op->info;
23839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
23939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		ois[ovl->id] = oi;
24039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
24139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
2426e5435958c6ee4fa2142d298d836dd78b8353f66Archit Taneja	return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois);
24339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
24439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
24539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/*
24639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from data->info
24739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */
248228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings(struct omap_overlay_manager *mgr)
24939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
250228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	return dss_check_settings_low(mgr, false);
25139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
25239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
25339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/*
25439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from ovl->info if
25539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * dirty and from data->info otherwise
25639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */
257228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings_apply(struct omap_overlay_manager *mgr)
25839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
259228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	return dss_check_settings_low(mgr, true);
26039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
26139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
26275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void)
26375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
26475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
26575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
26675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
26775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
26875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
26975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
27075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay *ovl;
27175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
27275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
27375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mp = get_mgr_priv(mgr);
27475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
27575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled)
27675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			continue;
27775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
27834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mgr_manual_update(mgr)) {
27934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch FRAMEDONE */
28034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->updating)
28134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
28234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		} else {
28334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch GO bit going down */
28434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->busy)
28534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
28675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
28734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to write new values to registers */
2880b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			if (mp->info_dirty)
28934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
29075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
2919f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen			/* to set GO bit */
2929f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen			if (mp->shadow_info_dirty)
2939f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				return true;
2949f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
29545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/*
29645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * NOTE: we don't check extra_info flags for disabled
29745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * managers, once the manager is enabled, the extra_info
29845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * related manager changes will be taken in by HW.
29945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 */
30045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
30145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/* to write new values to registers */
30245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (mp->extra_info_dirty)
30345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
30445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
30545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/* to set GO bit */
30645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (mp->shadow_extra_info_dirty)
30745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
30845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
30934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			list_for_each_entry(ovl, &mgr->overlays, list) {
31034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				struct ovl_priv_data *op;
31175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
31234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				op = get_ovl_priv(ovl);
31375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
3149f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/*
3159f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * NOTE: we check extra_info flags even for
3169f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * disabled overlays, as extra_infos need to be
3179f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * always written.
3189f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 */
3199f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3209f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to write new values to registers */
3219f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->extra_info_dirty)
3229f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3239f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3249f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to set GO bit */
3259f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->shadow_extra_info_dirty)
3269f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3279f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
32834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				if (!op->enabled)
32934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					continue;
33075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
33134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				/* to write new values to registers */
3329f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->info_dirty)
3339f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3349f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3359f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to set GO bit */
3369f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->shadow_info_dirty)
33734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					return true;
33834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			}
33975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
34075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
34175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
34275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
34375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
34475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
34575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr)
34675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
34775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
34875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp;
34975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op;
35075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
35175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	mp = get_mgr_priv(mgr);
35275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
35345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (mp->shadow_info_dirty || mp->shadow_extra_info_dirty)
35475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return true;
35575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
35675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
35775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op = get_ovl_priv(ovl);
3580b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		if (op->shadow_info_dirty || op->shadow_extra_info_dirty)
35975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			return true;
36075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
36175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
36275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
36375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
36475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
365f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* returns true if an extra_info field is currently being updated */
366f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic bool extra_info_update_ongoing(void)
367f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
36845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	const int num_mgrs = dss_feat_get_num_mgrs();
369f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	int i;
370f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
37145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	for (i = 0; i < num_mgrs; ++i) {
37245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct omap_overlay_manager *mgr;
37345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct omap_overlay *ovl;
37445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct mgr_priv_data *mp;
3751f3f53ae5179ba7f24b4a429bc41773f1f4857caRob Clark
37645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mgr = omap_dss_get_overlay_manager(i);
37745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mp = get_mgr_priv(mgr);
378f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
379f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (!mp->enabled)
380f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
381f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
382153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen		if (!mp->updating)
383f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
384f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
38545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		if (mp->extra_info_dirty || mp->shadow_extra_info_dirty)
386153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen			return true;
38745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
38845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		list_for_each_entry(ovl, &mgr->overlays, list) {
38945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			struct ovl_priv_data *op = get_ovl_priv(ovl);
39045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
39145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (op->extra_info_dirty || op->shadow_extra_info_dirty)
39245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
39345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		}
394f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
395f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
396f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	return false;
397f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
398f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
399f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* wait until no extra_info updates are pending */
400f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic void wait_pending_extra_info_updates(void)
401f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
402f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool updating;
403f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long flags;
404f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long t;
4054614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	int r;
406f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
407f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
408f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
409f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	updating = extra_info_update_ongoing();
410f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
411f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!updating) {
412f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
413f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		return;
414f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
415f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
416f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	init_completion(&extra_updated_completion);
417f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
418f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
419f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
420f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	t = msecs_to_jiffies(500);
4214614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	r = wait_for_completion_timeout(&extra_updated_completion, t);
4224614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	if (r == 0)
4234614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen		DSSWARN("timeout in wait_pending_extra_info_updates\n");
424f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
425f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
426e724366498ead17579686f7ad83235f911a9c4f7Tomi Valkeinenstatic struct omap_dss_device *dss_mgr_get_device(struct omap_overlay_manager *mgr)
4276abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen{
428efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen	struct omap_dss_device *dssdev;
429efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen
430efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen	dssdev = mgr->output;
431efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen	if (dssdev == NULL)
432efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen		return NULL;
433efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen
4349560dc1059222d059d494a64e5da4c54d23838daTomi Valkeinen	while (dssdev->dst)
4359560dc1059222d059d494a64e5da4c54d23838daTomi Valkeinen		dssdev = dssdev->dst;
436efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen
437efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen	if (dssdev->driver)
438efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen		return dssdev;
439efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen	else
440efedce1425976fc73154a826552aad4f54086a25Tomi Valkeinen		return NULL;
4416abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen}
4426abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen
443e724366498ead17579686f7ad83235f911a9c4f7Tomi Valkeinenstatic struct omap_dss_device *dss_ovl_get_device(struct omap_overlay *ovl)
4440c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen{
445e724366498ead17579686f7ad83235f911a9c4f7Tomi Valkeinen	return ovl->manager ? dss_mgr_get_device(ovl->manager) : NULL;
4460c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen}
4470c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
4480c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int dss_mgr_wait_for_vsync(struct omap_overlay_manager *mgr)
4490c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen{
4500c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
4510c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	u32 irq;
4520c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	int r;
4530c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
454346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	if (mgr->output == NULL)
455346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen		return -ENODEV;
456346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen
4570c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	r = dispc_runtime_get();
4580c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	if (r)
4590c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		return r;
4600c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
461346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	switch (mgr->output->id) {
462346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	case OMAP_DSS_OUTPUT_VENC:
4630c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		irq = DISPC_IRQ_EVSYNC_ODD;
464346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen		break;
465346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	case OMAP_DSS_OUTPUT_HDMI:
4660c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		irq = DISPC_IRQ_EVSYNC_EVEN;
467346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen		break;
468346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	default:
4690c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		irq = dispc_mgr_get_vsync_irq(mgr->id);
470346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen		break;
471346f1e0772cbd087f176fd3e09ffa5a4569812e6Tomi Valkeinen	}
4720c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
4730c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
4740c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
4750c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	dispc_runtime_put();
4760c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
4770c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	return r;
4780c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen}
4790c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
4800c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
48158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
48258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
483fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
48458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
485fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	unsigned long flags;
48658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
48758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
48858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
489fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_lock_irqsave(&data_lock, flags);
490fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
491fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (mgr_manual_update(mgr)) {
492fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
49358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
494fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
49558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
496fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (!mp->enabled) {
497fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
49858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
499fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
500fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
501fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
50258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
50321e56f79abad987555351c73569fc8358636b0faLajos Molnar	r = dispc_runtime_get();
50421e56f79abad987555351c73569fc8358636b0faLajos Molnar	if (r)
50521e56f79abad987555351c73569fc8358636b0faLajos Molnar		return r;
50621e56f79abad987555351c73569fc8358636b0faLajos Molnar
507bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(mgr->id);
50858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
50958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
51058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
51158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
51258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
513063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
5140b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = mp->info_dirty;
5150b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = mp->shadow_info_dirty;
516063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
51758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
51858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
51958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
52058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
52158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
52258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
52358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
52458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
52558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
52658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
52758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
52858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
52958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() not finishing\n",
53058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					mgr->id);
53158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
53258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
53358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
53458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
53558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
53658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
53758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
53858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
53958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
54058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id);
54158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
54258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
54358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
54458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
54521e56f79abad987555351c73569fc8358636b0faLajos Molnar	dispc_runtime_put();
54621e56f79abad987555351c73569fc8358636b0faLajos Molnar
54758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
54858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
54958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5506abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
55158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
55258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
553c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
554fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	struct mgr_priv_data *mp;
55558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
556fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	unsigned long flags;
55758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
55858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
55958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
56058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!ovl->manager)
56158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
56258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
563fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	mp = get_mgr_priv(ovl->manager);
56458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
565fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_lock_irqsave(&data_lock, flags);
566fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
567fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (ovl_manual_update(ovl)) {
568fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
56958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
570fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
57158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
572fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (!mp->enabled) {
573fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
57458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
575fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
576fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
577fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
57858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
57921e56f79abad987555351c73569fc8358636b0faLajos Molnar	r = dispc_runtime_get();
58021e56f79abad987555351c73569fc8358636b0faLajos Molnar	if (r)
58121e56f79abad987555351c73569fc8358636b0faLajos Molnar		return r;
58221e56f79abad987555351c73569fc8358636b0faLajos Molnar
583bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(ovl->manager->id);
58458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
585c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
58658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
58758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
58858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
58958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
590063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
5910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = op->info_dirty;
5920b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = op->shadow_info_dirty;
593063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
59458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
59558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
59658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
59758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
59858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
59958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
60058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
60158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
60258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
60358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
60458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
60558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
60658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() not finishing\n",
60758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					ovl->id);
60858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
60958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
61058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
61158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
61258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
61358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
61458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
61558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
61658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
61758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id);
61858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
61958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
62058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
62158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
62221e56f79abad987555351c73569fc8358636b0faLajos Molnar	dispc_runtime_put();
62321e56f79abad987555351c73569fc8358636b0faLajos Molnar
62458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
62558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
62658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
62775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl)
62858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
62975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
63058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info *oi;
6318050cbe4cd9a96ff333df718f38830eabab690bdArchit Taneja	bool replication;
63234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
63358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
63458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
635ac9f24211e4cf9cc30122a7e0d830eba2cace14bTomi Valkeinen	DSSDBG("writing ovl %d regs\n", ovl->id);
63658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6370b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (!op->enabled || !op->info_dirty)
63875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
63958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	oi = &op->info;
64158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64281ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja	mp = get_mgr_priv(ovl->manager);
64381ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja
6446c6f510afb86e3c77c351dfa20cbb8ca834abad9Archit Taneja	replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode);
64558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6468ba85306ba0fd87a3c15a02fe83d817832705a7dArchit Taneja	r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings, false);
64758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (r) {
64875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/*
64975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * We can't do much here, as this function can be called from
65075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * vsync interrupt.
65175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 */
652f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen		DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id);
65375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
65475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/* This will leave fifo configurations in a nonoptimal state */
65575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op->enabled = false;
65675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_ovl_enable(ovl->id, false);
65775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
65858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
65958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6600b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = false;
66134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
6620b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		op->shadow_info_dirty = true;
66358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
66458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
665aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl)
666aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
667aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
66834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
669aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
670ac9f24211e4cf9cc30122a7e0d830eba2cace14bTomi Valkeinen	DSSDBG("writing ovl %d regs extra\n", ovl->id);
671aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
67275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!op->extra_info_dirty)
67375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
67475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
675aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	/* note: write also when op->enabled == false, so that the ovl gets
676aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	 * disabled */
677aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
678aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	dispc_ovl_enable(ovl->id, op->enabled);
6796dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high);
68075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
68134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
68234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
68375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	op->extra_info_dirty = false;
68434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
68534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		op->shadow_extra_info_dirty = true;
686aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
687aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
688f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
68958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
69075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
69175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
69258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
693ac9f24211e4cf9cc30122a7e0d830eba2cace14bTomi Valkeinen	DSSDBG("writing mgr %d regs\n", mgr->id);
69458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mp->enabled)
69675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
69758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	WARN_ON(mp->busy);
69958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
70058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Commit overlay settings */
70175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
70275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_ovl_write_regs(ovl);
703aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		dss_ovl_write_regs_extra(ovl);
704aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
705aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
7060b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (mp->info_dirty) {
70775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_setup(mgr->id, &mp->info);
70858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7090b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		mp->info_dirty = false;
71034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mp->updating)
7110b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			mp->shadow_info_dirty = true;
71258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
71375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
71475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
71545324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr)
71645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
71745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
71845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
719ac9f24211e4cf9cc30122a7e0d830eba2cace14bTomi Valkeinen	DSSDBG("writing mgr %d regs extra\n", mgr->id);
72045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
72145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (!mp->extra_info_dirty)
72245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		return;
72345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
72445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	dispc_mgr_set_timings(mgr->id, &mp->timings);
72545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
726f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	/* lcd_config parameters */
727fb2cec1f72acb030180aa96cd150b47b562bc999Tomi Valkeinen	if (dss_mgr_is_lcd(mgr->id))
728fb2cec1f72acb030180aa96cd150b47b562bc999Tomi Valkeinen		dispc_mgr_set_lcd_config(mgr->id, &mp->lcd_config);
729f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
73045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = false;
73145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (mp->updating)
73245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mp->shadow_extra_info_dirty = true;
73345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
73445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
73575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void)
73675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
73775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
73875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
73958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
74058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
74175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
74275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
74339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		int r;
74475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
745af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
746af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp = get_mgr_priv(mgr);
74758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
74875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
74958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			continue;
75058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
751228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja		r = dss_check_settings(mgr);
75239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		if (r) {
75339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			DSSERR("cannot write registers for manager %s: "
75439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen					"illegal configuration\n", mgr->name);
75539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			continue;
75639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		}
75739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
75875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_mgr_write_regs(mgr);
75945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		dss_mgr_write_regs_extra(mgr);
7603ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	}
7613ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen}
76275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
7633ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinenstatic void dss_set_go_bits(void)
7643ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen{
7653ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
7663ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	int i;
76758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7683ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
7693ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct omap_overlay_manager *mgr;
7703ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct mgr_priv_data *mp;
77158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7723ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
7733ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp = get_mgr_priv(mgr);
7743ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7753ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
7763ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7773ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7783ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!need_go(mgr))
7793ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7803ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7813ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp->busy = true;
7823ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7833ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!dss_data.irq_enabled && need_isr())
7843ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			dss_register_vsync_isr();
7853ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7863ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		dispc_mgr_go(mgr->id);
78775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
7883ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
78958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
79058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
791df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
792df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen{
793df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct omap_overlay *ovl;
794df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct mgr_priv_data *mp;
795df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct ovl_priv_data *op;
796df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
797df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp = get_mgr_priv(mgr);
798df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp->shadow_info_dirty = false;
79945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->shadow_extra_info_dirty = false;
800df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
801df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
802df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op = get_ovl_priv(ovl);
803df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_info_dirty = false;
804df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_extra_info_dirty = false;
805df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	}
806df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen}
807df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
808a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinenstatic int dss_mgr_connect_compat(struct omap_overlay_manager *mgr,
8091f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen		struct omap_dss_device *dst)
810a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen{
811a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen	return mgr->set_output(mgr, dst);
812a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen}
813a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen
814a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinenstatic void dss_mgr_disconnect_compat(struct omap_overlay_manager *mgr,
8151f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen		struct omap_dss_device *dst)
816a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen{
817a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen	mgr->unset_output(mgr);
818a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen}
819a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen
82074b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic void dss_mgr_start_update_compat(struct omap_overlay_manager *mgr)
82158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
822af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
823e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
82439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
825e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
826e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
82758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
82834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	WARN_ON(mp->updating);
82934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
830228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
83139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
83239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("cannot start manual update: illegal configuration\n");
83339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
83439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return;
83539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
83639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
83775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_mgr_write_regs(mgr);
83845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	dss_mgr_write_regs_extra(mgr);
83958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
84034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = true;
84158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
84234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
84334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		dss_register_vsync_isr();
84458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8453a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen	dispc_mgr_enable_sync(mgr->id);
846e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
847e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
84858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
84958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
850dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask);
851dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
852dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void)
853dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
854bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
855dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
856bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
857dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
858bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
859bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
860bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
861dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
86234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
86334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
86434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
865dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
866dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
867dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
868d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = true;
869dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
870dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
871dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void)
872dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
873bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
874dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
875bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
876dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
877bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
878bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
879bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
880dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
88134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
88234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
88334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
884dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask);
885dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
886dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
887d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = false;
888dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
889dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
8907609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask)
8917609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{
89258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
89375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
894f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool extra_updating;
89558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
896063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock(&data_lock);
89758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8987609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	/* clear busy, updating flags, shadow_dirty flags */
89943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
9007609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct omap_overlay_manager *mgr;
9017609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct mgr_priv_data *mp;
9027609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
90343a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
90443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mp = get_mgr_priv(mgr);
90543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9067609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mp->enabled)
90743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			continue;
90843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9097609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		mp->updating = dispc_mgr_is_enabled(i);
91058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9117609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mgr_manual_update(mgr)) {
9125b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			bool was_busy = mp->busy;
9137609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			mp->busy = dispc_mgr_go_busy(i);
91443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9155b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			if (was_busy && !mp->busy)
9167609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
9177609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		}
91858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
91958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
92075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
9213ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
92258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
923f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	extra_updating = extra_info_update_ongoing();
924f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!extra_updating)
925f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		complete_all(&extra_updated_completion);
926f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
9271550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	/* call framedone handlers for manual update displays */
9281550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
9291550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		struct omap_overlay_manager *mgr;
9301550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		struct mgr_priv_data *mp;
9311550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
9321550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
9331550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		mp = get_mgr_priv(mgr);
9341550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
9351550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		if (!mgr_manual_update(mgr) || !mp->framedone_handler)
9361550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen			continue;
9371550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
9381550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		if (mask & dispc_mgr_get_framedone_irq(i))
9391550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen			mp->framedone_handler(mp->framedone_handler_data);
9401550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	}
9411550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
94275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!need_isr())
94375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_unregister_vsync_isr();
94458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
945063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock(&data_lock);
94658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
94758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9485738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl)
94958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
950c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
95158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
952c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
95358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
954c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	if (!op->user_info_dirty)
9555738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen		return;
95658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
957c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = false;
9580b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = true;
959c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->info = op->user_info;
96058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
96158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
96258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr)
96358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
964af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
96558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
966af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
96758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
968388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	if (!mp->user_info_dirty)
96958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return;
97058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
971388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = false;
9720b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	mp->info_dirty = true;
973388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->info = mp->user_info;
97458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
97558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9760c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
97758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
9786dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	unsigned long flags;
9796dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct omap_overlay *ovl;
98039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
9816dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9826dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
9836dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9846dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
9856dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
986228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings_apply(mgr);
98739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
98839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
98939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to apply settings: illegal configuration.\n");
99039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return r;
99139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
99239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
9936dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure overlays */
9946dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
9956dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		omap_dss_mgr_apply_ovl(ovl);
9966dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure manager */
9986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	omap_dss_mgr_apply_mgr(mgr);
9996dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
10006dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_write_regs();
10013ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
10026dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
10036dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10046dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
1005e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen	return 0;
10066dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen}
10076dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
1008841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable)
1009841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{
1010841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	struct ovl_priv_data *op;
1011841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
1012841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op = get_ovl_priv(ovl);
1013841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
1014841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	if (op->enabled == enable)
1015841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen		return;
1016841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
1017841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->enabled = enable;
1018841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->extra_info_dirty = true;
1019841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen}
1020841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
102104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinenstatic void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl,
102204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		u32 fifo_low, u32 fifo_high)
102304576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen{
102404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
102504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
102604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	if (op->fifo_low == fifo_low && op->fifo_high == fifo_high)
102704576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		return;
102804576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
102904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_low = fifo_low;
103004576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_high = fifo_high;
103104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->extra_info_dirty = true;
103204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen}
103304576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
1034b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl)
10356dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{
10366dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
10376dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
1038b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	bool use_fifo_merge = false;
103958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
104075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	if (!op->enabled && !op->enabling)
104175ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		return;
104275ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen
104383fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen	dispc_ovl_compute_fifo_thresholds(ovl->id, &fifo_low, &fifo_high,
10443568f2a46f2a73bab18c914df06afd98a97e0e0eTomi Valkeinen			use_fifo_merge, ovl_manual_update(ovl));
10456dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
104604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high);
104758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
104858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
1049b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr)
105058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
105107e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	struct omap_overlay *ovl;
10526dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct mgr_priv_data *mp;
105358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
10546dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	mp = get_mgr_priv(mgr);
105558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
10566dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	if (!mp->enabled)
10576dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		return;
105858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
105975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
1060b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_ovl_setup_fifo(ovl);
106175ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen}
106258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
1063b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_setup_fifos(void)
106475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen{
106575ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
106675ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	struct omap_overlay_manager *mgr;
106775ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	int i;
106858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
106975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
107075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
1071b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_mgr_setup_fifos(mgr);
10726dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	}
107358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
107458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
107574b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic int dss_mgr_enable_compat(struct omap_overlay_manager *mgr)
10767797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
1077bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1078bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
107939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
1080bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
10815558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10825558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1083e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (mp->enabled)
1084e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1085e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
1086bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1087bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1088bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = true;
1089a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen
1090228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
109139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
109239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable manager %d: check_settings failed\n",
109339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				mgr->id);
10942a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen		goto err;
109539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
109639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1097b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
10986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
109975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
11003ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
110175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
110234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!mgr_manual_update(mgr))
110334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mp->updating = true;
110434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
1105d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
1106d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen		dss_register_vsync_isr();
1107d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen
1108bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
11095558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
111075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mgr_manual_update(mgr))
11113a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen		dispc_mgr_enable_sync(mgr->id);
111275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1113e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
11145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11152a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
11162a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return 0;
11172a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
11182a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenerr:
1119a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen	mp->enabled = false;
11202a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
11212a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	mutex_unlock(&apply_lock);
11222a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return r;
11237797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
11247797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
112574b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic void dss_mgr_disable_compat(struct omap_overlay_manager *mgr)
11267797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
1127bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1128bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
1129bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
11305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
11315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1132e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!mp->enabled)
1133e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1134e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
113522500c19e6dc1a7c897323eff040364289bce0b7Tomi Valkeinen	wait_pending_extra_info_updates();
113622500c19e6dc1a7c897323eff040364289bce0b7Tomi Valkeinen
11379a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen	if (!mgr_manual_update(mgr))
11383a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen		dispc_mgr_disable_sync(mgr->id);
1139bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1140bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1141bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
114234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = false;
1143bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = false;
1144bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1145bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
11465558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1147e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
11485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11497797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
11507797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
11510c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int dss_mgr_set_info(struct omap_overlay_manager *mgr,
1152eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1153eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1154388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1155e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1156f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	int r;
1157f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen
1158f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	r = dss_mgr_simple_check(mgr, info);
1159f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	if (r)
1160f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen		return r;
1161e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1162e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1163e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1164388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info = *info;
1165388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = true;
1166eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1167e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1168e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1169eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
1170eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1171eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
11720c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic void dss_mgr_get_info(struct omap_overlay_manager *mgr,
1173eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1174eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1175388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1176e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1177e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1178e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1179e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1180388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	*info = mp->user_info;
1181e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1182e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1183eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1184eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
11850c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int dss_mgr_set_output(struct omap_overlay_manager *mgr,
11861f68d9c4b660487c5878c4800ff5a402abc6c005Tomi Valkeinen		struct omap_dss_device *output)
118797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
118897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
118997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
119097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
119197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
119297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mgr->output) {
119397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("manager %s is already connected to an output\n",
119497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
119597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
119697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
119797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
119897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
119997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if ((mgr->supported_outputs & output->id) == 0) {
120097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output does not support manager %s\n",
120197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
120297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
120397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
120497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
120597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
120697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	output->manager = mgr;
120797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = output;
120897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
120997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
121097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
121197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
121297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
121397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
121497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
121597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
121697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
12170c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinenstatic int dss_mgr_unset_output(struct omap_overlay_manager *mgr)
121897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
121997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
122097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
122197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	unsigned long flags;
122297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
122397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
122497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
122597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (!mgr->output) {
122697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("failed to unset output, output not set\n");
122797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
122897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
122997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
123097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_lock_irqsave(&data_lock, flags);
123297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mp->enabled) {
123497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output can't be unset when manager is enabled\n");
123597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
123697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err1;
123797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
123897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
124097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
124197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output->manager = NULL;
124297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = NULL;
124397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
124497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
124597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
124697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
124797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr1:
124897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
124997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
125097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
125197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
125297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
125397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
125497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
125545324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_apply_mgr_timings(struct omap_overlay_manager *mgr,
125627dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
125745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
125845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
125945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
126045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->timings = *timings;
126145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = true;
126245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
126345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
126474b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic void dss_mgr_set_timings_compat(struct omap_overlay_manager *mgr,
126527dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
126645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
126745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	unsigned long flags;
1268fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
126945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
127045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_lock_irqsave(&data_lock, flags);
127145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1272fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	if (mp->updating) {
1273fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		DSSERR("cannot set timings for %s: manager needs to be disabled\n",
1274fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen			mgr->name);
1275fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		goto out;
1276fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	}
127745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1278fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	dss_apply_mgr_timings(mgr, timings);
1279fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinenout:
128045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
128145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
1282eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1283f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejastatic void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
1284f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1285f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1286f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1287f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1288f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config = *config;
1289f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->extra_info_dirty = true;
1290f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1291f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
129274b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic void dss_mgr_set_lcd_config_compat(struct omap_overlay_manager *mgr,
1293f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1294f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1295f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	unsigned long flags;
1296f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1297f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1298aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1299f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1300f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	if (mp->enabled) {
1301f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n",
1302f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja			mgr->name);
1303f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		goto out;
1304f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	}
1305f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1306f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	dss_apply_mgr_lcd_config(mgr, config);
1307f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejaout:
1308aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1309f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1310f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
13116abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_ovl_set_info(struct omap_overlay *ovl,
1312f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1313f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1314c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1315e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1316fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	int r;
1317fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen
1318fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	r = dss_ovl_simple_check(ovl, info);
1319fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	if (r)
1320fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen		return r;
1321e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1322e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1323e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1324c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info = *info;
1325c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = true;
1326f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1327e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1328e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1329f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1330f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1331f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13326abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic void dss_ovl_get_info(struct omap_overlay *ovl,
1333f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1334f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1335c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1336e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1337e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1338e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1339e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1340c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	*info = op->user_info;
1341e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1342e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1343f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1344f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13456abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_ovl_set_manager(struct omap_overlay *ovl,
1346f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_manager *mgr)
1347f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1348aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1349aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
13505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
13515558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1352f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!mgr)
1353f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		return -EINVAL;
1354f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13555558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
13565558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1357f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (ovl->manager) {
1358f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay '%s' already has a manager '%s'\n",
1359f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen				ovl->name, ovl->manager->name);
13605558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
13615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1362f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1363f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
136402b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	r = dispc_runtime_get();
136502b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	if (r)
136602b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		goto err;
136702b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja
1368aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1369aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1370aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1371aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1372f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to change the manager\n");
13735558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
137402b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		goto err1;
1375f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1376f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
137702b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	dispc_ovl_set_channel_out(ovl->id, mgr->id);
13785d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1379f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = mgr;
1380f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_add_tail(&ovl->list, &mgr->overlays);
1381f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1382aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1383aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
138402b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	dispc_runtime_put();
1385f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13875558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1388f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
138902b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja
139002b5ff1a96af7fab8db602677c220c0a35b1f687Archit Tanejaerr1:
139102b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	dispc_runtime_put();
13925558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
13935558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13945558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1395f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1396f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13976abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_ovl_unset_manager(struct omap_overlay *ovl)
1398f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1399aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1400aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
14015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
14025558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
14035558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
14045558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1405f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!ovl->manager) {
1406f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("failed to detach overlay: manager not set\n");
14075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
14085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1409f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1410f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1411aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1412aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1413aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1414aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1415f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to unset the manager\n");
14165558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
14175558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1418f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1419f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1420b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1421b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
1422b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	/* wait for pending extra_info updates to ensure the ovl is disabled */
1423b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	wait_pending_extra_info_updates();
1424b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
142502b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	/*
142602b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * For a manual update display, there is no guarantee that the overlay
142702b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * is really disabled in HW, we may need an extra update from this
142802b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * manager before the configurations can go in. Return an error if the
142902b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * overlay needed an update from the manager.
143002b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 *
143102b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * TODO: Instead of returning an error, try to do a dummy manager update
143202b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * here to disable the overlay in hardware. Use the *GATED fields in
143302b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 * the DISPC_CONFIG registers to do a dummy update.
143402b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	 */
1435b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1436b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
143702b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	if (ovl_manual_update(ovl) && op->extra_info_dirty) {
143802b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
143902b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		DSSERR("need an update to change the manager\n");
144002b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		r = -EINVAL;
144102b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja		goto err;
144202b5ff1a96af7fab8db602677c220c0a35b1f687Archit Taneja	}
14435d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1444f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = NULL;
1445f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_del(&ovl->list);
1446f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1449aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1450aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1451aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1452aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1453aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1454aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1455aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1456aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
14576abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic bool dss_ovl_is_enabled(struct omap_overlay *ovl)
1458aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1459aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1460aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1461aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool e;
1462aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1463aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1464aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1465aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	e = op->enabled;
1466aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1467aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1468aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1469aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return e;
1470aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1471aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
14726abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_ovl_enable(struct omap_overlay *ovl)
1473aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1474aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1475aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1476aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1477aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1478aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1479aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1480e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (op->enabled) {
1481e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
148239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1483e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1484e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
14850f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1486aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
148739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1488aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1489aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1490aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1491aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
149282153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = true;
149382153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
1494228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(ovl->manager);
149539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
149639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable overlay %d: check_settings failed\n",
149739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				ovl->id);
149839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err2;
149939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
150039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1501b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
15026dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
150382153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
150482153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	dss_apply_ovl_enable(ovl, true);
150582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
150675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
15073ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
150875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1509aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1510aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1511aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1512aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1513aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
151439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr2:
151582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
151639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
151739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr1:
1518aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1519aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1520aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1521aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
15226abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinenstatic int dss_ovl_disable(struct omap_overlay *ovl)
1523aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1524aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1525aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1526aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1527aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1528aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1529aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1530e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!op->enabled) {
1531e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
1532e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto err;
1533e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1534e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
15350f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1536aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1537aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1538aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1539aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1540aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1541aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1542841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	dss_apply_ovl_enable(ovl, false);
154375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
15443ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
154575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1546aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1547aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
15485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
15495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1550f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1551aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
15525558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
15535558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
15545558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1555f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1556f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
15571550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinenstatic int dss_mgr_register_framedone_handler_compat(struct omap_overlay_manager *mgr,
15581550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		void (*handler)(void *), void *data)
15591550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen{
15601550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
15611550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15621550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	if (mp->framedone_handler)
15631550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		return -EBUSY;
15641550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15651550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	mp->framedone_handler = handler;
15661550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	mp->framedone_handler_data = data;
15671550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15681550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	return 0;
15691550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen}
15701550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15711550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinenstatic void dss_mgr_unregister_framedone_handler_compat(struct omap_overlay_manager *mgr,
15721550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen		void (*handler)(void *), void *data)
15731550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen{
15741550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
15751550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15761550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	WARN_ON(mp->framedone_handler != handler ||
15771550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen			mp->framedone_handler_data != data);
15781550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
15791550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	mp->framedone_handler = NULL;
15801550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	mp->framedone_handler_data = NULL;
15811550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen}
15821550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen
158374b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenstatic const struct dss_mgr_ops apply_mgr_ops = {
1584a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen	.connect = dss_mgr_connect_compat,
1585a7e71e7f9fc7924921081aa55ceafca00d2c9f49Tomi Valkeinen	.disconnect = dss_mgr_disconnect_compat,
158674b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	.start_update = dss_mgr_start_update_compat,
158774b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	.enable = dss_mgr_enable_compat,
158874b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	.disable = dss_mgr_disable_compat,
158974b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	.set_timings = dss_mgr_set_timings_compat,
159074b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	.set_lcd_config = dss_mgr_set_lcd_config_compat,
15911550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	.register_framedone_handler = dss_mgr_register_framedone_handler_compat,
15921550202d4a7593655a2aca99e39a58751073c92aTomi Valkeinen	.unregister_framedone_handler = dss_mgr_unregister_framedone_handler_compat,
159374b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen};
159474b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
15958dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenstatic int compat_refcnt;
15968dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenstatic DEFINE_MUTEX(compat_init_lock);
15978dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
15988dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenint omapdss_compat_init(void)
15998dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen{
160023dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen	struct platform_device *pdev = dss_get_core_pdev();
160174b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	int i, r;
160223dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen
16038dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	mutex_lock(&compat_init_lock);
16048dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16058dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	if (compat_refcnt++ > 0)
16068dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen		goto out;
16078dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16088dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	apply_init_priv();
16098dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16107f7cdbd6883fd58cfc4e538d451b455ca849bd63Tomi Valkeinen	dss_init_overlay_managers_sysfs(pdev);
161123dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen	dss_init_overlays(pdev);
161223dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen
16130c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlay_managers(); i++) {
16140c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		struct omap_overlay_manager *mgr;
16150c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
16160c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
16170c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
16180c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->set_output = &dss_mgr_set_output;
16190c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->unset_output = &dss_mgr_unset_output;
16200c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->apply = &omap_dss_mgr_apply;
16210c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->set_manager_info = &dss_mgr_set_info;
16220c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->get_manager_info = &dss_mgr_get_info;
16230c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->wait_for_go = &dss_mgr_wait_for_go;
16240c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->wait_for_vsync = &dss_mgr_wait_for_vsync;
16250c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen		mgr->get_device = &dss_mgr_get_device;
16260c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen	}
16270c49ff747a4656e24b8990764f5ee4cd047ee982Tomi Valkeinen
16286abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlays(); i++) {
16296abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		struct omap_overlay *ovl = omap_dss_get_overlay(i);
16306abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen
16316abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->is_enabled = &dss_ovl_is_enabled;
16326abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->enable = &dss_ovl_enable;
16336abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->disable = &dss_ovl_disable;
16346abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->set_manager = &dss_ovl_set_manager;
16356abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->unset_manager = &dss_ovl_unset_manager;
16366abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->set_overlay_info = &dss_ovl_set_info;
16376abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->get_overlay_info = &dss_ovl_get_info;
16386abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->wait_for_go = &dss_mgr_wait_for_go_ovl;
16396abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen		ovl->get_device = &dss_ovl_get_device;
16406abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen	}
16416abae7a18a8c9dbec96915eb924dc06288a47b02Tomi Valkeinen
164274b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	r = dss_install_mgr_ops(&apply_mgr_ops);
164374b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	if (r)
164474b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen		goto err_mgr_ops;
164574b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
164694140f0d225fd1261e11a9d883be6de5692d57d8Tomi Valkeinen	r = display_init_sysfs(pdev);
164794140f0d225fd1261e11a9d883be6de5692d57d8Tomi Valkeinen	if (r)
164894140f0d225fd1261e11a9d883be6de5692d57d8Tomi Valkeinen		goto err_disp_sysfs;
164909e82ba7011d6e94bf1eeb3f1cd0b7d441263132Tomi Valkeinen
165096e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	dispc_runtime_get();
165196e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen
165296e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	r = dss_dispc_initialize_irq();
165396e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	if (r)
165496e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen		goto err_init_irq;
165596e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen
165696e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	dispc_runtime_put();
165796e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen
16588dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenout:
16598dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	mutex_unlock(&compat_init_lock);
16608dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16618dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	return 0;
166274b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
166396e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinenerr_init_irq:
166496e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	dispc_runtime_put();
166594140f0d225fd1261e11a9d883be6de5692d57d8Tomi Valkeinen	display_uninit_sysfs(pdev);
166609e82ba7011d6e94bf1eeb3f1cd0b7d441263132Tomi Valkeinen
166709e82ba7011d6e94bf1eeb3f1cd0b7d441263132Tomi Valkeinenerr_disp_sysfs:
166896e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	dss_uninstall_mgr_ops();
166996e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen
167074b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinenerr_mgr_ops:
16717f7cdbd6883fd58cfc4e538d451b455ca849bd63Tomi Valkeinen	dss_uninit_overlay_managers_sysfs(pdev);
167274b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	dss_uninit_overlays(pdev);
167374b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
167474b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	compat_refcnt--;
167574b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
167674b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	mutex_unlock(&compat_init_lock);
167774b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
167874b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	return r;
16798dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen}
16808dd2491a4216778a81668581041ba1c06453ed6cTomi ValkeinenEXPORT_SYMBOL(omapdss_compat_init);
16818dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16828dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenvoid omapdss_compat_uninit(void)
16838dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen{
168423dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen	struct platform_device *pdev = dss_get_core_pdev();
168523dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen
16868dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	mutex_lock(&compat_init_lock);
16878dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
16888dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	if (--compat_refcnt > 0)
16898dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen		goto out;
16908dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen
169196e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen	dss_dispc_uninitialize_irq();
169296e2e6374385d2219b9011f6bfd0de7221a591d4Tomi Valkeinen
169394140f0d225fd1261e11a9d883be6de5692d57d8Tomi Valkeinen	display_uninit_sysfs(pdev);
169409e82ba7011d6e94bf1eeb3f1cd0b7d441263132Tomi Valkeinen
169574b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen	dss_uninstall_mgr_ops();
169674b65ec24560ab0df0e7b789fa91cde4a442f169Tomi Valkeinen
16977f7cdbd6883fd58cfc4e538d451b455ca849bd63Tomi Valkeinen	dss_uninit_overlay_managers_sysfs(pdev);
169823dfd1ac87b56652e618fda24b035505c89c4b8cTomi Valkeinen	dss_uninit_overlays(pdev);
16998dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinenout:
17008dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen	mutex_unlock(&compat_init_lock);
17018dd2491a4216778a81668581041ba1c06453ed6cTomi Valkeinen}
17028dd2491a4216778a81668581041ba1c06453ed6cTomi ValkeinenEXPORT_SYMBOL(omapdss_compat_uninit);
1703