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