apply.c revision 0f0e4e3cd8030c3056e8f43196a112e887a545f9
158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/* 258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Copyright (C) 2011 Texas Instruments 358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@ti.com> 458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it 658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by 758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the Free Software Foundation. 858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT 1058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * more details. 1358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * You should have received a copy of the GNU General Public License along with 1558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * this program. If not, see <http://www.gnu.org/licenses/>. 1658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */ 1758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 1858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#define DSS_SUBSYS_NAME "APPLY" 1958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 2058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/kernel.h> 2158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/slab.h> 2258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/spinlock.h> 2358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <linux/jiffies.h> 2458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 2558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include <video/omapdss.h> 2658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 2758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss.h" 2858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#include "dss_features.h" 2958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 3058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen/* 3158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * We have 4 levels of cache for the dispc settings. First two are in SW and 3258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * the latter two in HW. 3358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 340b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * set_info() 350b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * v 3658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 370b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen * | user_info | 3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 3958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * apply() 4158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 43d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * | info | 4458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 4558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 46f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen * write_regs() 4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 4858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * | shadow registers | 5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable 5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * | registers | 5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 5758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */ 5858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 59c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data { 60c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 61c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen bool user_info_dirty; 62c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct omap_overlay_info user_info; 63c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 640b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool info_dirty; 6558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_info info; 6658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 670b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool shadow_info_dirty; 680b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen 69aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool extra_info_dirty; 70aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool shadow_extra_info_dirty; 71aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 72aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool enabled; 735d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen enum omap_channel channel; 746dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen u32 fifo_low, fifo_high; 7582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen 7682153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen /* 7782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen * True if overlay is to be enabled. Used to check and calculate configs 7882153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen * for the overlay before it is enabled in the HW. 7982153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen */ 8082153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen bool enabling; 8158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 8258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 83af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data { 84388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 85388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen bool user_info_dirty; 86388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct omap_overlay_manager_info user_info; 87388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 880b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool info_dirty; 8958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_manager_info info; 9058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool shadow_info_dirty; 920b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen 9343a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen /* If true, GO bit is up and shadow registers cannot be written. 9443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen * Never true for manual update displays */ 9543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen bool busy; 9643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 9734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* If true, dispc output is enabled */ 9834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen bool updating; 9934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 100bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen /* If true, a display is enabled using this manager */ 101bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen bool enabled; 10245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 10345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja bool extra_info_dirty; 10445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja bool shadow_extra_info_dirty; 10545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 10645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct omap_video_timings timings; 107f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja struct dss_lcd_mgr_config lcd_config; 10858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 10958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 11058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct { 111c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS]; 112af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS]; 11358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 11458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool irq_enabled; 115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data; 11658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 117d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */ 118063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock; 1195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */ 1205558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock); 121f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic DECLARE_COMPLETION(extra_updated_completion); 122063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen 12375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void); 12475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 125c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl) 126c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{ 127d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.ovl_priv_data_array[ovl->id]; 128c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen} 129c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen 130af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr) 131af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{ 132d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.mgr_priv_data_array[mgr->id]; 133af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen} 134af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen 13558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void) 13658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 137c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen const int num_ovls = dss_feat_get_num_ovls(); 138f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja struct mgr_priv_data *mp; 139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen int i; 140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 141063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_init(&data_lock); 142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen for (i = 0; i < num_ovls; ++i) { 144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op; 145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op = &dss_data.ovl_priv_data_array[i]; 147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.global_alpha = 255; 149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen switch (i) { 151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 0: 152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 0; 153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 1: 155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0; 157c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 158c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 2: 159c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 160c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0; 161c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 162c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 3: 163c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 164c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0; 165c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 166c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 167c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 168c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = op->info; 169c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 170f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 171f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja /* 172f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja * Initialize some of the lcd_config fields for TV manager, this lets 173f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja * us prevent checking if the manager is LCD or TV at some places 174f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja */ 175f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT]; 176f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 177f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config.video_port_width = 24; 178f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config.clock_info.lck_div = 1; 179f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config.clock_info.pck_div = 1; 18058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 18158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 18275bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja/* 18375bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * A LCD manager's stallmode decides whether it is in manual or auto update. TV 18475bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * manager is always auto update, stallmode field for TV manager is false by 18575bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja * default 18675bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja */ 18758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl) 18858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 18975bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(ovl->manager); 19075bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja 19175bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja return mp->lcd_config.stallmode; 19258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 19358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 19458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr) 19558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 19675bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 19775bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja 19875bac5d1a2776d61a64d75fd19092dff724016a0Archit Taneja return mp->lcd_config.stallmode; 19958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 20058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 20139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenstatic int dss_check_settings_low(struct omap_overlay_manager *mgr, 202228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja bool applying) 20339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{ 20439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct omap_overlay_info *oi; 20539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct omap_overlay_manager_info *mi; 20639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct omap_overlay *ovl; 20739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct omap_overlay_info *ois[MAX_DSS_OVERLAYS]; 20839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct ovl_priv_data *op; 20939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen struct mgr_priv_data *mp; 21039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 21139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen mp = get_mgr_priv(mgr); 21239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 2135dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja if (!mp->enabled) 2145dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja return 0; 2155dd747e8892a63a5d4cc1d2765c0f533a5d74cfdArchit Taneja 21639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (applying && mp->user_info_dirty) 21739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen mi = &mp->user_info; 21839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen else 21939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen mi = &mp->info; 22039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 22139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen /* collect the infos to be tested into the array */ 22239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 22339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen op = get_ovl_priv(ovl); 22439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 22582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen if (!op->enabled && !op->enabling) 22639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen oi = NULL; 22739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen else if (applying && op->user_info_dirty) 22839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen oi = &op->user_info; 22939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen else 23039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen oi = &op->info; 23139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 23239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen ois[ovl->id] = oi; 23339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 23439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 2356e5435958c6ee4fa2142d298d836dd78b8353f66Archit Taneja return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois); 23639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen} 23739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 23839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/* 23939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from data->info 24039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */ 241228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings(struct omap_overlay_manager *mgr) 24239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{ 243228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja return dss_check_settings_low(mgr, false); 24439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen} 24539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 24639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen/* 24739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * check manager and overlay settings using overlay_info from ovl->info if 24839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen * dirty and from data->info otherwise 24939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen */ 250228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Tanejastatic int dss_check_settings_apply(struct omap_overlay_manager *mgr) 25139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen{ 252228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja return dss_check_settings_low(mgr, true); 25339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen} 25439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 25575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void) 25675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 25775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 25875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 25975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 26075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 26175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 26275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 26375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 26475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 26575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 26675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 26775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 26875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 26975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen continue; 27075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 27134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mgr_manual_update(mgr)) { 27234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch FRAMEDONE */ 27334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 27434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 27534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } else { 27634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch GO bit going down */ 27734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->busy) 27834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 27975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 28034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 2810b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (mp->info_dirty) 28234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 28375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 2849f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen /* to set GO bit */ 2859f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen if (mp->shadow_info_dirty) 2869f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen return true; 2879f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen 28845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja /* 28945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja * NOTE: we don't check extra_info flags for disabled 29045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja * managers, once the manager is enabled, the extra_info 29145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja * related manager changes will be taken in by HW. 29245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja */ 29345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 29445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja /* to write new values to registers */ 29545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (mp->extra_info_dirty) 29645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja return true; 29745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 29845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja /* to set GO bit */ 29945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (mp->shadow_extra_info_dirty) 30045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja return true; 30145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 30234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 30334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct ovl_priv_data *op; 30475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 30534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op = get_ovl_priv(ovl); 30675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 3079f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen /* 3089f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen * NOTE: we check extra_info flags even for 3099f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen * disabled overlays, as extra_infos need to be 3109f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen * always written. 3119f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen */ 3129f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen 3139f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen /* to write new values to registers */ 3149f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen if (op->extra_info_dirty) 3159f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen return true; 3169f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen 3179f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen /* to set GO bit */ 3189f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen if (op->shadow_extra_info_dirty) 3199f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen return true; 3209f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen 32134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!op->enabled) 32234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen continue; 32375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 32434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 3259f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen if (op->info_dirty) 3269f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen return true; 3279f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen 3289f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen /* to set GO bit */ 3299f808956d3cd07c8dc69e213931b19bad56344fbTomi Valkeinen if (op->shadow_info_dirty) 33034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 33134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } 33275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 33375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 33475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 33575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 33675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 33775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 33875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr) 33975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 34075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 34175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 34275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op; 34375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 34475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 34575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 34645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (mp->shadow_info_dirty || mp->shadow_extra_info_dirty) 34775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 34875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 34975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 35075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op = get_ovl_priv(ovl); 3510b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (op->shadow_info_dirty || op->shadow_extra_info_dirty) 35275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 35375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 35475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 35575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 35675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 35775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 358f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* returns true if an extra_info field is currently being updated */ 359f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic bool extra_info_update_ongoing(void) 360f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{ 36145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja const int num_mgrs = dss_feat_get_num_mgrs(); 362f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen int i; 363f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 36445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja for (i = 0; i < num_mgrs; ++i) { 36545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct omap_overlay_manager *mgr; 36645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct omap_overlay *ovl; 36745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct mgr_priv_data *mp; 3681f3f53ae5179ba7f24b4a429bc41773f1f4857caRob Clark 36945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mgr = omap_dss_get_overlay_manager(i); 37045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp = get_mgr_priv(mgr); 371f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 372f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!mp->enabled) 373f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 374f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 375153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen if (!mp->updating) 376f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 377f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 37845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (mp->extra_info_dirty || mp->shadow_extra_info_dirty) 379153b6e7357778267e6914f2370a059e79a751371Tomi Valkeinen return true; 38045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 38145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja list_for_each_entry(ovl, &mgr->overlays, list) { 38245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct ovl_priv_data *op = get_ovl_priv(ovl); 38345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 38445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (op->extra_info_dirty || op->shadow_extra_info_dirty) 38545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja return true; 38645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja } 387f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen } 388f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 389f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen return false; 390f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen} 391f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 392f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* wait until no extra_info updates are pending */ 393f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic void wait_pending_extra_info_updates(void) 394f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{ 395f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen bool updating; 396f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen unsigned long flags; 397f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen unsigned long t; 3984614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen int r; 399f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 400f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 401f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 402f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen updating = extra_info_update_ongoing(); 403f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 404f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!updating) { 405f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 406f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen return; 407f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen } 408f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 409f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen init_completion(&extra_updated_completion); 410f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 411f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 412f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 413f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen t = msecs_to_jiffies(500); 4144614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen r = wait_for_completion_timeout(&extra_updated_completion, t); 4154614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen if (r == 0) 4164614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen DSSWARN("timeout in wait_pending_extra_info_updates\n"); 4174614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen else if (r < 0) 4184614679c9d3b77e87b390b6afe8a8dfc980f4387Tomi Valkeinen DSSERR("wait_pending_extra_info_updates failed: %d\n", r); 419f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen} 420f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 42158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) 42258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 42358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 424fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 42558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 426fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja unsigned long flags; 42758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 42858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 42958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 430fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_lock_irqsave(&data_lock, flags); 431fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja 432fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja if (mgr_manual_update(mgr)) { 433fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 43458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 435fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja } 43658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 437fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja if (!mp->enabled) { 438fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 43958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 440fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja } 441fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja 442fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 44358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 44421e56f79abad987555351c73569fc8358636b0faLajos Molnar r = dispc_runtime_get(); 44521e56f79abad987555351c73569fc8358636b0faLajos Molnar if (r) 44621e56f79abad987555351c73569fc8358636b0faLajos Molnar return r; 44721e56f79abad987555351c73569fc8358636b0faLajos Molnar 448bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(mgr->id); 44958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 45058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 45158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 45258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 45358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 454063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 4550b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen dirty = mp->info_dirty; 4560b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen shadow_dirty = mp->shadow_info_dirty; 457063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 45858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 45958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 46058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 46158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 46258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 46358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 46458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 46558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 46658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 46758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 46858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 46958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 47058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() not finishing\n", 47158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen mgr->id); 47258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 47358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 47458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 47558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 47658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 47758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 47858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 47958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 48058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 48158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id); 48258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 48358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 48458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 48558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 48621e56f79abad987555351c73569fc8358636b0faLajos Molnar dispc_runtime_put(); 48721e56f79abad987555351c73569fc8358636b0faLajos Molnar 48858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 48958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 49058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl) 49258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 49358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 494c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 495fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja struct mgr_priv_data *mp; 49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 497fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja unsigned long flags; 49858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 49958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 50058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 50158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!ovl->manager) 50258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 50358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 504fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja mp = get_mgr_priv(ovl->manager); 50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 506fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_lock_irqsave(&data_lock, flags); 507fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja 508fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja if (ovl_manual_update(ovl)) { 509fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 51058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 511fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja } 51258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 513fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja if (!mp->enabled) { 514fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 51558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 516fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja } 517fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja 518fc22a84339d387203cc2a1685fb251a5ad4c9b43Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 51958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 52021e56f79abad987555351c73569fc8358636b0faLajos Molnar r = dispc_runtime_get(); 52121e56f79abad987555351c73569fc8358636b0faLajos Molnar if (r) 52221e56f79abad987555351c73569fc8358636b0faLajos Molnar return r; 52321e56f79abad987555351c73569fc8358636b0faLajos Molnar 524bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(ovl->manager->id); 52558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 526c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 52758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 52858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 52958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 53058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 531063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 5320b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen dirty = op->info_dirty; 5330b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen shadow_dirty = op->shadow_info_dirty; 534063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 53558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 53658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 53758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 53858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 53958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 54058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 54158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 54258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 54358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 54458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 54558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 54658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 54758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() not finishing\n", 54858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen ovl->id); 54958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 55058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 55158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 55258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 55358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 55458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 55558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 55658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 55758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 55858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id); 55958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 56058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 56158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 56258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 56321e56f79abad987555351c73569fc8358636b0faLajos Molnar dispc_runtime_put(); 56421e56f79abad987555351c73569fc8358636b0faLajos Molnar 56558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 56658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 56758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 56875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl) 56958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 57075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 57158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_info *oi; 5728050cbe4cd9a96ff333df718f38830eabab690bdArchit Taneja bool replication; 57334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 57458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 57558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 576f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", ovl->id); 57758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5780b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (!op->enabled || !op->info_dirty) 57975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 58058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 58175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen oi = &op->info; 58258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 58381ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja mp = get_mgr_priv(ovl->manager); 58481ab95b7ec91e47c81e5e6ef4aac7b08c1ae90aaArchit Taneja 5856c6f510afb86e3c77c351dfa20cbb8ca834abad9Archit Taneja replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode); 58658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5878050cbe4cd9a96ff333df718f38830eabab690bdArchit Taneja r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings); 58858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 58975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* 59075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * We can't do much here, as this function can be called from 59175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * vsync interrupt. 59275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen */ 593f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id); 59475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 59575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* This will leave fifo configurations in a nonoptimal state */ 59675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->enabled = false; 59775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_ovl_enable(ovl->id, false); 59875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 59958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 60058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6010b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->info_dirty = false; 60234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 6030b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->shadow_info_dirty = true; 60458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 60558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 606aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl) 607aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 608aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 60934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 610aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 611aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen DSSDBGF("%d", ovl->id); 612aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 61375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!op->extra_info_dirty) 61475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 61575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 616aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen /* note: write also when op->enabled == false, so that the ovl gets 617aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen * disabled */ 618aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 619aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dispc_ovl_enable(ovl->id, op->enabled); 6205d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen dispc_ovl_set_channel_out(ovl->id, op->channel); 6216dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high); 62275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 62334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp = get_mgr_priv(ovl->manager); 62434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 62575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->extra_info_dirty = false; 62634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 62734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op->shadow_extra_info_dirty = true; 628aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 629aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 630f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr) 63158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 63275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 63375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 63458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 635f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", mgr->id); 63658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 63775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 63875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 63958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen WARN_ON(mp->busy); 64158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Commit overlay settings */ 64375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 64475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_ovl_write_regs(ovl); 645aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dss_ovl_write_regs_extra(ovl); 646aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 647aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 6480b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (mp->info_dirty) { 64975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_setup(mgr->id, &mp->info); 65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6510b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->info_dirty = false; 65234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 6530b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->shadow_info_dirty = true; 65458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 65575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 65675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 65745324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr) 65845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{ 65945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 66045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 66145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja DSSDBGF("%d", mgr->id); 66245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 66345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (!mp->extra_info_dirty) 66445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja return; 66545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 66645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja dispc_mgr_set_timings(mgr->id, &mp->timings); 66745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 668f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja /* lcd_config parameters */ 669f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja if (dss_mgr_is_lcd(mgr->id)) { 670f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode); 671f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 672f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode); 673f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_enable_fifohandcheck(mgr->id, 674f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config.fifohandcheck); 675f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 676f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info); 677f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 678f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_set_tft_data_lines(mgr->id, 679f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config.video_port_width); 680f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 681f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity); 682f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 683f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dispc_mgr_set_lcd_type_tft(mgr->id); 684f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja } 685f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 68645324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp->extra_info_dirty = false; 68745324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja if (mp->updating) 68845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp->shadow_extra_info_dirty = true; 68945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja} 69045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 69175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void) 69275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 69375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = omap_dss_get_num_overlay_managers(); 69475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 69558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 69658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 69775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 69875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 69939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen int r; 70075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 701af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 702af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 70358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 70475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled || mgr_manual_update(mgr) || mp->busy) 70558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen continue; 70658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 707228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja r = dss_check_settings(mgr); 70839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (r) { 70939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen DSSERR("cannot write registers for manager %s: " 71039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen "illegal configuration\n", mgr->name); 71139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen continue; 71239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 71339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 71475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 71545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja dss_mgr_write_regs_extra(mgr); 7163ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen } 7173ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen} 71875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 7193ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinenstatic void dss_set_go_bits(void) 7203ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen{ 7213ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen const int num_mgrs = omap_dss_get_num_overlay_managers(); 7223ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen int i; 72358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7243ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 7253ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen struct omap_overlay_manager *mgr; 7263ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen struct mgr_priv_data *mp; 72758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7283ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 7293ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen mp = get_mgr_priv(mgr); 7303ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 7313ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen if (!mp->enabled || mgr_manual_update(mgr) || mp->busy) 7323ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen continue; 7333ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 7343ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen if (!need_go(mgr)) 7353ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen continue; 7363ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 7373ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen mp->busy = true; 7383ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 7393ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 7403ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_register_vsync_isr(); 7413ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 7423ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dispc_mgr_go(mgr->id); 74375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 7443ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen 74558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 74658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 747df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr) 748df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen{ 749df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen struct omap_overlay *ovl; 750df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen struct mgr_priv_data *mp; 751df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen struct ovl_priv_data *op; 752df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen 753df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen mp = get_mgr_priv(mgr); 754df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen mp->shadow_info_dirty = false; 75545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp->shadow_extra_info_dirty = false; 756df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen 757df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 758df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen op = get_ovl_priv(ovl); 759df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen op->shadow_info_dirty = false; 760df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen op->shadow_extra_info_dirty = false; 761df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen } 762df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen} 763df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen 76458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr) 76558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 766af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 767e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 76839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen int r; 769e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 770e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 77158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 77234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen WARN_ON(mp->updating); 77334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 774228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja r = dss_check_settings(mgr); 77539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (r) { 77639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen DSSERR("cannot start manual update: illegal configuration\n"); 77739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 77839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen return; 77939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 78039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 78175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 78245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja dss_mgr_write_regs_extra(mgr); 78358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 78434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 78558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 78634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 78734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen dss_register_vsync_isr(); 78858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7897797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 790e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 791df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 792df01d53068bdf31609aafd9a857901a1f16dfa52Tomi Valkeinen 793e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 79458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 79558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 796dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask); 797dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 798dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void) 799dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 800bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 801dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 802bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 803dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 804bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 805bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 806bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 807dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 80834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 80934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 81034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 811dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask); 812dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 813dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 814d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = true; 815dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 816dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 817dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void) 818dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 819bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 820dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 821bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 822dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 823bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 824bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 825bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 826dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 82734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 82834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 82934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 830dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask); 831dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 832dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 833d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = false; 834dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 835dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 8367609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask) 8377609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{ 83858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 83975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 840f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen bool extra_updating; 84158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 842063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock(&data_lock); 84358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 8447609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen /* clear busy, updating flags, shadow_dirty flags */ 84543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen for (i = 0; i < num_mgrs; i++) { 8467609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct omap_overlay_manager *mgr; 8477609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct mgr_priv_data *mp; 8485b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen bool was_updating; 8497609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 85043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 85143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mp = get_mgr_priv(mgr); 85243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 8537609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->enabled) 85443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen continue; 85543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 8565b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen was_updating = mp->updating; 8577609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->updating = dispc_mgr_is_enabled(i); 85858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 8597609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mgr_manual_update(mgr)) { 8605b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen bool was_busy = mp->busy; 8617609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->busy = dispc_mgr_go_busy(i); 86243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 8635b2141719aa8a14ebd242c60b4ce6a580276f7cdTomi Valkeinen if (was_busy && !mp->busy) 8647609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 8657609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } 86658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 86758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 86875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 8693ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_set_go_bits(); 87058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 871f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen extra_updating = extra_info_update_ongoing(); 872f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!extra_updating) 873f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen complete_all(&extra_updated_completion); 874f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 87575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!need_isr()) 87675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_unregister_vsync_isr(); 87758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 878063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock(&data_lock); 87958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 88058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 8815738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl) 88258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 883c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 88458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 885c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 88658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 887c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen if (!op->user_info_dirty) 8885738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen return; 88958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 890c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = false; 8910b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->info_dirty = true; 892c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info = op->user_info; 89358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 89458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 89558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr) 89658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 897af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 89858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 899af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 90058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 901388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen if (!mp->user_info_dirty) 90258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return; 90358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 904388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = false; 9050b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->info_dirty = true; 906388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->info = mp->user_info; 90758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 90858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9096dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr) 91058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 9116dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen unsigned long flags; 9126dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct omap_overlay *ovl; 91339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen int r; 9146dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 9156dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); 9166dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 9176dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 9186dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 919228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja r = dss_check_settings_apply(mgr); 92039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (r) { 92139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 92239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen DSSERR("failed to apply settings: illegal configuration.\n"); 92339518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen return r; 92439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 92539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 9266dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen /* Configure overlays */ 9276dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) 9286dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen omap_dss_mgr_apply_ovl(ovl); 9296dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 9306dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen /* Configure manager */ 9316dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen omap_dss_mgr_apply_mgr(mgr); 9326dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 9336dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dss_write_regs(); 9343ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_set_go_bits(); 9356dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 9366dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 9376dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 938e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen return 0; 9396dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen} 9406dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 941841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable) 942841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{ 943841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen struct ovl_priv_data *op; 944841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 945841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op = get_ovl_priv(ovl); 946841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 947841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen if (op->enabled == enable) 948841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen return; 949841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 950841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op->enabled = enable; 951841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op->extra_info_dirty = true; 952841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen} 953841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 95404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinenstatic void dss_apply_ovl_fifo_thresholds(struct omap_overlay *ovl, 95504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen u32 fifo_low, u32 fifo_high) 95604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen{ 95704576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 95804576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen 95904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen if (op->fifo_low == fifo_low && op->fifo_high == fifo_high) 96004576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen return; 96104576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen 96204576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen op->fifo_low = fifo_low; 96304576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen op->fifo_high = fifo_high; 96404576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen op->extra_info_dirty = true; 96504576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen} 96604576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen 967b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl) 9686dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{ 9696dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 9706dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen u32 fifo_low, fifo_high; 971b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen bool use_fifo_merge = false; 97258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 97375ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen if (!op->enabled && !op->enabling) 97475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen return; 97575ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen 97683fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen dispc_ovl_compute_fifo_thresholds(ovl->id, &fifo_low, &fifo_high, 9773568f2a46f2a73bab18c914df06afd98a97e0e0eTomi Valkeinen use_fifo_merge, ovl_manual_update(ovl)); 9786dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 97904576d415e01aa08752bf3884db9862cfbba9115Tomi Valkeinen dss_apply_ovl_fifo_thresholds(ovl, fifo_low, fifo_high); 98058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 98158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 982b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr) 98358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 98407e327c9c18b382656bf455051759be8182627aeTomi Valkeinen struct omap_overlay *ovl; 9856dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct mgr_priv_data *mp; 98658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9876dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen mp = get_mgr_priv(mgr); 98858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9896dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen if (!mp->enabled) 9906dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen return; 99158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 99275ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) 993b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen dss_ovl_setup_fifo(ovl); 99475ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen} 99558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 996b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinenstatic void dss_setup_fifos(void) 99775ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen{ 99875ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen const int num_mgrs = omap_dss_get_num_overlay_managers(); 99975ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen struct omap_overlay_manager *mgr; 100075ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen int i; 100158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 100275ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 100375ae118a0028810f93a746c25f4bb018fb044323Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 1004b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen dss_mgr_setup_fifos(mgr); 10056dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen } 100658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 100758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 10082a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenint dss_mgr_enable(struct omap_overlay_manager *mgr) 10097797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 1010bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 1011bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 101239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen int r; 1013bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 10145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 10155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1016e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (mp->enabled) 1017e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto out; 1018e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 1019bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1020bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 1021bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = true; 1022a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen 1023228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja r = dss_check_settings(mgr); 102439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (r) { 102539518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen DSSERR("failed to enable manager %d: check_settings failed\n", 102639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen mgr->id); 10272a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen goto err; 102839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 102939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 1030b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen dss_setup_fifos(); 10316dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 103275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 10333ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_set_go_bits(); 103475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 103534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!mgr_manual_update(mgr)) 103634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 103734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 1038bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 10395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 104075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mgr_manual_update(mgr)) 104175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 104275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1043e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout: 10445558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10452a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen 10462a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen return 0; 10472a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen 10482a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinenerr: 1049a6b24f83601530f69ee36ac48527336e3c79bea8Tomi Valkeinen mp->enabled = false; 10502a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 10512a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen mutex_unlock(&apply_lock); 10522a4ee7ee685f3bf996461ed0d148857ce85a00e2Tomi Valkeinen return r; 10537797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 10547797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 10557797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr) 10567797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 1057bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 1058bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 1059bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 10605558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 10615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1062e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (!mp->enabled) 1063e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto out; 1064e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 10659a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen if (!mgr_manual_update(mgr)) 10669a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dispc_mgr_enable(mgr->id, false); 1067bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 1068bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1069bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 107034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = false; 1071bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = false; 1072bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 1073bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 10745558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1075e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout: 10765558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10777797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 10787797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 1079eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr, 1080eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 1081eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 1082388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 1083e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 1084f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen int r; 1085f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen 1086f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen r = dss_mgr_simple_check(mgr, info); 1087f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen if (r) 1088f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen return r; 1089e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1090e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1091e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1092388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info = *info; 1093388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = true; 1094eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1095e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1096e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1097eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 1098eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 1099eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1100eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr, 1101eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 1102eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 1103388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 1104e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 1105e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1106e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1107e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1108388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen *info = mp->user_info; 1109e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1110e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1111eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 1112eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1113eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr, 1114eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_dss_device *dssdev) 1115eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 1116eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen int r; 1117eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 11185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 11195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1120eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (dssdev->manager) { 1121eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' already has a manager '%s'\n", 1122eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, dssdev->manager->name); 11235558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 11245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1125eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 1126eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1127eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if ((mgr->supported_displays & dssdev->type) == 0) { 1128eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' does not support manager '%s'\n", 1129eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, mgr->name); 11305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 11315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1132eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 1133eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1134eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->manager = mgr; 1135eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = dssdev; 1136eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 11375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 11385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1139eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 11405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 11415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 11425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1143eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 1144eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1145eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr) 1146eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 11475558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 11485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 11495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 11505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1151eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (!mgr->device) { 1152eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("failed to unset display, display not set.\n"); 11535558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 11545558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1155eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 1156eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1157eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen /* 1158eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * Don't allow currently enabled displays to have the overlay manager 1159eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * pulled out from underneath them 1160eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen */ 11615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) { 11625558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 11635558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 11645558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen } 1165eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1166eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device->manager = NULL; 1167eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = NULL; 1168eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 11695558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 11705558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1171eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 11725558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 11735558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 11745558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1175eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 1176eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 117797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_set_output(struct omap_overlay_manager *mgr, 117897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja struct omap_dss_output *output) 117997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{ 118097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja int r; 118197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 118297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_lock(&apply_lock); 118397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 118497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja if (mgr->output) { 118597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja DSSERR("manager %s is already connected to an output\n", 118697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mgr->name); 118797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja r = -EINVAL; 118897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja goto err; 118997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja } 119097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 119197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja if ((mgr->supported_outputs & output->id) == 0) { 119297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja DSSERR("output does not support manager %s\n", 119397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mgr->name); 119497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja r = -EINVAL; 119597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja goto err; 119697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja } 119797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 119897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja output->manager = mgr; 119997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mgr->output = output; 120097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 120197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_unlock(&apply_lock); 120297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 120397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja return 0; 120497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr: 120597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_unlock(&apply_lock); 120697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja return r; 120797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja} 120897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 120997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaint dss_mgr_unset_output(struct omap_overlay_manager *mgr) 121097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja{ 121197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja int r; 121297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 121397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja unsigned long flags; 121497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 121597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_lock(&apply_lock); 121697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 121797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja if (!mgr->output) { 121897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja DSSERR("failed to unset output, output not set\n"); 121997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja r = -EINVAL; 122097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja goto err; 122197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja } 122297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 122397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja spin_lock_irqsave(&data_lock, flags); 122497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 122597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja if (mp->enabled) { 122697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja DSSERR("output can't be unset when manager is enabled\n"); 122797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja r = -EINVAL; 122897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja goto err1; 122997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja } 123097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 123197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja spin_unlock_irqrestore(&data_lock, flags); 123297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 123397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mgr->output->manager = NULL; 123497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mgr->output = NULL; 123597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 123697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_unlock(&apply_lock); 123797f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 123897f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja return 0; 123997f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr1: 124097f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja spin_unlock_irqrestore(&data_lock, flags); 124197f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Tanejaerr: 124297f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja mutex_unlock(&apply_lock); 124397f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 124497f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja return r; 124597f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja} 124697f01b3a2ed6d46132bf4e2d237c27846e7b260aArchit Taneja 124745324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejastatic void dss_apply_mgr_timings(struct omap_overlay_manager *mgr, 124827dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja const struct omap_video_timings *timings) 124945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{ 125045324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 125145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 125245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp->timings = *timings; 125345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja mp->extra_info_dirty = true; 125445324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja} 125545324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 125645324a2648bcfa96adeae71ae992da931eed79f6Archit Tanejavoid dss_mgr_set_timings(struct omap_overlay_manager *mgr, 125727dfddc7fe3bbc87935c078f3d078a9ed69dbf4aArchit Taneja const struct omap_video_timings *timings) 125845324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja{ 125945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja unsigned long flags; 1260fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 126145324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 126245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja spin_lock_irqsave(&data_lock, flags); 126345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 1264fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen if (mp->updating) { 1265fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen DSSERR("cannot set timings for %s: manager needs to be disabled\n", 1266fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen mgr->name); 1267fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen goto out; 1268fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen } 126945324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja 1270fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinen dss_apply_mgr_timings(mgr, timings); 1271fed62e54ae1f80f4631ce154225cf019f1219e59Tomi Valkeinenout: 127245324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja spin_unlock_irqrestore(&data_lock, flags); 127345324a2648bcfa96adeae71ae992da931eed79f6Archit Taneja} 1274eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 1275f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejastatic void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr, 1276f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja const struct dss_lcd_mgr_config *config) 1277f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{ 1278f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 1279f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1280f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->lcd_config = *config; 1281f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mp->extra_info_dirty = true; 1282f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja} 1283f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1284f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejavoid dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr, 1285f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja const struct dss_lcd_mgr_config *config) 1286f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja{ 1287f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja unsigned long flags; 1288f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja struct mgr_priv_data *mp = get_mgr_priv(mgr); 1289f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1290aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1291f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1292f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja if (mp->enabled) { 1293f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n", 1294f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja mgr->name); 1295f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja goto out; 1296f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja } 1297f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1298f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja dss_apply_mgr_lcd_config(mgr, config); 1299f476ae9dab3234532d41d36beb4ba7be838fa786Archit Tanejaout: 1300aba965707c4e1b39fe51705488e0e0a2a4d2f803Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1301f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja} 1302f476ae9dab3234532d41d36beb4ba7be838fa786Archit Taneja 1303f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl, 1304f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 1305f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1306c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1307e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 1308fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen int r; 1309fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 1310fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen r = dss_ovl_simple_check(ovl, info); 1311fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (r) 1312fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return r; 1313e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1314e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1315e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1316c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = *info; 1317c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = true; 1318f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1319e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1320e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1321f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 1322f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1323f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1324f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl, 1325f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 1326f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1327c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1328e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 1329e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1330e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1331e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1332c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen *info = op->user_info; 1333e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1334e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1335f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1336f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1337f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl, 1338f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_manager *mgr) 1339f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1340aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1341aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 13425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 13435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1344f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!mgr) 1345f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return -EINVAL; 1346f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 13475558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 13485558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1349f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (ovl->manager) { 1350f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay '%s' already has a manager '%s'\n", 1351f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->name, ovl->manager->name); 13525558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 13535558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1354f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1355f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1356aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1357aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1358aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 1359aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1360f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to change the manager\n"); 13615558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 13625558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1363f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1364f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 13655d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = mgr->id; 13665d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->extra_info_dirty = true; 13675d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 1368f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = mgr; 1369f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_add_tail(&ovl->list, &mgr->overlays); 1370f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1371aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1372aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1373f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen /* XXX: When there is an overlay on a DSI manual update display, and 1374f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay is first disabled, then moved to tv, and enabled, we 1375f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * seem to get SYNC_LOST_DIGIT error. 1376f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 1377f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Waiting doesn't seem to help, but updating the manual update display 1378f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * after disabling the overlay seems to fix this. This hints that the 1379f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * overlay is perhaps somehow tied to the LCD output until the output 1380f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * is updated. 1381f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 1382f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Userspace workaround for this is to update the LCD after disabling 1383f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay, but before moving the overlay to TV. 1384f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen */ 1385f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 13865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 13875558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1388f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 13895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 13905558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 13915558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1392f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1393f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1394f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl) 1395f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1396aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1397aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 13985558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 13995558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 14005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 14015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1402f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!ovl->manager) { 1403f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("failed to detach overlay: manager not set\n"); 14045558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 14055558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1406f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1407f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1408aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1409aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1410aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 1411aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1412f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to unset the manager\n"); 14135558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 14145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1415f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1416f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1417b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1418b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen 1419b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen /* wait for pending extra_info updates to ensure the ovl is disabled */ 1420b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen wait_pending_extra_info_updates(); 1421b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen 1422b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1423b2f5976c109350977104f27211a7029ec67cd488Tomi Valkeinen 14245d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = -1; 14255d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 1426f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = NULL; 1427f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_del(&ovl->list); 1428f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1429aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1430aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1431aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1432aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1433aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 1434aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr: 1435aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1436aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 1437aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1438aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1439aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl) 1440aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1441aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1442aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1443aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool e; 1444aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1445aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1446aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen e = op->enabled; 1448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1449aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1450aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1451aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return e; 1452aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1453aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1454aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl) 1455aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1456aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1457aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1458aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 1459aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1460aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 1461aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1462e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (op->enabled) { 1463e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen r = 0; 146439518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen goto err1; 1465e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen } 1466e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 14670f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja if (ovl->manager == NULL || ovl->manager->output == NULL) { 1468aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 146939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen goto err1; 1470aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 1471aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1472aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1473aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 147482153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen op->enabling = true; 147582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen 1476228b21349db4ca5636ec1efdb3b3d54fe18092deArchit Taneja r = dss_check_settings(ovl->manager); 147739518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen if (r) { 147839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen DSSERR("failed to enable overlay %d: check_settings failed\n", 147939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen ovl->id); 148039518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen goto err2; 148139518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen } 148239518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen 1483b3e93cbddd6ab0c529a747a910e3bf9615e89982Tomi Valkeinen dss_setup_fifos(); 14846dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 148582153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen op->enabling = false; 148682153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen dss_apply_ovl_enable(ovl, true); 148782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen 148875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 14893ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_set_go_bits(); 149075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1491aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1492aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1493aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1494aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1495aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 149639518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr2: 149782153eda076ee4df434bb1008f24e46590f76dfcTomi Valkeinen op->enabling = false; 149839518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 149939518356ccd6e439abae24e1a24d84dcd12ff207Tomi Valkeinenerr1: 1500aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1501aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 1502aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1503aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1504aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl) 1505aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1506aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1507aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1508aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 1509aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1510aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 1511aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1512e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (!op->enabled) { 1513e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen r = 0; 1514e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto err; 1515e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen } 1516e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 15170f0e4e3cd8030c3056e8f43196a112e887a545f9Archit Taneja if (ovl->manager == NULL || ovl->manager->output == NULL) { 1518aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 1519aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen goto err; 1520aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 1521aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1522aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1523aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1524841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen dss_apply_ovl_enable(ovl, false); 152575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 15263ab15b2aa70369e0360f12e35e47bca1a269138bTomi Valkeinen dss_set_go_bits(); 152775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1528aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1529aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 15305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 15315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1532f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 1533aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 15345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 15355558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 15365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1537f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1538f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1539