apply.c revision 3a979f8ad2014f6bff862b01d21ce151aa47968a
158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/*
258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Copyright (C) 2011 Texas Instruments
358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@ti.com>
458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it
658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by
758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the Free Software Foundation.
858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT
1058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * more details.
1358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
1458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * You should have received a copy of the GNU General Public License along with
1558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * this program.  If not, see <http://www.gnu.org/licenses/>.
1658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
1758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
1858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#define DSS_SUBSYS_NAME "APPLY"
1958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/kernel.h>
2158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/slab.h>
2258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/spinlock.h>
2358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/jiffies.h>
2458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <video/omapdss.h>
2658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
2758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss.h"
2858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss_features.h"
2958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
3058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/*
3158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * We have 4 levels of cache for the dispc settings. First two are in SW and
3258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the latter two in HW.
3358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *
340b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *       set_info()
350b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen *          v
3658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
370b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * |     user_info      |
3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
3958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *        apply()
4158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
43d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * |       info         |
4458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
46f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen *      write_regs()
4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
4858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |  shadow registers  |
5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable
5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen *          v
5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |      registers     |
5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+
5758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */
5858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
59c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data {
60c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
61c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	bool user_info_dirty;
62c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct omap_overlay_info user_info;
63c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
640b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
6558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info info;
6658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
670b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
680b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
69aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool extra_info_dirty;
70aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool shadow_extra_info_dirty;
71aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
72aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool enabled;
735d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	enum omap_channel channel;
746dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
7582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
7682153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	/*
7782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 * True if overlay is to be enabled. Used to check and calculate configs
7882153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 * for the overlay before it is enabled in the HW.
7982153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	 */
8082153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	bool enabling;
8158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
8258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
83af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data {
84388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
85388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	bool user_info_dirty;
86388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct omap_overlay_manager_info user_info;
87388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen
880b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool info_dirty;
8958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_manager_info info;
9058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	bool shadow_info_dirty;
920b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen
9343a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	/* If true, GO bit is up and shadow registers cannot be written.
9443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	 * Never true for manual update displays */
9543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	bool busy;
9643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
9734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	/* If true, dispc output is enabled */
9834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	bool updating;
9934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
100bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	/* If true, a display is enabled using this manager */
101bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	bool enabled;
10245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
10345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	bool extra_info_dirty;
10445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	bool shadow_extra_info_dirty;
10545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
10645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct omap_video_timings timings;
107f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct dss_lcd_mgr_config lcd_config;
10858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen};
10958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
11058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct {
111c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS];
112af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS];
11358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
11458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	bool irq_enabled;
115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data;
11658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
117d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */
118063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock;
1195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */
1205558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock);
121f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic DECLARE_COMPLETION(extra_updated_completion);
122063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen
12375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void);
12475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
125c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl)
126c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{
127d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.ovl_priv_data_array[ovl->id];
128c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen}
129c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen
130af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
131af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{
132d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	return &dss_data.mgr_priv_data_array[mgr->id];
133af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen}
134af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen
13558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void)
13658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
137c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	const int num_ovls = dss_feat_get_num_ovls();
138f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp;
139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	int i;
140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
141063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock_init(&data_lock);
142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	for (i = 0; i < num_ovls; ++i) {
144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		struct ovl_priv_data *op;
145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op = &dss_data.ovl_priv_data_array[i];
147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->info.global_alpha = 255;
149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		switch (i) {
151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 0:
152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder = 0;
153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 1:
155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0;
157c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
158c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 2:
159c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
160c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0;
161c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
162c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		case 3:
163c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			op->info.zorder =
164c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen				dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0;
165c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen			break;
166c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		}
167c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen
168c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen		op->user_info = op->info;
169c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	}
170f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
171f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	/*
172f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 * Initialize some of the lcd_config fields for TV manager, this lets
173f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 * us prevent checking if the manager is LCD or TV at some places
174f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	 */
175f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT];
176f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
177f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.video_port_width = 24;
178f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.clock_info.lck_div = 1;
179f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config.clock_info.pck_div = 1;
18058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
18158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
18275bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja/*
18375bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * A LCD manager's stallmode decides whether it is in manual or auto update. TV
18475bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * manager is always auto update, stallmode field for TV manager is false by
18575bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * default
18675bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja */
18758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl)
18858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
18975bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(ovl->manager);
19075bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja
19175bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	return mp->lcd_config.stallmode;
19258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
19358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
19458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr)
19558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
19675bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
19775bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja
19875bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja	return mp->lcd_config.stallmode;
19958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
20058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
20139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenstatic int dss_check_settings_low(struct omap_overlay_manager *mgr,
202228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja		bool applying)
20339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
20439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_info *oi;
20539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_manager_info *mi;
20639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay *ovl;
20739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct omap_overlay_info *ois[MAX_DSS_OVERLAYS];
20839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct ovl_priv_data *op;
20939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	struct mgr_priv_data *mp;
21039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
21139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	mp = get_mgr_priv(mgr);
21239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
2135dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja	if (!mp->enabled)
2145dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja		return 0;
2155dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja
21639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (applying && mp->user_info_dirty)
21739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		mi = &mp->user_info;
21839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	else
21939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		mi = &mp->info;
22039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
22139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	/* collect the infos to be tested into the array */
22239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
22339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		op = get_ovl_priv(ovl);
22439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
22582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen		if (!op->enabled && !op->enabling)
22639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = NULL;
22739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		else if (applying && op->user_info_dirty)
22839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = &op->user_info;
22939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		else
23039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			oi = &op->info;
23139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
23239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		ois[ovl->id] = oi;
23339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
23439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
2356e5435958c6ee4fa2142d298d836dd78b8353f66Archit Taneja	return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois);
23639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
23739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
23839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/*
23939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from data->info
24039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */
241228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings(struct omap_overlay_manager *mgr)
24239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
243228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	return dss_check_settings_low(mgr, false);
24439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
24539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
24639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/*
24739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from ovl->info if
24839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * dirty and from data->info otherwise
24939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */
250228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings_apply(struct omap_overlay_manager *mgr)
25139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{
252228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	return dss_check_settings_low(mgr, true);
25339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen}
25439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
25575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void)
25675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
25775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
25875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
25975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
26075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
26175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
26275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
26375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay *ovl;
26475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
26575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
26675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		mp = get_mgr_priv(mgr);
26775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
26875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled)
26975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			continue;
27075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
27134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mgr_manual_update(mgr)) {
27234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch FRAMEDONE */
27334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->updating)
27434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
27534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		} else {
27634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to catch GO bit going down */
27734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			if (mp->busy)
27834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
27975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
28034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			/* to write new values to registers */
2810b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			if (mp->info_dirty)
28234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				return true;
28375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
2849f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen			/* to set GO bit */
2859f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen			if (mp->shadow_info_dirty)
2869f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				return true;
2879f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
28845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/*
28945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * NOTE: we don't check extra_info flags for disabled
29045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * managers, once the manager is enabled, the extra_info
29145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 * related manager changes will be taken in by HW.
29245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			 */
29345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
29445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/* to write new values to registers */
29545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (mp->extra_info_dirty)
29645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
29745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
29845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			/* to set GO bit */
29945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (mp->shadow_extra_info_dirty)
30045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
30145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
30234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			list_for_each_entry(ovl, &mgr->overlays, list) {
30334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				struct ovl_priv_data *op;
30475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
30534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				op = get_ovl_priv(ovl);
30675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
3079f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/*
3089f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * NOTE: we check extra_info flags even for
3099f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * disabled overlays, as extra_infos need to be
3109f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 * always written.
3119f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				 */
3129f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3139f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to write new values to registers */
3149f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->extra_info_dirty)
3159f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3169f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3179f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to set GO bit */
3189f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->shadow_extra_info_dirty)
3199f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3209f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
32134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				if (!op->enabled)
32234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					continue;
32375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
32434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen				/* to write new values to registers */
3259f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->info_dirty)
3269f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen					return true;
3279f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen
3289f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				/* to set GO bit */
3299f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen				if (op->shadow_info_dirty)
33034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen					return true;
33134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen			}
33275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		}
33375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
33475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
33575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
33675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
33775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
33875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr)
33975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
34075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
34175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp;
34275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op;
34375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
34475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	mp = get_mgr_priv(mgr);
34575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
34645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (mp->shadow_info_dirty || mp->shadow_extra_info_dirty)
34775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return true;
34875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
34975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
35075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op = get_ovl_priv(ovl);
3510b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		if (op->shadow_info_dirty || op->shadow_extra_info_dirty)
35275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen			return true;
35375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
35475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
35575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	return false;
35675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
35775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
358f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* returns true if an extra_info field is currently being updated */
359f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic bool extra_info_update_ongoing(void)
360f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
36145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	const int num_mgrs = dss_feat_get_num_mgrs();
362f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	int i;
363f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
36445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	for (i = 0; i < num_mgrs; ++i) {
36545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct omap_overlay_manager *mgr;
36645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct omap_overlay *ovl;
36745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		struct mgr_priv_data *mp;
3681f3f53ae5179ba7f24b4a429bc41773f1f4857caRob Clark
36945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mgr = omap_dss_get_overlay_manager(i);
37045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mp = get_mgr_priv(mgr);
371f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
372f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		if (!mp->enabled)
373f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
374f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
375153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen		if (!mp->updating)
376f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen			continue;
377f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
37845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		if (mp->extra_info_dirty || mp->shadow_extra_info_dirty)
379153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen			return true;
38045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
38145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		list_for_each_entry(ovl, &mgr->overlays, list) {
38245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			struct ovl_priv_data *op = get_ovl_priv(ovl);
38345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
38445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja			if (op->extra_info_dirty || op->shadow_extra_info_dirty)
38545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja				return true;
38645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		}
387f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
388f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
389f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	return false;
390f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
391f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
392f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* wait until no extra_info updates are pending */
393f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic void wait_pending_extra_info_updates(void)
394f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{
395f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool updating;
396f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long flags;
397f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	unsigned long t;
3984614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	int r;
399f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
400f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
401f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
402f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	updating = extra_info_update_ongoing();
403f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
404f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!updating) {
405f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
406f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		return;
407f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	}
408f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
409f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	init_completion(&extra_updated_completion);
410f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
411f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
412f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
413f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	t = msecs_to_jiffies(500);
4144614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	r = wait_for_completion_timeout(&extra_updated_completion, t);
4154614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	if (r == 0)
4164614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen		DSSWARN("timeout in wait_pending_extra_info_updates\n");
4174614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen	else if (r < 0)
4184614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen		DSSERR("wait_pending_extra_info_updates failed: %d\n", r);
419f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen}
420f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
42158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr)
42258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
42358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
424fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
42558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
426fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	unsigned long flags;
42758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
42858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
42958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
430fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_lock_irqsave(&data_lock, flags);
431fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
432fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (mgr_manual_update(mgr)) {
433fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
43458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
435fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
43658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
437fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (!mp->enabled) {
438fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
43958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
440fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
441fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
442fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
44358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
44421e56f79abad987555351c73569fc8358636b0faLajos Molnar	r = dispc_runtime_get();
44521e56f79abad987555351c73569fc8358636b0faLajos Molnar	if (r)
44621e56f79abad987555351c73569fc8358636b0faLajos Molnar		return r;
44721e56f79abad987555351c73569fc8358636b0faLajos Molnar
448bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(mgr->id);
44958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
45058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
45158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
45258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
45358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
454063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
4550b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = mp->info_dirty;
4560b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = mp->shadow_info_dirty;
457063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
45858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
45958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
46058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
46158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
46258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
46358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
46458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
46558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
46658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
46758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
46858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
46958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
47058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() not finishing\n",
47158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					mgr->id);
47258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
47358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
47458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
47558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
47658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
47758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
47858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
47958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
48058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
48158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id);
48258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
48358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
48458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
48558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
48621e56f79abad987555351c73569fc8358636b0faLajos Molnar	dispc_runtime_put();
48721e56f79abad987555351c73569fc8358636b0faLajos Molnar
48858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
48958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
49058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
49158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl)
49258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
49358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	unsigned long timeout = msecs_to_jiffies(500);
494c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
495fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	struct mgr_priv_data *mp;
49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	u32 irq;
497fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	unsigned long flags;
49858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
49958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int i;
50058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
50158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (!ovl->manager)
50258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
50358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
504fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	mp = get_mgr_priv(ovl->manager);
50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
506fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_lock_irqsave(&data_lock, flags);
507fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
508fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (ovl_manual_update(ovl)) {
509fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
51058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
511fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
51258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
513fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	if (!mp->enabled) {
514fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja		spin_unlock_irqrestore(&data_lock, flags);
51558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return 0;
516fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	}
517fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja
518fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
51958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
52021e56f79abad987555351c73569fc8358636b0faLajos Molnar	r = dispc_runtime_get();
52121e56f79abad987555351c73569fc8358636b0faLajos Molnar	if (r)
52221e56f79abad987555351c73569fc8358636b0faLajos Molnar		return r;
52321e56f79abad987555351c73569fc8358636b0faLajos Molnar
524bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	irq = dispc_mgr_get_vsync_irq(ovl->manager->id);
52558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
526c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
52758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	i = 0;
52858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	while (1) {
52958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		bool shadow_dirty, dirty;
53058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
531063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_lock_irqsave(&data_lock, flags);
5320b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		dirty = op->info_dirty;
5330b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		shadow_dirty = op->shadow_info_dirty;
534063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
53558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
53658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (!dirty && !shadow_dirty) {
53758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
53858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
53958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
54058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
54158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		/* 4 iterations is the worst case:
54258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 1 - initial iteration, dirty = true (between VFP and VSYNC)
54358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 2 - first VSYNC, dirty = true
54458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 3 - dirty = false, shadow_dirty = true
54558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		 * 4 - shadow_dirty = false */
54658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (i++ == 3) {
54758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() not finishing\n",
54858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen					ovl->id);
54958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			r = 0;
55058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
55158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
55258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
55358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout);
55458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r == -ERESTARTSYS)
55558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
55658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
55758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		if (r) {
55858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id);
55958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			break;
56058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		}
56158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
56258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
56321e56f79abad987555351c73569fc8358636b0faLajos Molnar	dispc_runtime_put();
56421e56f79abad987555351c73569fc8358636b0faLajos Molnar
56558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	return r;
56658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
56758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
56875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl)
56958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
57075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
57158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	struct omap_overlay_info *oi;
5728050cbe4cd9a96ff333df718f38830eabab690bdArchit Taneja	bool replication;
57334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
57458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	int r;
57558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
576702d267eb8ec66e1b2cde9448fc5960315ed8662Chandrabhanu Mahapatra	DSSDBG("writing ovl %d regs", ovl->id);
57758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5780b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (!op->enabled || !op->info_dirty)
57975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
58058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
58175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	oi = &op->info;
58258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
58381ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja	mp = get_mgr_priv(ovl->manager);
58481ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja
5856c6f510afb86e3c77c351dfa20cbb8ca834abad9Archit Taneja	replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode);
58658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
5878ba85306ba0fd87a3c15a02fe83d817832705a7dArchit Taneja	r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings, false);
58858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	if (r) {
58975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/*
59075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * We can't do much here, as this function can be called from
59175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 * vsync interrupt.
59275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		 */
593f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen		DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id);
59475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
59575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		/* This will leave fifo configurations in a nonoptimal state */
59675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		op->enabled = false;
59775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_ovl_enable(ovl->id, false);
59875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
59958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
60058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6010b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = false;
60234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
6030b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		op->shadow_info_dirty = true;
60458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
60558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
606aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl)
607aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
608aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
60934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	struct mgr_priv_data *mp;
610aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
611702d267eb8ec66e1b2cde9448fc5960315ed8662Chandrabhanu Mahapatra	DSSDBG("writing ovl %d regs extra", ovl->id);
612aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
61375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!op->extra_info_dirty)
61475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
61575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
616aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	/* note: write also when op->enabled == false, so that the ovl gets
617aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	 * disabled */
618aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
619aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	dispc_ovl_enable(ovl->id, op->enabled);
6205d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	dispc_ovl_set_channel_out(ovl->id, op->channel);
6216dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high);
62275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
62334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp = get_mgr_priv(ovl->manager);
62434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
62575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	op->extra_info_dirty = false;
62634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (mp->updating)
62734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		op->shadow_extra_info_dirty = true;
628aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
629aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
630f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
63158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
63275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
63375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	struct omap_overlay *ovl;
63458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
635702d267eb8ec66e1b2cde9448fc5960315ed8662Chandrabhanu Mahapatra	DSSDBG("writing mgr %d regs", mgr->id);
63658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
63775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mp->enabled)
63875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		return;
63958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	WARN_ON(mp->busy);
64158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
64258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	/* Commit overlay settings */
64375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
64475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_ovl_write_regs(ovl);
645aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		dss_ovl_write_regs_extra(ovl);
646aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
647aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
6480b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	if (mp->info_dirty) {
64975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_setup(mgr->id, &mp->info);
65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
6510b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen		mp->info_dirty = false;
65234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		if (mp->updating)
6530b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen			mp->shadow_info_dirty = true;
65458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
65575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen}
65675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
65745324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr)
65845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
65945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
66045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
661702d267eb8ec66e1b2cde9448fc5960315ed8662Chandrabhanu Mahapatra	DSSDBG("writing mgr %d regs extra", mgr->id);
66245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
66345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (!mp->extra_info_dirty)
66445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		return;
66545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
66645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	dispc_mgr_set_timings(mgr->id, &mp->timings);
66745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
668f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	/* lcd_config parameters */
669fb2cec1f72acb030180aa96cd150b47b562bc999Tomi Valkeinen	if (dss_mgr_is_lcd(mgr->id))
670fb2cec1f72acb030180aa96cd150b47b562bc999Tomi Valkeinen		dispc_mgr_set_lcd_config(mgr->id, &mp->lcd_config);
671f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
67245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = false;
67345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (mp->updating)
67445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mp->shadow_extra_info_dirty = true;
67545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
67645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
67775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void)
67875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
67975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
68075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
68158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
68258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
68375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
68475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
68539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		int r;
68675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
687af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
688af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp = get_mgr_priv(mgr);
68958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
69158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			continue;
69258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
693228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja		r = dss_check_settings(mgr);
69439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		if (r) {
69539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			DSSERR("cannot write registers for manager %s: "
69639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen					"illegal configuration\n", mgr->name);
69739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			continue;
69839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		}
69939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
70075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_mgr_write_regs(mgr);
70145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		dss_mgr_write_regs_extra(mgr);
7023ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	}
7033ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen}
70475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
7053ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinenstatic void dss_set_go_bits(void)
7063ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen{
7073ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
7083ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	int i;
70958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7103ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
7113ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct omap_overlay_manager *mgr;
7123ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct mgr_priv_data *mp;
71358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7143ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
7153ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp = get_mgr_priv(mgr);
7163ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7173ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
7183ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7193ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7203ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!need_go(mgr))
7213ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7223ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7233ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp->busy = true;
7243ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7253ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!dss_data.irq_enabled && need_isr())
7263ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			dss_register_vsync_isr();
7273ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7283ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		dispc_mgr_go(mgr->id);
72975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
7303ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
73158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
73258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
733df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
734df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen{
735df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct omap_overlay *ovl;
736df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct mgr_priv_data *mp;
737df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct ovl_priv_data *op;
738df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
739df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp = get_mgr_priv(mgr);
740df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp->shadow_info_dirty = false;
74145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->shadow_extra_info_dirty = false;
742df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
743df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
744df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op = get_ovl_priv(ovl);
745df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_info_dirty = false;
746df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_extra_info_dirty = false;
747df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	}
748df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen}
749df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
75058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr)
75158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
752af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
753e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
75439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
755e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
756e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
75758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
75834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	WARN_ON(mp->updating);
75934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
760228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
76139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
76239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("cannot start manual update: illegal configuration\n");
76339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
76439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return;
76539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
76639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
76775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_mgr_write_regs(mgr);
76845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	dss_mgr_write_regs_extra(mgr);
76958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
77034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = true;
77158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
77234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
77334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		dss_register_vsync_isr();
77458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7753a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen	dispc_mgr_enable_sync(mgr->id);
776e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
777df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mgr_clear_shadow_dirty(mgr);
778df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
779e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
78058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
78158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
782dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask);
783dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
784dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void)
785dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
786bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
787dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
788bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
789dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
790bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
791bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
792bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
793dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
79434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
79534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
79634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
797dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
798dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
799dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
800d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = true;
801dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
802dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
803dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void)
804dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
805bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
806dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
807bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
808dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
809bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
810bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
811bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
812dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
81334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
81434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
81534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
816dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask);
817dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
818dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
819d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = false;
820dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
821dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
8227609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask)
8237609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{
82458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
82575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
826f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool extra_updating;
82758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
828063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock(&data_lock);
82958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8307609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	/* clear busy, updating flags, shadow_dirty flags */
83143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
8327609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct omap_overlay_manager *mgr;
8337609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct mgr_priv_data *mp;
8345b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen		bool was_updating;
8357609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
83643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
83743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mp = get_mgr_priv(mgr);
83843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8397609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mp->enabled)
84043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			continue;
84143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8425b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen		was_updating = mp->updating;
8437609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		mp->updating = dispc_mgr_is_enabled(i);
84458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8457609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mgr_manual_update(mgr)) {
8465b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			bool was_busy = mp->busy;
8477609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			mp->busy = dispc_mgr_go_busy(i);
84843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8495b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			if (was_busy && !mp->busy)
8507609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
8517609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		}
85258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
85358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
85475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
8553ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
85658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
857f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	extra_updating = extra_info_update_ongoing();
858f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!extra_updating)
859f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		complete_all(&extra_updated_completion);
860f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
86175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!need_isr())
86275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_unregister_vsync_isr();
86358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
864063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock(&data_lock);
86558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
86658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8675738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl)
86858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
869c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
87058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
871c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
87258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
873c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	if (!op->user_info_dirty)
8745738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen		return;
87558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
876c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = false;
8770b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = true;
878c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->info = op->user_info;
87958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
88058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
88158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr)
88258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
883af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
88458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
885af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
88658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
887388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	if (!mp->user_info_dirty)
88858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return;
88958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
890388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = false;
8910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	mp->info_dirty = true;
892388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->info = mp->user_info;
89358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
89458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8956dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
89658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
8976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	unsigned long flags;
8986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct omap_overlay *ovl;
89939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
9006dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9016dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
9026dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9036dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
9046dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
905228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings_apply(mgr);
90639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
90739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
90839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to apply settings: illegal configuration.\n");
90939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return r;
91039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
91139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
9126dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure overlays */
9136dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
9146dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		omap_dss_mgr_apply_ovl(ovl);
9156dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9166dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure manager */
9176dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	omap_dss_mgr_apply_mgr(mgr);
9186dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9196dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_write_regs();
9203ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
9216dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9226dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
9236dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
924e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen	return 0;
9256dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen}
9266dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
927841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable)
928841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{
929841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	struct ovl_priv_data *op;
930841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
931841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op = get_ovl_priv(ovl);
932841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
933841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	if (op->enabled == enable)
934841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen		return;
935841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
936841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->enabled = enable;
937841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->extra_info_dirty = true;
938841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen}
939841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
94004576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinenstatic void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl,
94104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		u32 fifo_low, u32 fifo_high)
94204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen{
94304576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
94404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
94504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	if (op->fifo_low == fifo_low && op->fifo_high == fifo_high)
94604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		return;
94704576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
94804576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_low = fifo_low;
94904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_high = fifo_high;
95004576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->extra_info_dirty = true;
95104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen}
95204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
953b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl)
9546dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{
9556dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
9566dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
957b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	bool use_fifo_merge = false;
95858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
95975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	if (!op->enabled && !op->enabling)
96075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		return;
96175ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen
96283fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen	dispc_ovl_compute_fifo_thresholds(ovl->id, &fifo_low, &fifo_high,
9633568f2a46f2a73bab18c914df06afd98a97e0e0eTomi Valkeinen			use_fifo_merge, ovl_manual_update(ovl));
9646dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
96504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high);
96658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
96758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
968b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr)
96958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
97007e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	struct omap_overlay *ovl;
9716dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct mgr_priv_data *mp;
97258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9736dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	mp = get_mgr_priv(mgr);
97458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9756dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	if (!mp->enabled)
9766dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		return;
97758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
97875ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
979b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_ovl_setup_fifo(ovl);
98075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen}
98158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
982b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_setup_fifos(void)
98375ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen{
98475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
98575ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	struct omap_overlay_manager *mgr;
98675ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	int i;
98758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
98875ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
98975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
990b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_mgr_setup_fifos(mgr);
9916dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	}
99258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
99358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9942a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenint dss_mgr_enable(struct omap_overlay_manager *mgr)
9957797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
996bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
997bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
99839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
999bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
10005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1002e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (mp->enabled)
1003e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1004e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
1005bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1006bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1007bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = true;
1008a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen
1009228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
101039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
101139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable manager %d: check_settings failed\n",
101239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				mgr->id);
10132a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen		goto err;
101439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
101539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1016b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
10176dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
101875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
10193ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
102075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
102134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!mgr_manual_update(mgr))
102234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mp->updating = true;
102334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
1024d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
1025d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen		dss_register_vsync_isr();
1026d7b6b6b1e7490beba3f4a30d8a6f22947c263ffeTomi Valkeinen
1027bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
102975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mgr_manual_update(mgr))
10303a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen		dispc_mgr_enable_sync(mgr->id);
103175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1032e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
10335558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10342a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
10352a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return 0;
10362a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
10372a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenerr:
1038a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen	mp->enabled = false;
10392a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10402a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	mutex_unlock(&apply_lock);
10412a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return r;
10427797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
10437797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
10447797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr)
10457797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
1046bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1047bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
1048bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
10495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1051e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!mp->enabled)
1052e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1053e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
10549a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen	if (!mgr_manual_update(mgr))
10553a979f8ad2014f6bff862b01d21ce151aa47968aTomi Valkeinen		dispc_mgr_disable_sync(mgr->id);
1056bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1057bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1058bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
105934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = false;
1060bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = false;
1061bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1062bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10635558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1064e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
10655558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10667797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
10677797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
1068eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr,
1069eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1070eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1071388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1072e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1073f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	int r;
1074f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen
1075f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	r = dss_mgr_simple_check(mgr, info);
1076f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	if (r)
1077f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen		return r;
1078e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1079e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1080e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1081388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info = *info;
1082388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = true;
1083eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1084e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1085e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1086eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
1087eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1088eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1089eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr,
1090eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1091eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1092388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1093e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1094e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1095e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1096e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1097388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	*info = mp->user_info;
1098e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1099e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1100eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1101eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
110297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_set_output(struct omap_overlay_manager *mgr,
110397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		struct omap_dss_output *output)
110497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
110597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
110697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
110797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
110897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
110997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mgr->output) {
111097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("manager %s is already connected to an output\n",
111197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
111297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
111397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
111497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
111597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
111697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if ((mgr->supported_outputs & output->id) == 0) {
111797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output does not support manager %s\n",
111897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
111997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
112097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
112197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
112297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
112397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	output->manager = mgr;
112497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = output;
112597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
112697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
112797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
112897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
112997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
113097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
113197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
113297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
113397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
113497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_unset_output(struct omap_overlay_manager *mgr)
113597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
113697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
113797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
113897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	unsigned long flags;
113997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
114097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
114197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
114297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (!mgr->output) {
114397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("failed to unset output, output not set\n");
114497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
114597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
114697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
114797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
114897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_lock_irqsave(&data_lock, flags);
114997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
115097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mp->enabled) {
115197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output can't be unset when manager is enabled\n");
115297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
115397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err1;
115497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
115597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
115697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
115797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
115897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output->manager = NULL;
115997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = NULL;
116097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
116197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
116297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
116397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
116497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr1:
116597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
116697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
116797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
116897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
116997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
117097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
117197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
117245324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_apply_mgr_timings(struct omap_overlay_manager *mgr,
117327dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
117445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
117545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
117645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
117745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->timings = *timings;
117845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = true;
117945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
118045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
118145324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejavoid dss_mgr_set_timings(struct omap_overlay_manager *mgr,
118227dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
118345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
118445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	unsigned long flags;
1185fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
118645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
118745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_lock_irqsave(&data_lock, flags);
118845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1189fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	if (mp->updating) {
1190fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		DSSERR("cannot set timings for %s: manager needs to be disabled\n",
1191fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen			mgr->name);
1192fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		goto out;
1193fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	}
119445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1195fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	dss_apply_mgr_timings(mgr, timings);
1196fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinenout:
119745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
119845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
1199eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1200f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejastatic void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
1201f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1202f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1203f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1204f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1205f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config = *config;
1206f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->extra_info_dirty = true;
1207f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1208f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1209f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejavoid dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
1210f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1211f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1212f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	unsigned long flags;
1213f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1214f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1215aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1216f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1217f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	if (mp->enabled) {
1218f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n",
1219f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja			mgr->name);
1220f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		goto out;
1221f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	}
1222f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1223f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	dss_apply_mgr_lcd_config(mgr, config);
1224f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejaout:
1225aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1226f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1227f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1228f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl,
1229f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1230f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1231c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1232e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1233fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	int r;
1234fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen
1235fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	r = dss_ovl_simple_check(ovl, info);
1236fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	if (r)
1237fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen		return r;
1238e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1239e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1240e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1241c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info = *info;
1242c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = true;
1243f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1244e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1245e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1246f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1247f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1248f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1249f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl,
1250f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1251f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1252c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1253e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1254e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1255e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1256e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1257c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	*info = op->user_info;
1258e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1259e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1260f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1261f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1262f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl,
1263f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_manager *mgr)
1264f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1265aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1266aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
12675558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
12685558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1269f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!mgr)
1270f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		return -EINVAL;
1271f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
12725558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
12735558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1274f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (ovl->manager) {
1275f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay '%s' already has a manager '%s'\n",
1276f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen				ovl->name, ovl->manager->name);
12775558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
12785558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1279f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1280f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1281aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1282aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1283aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1284aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1285f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to change the manager\n");
12865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
12875558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1288f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1289f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
12905d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = mgr->id;
12915d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->extra_info_dirty = true;
12925d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1293f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = mgr;
1294f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_add_tail(&ovl->list, &mgr->overlays);
1295f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1296aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1297aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1298f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	/* XXX: When there is an overlay on a DSI manual update display, and
1299f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay is first disabled, then moved to tv, and enabled, we
1300f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * seem to get SYNC_LOST_DIGIT error.
1301f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1302f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Waiting doesn't seem to help, but updating the manual update display
1303f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * after disabling the overlay seems to fix this. This hints that the
1304f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * overlay is perhaps somehow tied to the LCD output until the output
1305f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * is updated.
1306f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1307f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Userspace workaround for this is to update the LCD after disabling
1308f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay, but before moving the overlay to TV.
1309f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 */
1310f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13115558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13125558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1313f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
13145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
13155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13165558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1317f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1318f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1319f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl)
1320f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1321aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1322aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
13235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
13245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
13255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
13265558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1327f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!ovl->manager) {
1328f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("failed to detach overlay: manager not set\n");
13295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
13305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1331f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1332f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1333aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1334aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1335aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1336aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1337f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to unset the manager\n");
13385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
13395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1340f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1341f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1342b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1343b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
1344b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	/* wait for pending extra_info updates to ensure the ovl is disabled */
1345b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	wait_pending_extra_info_updates();
1346b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
1347b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1348b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
13495d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = -1;
13505d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1351f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = NULL;
1352f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_del(&ovl->list);
1353f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1354aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1355aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1356aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1357aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1358aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1359aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1360aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1361aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1362aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1363aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1364aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl)
1365aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1366aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1367aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1368aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool e;
1369aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1370aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1371aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1372aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	e = op->enabled;
1373aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1374aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1375aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1376aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return e;
1377aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1378aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1379aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl)
1380aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1381aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1382aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1383aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1384aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1385aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1386aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1387e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (op->enabled) {
1388e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
138939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1390e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1391e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
13920f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1393aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
139439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1395aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1396aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1397aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1398aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
139982153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = true;
140082153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
1401228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(ovl->manager);
140239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
140339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable overlay %d: check_settings failed\n",
140439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				ovl->id);
140539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err2;
140639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
140739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1408b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
14096dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
141082153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
141182153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	dss_apply_ovl_enable(ovl, true);
141282153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
141375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
14143ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
141575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1416aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1417aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1418aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1419aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1420aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
142139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr2:
142282153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
142339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
142439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr1:
1425aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1426aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1427aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1428aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1429aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl)
1430aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1431aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1432aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1433aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1434aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1435aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1436aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1437e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!op->enabled) {
1438e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
1439e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto err;
1440e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1441e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
14420f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1443aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1444aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1445aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1446aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1449841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	dss_apply_ovl_enable(ovl, false);
145075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
14513ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
145275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1453aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1454aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
14555558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
14565558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1457f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1458aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
14595558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
14605558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
14615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1462f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1463f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1464