apply.c revision 5d5a97a6fbf98f82ae50c837eba3ebcfea0902f8
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 * 3458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 3558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * |overlay/manager_info| 3658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 3758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 3858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * apply() 3958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 4058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 41d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen * | info | 4258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 4358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 44f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen * write_regs() 4558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 4658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 4758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * | shadow registers | 4858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 4958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 5058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VFP or lcd/digit_enable 5158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * v 5258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 5358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * | registers | 5458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * +--------------------+ 5558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen */ 5658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 57c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstruct ovl_priv_data { 58c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 59c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen bool user_info_dirty; 60c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct omap_overlay_info user_info; 61c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 6258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* If true, cache changed, but not written to shadow registers. Set 6358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * in apply(), cleared when registers written. */ 6458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool dirty; 6558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* If true, shadow registers contain changed values not yet in real 6658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * registers. Set when writing to shadow registers, cleared at 6758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VSYNC/EVSYNC */ 6858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty; 6958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_info info; 7158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 fifo_low; 7358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 fifo_high; 74aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 75aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool extra_info_dirty; 76aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool shadow_extra_info_dirty; 77aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 78aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool enabled; 795d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen enum omap_channel channel; 8058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 8158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 82af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstruct mgr_priv_data { 83388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 84388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen bool user_info_dirty; 85388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct omap_overlay_manager_info user_info; 86388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen 8758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* If true, cache changed, but not written to shadow registers. Set 8858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * in apply(), cleared when registers written. */ 8958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool dirty; 9058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* If true, shadow registers contain changed values not yet in real 9158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * registers. Set when writing to shadow registers, cleared at 9258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * VSYNC/EVSYNC */ 9358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty; 9458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_manager_info info; 9658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 9743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen /* If true, GO bit is up and shadow registers cannot be written. 9843a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen * Never true for manual update displays */ 9943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen bool busy; 10043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 10134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* If true, dispc output is enabled */ 10234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen bool updating; 10334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 104bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen /* If true, a display is enabled using this manager */ 105bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen bool enabled; 10658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen}; 10758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 10858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic struct { 109c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data ovl_priv_data_array[MAX_DSS_OVERLAYS]; 110af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data mgr_priv_data_array[MAX_DSS_MANAGERS]; 11158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 11258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool irq_enabled; 113d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen} dss_data; 11458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 115d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen/* protects dss_data */ 116063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinenstatic spinlock_t data_lock; 1175558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen/* lock for blocking functions */ 1185558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenstatic DEFINE_MUTEX(apply_lock); 119063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen 12075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_register_vsync_isr(void); 12175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 122c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinenstatic struct ovl_priv_data *get_ovl_priv(struct omap_overlay *ovl) 123c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen{ 124d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.ovl_priv_data_array[ovl->id]; 125c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen} 126c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen 127af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinenstatic struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr) 128af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen{ 129d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen return &dss_data.mgr_priv_data_array[mgr->id]; 130af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen} 131af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen 13258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_apply_init(void) 13358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 134c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen const int num_ovls = dss_feat_get_num_ovls(); 135c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen int i; 136c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 137063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_init(&data_lock); 138c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 139c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen for (i = 0; i < num_ovls; ++i) { 140c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op; 141c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 142c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op = &dss_data.ovl_priv_data_array[i]; 143c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 144c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.global_alpha = 255; 145c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 146c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen switch (i) { 147c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 0: 148c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 0; 149c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 150c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 1: 151c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 152c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 3 : 0; 153c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 154c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 2: 155c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 156c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 2 : 0; 157c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 158c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen case 3: 159c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info.zorder = 160c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen dss_has_feature(FEAT_ALPHA_FREE_ZORDER) ? 1 : 0; 161c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen break; 162c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 163c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen 164c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = op->info; 165c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen } 16658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 16758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 16858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool ovl_manual_update(struct omap_overlay *ovl) 16958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 17058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; 17158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 17258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 17358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic bool mgr_manual_update(struct omap_overlay_manager *mgr) 17458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 17558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE; 17658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 17758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 17875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_isr(void) 17975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 18075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 18175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 18275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 18375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 18475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 18575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 18675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 18775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 18875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 18975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 19075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 19175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 19275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen continue; 19375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 19434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mgr_manual_update(mgr)) { 19534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch FRAMEDONE */ 19634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 19734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 19834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } else { 19934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to catch GO bit going down */ 20034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->busy) 20134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 20275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 20334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 20434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->dirty) 20534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 20675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 20734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 20834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct ovl_priv_data *op; 20975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 21034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op = get_ovl_priv(ovl); 21175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 21234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!op->enabled) 21334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen continue; 21475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 21534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen /* to write new values to registers */ 21634861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (op->dirty || op->extra_info_dirty) 21734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen return true; 21834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen } 21975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 22075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 22175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 22275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 22375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 22475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 22575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic bool need_go(struct omap_overlay_manager *mgr) 22675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 22775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 22875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 22975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op; 23075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 23175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen mp = get_mgr_priv(mgr); 23275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 23375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (mp->shadow_dirty) 23475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 23575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 23675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 23775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op = get_ovl_priv(ovl); 23875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (op->shadow_dirty || op->shadow_extra_info_dirty) 23975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return true; 24075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 24175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 24275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return false; 24375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 24475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 24558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) 24658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 24758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 248af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 24958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 25058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 25158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 25258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev = mgr->device; 25358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 25458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 25558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 25658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 25758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (mgr_manual_update(mgr)) 25858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 25958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 260bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(mgr->id); 26158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 262af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 26358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 26458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 26558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long flags; 26658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 26758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 268063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 269af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen dirty = mp->dirty; 270af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen shadow_dirty = mp->shadow_dirty; 271063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 27258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 27358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 27458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 27558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 27658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 27758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 27858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 27958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 28058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 28158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 28258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 28358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 28458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() not finishing\n", 28558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen mgr->id); 28658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 28758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 28858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 28958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 29058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 29158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 29258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 29358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 29458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 29558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("mgr(%d)->wait_for_go() timeout\n", mgr->id); 29658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 29758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 29858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 29958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 30058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 30158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 30258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 30358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint dss_mgr_wait_for_go_ovl(struct omap_overlay *ovl) 30458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 30558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long timeout = msecs_to_jiffies(500); 306c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 30758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev; 30858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 irq; 30958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 31058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int i; 31158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 31258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!ovl->manager) 31358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 31458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 31558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dssdev = ovl->manager->device; 31658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 31758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dssdev || dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) 31858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 31958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 32058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (ovl_manual_update(ovl)) 32158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return 0; 32258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 323bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen irq = dispc_mgr_get_vsync_irq(ovl->manager->id); 32458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 325c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 32658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen i = 0; 32758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen while (1) { 32858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long flags; 32958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool shadow_dirty, dirty; 33058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 331063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 332c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen dirty = op->dirty; 333c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen shadow_dirty = op->shadow_dirty; 334063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 33558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 33658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (!dirty && !shadow_dirty) { 33758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 33858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 33958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 34058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 34158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* 4 iterations is the worst case: 34258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 1 - initial iteration, dirty = true (between VFP and VSYNC) 34358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 2 - first VSYNC, dirty = true 34458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 3 - dirty = false, shadow_dirty = true 34558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen * 4 - shadow_dirty = false */ 34658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (i++ == 3) { 34758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() not finishing\n", 34858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen ovl->id); 34958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = 0; 35058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 35158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 35258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 35358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); 35458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r == -ERESTARTSYS) 35558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 35658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 35758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 35858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSERR("ovl(%d)->wait_for_go() timeout\n", ovl->id); 35958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 36058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 36158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 36258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 36358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 36458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 36558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 36675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_ovl_write_regs(struct omap_overlay *ovl) 36758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 36875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 36958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_overlay_info *oi; 37058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen bool ilace, replication; 37134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 37258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen int r; 37358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 374f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", ovl->id); 37558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 37675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!op->enabled || !op->dirty) 37775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 37858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 37975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen oi = &op->info; 38058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 38158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen replication = dss_use_replication(ovl->manager->device, oi->color_mode); 38258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 38358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen ilace = ovl->manager->device->type == OMAP_DISPLAY_TYPE_VENC; 38458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 385f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen r = dispc_ovl_setup(ovl->id, oi, ilace, replication); 38658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) { 38775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* 38875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * We can't do much here, as this function can be called from 38975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen * vsync interrupt. 39075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen */ 391f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSERR("dispc_ovl_setup failed for ovl %d\n", ovl->id); 39275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 39375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen /* This will leave fifo configurations in a nonoptimal state */ 39475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->enabled = false; 39575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_ovl_enable(ovl->id, false); 39675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 39758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 39858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 399c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen dispc_ovl_set_fifo_threshold(ovl->id, op->fifo_low, op->fifo_high); 40058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 40134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp = get_mgr_priv(ovl->manager); 40234861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 40375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->dirty = false; 40434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 40534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op->shadow_dirty = true; 40658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 40758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 408aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenstatic void dss_ovl_write_regs_extra(struct omap_overlay *ovl) 409aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 410aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 41134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen struct mgr_priv_data *mp; 412aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 413aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen DSSDBGF("%d", ovl->id); 414aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 41575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!op->extra_info_dirty) 41675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 41775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 418aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen /* note: write also when op->enabled == false, so that the ovl gets 419aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen * disabled */ 420aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 421aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dispc_ovl_enable(ovl->id, op->enabled); 4225d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen dispc_ovl_set_channel_out(ovl->id, op->channel); 42375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 42434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp = get_mgr_priv(ovl->manager); 42534861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 42675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen op->extra_info_dirty = false; 42734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 42834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen op->shadow_extra_info_dirty = true; 429aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 430aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 431f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinenstatic void dss_mgr_write_regs(struct omap_overlay_manager *mgr) 43258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 43375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 43475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay *ovl; 43558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 436f6a5e0871f22428a7c74c07ddd791197c5f5d38fTomi Valkeinen DSSDBGF("%d", mgr->id); 43758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 43875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled) 43975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen return; 44058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 44175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen WARN_ON(mp->busy); 44258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 44358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Commit overlay settings */ 44475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 44575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_ovl_write_regs(ovl); 446aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen dss_ovl_write_regs_extra(ovl); 447aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 448aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 44975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (mp->dirty) { 45075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_setup(mgr->id, &mp->info); 45158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 452af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp->dirty = false; 45334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (mp->updating) 45434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->shadow_dirty = true; 45558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 45675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen} 45775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 45875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinenstatic void dss_write_regs(void) 45975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen{ 46075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen const int num_mgrs = omap_dss_get_num_overlay_managers(); 46175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 46258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 46358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) { 46475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct omap_overlay_manager *mgr; 46575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen struct mgr_priv_data *mp; 46675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 467af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 468af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 46958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 47075c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mp->enabled || mgr_manual_update(mgr) || mp->busy) 47158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen continue; 47258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 47375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 47475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 47575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (need_go(mgr)) { 47643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mp->busy = true; 47758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 47875c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 47975c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_register_vsync_isr(); 48058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 48175c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_go(mgr->id); 48275c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 48375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen } 48458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 48558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 48658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenvoid dss_mgr_start_update(struct omap_overlay_manager *mgr) 48758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 488af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 489e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 490e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 491e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 49258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49334861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen WARN_ON(mp->updating); 49434861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 49575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_mgr_write_regs(mgr); 49658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49734861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 49858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 49934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!dss_data.irq_enabled && need_isr()) 50034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen dss_register_vsync_isr(); 50158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5027797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 503e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 504e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 50558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 50658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 507dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask); 508dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 509dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_register_vsync_isr(void) 510dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 511bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 512dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 513bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 514dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 515bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 516bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 517bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 518dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 51934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 52034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 52134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 522dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_register_isr(dss_apply_irq_handler, NULL, mask); 523dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 524dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 525d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = true; 526dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 527dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 528dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinenstatic void dss_unregister_vsync_isr(void) 529dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen{ 530bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 531dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen u32 mask; 532bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen int r, i; 533dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 534bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask = 0; 535bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen for (i = 0; i < num_mgrs; ++i) 536bc1a95181f7069920c13fcef0159ffa7d61160f1Tomi Valkeinen mask |= dispc_mgr_get_vsync_irq(i); 537dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 53834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen for (i = 0; i < num_mgrs; ++i) 53934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mask |= dispc_mgr_get_framedone_irq(i); 54034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 541dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen r = omap_dispc_unregister_isr(dss_apply_irq_handler, NULL, mask); 542dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen WARN_ON(r); 543dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 544d09c7aa8989caf44e8754e8aa81ce80217a0e98aTomi Valkeinen dss_data.irq_enabled = false; 545dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen} 546dbce0160af31d2ea323656c201d8debf5af789bfTomi Valkeinen 5477609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void mgr_clear_shadow_dirty(struct omap_overlay_manager *mgr) 54858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 549c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct omap_overlay *ovl; 550af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 551c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 5527609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 5537609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp = get_mgr_priv(mgr); 5547609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->shadow_dirty = false; 5557609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 5567609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) { 5577609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen op = get_ovl_priv(ovl); 5587609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen op->shadow_dirty = false; 5597609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen op->shadow_extra_info_dirty = false; 5607609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } 5617609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen} 5627609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 5637609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinenstatic void dss_apply_irq_handler(void *data, u32 mask) 5647609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen{ 56558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen const int num_mgrs = dss_feat_get_num_mgrs(); 56675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen int i; 56758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 568063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock(&data_lock); 56958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5707609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen /* clear busy, updating flags, shadow_dirty flags */ 57143a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen for (i = 0; i < num_mgrs; i++) { 5727609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct omap_overlay_manager *mgr; 5737609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen struct mgr_priv_data *mp; 5747609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen 57543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 57643a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen mp = get_mgr_priv(mgr); 57743a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 5787609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->enabled) 57943a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen continue; 58043a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 5817609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->updating = dispc_mgr_is_enabled(i); 58258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 5837609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mgr_manual_update(mgr)) { 5847609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mp->busy = dispc_mgr_go_busy(i); 58543a972d96b6ea2b9e3d6b55b9724c9f61d802c68Tomi Valkeinen 5867609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->busy) 5877609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 5887609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } else { 5897609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen if (!mp->updating) 5907609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen mgr_clear_shadow_dirty(mgr); 5917609893c637b422eec88b57d204f02d8798cfc65Tomi Valkeinen } 59258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 59358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 59475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 59558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 59675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!need_isr()) 59775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_unregister_vsync_isr(); 59858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 599063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock(&data_lock); 60058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 60158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 6025738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl(struct omap_overlay *ovl) 60358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 604c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 60558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 606c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 60758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 608c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen if (!op->user_info_dirty) 6095738b633136a41923b4ba75e6b1a160d08539c99Tomi Valkeinen return; 61058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 611c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = false; 612c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op->dirty = true; 613c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->info = op->user_info; 61458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 61558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 61658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_mgr(struct omap_overlay_manager *mgr) 61758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 618af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen struct mgr_priv_data *mp; 61958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 620af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp = get_mgr_priv(mgr); 62158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 62258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (mgr->device_changed) { 62358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen mgr->device_changed = false; 624388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = true; 62558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 62658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 627388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen if (!mp->user_info_dirty) 62858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return; 62958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 630388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = false; 631af3d64b2c674bc6246bb04654b484f34287fbbc3Tomi Valkeinen mp->dirty = true; 632388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->info = mp->user_info; 63358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 63458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 63558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenstatic void omap_dss_mgr_apply_ovl_fifos(struct omap_overlay *ovl) 63658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 637c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen struct ovl_priv_data *op; 63858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen struct omap_dss_device *dssdev; 63958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen u32 size, burst_size; 64058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 641c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen op = get_ovl_priv(ovl); 64258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dssdev = ovl->manager->device; 64458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen size = dispc_ovl_get_fifo_size(ovl->id); 64658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen burst_size = dispc_ovl_get_burst_size(ovl->id); 64858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 64958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen switch (dssdev->type) { 65058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DPI: 65158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DBI: 65258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_SDI: 65358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_VENC: 65458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_HDMI: 65558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen default_get_overlay_fifo_thresholds(ovl->id, size, 656c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen burst_size, &op->fifo_low, 657c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen &op->fifo_high); 65858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 65958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_DSI 66058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen case OMAP_DISPLAY_TYPE_DSI: 66158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dsi_get_overlay_fifo_thresholds(ovl->id, size, 662c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen burst_size, &op->fifo_low, 663c10c6f042b6a5940c522a334a716d57b40f7dec9Tomi Valkeinen &op->fifo_high); 66458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen break; 66558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen#endif 66658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen default: 66758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen BUG(); 66858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen } 66958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 67058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 67158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinenint omap_dss_mgr_apply(struct omap_overlay_manager *mgr) 67258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen{ 67307e327c9c18b382656bf455051759be8182627aeTomi Valkeinen int r; 67458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen unsigned long flags; 67507e327c9c18b382656bf455051759be8182627aeTomi Valkeinen struct omap_overlay *ovl; 67658f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 67758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen DSSDBG("omap_dss_mgr_apply(%s)\n", mgr->name); 67858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 67958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen r = dispc_runtime_get(); 68058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen if (r) 68158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 68258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 683063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 68458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 68558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Configure overlays */ 68607e327c9c18b382656bf455051759be8182627aeTomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) 68758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen omap_dss_mgr_apply_ovl(ovl); 68858f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 68958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Configure manager */ 69058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen omap_dss_mgr_apply_mgr(mgr); 69158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 69258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen /* Configure overlay fifos */ 69307e327c9c18b382656bf455051759be8182627aeTomi Valkeinen list_for_each_entry(ovl, &mgr->overlays, list) 69458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen omap_dss_mgr_apply_ovl_fifos(ovl); 69558f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 69675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 69758f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 698063fd701abba3b58c36b6043d5feacf0fdc76cbdTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 69958f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 70058f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen dispc_runtime_put(); 70158f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 70258f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen return r; 70358f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen} 70458f2554807a7dc627f1583d1d4363b85758cf685Tomi Valkeinen 7057797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_enable(struct omap_overlay_manager *mgr) 7067797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 707bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 708bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 709bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 7105558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 7115558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 712bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 713bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 714bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = true; 715bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 71675c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 71775c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 71834861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen if (!mgr_manual_update(mgr)) 71934861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = true; 72034861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen 721bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 7225558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 72375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen if (!mgr_manual_update(mgr)) 72475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dispc_mgr_enable(mgr->id, true); 72575c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 7265558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 7277797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 7287797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 7297797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinenvoid dss_mgr_disable(struct omap_overlay_manager *mgr) 7307797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen{ 731bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 732bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen unsigned long flags; 733bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 7345558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 7355558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 7369a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen if (!mgr_manual_update(mgr)) 7379a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dispc_mgr_enable(mgr->id, false); 738bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 739bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 740bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 74134861378a54e3fcac0eb87317ded2554b087494eTomi Valkeinen mp->updating = false; 742bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen mp->enabled = false; 743bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen 744bf213523fe9708572a0b0a9149f7196a4f058564Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 7455558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 7465558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 7477797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen} 7487797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen 749eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_info(struct omap_overlay_manager *mgr, 750eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 751eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 752388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 753e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 754e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 755e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 756e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 757388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info = *info; 758388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen mp->user_info_dirty = true; 759eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 760e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 761e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 762eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 763eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 764eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 765eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenvoid dss_mgr_get_info(struct omap_overlay_manager *mgr, 766eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_overlay_manager_info *info) 767eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 768388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen struct mgr_priv_data *mp = get_mgr_priv(mgr); 769e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 770e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 771e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 772e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 773388c4c6cbb335e69fe23c8d18bd4b0e8dd66901bTomi Valkeinen *info = mp->user_info; 774e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 775e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 776eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 777eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 778eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_set_device(struct omap_overlay_manager *mgr, 779eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen struct omap_dss_device *dssdev) 780eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 781eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen int r; 782eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 7835558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 7845558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 785eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (dssdev->manager) { 786eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' already has a manager '%s'\n", 787eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, dssdev->manager->name); 7885558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 7895558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 790eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 791eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 792eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if ((mgr->supported_displays & dssdev->type) == 0) { 793eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("display '%s' does not support manager '%s'\n", 794eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->name, mgr->name); 7955558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 7965558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 797eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 798eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 799eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen dssdev->manager = mgr; 800eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = dssdev; 801eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device_changed = true; 802eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 8035558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8045558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 805eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 8065558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 8075558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8085558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 809eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 810eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 811eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinenint dss_mgr_unset_device(struct omap_overlay_manager *mgr) 812eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen{ 8135558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 8145558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 8155558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 8165558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 817eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen if (!mgr->device) { 818eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen DSSERR("failed to unset display, display not set.\n"); 8195558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 8205558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 821eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen } 822eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 823eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen /* 824eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * Don't allow currently enabled displays to have the overlay manager 825eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen * pulled out from underneath them 826eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen */ 8275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen if (mgr->device->state != OMAP_DSS_DISPLAY_DISABLED) { 8285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 8295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 8305558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen } 831eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 832eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device->manager = NULL; 833eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device = NULL; 834eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen mgr->device_changed = true; 835eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 8365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 838eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen return 0; 8395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 8405558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 8415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 842eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen} 843eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 844eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 845eb70d739adf2266e744a784a1272f1c92a257b81Tomi Valkeinen 846f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_info(struct omap_overlay *ovl, 847f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 848f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 849c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 850e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 851e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 852e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 853e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 854c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info = *info; 855c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen op->user_info_dirty = true; 856f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 857e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 858e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 859f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 860f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 861f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 862f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenvoid dss_ovl_get_info(struct omap_overlay *ovl, 863f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_info *info) 864f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 865c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 866e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen unsigned long flags; 867e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 868e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_lock_irqsave(&data_lock, flags); 869e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 870c1a9febfafa2a9a9ac09b2de4c80aa96b41a03d1Tomi Valkeinen *info = op->user_info; 871e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen 872e0a2aa5b3d1a26969ba906447c816d44c018969dTomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 873f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 874f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 875f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_set_manager(struct omap_overlay *ovl, 876f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen struct omap_overlay_manager *mgr) 877f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 878aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 879aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 8805558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 8815558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 882f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!mgr) 883f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return -EINVAL; 884f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 8855558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 8865558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 887f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (ovl->manager) { 888f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay '%s' already has a manager '%s'\n", 889f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->name, ovl->manager->name); 8905558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 8915558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 892f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 893f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 894aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 895aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 896aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 897aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 898f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to change the manager\n"); 8995558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9005558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 901f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 902f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 9035d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = mgr->id; 9045d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->extra_info_dirty = true; 9055d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 906f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = mgr; 907f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_add_tail(&ovl->list, &mgr->overlays); 908f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 909aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 910aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 911f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen /* XXX: When there is an overlay on a DSI manual update display, and 912f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay is first disabled, then moved to tv, and enabled, we 913f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * seem to get SYNC_LOST_DIGIT error. 914f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 915f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Waiting doesn't seem to help, but updating the manual update display 916f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * after disabling the overlay seems to fix this. This hints that the 917f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * overlay is perhaps somehow tied to the LCD output until the output 918f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * is updated. 919f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * 920f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * Userspace workaround for this is to update the LCD after disabling 921f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen * the overlay, but before moving the overlay to TV. 922f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen */ 923f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 9245558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9255558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 926f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 9275558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 9285558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 9295558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 930f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 931f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 932f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinenint dss_ovl_unset_manager(struct omap_overlay *ovl) 933f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen{ 934aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 935aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 9365558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen int r; 9375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 9385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_lock(&apply_lock); 9395558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 940f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen if (!ovl->manager) { 941f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("failed to detach overlay: manager not set\n"); 9425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 944f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 945f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 946aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 947aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 948aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (op->enabled) { 949aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 950f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen DSSERR("overlay has to be disabled to unset the manager\n"); 9515558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen r = -EINVAL; 9525558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen goto err; 953f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen } 954f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 9555d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen op->channel = -1; 9565d5a97a6fbf98f82ae50c837eba3ebcfea0902f8Tomi Valkeinen 957f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen ovl->manager = NULL; 958f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen list_del(&ovl->list); 959f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 960aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 961aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 962aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 963aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 964aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 965aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr: 966aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 967aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 968aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 969aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 970aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenbool dss_ovl_is_enabled(struct omap_overlay *ovl) 971aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 972aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 973aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 974aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen bool e; 975aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 976aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 977aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 978aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen e = op->enabled; 979aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 980aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 981aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 982aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return e; 983aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 984aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 985aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_enable(struct omap_overlay *ovl) 986aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 987aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 988aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 989aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 990aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 991aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 992aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 993aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (ovl->manager == NULL || ovl->manager->device == NULL) { 994aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 995aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen goto err; 996aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 997aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 998aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 999aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1000aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen op->enabled = true; 1001aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen op->extra_info_dirty = true; 1002aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 100375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 100475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1005aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1006aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1007aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1008aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1009aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return 0; 1010aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenerr: 1011aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_unlock(&apply_lock); 1012aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen return r; 1013aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen} 1014aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1015aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinenint dss_ovl_disable(struct omap_overlay *ovl) 1016aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen{ 1017aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen struct ovl_priv_data *op = get_ovl_priv(ovl); 1018aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen unsigned long flags; 1019aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen int r; 1020aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1021aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen mutex_lock(&apply_lock); 1022aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1023aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen if (ovl->manager == NULL || ovl->manager->device == NULL) { 1024aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen r = -EINVAL; 1025aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen goto err; 1026aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen } 1027aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1028aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_lock_irqsave(&data_lock, flags); 1029aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 1030aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen op->enabled = false; 1031aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen op->extra_info_dirty = true; 1032aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 103375c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen dss_write_regs(); 103475c949653fdf77a17753ffb8462a3c458c476271Tomi Valkeinen 1035aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen spin_unlock_irqrestore(&data_lock, flags); 1036aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 10375558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10385558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen 1039f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen return 0; 1040aaa874a985158383c4b394c687c716ef26288741Tomi Valkeinen 10415558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinenerr: 10425558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen mutex_unlock(&apply_lock); 10435558db3fdd52e3928d5eaabe363e1576dc5fe473Tomi Valkeinen return r; 1044f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen} 1045f77b30700e5c0a6b5220b3a964bf6c40d5e71416Tomi Valkeinen 1046