dispc.c revision 6e2a14d2c59f6208310eeb6b031e9d1c22b38c6a
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/sram.h> 4180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <plat/clock.h> 4280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 43a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h> 4480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include "dss.h" 46a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja#include "dss_features.h" 479b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#include "dispc.h" 4880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* DISPC */ 508613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal#define DISPC_SZ_REGS SZ_4K 5180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_IRQ_MASK_ERROR (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \ 5380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_OCP_ERR | \ 5480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_VID1_FIFO_UNDERFLOW | \ 5580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_VID2_FIFO_UNDERFLOW | \ 5680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_SYNC_LOST | \ 5780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DISPC_IRQ_SYNC_LOST_DIGIT) 5880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_MAX_NR_ISRS 8 6080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 6180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstruct omap_dispc_isr_data { 6280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_isr_t isr; 6380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void *arg; 6480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 mask; 6580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}; 6680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 675ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenenum omap_burst_size { 685ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X2 = 0, 695ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X4 = 1, 705ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen BURST_SIZE_X8 = 2, 715ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}; 725ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 7380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_GET(idx, start, end) \ 7480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_GET(dispc_read_reg(idx), start, end) 7580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 7680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_FLD_MOD(idx, val, start, end) \ 7780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(idx, FLD_MOD(dispc_read_reg(idx), val, start, end)) 7880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 79dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenstruct dispc_irq_stats { 80dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long last_reset; 81dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned irq_count; 82dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned irqs[32]; 83dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen}; 84dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 8580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic struct { 86060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy struct platform_device *pdev; 8780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void __iomem *base; 884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int ctx_loss_cnt; 904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 91affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja int irq; 924fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *dss_clk; 9380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 94e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja u32 fifo_size[MAX_DSS_OVERLAYS]; 9580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spinlock_t irq_lock; 9780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 irq_error_mask; 9880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; 9980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 error_irqs; 10080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct work_struct error_work; 10180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen bool ctx_valid; 10380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 ctx[DISPC_SZ_REGS / sizeof(u32)]; 104dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 105dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 106dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spinlock_t irq_stats_lock; 107dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dispc_irq_stats irq_stats; 108dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 10980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} dispc; 11080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainenum omap_color_component { 1120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* used for all color formats for OMAP3 and earlier 1130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * and for RGB and Y color component on OMAP4 1140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 1150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain DISPC_COLOR_COMPONENT_RGB_Y = 1 << 0, 1160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* used for UV component for 1170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_UYVY, OMAP_DSS_COLOR_NV12 1180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain * color formats on OMAP4 1190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 1200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain DISPC_COLOR_COMPONENT_UV = 1 << 1, 1210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}; 1220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void); 12480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 12555978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline void dispc_write_reg(const u16 idx, u32 val) 12680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 12755978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja __raw_writel(val, dispc.base + idx); 12880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 12980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 13055978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline u32 dispc_read_reg(const u16 idx) 13180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 13255978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja return __raw_readl(dispc.base + idx); 13380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 13480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 13549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinenstatic int dispc_get_ctx_loss_count(void) 13649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen{ 13749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct device *dev = &dispc.pdev->dev; 13849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct omap_display_platform_data *pdata = dev->platform_data; 13949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen struct omap_dss_board_info *board_data = pdata->board_data; 14049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen int cnt; 14149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (!board_data->get_context_loss_count) 14349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return -ENOENT; 14449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen cnt = board_data->get_context_loss_count(dev); 14649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen WARN_ONCE(cnt < 0, "get_context_loss_count failed: %d\n", cnt); 14849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 14949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return cnt; 15049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen} 15149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 15280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define SR(reg) \ 15355978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja dispc.ctx[DISPC_##reg / sizeof(u32)] = dispc_read_reg(DISPC_##reg) 15480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define RR(reg) \ 15555978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja dispc_write_reg(DISPC_##reg, dispc.ctx[DISPC_##reg / sizeof(u32)]) 15680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1574fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_save_context(void) 15880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 159c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja int i, j; 16080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_save_context\n"); 1624fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 16380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(IRQENABLE); 16480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(CONTROL); 16580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(CONFIG); 16680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen SR(LINE_NUMBER); 16711354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 16811354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 169332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen SR(GLOBAL_ALPHA); 1702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 1712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal SR(CONTROL2); 1722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal SR(CONFIG2); 1732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 17480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 175c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 176c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DEFAULT_COLOR(i)); 177c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TRANS_COLOR(i)); 178c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(SIZE_MGR(i)); 179c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 180c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 181c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TIMING_H(i)); 182c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(TIMING_V(i)); 183c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(POL_FREQ(i)); 184c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DIVISORo(i)); 185c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 186c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE1(i)); 187c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE2(i)); 188c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(DATA_CYCLE3(i)); 189c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 190332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 191c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_R(i)); 192c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_G(i)); 193c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(CPR_COEF_B(i)); 194332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 1952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 19680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 197c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 198c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA0(i)); 199c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA1(i)); 200c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_POSITION(i)); 201c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_SIZE(i)); 202c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ATTRIBUTES(i)); 203c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIFO_THRESHOLD(i)); 204c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ROW_INC(i)); 205c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PIXEL_INC(i)); 206c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_PRELOAD)) 207c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PRELOAD(i)); 208c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_GFX) { 209c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_WINDOW_SKIP(i)); 210c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_TABLE_BA(i)); 211c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 212c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 213c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR(i)); 214c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_PICTURE_SIZE(i)); 215c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU0(i)); 216c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU1(i)); 2179b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 218c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 219c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_H(i, j)); 220ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 221c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 222c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_HV(i, j)); 223ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 224c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 5; j++) 225c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_CONV_COEF(i, j)); 226ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 227c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 228c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 229c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_V(i, j)); 230c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 2319b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 232c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 233c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA0_UV(i)); 234c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_BA1_UV(i)); 235c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR2(i)); 236c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU2_0(i)); 237c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ACCU2_1(i)); 238ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 239c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 240c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_H2(i, j)); 241ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 242c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 243c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_HV2(i, j)); 244ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 245c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 246c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_FIR_COEF_V2(i, j)); 247c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 248c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_ATTR2)) 249c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja SR(OVL_ATTRIBUTES2(i)); 250ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 2510cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 2520cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) 2530cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer SR(DIVISOR); 25449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 25549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_loss_cnt = dispc_get_ctx_loss_count(); 25649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_valid = true; 25749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 25849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("context saved, ctx_loss_count %d\n", dispc.ctx_loss_cnt); 25980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 26080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_restore_context(void) 26280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 263c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja int i, j, ctx; 2644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 2654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_restore_context\n"); 2664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 26749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (!dispc.ctx_valid) 26849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return; 26949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen ctx = dispc_get_ctx_loss_count(); 27149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen if (ctx >= 0 && ctx == dispc.ctx_loss_cnt) 27349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen return; 27449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("ctx_loss_count: saved %d, current %d\n", 27649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc.ctx_loss_cnt, ctx); 27749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 27875c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /*RR(IRQENABLE);*/ 27980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /*RR(CONTROL);*/ 28080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(CONFIG); 28180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(LINE_NUMBER); 28211354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 28311354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 284332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen RR(GLOBAL_ALPHA); 285c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_MGR_LCD2)) 2862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal RR(CONFIG2); 28780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 289c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DEFAULT_COLOR(i)); 290c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TRANS_COLOR(i)); 291c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(SIZE_MGR(i)); 292c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 293c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 294c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TIMING_H(i)); 295c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(TIMING_V(i)); 296c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(POL_FREQ(i)); 297c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DIVISORo(i)); 298c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja 299c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE1(i)); 300c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE2(i)); 301c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(DATA_CYCLE3(i)); 3022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 303332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 304c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_R(i)); 305c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_G(i)); 306c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(CPR_COEF_B(i)); 307332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 3082a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 30980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 310c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 311c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA0(i)); 312c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA1(i)); 313c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_POSITION(i)); 314c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_SIZE(i)); 315c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ATTRIBUTES(i)); 316c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIFO_THRESHOLD(i)); 317c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ROW_INC(i)); 318c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PIXEL_INC(i)); 319c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_PRELOAD)) 320c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PRELOAD(i)); 321c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (i == OMAP_DSS_GFX) { 322c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_WINDOW_SKIP(i)); 323c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_TABLE_BA(i)); 324c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja continue; 325c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 326c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR(i)); 327c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_PICTURE_SIZE(i)); 328c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU0(i)); 329c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU1(i)); 3309b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 331c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 332c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_H(i, j)); 333ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 334c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 335c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_HV(i, j)); 336ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 337c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 5; j++) 338c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_CONV_COEF(i, j)); 339ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 340c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 341c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 342c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_V(i, j)); 343c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 3449b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 345c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 346c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA0_UV(i)); 347c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_BA1_UV(i)); 348c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR2(i)); 349c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU2_0(i)); 350c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ACCU2_1(i)); 351ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 352c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 353c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_H2(i, j)); 354ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 355c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 356c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_HV2(i, j)); 357ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 358c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja for (j = 0; j < 8; j++) 359c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_FIR_COEF_V2(i, j)); 360c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja } 361c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja if (dss_has_feature(FEAT_ATTR2)) 362c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja RR(OVL_ATTRIBUTES2(i)); 363ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 36480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3650cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) 3660cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer RR(DIVISOR); 3670cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 36880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* enable last, because LCD & DIGIT enable are here */ 36980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen RR(CONTROL); 3702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 3712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal RR(CONTROL2); 37275c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /* clear spurious SYNC_LOST_DIGIT interrupts */ 37375c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); 37475c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä 37575c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä /* 37675c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä * enable last so IRQs won't trigger before 37775c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä * the context is fully restored 37875c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä */ 37975c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä RR(IRQENABLE); 38049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen 38149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen DSSDBG("context restored\n"); 38280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 38380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 38480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef SR 38580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef RR 38680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenint dispc_runtime_get(void) 3884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 3894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 3904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_runtime_get\n"); 3924fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3934fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = pm_runtime_get_sync(&dispc.pdev->dev); 3944fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 3954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r < 0 ? r : 0; 3964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 3974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3984fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenvoid dispc_runtime_put(void) 3994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 4004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 4014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dispc_runtime_put\n"); 4034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = pm_runtime_put(&dispc.pdev->dev); 4054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 40680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 40780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 408dac57a05fcf4808bbc91a96a034cae84716f0077Archit Tanejastatic inline bool dispc_mgr_is_lcd(enum omap_channel channel) 409dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja{ 410dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (channel == OMAP_DSS_CHANNEL_LCD || 411dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja channel == OMAP_DSS_CHANNEL_LCD2) 412dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja return true; 413dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja else 414dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja return false; 415dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja} 4164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 417c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Tanejastatic struct omap_dss_device *dispc_mgr_get_device(enum omap_channel channel) 418c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja{ 419c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja struct omap_overlay_manager *mgr = 420c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja omap_dss_get_overlay_manager(channel); 421c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 422c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return mgr ? mgr->device : NULL; 423c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja} 424c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 4253dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinenu32 dispc_mgr_get_vsync_irq(enum omap_channel channel) 4263dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen{ 4273dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen switch (channel) { 4283dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD: 4293dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_VSYNC; 4303dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD2: 4313dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_VSYNC2; 4323dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen case OMAP_DSS_CHANNEL_DIGIT: 4333dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen return DISPC_IRQ_EVSYNC_ODD | DISPC_IRQ_EVSYNC_EVEN; 4343dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen default: 4353dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen BUG(); 4363dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen } 4373dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen} 4383dcec4d6ba65a4e14987f48e8d98c4290ceb2c29Tomi Valkeinen 4397d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinenu32 dispc_mgr_get_framedone_irq(enum omap_channel channel) 4407d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen{ 4417d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen switch (channel) { 4427d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD: 4437d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return DISPC_IRQ_FRAMEDONE; 4447d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_LCD2: 4457d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return DISPC_IRQ_FRAMEDONE2; 4467d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen case OMAP_DSS_CHANNEL_DIGIT: 4477d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen return 0; 4487d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen default: 4497d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen BUG(); 4507d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen } 4517d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen} 4527d1365c998a462d8ea3627e87526227556b63351Tomi Valkeinen 45326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_go_busy(enum omap_channel channel) 45480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 45580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int bit; 45680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 457dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 45880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 5; /* GOLCD */ 45980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 46080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 6; /* GODIGIT */ 46180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4652a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return REG_GET(DISPC_CONTROL, bit, bit) == 1; 46680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 46780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 46826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_go(enum omap_channel channel) 46980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 47080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int bit; 4712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal bool enable_bit, go_bit; 47280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 473dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 47480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 0; /* LCDENABLE */ 47580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 47680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 1; /* DIGITALENABLE */ 47780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 47880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* if the channel is not enabled, we don't need GO */ 4792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal enable_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal enable_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1; 4832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 4842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (!enable_bit) 485e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return; 48680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 487dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 48880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 5; /* GOLCD */ 48980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 49080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bit = 6; /* GODIGIT */ 49180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 4922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 4932a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal go_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1; 4942a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 4952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal go_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1; 4962a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 4972a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (go_bit) { 49880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("GO bit not down for channel %d\n", channel); 499e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return; 50080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 50180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" : 5032a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal (channel == OMAP_DSS_CHANNEL_LCD2 ? "LCD2" : "DIGIT")); 50480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 5062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, 1, bit, bit); 5072a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 5082a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, 1, bit, bit); 50980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 51080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 511f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh_reg(enum omap_plane plane, int reg, u32 value) 51280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5139b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_H(plane, reg), value); 51480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 51580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 516f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv_reg(enum omap_plane plane, int reg, u32 value) 51780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5189b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_HV(plane, reg), value); 51980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 52080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 521f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv_reg(enum omap_plane plane, int reg, u32 value) 52280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 5239b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIR_COEF_V(plane, reg), value); 52480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 52580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 526f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh2_reg(enum omap_plane plane, int reg, u32 value) 527ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 528ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 529ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 530ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_H2(plane, reg), value); 531ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 532ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 533f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv2_reg(enum omap_plane plane, int reg, 534f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen u32 value) 535ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 536ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 537ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 538ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_HV2(plane, reg), value); 539ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 540ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 541f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv2_reg(enum omap_plane plane, int reg, u32 value) 542ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 543ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 544ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 545ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_FIR_COEF_V2(plane, reg), value); 546ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 547ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 548debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatrastatic void dispc_ovl_set_scale_coef(enum omap_plane plane, int fir_hinc, 549debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra int fir_vinc, int five_taps, 550debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra enum omap_color_component color_comp) 55180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 552debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra const struct dispc_coef *h_coef, *v_coef; 55380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 55480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 555debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra h_coef = dispc_ovl_get_scale_coef(fir_hinc, true); 556debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra v_coef = dispc_ovl_get_scale_coef(fir_vinc, five_taps); 55780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 55880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < 8; i++) { 55980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 h, hv; 56080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 561debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra h = FLD_VAL(h_coef[i].hc0_vc00, 7, 0) 562debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc1_vc0, 15, 8) 563debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc2_vc1, 23, 16) 564debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(h_coef[i].hc3_vc2, 31, 24); 565debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra hv = FLD_VAL(h_coef[i].hc4_vc22, 7, 0) 566debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc1_vc0, 15, 8) 567debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc2_vc1, 23, 16) 568debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc3_vc2, 31, 24); 56980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 5700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) { 571f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firh_reg(plane, i, h); 572f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firhv_reg(plane, i, hv); 5730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } else { 574f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firh2_reg(plane, i, h); 575f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firhv2_reg(plane, i, hv); 5760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 5770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 57880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 57980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 58066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas if (five_taps) { 58166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas for (i = 0; i < 8; i++) { 58266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas u32 v; 583debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra v = FLD_VAL(v_coef[i].hc0_vc00, 7, 0) 584debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra | FLD_VAL(v_coef[i].hc4_vc22, 15, 8); 5850d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) 586f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firv_reg(plane, i, v); 5870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain else 588f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_write_firv2_reg(plane, i, v); 58966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas } 59080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 59180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 59280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 59380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_setup_color_conv_coef(void) 59480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 595ac01c29e5279fe31632e9118619b365514633235Archit Taneja int i; 59680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen const struct color_conv_coef { 59780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ry, rcr, rcb, gy, gcr, gcb, by, bcr, bcb; 59880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int full_range; 59980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } ctbl_bt601_5 = { 60080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298, 409, 0, 298, -208, -100, 298, 0, 517, 0, 60180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen }; 60280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen const struct color_conv_coef *ct; 60480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0)) 60680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 60780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ct = &ctbl_bt601_5; 60880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 609ac01c29e5279fe31632e9118619b365514633235Archit Taneja for (i = 1; i < dss_feat_get_num_ovls(); i++) { 610ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 0), 611ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->rcr, ct->ry)); 612ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 1), 613ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->gy, ct->rcb)); 614ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 2), 615ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->gcb, ct->gcr)); 616ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 3), 617ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(ct->bcr, ct->by)); 618ac01c29e5279fe31632e9118619b365514633235Archit Taneja dispc_write_reg(DISPC_OVL_CONV_COEF(i, 4), 619ac01c29e5279fe31632e9118619b365514633235Archit Taneja CVAL(0, ct->bcb)); 620ac01c29e5279fe31632e9118619b365514633235Archit Taneja 621ac01c29e5279fe31632e9118619b365514633235Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), ct->full_range, 622ac01c29e5279fe31632e9118619b365514633235Archit Taneja 11, 11); 623ac01c29e5279fe31632e9118619b365514633235Archit Taneja } 62480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 62580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef CVAL 62680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 62780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 62880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 629f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0(enum omap_plane plane, u32 paddr) 63080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 6319b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_BA0(plane), paddr); 63280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 63380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 634f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1(enum omap_plane plane, u32 paddr) 63580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 6369b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_BA1(plane), paddr); 63780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 63880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 639f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0_uv(enum omap_plane plane, u32 paddr) 640ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 641ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_BA0_UV(plane), paddr); 642ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 643ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 644f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr) 645ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 646ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr); 647ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 648ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 649f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pos(enum omap_plane plane, int x, int y) 65080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 65180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0); 6529b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6539b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_POSITION(plane), val); 65480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 65580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 656f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pic_size(enum omap_plane plane, int width, int height) 65780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 65880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 6599b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6609b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja if (plane == OMAP_DSS_GFX) 6619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_SIZE(plane), val); 6629b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja else 6639b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_PICTURE_SIZE(plane), val); 66480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 66580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 666f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_size(enum omap_plane plane, int width, int height) 66780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 66880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 66980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 67080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(plane == OMAP_DSS_GFX); 67180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 67280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 6739b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 6749b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_SIZE(plane), val); 67580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 67680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 67754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Tanejastatic void dispc_ovl_set_zorder(enum omap_plane plane, u8 zorder) 67854128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja{ 67954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 68054128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68154128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0) 68254128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja return; 68354128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68454128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), zorder, 27, 26); 68554128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja} 68654128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 68754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Tanejastatic void dispc_ovl_enable_zorder_planes(void) 68854128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja{ 68954128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja int i; 69054128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 69154128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja if (!dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 69254128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja return; 69354128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 69454128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) 69554128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25); 69654128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja} 69754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 698f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pre_mult_alpha(enum omap_plane plane, bool enable) 699fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N{ 700f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen struct omap_overlay *ovl = omap_dss_get_overlay(plane); 701fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 702f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA) == 0) 703fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N return; 704fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 7059b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 28, 28); 706fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N} 707fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N 708f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_setup_global_alpha(enum omap_plane plane, u8 global_alpha) 70980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 710b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 0, 8, 16, 24, }; 711fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen int shift; 712f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen struct omap_overlay *ovl = omap_dss_get_overlay(plane); 713fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 714f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0) 715fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N return; 716a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 717fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 718fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, shift + 7, shift); 71980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 72080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 721f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pix_inc(enum omap_plane plane, s32 inc) 72280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 7239b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_PIXEL_INC(plane), inc); 72480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 72580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 726f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_row_inc(enum omap_plane plane, s32 inc) 72780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 7289b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc); 72980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 73080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 731f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_color_mode(enum omap_plane plane, 73280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode) 73380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 73480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 m = 0; 735f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain if (plane != OMAP_DSS_GFX) { 736f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain switch (color_mode) { 737f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_NV12: 738f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x0; break; 739f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB12U: 740f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x1; break; 741f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA16: 742f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x2; break; 743f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX16: 744f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x4; break; 745f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16: 746f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x5; break; 747f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB16: 748f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x6; break; 749f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 750f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x7; break; 751f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24U: 752f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x8; break; 753f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24P: 754f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x9; break; 755f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_YUV2: 756f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xa; break; 757f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_UYVY: 758f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xb; break; 759f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB32: 760f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xc; break; 761f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA32: 762f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xd; break; 763f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX32: 764f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xe; break; 765f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 766f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xf; break; 767f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain default: 768f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain BUG(); break; 769f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } 770f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } else { 771f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain switch (color_mode) { 772f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT1: 773f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x0; break; 774f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT2: 775f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x1; break; 776f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT4: 777f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x2; break; 778f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_CLUT8: 779f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x3; break; 780f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB12U: 781f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x4; break; 782f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16: 783f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x5; break; 784f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB16: 785f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x6; break; 786f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 787f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x7; break; 788f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24U: 789f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x8; break; 790f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGB24P: 791f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0x9; break; 792f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_YUV2: 793f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xa; break; 794f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_UYVY: 795f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xb; break; 796f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB32: 797f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xc; break; 798f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA32: 799f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xd; break; 800f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX32: 801f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xe; break; 802f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 803f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain m = 0xf; break; 804f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain default: 805f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain BUG(); break; 806f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain } 80780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 80880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8099b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), m, 4, 1); 81080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 81180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 812f427984e896fde6ae03056cf1f8ac5d4a99275d4Tomi Valkeinenvoid dispc_ovl_set_channel_out(enum omap_plane plane, enum omap_channel channel) 81380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 81480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int shift; 81580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 8162a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal int chan = 0, chan2 = 0; 81780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 81880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (plane) { 81980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_GFX: 82080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen shift = 8; 82180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 82280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_VIDEO1: 82380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_VIDEO2: 824b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja case OMAP_DSS_VIDEO3: 82580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen shift = 16; 82680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 82780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 82880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 82980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 83080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 83180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8329b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 8332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 8342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal switch (channel) { 8352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_LCD: 8362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 0; 8372a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 0; 8382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_DIGIT: 8402a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 1; 8412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 0; 8422a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal case OMAP_DSS_CHANNEL_LCD2: 8442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan = 0; 8452a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal chan2 = 1; 8462a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal break; 8472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal default: 8482a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal BUG(); 8492a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 8502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 8512a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, chan, shift, shift); 8522a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, chan2, 31, 30); 8532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } else { 8542a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal val = FLD_MOD(val, channel, shift, shift); 8552a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 8569b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val); 85780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 85880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 8592cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinenstatic enum omap_channel dispc_ovl_get_channel_out(enum omap_plane plane) 8602cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen{ 8612cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen int shift; 8622cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen u32 val; 8632cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen enum omap_channel channel; 8642cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8652cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen switch (plane) { 8662cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_GFX: 8672cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen shift = 8; 8682cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen break; 8692cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO1: 8702cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO2: 8712cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen case OMAP_DSS_VIDEO3: 8722cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen shift = 16; 8732cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen break; 8742cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen default: 8752cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen BUG(); 8762cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } 8772cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8782cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 8792cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8802cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen if (dss_has_feature(FEAT_MGR_LCD2)) { 8812cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen if (FLD_GET(val, 31, 30) == 0) 8822cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = FLD_GET(val, shift, shift); 8832cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen else 8842cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = OMAP_DSS_CHANNEL_LCD2; 8852cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } else { 8862cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = FLD_GET(val, shift, shift); 8872cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen } 8882cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 8892cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen return channel; 8902cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen} 8912cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 892f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_burst_size(enum omap_plane plane, 89380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_burst_size burst_size) 89480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 895b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 6, 14, 14, 14, }; 89680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int shift; 89780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 898fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 8995ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), burst_size, shift + 1, shift); 90080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 90180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9025ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenstatic void dispc_configure_burst_sizes(void) 9035ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{ 9045ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen int i; 9055ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen const int burst_size = BURST_SIZE_X8; 9065ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 9075ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen /* Configure burst size always to maximum size */ 9085ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlays(); ++i) 909f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_burst_size(i, burst_size); 9105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen} 9115ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 912f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenu32 dispc_ovl_get_burst_size(enum omap_plane plane) 9135ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{ 9145ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unsigned unit = dss_feat_get_burst_size_unit(); 9155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen /* burst multiplier is always x8 (see dispc_configure_burst_sizes()) */ 9165ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen return unit * 8; 9175ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen} 9185ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 919d3862610c95564a586951d5be291b9b0200d39feMythri P Kvoid dispc_enable_gamma_table(bool enable) 920d3862610c95564a586951d5be291b9b0200d39feMythri P K{ 921d3862610c95564a586951d5be291b9b0200d39feMythri P K /* 922d3862610c95564a586951d5be291b9b0200d39feMythri P K * This is partially implemented to support only disabling of 923d3862610c95564a586951d5be291b9b0200d39feMythri P K * the gamma table. 924d3862610c95564a586951d5be291b9b0200d39feMythri P K */ 925d3862610c95564a586951d5be291b9b0200d39feMythri P K if (enable) { 926d3862610c95564a586951d5be291b9b0200d39feMythri P K DSSWARN("Gamma table enabling for TV not yet supported"); 927d3862610c95564a586951d5be291b9b0200d39feMythri P K return; 928d3862610c95564a586951d5be291b9b0200d39feMythri P K } 929d3862610c95564a586951d5be291b9b0200d39feMythri P K 930d3862610c95564a586951d5be291b9b0200d39feMythri P K REG_FLD_MOD(DISPC_CONFIG, enable, 9, 9); 931d3862610c95564a586951d5be291b9b0200d39feMythri P K} 932d3862610c95564a586951d5be291b9b0200d39feMythri P K 933c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_cpr(enum omap_channel channel, bool enable) 9343c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{ 9353c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen u16 reg; 9363c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9373c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD) 9383c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen reg = DISPC_CONFIG; 9393c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_LCD2) 9403c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen reg = DISPC_CONFIG2; 9413c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen else 9423c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen return; 9433c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9443c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen REG_FLD_MOD(reg, enable, 15, 15); 9453c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen} 9463c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 947c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_cpr_coef(enum omap_channel channel, 9483c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen struct omap_dss_cpr_coefs *coefs) 9493c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{ 9503c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen u32 coef_r, coef_g, coef_b; 9513c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 952dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (!dispc_mgr_is_lcd(channel)) 9533c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen return; 9543c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9553c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_r = FLD_VAL(coefs->rr, 31, 22) | FLD_VAL(coefs->rg, 20, 11) | 9563c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->rb, 9, 0); 9573c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_g = FLD_VAL(coefs->gr, 31, 22) | FLD_VAL(coefs->gg, 20, 11) | 9583c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->gb, 9, 0); 9593c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen coef_b = FLD_VAL(coefs->br, 31, 22) | FLD_VAL(coefs->bg, 20, 11) | 9603c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen FLD_VAL(coefs->bb, 9, 0); 9613c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 9623c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_R(channel), coef_r); 9633c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_G(channel), coef_g); 9643c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen dispc_write_reg(DISPC_CPR_COEF_B(channel), coef_b); 9653c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen} 9663c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen 967f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable) 96880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 96980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 97080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 97180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(plane == OMAP_DSS_GFX); 97280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 9739b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 97480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_MOD(val, enable, 9, 9); 9759b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val); 97680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 97780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 978c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Tanejastatic void dispc_ovl_enable_replication(enum omap_plane plane, bool enable) 97980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 980b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja static const unsigned shifts[] = { 5, 10, 10, 10 }; 981fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen int shift; 98280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 983fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen shift = shifts[plane]; 984fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift); 98580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 98680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 98726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_size(enum omap_channel channel, u16 width, u16 height) 98880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 98980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 99080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON((width > (1 << 11)) || (height > (1 << 11))); 99180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 992702d144845086cacf8bb4f23196189f260c250e2Archit Taneja dispc_write_reg(DISPC_SIZE_MGR(channel), val); 99380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 99480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 99580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_digit_size(u16 width, u16 height) 99680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 99780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 99880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON((width > (1 << 11)) || (height > (1 << 11))); 99980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0); 1000702d144845086cacf8bb4f23196189f260c250e2Archit Taneja dispc_write_reg(DISPC_SIZE_MGR(OMAP_DSS_CHANNEL_DIGIT), val); 100180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 100280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 100380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_read_plane_fifo_sizes(void) 100480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 100580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 size; 100680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int plane; 1007a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja u8 start, end; 10085ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen u32 unit; 10095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unit = dss_feat_get_buffer_size_unit(); 101180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1012a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end); 101380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1014e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja for (plane = 0; plane < dss_feat_get_num_ovls(); ++plane) { 10155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(plane), start, end); 10165ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen size *= unit; 101780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.fifo_size[plane] = size; 101880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 101980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 102080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1021f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenu32 dispc_ovl_get_fifo_size(enum omap_plane plane) 102280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 102380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return dispc.fifo_size[plane]; 102480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 102580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10266f04e1bfc36c5865dc5679f85e25b6613be86298Tomi Valkeinenvoid dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high) 102780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1028a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja u8 hi_start, hi_end, lo_start, lo_end; 10295ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen u32 unit; 10305ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10315ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen unit = dss_feat_get_buffer_size_unit(); 10325ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10335ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen WARN_ON(low % unit != 0); 10345ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen WARN_ON(high % unit != 0); 10355ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 10365ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen low /= unit; 10375ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen high /= unit; 1038a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 10399b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end); 10409b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end); 10419b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 104280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n", 104380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen plane, 10449b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane), 10459b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja lo_start, lo_end), 10469b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane), 10479b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja hi_start, hi_end), 104880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen low, high); 104980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10509b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane), 1051a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja FLD_VAL(high, hi_start, hi_end) | 1052a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja FLD_VAL(low, lo_start, lo_end)); 105380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 105480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 105580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_fifomerge(bool enable) 105680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 105780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled"); 105880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14); 105980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 106080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1061f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_fir(enum omap_plane plane, 10620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int hinc, int vinc, 10630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain enum omap_color_component color_comp) 106480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 106580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 106680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 10670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) { 10680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 hinc_start, hinc_end, vinc_start, vinc_end; 1069a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 10700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dss_feat_get_reg_field(FEAT_REG_FIRHINC, 10710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain &hinc_start, &hinc_end); 10720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dss_feat_get_reg_field(FEAT_REG_FIRVINC, 10730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain &vinc_start, &vinc_end); 10740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain val = FLD_VAL(vinc, vinc_start, vinc_end) | 10750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain FLD_VAL(hinc, hinc_start, hinc_end); 1076a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja 10770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dispc_write_reg(DISPC_OVL_FIR(plane), val); 10780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } else { 10790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0); 10800d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain dispc_write_reg(DISPC_OVL_FIR2(plane), val); 10810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 108280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 108380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1084f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu) 108580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 108680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 108787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja u8 hor_start, hor_end, vert_start, vert_end; 108880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 108987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 109087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 109187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 109287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja val = FLD_VAL(vaccu, vert_start, vert_end) | 109387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja FLD_VAL(haccu, hor_start, hor_end); 109487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 10959b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ACCU0(plane), val); 109680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 109780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1098f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu) 109980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 110080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 val; 110187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja u8 hor_start, hor_end, vert_start, vert_end; 110280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 110387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end); 110487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end); 110587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 110687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja val = FLD_VAL(vaccu, vert_start, vert_end) | 110787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja FLD_VAL(haccu, hor_start, hor_end); 110887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 11099b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ACCU1(plane), val); 111080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 111180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1112f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_0(enum omap_plane plane, int haccu, 1113f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen int vaccu) 1114ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 1115ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain u32 val; 1116ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1117ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0); 1118ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_ACCU2_0(plane), val); 1119ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 1120ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1121f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_1(enum omap_plane plane, int haccu, 1122f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen int vaccu) 1123ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{ 1124ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain u32 val; 1125ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 1126ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0); 1127ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain dispc_write_reg(DISPC_OVL_ACCU2_1(plane), val); 1128ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain} 112980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1130f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scale_param(enum omap_plane plane, 113180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 orig_width, u16 orig_height, 113280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 out_width, u16 out_height, 11330d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool five_taps, u8 rotation, 11340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain enum omap_color_component color_comp) 113580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 11360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int fir_hinc, fir_vinc; 113780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1138ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain fir_hinc = 1024 * orig_width / out_width; 1139ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain fir_vinc = 1024 * orig_height / out_height; 114080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1141debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra dispc_ovl_set_scale_coef(plane, fir_hinc, fir_vinc, five_taps, 1142debd90749b7440ad5fc02e4f0d1e8a696385f196Chandrabhanu Mahapatra color_comp); 1143f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_fir(plane, fir_hinc, fir_vinc, color_comp); 11440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 11450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1146f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_common(enum omap_plane plane, 11470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 11480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 11490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 11500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 11510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 11520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 11530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int accu0 = 0; 11540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int accu1 = 0; 11550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u32 l; 115680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1157f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scale_param(plane, orig_width, orig_height, 11580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, five_taps, 11590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation, DISPC_COLOR_COMPONENT_RGB_Y); 11609b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja l = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); 116180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 116287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* RESIZEENABLE and VERTICALTAPS */ 116387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~((0x3 << 5) | (0x1 << 21)); 1164ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain l |= (orig_width != out_width) ? (1 << 5) : 0; 1165ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain l |= (orig_height != out_height) ? (1 << 6) : 0; 116687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l |= five_taps ? (1 << 21) : 0; 116780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 116887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* VRESIZECONF and HRESIZECONF */ 116987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_RESIZECONF)) { 117087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~(0x3 << 7); 11710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain l |= (orig_width <= out_width) ? 0 : (1 << 7); 11720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain l |= (orig_height <= out_height) ? 0 : (1 << 8); 117387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja } 117480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 117587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja /* LINEBUFFERSPLIT */ 117687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_LINEBUFFERSPLIT)) { 117787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l &= ~(0x1 << 22); 117887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja l |= five_taps ? (1 << 22) : 0; 117987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja } 118080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 11819b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), l); 118280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 118380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 118480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 118580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 118680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 118780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace && !fieldmode) { 118880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu1 = 0; 11890d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain accu0 = ((1024 * orig_height / out_height) / 2) & 0x3ff; 119080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (accu0 >= 1024/2) { 119180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu1 = 1024/2; 119280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen accu0 -= accu1; 119380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 119480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 119580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1196f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu0(plane, 0, accu0); 1197f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu1(plane, 0, accu1); 119880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 119980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1200f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_uv(enum omap_plane plane, 12010d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 12020d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 12030d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 12040d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 12050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 12060d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 12070d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int scale_x = out_width != orig_width; 12080d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain int scale_y = out_height != orig_height; 12090d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) 12110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain return; 12120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if ((color_mode != OMAP_DSS_COLOR_YUV2 && 12130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain color_mode != OMAP_DSS_COLOR_UYVY && 12140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain color_mode != OMAP_DSS_COLOR_NV12)) { 12150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* reset chroma resampling for RGB formats */ 12160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 0, 8, 8); 12170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain return; 12180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 12190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain switch (color_mode) { 12200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_NV12: 12210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 vertically*/ 12220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_height >>= 1; 12230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 horz.*/ 12240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width >>= 1; 12250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain break; 12260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_YUV2: 12270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain case OMAP_DSS_COLOR_UYVY: 12280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /*For YUV422 with 90/270 rotation, 12290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain *we don't upsample chroma 12300d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain */ 12310d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (rotation == OMAP_DSS_ROT_0 || 12320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation == OMAP_DSS_ROT_180) 12330d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* UV is subsampled by 2 hrz*/ 12340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width >>= 1; 12350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* must use FIR for YUV422 if rotated */ 12360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (rotation != OMAP_DSS_ROT_0) 12370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_x = scale_y = true; 12380d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain break; 12390d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain default: 12400d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain BUG(); 12410d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 12420d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12430d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (out_width != orig_width) 12440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_x = true; 12450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain if (out_height != orig_height) 12460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain scale_y = true; 12470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1248f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scale_param(plane, orig_width, orig_height, 12490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, five_taps, 12500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation, DISPC_COLOR_COMPONENT_UV); 12510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 12520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 12530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain (scale_x || scale_y) ? 1 : 0, 8, 8); 12540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* set H scaling */ 12550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_x ? 1 : 0, 5, 5); 12560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain /* set V scaling */ 12570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_y ? 1 : 0, 6, 6); 12580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1259f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu2_0(plane, 0x80, 0); 1260f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_accu2_1(plane, 0x80, 0); 12610d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 12620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1263f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling(enum omap_plane plane, 12640d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 orig_width, u16 orig_height, 12650d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u16 out_width, u16 out_height, 12660d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool ilace, bool five_taps, 12670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain bool fieldmode, enum omap_color_mode color_mode, 12680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain u8 rotation) 12690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{ 12700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain BUG_ON(plane == OMAP_DSS_GFX); 12710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1272f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scaling_common(plane, 12730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width, orig_height, 12740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, 12750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, 12760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain fieldmode, color_mode, 12770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation); 12780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1279f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_scaling_uv(plane, 12800d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain orig_width, orig_height, 12810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain out_width, out_height, 12820d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, 12830d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain fieldmode, color_mode, 12840d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain rotation); 12850d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain} 12860d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1287f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_rotation_attrs(enum omap_plane plane, u8 rotation, 128880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool mirroring, enum omap_color_mode color_mode) 128980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 129087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja bool row_repeat = false; 129187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja int vidrot = 0; 129287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 129380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 129480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) { 129580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 129680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (mirroring) { 129780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation) { 129880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 129980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 2; 130080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 130180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 130280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 1; 130380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 130480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 130580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 0; 130680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 130780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 130880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 3; 130980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 131080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 131180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 131280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation) { 131380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 131480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 0; 131580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 131680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 131780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 1; 131880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 131980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 132080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 2; 132180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 132280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 132380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vidrot = 3; 132480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 132580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 132680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 132780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 132880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270) 132987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja row_repeat = true; 133080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 133187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja row_repeat = false; 133280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 133387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja 13349b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), vidrot, 13, 12); 133587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja if (dss_has_feature(FEAT_ROWREPEATENABLE)) 13369b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), 13379b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja row_repeat ? 1 : 0, 18, 18); 133880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 133980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 134080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic int color_mode_to_bpp(enum omap_color_mode color_mode) 134180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 134280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 134380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 134480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1; 134580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 134680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 2; 134780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 134880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 4; 134980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 1350f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_NV12: 135180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 8; 135280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB12U: 135380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB16: 135480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_ARGB16: 135580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_YUV2: 135680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_UYVY: 1357f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBA16: 1358f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_RGBX16: 1359f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_ARGB16_1555: 1360f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain case OMAP_DSS_COLOR_XRGB16_1555: 136180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 16; 136280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB24P: 136380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 24; 136480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGB24U: 136580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_ARGB32: 136680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGBA32: 136780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_RGBX32: 136880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 32; 136980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 137080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 137180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 137280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 137380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 137480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic s32 pixinc(int pixels, u8 ps) 137580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 137680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pixels == 1) 137780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1; 137880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (pixels > 1) 137980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1 + (pixels - 1) * ps; 138080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (pixels < 0) 138180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 1 - (-pixels + 1) * ps; 138280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 138380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 138480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 138580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 138680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_vrfb_rotation_offset(u8 rotation, bool mirror, 138780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 screen_width, 138880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 width, u16 height, 138980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode, bool fieldmode, 139080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset, 139180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned *offset0, unsigned *offset1, 139280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 *row_inc, s32 *pix_inc) 139380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 139480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u8 ps; 139580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 139680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FIXME CLUT formats */ 139780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 139880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 139980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 140080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 140180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 140280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 140380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 140480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_YUV2: 140580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_UYVY: 140680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = 4; 140780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 140880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 140980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = color_mode_to_bpp(color_mode) / 8; 141080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 141180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 141280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 141380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 141480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width, height); 141580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 141680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 141780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 141880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 141980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 142080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation + mirror * 4) { 142180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 142280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 142380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 142480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * If the pixel format is YUV or UYVY divide the width 142580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * of the image by 2 for 0 and 180 degree rotation. 142680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 142780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 142880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) 142980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width = width >> 1; 143080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 143180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 143280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 143380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 143480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = field_offset * screen_width * ps; 143580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 143680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = 0; 143780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 143880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 + (screen_width - width) + 143980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 144080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 144180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 144280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 144380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 144480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0 + 4: 144580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180 + 4: 144680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* If the pixel format is YUV or UYVY divide the width 144780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * of the image by 2 for 0 degree and 180 degree 144880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 144980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_YUV2 || 145080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen color_mode == OMAP_DSS_COLOR_UYVY) 145180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width = width >> 1; 145280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90 + 4: 145380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270 + 4: 145480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 145580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 145680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = field_offset * screen_width * ps; 145780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 145880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = 0; 145980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 - (screen_width + width) - 146080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 146180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 146280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 146380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 146480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 146580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 146680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 146780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 146880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 146980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 147080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_dma_rotation_offset(u8 rotation, bool mirror, 147180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 screen_width, 147280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 width, u16 height, 147380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_color_mode color_mode, bool fieldmode, 147480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset, 147580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned *offset0, unsigned *offset1, 147680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 *row_inc, s32 *pix_inc) 147780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 147880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u8 ps; 147980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 fbw, fbh; 148080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 148180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FIXME CLUT formats */ 148280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (color_mode) { 148380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT1: 148480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT2: 148580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT4: 148680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_COLOR_CLUT8: 148780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 148880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 148980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 149080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps = color_mode_to_bpp(color_mode) / 8; 149180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 149280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 149380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 149480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width, 149580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen width, height); 149680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 149780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* width & height are overlay sizes, convert to fb sizes */ 149880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 149980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (rotation == OMAP_DSS_ROT_0 || rotation == OMAP_DSS_ROT_180) { 150080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbw = width; 150180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbh = height; 150280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 150380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbw = height; 150480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fbh = width; 150580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 150680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 150780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 150880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 0 = even field = bottom field 150980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * field 1 = odd field = top field 151080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 151180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (rotation + mirror * 4) { 151280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0: 151380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 151480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 151580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * screen_width * ps; 151680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 151780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 151880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 + (screen_width - fbw) + 151980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 152080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 152180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 152280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 152380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90: 152480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = screen_width * (fbh - 1) * ps; 152580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 152680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * ps; 152780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 152880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 152980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * (fbh - 1) + 1 + 153080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), ps); 153180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-screen_width, ps); 153280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 153380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180: 153480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 153580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 153680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * screen_width * ps; 153780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 153880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 153980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-1 - 154080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (screen_width - fbw) - 154180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 154280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 154380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-1, ps); 154480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 154580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270: 154680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (fbw - 1) * ps; 154780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 154880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * ps; 154980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 155080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 155180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-screen_width * (fbh - 1) - 1 - 155280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), ps); 155380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(screen_width, ps); 155480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 155580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 155680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* mirroring */ 155780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_0 + 4: 155880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (fbw - 1) * ps; 155980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 156080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * screen_width * ps; 156180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 156280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 156380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * 2 - 1 + 156480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 156580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 156680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-1, ps); 156780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 156880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 156980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_90 + 4: 157080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = 0; 157180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 157280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 + field_offset * ps; 157380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 157480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 157580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(-screen_width * (fbh - 1) + 1 + 157680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), 157780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 157880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(screen_width, ps); 157980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 158080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 158180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_180 + 4: 158280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = screen_width * (fbh - 1) * ps; 158380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 158480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * screen_width * ps; 158580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 158680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 158780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(1 - screen_width * 2 - 158880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? screen_width : 0), 158980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 159080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(1, ps); 159180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 159280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 159380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_ROT_270 + 4: 159480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps; 159580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (field_offset) 159680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1 - field_offset * ps; 159780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 159880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *offset0 = *offset1; 159980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *row_inc = pixinc(screen_width * (fbh - 1) - 1 - 160080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (fieldmode ? 1 : 0), 160180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ps); 160280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pix_inc = pixinc(-screen_width, ps); 160380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 160480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 160580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 160680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 160780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 160880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 160980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1610ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk_five_taps(enum omap_channel channel, u16 width, 1611ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 height, u16 out_width, u16 out_height, 1612ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal enum omap_color_mode color_mode) 161380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 161480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 fclk = 0; 161526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen u64 tmp, pclk = dispc_mgr_pclk_rate(channel); 161680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 16177282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (height <= out_height && width <= out_width) 16187282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return (unsigned long) pclk; 16197282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra 162080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (height > out_height) { 1621ebdc52499f56ddb63318e7bcb5e80b774bb80264Archit Taneja struct omap_dss_device *dssdev = dispc_mgr_get_device(channel); 1622ebdc52499f56ddb63318e7bcb5e80b774bb80264Archit Taneja unsigned int ppl = dssdev->panel.timings.x_res; 162380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 162480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * height * out_width; 162580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, 2 * out_height * ppl); 162680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = tmp; 162780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 16282d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä if (height > 2 * out_height) { 16292d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä if (ppl == out_width) 16302d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä return 0; 16312d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä 163280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * (height - 2 * out_height) * out_width; 163380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, 2 * out_height * (ppl - out_width)); 163480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = max(fclk, (u32) tmp); 163580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 163680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 163780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 163880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (width > out_width) { 163980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen tmp = pclk * width; 164080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen do_div(tmp, out_width); 164180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk = max(fclk, (u32) tmp); 164280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 164380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (color_mode == OMAP_DSS_COLOR_RGB24U) 164480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fclk <<= 1; 164580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 164680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 164780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return fclk; 164880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 164980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1650ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk(enum omap_channel channel, u16 width, 1651ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 height, u16 out_width, u16 out_height) 165280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 165380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int hf, vf; 165480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 165580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 165680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * FIXME how to determine the 'A' factor 165780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * for the no downscaling case ? 165880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 165980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 166080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (width > 3 * out_width) 166180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 4; 166280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (width > 2 * out_width) 166380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 3; 166480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else if (width > out_width) 166580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 2; 166680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 166780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hf = 1; 166880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 166980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (height > out_height) 167080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vf = 2; 167180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 167280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vf = 1; 167380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 16747282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (cpu_is_omap24xx()) { 16757282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (vf > 1 && hf > 1) 16767282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return dispc_mgr_pclk_rate(channel) * 4; 16777282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra else 16787282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return dispc_mgr_pclk_rate(channel) * 2; 16797282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else if (cpu_is_omap34xx()) { 16807282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return dispc_mgr_pclk_rate(channel) * vf * hf; 16817282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else { 16827282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return dispc_mgr_pclk_rate(channel) * hf; 16837282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 168480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 168580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 168679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Tanejastatic int dispc_ovl_calc_scaling(enum omap_plane plane, 168779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja enum omap_channel channel, u16 width, u16 height, 168879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja u16 out_width, u16 out_height, 168979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja enum omap_color_mode color_mode, bool *five_taps) 169079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja{ 169179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 16920373cac6cc7eef7ada03269288088e3cbee232c0Archit Taneja const int maxdownscale = dss_feat_get_param_max(FEAT_PARAM_DOWNSCALE); 16937282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra const int maxsinglelinewidth = 16947282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra dss_feat_get_param_max(FEAT_PARAM_LINEWIDTH); 169579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja unsigned long fclk = 0; 169679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 1697f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen if (width == out_width && height == out_height) 1698f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen return 0; 1699f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen 1700f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) 1701f95cb5ebd834117ff4829a460656095a0ae63921Tomi Valkeinen return -EINVAL; 170279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 170379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (out_width < width / maxdownscale || 170479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_width > width * 8) 170579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 170679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 170779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (out_height < height / maxdownscale || 170879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_height > height * 8) 170979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 171079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 17117282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (cpu_is_omap24xx()) { 17127282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) 17137282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot scale max input width exceeded"); 17147282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra *five_taps = false; 17157282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk(channel, width, height, out_width, 17167282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height); 17177282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else if (cpu_is_omap34xx()) { 17187282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > (maxsinglelinewidth * 2)) { 17197282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot setup scaling"); 17207282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("width exceeds maximum width possible"); 17217282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17227282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17237282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk_five_taps(channel, width, height, out_width, 17247282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height, color_mode); 17257282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) { 17267282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (height > out_height && height < out_height * 2) 17277282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra *five_taps = false; 17287282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra else { 17297282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("cannot setup scaling with five taps"); 17307282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17317282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17327282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 17337282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (!*five_taps) 17347282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra fclk = calc_fclk(channel, width, height, out_width, 17357282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra out_height); 17367282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } else { 17377282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra if (width > maxsinglelinewidth) { 17387282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra DSSERR("Cannot scale width exceeds max line width"); 17397282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra return -EINVAL; 17407282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra } 174179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja fclk = calc_fclk(channel, width, height, out_width, 174279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja out_height); 174379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja } 174479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 174579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSDBG("required fclk rate = %lu Hz\n", fclk); 174679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSDBG("current fclk rate = %lu Hz\n", dispc_fclk_rate()); 174779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 174879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (!fclk || fclk > dispc_fclk_rate()) { 174979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja DSSERR("failed to set up scaling, " 175079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja "required fclk rate = %lu Hz, " 175179ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja "current fclk rate = %lu Hz\n", 175279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja fclk, dispc_fclk_rate()); 175379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return -EINVAL; 175479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja } 175579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 175679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return 0; 175779ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja} 175879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja 1759a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Tanejaint dispc_ovl_setup(enum omap_plane plane, struct omap_overlay_info *oi, 17602cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen bool ilace, bool replication) 176180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 176279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja struct omap_overlay *ovl = omap_dss_get_overlay(plane); 17637282f1b7c9b5210114ce1ebb0ea5fe8a63fd5778Chandrabhanu Mahapatra bool five_taps = true; 176480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool fieldmode = 0; 176579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja int r, cconv = 0; 176680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned offset0, offset1; 176780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 row_inc; 176880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen s32 pix_inc; 1769a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja u16 frame_height = oi->height; 177080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned int field_offset = 0; 1771cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen u16 outw, outh; 17722cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen enum omap_channel channel; 17732cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen 17742cc5d1af5ad0a130fa5812f99bca18e0cdadbd36Tomi Valkeinen channel = dispc_ovl_get_channel_out(plane); 177580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1776a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja DSSDBG("dispc_ovl_setup %d, pa %x, pa_uv %x, sw %d, %d,%d, %dx%d -> " 1777f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen "%dx%d, cmode %x, rot %d, mir %d, ilace %d chan %d repl %d\n", 1778f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen plane, oi->paddr, oi->p_uv_addr, 1779c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja oi->screen_width, oi->pos_x, oi->pos_y, oi->width, oi->height, 1780c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja oi->out_width, oi->out_height, oi->color_mode, oi->rotation, 1781f38545da53d98055d8b2f58fe156c86626f3427eTomi Valkeinen oi->mirror, ilace, channel, replication); 1782e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 1783a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (oi->paddr == 0) 178480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 178580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1786cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw = oi->out_width == 0 ? oi->width : oi->out_width; 1787cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outh = oi->out_height == 0 ? oi->height : oi->out_height; 1788cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen 1789cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen if (ilace && oi->height == outh) 179080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fieldmode = 1; 179180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 179280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace) { 179380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (fieldmode) 1794a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->height /= 2; 1795a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->pos_y /= 2; 1796cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outh /= 2; 179780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 179880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("adjusting for ilace: height %d, pos_y %d, " 179980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen "out_height %d\n", 1800cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen oi->height, oi->pos_y, outh); 180180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 180280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1803a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (!dss_feat_color_mode_supported(plane, oi->color_mode)) 18048dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja return -EINVAL; 18058dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja 180679ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja r = dispc_ovl_calc_scaling(plane, channel, oi->width, oi->height, 1807cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw, outh, oi->color_mode, 180879ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja &five_taps); 180979ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (r) 181079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja return r; 181180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 181279ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (oi->color_mode == OMAP_DSS_COLOR_YUV2 || 181379ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja oi->color_mode == OMAP_DSS_COLOR_UYVY || 181479ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja oi->color_mode == OMAP_DSS_COLOR_NV12) 181579ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja cconv = 1; 181680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 181780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ilace && !fieldmode) { 181880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* 181980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * when downscaling the bottom field may have to start several 182080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * source lines below the top field. Unfortunately ACCUI 182180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * registers will only hold the fractional part of the offset 182280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * so the integer part must be added to the base address of the 182380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * bottom field. 182480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen */ 1825cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen if (!oi->height || oi->height == outh) 182680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen field_offset = 0; 182780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 1828cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen field_offset = oi->height / outh / 2; 182980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 183080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 183180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* Fields are independent but interleaved in memory. */ 183280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (fieldmode) 183380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen field_offset = 1; 183480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1835a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (oi->rotation_type == OMAP_DSS_ROT_DMA) 1836a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja calc_dma_rotation_offset(oi->rotation, oi->mirror, 1837a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->screen_width, oi->width, frame_height, 1838a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, fieldmode, field_offset, 183980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen &offset0, &offset1, &row_inc, &pix_inc); 184080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen else 1841a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja calc_vrfb_rotation_offset(oi->rotation, oi->mirror, 1842a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->screen_width, oi->width, frame_height, 1843a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, fieldmode, field_offset, 184480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen &offset0, &offset1, &row_inc, &pix_inc); 184580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 184680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n", 184780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen offset0, offset1, row_inc, pix_inc); 184880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1849a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_color_mode(plane, oi->color_mode); 185080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1851a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba0(plane, oi->paddr + offset0); 1852a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba1(plane, oi->paddr + offset1); 185380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1854a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja if (OMAP_DSS_COLOR_NV12 == oi->color_mode) { 1855a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba0_uv(plane, oi->p_uv_addr + offset0); 1856a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_ba1_uv(plane, oi->p_uv_addr + offset1); 18570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain } 18580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 18590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain 1860f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_row_inc(plane, row_inc); 1861f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_pix_inc(plane, pix_inc); 186280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1863a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja DSSDBG("%d,%d %dx%d -> %dx%d\n", oi->pos_x, oi->pos_y, oi->width, 1864cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen oi->height, outw, outh); 186580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1866a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pos(plane, oi->pos_x, oi->pos_y); 186780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1868a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pic_size(plane, oi->width, oi->height); 186980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 187079ad75f27b3096e163d3d8970bfd95b4c077dce7Archit Taneja if (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) { 1871a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_scaling(plane, oi->width, oi->height, 1872cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen outw, outh, 18730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain ilace, five_taps, fieldmode, 1874a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode, oi->rotation); 1875cf0736681e569b0d3803d68d4f6d00f544f3426aTomi Valkeinen dispc_ovl_set_vid_size(plane, outw, outh); 1876f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_set_vid_color_conv(plane, cconv); 187780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 187880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1879a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_rotation_attrs(plane, oi->rotation, oi->mirror, 1880a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja oi->color_mode); 188180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 188254128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja dispc_ovl_set_zorder(plane, oi->zorder); 1883a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_set_pre_mult_alpha(plane, oi->pre_mult_alpha); 1884a4273b7cca6fe7ee3807229ba256adb6cfaba0c3Archit Taneja dispc_ovl_setup_global_alpha(plane, oi->global_alpha); 188580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1886c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja dispc_ovl_enable_replication(plane, replication); 1887c3d92529c3c2d7b511903d98efc1537081e62ecaArchit Taneja 188880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 188980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 189080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1891f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenint dispc_ovl_enable(enum omap_plane plane, bool enable) 189280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1893e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen DSSDBG("dispc_enable_plane %d, %d\n", plane, enable); 1894e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 18959b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 0, 0); 1896e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen 1897e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen return 0; 189880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 189980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 190080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_disable_isr(void *data, u32 mask) 190180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 190280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion *compl = data; 190380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete(compl); 190480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 190580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 19062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void _enable_lcd_out(enum omap_channel channel, bool enable) 190780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 1908b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD2) { 19092a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, enable ? 1 : 0, 0, 0); 1910b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen /* flush posted write */ 1911b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL2); 1912b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen } else { 19132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0); 1914b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL); 1915b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen } 191680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 191780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 191826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_lcd_out(enum omap_channel channel, bool enable) 191980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 192080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion frame_done_completion; 192180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen bool is_on; 192280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 19232a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal u32 irq; 192480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 192580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we disable LCD output, we need to wait until frame is done. 192680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Otherwise the DSS is still working, and turning off the clocks 192780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * prevents DSS from going to OFF mode */ 19282a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal is_on = channel == OMAP_DSS_CHANNEL_LCD2 ? 19292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_GET(DISPC_CONTROL2, 0, 0) : 19302a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_GET(DISPC_CONTROL, 0, 0); 19312a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 19322a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal irq = channel == OMAP_DSS_CHANNEL_LCD2 ? DISPC_IRQ_FRAMEDONE2 : 19332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DISPC_IRQ_FRAMEDONE; 193480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 193580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!enable && is_on) { 193680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen init_completion(&frame_done_completion); 193780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 193880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_disable_isr, 19392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal &frame_done_completion, irq); 194080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 194180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 194280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("failed to register FRAMEDONE isr\n"); 194380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 194480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 19452a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal _enable_lcd_out(channel, enable); 194680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 194780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!enable && is_on) { 194880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!wait_for_completion_timeout(&frame_done_completion, 194980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen msecs_to_jiffies(100))) 195080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("timeout waiting for FRAME DONE\n"); 195180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 195280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_unregister_isr(dispc_disable_isr, 19532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal &frame_done_completion, irq); 195480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 195580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 195680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("failed to unregister FRAMEDONE isr\n"); 195780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 195880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 195980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 196080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _enable_digit_out(bool enable) 196180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 196280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1); 1963b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen /* flush posted write */ 1964b6a44e7748527d01b0c2f9a67686babaf0a5e53bTomi Valkeinen dispc_read_reg(DISPC_CONTROL); 196580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 196680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 196726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_digit_out(bool enable) 196880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 196980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct completion frame_done_completion; 1970e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen enum dss_hdmi_venc_clk_source_select src; 1971e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen int r, i; 1972e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen u32 irq_mask; 1973e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen int num_irqs; 197480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1975e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen if (REG_GET(DISPC_CONTROL, 1, 1) == enable) 197680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 197780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1978e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen src = dss_get_hdmi_venc_clk_source(); 1979e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen 198080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (enable) { 198180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 198280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we enable digit output, we'll get an extra digit 198380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * sync lost interrupt, that we need to ignore */ 198480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 198580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT; 198680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 198780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 198880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 198980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 199080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* When we disable digit output, we need to wait until fields are done. 199180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * Otherwise the DSS is still working, and turning off the clocks 199280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * prevents DSS from going to OFF mode. And when enabling, we need to 199380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * wait for the extra sync losts */ 199480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen init_completion(&frame_done_completion); 199580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 1996e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen if (src == DSS_HDMI_M_PCLK && enable == false) { 1997e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask = DISPC_IRQ_FRAMEDONETV; 1998e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen num_irqs = 1; 1999e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } else { 2000e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask = DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD; 2001e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen /* XXX I understand from TRM that we should only wait for the 2002e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen * current field to complete. But it seems we have to wait for 2003e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen * both fields */ 2004e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen num_irqs = 2; 2005e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } 2006e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen 200780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion, 2008e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask); 200980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 2010e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("failed to register %x isr\n", irq_mask); 201180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 201280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _enable_digit_out(enable); 201380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2014e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen for (i = 0; i < num_irqs; ++i) { 2015e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen if (!wait_for_completion_timeout(&frame_done_completion, 2016e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen msecs_to_jiffies(100))) 2017e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("timeout waiting for digit out to %s\n", 2018e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen enable ? "start" : "stop"); 2019e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen } 202080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2021e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen r = omap_dispc_unregister_isr(dispc_disable_isr, &frame_done_completion, 2022e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen irq_mask); 202380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 2024e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen DSSERR("failed to unregister %x isr\n", irq_mask); 202580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 202680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (enable) { 202780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 202880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 2029e82b090b80a41f2b5d9daec4c73edd76e2865419Tomi Valkeinen dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST_DIGIT; 203080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT); 203180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 203280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 203380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 203480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 203580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 203626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_is_enabled(enum omap_channel channel) 2037a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{ 2038a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen if (channel == OMAP_DSS_CHANNEL_LCD) 2039a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen return !!REG_GET(DISPC_CONTROL, 0, 0); 2040a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_DIGIT) 2041a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen return !!REG_GET(DISPC_CONTROL, 1, 1); 20422a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (channel == OMAP_DSS_CHANNEL_LCD2) 20432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal return !!REG_GET(DISPC_CONTROL2, 0, 0); 2044a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else 2045a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen BUG(); 2046a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen} 2047a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen 204826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable(enum omap_channel channel, bool enable) 2049a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{ 2050dac57a05fcf4808bbc91a96a034cae84716f0077Archit Taneja if (dispc_mgr_is_lcd(channel)) 205126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_enable_lcd_out(channel, enable); 2052a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else if (channel == OMAP_DSS_CHANNEL_DIGIT) 205326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_enable_digit_out(enable); 2054a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen else 2055a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen BUG(); 2056a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen} 2057a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen 205880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal_polarity(bool act_high) 205980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 20606ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_LCDENABLEPOL)) 20616ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 20626ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 206380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29); 206480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 206580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 206680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal(bool enable) 206780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 20686ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_LCDENABLESIGNAL)) 20696ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 20706ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 207180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28); 207280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 207380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 207480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_pck_free_enable(bool enable) 207580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 20766ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (!dss_has_feature(FEAT_PCKFREEENABLE)) 20776ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja return; 20786ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja 207980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27); 208080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 208180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 208226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_fifohandcheck(enum omap_channel channel, bool enable) 208380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 20842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 20852a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, enable ? 1 : 0, 16, 16); 20862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 20872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16); 208880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 208980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 209080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 209126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_display_type(enum omap_channel channel, 209264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal enum omap_lcd_display_type type) 209380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 209480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int mode; 209580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 209680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (type) { 209780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_LCD_DISPLAY_STN: 209880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mode = 0; 209980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 210080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 210180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case OMAP_DSS_LCD_DISPLAY_TFT: 210280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mode = 1; 210380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 210480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 210580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 210680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 210780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 210880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 210980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 21102a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 21112a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, mode, 3, 3); 21122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 21132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3); 211480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 211580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 211680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_loadmode(enum omap_dss_load_mode mode) 211780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 211880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1); 211980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 212080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 212180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2122c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_default_color(enum omap_channel channel, u32 color) 212380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 21248613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal dispc_write_reg(DISPC_DEFAULT_COLOR(channel), color); 212580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 212680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2127c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_set_trans_key(enum omap_channel ch, 212880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen enum omap_dss_trans_key_type type, 212980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 trans_key) 213080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 213180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 213280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, type, 11, 11); 21332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 213480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, type, 13, 13); 21352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else /* OMAP_DSS_CHANNEL_LCD2 */ 21362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, type, 11, 11); 213780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 21388613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal dispc_write_reg(DISPC_TRANS_COLOR(ch), trans_key); 213980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 214080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2141c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable) 214280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 214380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 214480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10); 21452a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 214680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12); 21472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else /* OMAP_DSS_CHANNEL_LCD2 */ 21482a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10); 214980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 215011354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja 2151c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenstatic void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, 2152c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen bool enable) 215380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 215411354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) 215580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 215680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 215780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ch == OMAP_DSS_CHANNEL_LCD) 215880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18); 21592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else if (ch == OMAP_DSS_CHANNEL_DIGIT) 216080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19); 216180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 216211354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja 2163c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinenvoid dispc_mgr_setup(enum omap_channel channel, 2164c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen struct omap_overlay_manager_info *info) 2165c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen{ 2166c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_default_color(channel, info->default_color); 2167c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_trans_key(channel, info->trans_key_type, info->trans_key); 2168c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_trans_key(channel, info->trans_enabled); 2169c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_alpha_fixed_zorder(channel, 2170c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen info->partial_alpha_enabled); 2171c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 2172c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_enable_cpr(channel, info->cpr_enable); 2173c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen dispc_mgr_set_cpr_coef(channel, &info->cpr_coefs); 2174c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen } 2175c64dca40c5cf1cc61355411dcfb90949e57afdf0Tomi Valkeinen} 217680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 217726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines) 217880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 217980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int code; 218080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 218180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (data_lines) { 218280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 12: 218380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 0; 218480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 218580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 16: 218680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 1; 218780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 218880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 18: 218980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 2; 219080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 219180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen case 24: 219280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen code = 3; 219380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 219480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 219580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 219680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 219780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 219880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 21992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (channel == OMAP_DSS_CHANNEL_LCD2) 22002a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL2, code, 9, 8); 22012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal else 22022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal REG_FLD_MOD(DISPC_CONTROL, code, 9, 8); 220380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 220480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2205569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode) 220680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 220780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 2208569969d6015f846926267cc40ed5fec936717f68Archit Taneja int gpout0, gpout1; 220980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 221080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen switch (mode) { 2211569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_RESET: 2212569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 0; 2213569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout1 = 0; 221480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 2215569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_RFBI: 2216569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 1; 221780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen gpout1 = 0; 221880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 2219569969d6015f846926267cc40ed5fec936717f68Archit Taneja case DSS_IO_PAD_MODE_BYPASS: 2220569969d6015f846926267cc40ed5fec936717f68Archit Taneja gpout0 = 1; 222180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen gpout1 = 1; 222280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 222380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen default: 222480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 222580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 222680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 222780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2228569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = dispc_read_reg(DISPC_CONTROL); 2229569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = FLD_MOD(l, gpout0, 15, 15); 2230569969d6015f846926267cc40ed5fec936717f68Archit Taneja l = FLD_MOD(l, gpout1, 16, 16); 2231569969d6015f846926267cc40ed5fec936717f68Archit Taneja dispc_write_reg(DISPC_CONTROL, l); 2232569969d6015f846926267cc40ed5fec936717f68Archit Taneja} 2233569969d6015f846926267cc40ed5fec936717f68Archit Taneja 2234569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable) 2235569969d6015f846926267cc40ed5fec936717f68Archit Taneja{ 2236569969d6015f846926267cc40ed5fec936717f68Archit Taneja if (channel == OMAP_DSS_CHANNEL_LCD2) 2237569969d6015f846926267cc40ed5fec936717f68Archit Taneja REG_FLD_MOD(DISPC_CONTROL2, enable, 11, 11); 2238569969d6015f846926267cc40ed5fec936717f68Archit Taneja else 2239569969d6015f846926267cc40ed5fec936717f68Archit Taneja REG_FLD_MOD(DISPC_CONTROL, enable, 11, 11); 224080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 224180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 224280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, 224380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int vsw, int vfp, int vbp) 224480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 224580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { 224680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (hsw < 1 || hsw > 64 || 224780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hfp < 1 || hfp > 256 || 224880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hbp < 1 || hbp > 256 || 224980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vsw < 1 || vsw > 64 || 225080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vfp < 0 || vfp > 255 || 225180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vbp < 0 || vbp > 255) 225280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return false; 225380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 225480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (hsw < 1 || hsw > 256 || 225580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hfp < 1 || hfp > 4096 || 225680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen hbp < 1 || hbp > 4096 || 225780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vsw < 1 || vsw > 256 || 225880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vfp < 0 || vfp > 4095 || 225980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vbp < 0 || vbp > 4095) 226080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return false; 226180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 226280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 226380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return true; 226480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 226580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 226680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_lcd_timings_ok(struct omap_video_timings *timings) 226780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 226880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return _dispc_lcd_timings_ok(timings->hsw, timings->hfp, 226980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hbp, timings->vsw, 227080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vfp, timings->vbp); 227180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 227280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 227326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw, 227464ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal int hfp, int hbp, int vsw, int vfp, int vbp) 227580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 227680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 timing_h, timing_v; 227780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 227880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) { 227980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) | 228080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(hbp-1, 27, 20); 228180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 228280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) | 228380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(vbp, 27, 20); 228480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } else { 228580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) | 228680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(hbp-1, 31, 20); 228780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 228880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timing_v = FLD_VAL(vsw-1, 7, 0) | FLD_VAL(vfp, 19, 8) | 228980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(vbp, 31, 20); 229080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 229180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 229264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal dispc_write_reg(DISPC_TIMING_H(channel), timing_h); 229364ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal dispc_write_reg(DISPC_TIMING_V(channel), timing_v); 229480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 229580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 229680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* change name to mode? */ 229726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_timings(enum omap_channel channel, 229864ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal struct omap_video_timings *timings) 229980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 230080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned xtot, ytot; 230180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long ht, vt; 230280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 230380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp, 230480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hbp, timings->vsw, 230580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vfp, timings->vbp)) 230680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG(); 230780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 230826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen _dispc_mgr_set_lcd_timings(channel, timings->hsw, timings->hfp, 230964ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal timings->hbp, timings->vsw, timings->vfp, 231064ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal timings->vbp); 231180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 231226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_set_lcd_size(channel, timings->x_res, timings->y_res); 231380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 231480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp; 231580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp; 231680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 231780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ht = (timings->pixel_clock * 1000) / xtot; 231880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen vt = (timings->pixel_clock * 1000) / xtot / ytot; 231980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 23202a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DSSDBG("channel %d xres %u yres %u\n", channel, timings->x_res, 23212a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal timings->y_res); 232280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("pck %u\n", timings->pixel_clock); 232380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n", 232480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->hsw, timings->hfp, timings->hbp, 232580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timings->vsw, timings->vfp, timings->vbp); 232680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 232780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt); 232880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 232980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 233026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_set_lcd_divisor(enum omap_channel channel, u16 lck_div, 2331ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal u16 pck_div) 233280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 233380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen BUG_ON(lck_div < 1); 23349eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen BUG_ON(pck_div < 1); 233580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2336ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer dispc_write_reg(DISPC_DIVISORo(channel), 233780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0)); 233880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 233980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 234026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_get_lcd_divisor(enum omap_channel channel, int *lck_div, 23412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal int *pck_div) 234280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 234380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 2344ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer l = dispc_read_reg(DISPC_DIVISORo(channel)); 234580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *lck_div = FLD_GET(l, 23, 16); 234680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen *pck_div = FLD_GET(l, 7, 0); 234780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 234880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 234980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenunsigned long dispc_fclk_rate(void) 235080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 2351a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 235280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r = 0; 235380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 235466534e8e936a0b926863df90054dc59826d70528Archit Taneja switch (dss_get_dispc_clk_source()) { 235589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 23564fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = clk_get_rate(dispc.dss_clk); 235766534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 235889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2359a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 2360a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 236166534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 23625a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 23635a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 23645a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 23655a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 236666534e8e936a0b926863df90054dc59826d70528Archit Taneja default: 236766534e8e936a0b926863df90054dc59826d70528Archit Taneja BUG(); 236866534e8e936a0b926863df90054dc59826d70528Archit Taneja } 236966534e8e936a0b926863df90054dc59826d70528Archit Taneja 237080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 237180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 237280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 237326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_lclk_rate(enum omap_channel channel) 237480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 2375a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 237680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int lcd; 237780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r; 237880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 237980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2380ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer l = dispc_read_reg(DISPC_DIVISORo(channel)); 238180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 238280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen lcd = FLD_GET(l, 23, 16); 238380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2384ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja switch (dss_get_lcd_clk_source(channel)) { 238589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 23864fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = clk_get_rate(dispc.dss_clk); 2387ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 238889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 2389a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 2390a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 2391ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 23925a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 23935a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 23945a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja r = dsi_get_pll_hsdiv_dispc_rate(dsidev); 23955a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 2396ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja default: 2397ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja BUG(); 2398ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja } 239980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 240080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r / lcd; 240180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 240280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 240326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_pclk_rate(enum omap_channel channel) 240480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 240580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long r; 240680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2407c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja if (dispc_mgr_is_lcd(channel)) { 2408c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja int pcd; 2409c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja u32 l; 241080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2411c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja l = dispc_read_reg(DISPC_DIVISORo(channel)); 241280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2413c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja pcd = FLD_GET(l, 7, 0); 241480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2415c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja r = dispc_mgr_lclk_rate(channel); 2416c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 2417c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return r / pcd; 2418c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } else { 2419c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja struct omap_dss_device *dssdev = 2420c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja dispc_mgr_get_device(channel); 2421c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja 2422c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja switch (dssdev->type) { 2423c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja case OMAP_DISPLAY_TYPE_VENC: 2424c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return venc_get_pixel_clock(); 2425c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja case OMAP_DISPLAY_TYPE_HDMI: 2426c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja return hdmi_get_pixel_clock(); 2427c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja default: 2428c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja BUG(); 2429c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } 2430c3dc6a7afb47735b82a4c0061e814454a649dbfcArchit Taneja } 243180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 243280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 243380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_clocks(struct seq_file *s) 243480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 243580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int lcd, pcd; 24360cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer u32 l; 243789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source dispc_clk_src = dss_get_dispc_clk_source(); 243889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source lcd_clk_src; 243980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 24404fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dispc_runtime_get()) 24414fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 244280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 244380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen seq_printf(s, "- DISPC -\n"); 244480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2445067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja seq_printf(s, "dispc fclk source = %s (%s)\n", 2446067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_get_generic_clk_source_name(dispc_clk_src), 2447067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_feat_get_clk_source_name(dispc_clk_src)); 244880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 244980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen seq_printf(s, "fck\t\t%-16lu\n", dispc_fclk_rate()); 24502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 24510cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 24520cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer seq_printf(s, "- DISPC-CORE-CLK -\n"); 24530cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = dispc_read_reg(DISPC_DIVISOR); 24540cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer lcd = FLD_GET(l, 23, 16); 24550cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 24560cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 24570cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer (dispc_fclk_rate()/lcd), lcd); 24580cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer } 24592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "- LCD1 -\n"); 24602a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2461ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD); 2462ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 2463ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja seq_printf(s, "lcd1_clk source = %s (%s)\n", 2464ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_get_generic_clk_source_name(lcd_clk_src), 2465ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_feat_get_clk_source_name(lcd_clk_src)); 2466ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 246726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD, &lcd, &pcd); 24682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2469ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 247026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD), lcd); 2471ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal seq_printf(s, "pck\t\t%-16lupck div\t%u\n", 247226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD), pcd); 24732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 24742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "- LCD2 -\n"); 24752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2476ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD2); 2477ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 2478ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja seq_printf(s, "lcd2_clk source = %s (%s)\n", 2479ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_get_generic_clk_source_name(lcd_clk_src), 2480ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_feat_get_clk_source_name(lcd_clk_src)); 2481ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 248226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD2, &lcd, &pcd); 248380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 24842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "lck\t\t%-16lulck div\t%u\n", 248526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD2), lcd); 24862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal seq_printf(s, "pck\t\t%-16lupck div\t%u\n", 248726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD2), pcd); 24882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 24894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 24904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 249180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 249280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2493dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 2494dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenvoid dispc_dump_irqs(struct seq_file *s) 2495dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen{ 2496dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long flags; 2497dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dispc_irq_stats stats; 2498dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2499dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_lock_irqsave(&dispc.irq_stats_lock, flags); 2500dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2501dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats = dispc.irq_stats; 2502dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen memset(&dispc.irq_stats, 0, sizeof(dispc.irq_stats)); 2503dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dispc.irq_stats.last_reset = jiffies; 2504dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2505dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_unlock_irqrestore(&dispc.irq_stats_lock, flags); 2506dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2507dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "period %u ms\n", 2508dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen jiffies_to_msecs(jiffies - stats.last_reset)); 2509dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2510dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "irqs %d\n", stats.irq_count); 2511dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \ 2512dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "%-20s %10d\n", #x, stats.irqs[ffs(DISPC_IRQ_##x)-1]); 2513dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2514dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(FRAMEDONE); 2515dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VSYNC); 2516dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(EVSYNC_EVEN); 2517dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(EVSYNC_ODD); 2518dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ACBIAS_COUNT_STAT); 2519dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PROG_LINE_NUM); 2520dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(GFX_FIFO_UNDERFLOW); 2521dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(GFX_END_WIN); 2522dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PAL_GAMMA_MASK); 2523dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(OCP_ERR); 2524dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID1_FIFO_UNDERFLOW); 2525dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID1_END_WIN); 2526dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID2_FIFO_UNDERFLOW); 2527dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VID2_END_WIN); 2528b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) { 2529b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_FIFO_UNDERFLOW); 2530b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_END_WIN); 2531b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja } 2532dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(SYNC_LOST); 2533dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(SYNC_LOST_DIGIT); 2534dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(WAKEUP); 25352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 25362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(FRAMEDONE2); 25372a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(VSYNC2); 25382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(ACBIAS_COUNT_STAT2); 25392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(SYNC_LOST2); 25402a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 2541dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS 2542dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen} 2543dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 2544dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 254580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_regs(struct seq_file *s) 254680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 25474dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja int i, j; 25484dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char *mgr_names[] = { 25494dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_LCD] = "LCD", 25504dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_DIGIT] = "TV", 25514dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_CHANNEL_LCD2] = "LCD2", 25524dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja }; 25534dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char *ovl_names[] = { 25544dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_GFX] = "GFX", 25554dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_VIDEO1] = "VID1", 25564dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja [OMAP_DSS_VIDEO2] = "VID2", 2557b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja [OMAP_DSS_VIDEO3] = "VID3", 25584dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja }; 25594dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja const char **p_names; 25604dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 25619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r)) 256280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 25634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dispc_runtime_get()) 25644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 256580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 25665010be80127eedfd1237627810d9f75e02036111Archit Taneja /* DISPC common registers */ 256780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_REVISION); 256880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_SYSCONFIG); 256980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_SYSSTATUS); 257080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_IRQSTATUS); 257180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_IRQENABLE); 257280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CONTROL); 257380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CONFIG); 257480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_CAPABLE); 257580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_LINE_STATUS); 257680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DUMPREG(DISPC_LINE_NUMBER); 257711354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) || 257811354dd58da1134ec9c96b65104e5cf2d50e1eb9Archit Taneja dss_has_feature(FEAT_ALPHA_FREE_ZORDER)) 2579332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen DUMPREG(DISPC_GLOBAL_ALPHA); 25802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) { 25812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DUMPREG(DISPC_CONTROL2); 25822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal DUMPREG(DISPC_CONFIG2); 25835010be80127eedfd1237627810d9f75e02036111Archit Taneja } 25845010be80127eedfd1237627810d9f75e02036111Archit Taneja 25855010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG 25865010be80127eedfd1237627810d9f75e02036111Archit Taneja 25875010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(i, name) name(i) 25884dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja#define DUMPREG(i, r) seq_printf(s, "%s(%s)%*s %08x\n", #r, p_names[i], \ 25894dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 48 - strlen(#r) - strlen(p_names[i]), " ", \ 25905010be80127eedfd1237627810d9f75e02036111Archit Taneja dispc_read_reg(DISPC_REG(i, r))) 25915010be80127eedfd1237627810d9f75e02036111Archit Taneja 25924dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja p_names = mgr_names; 25935010be80127eedfd1237627810d9f75e02036111Archit Taneja 25944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* DISPC channel specific registers */ 25954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 0; i < dss_feat_get_num_mgrs(); i++) { 25964dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DEFAULT_COLOR); 25974dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TRANS_COLOR); 25984dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_SIZE_MGR); 259980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26004dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (i == OMAP_DSS_CHANNEL_DIGIT) 26014dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja continue; 26025010be80127eedfd1237627810d9f75e02036111Archit Taneja 26034dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DEFAULT_COLOR); 26044dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TRANS_COLOR); 26054dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TIMING_H); 26064dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_TIMING_V); 26074dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_POL_FREQ); 26084dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DIVISORo); 26094dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_SIZE_MGR); 26105010be80127eedfd1237627810d9f75e02036111Archit Taneja 26114dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE1); 26124dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE2); 26134dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_DATA_CYCLE3); 26142a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 2615332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen if (dss_has_feature(FEAT_CPR)) { 26164dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_R); 26174dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_G); 26184dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_CPR_COEF_B); 2619332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 26202a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 262180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26224dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja p_names = ovl_names; 26234dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26244dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 0; i < dss_feat_get_num_ovls(); i++) { 26254dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA0); 26264dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA1); 26274dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_POSITION); 26284dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_SIZE); 26294dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ATTRIBUTES); 26304dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIFO_THRESHOLD); 26314dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS); 26324dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ROW_INC); 26334dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PIXEL_INC); 26344dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_PRELOAD)) 26354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PRELOAD); 26364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (i == OMAP_DSS_GFX) { 26384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_WINDOW_SKIP); 26394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_TABLE_BA); 26404dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja continue; 26414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 26424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR); 26444dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PICTURE_SIZE); 26454dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU0); 26464dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU1); 26474dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 26484dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA0_UV); 26494dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_BA1_UV); 26504dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR2); 26514dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU2_0); 26524dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ACCU2_1); 26534dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 26544dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_ATTR2)) 26554dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_ATTRIBUTES2); 26564dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_PRELOAD)) 26574dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_PRELOAD); 2658ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain } 26595010be80127eedfd1237627810d9f75e02036111Archit Taneja 26605010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG 26615010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG 26625010be80127eedfd1237627810d9f75e02036111Archit Taneja 26635010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(plane, name, i) name(plane, i) 26645010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DUMPREG(plane, name, i) \ 26654dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja seq_printf(s, "%s_%d(%s)%*s %08x\n", #name, i, p_names[plane], \ 26664dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 46 - strlen(#name) - strlen(p_names[plane]), " ", \ 26675010be80127eedfd1237627810d9f75e02036111Archit Taneja dispc_read_reg(DISPC_REG(plane, name, i))) 26685010be80127eedfd1237627810d9f75e02036111Archit Taneja 26694dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* Video pipeline coefficient registers */ 2670332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen 26714dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja /* start from OMAP_DSS_VIDEO1 */ 26724dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (i = 1; i < dss_feat_get_num_ovls(); i++) { 26734dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26744dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_H, j); 26759b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja 26764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_HV, j); 26785010be80127eedfd1237627810d9f75e02036111Archit Taneja 26794dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 5; j++) 26804dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_CONV_COEF, j); 2681ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain 26824dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_FIR_COEF_V)) { 26834dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26844dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_V, j); 26854dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 26864dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26874dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) { 26884dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26894dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_H2, j); 26904dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26914dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26924dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_HV2, j); 26934dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja 26944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja for (j = 0; j < 8; j++) 26954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja DUMPREG(i, DISPC_OVL_FIR_COEF_V2, j); 26964dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja } 2697332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen } 269880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 26994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 27005010be80127eedfd1237627810d9f75e02036111Archit Taneja 27015010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG 270280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef DUMPREG 270380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 270480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 270526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_pol_freq(enum omap_channel channel, bool onoff, 270626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen bool rf, bool ieo, bool ipc, bool ihs, bool ivs, u8 acbi, 270726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen u8 acb) 270880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 270980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l = 0; 271080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 271180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n", 271280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen onoff, rf, ieo, ipc, ihs, ivs, acbi, acb); 271380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 271480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(onoff, 17, 17); 271580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(rf, 16, 16); 271680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ieo, 15, 15); 271780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ipc, 14, 14); 271880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ihs, 13, 13); 271980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(ivs, 12, 12); 272080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(acbi, 11, 8); 272180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen l |= FLD_VAL(acb, 7, 0); 272280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2723ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal dispc_write_reg(DISPC_POL_FREQ(channel), l); 272480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 272580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 272626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_pol_freq(enum omap_channel channel, 2727ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal enum omap_panel_config config, u8 acbi, u8 acb) 272880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 272926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen _dispc_mgr_set_pol_freq(channel, (config & OMAP_DSS_LCD_ONOFF) != 0, 273080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_RF) != 0, 273180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IEO) != 0, 273280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IPC) != 0, 273380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IHS) != 0, 273480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen (config & OMAP_DSS_LCD_IVS) != 0, 273580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen acbi, acb); 273680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 273780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 273880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* with fck as input clock rate, find dispc dividers that produce req_pck */ 273980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_find_clk_divs(bool is_tft, unsigned long req_pck, unsigned long fck, 274080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct dispc_clock_info *cinfo) 274180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 27429eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen u16 pcd_min, pcd_max; 274380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long best_pck; 274480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 best_ld, cur_ld; 274580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u16 best_pd, cur_pd; 274680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 27479eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_min = dss_feat_get_param_min(FEAT_PARAM_DSS_PCD); 27489eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_max = dss_feat_get_param_max(FEAT_PARAM_DSS_PCD); 27499eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen 27509eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen if (!is_tft) 27519eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen pcd_min = 3; 27529eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen 275380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pck = 0; 275480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_ld = 0; 275580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pd = 0; 275680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 275780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (cur_ld = 1; cur_ld <= 255; ++cur_ld) { 275880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long lck = fck / cur_ld; 275980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 27609eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen for (cur_pd = pcd_min; cur_pd <= pcd_max; ++cur_pd) { 276180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long pck = lck / cur_pd; 276280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen long old_delta = abs(best_pck - req_pck); 276380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen long new_delta = abs(pck - req_pck); 276480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 276580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (best_pck == 0 || new_delta < old_delta) { 276680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pck = pck; 276780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_ld = cur_ld; 276880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen best_pd = cur_pd; 276980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 277080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pck == req_pck) 277180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen goto found; 277280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 277380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 277480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (pck < req_pck) 277580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 277680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 277780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 277880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (lck / pcd_min < req_pck) 277980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 278080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 278180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 278280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenfound: 278380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck_div = best_ld; 278480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck_div = best_pd; 278580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = fck / cinfo->lck_div; 278680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 278780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 278880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 278980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* calculate clock rates using dividers in cinfo */ 279080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint dispc_calc_clock_rates(unsigned long dispc_fclk_rate, 279180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct dispc_clock_info *cinfo) 279280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 279380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cinfo->lck_div > 255 || cinfo->lck_div == 0) 279480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 27959eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen if (cinfo->pck_div < 1 || cinfo->pck_div > 255) 279680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 279780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 279880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = dispc_fclk_rate / cinfo->lck_div; 279980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 280080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 280180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 280280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 280380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 280426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_set_clock_div(enum omap_channel channel, 2805ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal struct dispc_clock_info *cinfo) 280680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 280780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("lck = %lu (%u)\n", cinfo->lck, cinfo->lck_div); 280880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSDBG("pck = %lu (%u)\n", cinfo->pck, cinfo->pck_div); 280980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 281026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_set_lcd_divisor(channel, cinfo->lck_div, cinfo->pck_div); 281180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 281280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 281380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 281480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 281526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_get_clock_div(enum omap_channel channel, 2816ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal struct dispc_clock_info *cinfo) 281780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 281880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long fck; 281980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen fck = dispc_fclk_rate(); 282180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2822ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer cinfo->lck_div = REG_GET(DISPC_DIVISORo(channel), 23, 16); 2823ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer cinfo->pck_div = REG_GET(DISPC_DIVISORo(channel), 7, 0); 282480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->lck = fck / cinfo->lck_div; 282680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen cinfo->pck = cinfo->lck / cinfo->pck_div; 282780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 282880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 282980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 283080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 283180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* dispc.irq_lock has to be locked by the caller */ 283280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void) 283380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 283480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 mask; 283580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 old_mask; 283680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 283780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 283880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 283980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mask = dispc.irq_error_mask; 284080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 284180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 284280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 284380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 284480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr == NULL) 284580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 284680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 284780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mask |= isr_data->mask; 284880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 284980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen old_mask = dispc_read_reg(DISPC_IRQENABLE); 285180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* clear the irqstatus for newly enabled irqs */ 285280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask); 285380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQENABLE, mask); 285580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 285680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 285780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask) 285880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 285980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 286080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ret; 286180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 286280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 286380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 286480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr == NULL) 286580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -EINVAL; 286680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 286780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 286880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 286980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* check for duplicate entry */ 287080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 287180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 287280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr == isr && isr_data->arg == arg && 287380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask == mask) { 287480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = -EINVAL; 287580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen goto err; 287680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 287780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 287880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 287980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = NULL; 288080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = -EBUSY; 288180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 288380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 288480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr != NULL) 288680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 288780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 288880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr = isr; 288980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->arg = arg; 289080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask = mask; 289180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = 0; 289280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 289380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 289480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 289580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2896b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen if (ret) 2897b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen goto err; 2898b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen 289980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 290080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 290180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 290280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 290380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 290480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenerr: 290580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 290680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 290780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return ret; 290880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 290980c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_register_isr); 291080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 291180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask) 291280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 291380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 291480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 291580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int ret = -EINVAL; 291680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 291780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 291880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 291980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 292080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 292180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 292280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->isr != isr || isr_data->arg != arg || 292380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask != mask) 292480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 292580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 292680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* found the correct isr */ 292780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 292880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr = NULL; 292980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->arg = NULL; 293080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->mask = 0; 293180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 293280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen ret = 0; 293380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen break; 293480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 293580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 293680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (ret == 0) 293780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 293880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 293980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 294080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 294180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return ret; 294280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 294380c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_unregister_isr); 294480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 294580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG 294680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void print_irq_status(u32 status) 294780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 294880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if ((status & dispc.irq_error_mask) == 0) 294980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return; 295080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 295180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status); 295280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 295380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define PIS(x) \ 295480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (status & DISPC_IRQ_##x) \ 295580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk(#x " "); 295680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(GFX_FIFO_UNDERFLOW); 295780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(OCP_ERR); 295880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(VID1_FIFO_UNDERFLOW); 295980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(VID2_FIFO_UNDERFLOW); 2960b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) 2961b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja PIS(VID3_FIFO_UNDERFLOW); 296280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(SYNC_LOST); 296380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen PIS(SYNC_LOST_DIGIT); 29642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 29652a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal PIS(SYNC_LOST2); 296680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef PIS 296780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 296880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen printk("\n"); 296980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 297080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 297180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 297280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* Called from dss.c. Note that we don't touch clocks here, 297380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * but we presume they are on because we got an IRQ. However, 297480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * an irq handler may turn the clocks off, so we may not have 297580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * clock later in the function. */ 2976affe360d13e54b415cde2f11cee02369b4ed54bdArchit Tanejastatic irqreturn_t omap_dispc_irq_handler(int irq, void *arg) 297780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 297880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 2979affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja u32 irqstatus, irqenable; 298080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 handledirqs = 0; 298180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 unhandled_errors; 298280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 298380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; 298480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock(&dispc.irq_lock); 298680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 298780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqstatus = dispc_read_reg(DISPC_IRQSTATUS); 2988affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja irqenable = dispc_read_reg(DISPC_IRQENABLE); 2989affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 2990affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja /* IRQ is not for us */ 2991affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (!(irqstatus & irqenable)) { 2992affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja spin_unlock(&dispc.irq_lock); 2993affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return IRQ_NONE; 2994affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 299580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 2996dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 2997dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_lock(&dispc.irq_stats_lock); 2998dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dispc.irq_stats.irq_count++; 2999dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen dss_collect_irq_stats(irqstatus, dispc.irq_stats.irqs); 3000dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spin_unlock(&dispc.irq_stats_lock); 3001dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 3002dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 300380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG 300480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (dss_debug) 300580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen print_irq_status(irqstatus); 300680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 300780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* Ack the interrupt. Do it here before clocks are possibly turned 300880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * off */ 300980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, irqstatus); 301080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* flush posted write */ 301180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_read_reg(DISPC_IRQSTATUS); 301280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 301380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* make a copy and unlock, so that isrs can unregister 301480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * themselves */ 301580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen memcpy(registered_isr, dispc.registered_isr, 301680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen sizeof(registered_isr)); 301780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 301880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock(&dispc.irq_lock); 301980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 302080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 302180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = ®istered_isr[i]; 302280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 302380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!isr_data->isr) 302480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 302580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 302680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->mask & irqstatus) { 302780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr(isr_data->arg, irqstatus); 302880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen handledirqs |= isr_data->mask; 302980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 303080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 303180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock(&dispc.irq_lock); 303380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask; 303580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (unhandled_errors) { 303780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.error_irqs |= unhandled_errors; 303880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 303980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask &= ~unhandled_errors; 304080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 304180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 304280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen schedule_work(&dispc.error_work); 304380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 304480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 304580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock(&dispc.irq_lock); 3046affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 3047affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return IRQ_HANDLED; 304880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 304980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 305080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_error_worker(struct work_struct *work) 305180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 305280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 305380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 errors; 305480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 3055fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen static const unsigned fifo_underflow_bits[] = { 3056fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_GFX_FIFO_UNDERFLOW, 3057fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_VID1_FIFO_UNDERFLOW, 3058fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_VID2_FIFO_UNDERFLOW, 3059b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja DISPC_IRQ_VID3_FIFO_UNDERFLOW, 3060fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen }; 3061fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 3062fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen static const unsigned sync_lost_bits[] = { 3063fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST, 3064fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST_DIGIT, 3065fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DISPC_IRQ_SYNC_LOST2, 3066fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen }; 306780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 306880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 306980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen errors = dispc.error_irqs; 307080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.error_irqs = 0; 307180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 307280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 307313eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin dispc_runtime_get(); 307413eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin 3075fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlays(); ++i) { 3076fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_overlay *ovl; 3077fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen unsigned bit; 307880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3079fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl = omap_dss_get_overlay(i); 3080fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bit = fifo_underflow_bits[i]; 308180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3082fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (bit & errors) { 3083fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DSSERR("FIFO UNDERFLOW on %s, disabling the overlay\n", 3084fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl->name); 3085f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_enable(ovl->id, false); 308626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_go(ovl->manager->id); 308780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mdelay(50); 308880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 308980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 309080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3091fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { 3092fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_overlay_manager *mgr; 3093fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen unsigned bit; 309480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3095fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 3096fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bit = sync_lost_bits[i]; 309780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3098fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (bit & errors) { 3099fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen struct omap_dss_device *dssdev = mgr->device; 3100fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen bool enable; 310180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3102fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen DSSERR("SYNC_LOST on channel %s, restarting the output " 3103fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen "with video overlays disabled\n", 3104fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen mgr->name); 31052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 3106fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen enable = dssdev->state == OMAP_DSS_DISPLAY_ACTIVE; 3107fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen dssdev->driver->disable(dssdev); 31082a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 31092a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal for (i = 0; i < omap_dss_get_num_overlays(); ++i) { 31102a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal struct omap_overlay *ovl; 31112a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal ovl = omap_dss_get_overlay(i); 31122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 3113fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen if (ovl->id != OMAP_DSS_GFX && 3114fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen ovl->manager == mgr) 3115f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen dispc_ovl_enable(ovl->id, false); 31162a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31172a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 311826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_go(mgr->id); 31192a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal mdelay(50); 3120fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen 31212a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (enable) 31222a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal dssdev->driver->enable(dssdev); 31232a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31242a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal } 31252a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal 312680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (errors & DISPC_IRQ_OCP_ERR) { 312780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DSSERR("OCP_ERR\n"); 312880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) { 312980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_overlay_manager *mgr; 313080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen mgr = omap_dss_get_overlay_manager(i); 313100f17e4560da32db454c46faf1e8df4fe35cc226Rob Clark if (mgr->device && mgr->device->driver) 313200f17e4560da32db454c46faf1e8df4fe35cc226Rob Clark mgr->device->driver->disable(mgr->device); 313380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 313480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 313580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 313680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 313780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask |= errors; 313880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 313980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 314013eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin 314113eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin dispc_runtime_put(); 314280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 314380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 314480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout) 314580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 314680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void dispc_irq_wait_handler(void *data, u32 mask) 314780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen { 314880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete((struct completion *)data); 314980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 315080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 315180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 315280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 315380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 315480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, 315580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqmask); 315680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 315780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 315880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 315980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 316080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout = wait_for_completion_timeout(&completion, timeout); 316180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 316280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); 316380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 316480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == 0) 316580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ETIMEDOUT; 316680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 316780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == -ERESTARTSYS) 316880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ERESTARTSYS; 316980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 317080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 317180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 317280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 317380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask, 317480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long timeout) 317580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 317680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen void dispc_irq_wait_handler(void *data, u32 mask) 317780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen { 317880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen complete((struct completion *)data); 317980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 318080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 318180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int r; 318280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 318380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 318480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion, 318580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen irqmask); 318680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 318780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (r) 318880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return r; 318980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout = wait_for_completion_interruptible_timeout(&completion, 319180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen timeout); 319280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask); 319480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == 0) 319680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ETIMEDOUT; 319780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 319880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (timeout == -ERESTARTSYS) 319980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return -ERESTARTSYS; 320080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen return 0; 320280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 320380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 320480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC 320580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_fake_vsync_irq(void) 320680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 320780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 irqstatus = DISPC_IRQ_VSYNC; 320880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen int i; 320980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3210ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen WARN_ON(!in_interrupt()); 321180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { 321380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen struct omap_dispc_isr_data *isr_data; 321480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data = &dispc.registered_isr[i]; 321580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (!isr_data->isr) 321780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen continue; 321880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 321980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (isr_data->mask & irqstatus) 322080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen isr_data->isr(isr_data->arg, irqstatus); 322180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen } 322280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 322380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif 322480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 322580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initialize_irq(void) 322680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 322780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen unsigned long flags; 322880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 322980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_lock_irqsave(&dispc.irq_lock, flags); 323080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr)); 323280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR; 32342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal if (dss_has_feature(FEAT_MGR_LCD2)) 32352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2; 3236b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja if (dss_feat_get_num_ovls() > 3) 3237b8c095b4d62f90ed8da0cca7116125863b1d8befArchit Taneja dispc.irq_error_mask |= DISPC_IRQ_VID3_FIFO_UNDERFLOW; 323880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 323980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* there's SYNC_LOST_DIGIT waiting after enabling the DSS, 324080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * so clear it */ 324180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS)); 324280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _omap_dispc_set_irqs(); 324480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen spin_unlock_irqrestore(&dispc.irq_lock, flags); 324680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 324780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 324880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_sidle(void) 324980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 325080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3); /* SIDLEMODE: smart idle */ 325180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 325280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 325380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_disable_sidle(void) 325480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 325580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3); /* SIDLEMODE: no idle */ 325680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 325780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 325880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initial_config(void) 325980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{ 326080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen u32 l; 326180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 32620cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer /* Exclusively enable DISPC_CORE_CLK and set divider to 1 */ 32630cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer if (dss_has_feature(FEAT_CORE_CLK_DIV)) { 32640cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = dispc_read_reg(DISPC_DIVISOR); 32650cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer /* Use DISPC_DIVISOR.LCD, instead of DISPC_DIVISOR1.LCD */ 32660cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = FLD_MOD(l, 1, 0, 0); 32670cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer l = FLD_MOD(l, 1, 23, 16); 32680cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer dispc_write_reg(DISPC_DIVISOR, l); 32690cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer } 32700cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer 327180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* FUNCGATED */ 32726ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja if (dss_has_feature(FEAT_FUNCGATED)) 32736ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9); 327480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 327580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* L3 firewall setting: enable access to OCM RAM */ 327680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen /* XXX this should be somewhere in plat-omap */ 327780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen if (cpu_is_omap24xx()) 327880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen __raw_writel(0x402000b0, OMAP2_L3_IO_ADDRESS(0x680050a0)); 327980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 328080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen _dispc_setup_color_conv_coef(); 328180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 328280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY); 328380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 328480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen dispc_read_plane_fifo_sizes(); 32855ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen 32865ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen dispc_configure_burst_sizes(); 328754128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja 328854128701ecccbeb6f740030e0cc5f8e5701fe8eeArchit Taneja dispc_ovl_enable_zorder_planes(); 328980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} 329080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen 3291060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy/* DISPC HW IP initialisation */ 3292060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_probe(struct platform_device *pdev) 3293060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3294060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy u32 rev; 3295affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja int r = 0; 3296ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy struct resource *dispc_mem; 32974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *clk; 3298ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy 3299060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy dispc.pdev = pdev; 3300060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 33014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = clk_get(&pdev->dev, "fck"); 33024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 33034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSERR("can't get fck\n"); 33044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = PTR_ERR(clk); 33054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_get_clk; 33064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen } 33074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc.dss_clk = clk; 33094fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3310060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy spin_lock_init(&dispc.irq_lock); 3311060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3312060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 3313060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy spin_lock_init(&dispc.irq_stats_lock); 3314060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy dispc.irq_stats.last_reset = jiffies; 3315060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#endif 3316060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3317060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy INIT_WORK(&dispc.error_work, dispc_error_worker); 3318060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3319ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0); 3320ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy if (!dispc_mem) { 3321ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy DSSERR("can't get IORESOURCE_MEM DISPC\n"); 3322affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja r = -EINVAL; 33234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_ioremap; 3324ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy } 33256e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall dispc.base = devm_ioremap(&pdev->dev, dispc_mem->start, 33266e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall resource_size(dispc_mem)); 3327060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy if (!dispc.base) { 3328060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy DSSERR("can't ioremap DISPC\n"); 3329affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja r = -ENOMEM; 33304fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_ioremap; 3331affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 3332affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja dispc.irq = platform_get_irq(dispc.pdev, 0); 3333affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (dispc.irq < 0) { 3334affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("platform_get_irq failed\n"); 3335affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja r = -ENODEV; 33366e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall goto err_ioremap; 3337affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 3338affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 33396e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall r = devm_request_irq(&pdev->dev, dispc.irq, omap_dispc_irq_handler, 33406e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall IRQF_SHARED, "OMAP DISPC", dispc.pdev); 3341affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (r < 0) { 3342affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("request_irq failed\n"); 33436e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall goto err_ioremap; 3344060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy } 3345060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 33464fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_enable(&pdev->dev); 33474fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33484fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dispc_runtime_get(); 33494fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 33504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_runtime_get; 3351060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3352060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy _omap_dispc_initial_config(); 3353060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3354060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy _omap_dispc_initialize_irq(); 3355060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3356060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy rev = dispc_read_reg(DISPC_REVISION); 3357a06b62f8004bd95c132fa312e8593c9a10f466ecSumit Semwal dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n", 3358060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 3359060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 33604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 3361060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3362060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return 0; 33634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_runtime_get: 33654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 33664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_ioremap: 33674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dispc.dss_clk); 33684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_clk: 3369affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return r; 3370060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3371060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3372060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_remove(struct platform_device *pdev) 3373060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 33744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 33754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dispc.dss_clk); 33774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3378060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return 0; 3379060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3380060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 33814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_suspend(struct device *dev) 33824fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 33834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_save_context(); 33844fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 33854fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33864fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 33874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 33884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_resume(struct device *dev) 33904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 33914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 33924fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33934fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dss_runtime_get(); 33944fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r < 0) 33954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r; 33964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 339749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen dispc_restore_context(); 33984fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 33994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 34004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 34014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 34024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dispc_pm_ops = { 34034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_suspend = dispc_runtime_suspend, 34044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_resume = dispc_runtime_resume, 34054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}; 34064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 3407060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic struct platform_driver omap_dispchw_driver = { 3408060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .probe = omap_dispchw_probe, 3409060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .remove = omap_dispchw_remove, 3410060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .driver = { 3411060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .name = "omapdss_dispc", 3412060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy .owner = THIS_MODULE, 34134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .pm = &dispc_pm_ops, 3414060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy }, 3415060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}; 3416060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3417060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyint dispc_init_platform_driver(void) 3418060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3419060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return platform_driver_register(&omap_dispchw_driver); 3420060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3421060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy 3422060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyvoid dispc_uninit_platform_driver(void) 3423060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{ 3424060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy return platform_driver_unregister(&omap_dispchw_driver); 3425060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy} 3426