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