180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* 280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * linux/drivers/video/omap2/dss/dispc.c 380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * 480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Copyright (C) 2009 Nokia Corporation 580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * 780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Some code and ideas taken from drivers/video/omap/ driver 880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * by Imre Deak. 980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * 1080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it 1180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by 1280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * the Free Software Foundation. 1380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * 1480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT 1580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 1780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * more details. 1880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * 1980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * You should have received a copy of the GNU General Public License along with 2080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * this program. If not, see <http://www.gnu.org/licenses/>. 2180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 2280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DSS_SUBSYS_NAME "DISPC" 2480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/kernel.h> 2680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/dma-mapping.h> 2780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/vmalloc.h> 28a8a359318530a779c8d28d86357d492adead5b1fPaul Gortmaker#include <linux/export.h> 2980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/clk.h> 3080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/io.h> 3180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/jiffies.h> 3280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/seq_file.h> 3380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/delay.h> 3480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/workqueue.h> 35ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen#include <linux/hardirq.h> 36affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja#include <linux/interrupt.h> 3724e6289c029b0cf5b4f75e12c1b66000d441c9edTomi Valkeinen#include <linux/platform_device.h> 384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen#include <linux/pm_runtime.h> 3980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <plat/clock.h> 4180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 42a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h> 4380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include "dss.h" 45a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja#include "dss_features.h" 469b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#include "dispc.h" 4780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* DISPC */ 498613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal#define DISPC_SZ_REGS SZ_4K 5080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_IRQ_MASK_ERROR (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \ 5280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_OCP_ERR | \ 5380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_VID1_FIFO_UNDERFLOW | \ 5480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_VID2_FIFO_UNDERFLOW | \ 5580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_SYNC_LOST | \ 5680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_SYNC_LOST_DIGIT) 5780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_MAX_NR_ISRS 8 5980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 6080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstruct omap_dispc_isr_data { 6180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_isr_t isr; 6280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void *arg; 6380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 mask; 6480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}; 6580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 665ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenenum omap_burst_size { 675ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X2 = 0, 685ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X4 = 1, 695ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X8 = 2, 705ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}; 715ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 7280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_GET(idx, start, end) \ 7380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_GET(dispc_read_reg(idx), start, end) 7480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 7580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_FLD_MOD(idx, val, start, end) \ 7680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(idx, FLD_MOD(dispc_read_reg(idx), val, start, end)) 7780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 78dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenstruct dispc_irq_stats { 79dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long last_reset; 80dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned irq_count; 81dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned irqs[32]; 82dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen}; 83dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 8480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic struct { 85060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy struct platform_device *pdev; 8680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void __iomem *base; 874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int ctx_loss_cnt; 894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 90affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja int irq; 914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *dss_clk; 9280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 93e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja u32 fifo_size[MAX_DSS_OVERLAYS]; 9480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spinlock_t irq_lock; 9680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 irq_error_mask; 9780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; 9880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 error_irqs; 9980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct work_struct error_work; 10080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen bool ctx_valid; 10280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 ctx[DISPC_SZ_REGS / sizeof(u32)]; 103dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 104dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 105dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spinlock_t irq_stats_lock; 106dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dispc_irq_stats irq_stats; 107dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 10880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} dispc; 10980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainenum omap_color_component { 1110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* used for all color formats for OMAP3 and earlier 1120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * and for RGB and Y color component on OMAP4 1130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 1140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain DISPC_COLOR_COMPONENT_RGB_Y = 1 << 0, 1150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* used for UV component for 1160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_UYVY, OMAP_DSS_COLOR_NV12 1170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * color formats on OMAP4 1180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 1190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain DISPC_COLOR_COMPONENT_UV = 1 << 1, 1200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}; 1210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void); 12380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 12455978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline void dispc_write_reg(const u16 idx, u32 val) 12580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 12655978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja __raw_writel(val, dispc.base + idx); 12780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 12880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 12955978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline u32 dispc_read_reg(const u16 idx) 13080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 13155978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja return __raw_readl(dispc.base + idx); 13280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 13380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 13449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinenstatic int dispc_get_ctx_loss_count(void) 13549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen{ 13649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct device *dev = &dispc.pdev->dev; 13749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct omap_display_platform_data *pdata = dev->platform_data; 13849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct omap_dss_board_info *board_data = pdata->board_data; 13949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen int cnt; 14049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (!board_data->get_context_loss_count) 14249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return -ENOENT; 14349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen cnt = board_data->get_context_loss_count(dev); 14549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen WARN_ONCE(cnt < 0, "get_context_loss_count failed: %d\n", cnt); 14749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return cnt; 14949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen} 15049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 15180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define SR(reg) \ 15255978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja dispc.ctx[DISPC_##reg / sizeof(u32)] = dispc_read_reg(DISPC_##reg) 15380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define RR(reg) \ 15455978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja dispc_write_reg(DISPC_##reg, dispc.ctx[DISPC_##reg / sizeof(u32)]) 15580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1564fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_save_context(void) 15780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 158c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja int i, j; 15980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_save_context\n"); 1614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 16280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(IRQENABLE); 16380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(CONTROL); 16480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(CONFIG); 16580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(LINE_NUMBER); 16611354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 16711354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 168332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen SR(GLOBAL_ALPHA); 1692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 1702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal SR(CONTROL2); 1712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal SR(CONFIG2); 1722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 17380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 174c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 175c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DEFAULT_COLOR(i)); 176c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TRANS_COLOR(i)); 177c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(SIZE_MGR(i)); 178c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 179c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 180c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TIMING_H(i)); 181c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TIMING_V(i)); 182c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(POL_FREQ(i)); 183c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DIVISORo(i)); 184c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 185c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE1(i)); 186c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE2(i)); 187c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE3(i)); 188c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 189332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 190c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_R(i)); 191c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_G(i)); 192c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_B(i)); 193332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 1942a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 19580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 196c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 197c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA0(i)); 198c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA1(i)); 199c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_POSITION(i)); 200c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_SIZE(i)); 201c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ATTRIBUTES(i)); 202c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIFO_THRESHOLD(i)); 203c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ROW_INC(i)); 204c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PIXEL_INC(i)); 205c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_PRELOAD)) 206c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PRELOAD(i)); 207c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_GFX) { 208c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_WINDOW_SKIP(i)); 209c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_TABLE_BA(i)); 210c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 211c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 212c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR(i)); 213c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PICTURE_SIZE(i)); 214c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU0(i)); 215c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU1(i)); 2169b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 217c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 218c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_H(i, j)); 219ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 220c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 221c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_HV(i, j)); 222ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 223c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 5; j++) 224c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_CONV_COEF(i, j)); 225ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 226c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 227c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 228c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_V(i, j)); 229c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 2309b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 231c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 232c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA0_UV(i)); 233c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA1_UV(i)); 234c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR2(i)); 235c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU2_0(i)); 236c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU2_1(i)); 237ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 238c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 239c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_H2(i, j)); 240ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 241c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 242c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_HV2(i, j)); 243ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 244c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 245c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_V2(i, j)); 246c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 247c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_ATTR2)) 248c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ATTRIBUTES2(i)); 249ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 2500cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 2510cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) 2520cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer SR(DIVISOR); 25349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 25449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_loss_cnt = dispc_get_ctx_loss_count(); 25549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_valid = true; 25649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 25749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("context saved, ctx_loss_count %d\n", dispc.ctx_loss_cnt); 25880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 25980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_restore_context(void) 26180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 262c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja int i, j, ctx; 2634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 2644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_restore_context\n"); 2654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 26649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (!dispc.ctx_valid) 26749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return; 26849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 26949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen ctx = dispc_get_ctx_loss_count(); 27049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (ctx >= 0 && ctx == dispc.ctx_loss_cnt) 27249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return; 27349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("ctx_loss_count: saved %d, current %d\n", 27549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_loss_cnt, ctx); 27649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27775c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /*RR(IRQENABLE);*/ 27880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /*RR(CONTROL);*/ 27980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(CONFIG); 28080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(LINE_NUMBER); 28111354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 28211354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 283332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen RR(GLOBAL_ALPHA); 284c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_MGR_LCD2)) 2852a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal RR(CONFIG2); 28680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 287c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 288c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DEFAULT_COLOR(i)); 289c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TRANS_COLOR(i)); 290c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(SIZE_MGR(i)); 291c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 292c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 293c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TIMING_H(i)); 294c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TIMING_V(i)); 295c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(POL_FREQ(i)); 296c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DIVISORo(i)); 297c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 298c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE1(i)); 299c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE2(i)); 300c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE3(i)); 3012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 302332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 303c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_R(i)); 304c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_G(i)); 305c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_B(i)); 306332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 3072a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 30880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 309c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 310c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA0(i)); 311c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA1(i)); 312c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_POSITION(i)); 313c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_SIZE(i)); 314c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ATTRIBUTES(i)); 315c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIFO_THRESHOLD(i)); 316c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ROW_INC(i)); 317c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PIXEL_INC(i)); 318c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_PRELOAD)) 319c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PRELOAD(i)); 320c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_GFX) { 321c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_WINDOW_SKIP(i)); 322c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_TABLE_BA(i)); 323c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 324c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 325c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR(i)); 326c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PICTURE_SIZE(i)); 327c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU0(i)); 328c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU1(i)); 3299b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 330c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 331c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_H(i, j)); 332ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 333c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 334c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_HV(i, j)); 335ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 336c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 5; j++) 337c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_CONV_COEF(i, j)); 338ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 339c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 340c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 341c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_V(i, j)); 342c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 3439b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 344c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 345c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA0_UV(i)); 346c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA1_UV(i)); 347c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR2(i)); 348c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU2_0(i)); 349c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU2_1(i)); 350ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 351c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 352c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_H2(i, j)); 353ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 354c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 355c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_HV2(i, j)); 356ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 357c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 358c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_V2(i, j)); 359c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 360c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_ATTR2)) 361c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ATTRIBUTES2(i)); 362ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 36380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3640cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) 3650cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer RR(DIVISOR); 3660cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 36780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* enable last, because LCD & DIGIT enable are here */ 36880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(CONTROL); 3692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 3702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal RR(CONTROL2); 37175c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /* clear spurious SYNC_LOST_DIGIT interrupts */ 37275c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); 37375c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä 37475c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /* 37575c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä * enable last so IRQs won't trigger before 37675c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä * the context is fully restored 37775c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä */ 37875c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä RR(IRQENABLE); 37949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 38049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("context restored\n"); 38180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 38280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 38380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef SR 38480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef RR 38580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3864fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenint dispc_runtime_get(void) 3874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 3884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 3894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_runtime_get\n"); 3914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3924fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = pm_runtime_get_sync(&dispc.pdev->dev); 3934fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 3944fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r < 0 ? r : 0; 3954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 3964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenvoid dispc_runtime_put(void) 3984fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 3994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 4004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_runtime_put\n"); 4024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4030eaf9f52e94f756147dbfe1faf1f77a02378dbf9Tomi Valkeinen r = pm_runtime_put_sync(&dispc.pdev->dev); 4044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 40580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 40680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 407dac57a05fcf4808bbc91a96a034cae84716f0077Archit Tanejastatic inline bool dispc_mgr_is_lcd(enum omap_channel channel) 408dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja{ 409dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (channel == OMAP_DSS_CHANNEL_LCD || 410dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja channel == OMAP_DSS_CHANNEL_LCD2) 411dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja return true; 412dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja else 413dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja return false; 414dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja} 4154fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 416c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Tanejastatic struct omap_dss_device *dispc_mgr_get_device(enum omap_channel channel) 417c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja{ 418c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja struct omap_overlay_manager *mgr = 419c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja omap_dss_get_overlay_manager(channel); 420c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 421c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return mgr ? mgr->device : NULL; 422c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja} 423c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 4243dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinenu32 dispc_mgr_get_vsync_irq(enum omap_channel channel) 4253dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen{ 4263dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen switch (channel) { 4273dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD: 4283dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_VSYNC; 4293dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD2: 4303dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_VSYNC2; 4313dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_DIGIT: 4323dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 4333dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen default: 4343dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen BUG(); 4353dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen } 4363dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen} 4373dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen 4387d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinenu32 dispc_mgr_get_framedone_irq(enum omap_channel channel) 4397d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen{ 4407d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen switch (channel) { 4417d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD: 4427d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return DISPC_IRQ_FRAMEDONE; 4437d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD2: 4447d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return DISPC_IRQ_FRAMEDONE2; 4457d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_DIGIT: 4467d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return 0; 4477d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen default: 4487d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen BUG(); 4497d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen } 4507d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen} 4517d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen 45226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_go_busy(enum omap_channel channel) 45380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 45480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int bit; 45580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 456dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 45780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 5; /* GOLCD */ 45880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 45980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 6; /* GODIGIT */ 46080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return REG_GET(DISPC_CONTROL, bit, bit) == 1; 46580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 46680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 46726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_go(enum omap_channel channel) 46880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 46980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int bit; 4702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal bool enable_bit, go_bit; 47180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 472dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 47380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 0; /* LCDENABLE */ 47480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 47580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 1; /* DIGITALENABLE */ 47680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 47780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* if the channel is not enabled, we don't need GO */ 4782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal enable_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal enable_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1; 4822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 4832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (!enable_bit) 484e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return; 48580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 486dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 48780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 5; /* GOLCD */ 48880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 48980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 6; /* GODIGIT */ 49080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal go_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4932a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4942a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal go_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1; 4952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 4962a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (go_bit) { 49780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("GO bit not down for channel %d\n", channel); 498e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return; 49980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 50080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : 5022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal (channel == OMAP_DSS_CHANNEL_LCD2 ? "LCD2" : "DIGIT")); 50380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5042a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 5052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, 1, bit, bit); 5062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 5072a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, 1, bit, bit); 50880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 50980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 510f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh_reg(enum omap_plane plane, int reg, u32 value) 51180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5129b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_H(plane, reg), value); 51380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 51480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 515f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv_reg(enum omap_plane plane, int reg, u32 value) 51680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5179b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_HV(plane, reg), value); 51880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 51980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 520f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv_reg(enum omap_plane plane, int reg, u32 value) 52180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5229b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_V(plane, reg), value); 52380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 52480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 525f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh2_reg(enum omap_plane plane, int reg, u32 value) 526ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 527ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 528ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 529ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_H2(plane, reg), value); 530ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 531ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 532f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv2_reg(enum omap_plane plane, int reg, 533f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen u32 value) 534ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 535ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 536ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 537ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_HV2(plane, reg), value); 538ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 539ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 540f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv2_reg(enum omap_plane plane, int reg, u32 value) 541ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 542ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 543ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 544ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_V2(plane, reg), value); 545ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 546ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 547debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatrastatic void dispc_ovl_set_scale_coef(enum omap_plane plane, int fir_hinc, 548debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra int fir_vinc, int five_taps, 549debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra enum omap_color_component color_comp) 55080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 551debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra const struct dispc_coef *h_coef, *v_coef; 55280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 55380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 554debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra h_coef = dispc_ovl_get_scale_coef(fir_hinc, true); 555debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra v_coef = dispc_ovl_get_scale_coef(fir_vinc, five_taps); 55680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 55780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < 8; i++) { 55880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 h, hv; 55980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 560debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra h = FLD_VAL(h_coef[i].hc0_vc00, 7, 0) 561debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc1_vc0, 15, 8) 562debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc2_vc1, 23, 16) 563debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc3_vc2, 31, 24); 564debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra hv = FLD_VAL(h_coef[i].hc4_vc22, 7, 0) 565debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc1_vc0, 15, 8) 566debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc2_vc1, 23, 16) 567debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc3_vc2, 31, 24); 56880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) { 570f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firh_reg(plane, i, h); 571f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firhv_reg(plane, i, hv); 5720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } else { 573f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firh2_reg(plane, i, h); 574f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firhv2_reg(plane, i, hv); 5750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 5760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 57780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 57880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 57966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas if (five_taps) { 58066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas for (i = 0; i < 8; i++) { 58166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas u32 v; 582debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra v = FLD_VAL(v_coef[i].hc0_vc00, 7, 0) 583debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc4_vc22, 15, 8); 5840d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) 585f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firv_reg(plane, i, v); 5860d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain else 587f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firv2_reg(plane, i, v); 58866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas } 58980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 59080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 59180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 59280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_setup_color_conv_coef(void) 59380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 594ac01c29e5279fe31632e9118619b365514633235Archit Taneja int i; 59580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen const struct color_conv_coef { 59680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ry, rcr, rcb, gy, gcr, gcb, by, bcr, bcb; 59780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int full_range; 59880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } ctbl_bt601_5 = { 59980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298, 409, 0, 298, -208, -100, 298, 0, 517, 0, 60080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen }; 60180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen const struct color_conv_coef *ct; 60380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0)) 60580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ct = &ctbl_bt601_5; 60780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 608ac01c29e5279fe31632e9118619b365514633235Archit Taneja for (i = 1; i < dss_feat_get_num_ovls(); i++) { 609ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 0), 610ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->rcr, ct->ry)); 611ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 1), 612ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->gy, ct->rcb)); 613ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 2), 614ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->gcb, ct->gcr)); 615ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 3), 616ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->bcr, ct->by)); 617ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 4), 618ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(0, ct->bcb)); 619ac01c29e5279fe31632e9118619b365514633235Archit Taneja 620ac01c29e5279fe31632e9118619b365514633235Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), ct->full_range, 621ac01c29e5279fe31632e9118619b365514633235Archit Taneja 11, 11); 622ac01c29e5279fe31632e9118619b365514633235Archit Taneja } 62380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 62480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef CVAL 62580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 62680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 62780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 628f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0(enum omap_plane plane, u32 paddr) 62980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 6309b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_BA0(plane), paddr); 63180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 63280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 633f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1(enum omap_plane plane, u32 paddr) 63480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 6359b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_BA1(plane), paddr); 63680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 63780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 638f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0_uv(enum omap_plane plane, u32 paddr) 639ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 640ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_BA0_UV(plane), paddr); 641ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 642ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 643f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr) 644ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 645ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr); 646ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 647ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 648f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pos(enum omap_plane plane, int x, int y) 64980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 65080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0); 6519b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6529b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_POSITION(plane), val); 65380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 65480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 655f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pic_size(enum omap_plane plane, int width, int height) 65680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 65780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 6589b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6599b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja if (plane == OMAP_DSS_GFX) 6609b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_SIZE(plane), val); 6619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja else 6629b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_PICTURE_SIZE(plane), val); 66380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 66480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 665f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_size(enum omap_plane plane, int width, int height) 66680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 66780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 66880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 66980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(plane == OMAP_DSS_GFX); 67080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 67180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 6729b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6739b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_SIZE(plane), val); 67480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 67580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 67654128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Tanejastatic void dispc_ovl_set_zorder(enum omap_plane plane, u8 zorder) 67754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja{ 67854128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 67954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68054128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0) 68154128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja return; 68254128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68354128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), zorder, 27, 26); 68454128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja} 68554128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68654128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Tanejastatic void dispc_ovl_enable_zorder_planes(void) 68754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja{ 68854128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja int i; 68954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 69054128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja if (!dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 69154128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja return; 69254128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 69354128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) 69454128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25); 69554128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja} 69654128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 697f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pre_mult_alpha(enum omap_plane plane, bool enable) 698fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N{ 699f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen struct omap_overlay *ovl = omap_dss_get_overlay(plane); 700fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 701f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA) == 0) 702fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N return; 703fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 7049b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 28, 28); 705fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N} 706fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 707f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_setup_global_alpha(enum omap_plane plane, u8 global_alpha) 70880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 709b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 0, 8, 16, 24, }; 710fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen int shift; 711f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen struct omap_overlay *ovl = omap_dss_get_overlay(plane); 712fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 713f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0) 714fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N return; 715a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 716fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 717fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, shift + 7, shift); 71880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 71980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 720f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pix_inc(enum omap_plane plane, s32 inc) 72180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 7229b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_PIXEL_INC(plane), inc); 72380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 72480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 725f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_row_inc(enum omap_plane plane, s32 inc) 72680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 7279b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc); 72880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 72980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 730f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_color_mode(enum omap_plane plane, 73180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode) 73280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 73380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 m = 0; 734f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain if (plane != OMAP_DSS_GFX) { 735f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain switch (color_mode) { 736f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_NV12: 737f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x0; break; 73808f3267e264e3cf05f0e79cf0f63a2162fd4bd1cLajos Molnar case OMAP_DSS_COLOR_RGBX16: 739f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x1; break; 740f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA16: 741f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x2; break; 74208f3267e264e3cf05f0e79cf0f63a2162fd4bd1cLajos Molnar case OMAP_DSS_COLOR_RGB12U: 743f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x4; break; 744f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16: 745f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x5; break; 746f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB16: 747f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x6; break; 748f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 749f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x7; break; 750f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24U: 751f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x8; break; 752f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24P: 753f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x9; break; 754f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_YUV2: 755f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xa; break; 756f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_UYVY: 757f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xb; break; 758f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB32: 759f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xc; break; 760f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA32: 761f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xd; break; 762f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX32: 763f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xe; break; 764f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 765f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xf; break; 766f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain default: 767f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain BUG(); break; 768f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } 769f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } else { 770f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain switch (color_mode) { 771f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT1: 772f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x0; break; 773f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT2: 774f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x1; break; 775f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT4: 776f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x2; break; 777f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT8: 778f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x3; break; 779f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB12U: 780f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x4; break; 781f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16: 782f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x5; break; 783f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB16: 784f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x6; break; 785f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 786f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x7; break; 787f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24U: 788f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x8; break; 789f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24P: 790f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x9; break; 79108f3267e264e3cf05f0e79cf0f63a2162fd4bd1cLajos Molnar case OMAP_DSS_COLOR_RGBX16: 792f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xa; break; 79308f3267e264e3cf05f0e79cf0f63a2162fd4bd1cLajos Molnar case OMAP_DSS_COLOR_RGBA16: 794f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xb; break; 795f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB32: 796f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xc; break; 797f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA32: 798f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xd; break; 799f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX32: 800f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xe; break; 801f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 802f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xf; break; 803f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain default: 804f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain BUG(); break; 805f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } 80680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 80780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8089b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), m, 4, 1); 80980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 81080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 811f427984e896fde6ae03056cf1f8ac5d4a99275d4Tomi Valkeinenvoid dispc_ovl_set_channel_out(enum omap_plane plane, enum omap_channel channel) 81280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 81380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int shift; 81480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 8152a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal int chan = 0, chan2 = 0; 81680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 81780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (plane) { 81880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_GFX: 81980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen shift = 8; 82080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 82180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_VIDEO1: 82280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_VIDEO2: 823b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja case OMAP_DSS_VIDEO3: 82480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen shift = 16; 82580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 82680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 82780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 82880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 82980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 83080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8319b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 8322a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 8332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal switch (channel) { 8342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_LCD: 8352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 0; 8362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 0; 8372a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_DIGIT: 8392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 1; 8402a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 0; 8412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8422a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_LCD2: 8432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 0; 8442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 1; 8452a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8462a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal default: 8472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal BUG(); 8482a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 8492a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 8502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, chan, shift, shift); 8512a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, chan2, 31, 30); 8522a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } else { 8532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, channel, shift, shift); 8542a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 8559b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val); 85680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 85780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8582cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinenstatic enum omap_channel dispc_ovl_get_channel_out(enum omap_plane plane) 8592cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen{ 8602cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen int shift; 8612cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen u32 val; 8622cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen enum omap_channel channel; 8632cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8642cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen switch (plane) { 8652cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_GFX: 8662cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen shift = 8; 8672cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen break; 8682cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO1: 8692cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO2: 8702cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO3: 8712cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen shift = 16; 8722cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen break; 8732cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen default: 8742cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen BUG(); 8752cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } 8762cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8772cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 8782cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8792cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen if (dss_has_feature(FEAT_MGR_LCD2)) { 8802cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen if (FLD_GET(val, 31, 30) == 0) 8812cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = FLD_GET(val, shift, shift); 8822cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen else 8832cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = OMAP_DSS_CHANNEL_LCD2; 8842cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } else { 8852cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = FLD_GET(val, shift, shift); 8862cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } 8872cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8882cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen return channel; 8892cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen} 8902cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 891f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_burst_size(enum omap_plane plane, 89280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_burst_size burst_size) 89380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 894b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 6, 14, 14, 14, }; 89580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int shift; 89680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 897fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 8985ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), burst_size, shift + 1, shift); 89980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 90080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9015ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenstatic void dispc_configure_burst_sizes(void) 9025ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{ 9035ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen int i; 9045ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen const int burst_size = BURST_SIZE_X8; 9055ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 9065ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen /* Configure burst size always to maximum size */ 9075ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlays(); ++i) 908f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_burst_size(i, burst_size); 9095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen} 9105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 91183fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinenstatic u32 dispc_ovl_get_burst_size(enum omap_plane plane) 9125ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{ 9135ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unsigned unit = dss_feat_get_burst_size_unit(); 9145ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen /* burst multiplier is always x8 (see dispc_configure_burst_sizes()) */ 9155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen return unit * 8; 9165ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen} 9175ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 918d3862610c95564a586951d5be291b9b0200d39feMythri P Kvoid dispc_enable_gamma_table(bool enable) 919d3862610c95564a586951d5be291b9b0200d39feMythri P K{ 920d3862610c95564a586951d5be291b9b0200d39feMythri P K /* 921d3862610c95564a586951d5be291b9b0200d39feMythri P K * This is partially implemented to support only disabling of 922d3862610c95564a586951d5be291b9b0200d39feMythri P K * the gamma table. 923d3862610c95564a586951d5be291b9b0200d39feMythri P K */ 924d3862610c95564a586951d5be291b9b0200d39feMythri P K if (enable) { 925d3862610c95564a586951d5be291b9b0200d39feMythri P K DSSWARN("Gamma table enabling for TV not yet supported"); 926d3862610c95564a586951d5be291b9b0200d39feMythri P K return; 927d3862610c95564a586951d5be291b9b0200d39feMythri P K } 928d3862610c95564a586951d5be291b9b0200d39feMythri P K 929d3862610c95564a586951d5be291b9b0200d39feMythri P K REG_FLD_MOD(DISPC_CONFIG, enable, 9, 9); 930d3862610c95564a586951d5be291b9b0200d39feMythri P K} 931d3862610c95564a586951d5be291b9b0200d39feMythri P K 932c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable) 9333c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{ 9343c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen u16 reg; 9353c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9363c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD) 9373c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen reg = DISPC_CONFIG; 9383c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_LCD2) 9393c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen reg = DISPC_CONFIG2; 9403c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen else 9413c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen return; 9423c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9433c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen REG_FLD_MOD(reg, enable, 15, 15); 9443c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen} 9453c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 946c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_cpr_coef(enum omap_channel channel, 9473c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen struct omap_dss_cpr_coefs *coefs) 9483c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{ 9493c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen u32 coef_r, coef_g, coef_b; 9503c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 951dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (!dispc_mgr_is_lcd(channel)) 9523c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen return; 9533c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9543c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_r = FLD_VAL(coefs->rr, 31, 22) | FLD_VAL(coefs->rg, 20, 11) | 9553c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->rb, 9, 0); 9563c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_g = FLD_VAL(coefs->gr, 31, 22) | FLD_VAL(coefs->gg, 20, 11) | 9573c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->gb, 9, 0); 9583c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_b = FLD_VAL(coefs->br, 31, 22) | FLD_VAL(coefs->bg, 20, 11) | 9593c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->bb, 9, 0); 9603c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9613c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_R(channel), coef_r); 9623c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_G(channel), coef_g); 9633c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_B(channel), coef_b); 9643c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen} 9653c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 966f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable) 96780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 96880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 96980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 97080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(plane == OMAP_DSS_GFX); 97180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9729b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 97380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_MOD(val, enable, 9, 9); 9749b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val); 97580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 97680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 977c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Tanejastatic void dispc_ovl_enable_replication(enum omap_plane plane, bool enable) 97880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 979b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 5, 10, 10, 10 }; 980fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen int shift; 98180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 982fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 983fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift); 98480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 98580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 98626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_size(enum omap_channel channel, u16 width, u16 height) 98780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 98880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 98980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON((width > (1 << 11)) || (height > (1 << 11))); 99080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 991702d144845086cacf8bb4f23196189f260c250e2Archit Taneja dispc_write_reg(DISPC_SIZE_MGR(channel), val); 99280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 99380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 99480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_digit_size(u16 width, u16 height) 99580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 99680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 99780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON((width > (1 << 11)) || (height > (1 << 11))); 99880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 999702d144845086cacf8bb4f23196189f260c250e2Archit Taneja dispc_write_reg(DISPC_SIZE_MGR(OMAP_DSS_CHANNEL_DIGIT), val); 100080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 100180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 100280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_read_plane_fifo_sizes(void) 100380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 100480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 size; 100580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int plane; 1006a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja u8 start, end; 10075ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen u32 unit; 10085ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unit = dss_feat_get_buffer_size_unit(); 101080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1011a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end); 101280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1013e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja for (plane = 0; plane < dss_feat_get_num_ovls(); ++plane) { 10145ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(plane), start, end); 10155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen size *= unit; 101680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.fifo_size[plane] = size; 101780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 101880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 101980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 102083fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinenstatic u32 dispc_ovl_get_fifo_size(enum omap_plane plane) 102180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 102280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return dispc.fifo_size[plane]; 102380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 102480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10256f04e1bfc36c5865dc5679f85e25b6613be86298Tomi Valkeinenvoid dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high) 102680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1027a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja u8 hi_start, hi_end, lo_start, lo_end; 10285ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen u32 unit; 10295ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10305ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unit = dss_feat_get_buffer_size_unit(); 10315ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10325ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen WARN_ON(low % unit != 0); 10335ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen WARN_ON(high % unit != 0); 10345ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10355ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen low /= unit; 10365ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen high /= unit; 1037a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 10389b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end); 10399b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end); 10409b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 10413cb5d966e233167fcbeb7c7d7a66294e13ee9d90Tomi Valkeinen DSSDBG("fifo(%d) threshold (bytes), old %u/%u, new %u/%u\n", 104280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen plane, 10439b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane), 10443cb5d966e233167fcbeb7c7d7a66294e13ee9d90Tomi Valkeinen lo_start, lo_end) * unit, 10459b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane), 10463cb5d966e233167fcbeb7c7d7a66294e13ee9d90Tomi Valkeinen hi_start, hi_end) * unit, 10473cb5d966e233167fcbeb7c7d7a66294e13ee9d90Tomi Valkeinen low * unit, high * unit); 104880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10499b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane), 1050a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja FLD_VAL(high, hi_start, hi_end) | 1051a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja FLD_VAL(low, lo_start, lo_end)); 105280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 105380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 105480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_fifomerge(bool enable) 105580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1056e6b0f884520e604408ebda3b60605cabe0a8d162Tomi Valkeinen if (!dss_has_feature(FEAT_FIFO_MERGE)) { 1057e6b0f884520e604408ebda3b60605cabe0a8d162Tomi Valkeinen WARN_ON(enable); 1058e6b0f884520e604408ebda3b60605cabe0a8d162Tomi Valkeinen return; 1059e6b0f884520e604408ebda3b60605cabe0a8d162Tomi Valkeinen } 1060e6b0f884520e604408ebda3b60605cabe0a8d162Tomi Valkeinen 106180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled"); 106280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14); 106380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 106480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 106583fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinenvoid dispc_ovl_compute_fifo_thresholds(enum omap_plane plane, 1066f33f0eaff50112270a9e629569729ce5d5d620faTomi Valkeinen u32 *fifo_low, u32 *fifo_high, bool use_fifomerge, 1067f33f0eaff50112270a9e629569729ce5d5d620faTomi Valkeinen bool manual_update) 106883fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen{ 106983fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen /* 107083fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen * All sizes are in bytes. Both the buffer and burst are made of 107183fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen * buffer_units, and the fifo thresholds must be buffer_unit aligned. 107283fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen */ 107383fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen 107483fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen unsigned buf_unit = dss_feat_get_buffer_size_unit(); 1075e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen unsigned ovl_fifo_size, total_fifo_size, burst_size; 1076e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen int i; 107783fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen 107883fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen burst_size = dispc_ovl_get_burst_size(plane); 1079e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen ovl_fifo_size = dispc_ovl_get_fifo_size(plane); 108083fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen 1081e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen if (use_fifomerge) { 1082e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen total_fifo_size = 0; 1083e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen for (i = 0; i < omap_dss_get_num_overlays(); ++i) 1084e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen total_fifo_size += dispc_ovl_get_fifo_size(i); 1085e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen } else { 1086e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen total_fifo_size = ovl_fifo_size; 1087e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen } 1088e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen 1089e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen /* 1090e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen * We use the same low threshold for both fifomerge and non-fifomerge 1091e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen * cases, but for fifomerge we calculate the high threshold using the 1092e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen * combined fifo size 1093e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen */ 1094e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen 1095f33f0eaff50112270a9e629569729ce5d5d620faTomi Valkeinen if (manual_update && dss_has_feature(FEAT_OMAP3_DSI_FIFO_BUG)) { 1096e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen *fifo_low = ovl_fifo_size - burst_size * 2; 1097e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen *fifo_high = total_fifo_size - burst_size; 1098e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen } else { 1099e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen *fifo_low = ovl_fifo_size - burst_size; 1100e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen *fifo_high = total_fifo_size - buf_unit; 1101e0e405b9252e5e8926786d796e0d4293bc90cd56Tomi Valkeinen } 110283fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen} 110383fa2f2e940dc21a204cff697d84d37214a91708Tomi Valkeinen 1104f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_fir(enum omap_plane plane, 11050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int hinc, int vinc, 11060d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain enum omap_color_component color_comp) 110780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 110880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 110980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 11100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) { 11110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 hinc_start, hinc_end, vinc_start, vinc_end; 1112a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 11130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dss_feat_get_reg_field(FEAT_REG_FIRHINC, 11140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain &hinc_start, &hinc_end); 11150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dss_feat_get_reg_field(FEAT_REG_FIRVINC, 11160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain &vinc_start, &vinc_end); 11170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain val = FLD_VAL(vinc, vinc_start, vinc_end) | 11180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain FLD_VAL(hinc, hinc_start, hinc_end); 1119a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 11200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dispc_write_reg(DISPC_OVL_FIR(plane), val); 11210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } else { 11220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0); 11230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dispc_write_reg(DISPC_OVL_FIR2(plane), val); 11240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 112580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 112680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1127f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu) 112880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 112980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 113087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja u8 hor_start, hor_end, vert_start, vert_end; 113180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 113287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 113387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 113487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 113587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja val = FLD_VAL(vaccu, vert_start, vert_end) | 113687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja FLD_VAL(haccu, hor_start, hor_end); 113787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 11389b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ACCU0(plane), val); 113980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 114080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1141f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu) 114280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 114380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 114487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja u8 hor_start, hor_end, vert_start, vert_end; 114580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 114687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 114787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 114887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 114987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja val = FLD_VAL(vaccu, vert_start, vert_end) | 115087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja FLD_VAL(haccu, hor_start, hor_end); 115187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 11529b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ACCU1(plane), val); 115380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 115480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1155f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_0(enum omap_plane plane, int haccu, 1156f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen int vaccu) 1157ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 1158ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain u32 val; 1159ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1160ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0); 1161ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_ACCU2_0(plane), val); 1162ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 1163ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1164f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_1(enum omap_plane plane, int haccu, 1165f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen int vaccu) 1166ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 1167ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain u32 val; 1168ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1169ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0); 1170ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_ACCU2_1(plane), val); 1171ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 117280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1173f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scale_param(enum omap_plane plane, 117480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 orig_width, u16 orig_height, 117580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 out_width, u16 out_height, 11760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool five_taps, u8 rotation, 11770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain enum omap_color_component color_comp) 117880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 11790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int fir_hinc, fir_vinc; 118080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1181ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain fir_hinc = 1024 * orig_width / out_width; 1182ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain fir_vinc = 1024 * orig_height / out_height; 118380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1184debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra dispc_ovl_set_scale_coef(plane, fir_hinc, fir_vinc, five_taps, 1185debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra color_comp); 1186f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_fir(plane, fir_hinc, fir_vinc, color_comp); 11870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 11880d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1189f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_common(enum omap_plane plane, 11900d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 11910d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 11920d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 11930d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 11940d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 11950d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 11960d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int accu0 = 0; 11970d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int accu1 = 0; 11980d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u32 l; 119980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1200f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scale_param(plane, orig_width, orig_height, 12010d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, five_taps, 12020d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation, DISPC_COLOR_COMPONENT_RGB_Y); 12039b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja l = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 120480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 120587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* RESIZEENABLE and VERTICALTAPS */ 120687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~((0x3 << 5) | (0x1 << 21)); 1207ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain l |= (orig_width != out_width) ? (1 << 5) : 0; 1208ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain l |= (orig_height != out_height) ? (1 << 6) : 0; 120987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l |= five_taps ? (1 << 21) : 0; 121080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 121187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* VRESIZECONF and HRESIZECONF */ 121287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_RESIZECONF)) { 121387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~(0x3 << 7); 12140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain l |= (orig_width <= out_width) ? 0 : (1 << 7); 12150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain l |= (orig_height <= out_height) ? 0 : (1 << 8); 121687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja } 121780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 121887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* LINEBUFFERSPLIT */ 121987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_LINEBUFFERSPLIT)) { 122087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~(0x1 << 22); 122187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l |= five_taps ? (1 << 22) : 0; 122287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja } 122380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 12249b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), l); 122580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 122680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 122780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 122880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 122980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 123080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace && !fieldmode) { 123180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu1 = 0; 12320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain accu0 = ((1024 * orig_height / out_height) / 2) & 0x3ff; 123380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (accu0 >= 1024/2) { 123480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu1 = 1024/2; 123580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu0 -= accu1; 123680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 123780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 123880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1239f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu0(plane, 0, accu0); 1240f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu1(plane, 0, accu1); 124180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 124280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1243f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_uv(enum omap_plane plane, 12440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 12450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 12460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 12470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 12480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 12490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 12500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int scale_x = out_width != orig_width; 12510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int scale_y = out_height != orig_height; 12520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) 12540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain return; 12550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if ((color_mode != OMAP_DSS_COLOR_YUV2 && 12560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain color_mode != OMAP_DSS_COLOR_UYVY && 12570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain color_mode != OMAP_DSS_COLOR_NV12)) { 12580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* reset chroma resampling for RGB formats */ 12590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 0, 8, 8); 12600d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain return; 12610d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 12620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain switch (color_mode) { 12630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_NV12: 12640d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 vertically*/ 12650d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_height >>= 1; 12660d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 horz.*/ 12670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width >>= 1; 12680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain break; 12690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_YUV2: 12700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_UYVY: 12710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /*For YUV422 with 90/270 rotation, 12720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain *we don't upsample chroma 12730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 12740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (rotation == OMAP_DSS_ROT_0 || 12750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation == OMAP_DSS_ROT_180) 12760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 hrz*/ 12770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width >>= 1; 12780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* must use FIR for YUV422 if rotated */ 12790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (rotation != OMAP_DSS_ROT_0) 12800d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_x = scale_y = true; 12810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain break; 12820d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain default: 12830d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain BUG(); 12840d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 12850d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12860d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (out_width != orig_width) 12870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_x = true; 12880d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (out_height != orig_height) 12890d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_y = true; 12900d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1291f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scale_param(plane, orig_width, orig_height, 12920d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, five_taps, 12930d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation, DISPC_COLOR_COMPONENT_UV); 12940d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12950d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 12960d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain (scale_x || scale_y) ? 1 : 0, 8, 8); 12970d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* set H scaling */ 12980d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_x ? 1 : 0, 5, 5); 12990d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* set V scaling */ 13000d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_y ? 1 : 0, 6, 6); 13010d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1302f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu2_0(plane, 0x80, 0); 1303f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu2_1(plane, 0x80, 0); 13040d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 13050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1306f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling(enum omap_plane plane, 13070d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 13080d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 13090d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 13100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 13110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 13120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 13130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 13140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1315f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scaling_common(plane, 13160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width, orig_height, 13170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, 13180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, 13190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain fieldmode, color_mode, 13200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation); 13210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1322f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scaling_uv(plane, 13230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width, orig_height, 13240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, 13250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, 13260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain fieldmode, color_mode, 13270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation); 13280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 13290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1330f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_rotation_attrs(enum omap_plane plane, u8 rotation, 133180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool mirroring, enum omap_color_mode color_mode) 133280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 133387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja bool row_repeat = false; 133487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja int vidrot = 0; 133587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 133680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 133780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) { 133880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 133980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (mirroring) { 134080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation) { 134180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 134280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 2; 134380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 134480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 134580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 1; 134680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 134780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 134880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 0; 134980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 135080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 135180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 3; 135280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 135380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 135480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 135580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation) { 135680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 135780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 0; 135880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 135980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 136080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 1; 136180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 136280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 136380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 2; 136480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 136580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 136680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 3; 136780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 136880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 136980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 137080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 137180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270) 137287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja row_repeat = true; 137380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 137487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja row_repeat = false; 137580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 137687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 13779b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), vidrot, 13, 12); 137887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_ROWREPEATENABLE)) 13799b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), 13809b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja row_repeat ? 1 : 0, 18, 18); 138180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 138280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 138380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic int color_mode_to_bpp(enum omap_color_mode color_mode) 138480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 138580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 138680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 138780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1; 138880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 138980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 2; 139080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 139180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 4; 139280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 1393f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_NV12: 139480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 8; 139580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB12U: 139680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB16: 139780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_ARGB16: 139880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_YUV2: 139980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_UYVY: 1400f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA16: 1401f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX16: 1402f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 1403f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 140480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 16; 140580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB24P: 140680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 24; 140780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB24U: 140880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_ARGB32: 140980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGBA32: 141080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGBX32: 141180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 32; 141280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 141380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 141480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 141580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 141680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 141780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic s32 pixinc(int pixels, u8 ps) 141880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 141980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pixels == 1) 142080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1; 142180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (pixels > 1) 142280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1 + (pixels - 1) * ps; 142380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (pixels < 0) 142480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1 - (-pixels + 1) * ps; 142580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 142680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 142780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 142880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 142980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_vrfb_rotation_offset(u8 rotation, bool mirror, 143080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 screen_width, 143180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 width, u16 height, 143280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode, bool fieldmode, 143380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset, 143480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned *offset0, unsigned *offset1, 143580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 *row_inc, s32 *pix_inc) 143680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 143780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u8 ps; 143880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 143980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FIXME CLUT formats */ 144080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 144180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 144280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 144380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 144480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 144580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 144680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 144780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_YUV2: 144880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_UYVY: 144980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = 4; 145080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 145180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 145280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = color_mode_to_bpp(color_mode) / 8; 145380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 145480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 145580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 145680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 145780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width, height); 145880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 145980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 146080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 146180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 146280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 146380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation + mirror * 4) { 146480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 146580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 146680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 146780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * If the pixel format is YUV or UYVY divide the width 146880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * of the image by 2 for 0 and 180 degree rotation. 146980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 147080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 147180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) 147280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width = width >> 1; 147380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 147480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 147580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 147680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 147780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = field_offset * screen_width * ps; 147880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 147980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = 0; 148080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 148180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 + (screen_width - width) + 148280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 148380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 148480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 148580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 148680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 148780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0 + 4: 148880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180 + 4: 148980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* If the pixel format is YUV or UYVY divide the width 149080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * of the image by 2 for 0 degree and 180 degree 149180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 149280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 149380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) 149480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width = width >> 1; 149580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90 + 4: 149680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270 + 4: 149780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 149880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 149980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = field_offset * screen_width * ps; 150080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 150180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = 0; 150280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 - (screen_width + width) - 150380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 150480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 150580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 150680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 150780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 150880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 150980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 151080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 151180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 151280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 151380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_dma_rotation_offset(u8 rotation, bool mirror, 151480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 screen_width, 151580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 width, u16 height, 151680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode, bool fieldmode, 151780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset, 151880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned *offset0, unsigned *offset1, 151980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 *row_inc, s32 *pix_inc) 152080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 152180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u8 ps; 152280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 fbw, fbh; 152380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 152480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FIXME CLUT formats */ 152580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 152680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 152780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 152880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 152980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 153080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 153180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 153280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 153380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = color_mode_to_bpp(color_mode) / 8; 153480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 153580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 153680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 153780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 153880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width, height); 153980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 154080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* width & height are overlay sizes, convert to fb sizes */ 154180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 154280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (rotation == OMAP_DSS_ROT_0 || rotation == OMAP_DSS_ROT_180) { 154380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbw = width; 154480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbh = height; 154580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 154680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbw = height; 154780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbh = width; 154880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 154980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 155080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 155180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 155280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 155380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 155480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation + mirror * 4) { 155580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 155680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 155780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 155880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * screen_width * ps; 155980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 156080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 156180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 + (screen_width - fbw) + 156280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 156380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 156480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 156580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 156680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 156780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = screen_width * (fbh - 1) * ps; 156880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 156980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * ps; 157080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 157180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 157280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * (fbh - 1) + 1 + 157380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), ps); 157480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-screen_width, ps); 157580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 157680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 157780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 157880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 157980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * screen_width * ps; 158080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 158180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 158280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-1 - 158380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (screen_width - fbw) - 158480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 158580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 158680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-1, ps); 158780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 158880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 158980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (fbw - 1) * ps; 159080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 159180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * ps; 159280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 159380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 159480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-screen_width * (fbh - 1) - 1 - 159580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), ps); 159680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(screen_width, ps); 159780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 159880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 159980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* mirroring */ 160080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0 + 4: 160180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (fbw - 1) * ps; 160280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 160380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * screen_width * ps; 160480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 160580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 160680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * 2 - 1 + 160780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 160880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 160980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-1, ps); 161080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 161180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 161280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90 + 4: 161380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 161480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 161580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * ps; 161680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 161780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 161880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-screen_width * (fbh - 1) + 1 + 161980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), 162080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 162180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(screen_width, ps); 162280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 162380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 162480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180 + 4: 162580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = screen_width * (fbh - 1) * ps; 162680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 162780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * screen_width * ps; 162880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 162980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 163080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 - screen_width * 2 - 163180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 163280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 163380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 163480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 163580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 163680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270 + 4: 163780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 163880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 163980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * ps; 164080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 164180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 164280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * (fbh - 1) - 1 - 164380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), 164480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 164580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-screen_width, ps); 164680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 164780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 164880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 164980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 165080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 165180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 165280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1653ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk_five_taps(enum omap_channel channel, u16 width, 1654ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 height, u16 out_width, u16 out_height, 1655ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal enum omap_color_mode color_mode) 165680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 165780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 fclk = 0; 165826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen u64 tmp, pclk = dispc_mgr_pclk_rate(channel); 165980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 16607282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (height <= out_height && width <= out_width) 16617282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return (unsigned long) pclk; 16627282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra 166380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (height > out_height) { 1664ebdc52499f56ddb63318e7bcb5e80b774bb80264Archit Taneja struct omap_dss_device *dssdev = dispc_mgr_get_device(channel); 1665ebdc52499f56ddb63318e7bcb5e80b774bb80264Archit Taneja unsigned int ppl = dssdev->panel.timings.x_res; 166680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 166780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * height * out_width; 166880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, 2 * out_height * ppl); 166980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = tmp; 167080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 16712d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä if (height > 2 * out_height) { 16722d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä if (ppl == out_width) 16732d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä return 0; 16742d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä 167580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * (height - 2 * out_height) * out_width; 167680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, 2 * out_height * (ppl - out_width)); 167780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = max(fclk, (u32) tmp); 167880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 167980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 168080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 168180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (width > out_width) { 168280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * width; 168380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, out_width); 168480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = max(fclk, (u32) tmp); 168580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 168680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_RGB24U) 168780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk <<= 1; 168880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 168980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 169080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return fclk; 169180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 169280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1693ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk(enum omap_channel channel, u16 width, 1694ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 height, u16 out_width, u16 out_height) 169580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 169680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int hf, vf; 169779ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja unsigned long pclk = dispc_mgr_pclk_rate(channel); 169880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 169980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 170080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * FIXME how to determine the 'A' factor 170180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * for the no downscaling case ? 170280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 170380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 170480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (width > 3 * out_width) 170580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 4; 170680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (width > 2 * out_width) 170780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 3; 170880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (width > out_width) 170980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 2; 171080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 171180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 1; 171280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 171380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (height > out_height) 171480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vf = 2; 171580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 171680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vf = 1; 171780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 17187282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (cpu_is_omap24xx()) { 17197282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (vf > 1 && hf > 1) 172079ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja return pclk * 4; 17217282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra else 172279ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja return pclk * 2; 17237282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else if (cpu_is_omap34xx()) { 172479ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja return pclk * vf * hf; 17257282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else { 172679ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja if (hf > 1) 172779ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja return DIV_ROUND_UP(pclk, out_width) * width; 172879ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja else 172979ee89cdbd9a58baa079d019574d11aa864b7842Archit Taneja return pclk; 17307282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 173180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 173280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 173379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Tanejastatic int dispc_ovl_calc_scaling(enum omap_plane plane, 173479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja enum omap_channel channel, u16 width, u16 height, 173579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja u16 out_width, u16 out_height, 173679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja enum omap_color_mode color_mode, bool *five_taps) 173779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja{ 173879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 17390373cac6cc7eef7ada03269288088e3cbee232c0Archit Taneja const int maxdownscale = dss_feat_get_param_max(FEAT_PARAM_DOWNSCALE); 17407282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra const int maxsinglelinewidth = 17417282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra dss_feat_get_param_max(FEAT_PARAM_LINEWIDTH); 174279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja unsigned long fclk = 0; 174379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 1744f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen if (width == out_width && height == out_height) 1745f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen return 0; 1746f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen 1747f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) 1748f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen return -EINVAL; 174979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 175079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (out_width < width / maxdownscale || 175179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_width > width * 8) 175279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 175379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 175479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (out_height < height / maxdownscale || 175579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_height > height * 8) 175679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 175779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 17587282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (cpu_is_omap24xx()) { 17597282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) 17607282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot scale max input width exceeded"); 17617282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra *five_taps = false; 17627282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk(channel, width, height, out_width, 17637282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height); 17647282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else if (cpu_is_omap34xx()) { 17657282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > (maxsinglelinewidth * 2)) { 17667282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot setup scaling"); 17677282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("width exceeds maximum width possible"); 17687282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17697282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17707282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk_five_taps(channel, width, height, out_width, 17717282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height, color_mode); 17727282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) { 17737282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (height > out_height && height < out_height * 2) 17747282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra *five_taps = false; 17757282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra else { 17767282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("cannot setup scaling with five taps"); 17777282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17787282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17797282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17807282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (!*five_taps) 17817282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk(channel, width, height, out_width, 17827282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height); 17837282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else { 17847282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) { 17857282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot scale width exceeds max line width"); 17867282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17877282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 178879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja fclk = calc_fclk(channel, width, height, out_width, 178979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_height); 179079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja } 179179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 179279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSDBG("required fclk rate = %lu Hz\n", fclk); 179379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSDBG("current fclk rate = %lu Hz\n", dispc_fclk_rate()); 179479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 179579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (!fclk || fclk > dispc_fclk_rate()) { 179679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSERR("failed to set up scaling, " 179779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja "required fclk rate = %lu Hz, " 179879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja "current fclk rate = %lu Hz\n", 179979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja fclk, dispc_fclk_rate()); 180079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 180179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja } 180279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 180379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return 0; 180479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja} 180579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 1806a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Tanejaint dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi, 18072cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen bool ilace, bool replication) 180880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 180979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 18107282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra bool five_taps = true; 181180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool fieldmode = 0; 181279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja int r, cconv = 0; 181380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned offset0, offset1; 181480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 row_inc; 181580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 pix_inc; 1816a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja u16 frame_height = oi->height; 181780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset = 0; 1818cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen u16 outw, outh; 18192cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen enum omap_channel channel; 18202cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 18212cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = dispc_ovl_get_channel_out(plane); 182280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1823a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja DSSDBG("dispc_ovl_setup %d, pa %x, pa_uv %x, sw %d, %d,%d, %dx%d -> " 1824f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen "%dx%d, cmode %x, rot %d, mir %d, ilace %d chan %d repl %d\n", 1825f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen plane, oi->paddr, oi->p_uv_addr, 1826c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja oi->screen_width, oi->pos_x, oi->pos_y, oi->width, oi->height, 1827c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja oi->out_width, oi->out_height, oi->color_mode, oi->rotation, 1828f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen oi->mirror, ilace, channel, replication); 1829e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 1830a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (oi->paddr == 0) 183180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 183280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1833cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw = oi->out_width == 0 ? oi->width : oi->out_width; 1834cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outh = oi->out_height == 0 ? oi->height : oi->out_height; 1835cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen 1836cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen if (ilace && oi->height == outh) 183780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fieldmode = 1; 183880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 183980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace) { 184080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (fieldmode) 1841a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->height /= 2; 1842a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->pos_y /= 2; 1843cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outh /= 2; 184480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 184580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("adjusting for ilace: height %d, pos_y %d, " 184680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen "out_height %d\n", 1847cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen oi->height, oi->pos_y, outh); 184880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 184980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1850a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (!dss_feat_color_mode_supported(plane, oi->color_mode)) 18518dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja return -EINVAL; 18528dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja 185379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja r = dispc_ovl_calc_scaling(plane, channel, oi->width, oi->height, 1854cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw, outh, oi->color_mode, 185579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja &five_taps); 185679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (r) 185779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return r; 185880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 185979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (oi->color_mode == OMAP_DSS_COLOR_YUV2 || 186079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja oi->color_mode == OMAP_DSS_COLOR_UYVY || 186179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja oi->color_mode == OMAP_DSS_COLOR_NV12) 186279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja cconv = 1; 186380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 186480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace && !fieldmode) { 186580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 186680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * when downscaling the bottom field may have to start several 186780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * source lines below the top field. Unfortunately ACCUI 186880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * registers will only hold the fractional part of the offset 186980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * so the integer part must be added to the base address of the 187080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * bottom field. 187180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 1872cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen if (!oi->height || oi->height == outh) 187380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen field_offset = 0; 187480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 1875cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen field_offset = oi->height / outh / 2; 187680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 187780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 187880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* Fields are independent but interleaved in memory. */ 187980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (fieldmode) 188080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen field_offset = 1; 188180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1882a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (oi->rotation_type == OMAP_DSS_ROT_DMA) 1883a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja calc_dma_rotation_offset(oi->rotation, oi->mirror, 1884a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->screen_width, oi->width, frame_height, 1885a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, fieldmode, field_offset, 188680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen &offset0, &offset1, &row_inc, &pix_inc); 188780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 1888a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja calc_vrfb_rotation_offset(oi->rotation, oi->mirror, 1889a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->screen_width, oi->width, frame_height, 1890a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, fieldmode, field_offset, 189180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen &offset0, &offset1, &row_inc, &pix_inc); 189280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 189380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", 189480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen offset0, offset1, row_inc, pix_inc); 189580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1896a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_color_mode(plane, oi->color_mode); 189780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1898a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba0(plane, oi->paddr + offset0); 1899a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba1(plane, oi->paddr + offset1); 190080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1901a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (OMAP_DSS_COLOR_NV12 == oi->color_mode) { 1902a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba0_uv(plane, oi->p_uv_addr + offset0); 1903a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba1_uv(plane, oi->p_uv_addr + offset1); 19040d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 19050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 19060d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1907f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_row_inc(plane, row_inc); 1908f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_pix_inc(plane, pix_inc); 190980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1910a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja DSSDBG("%d,%d %dx%d -> %dx%d\n", oi->pos_x, oi->pos_y, oi->width, 1911cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen oi->height, outw, outh); 191280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1913a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pos(plane, oi->pos_x, oi->pos_y); 191480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1915a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pic_size(plane, oi->width, oi->height); 191680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 191779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) { 1918a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_scaling(plane, oi->width, oi->height, 1919cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw, outh, 19200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, fieldmode, 1921a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, oi->rotation); 1922cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen dispc_ovl_set_vid_size(plane, outw, outh); 1923f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_color_conv(plane, cconv); 192480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 192580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1926a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_rotation_attrs(plane, oi->rotation, oi->mirror, 1927a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode); 192880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 192954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja dispc_ovl_set_zorder(plane, oi->zorder); 1930a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pre_mult_alpha(plane, oi->pre_mult_alpha); 1931a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_setup_global_alpha(plane, oi->global_alpha); 193280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1933c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja dispc_ovl_enable_replication(plane, replication); 1934c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja 193580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 193680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 193780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1938f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenint dispc_ovl_enable(enum omap_plane plane, bool enable) 193980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1940e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen DSSDBG("dispc_enable_plane %d, %d\n", plane, enable); 1941e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 19429b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 0, 0); 1943e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 1944e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return 0; 194580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 194680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 194780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_disable_isr(void *data, u32 mask) 194880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 194980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion *compl = data; 195080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete(compl); 195180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 195280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 19532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void _enable_lcd_out(enum omap_channel channel, bool enable) 195480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1955b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD2) { 19562a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, enable ? 1 : 0, 0, 0); 1957b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen /* flush posted write */ 1958b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL2); 1959b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen } else { 19602a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0); 1961b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL); 1962b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen } 196380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 196480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 196526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_lcd_out(enum omap_channel channel, bool enable) 196680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 196780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion frame_done_completion; 196880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool is_on; 196980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 19702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal u32 irq; 197180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 197280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we disable LCD output, we need to wait until frame is done. 197380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Otherwise the DSS is still working, and turning off the clocks 197480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * prevents DSS from going to OFF mode */ 19752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal is_on = channel == OMAP_DSS_CHANNEL_LCD2 ? 19762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_GET(DISPC_CONTROL2, 0, 0) : 19772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_GET(DISPC_CONTROL, 0, 0); 19782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 19792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal irq = channel == OMAP_DSS_CHANNEL_LCD2 ? DISPC_IRQ_FRAMEDONE2 : 19802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DISPC_IRQ_FRAMEDONE; 198180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 198280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!enable && is_on) { 198380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen init_completion(&frame_done_completion); 198480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 198580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_disable_isr, 19862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal &frame_done_completion, irq); 198780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 198880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 198980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("failed to register FRAMEDONE isr\n"); 199080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 199180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 19922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal _enable_lcd_out(channel, enable); 199380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 199480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!enable && is_on) { 199580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!wait_for_completion_timeout(&frame_done_completion, 199680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen msecs_to_jiffies(100))) 199780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("timeout waiting for FRAME DONE\n"); 199880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 199980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_unregister_isr(dispc_disable_isr, 20002a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal &frame_done_completion, irq); 200180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 200280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 200380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("failed to unregister FRAMEDONE isr\n"); 200480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 200580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 200680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 200780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _enable_digit_out(bool enable) 200880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 200980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1); 2010b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen /* flush posted write */ 2011b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL); 201280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 201380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 201426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_digit_out(bool enable) 201580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 201680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion frame_done_completion; 2017e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen enum dss_hdmi_venc_clk_source_select src; 2018e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen int r, i; 2019e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen u32 irq_mask; 2020e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen int num_irqs; 202180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2022e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen if (REG_GET(DISPC_CONTROL, 1, 1) == enable) 202380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 202480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2025e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen src = dss_get_hdmi_venc_clk_source(); 2026e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen 202780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (enable) { 202880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 202980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we enable digit output, we'll get an extra digit 203080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * sync lost interrupt, that we need to ignore */ 203180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 203280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT; 203380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 203480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 203580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 203680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 203780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we disable digit output, we need to wait until fields are done. 203880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Otherwise the DSS is still working, and turning off the clocks 203980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * prevents DSS from going to OFF mode. And when enabling, we need to 204080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * wait for the extra sync losts */ 204180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen init_completion(&frame_done_completion); 204280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2043e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen if (src == DSS_HDMI_M_PCLK && enable == false) { 2044e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask = DISPC_IRQ_FRAMEDONETV; 2045e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen num_irqs = 1; 2046e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } else { 2047e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask = DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD; 2048e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen /* XXX I understand from TRM that we should only wait for the 2049e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen * current field to complete. But it seems we have to wait for 2050e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen * both fields */ 2051e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen num_irqs = 2; 2052e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } 2053e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen 205480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion, 2055e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask); 205680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 2057e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("failed to register %x isr\n", irq_mask); 205880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 205980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _enable_digit_out(enable); 206080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2061e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen for (i = 0; i < num_irqs; ++i) { 2062e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen if (!wait_for_completion_timeout(&frame_done_completion, 2063e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen msecs_to_jiffies(100))) 2064e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("timeout waiting for digit out to %s\n", 2065e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen enable ? "start" : "stop"); 2066e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } 206780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2068e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen r = omap_dispc_unregister_isr(dispc_disable_isr, &frame_done_completion, 2069e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask); 207080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 2071e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("failed to unregister %x isr\n", irq_mask); 207280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 207380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (enable) { 207480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 207580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 2076e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST_DIGIT; 207780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); 207880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 207980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 208080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 208180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 208280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 208326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_is_enabled(enum omap_channel channel) 2084a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{ 2085a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD) 2086a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen return !!REG_GET(DISPC_CONTROL, 0, 0); 2087a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_DIGIT) 2088a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen return !!REG_GET(DISPC_CONTROL, 1, 1); 20892a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (channel == OMAP_DSS_CHANNEL_LCD2) 20902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return !!REG_GET(DISPC_CONTROL2, 0, 0); 2091a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else 2092a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen BUG(); 2093a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen} 2094a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen 209526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable(enum omap_channel channel, bool enable) 2096a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{ 2097dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 209826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_enable_lcd_out(channel, enable); 2099a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_DIGIT) 210026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_enable_digit_out(enable); 2101a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else 2102a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen BUG(); 2103a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen} 2104a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen 210580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal_polarity(bool act_high) 210680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21076ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_LCDENABLEPOL)) 21086ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 21096ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 211080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29); 211180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 211280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 211380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal(bool enable) 211480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21156ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_LCDENABLESIGNAL)) 21166ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 21176ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 211880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28); 211980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 212080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 212180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_pck_free_enable(bool enable) 212280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21236ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_PCKFREEENABLE)) 21246ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 21256ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 212680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27); 212780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 212880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 212926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_fifohandcheck(enum omap_channel channel, bool enable) 213080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21312a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 21322a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, enable ? 1 : 0, 16, 16); 21332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 21342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16); 213580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 213680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 213780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 213826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_display_type(enum omap_channel channel, 213964ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal enum omap_lcd_display_type type) 214080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 214180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int mode; 214280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 214380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (type) { 214480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_LCD_DISPLAY_STN: 214580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mode = 0; 214680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 214780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 214880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_LCD_DISPLAY_TFT: 214980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mode = 1; 215080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 215180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 215280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 215380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 215480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 215580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 215680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 21572a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 21582a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, mode, 3, 3); 21592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 21602a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3); 216180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 216280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 216380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_loadmode(enum omap_dss_load_mode mode) 216480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 216580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1); 216680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 216780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 216880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2169c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_default_color(enum omap_channel channel, u32 color) 217080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21718613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal dispc_write_reg(DISPC_DEFAULT_COLOR(channel), color); 217280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 217380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2174c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_trans_key(enum omap_channel ch, 217580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_dss_trans_key_type type, 217680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 trans_key) 217780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 217880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 217980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, type, 11, 11); 21802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 218180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, type, 13, 13); 21822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else /* OMAP_DSS_CHANNEL_LCD2 */ 21832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, type, 11, 11); 218480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 21858613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal dispc_write_reg(DISPC_TRANS_COLOR(ch), trans_key); 218680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 218780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2188c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable) 218980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 219080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 219180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10); 21922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 219380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12); 21942a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else /* OMAP_DSS_CHANNEL_LCD2 */ 21952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10); 219680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 219711354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja 2198c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, 2199c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen bool enable) 220080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 220111354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) 220280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 220380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 220480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 220580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18); 22062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 220780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19); 220880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 220911354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja 2210c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenvoid dispc_mgr_setup(enum omap_channel channel, 2211c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen struct omap_overlay_manager_info *info) 2212c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen{ 2213c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_default_color(channel, info->default_color); 2214c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_trans_key(channel, info->trans_key_type, info->trans_key); 2215c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_trans_key(channel, info->trans_enabled); 2216c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_alpha_fixed_zorder(channel, 2217c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen info->partial_alpha_enabled); 2218c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 2219c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_cpr(channel, info->cpr_enable); 2220c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_cpr_coef(channel, &info->cpr_coefs); 2221c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen } 2222c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen} 222380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 222426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines) 222580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 222680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int code; 222780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 222880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (data_lines) { 222980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 12: 223080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 0; 223180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 223280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 16: 223380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 1; 223480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 223580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 18: 223680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 2; 223780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 223880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 24: 223980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 3; 224080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 224180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 224280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 224380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 224480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 224580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 22462a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 22472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, code, 9, 8); 22482a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 22492a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, code, 9, 8); 225080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 225180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2252569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode) 225380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 225480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 2255569969d6015f846926267cc40ed5fec936717f68Archit Taneja int gpout0, gpout1; 225680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 225780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (mode) { 2258569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_RESET: 2259569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 0; 2260569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout1 = 0; 226180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 2262569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_RFBI: 2263569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 1; 226480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen gpout1 = 0; 226580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 2266569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_BYPASS: 2267569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 1; 226880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen gpout1 = 1; 226980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 227080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 227180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 227280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 227380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 227480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2275569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = dispc_read_reg(DISPC_CONTROL); 2276569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = FLD_MOD(l, gpout0, 15, 15); 2277569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = FLD_MOD(l, gpout1, 16, 16); 2278569969d6015f846926267cc40ed5fec936717f68Archit Taneja dispc_write_reg(DISPC_CONTROL, l); 2279569969d6015f846926267cc40ed5fec936717f68Archit Taneja} 2280569969d6015f846926267cc40ed5fec936717f68Archit Taneja 2281569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable) 2282569969d6015f846926267cc40ed5fec936717f68Archit Taneja{ 2283569969d6015f846926267cc40ed5fec936717f68Archit Taneja if (channel == OMAP_DSS_CHANNEL_LCD2) 2284569969d6015f846926267cc40ed5fec936717f68Archit Taneja REG_FLD_MOD(DISPC_CONTROL2, enable, 11, 11); 2285569969d6015f846926267cc40ed5fec936717f68Archit Taneja else 2286569969d6015f846926267cc40ed5fec936717f68Archit Taneja REG_FLD_MOD(DISPC_CONTROL, enable, 11, 11); 228780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 228880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 228980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, 229080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int vsw, int vfp, int vbp) 229180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 229280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { 229380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (hsw < 1 || hsw > 64 || 229480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hfp < 1 || hfp > 256 || 229580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hbp < 1 || hbp > 256 || 229680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vsw < 1 || vsw > 64 || 229780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vfp < 0 || vfp > 255 || 229880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vbp < 0 || vbp > 255) 229980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return false; 230080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 230180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (hsw < 1 || hsw > 256 || 230280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hfp < 1 || hfp > 4096 || 230380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hbp < 1 || hbp > 4096 || 230480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vsw < 1 || vsw > 256 || 230580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vfp < 0 || vfp > 4095 || 230680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vbp < 0 || vbp > 4095) 230780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return false; 230880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 230980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 231080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return true; 231180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 231280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 231380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_lcd_timings_ok(struct omap_video_timings *timings) 231480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 231580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return _dispc_lcd_timings_ok(timings->hsw, timings->hfp, 231680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hbp, timings->vsw, 231780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vfp, timings->vbp); 231880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 231980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 232026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw, 232164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal int hfp, int hbp, int vsw, int vfp, int vbp) 232280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 232380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 timing_h, timing_v; 232480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 232580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { 232680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) | 232780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(hbp-1, 27, 20); 232880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 232980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) | 233080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(vbp, 27, 20); 233180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 233280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) | 233380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(hbp-1, 31, 20); 233480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 233580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_v = FLD_VAL(vsw-1, 7, 0) | FLD_VAL(vfp, 19, 8) | 233680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(vbp, 31, 20); 233780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 233880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 233964ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal dispc_write_reg(DISPC_TIMING_H(channel), timing_h); 234064ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal dispc_write_reg(DISPC_TIMING_V(channel), timing_v); 234180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 234280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 234380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* change name to mode? */ 234426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_timings(enum omap_channel channel, 234564ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal struct omap_video_timings *timings) 234680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 234780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned xtot, ytot; 234880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long ht, vt; 234980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 235080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp, 235180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hbp, timings->vsw, 235280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vfp, timings->vbp)) 235380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 235480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 235526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen _dispc_mgr_set_lcd_timings(channel, timings->hsw, timings->hfp, 235664ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal timings->hbp, timings->vsw, timings->vfp, 235764ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal timings->vbp); 235880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 235926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_set_lcd_size(channel, timings->x_res, timings->y_res); 236080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 236180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp; 236280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp; 236380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 236480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ht = (timings->pixel_clock * 1000) / xtot; 236580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vt = (timings->pixel_clock * 1000) / xtot / ytot; 236680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 23672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DSSDBG("channel %d xres %u yres %u\n", channel, timings->x_res, 23682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal timings->y_res); 236980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("pck %u\n", timings->pixel_clock); 237080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", 237180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hsw, timings->hfp, timings->hbp, 237280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vsw, timings->vfp, timings->vbp); 237380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 237480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt); 237580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 237680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 237726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_set_lcd_divisor(enum omap_channel channel, u16 lck_div, 2378ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 pck_div) 237980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 238080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(lck_div < 1); 23819eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen BUG_ON(pck_div < 1); 238280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2383ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer dispc_write_reg(DISPC_DIVISORo(channel), 238480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0)); 238580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 238680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 238726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_get_lcd_divisor(enum omap_channel channel, int *lck_div, 23882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal int *pck_div) 238980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 239080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 2391ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer l = dispc_read_reg(DISPC_DIVISORo(channel)); 239280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *lck_div = FLD_GET(l, 23, 16); 239380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pck_div = FLD_GET(l, 7, 0); 239480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 239580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 239680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenunsigned long dispc_fclk_rate(void) 239780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 2398a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 239980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r = 0; 240080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 240166534e8e936a0b926863df90054dc59826d70528Archit Taneja switch (dss_get_dispc_clk_source()) { 240289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 24034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = clk_get_rate(dispc.dss_clk); 240466534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 240589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2406a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 2407a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 240866534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 24095a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 24105a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 24115a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 24125a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 241366534e8e936a0b926863df90054dc59826d70528Archit Taneja default: 241466534e8e936a0b926863df90054dc59826d70528Archit Taneja BUG(); 241566534e8e936a0b926863df90054dc59826d70528Archit Taneja } 241666534e8e936a0b926863df90054dc59826d70528Archit Taneja 241780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 241880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 241980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 242026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_lclk_rate(enum omap_channel channel) 242180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 2422a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 242380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int lcd; 242480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r; 242580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 242680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2427ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer l = dispc_read_reg(DISPC_DIVISORo(channel)); 242880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 242980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen lcd = FLD_GET(l, 23, 16); 243080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2431ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja switch (dss_get_lcd_clk_source(channel)) { 243289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 24334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = clk_get_rate(dispc.dss_clk); 2434ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 243589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2436a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 2437a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 2438ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 24395a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 24405a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 24415a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 24425a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 2443ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja default: 2444ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja BUG(); 2445ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja } 244680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 244780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r / lcd; 244880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 244980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 245026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_pclk_rate(enum omap_channel channel) 245180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 245280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r; 245380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2454c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja if (dispc_mgr_is_lcd(channel)) { 2455c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja int pcd; 2456c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja u32 l; 245780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2458c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja l = dispc_read_reg(DISPC_DIVISORo(channel)); 245980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2460c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja pcd = FLD_GET(l, 7, 0); 246180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2462c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja r = dispc_mgr_lclk_rate(channel); 2463c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 2464c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return r / pcd; 2465c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } else { 2466c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja struct omap_dss_device *dssdev = 2467c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja dispc_mgr_get_device(channel); 2468c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 2469c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja switch (dssdev->type) { 2470c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja case OMAP_DISPLAY_TYPE_VENC: 2471c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return venc_get_pixel_clock(); 2472c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja case OMAP_DISPLAY_TYPE_HDMI: 2473c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return hdmi_get_pixel_clock(); 2474c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja default: 2475c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja BUG(); 2476c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } 2477c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } 247880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 247980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 248080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_clocks(struct seq_file *s) 248180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 248280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int lcd, pcd; 24830cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer u32 l; 248489a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(); 248589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source lcd_clk_src; 248680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 24874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dispc_runtime_get()) 24884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 248980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 249080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen seq_printf(s, "- DISPC -\n"); 249180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2492067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja seq_printf(s, "dispc fclk source = %s (%s)\n", 2493067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_get_generic_clk_source_name(dispc_clk_src), 2494067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_feat_get_clk_source_name(dispc_clk_src)); 249580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 249680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen seq_printf(s, "fck\t\t%-16lu\n", dispc_fclk_rate()); 24972a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 24980cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 24990cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer seq_printf(s, "- DISPC-CORE-CLK -\n"); 25000cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = dispc_read_reg(DISPC_DIVISOR); 25010cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer lcd = FLD_GET(l, 23, 16); 25020cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 25030cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 25040cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer (dispc_fclk_rate()/lcd), lcd); 25050cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer } 25062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "- LCD1 -\n"); 25072a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2508ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD); 2509ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 2510ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja seq_printf(s, "lcd1_clk source = %s (%s)\n", 2511ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_get_generic_clk_source_name(lcd_clk_src), 2512ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_feat_get_clk_source_name(lcd_clk_src)); 2513ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 251426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD, &lcd, &pcd); 25152a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2516ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 251726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD), lcd); 2518ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal seq_printf(s, "pck\t\t%-16lupck div\t%u\n", 251926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD), pcd); 25202a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 25212a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "- LCD2 -\n"); 25222a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2523ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD2); 2524ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 2525ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja seq_printf(s, "lcd2_clk source = %s (%s)\n", 2526ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_get_generic_clk_source_name(lcd_clk_src), 2527ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_feat_get_clk_source_name(lcd_clk_src)); 2528ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 252926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD2, &lcd, &pcd); 253080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 25312a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 253226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD2), lcd); 25332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "pck\t\t%-16lupck div\t%u\n", 253426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD2), pcd); 25352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 25364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 25374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 253880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 253980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2540dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 2541dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenvoid dispc_dump_irqs(struct seq_file *s) 2542dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen{ 2543dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long flags; 2544dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dispc_irq_stats stats; 2545dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2546dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_lock_irqsave(&dispc.irq_stats_lock, flags); 2547dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2548dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats = dispc.irq_stats; 2549dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen memset(&dispc.irq_stats, 0, sizeof(dispc.irq_stats)); 2550dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dispc.irq_stats.last_reset = jiffies; 2551dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2552dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_unlock_irqrestore(&dispc.irq_stats_lock, flags); 2553dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2554dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "period %u ms\n", 2555dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen jiffies_to_msecs(jiffies - stats.last_reset)); 2556dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2557dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "irqs %d\n", stats.irq_count); 2558dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \ 2559dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "%-20s %10d\n", #x, stats.irqs[ffs(DISPC_IRQ_##x)-1]); 2560dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2561dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(FRAMEDONE); 2562dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VSYNC); 2563dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(EVSYNC_EVEN); 2564dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(EVSYNC_ODD); 2565dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ACBIAS_COUNT_STAT); 2566dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PROG_LINE_NUM); 2567dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(GFX_FIFO_UNDERFLOW); 2568dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(GFX_END_WIN); 2569dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PAL_GAMMA_MASK); 2570dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(OCP_ERR); 2571dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID1_FIFO_UNDERFLOW); 2572dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID1_END_WIN); 2573dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID2_FIFO_UNDERFLOW); 2574dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID2_END_WIN); 2575b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) { 2576b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_FIFO_UNDERFLOW); 2577b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_END_WIN); 2578b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja } 2579dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(SYNC_LOST); 2580dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(SYNC_LOST_DIGIT); 2581dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(WAKEUP); 25822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 25832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(FRAMEDONE2); 25842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(VSYNC2); 25852a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(ACBIAS_COUNT_STAT2); 25862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(SYNC_LOST2); 25872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 2588dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS 2589dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen} 2590dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 2591dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 259280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_regs(struct seq_file *s) 259380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 25944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja int i, j; 25954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char *mgr_names[] = { 25964dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_LCD] = "LCD", 25974dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_DIGIT] = "TV", 25984dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_LCD2] = "LCD2", 25994dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja }; 26004dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char *ovl_names[] = { 26014dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_GFX] = "GFX", 26024dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_VIDEO1] = "VID1", 26034dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_VIDEO2] = "VID2", 2604b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja [OMAP_DSS_VIDEO3] = "VID3", 26054dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja }; 26064dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char **p_names; 26074dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26089b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r)) 260980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dispc_runtime_get()) 26114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 261280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26135010be80127eedfd1237627810d9f75e02036111Archit Taneja /* DISPC common registers */ 261480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_REVISION); 261580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_SYSCONFIG); 261680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_SYSSTATUS); 261780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_IRQSTATUS); 261880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_IRQENABLE); 261980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CONTROL); 262080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CONFIG); 262180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CAPABLE); 262280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_LINE_STATUS); 262380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_LINE_NUMBER); 262411354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 262511354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 2626332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen DUMPREG(DISPC_GLOBAL_ALPHA); 26272a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 26282a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DUMPREG(DISPC_CONTROL2); 26292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DUMPREG(DISPC_CONFIG2); 26305010be80127eedfd1237627810d9f75e02036111Archit Taneja } 26315010be80127eedfd1237627810d9f75e02036111Archit Taneja 26325010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG 26335010be80127eedfd1237627810d9f75e02036111Archit Taneja 26345010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(i, name) name(i) 26354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja#define DUMPREG(i, r) seq_printf(s, "%s(%s)%*s %08x\n", #r, p_names[i], \ 26364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 48 - strlen(#r) - strlen(p_names[i]), " ", \ 26375010be80127eedfd1237627810d9f75e02036111Archit Taneja dispc_read_reg(DISPC_REG(i, r))) 26385010be80127eedfd1237627810d9f75e02036111Archit Taneja 26394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja p_names = mgr_names; 26405010be80127eedfd1237627810d9f75e02036111Archit Taneja 26414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* DISPC channel specific registers */ 26424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 26434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DEFAULT_COLOR); 26444dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TRANS_COLOR); 26454dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_SIZE_MGR); 264680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26474dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 26484dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja continue; 26495010be80127eedfd1237627810d9f75e02036111Archit Taneja 26504dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DEFAULT_COLOR); 26514dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TRANS_COLOR); 26524dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TIMING_H); 26534dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TIMING_V); 26544dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_POL_FREQ); 26554dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DIVISORo); 26564dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_SIZE_MGR); 26575010be80127eedfd1237627810d9f75e02036111Archit Taneja 26584dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE1); 26594dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE2); 26604dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE3); 26612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2662332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 26634dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_R); 26644dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_G); 26654dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_B); 2666332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 26672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 266880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26694dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja p_names = ovl_names; 26704dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26714dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 26724dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA0); 26734dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA1); 26744dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_POSITION); 26754dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_SIZE); 26764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ATTRIBUTES); 26774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIFO_THRESHOLD); 26784dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS); 26794dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ROW_INC); 26804dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PIXEL_INC); 26814dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_PRELOAD)) 26824dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PRELOAD); 26834dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26844dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (i == OMAP_DSS_GFX) { 26854dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_WINDOW_SKIP); 26864dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_TABLE_BA); 26874dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja continue; 26884dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 26894dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26904dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR); 26914dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PICTURE_SIZE); 26924dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU0); 26934dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU1); 26944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 26954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA0_UV); 26964dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA1_UV); 26974dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR2); 26984dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU2_0); 26994dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU2_1); 27004dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 27014dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_ATTR2)) 27024dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ATTRIBUTES2); 27034dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_PRELOAD)) 27044dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PRELOAD); 2705ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 27065010be80127eedfd1237627810d9f75e02036111Archit Taneja 27075010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG 27085010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG 27095010be80127eedfd1237627810d9f75e02036111Archit Taneja 27105010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(plane, name, i) name(plane, i) 27115010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DUMPREG(plane, name, i) \ 27124dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja seq_printf(s, "%s_%d(%s)%*s %08x\n", #name, i, p_names[plane], \ 27134dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 46 - strlen(#name) - strlen(p_names[plane]), " ", \ 27145010be80127eedfd1237627810d9f75e02036111Archit Taneja dispc_read_reg(DISPC_REG(plane, name, i))) 27155010be80127eedfd1237627810d9f75e02036111Archit Taneja 27164dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* Video pipeline coefficient registers */ 2717332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen 27184dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* start from OMAP_DSS_VIDEO1 */ 27194dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 1; i < dss_feat_get_num_ovls(); i++) { 27204dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27214dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_H, j); 27229b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 27234dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27244dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_HV, j); 27255010be80127eedfd1237627810d9f75e02036111Archit Taneja 27264dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 5; j++) 27274dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_CONV_COEF, j); 2728ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 27294dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 27304dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27314dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_V, j); 27324dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 27334dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 27344dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 27354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_H2, j); 27374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 27384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_HV2, j); 27404dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 27414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 27424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_V2, j); 27434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 2744332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 274580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 27464fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 27475010be80127eedfd1237627810d9f75e02036111Archit Taneja 27485010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG 274980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef DUMPREG 275080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 275180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 275226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_pol_freq(enum omap_channel channel, bool onoff, 275326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen bool rf, bool ieo, bool ipc, bool ihs, bool ivs, u8 acbi, 275426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen u8 acb) 275580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 275680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l = 0; 275780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 275880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n", 275980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen onoff, rf, ieo, ipc, ihs, ivs, acbi, acb); 276080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 276180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(onoff, 17, 17); 276280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(rf, 16, 16); 276380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ieo, 15, 15); 276480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ipc, 14, 14); 276580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ihs, 13, 13); 276680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ivs, 12, 12); 276780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(acbi, 11, 8); 276880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(acb, 7, 0); 276980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2770ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal dispc_write_reg(DISPC_POL_FREQ(channel), l); 277180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 277280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 277326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_pol_freq(enum omap_channel channel, 2774ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal enum omap_panel_config config, u8 acbi, u8 acb) 277580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 277626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen _dispc_mgr_set_pol_freq(channel, (config & OMAP_DSS_LCD_ONOFF) != 0, 277780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_RF) != 0, 277880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IEO) != 0, 277980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IPC) != 0, 278080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IHS) != 0, 278180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IVS) != 0, 278280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen acbi, acb); 278380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 278480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 278580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* with fck as input clock rate, find dispc dividers that produce req_pck */ 278680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_find_clk_divs(bool is_tft, unsigned long req_pck, unsigned long fck, 278780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct dispc_clock_info *cinfo) 278880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 27899eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen u16 pcd_min, pcd_max; 279080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long best_pck; 279180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 best_ld, cur_ld; 279280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 best_pd, cur_pd; 279380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 27949eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_min = dss_feat_get_param_min(FEAT_PARAM_DSS_PCD); 27959eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_max = dss_feat_get_param_max(FEAT_PARAM_DSS_PCD); 27969eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen 27979eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen if (!is_tft) 27989eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_min = 3; 27999eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen 280080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pck = 0; 280180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_ld = 0; 280280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pd = 0; 280380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 280480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (cur_ld = 1; cur_ld <= 255; ++cur_ld) { 280580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long lck = fck / cur_ld; 280680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 28079eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen for (cur_pd = pcd_min; cur_pd <= pcd_max; ++cur_pd) { 280880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long pck = lck / cur_pd; 280980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen long old_delta = abs(best_pck - req_pck); 281080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen long new_delta = abs(pck - req_pck); 281180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 281280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (best_pck == 0 || new_delta < old_delta) { 281380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pck = pck; 281480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_ld = cur_ld; 281580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pd = cur_pd; 281680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 281780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pck == req_pck) 281880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen goto found; 281980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 282080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pck < req_pck) 282280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 282380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 282480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (lck / pcd_min < req_pck) 282680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 282780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 282880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenfound: 283080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck_div = best_ld; 283180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck_div = best_pd; 283280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = fck / cinfo->lck_div; 283380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 283480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 283580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 283680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* calculate clock rates using dividers in cinfo */ 283780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint dispc_calc_clock_rates(unsigned long dispc_fclk_rate, 283880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct dispc_clock_info *cinfo) 283980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 284080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cinfo->lck_div > 255 || cinfo->lck_div == 0) 284180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 28429eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen if (cinfo->pck_div < 1 || cinfo->pck_div > 255) 284380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 284480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 284580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = dispc_fclk_rate / cinfo->lck_div; 284680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 284780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 284880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 284980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 285080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_set_clock_div(enum omap_channel channel, 2852ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal struct dispc_clock_info *cinfo) 285380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 285480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("lck = %lu (%u)\n", cinfo->lck, cinfo->lck_div); 285580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("pck = %lu (%u)\n", cinfo->pck, cinfo->pck_div); 285680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_set_lcd_divisor(channel, cinfo->lck_div, cinfo->pck_div); 285880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 286080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 286180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 286226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_get_clock_div(enum omap_channel channel, 2863ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal struct dispc_clock_info *cinfo) 286480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 286580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long fck; 286680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 286780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fck = dispc_fclk_rate(); 286880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2869ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer cinfo->lck_div = REG_GET(DISPC_DIVISORo(channel), 23, 16); 2870ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer cinfo->pck_div = REG_GET(DISPC_DIVISORo(channel), 7, 0); 287180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 287280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = fck / cinfo->lck_div; 287380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 287480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 287580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 287680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 287780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 287880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* dispc.irq_lock has to be locked by the caller */ 287980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void) 288080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 288180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 mask; 288280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 old_mask; 288380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 288480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 288580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mask = dispc.irq_error_mask; 288780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 288980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 289080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 289180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr == NULL) 289280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 289380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 289480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mask |= isr_data->mask; 289580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 289680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 289780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen old_mask = dispc_read_reg(DISPC_IRQENABLE); 289880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* clear the irqstatus for newly enabled irqs */ 289980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask); 290080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 290180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQENABLE, mask); 290280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 290380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 290480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask) 290580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 290680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 290780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ret; 290880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 290980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 291080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 291180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr == NULL) 291280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 291380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 291480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 291580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 291680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* check for duplicate entry */ 291780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 291880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 291980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr == isr && isr_data->arg == arg && 292080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask == mask) { 292180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = -EINVAL; 292280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen goto err; 292380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 292480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 292580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 292680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = NULL; 292780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = -EBUSY; 292880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 292980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 293080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 293180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 293280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr != NULL) 293380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 293480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 293580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr = isr; 293680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->arg = arg; 293780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask = mask; 293880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = 0; 293980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 294080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 294180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 294280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2943b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen if (ret) 2944b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen goto err; 2945b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen 294680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 294780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 294880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 294980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 295080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 295180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenerr: 295280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 295380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 295480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return ret; 295580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 295680c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_register_isr); 295780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 295880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask) 295980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 296080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 296180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 296280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ret = -EINVAL; 296380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 296480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 296580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 296680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 296780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 296880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 296980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr != isr || isr_data->arg != arg || 297080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask != mask) 297180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 297280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 297380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* found the correct isr */ 297480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 297580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr = NULL; 297680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->arg = NULL; 297780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask = 0; 297880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 297980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = 0; 298080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 298180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 298280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ret == 0) 298480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 298580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 298780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return ret; 298980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 299080c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_unregister_isr); 299180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 299280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG 299380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void print_irq_status(u32 status) 299480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 299580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if ((status & dispc.irq_error_mask) == 0) 299680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 299780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 299880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status); 299980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 300080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define PIS(x) \ 300180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (status & DISPC_IRQ_##x) \ 300280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk(#x " "); 300380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(GFX_FIFO_UNDERFLOW); 300480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(OCP_ERR); 300580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(VID1_FIFO_UNDERFLOW); 300680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(VID2_FIFO_UNDERFLOW); 3007b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) 3008b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_FIFO_UNDERFLOW); 300980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(SYNC_LOST); 301080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(SYNC_LOST_DIGIT); 30112a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 30122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(SYNC_LOST2); 301380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef PIS 301480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 301580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk("\n"); 301680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 301780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 301880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 301980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* Called from dss.c. Note that we don't touch clocks here, 302080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * but we presume they are on because we got an IRQ. However, 302180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * an irq handler may turn the clocks off, so we may not have 302280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * clock later in the function. */ 3023affe360d13e54b415cde2f11cee02369b4ed54bdArchit Tanejastatic irqreturn_t omap_dispc_irq_handler(int irq, void *arg) 302480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 302580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 3026affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja u32 irqstatus, irqenable; 302780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 handledirqs = 0; 302880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 unhandled_errors; 302980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 303080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; 303180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock(&dispc.irq_lock); 303380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqstatus = dispc_read_reg(DISPC_IRQSTATUS); 3035affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja irqenable = dispc_read_reg(DISPC_IRQENABLE); 3036affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 3037affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja /* IRQ is not for us */ 3038affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (!(irqstatus & irqenable)) { 3039affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja spin_unlock(&dispc.irq_lock); 3040affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return IRQ_NONE; 3041affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 304280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3043dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 3044dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_lock(&dispc.irq_stats_lock); 3045dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dispc.irq_stats.irq_count++; 3046dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dss_collect_irq_stats(irqstatus, dispc.irq_stats.irqs); 3047dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_unlock(&dispc.irq_stats_lock); 3048dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 3049dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 305080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG 305180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (dss_debug) 305280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen print_irq_status(irqstatus); 305380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 305480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* Ack the interrupt. Do it here before clocks are possibly turned 305580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * off */ 305680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, irqstatus); 305780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* flush posted write */ 305880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_read_reg(DISPC_IRQSTATUS); 305980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 306080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* make a copy and unlock, so that isrs can unregister 306180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * themselves */ 306280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen memcpy(registered_isr, dispc.registered_isr, 306380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen sizeof(registered_isr)); 306480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 306580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock(&dispc.irq_lock); 306680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 306780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 306880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = ®istered_isr[i]; 306980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 307080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!isr_data->isr) 307180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 307280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 307380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->mask & irqstatus) { 307480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr(isr_data->arg, irqstatus); 307580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen handledirqs |= isr_data->mask; 307680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 307780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 307880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 307980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock(&dispc.irq_lock); 308080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 308180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask; 308280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 308380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (unhandled_errors) { 308480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.error_irqs |= unhandled_errors; 308580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 308680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask &= ~unhandled_errors; 308780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 308880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 308980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen schedule_work(&dispc.error_work); 309080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 309180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 309280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock(&dispc.irq_lock); 3093affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 3094affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return IRQ_HANDLED; 309580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 309680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 309780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_error_worker(struct work_struct *work) 309880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 309980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 310080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 errors; 310180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 3102fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen static const unsigned fifo_underflow_bits[] = { 3103fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_GFX_FIFO_UNDERFLOW, 3104fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_VID1_FIFO_UNDERFLOW, 3105fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_VID2_FIFO_UNDERFLOW, 3106b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja DISPC_IRQ_VID3_FIFO_UNDERFLOW, 3107fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen }; 3108fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 3109fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen static const unsigned sync_lost_bits[] = { 3110fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST, 3111fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST_DIGIT, 3112fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST2, 3113fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen }; 311480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 311580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 311680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen errors = dispc.error_irqs; 311780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.error_irqs = 0; 311880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 311980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 312013eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin dispc_runtime_get(); 312113eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin 3122fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlays(); ++i) { 3123fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_overlay *ovl; 3124fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen unsigned bit; 312580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3126fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl = omap_dss_get_overlay(i); 3127fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bit = fifo_underflow_bits[i]; 312880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3129fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (bit & errors) { 3130fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DSSERR("FIFO UNDERFLOW on %s, disabling the overlay\n", 3131fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl->name); 3132f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_enable(ovl->id, false); 313326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_go(ovl->manager->id); 313480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mdelay(50); 313580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 313680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 313780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3138fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { 3139fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_overlay_manager *mgr; 3140fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen unsigned bit; 314180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3142fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 3143fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bit = sync_lost_bits[i]; 314480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3145fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (bit & errors) { 3146fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_dss_device *dssdev = mgr->device; 3147fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bool enable; 314880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3149fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DSSERR("SYNC_LOST on channel %s, restarting the output " 3150fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen "with video overlays disabled\n", 3151fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen mgr->name); 31522a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 3153fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen enable = dssdev->state == OMAP_DSS_DISPLAY_ACTIVE; 3154fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen dssdev->driver->disable(dssdev); 31552a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 31562a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal for (i = 0; i < omap_dss_get_num_overlays(); ++i) { 31572a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal struct omap_overlay *ovl; 31582a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal ovl = omap_dss_get_overlay(i); 31592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 3160fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (ovl->id != OMAP_DSS_GFX && 3161fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl->manager == mgr) 3162f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_enable(ovl->id, false); 31632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 316526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_go(mgr->id); 31662a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal mdelay(50); 3167fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 31682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (enable) 31692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal dssdev->driver->enable(dssdev); 31702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 317380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (errors & DISPC_IRQ_OCP_ERR) { 317480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("OCP_ERR\n"); 317580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { 317680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_overlay_manager *mgr; 317780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 317800f17e4560da32db454c46faf1e8df4fe35cc226Rob Clark if (mgr->device && mgr->device->driver) 317900f17e4560da32db454c46faf1e8df4fe35cc226Rob Clark mgr->device->driver->disable(mgr->device); 318080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 318180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 318280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 318380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 318480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask |= errors; 318580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 318680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 318713eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin 318813eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin dispc_runtime_put(); 318980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 319080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout) 319280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 319380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void dispc_irq_wait_handler(void *data, u32 mask) 319480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen { 319580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete((struct completion *)data); 319680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 319780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 319980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 320080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, 320280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqmask); 320380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 320580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 320680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout = wait_for_completion_timeout(&completion, timeout); 320880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); 321080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == 0) 321280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ETIMEDOUT; 321380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == -ERESTARTSYS) 321580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ERESTARTSYS; 321680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 321880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 321980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 322080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, 322180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long timeout) 322280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 322380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void dispc_irq_wait_handler(void *data, u32 mask) 322480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen { 322580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete((struct completion *)data); 322680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 322780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 322880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 322980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 323080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, 323280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqmask); 323380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 323580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 323680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout = wait_for_completion_interruptible_timeout(&completion, 323880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout); 323980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); 324180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == 0) 324380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ETIMEDOUT; 324480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == -ERESTARTSYS) 324680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ERESTARTSYS; 324780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 324980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 325080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 325180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC 325280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_fake_vsync_irq(void) 325380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 325480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 irqstatus = DISPC_IRQ_VSYNC; 325580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 325680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3257ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen WARN_ON(!in_interrupt()); 325880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 325980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 326080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 326180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 326280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 326380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!isr_data->isr) 326480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 326580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 326680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->mask & irqstatus) 326780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr(isr_data->arg, irqstatus); 326880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 326980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 327080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 327180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 327280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initialize_irq(void) 327380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 327480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 327580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 327680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 327780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 327880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr)); 327980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 328080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; 32812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 32822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2; 3283b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) 3284b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja dispc.irq_error_mask |= DISPC_IRQ_VID3_FIFO_UNDERFLOW; 328580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 328680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* there's SYNC_LOST_DIGIT waiting after enabling the DSS, 328780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * so clear it */ 328880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS)); 328980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 329080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 329180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 329280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 329380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 329480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 329580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_sidle(void) 329680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 329780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3); /* SIDLEMODE: smart idle */ 329880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 329980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 330080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_disable_sidle(void) 330180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 330280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */ 330380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 330480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 330580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initial_config(void) 330680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 330780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 330880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 33090cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer /* Exclusively enable DISPC_CORE_CLK and set divider to 1 */ 33100cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 33110cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = dispc_read_reg(DISPC_DIVISOR); 33120cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer /* Use DISPC_DIVISOR.LCD, instead of DISPC_DIVISOR1.LCD */ 33130cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = FLD_MOD(l, 1, 0, 0); 33140cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = FLD_MOD(l, 1, 23, 16); 33150cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer dispc_write_reg(DISPC_DIVISOR, l); 33160cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer } 33170cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 331880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FUNCGATED */ 33196ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (dss_has_feature(FEAT_FUNCGATED)) 33206ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9); 332180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 332280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _dispc_setup_color_conv_coef(); 332380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 332480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY); 332580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 332680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_read_plane_fifo_sizes(); 33275ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 33285ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen dispc_configure_burst_sizes(); 332954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 333054128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja dispc_ovl_enable_zorder_planes(); 333180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 333280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3333060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy/* DISPC HW IP initialisation */ 3334060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_probe(struct platform_device *pdev) 3335060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3336060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy u32 rev; 3337affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja int r = 0; 3338ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy struct resource *dispc_mem; 33394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *clk; 3340ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy 3341060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy dispc.pdev = pdev; 3342060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3343060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy spin_lock_init(&dispc.irq_lock); 3344060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3345060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 3346060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy spin_lock_init(&dispc.irq_stats_lock); 3347060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy dispc.irq_stats.last_reset = jiffies; 3348060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#endif 3349060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3350060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy INIT_WORK(&dispc.error_work, dispc_error_worker); 3351060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3352ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0); 3353ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy if (!dispc_mem) { 3354ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy DSSERR("can't get IORESOURCE_MEM DISPC\n"); 3355cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -EINVAL; 3356ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy } 3357cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 33586e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall dispc.base = devm_ioremap(&pdev->dev, dispc_mem->start, 33596e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall resource_size(dispc_mem)); 3360060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy if (!dispc.base) { 3361060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy DSSERR("can't ioremap DISPC\n"); 3362cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENOMEM; 3363affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 3364cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 3365affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja dispc.irq = platform_get_irq(dispc.pdev, 0); 3366affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (dispc.irq < 0) { 3367affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("platform_get_irq failed\n"); 3368cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENODEV; 3369affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 3370affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 33716e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall r = devm_request_irq(&pdev->dev, dispc.irq, omap_dispc_irq_handler, 33726e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall IRQF_SHARED, "OMAP DISPC", dispc.pdev); 3373affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (r < 0) { 3374affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("request_irq failed\n"); 3375cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return r; 3376cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen } 3377cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 3378cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen clk = clk_get(&pdev->dev, "fck"); 3379cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen if (IS_ERR(clk)) { 3380cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen DSSERR("can't get fck\n"); 3381cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen r = PTR_ERR(clk); 3382cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return r; 3383060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy } 3384060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3385cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen dispc.dss_clk = clk; 3386cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 33874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_enable(&pdev->dev); 33884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dispc_runtime_get(); 33904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 33914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_runtime_get; 3392060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3393060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy _omap_dispc_initial_config(); 3394060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3395060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy _omap_dispc_initialize_irq(); 3396060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3397060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy rev = dispc_read_reg(DISPC_REVISION); 3398a06b62f8004bd95c132fa312e8593c9a10f466ecSumit Semwal dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n", 3399060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 3400060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 34014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 3402060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3403060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return 0; 34044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_runtime_get: 34064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 34074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dispc.dss_clk); 3408affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return r; 3409060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3410060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3411060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_remove(struct platform_device *pdev) 3412060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 34134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 34144fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34154fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dispc.dss_clk); 34164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3417060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return 0; 3418060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3419060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 34204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_suspend(struct device *dev) 34214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 34224fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_save_context(); 34234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 34244fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 34264fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 34274fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_resume(struct device *dev) 34294fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 34304fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 34314fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34324fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dss_runtime_get(); 34334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r < 0) 34344fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r; 34354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 343649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc_restore_context(); 34374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 34394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 34404fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34414fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dispc_pm_ops = { 34424fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_suspend = dispc_runtime_suspend, 34434fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_resume = dispc_runtime_resume, 34444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}; 34454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3446060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic struct platform_driver omap_dispchw_driver = { 3447060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .probe = omap_dispchw_probe, 3448060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .remove = omap_dispchw_remove, 3449060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .driver = { 3450060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .name = "omapdss_dispc", 3451060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .owner = THIS_MODULE, 34524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .pm = &dispc_pm_ops, 3453060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy }, 3454060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}; 3455060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3456060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyint dispc_init_platform_driver(void) 3457060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3458060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return platform_driver_register(&omap_dispchw_driver); 3459060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3460060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3461060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyvoid dispc_uninit_platform_driver(void) 3462060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3463060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return platform_driver_unregister(&omap_dispchw_driver); 3464060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3465