apply.c revision f17d04fbbb201c05700359e94e2747c210f99852
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; 7558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 7658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 77af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data { 78388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 79388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen bool user_info_dirty; 80388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct omap_overlay_manager_info user_info; 81388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 820b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool info_dirty; 8358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_manager_info info; 8458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 850b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen bool shadow_info_dirty; 860b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen 8743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen /* If true, GO bit is up and shadow registers cannot be written. 8843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen * Never true for manual update displays */ 8943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen bool busy; 9043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 9134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* If true, dispc output is enabled */ 9234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen bool updating; 9334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 94bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen /* If true, a display is enabled using this manager */ 95bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen bool enabled; 9658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 9758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct { 99c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS]; 100af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS]; 10158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 10258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool irq_enabled; 103d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data; 10458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 105d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */ 106063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock; 1075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */ 1085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock); 109f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic DECLARE_COMPLETION(extra_updated_completion); 110063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen 11175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void); 11275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 113c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl) 114c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{ 115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.ovl_priv_data_array[ovl->id]; 116c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen} 117c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen 118af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr) 119af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{ 120d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.mgr_priv_data_array[mgr->id]; 121af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen} 122af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen 12358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void) 12458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 125c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen const int num_ovls = dss_feat_get_num_ovls(); 126c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen int i; 127c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 128063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_init(&data_lock); 129c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 130c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen for (i = 0; i < num_ovls; ++i) { 131c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op; 132c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 133c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op = &dss_data.ovl_priv_data_array[i]; 134c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 135c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.global_alpha = 255; 136c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 137c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen switch (i) { 138c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 0: 139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 0; 140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 141c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 1: 142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0; 144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 2: 146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0; 148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 3: 150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0; 152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = op->info; 156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 15758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 15858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 15958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl) 16058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 16158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; 16258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 16358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 16458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr) 16558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 16658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; 16758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 16858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 16975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void) 17075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 17175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 17275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 17375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 17475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 17575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 17675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 17775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 17875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 17975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 18075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 18175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 18275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 18375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen continue; 18475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 18534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mgr_manual_update(mgr)) { 18634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch FRAMEDONE */ 18734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 18834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 18934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } else { 19034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch GO bit going down */ 19134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->busy) 19234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 19375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 19434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 1950b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (mp->info_dirty) 19634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 19775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 19834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 19934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct ovl_priv_data *op; 20075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 20134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op = get_ovl_priv(ovl); 20275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 20334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!op->enabled) 20434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen continue; 20575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 20634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 2070b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (op->info_dirty || op->extra_info_dirty) 20834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 20934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } 21075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 21175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 21275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 21375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 21475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 21575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 21675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr) 21775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 21875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 21975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 22075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op; 22175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 22275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 22375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 2240b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (mp->shadow_info_dirty) 22575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 22675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 22775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 22875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op = get_ovl_priv(ovl); 2290b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (op->shadow_info_dirty || op->shadow_extra_info_dirty) 23075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 23175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 23275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 23375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 23475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 23575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 236f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* returns true if an extra_info field is currently being updated */ 237f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic bool extra_info_update_ongoing(void) 238f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{ 239f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen const int num_ovls = omap_dss_get_num_overlays(); 240f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen struct ovl_priv_data *op; 241f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen struct omap_overlay *ovl; 242f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen struct mgr_priv_data *mp; 243f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen int i; 244f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen bool eid; 245f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 246f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen for (i = 0; i < num_ovls; ++i) { 247f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen ovl = omap_dss_get_overlay(i); 248f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen op = get_ovl_priv(ovl); 249f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 250f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!op->enabled) 251f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 252f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 253f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen mp = get_mgr_priv(ovl->manager); 254f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 255f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!mp->enabled) 256f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 257f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 258f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen eid = op->extra_info_dirty || op->shadow_extra_info_dirty; 259f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 260f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!eid) 261f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 262f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 263f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (ovl_manual_update(ovl) && !mp->updating) 264f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen continue; 265f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 266f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen return true; 267f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen } 268f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 269f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen return false; 270f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen} 271f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 272f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen/* wait until no extra_info updates are pending */ 273f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinenstatic void wait_pending_extra_info_updates(void) 274f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen{ 275f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen bool updating; 276f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen unsigned long flags; 277f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen unsigned long t; 278f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 279f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 280f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 281f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen updating = extra_info_update_ongoing(); 282f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 283f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!updating) { 284f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 285f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen return; 286f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen } 287f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 288f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen init_completion(&extra_updated_completion); 289f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 290f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 291f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 292f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen t = msecs_to_jiffies(500); 293f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen wait_for_completion_timeout(&extra_updated_completion, t); 294f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 295f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen updating = extra_info_update_ongoing(); 296f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 297f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen WARN_ON(updating); 298f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen} 299f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 30058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) 30158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 30258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 303af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 30458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 30558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 30658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 30758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev = mgr->device; 30858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 30958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 31058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 31158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 31258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (mgr_manual_update(mgr)) 31358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 31458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 315bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(mgr->id); 31658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 317af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 31858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 31958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 32058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long flags; 32158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 32258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 323063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 3240b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen dirty = mp->info_dirty; 3250b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen shadow_dirty = mp->shadow_info_dirty; 326063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 32758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 32858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 32958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 33058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 33158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 33258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 33358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 33458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 33558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 33658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 33758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 33858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 33958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() not finishing\n", 34058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen mgr->id); 34158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 34258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 34358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 34458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 34558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 34658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 34758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 34858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 34958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 35058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id); 35158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 35258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 35358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 35458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 35558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 35658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 35758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 35858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl) 35958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 36058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 361c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 36258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev; 36358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 36458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 36558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 36658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 36758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!ovl->manager) 36858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 36958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 37058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dssdev = ovl->manager->device; 37158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 37258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 37358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 37458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 37558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (ovl_manual_update(ovl)) 37658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 37758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 378bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(ovl->manager->id); 37958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 380c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 38158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 38258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 38358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long flags; 38458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 38558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 386063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 3870b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen dirty = op->info_dirty; 3880b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen shadow_dirty = op->shadow_info_dirty; 389063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 39058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 39158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 39258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 39358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 39458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 39558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 39658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 39758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 39858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 39958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 40058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 40158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 40258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() not finishing\n", 40358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen ovl->id); 40458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 40558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 40658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 40758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 40858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 40958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 41058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 41158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 41258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 41358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id); 41458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 41558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 41658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 41758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 41858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 41958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 42058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 42175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl) 42258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 42375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 42458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_info *oi; 42558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool ilace, replication; 42634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 42758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 42858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 429f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", ovl->id); 43058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 4310b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (!op->enabled || !op->info_dirty) 43275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 43358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 43475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen oi = &op->info; 43558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 43658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen replication = dss_use_replication(ovl->manager->device, oi->color_mode); 43758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 43858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen ilace = ovl->manager->device->type == OMAP_DISPLAY_TYPE_VENC; 43958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 440f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen r = dispc_ovl_setup(ovl->id, oi, ilace, replication); 44158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 44275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* 44375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * We can't do much here, as this function can be called from 44475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * vsync interrupt. 44575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen */ 446f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id); 44775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 44875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* This will leave fifo configurations in a nonoptimal state */ 44975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->enabled = false; 45075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_ovl_enable(ovl->id, false); 45175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 45258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 45358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 45434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp = get_mgr_priv(ovl->manager); 45534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 4560b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->info_dirty = false; 45734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 4580b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->shadow_info_dirty = true; 45958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 46058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 461aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl) 462aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 463aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 46434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 465aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 466aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen DSSDBGF("%d", ovl->id); 467aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 46875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!op->extra_info_dirty) 46975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 47075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 471aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen /* note: write also when op->enabled == false, so that the ovl gets 472aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen * disabled */ 473aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 474aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dispc_ovl_enable(ovl->id, op->enabled); 4755d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen dispc_ovl_set_channel_out(ovl->id, op->channel); 4766dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high); 47775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 47834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp = get_mgr_priv(ovl->manager); 47934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 48075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->extra_info_dirty = false; 48134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 48234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op->shadow_extra_info_dirty = true; 483aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 484aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 485f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr) 48658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 48775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 48875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 48958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 490f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", mgr->id); 49158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 49375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 49458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen WARN_ON(mp->busy); 49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Commit overlay settings */ 49875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 49975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_ovl_write_regs(ovl); 500aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dss_ovl_write_regs_extra(ovl); 501aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 502aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 5030b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen if (mp->info_dirty) { 50475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_setup(mgr->id, &mp->info); 50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5060b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->info_dirty = false; 50734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 5080b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->shadow_info_dirty = true; 50958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 51075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 51175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 51275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void) 51375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 51475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = omap_dss_get_num_overlay_managers(); 51575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 51658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 51758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 51875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 51975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 52075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 521af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 522af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 52358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 52475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled || mgr_manual_update(mgr) || mp->busy) 52558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen continue; 52658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 52775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 52875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 52975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (need_go(mgr)) { 53043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mp->busy = true; 53158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 53275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 53375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_register_vsync_isr(); 53458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 53575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_go(mgr->id); 53675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 53775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 53858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 53958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 54058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr) 54158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 542af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 543e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 544e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 545e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 54658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 54734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen WARN_ON(mp->updating); 54834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 54975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 55058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 55134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 55258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 55334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 55434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen dss_register_vsync_isr(); 55558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5567797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 557e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 558e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 55958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 56058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 561dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask); 562dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 563dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void) 564dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 565bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 566dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 567bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 568dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 569bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 570bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 571bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 572dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 57334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 57434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 57534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 576dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask); 577dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 578dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 579d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = true; 580dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 581dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 582dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void) 583dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 584bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 585dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 586bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 587dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 588bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 589bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 590bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 591dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 59234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 59334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 59434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 595dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask); 596dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 597dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 598d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = false; 599dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 600dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 6017609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr) 60258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 603c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct omap_overlay *ovl; 604af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 605c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 6067609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 6077609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp = get_mgr_priv(mgr); 6080b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->shadow_info_dirty = false; 6097609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 6107609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 6117609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen op = get_ovl_priv(ovl); 6120b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->shadow_info_dirty = false; 6137609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen op->shadow_extra_info_dirty = false; 6147609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } 6157609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen} 6167609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 6177609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask) 6187609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{ 61958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 62075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 621f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen bool extra_updating; 62258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 623063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock(&data_lock); 62458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6257609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen /* clear busy, updating flags, shadow_dirty flags */ 62643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen for (i = 0; i < num_mgrs; i++) { 6277609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct omap_overlay_manager *mgr; 6287609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct mgr_priv_data *mp; 6297609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 63043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 63143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mp = get_mgr_priv(mgr); 63243a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 6337609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->enabled) 63443a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen continue; 63543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 6367609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->updating = dispc_mgr_is_enabled(i); 63758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6387609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mgr_manual_update(mgr)) { 6397609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->busy = dispc_mgr_go_busy(i); 64043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 6417609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->busy) 6427609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 6437609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } else { 6447609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->updating) 6457609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 6467609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } 64758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 64858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 651f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen extra_updating = extra_info_update_ongoing(); 652f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen if (!extra_updating) 653f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen complete_all(&extra_updated_completion); 654f1577ce18004337ec2f6f48109ca14cac10a0a4fTomi Valkeinen 65575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!need_isr()) 65675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_unregister_vsync_isr(); 65758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 658063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock(&data_lock); 65958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 66058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6615738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl) 66258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 663c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 66458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 665c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 66658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 667c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen if (!op->user_info_dirty) 6685738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen return; 66958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 670c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = false; 6710b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen op->info_dirty = true; 672c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info = op->user_info; 67358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 67458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 67558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr) 67658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 677af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 67858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 679af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 68058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 681388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen if (!mp->user_info_dirty) 68258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return; 68358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 684388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = false; 6850b53f17971700f673492e2e91b5069893e5f2d0bTomi Valkeinen mp->info_dirty = true; 686388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->info = mp->user_info; 68758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 68858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6896dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr) 69058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 6916dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen unsigned long flags; 6926dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct omap_overlay *ovl; 6936dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 6946dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); 6956dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 6966dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 6976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 6986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen /* Configure overlays */ 6996dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) 7006dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen omap_dss_mgr_apply_ovl(ovl); 7016dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 7026dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen /* Configure manager */ 7036dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen omap_dss_mgr_apply_mgr(mgr); 7046dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 7056dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dss_write_regs(); 7066dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 7076dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 7086dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 709e70f98acaa84ec9ad55e544d0dc8b2d0a36bbecaTomi Valkeinen return 0; 7106dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen} 7116dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 712841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinenstatic void dss_apply_ovl_enable(struct omap_overlay *ovl, bool enable) 713841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen{ 714841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen struct ovl_priv_data *op; 715841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 716841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op = get_ovl_priv(ovl); 717841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 718841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen if (op->enabled == enable) 719841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen return; 720841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 721841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op->enabled = enable; 722841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen op->extra_info_dirty = true; 723841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen} 724841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen 7256dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenstatic void dss_ovl_setup_fifo(struct omap_overlay *ovl) 7266dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen{ 7276dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 72858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev; 72958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 size, burst_size; 7306dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen u32 fifo_low, fifo_high; 73158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 73258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dssdev = ovl->manager->device; 73358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 73458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen size = dispc_ovl_get_fifo_size(ovl->id); 73558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 73658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen burst_size = dispc_ovl_get_burst_size(ovl->id); 73758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 73858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen switch (dssdev->type) { 73958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DPI: 74058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DBI: 74158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_SDI: 74258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_VENC: 74358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_HDMI: 74458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen default_get_overlay_fifo_thresholds(ovl->id, size, 7456dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen burst_size, &fifo_low, &fifo_high); 74658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 74758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_DSI 74858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DSI: 74958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dsi_get_overlay_fifo_thresholds(ovl->id, size, 7506dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen burst_size, &fifo_low, &fifo_high); 75158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 75258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#endif 75358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen default: 75458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen BUG(); 75558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 7566dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 7576dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen op->fifo_low = fifo_low; 7586dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen op->fifo_high = fifo_high; 7596dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen op->extra_info_dirty = true; 76058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 76158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7626dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinenstatic void dss_mgr_setup_fifos(struct omap_overlay_manager *mgr) 76358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 76407e327c9c18b382656bf455051759be8182627aeTomi Valkeinen struct omap_overlay *ovl; 7656dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct ovl_priv_data *op; 7666dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen struct mgr_priv_data *mp; 76758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7686dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen mp = get_mgr_priv(mgr); 76958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7706dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen if (!mp->enabled) 7716dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen return; 77258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7736dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 7746dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen op = get_ovl_priv(ovl); 77558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7766dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen if (!op->enabled) 7776dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen continue; 77858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7796dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dss_ovl_setup_fifo(ovl); 7806dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen } 78158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 78258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7837797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_enable(struct omap_overlay_manager *mgr) 7847797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 785bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 786bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 787bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 7885558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 7895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 790e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (mp->enabled) 791e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto out; 792e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 793bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 794bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 795bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = true; 796bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 7976dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dss_mgr_setup_fifos(mgr); 7986dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 79975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 80075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 80134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!mgr_manual_update(mgr)) 80234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 80334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 804bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 8055558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 80675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mgr_manual_update(mgr)) 80775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 80875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 809e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout: 8105558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8117797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 8127797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 8137797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr) 8147797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 815bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 816bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 817bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 8185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 8195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 820e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (!mp->enabled) 821e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto out; 822e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 8239a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen if (!mgr_manual_update(mgr)) 8249a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dispc_mgr_enable(mgr->id, false); 825bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 826bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 827bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 82834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = false; 829bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = false; 830bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 831bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 8325558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 833e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinenout: 8345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8357797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 8367797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 837f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinenstatic int dss_mgr_simple_check(struct omap_overlay_manager *mgr, 838f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen const struct omap_overlay_manager_info *info) 839f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen{ 840f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) { 841f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen /* 842f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen * OMAP3 supports only graphics source transparency color key 843f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen * and alpha blending simultaneously. See TRM 15.4.2.4.2.2 844f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen * Alpha Mode. 845f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen */ 846f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen if (info->partial_alpha_enabled && info->trans_enabled 847f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen && info->trans_key_type != OMAP_DSS_COLOR_KEY_GFX_DST) { 848f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen DSSERR("check_manager: illegal transparency key\n"); 849f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen return -EINVAL; 850f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen } 851f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen } 852f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen 853f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen return 0; 854f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen} 855f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen 856eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr, 857eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 858eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 859388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 860e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 861f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen int r; 862f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen 863f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen r = dss_mgr_simple_check(mgr, info); 864f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen if (r) 865f17d04fbbb201c05700359e94e2747c210f99852Tomi Valkeinen return r; 866e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 867e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 868e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 869388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info = *info; 870388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = true; 871eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 872e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 873e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 874eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 875eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 876eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 877eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr, 878eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 879eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 880388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 881e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 882e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 883e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 884e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 885388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen *info = mp->user_info; 886e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 887e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 888eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 889eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 890eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr, 891eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_dss_device *dssdev) 892eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 893eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen int r; 894eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 8955558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 8965558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 897eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (dssdev->manager) { 898eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' already has a manager '%s'\n", 899eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, dssdev->manager->name); 9005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 902eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 903eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 904eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if ((mgr->supported_displays & dssdev->type) == 0) { 905eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' does not support manager '%s'\n", 906eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, mgr->name); 9075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 909eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 910eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 911eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->manager = mgr; 912eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = dssdev; 913eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 9145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 916eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 9175558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 9185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 920eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 921eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 922eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr) 923eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 9245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 9255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 9265558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 9275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 928eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (!mgr->device) { 929eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("failed to unset display, display not set.\n"); 9305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 932eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 933eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 934eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen /* 935eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * Don't allow currently enabled displays to have the overlay manager 936eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * pulled out from underneath them 937eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen */ 9385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) { 9395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 9415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen } 942eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 943eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device->manager = NULL; 944eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = NULL; 945eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 9465558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9475558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 948eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 9495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 9505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9515558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 952eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 953eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 954eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 955fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinenstatic int dss_ovl_simple_check(struct omap_overlay *ovl, 956fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen const struct omap_overlay_info *info) 957fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen{ 958fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (info->paddr == 0) { 959fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen DSSERR("check_overlay: paddr cannot be 0\n"); 960fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return -EINVAL; 961fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 962fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 963fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { 964fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (info->out_width != 0 && info->width != info->out_width) { 965fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen DSSERR("check_overlay: overlay %d doesn't support " 966fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen "scaling\n", ovl->id); 967fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return -EINVAL; 968fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 969fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 970fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (info->out_height != 0 && info->height != info->out_height) { 971fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen DSSERR("check_overlay: overlay %d doesn't support " 972fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen "scaling\n", ovl->id); 973fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return -EINVAL; 974fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 975fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 976fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 977fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if ((ovl->supported_modes & info->color_mode) == 0) { 978fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen DSSERR("check_overlay: overlay %d doesn't support mode %d\n", 979fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen ovl->id, info->color_mode); 980fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return -EINVAL; 981fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 982fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 983fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (info->zorder >= omap_dss_get_num_overlays()) { 984fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen DSSERR("check_overlay: zorder %d too high\n", info->zorder); 985fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return -EINVAL; 986fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen } 987fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 988fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return 0; 989fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen} 990eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 991f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl, 992f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 993f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 994c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 995e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 996fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen int r; 997fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen 998fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen r = dss_ovl_simple_check(ovl, info); 999fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen if (r) 1000fcc764dca80ead39b7391ff2c67a6b78de16d7a9Tomi Valkeinen return r; 1001e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1002e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1003e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1004c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = *info; 1005c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = true; 1006f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1007e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1008e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1009f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 1010f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1011f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1012f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl, 1013f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 1014f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1015c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1016e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 1017e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1018e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1019e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1020c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen *info = op->user_info; 1021e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 1022e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1023f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1024f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1025f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl, 1026f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_manager *mgr) 1027f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1028aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1029aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 10305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 10315558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1032f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!mgr) 1033f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return -EINVAL; 1034f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 10355558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 10365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1037f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (ovl->manager) { 1038f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay '%s' already has a manager '%s'\n", 1039f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->name, ovl->manager->name); 10405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 10415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1042f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1043f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1044aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1045aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1046aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 1047aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1048f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to change the manager\n"); 10495558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 10505558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1051f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1052f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 10535d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = mgr->id; 10545d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->extra_info_dirty = true; 10555d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 1056f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = mgr; 1057f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_add_tail(&ovl->list, &mgr->overlays); 1058f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1059aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1060aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1061f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen /* XXX: When there is an overlay on a DSI manual update display, and 1062f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay is first disabled, then moved to tv, and enabled, we 1063f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * seem to get SYNC_LOST_DIGIT error. 1064f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 1065f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Waiting doesn't seem to help, but updating the manual update display 1066f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * after disabling the overlay seems to fix this. This hints that the 1067f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * overlay is perhaps somehow tied to the LCD output until the output 1068f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * is updated. 1069f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 1070f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Userspace workaround for this is to update the LCD after disabling 1071f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay, but before moving the overlay to TV. 1072f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen */ 1073f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 10745558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10755558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1076f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 10775558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 10785558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10795558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1080f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1081f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1082f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl) 1083f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 1084aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1085aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 10865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 10875558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 10885558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 10895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1090f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!ovl->manager) { 1091f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("failed to detach overlay: manager not set\n"); 10925558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 10935558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1094f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1095f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1096aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1097aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1098aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 1099aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1100f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to unset the manager\n"); 11015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 11025558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 1103f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 1104f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 11055d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = -1; 11065d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 1107f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = NULL; 1108f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_del(&ovl->list); 1109f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1110aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1111aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1112aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1113aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1114aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 1115aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr: 1116aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1117aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 1118aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1119aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1120aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl) 1121aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1122aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1123aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1124aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool e; 1125aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1126aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1127aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1128aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen e = op->enabled; 1129aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1130aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1131aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1132aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return e; 1133aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1134aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1135aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl) 1136aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1137aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1138aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1139aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 1140aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1141aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 1142aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1143e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (op->enabled) { 1144e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen r = 0; 1145e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto err; 1146e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen } 1147e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 1148aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (ovl->manager == NULL || ovl->manager->device == NULL) { 1149aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 1150aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen goto err; 1151aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 1152aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1153aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1154aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1155841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen dss_apply_ovl_enable(ovl, true); 1156aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 11576dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen dss_ovl_setup_fifo(ovl); 11586dc802e2901d33e02efad3c90bb2034fd20c79e7Tomi Valkeinen 115975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 116075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1161aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1162aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1163aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1164aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1165aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 1166aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr: 1167aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1168aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 1169aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1170aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1171aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl) 1172aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1173aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1174aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1175aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 1176aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1177aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 1178aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1179e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen if (!op->enabled) { 1180e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen r = 0; 1181e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen goto err; 1182e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen } 1183e4f7ad702ef271d2b0c03e9904b05f9bcbf0808bTomi Valkeinen 1184aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (ovl->manager == NULL || ovl->manager->device == NULL) { 1185aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 1186aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen goto err; 1187aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 1188aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1189aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1190aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1191841c09c7975c67fe7741564d98265de28a5764d0Tomi Valkeinen dss_apply_ovl_enable(ovl, false); 1192aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 119375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 119475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1195aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1196aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 11975558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 11985558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1199f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 1200aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 12015558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 12025558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 12035558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1204f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1205f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1206