apply.c revision 0f0e4e3cd8030c3056e8f43196a112e887a545f9
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
576f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", 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
5878050cbe4cd9a96ff333df718f38830eabab690bdArchit Taneja	r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings);
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
611aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	DSSDBGF("%d", 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
635f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen	DSSDBGF("%d", 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
66145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	DSSDBGF("%d", 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 */
669f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	if (dss_mgr_is_lcd(mgr->id)) {
670f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode);
671f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
672f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode);
673f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_enable_fifohandcheck(mgr->id,
674f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja			mp->lcd_config.fifohandcheck);
675f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
676f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info);
677f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
678f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_set_tft_data_lines(mgr->id,
679f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja			mp->lcd_config.video_port_width);
680f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
681f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity);
682f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
683f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		dispc_mgr_set_lcd_type_tft(mgr->id);
684f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	}
685f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
68645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = false;
68745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	if (mp->updating)
68845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		mp->shadow_extra_info_dirty = true;
68945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
69045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
69175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void)
69275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{
69375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
69475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
69558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
69658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
69775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct omap_overlay_manager *mgr;
69875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		struct mgr_priv_data *mp;
69939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		int r;
70075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
701af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
702af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen		mp = get_mgr_priv(mgr);
70358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
70475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
70558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen			continue;
70658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
707228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja		r = dss_check_settings(mgr);
70839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		if (r) {
70939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			DSSERR("cannot write registers for manager %s: "
71039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen					"illegal configuration\n", mgr->name);
71139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen			continue;
71239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		}
71339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
71475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_mgr_write_regs(mgr);
71545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja		dss_mgr_write_regs_extra(mgr);
7163ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	}
7173ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen}
71875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
7193ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinenstatic void dss_set_go_bits(void)
7203ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen{
7213ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
7223ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	int i;
72358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7243ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
7253ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct omap_overlay_manager *mgr;
7263ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		struct mgr_priv_data *mp;
72758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7283ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
7293ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp = get_mgr_priv(mgr);
7303ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7313ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!mp->enabled || mgr_manual_update(mgr) || mp->busy)
7323ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7333ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7343ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!need_go(mgr))
7353ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			continue;
7363ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7373ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		mp->busy = true;
7383ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7393ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		if (!dss_data.irq_enabled && need_isr())
7403ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen			dss_register_vsync_isr();
7413ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
7423ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen		dispc_mgr_go(mgr->id);
74375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	}
7443ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen
74558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
74658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
747df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr)
748df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen{
749df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct omap_overlay *ovl;
750df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct mgr_priv_data *mp;
751df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	struct ovl_priv_data *op;
752df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
753df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp = get_mgr_priv(mgr);
754df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mp->shadow_info_dirty = false;
75545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->shadow_extra_info_dirty = false;
756df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
757df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list) {
758df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op = get_ovl_priv(ovl);
759df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_info_dirty = false;
760df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen		op->shadow_extra_info_dirty = false;
761df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	}
762df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen}
763df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
76458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr)
76558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
766af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
767e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
76839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
769e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
770e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
77158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
77234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	WARN_ON(mp->updating);
77334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
774228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
77539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
77639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("cannot start manual update: illegal configuration\n");
77739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
77839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return;
77939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
78039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
78175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_mgr_write_regs(mgr);
78245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	dss_mgr_write_regs_extra(mgr);
78358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
78434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = true;
78558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
78634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!dss_data.irq_enabled && need_isr())
78734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		dss_register_vsync_isr();
78858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
7897797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen	dispc_mgr_enable(mgr->id, true);
790e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
791df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen	mgr_clear_shadow_dirty(mgr);
792df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen
793e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
79458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
79558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
796dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask);
797dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
798dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void)
799dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
800bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
801dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
802bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
803dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
804bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
805bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
806bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
807dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
80834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
80934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
81034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
811dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask);
812dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
813dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
814d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = true;
815dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
816dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
817dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void)
818dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{
819bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
820dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	u32 mask;
821bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	int r, i;
822dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
823bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	mask = 0;
824bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
825bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen		mask |= dispc_mgr_get_vsync_irq(i);
826dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
82734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	for (i = 0; i < num_mgrs; ++i)
82834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mask |= dispc_mgr_get_framedone_irq(i);
82934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
830dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask);
831dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen	WARN_ON(r);
832dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
833d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen	dss_data.irq_enabled = false;
834dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen}
835dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen
8367609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask)
8377609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{
83858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	const int num_mgrs = dss_feat_get_num_mgrs();
83975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	int i;
840f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	bool extra_updating;
84158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
842063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_lock(&data_lock);
84358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8447609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen	/* clear busy, updating flags, shadow_dirty flags */
84543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen	for (i = 0; i < num_mgrs; i++) {
8467609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct omap_overlay_manager *mgr;
8477609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		struct mgr_priv_data *mp;
8485b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen		bool was_updating;
8497609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen
85043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
85143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen		mp = get_mgr_priv(mgr);
85243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8537609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mp->enabled)
85443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen			continue;
85543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8565b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen		was_updating = mp->updating;
8577609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		mp->updating = dispc_mgr_is_enabled(i);
85858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8597609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		if (!mgr_manual_update(mgr)) {
8605b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			bool was_busy = mp->busy;
8617609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen			mp->busy = dispc_mgr_go_busy(i);
86243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen
8635b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen			if (was_busy && !mp->busy)
8647609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen				mgr_clear_shadow_dirty(mgr);
8657609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen		}
86658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen	}
86758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
86875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
8693ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
87058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
871f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	extra_updating = extra_info_update_ongoing();
872f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen	if (!extra_updating)
873f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen		complete_all(&extra_updated_completion);
874f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen
87575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!need_isr())
87675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dss_unregister_vsync_isr();
87758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
878063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen	spin_unlock(&data_lock);
87958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
88058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
8815738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl)
88258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
883c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	struct ovl_priv_data *op;
88458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
885c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen	op = get_ovl_priv(ovl);
88658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
887c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	if (!op->user_info_dirty)
8885738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen		return;
88958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
890c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = false;
8910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	op->info_dirty = true;
892c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->info = op->user_info;
89358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
89458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
89558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr)
89658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
897af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	struct mgr_priv_data *mp;
89858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
899af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen	mp = get_mgr_priv(mgr);
90058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
901388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	if (!mp->user_info_dirty)
90258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen		return;
90358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
904388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = false;
9050b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen	mp->info_dirty = true;
906388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->info = mp->user_info;
90758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
90858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9096dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr)
91058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
9116dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	unsigned long flags;
9126dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct omap_overlay *ovl;
91339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
9146dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9156dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name);
9166dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9176dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
9186dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
919228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings_apply(mgr);
92039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
92139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
92239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to apply settings: illegal configuration.\n");
92339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		return r;
92439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
92539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
9266dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure overlays */
9276dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
9286dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		omap_dss_mgr_apply_ovl(ovl);
9296dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9306dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	/* Configure manager */
9316dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	omap_dss_mgr_apply_mgr(mgr);
9326dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9336dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	dss_write_regs();
9343ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
9356dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
9366dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
9376dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
938e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen	return 0;
9396dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen}
9406dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
941841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable)
942841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{
943841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	struct ovl_priv_data *op;
944841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
945841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op = get_ovl_priv(ovl);
946841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
947841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	if (op->enabled == enable)
948841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen		return;
949841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
950841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->enabled = enable;
951841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	op->extra_info_dirty = true;
952841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen}
953841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen
95404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinenstatic void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl,
95504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		u32 fifo_low, u32 fifo_high)
95604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen{
95704576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
95804576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
95904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	if (op->fifo_low == fifo_low && op->fifo_high == fifo_high)
96004576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen		return;
96104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
96204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_low = fifo_low;
96304576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->fifo_high = fifo_high;
96404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	op->extra_info_dirty = true;
96504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen}
96604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen
967b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl)
9686dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{
9696dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
9706dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	u32 fifo_low, fifo_high;
971b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	bool use_fifo_merge = false;
97258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
97375ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	if (!op->enabled && !op->enabling)
97475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		return;
97575ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen
97683fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen	dispc_ovl_compute_fifo_thresholds(ovl->id, &fifo_low, &fifo_high,
9773568f2a46f2a73bab18c914df06afd98a97e0e0eTomi Valkeinen			use_fifo_merge, ovl_manual_update(ovl));
9786dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
97904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen	dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high);
98058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
98158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
982b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr)
98358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{
98407e327c9c18b382656bf455051759be8182627aeTomi Valkeinen	struct omap_overlay *ovl;
9856dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	struct mgr_priv_data *mp;
98658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9876dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	mp = get_mgr_priv(mgr);
98858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
9896dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	if (!mp->enabled)
9906dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen		return;
99158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
99275ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	list_for_each_entry(ovl, &mgr->overlays, list)
993b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_ovl_setup_fifo(ovl);
99475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen}
99558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
996b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_setup_fifos(void)
99775ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen{
99875ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	const int num_mgrs = omap_dss_get_num_overlay_managers();
99975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	struct omap_overlay_manager *mgr;
100075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	int i;
100158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
100275ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen	for (i = 0; i < num_mgrs; ++i) {
100375ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
1004b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen		dss_mgr_setup_fifos(mgr);
10056dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen	}
100658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}
100758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen
10082a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenint dss_mgr_enable(struct omap_overlay_manager *mgr)
10097797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
1010bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1011bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
101239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	int r;
1013bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
10145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1016e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (mp->enabled)
1017e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1018e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
1019bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1020bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1021bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = true;
1022a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen
1023228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(mgr);
102439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
102539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable manager %d: check_settings failed\n",
102639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				mgr->id);
10272a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen		goto err;
102839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
102939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1030b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
10316dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
103275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
10333ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
103475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
103534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	if (!mgr_manual_update(mgr))
103634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen		mp->updating = true;
103734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen
1038bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
104075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	if (!mgr_manual_update(mgr))
104175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen		dispc_mgr_enable(mgr->id, true);
104275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1043e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
10445558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10452a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
10462a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return 0;
10472a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen
10482a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenerr:
1049a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen	mp->enabled = false;
10502a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10512a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	mutex_unlock(&apply_lock);
10522a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen	return r;
10537797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
10547797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
10557797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr)
10567797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{
1057bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1058bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	unsigned long flags;
1059bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
10605558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
10615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1062e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!mp->enabled)
1063e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto out;
1064e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
10659a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen	if (!mgr_manual_update(mgr))
10669a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen		dispc_mgr_enable(mgr->id, false);
1067bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1068bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1069bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
107034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen	mp->updating = false;
1071bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	mp->enabled = false;
1072bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen
1073bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
10745558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1075e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout:
10765558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
10777797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen}
10787797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen
1079eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr,
1080eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1081eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1082388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1083e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1084f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	int r;
1085f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen
1086f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	r = dss_mgr_simple_check(mgr, info);
1087f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen	if (r)
1088f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen		return r;
1089e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1090e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1091e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1092388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info = *info;
1093388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	mp->user_info_dirty = true;
1094eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1095e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1096e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1097eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
1098eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1099eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1100eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr,
1101eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_overlay_manager_info *info)
1102eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1103388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1104e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1105e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1106e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1107e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1108388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen	*info = mp->user_info;
1109e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1110e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1111eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1112eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1113eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr,
1114eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		struct omap_dss_device *dssdev)
1115eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
1116eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	int r;
1117eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
11185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
11195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1120eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (dssdev->manager) {
1121eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' already has a manager '%s'\n",
1122eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, dssdev->manager->name);
11235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
11245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1125eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
1126eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1127eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if ((mgr->supported_displays & dssdev->type) == 0) {
1128eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("display '%s' does not support manager '%s'\n",
1129eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen			       dssdev->name, mgr->name);
11305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
11315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1132eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
1133eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1134eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	dssdev->manager = mgr;
1135eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = dssdev;
1136eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
11375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1139eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
11405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
11415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1143eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1144eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1145eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr)
1146eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{
11475558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
11485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
11495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
11505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1151eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	if (!mgr->device) {
1152eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen		DSSERR("failed to unset display, display not set.\n");
11535558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
11545558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1155eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	}
1156eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1157eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	/*
1158eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * Don't allow currently enabled displays to have the overlay manager
1159eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 * pulled out from underneath them
1160eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	 */
11615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) {
11625558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
11635558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
11645558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	}
1165eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1166eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device->manager = NULL;
1167eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	mgr->device = NULL;
1168eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
11695558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11705558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1171eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen	return 0;
11725558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
11735558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
11745558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1175eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen}
1176eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
117797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_set_output(struct omap_overlay_manager *mgr,
117897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		struct omap_dss_output *output)
117997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
118097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
118197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
118297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
118397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
118497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mgr->output) {
118597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("manager %s is already connected to an output\n",
118697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
118797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
118897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
118997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
119097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
119197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if ((mgr->supported_outputs & output->id) == 0) {
119297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output does not support manager %s\n",
119397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja			mgr->name);
119497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
119597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
119697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
119797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
119897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	output->manager = mgr;
119997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = output;
120097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
120197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
120297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
120397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
120497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
120597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
120697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
120797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
120897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
120997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_unset_output(struct omap_overlay_manager *mgr)
121097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{
121197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	int r;
121297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
121397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	unsigned long flags;
121497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
121597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_lock(&apply_lock);
121697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
121797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (!mgr->output) {
121897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("failed to unset output, output not set\n");
121997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
122097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err;
122197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
122297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
122397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_lock_irqsave(&data_lock, flags);
122497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
122597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	if (mp->enabled) {
122697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		DSSERR("output can't be unset when manager is enabled\n");
122797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		r = -EINVAL;
122897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja		goto err1;
122997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	}
123097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
123297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output->manager = NULL;
123497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mgr->output = NULL;
123597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
123797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
123897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return 0;
123997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr1:
124097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	spin_unlock_irqrestore(&data_lock, flags);
124197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr:
124297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	mutex_unlock(&apply_lock);
124397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
124497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja	return r;
124597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja}
124697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja
124745324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_apply_mgr_timings(struct omap_overlay_manager *mgr,
124827dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
124945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
125045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
125145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
125245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->timings = *timings;
125345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	mp->extra_info_dirty = true;
125445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
125545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
125645324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejavoid dss_mgr_set_timings(struct omap_overlay_manager *mgr,
125727dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja		const struct omap_video_timings *timings)
125845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{
125945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	unsigned long flags;
1260fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	struct mgr_priv_data *mp = get_mgr_priv(mgr);
126145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
126245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_lock_irqsave(&data_lock, flags);
126345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1264fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	if (mp->updating) {
1265fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		DSSERR("cannot set timings for %s: manager needs to be disabled\n",
1266fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen			mgr->name);
1267fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen		goto out;
1268fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	}
126945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja
1270fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen	dss_apply_mgr_timings(mgr, timings);
1271fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinenout:
127245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja	spin_unlock_irqrestore(&data_lock, flags);
127345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja}
1274eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen
1275f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejastatic void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
1276f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1277f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1278f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1279f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1280f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->lcd_config = *config;
1281f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	mp->extra_info_dirty = true;
1282f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1283f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1284f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejavoid dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
1285f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		const struct dss_lcd_mgr_config *config)
1286f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{
1287f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	unsigned long flags;
1288f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	struct mgr_priv_data *mp = get_mgr_priv(mgr);
1289f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1290aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1291f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1292f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	if (mp->enabled) {
1293f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n",
1294f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja			mgr->name);
1295f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja		goto out;
1296f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	}
1297f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1298f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja	dss_apply_mgr_lcd_config(mgr, config);
1299f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejaout:
1300aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1301f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja}
1302f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja
1303f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl,
1304f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1305f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1306c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1307e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1308fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	int r;
1309fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen
1310fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	r = dss_ovl_simple_check(ovl, info);
1311fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen	if (r)
1312fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen		return r;
1313e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1314e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1315e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1316c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info = *info;
1317c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	op->user_info_dirty = true;
1318f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1319e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1320e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1321f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1322f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1323f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1324f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl,
1325f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_info *info)
1326f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1327c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1328e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	unsigned long flags;
1329e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1330e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1331e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1332c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen	*info = op->user_info;
1333e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen
1334e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1335f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1336f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1337f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl,
1338f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		struct omap_overlay_manager *mgr)
1339f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1340aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1341aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
13425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
13435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1344f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!mgr)
1345f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		return -EINVAL;
1346f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13475558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
13485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1349f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (ovl->manager) {
1350f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay '%s' already has a manager '%s'\n",
1351f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen				ovl->name, ovl->manager->name);
13525558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
13535558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1354f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1355f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1356aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1357aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1358aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1359aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1360f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to change the manager\n");
13615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
13625558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1363f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1364f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13655d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = mgr->id;
13665d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->extra_info_dirty = true;
13675d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1368f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = mgr;
1369f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_add_tail(&ovl->list, &mgr->overlays);
1370f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1371aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1372aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1373f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	/* XXX: When there is an overlay on a DSI manual update display, and
1374f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay is first disabled, then moved to tv, and enabled, we
1375f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * seem to get SYNC_LOST_DIGIT error.
1376f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1377f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Waiting doesn't seem to help, but updating the manual update display
1378f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * after disabling the overlay seems to fix this. This hints that the
1379f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * overlay is perhaps somehow tied to the LCD output until the output
1380f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * is updated.
1381f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 *
1382f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * Userspace workaround for this is to update the LCD after disabling
1383f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 * the overlay, but before moving the overlay to TV.
1384f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	 */
1385f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
13865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13875558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1388f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
13895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
13905558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
13915558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1392f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1393f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1394f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl)
1395f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{
1396aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1397aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
13985558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	int r;
13995558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
14005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_lock(&apply_lock);
14015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1402f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	if (!ovl->manager) {
1403f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("failed to detach overlay: manager not set\n");
14045558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
14055558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1406f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1407f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1408aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1409aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1410aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	if (op->enabled) {
1411aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		spin_unlock_irqrestore(&data_lock, flags);
1412f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen		DSSERR("overlay has to be disabled to unset the manager\n");
14135558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		r = -EINVAL;
14145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen		goto err;
1415f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	}
1416f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1417b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1418b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
1419b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	/* wait for pending extra_info updates to ensure the ovl is disabled */
1420b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	wait_pending_extra_info_updates();
1421b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
1422b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1423b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen
14245d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen	op->channel = -1;
14255d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen
1426f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	ovl->manager = NULL;
1427f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	list_del(&ovl->list);
1428f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1429aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1430aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1431aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1432aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1433aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
1434aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr:
1435aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1436aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1437aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1438aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1439aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl)
1440aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1441aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1442aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1443aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	bool e;
1444aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1445aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1446aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	e = op->enabled;
1448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1449aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1450aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1451aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return e;
1452aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1453aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1454aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl)
1455aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1456aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1457aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1458aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1459aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1460aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1461aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1462e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (op->enabled) {
1463e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
146439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1465e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1466e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
14670f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1468aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
146939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err1;
1470aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1471aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1472aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1473aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
147482153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = true;
147582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
1476228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja	r = dss_check_settings(ovl->manager);
147739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	if (r) {
147839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		DSSERR("failed to enable overlay %d: check_settings failed\n",
147939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen				ovl->id);
148039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen		goto err2;
148139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	}
148239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen
1483b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen	dss_setup_fifos();
14846dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen
148582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
148682153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	dss_apply_ovl_enable(ovl, true);
148782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen
148875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
14893ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
149075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1491aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1492aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1493aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1494aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1495aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return 0;
149639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr2:
149782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen	op->enabling = false;
149839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
149939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr1:
1500aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_unlock(&apply_lock);
1501aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	return r;
1502aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen}
1503aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1504aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl)
1505aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{
1506aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	struct ovl_priv_data *op = get_ovl_priv(ovl);
1507aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	unsigned long flags;
1508aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	int r;
1509aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1510aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	mutex_lock(&apply_lock);
1511aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1512e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	if (!op->enabled) {
1513e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		r = 0;
1514e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen		goto err;
1515e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen	}
1516e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen
15170f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja	if (ovl->manager == NULL || ovl->manager->output == NULL) {
1518aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		r = -EINVAL;
1519aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen		goto err;
1520aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	}
1521aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1522aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_lock_irqsave(&data_lock, flags);
1523aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
1524841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen	dss_apply_ovl_enable(ovl, false);
152575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen	dss_write_regs();
15263ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen	dss_set_go_bits();
152775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen
1528aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen	spin_unlock_irqrestore(&data_lock, flags);
1529aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
15305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
15315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen
1532f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen	return 0;
1533aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen
15345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr:
15355558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	mutex_unlock(&apply_lock);
15365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen	return r;
1537f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen}
1538f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen
1539