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 = &registered_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