dispc.c revision 9eaaf2076dac213c034c69051dd7a625cd41f56e
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>
2880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/clk.h>
2980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/io.h>
3080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/jiffies.h>
3180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/seq_file.h>
3280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/delay.h>
3380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <linux/workqueue.h>
34ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen#include <linux/hardirq.h>
35affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja#include <linux/interrupt.h>
3624e6289c029b0cf5b4f75e12c1b66000d441c9edTomi Valkeinen#include <linux/platform_device.h>
374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen#include <linux/pm_runtime.h>
3880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <plat/sram.h>
4080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include <plat/clock.h>
4180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
42a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h>
4380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#include "dss.h"
45a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja#include "dss_features.h"
469b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#include "dispc.h"
4780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* DISPC */
498613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal#define DISPC_SZ_REGS			SZ_4K
5080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
5180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_IRQ_MASK_ERROR            (DISPC_IRQ_GFX_FIFO_UNDERFLOW | \
5280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					 DISPC_IRQ_OCP_ERR | \
5380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					 DISPC_IRQ_VID1_FIFO_UNDERFLOW | \
5480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					 DISPC_IRQ_VID2_FIFO_UNDERFLOW | \
5580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					 DISPC_IRQ_SYNC_LOST | \
5680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					 DISPC_IRQ_SYNC_LOST_DIGIT)
5780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
5880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define DISPC_MAX_NR_ISRS		8
5980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
6080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstruct omap_dispc_isr_data {
6180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	omap_dispc_isr_t	isr;
6280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void			*arg;
6380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32			mask;
6480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen};
6580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
6666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotasstruct dispc_h_coef {
6766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 hc4;
6866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 hc3;
6966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	u8 hc2;
7066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 hc1;
7166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 hc0;
7266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas};
7366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas
7466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotasstruct dispc_v_coef {
7566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 vc22;
7666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 vc2;
7766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	u8 vc1;
7866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 vc0;
7966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	s8 vc00;
8066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas};
8166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas
825ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenenum omap_burst_size {
835ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	BURST_SIZE_X2 = 0,
845ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	BURST_SIZE_X4 = 1,
855ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	BURST_SIZE_X8 = 2,
865ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen};
875ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
8880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_GET(idx, start, end) \
8980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	FLD_GET(dispc_read_reg(idx), start, end)
9080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
9180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define REG_FLD_MOD(idx, val, start, end)				\
9280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(idx, FLD_MOD(dispc_read_reg(idx), val, start, end))
9380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
94dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenstruct dispc_irq_stats {
95dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	unsigned long last_reset;
96dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	unsigned irq_count;
97dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	unsigned irqs[32];
98dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen};
99dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
10080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic struct {
101060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	struct platform_device *pdev;
10280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void __iomem    *base;
1034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
1044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int		ctx_loss_cnt;
1054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
106affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	int irq;
1074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	struct clk *dss_clk;
10880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
109e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja	u32	fifo_size[MAX_DSS_OVERLAYS];
11080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spinlock_t irq_lock;
11280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 irq_error_mask;
11380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
11480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 error_irqs;
11580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct work_struct error_work;
11680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	bool		ctx_valid;
11880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32		ctx[DISPC_SZ_REGS / sizeof(u32)];
119dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
120dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
121dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spinlock_t irq_stats_lock;
122dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	struct dispc_irq_stats irq_stats;
123dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif
12480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen} dispc;
12580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainenum omap_color_component {
1270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* used for all color formats for OMAP3 and earlier
1280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	 * and for RGB and Y color component on OMAP4
1290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	 */
1300d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	DISPC_COLOR_COMPONENT_RGB_Y		= 1 << 0,
1310d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* used for UV component for
1320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	 * OMAP_DSS_COLOR_YUV2, OMAP_DSS_COLOR_UYVY, OMAP_DSS_COLOR_NV12
1330d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	 * color formats on OMAP4
1340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	 */
1350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	DISPC_COLOR_COMPONENT_UV		= 1 << 1,
1360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain};
1370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
13880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void);
13980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
14055978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline void dispc_write_reg(const u16 idx, u32 val)
14180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
14255978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja	__raw_writel(val, dispc.base + idx);
14380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
14480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
14555978cc20efca8c40a7f4500df868e3d2ac8c025Archit Tanejastatic inline u32 dispc_read_reg(const u16 idx)
14680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
14755978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja	return __raw_readl(dispc.base + idx);
14880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
14980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
15049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinenstatic int dispc_get_ctx_loss_count(void)
15149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen{
15249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	struct device *dev = &dispc.pdev->dev;
15349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	struct omap_display_platform_data *pdata = dev->platform_data;
15449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	struct omap_dss_board_info *board_data = pdata->board_data;
15549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	int cnt;
15649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
15749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	if (!board_data->get_context_loss_count)
15849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen		return -ENOENT;
15949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
16049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	cnt = board_data->get_context_loss_count(dev);
16149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
16249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	WARN_ONCE(cnt < 0, "get_context_loss_count failed: %d\n", cnt);
16349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
16449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	return cnt;
16549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen}
16649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
16780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define SR(reg) \
16855978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja	dispc.ctx[DISPC_##reg / sizeof(u32)] = dispc_read_reg(DISPC_##reg)
16980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define RR(reg) \
17055978cc20efca8c40a7f4500df868e3d2ac8c025Archit Taneja	dispc_write_reg(DISPC_##reg, dispc.ctx[DISPC_##reg / sizeof(u32)])
17180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_save_context(void)
17380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
174c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	int i, j;
17580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("dispc_save_context\n");
1774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
17880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	SR(IRQENABLE);
17980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	SR(CONTROL);
18080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	SR(CONFIG);
18180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	SR(LINE_NUMBER);
182332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	if (dss_has_feature(FEAT_GLOBAL_ALPHA))
183332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		SR(GLOBAL_ALPHA);
1842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
1852a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		SR(CONTROL2);
1862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		SR(CONFIG2);
1872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
18880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
189c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	for (i = 0; i < dss_feat_get_num_mgrs(); i++) {
190c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(DEFAULT_COLOR(i));
191c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(TRANS_COLOR(i));
192c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(SIZE_MGR(i));
193c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (i == OMAP_DSS_CHANNEL_DIGIT)
194c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			continue;
195c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(TIMING_H(i));
196c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(TIMING_V(i));
197c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(POL_FREQ(i));
198c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(DIVISORo(i));
199c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja
200c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(DATA_CYCLE1(i));
201c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(DATA_CYCLE2(i));
202c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(DATA_CYCLE3(i));
203c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja
204332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		if (dss_has_feature(FEAT_CPR)) {
205c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(CPR_COEF_R(i));
206c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(CPR_COEF_G(i));
207c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(CPR_COEF_B(i));
208332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		}
2092a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
21080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
211c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	for (i = 0; i < dss_feat_get_num_ovls(); i++) {
212c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_BA0(i));
213c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_BA1(i));
214c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_POSITION(i));
215c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_SIZE(i));
216c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_ATTRIBUTES(i));
217c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_FIFO_THRESHOLD(i));
218c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_ROW_INC(i));
219c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_PIXEL_INC(i));
220c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_PRELOAD))
221c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_PRELOAD(i));
222c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (i == OMAP_DSS_GFX) {
223c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_WINDOW_SKIP(i));
224c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_TABLE_BA(i));
225c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			continue;
226c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
227c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_FIR(i));
228c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_PICTURE_SIZE(i));
229c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_ACCU0(i));
230c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		SR(OVL_ACCU1(i));
2319b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
232c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 8; j++)
233c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_FIR_COEF_H(i, j));
234ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
235c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 8; j++)
236c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_FIR_COEF_HV(i, j));
237ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
238c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 5; j++)
239c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_CONV_COEF(i, j));
240ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
241c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_FIR_COEF_V)) {
242c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
243c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				SR(OVL_FIR_COEF_V(i, j));
244c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
2459b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
246c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
247c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_BA0_UV(i));
248c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_BA1_UV(i));
249c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_FIR2(i));
250c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_ACCU2_0(i));
251c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_ACCU2_1(i));
252ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
253c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
254c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				SR(OVL_FIR_COEF_H2(i, j));
255ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
256c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
257c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				SR(OVL_FIR_COEF_HV2(i, j));
258ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
259c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
260c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				SR(OVL_FIR_COEF_V2(i, j));
261c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
262c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_ATTR2))
263c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			SR(OVL_ATTRIBUTES2(i));
264ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	}
2650cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
2660cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV))
2670cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		SR(DIVISOR);
26849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
26949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	dispc.ctx_loss_cnt = dispc_get_ctx_loss_count();
27049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	dispc.ctx_valid = true;
27149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
27249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	DSSDBG("context saved, ctx_loss_count %d\n", dispc.ctx_loss_cnt);
27380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
27480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dispc_restore_context(void)
27680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
277c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	int i, j, ctx;
2784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
2794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("dispc_restore_context\n");
2804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
28149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	if (!dispc.ctx_valid)
28249ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen		return;
28349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
28449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	ctx = dispc_get_ctx_loss_count();
28549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
28649ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	if (ctx >= 0 && ctx == dispc.ctx_loss_cnt)
28749ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen		return;
28849ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
28949ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	DSSDBG("ctx_loss_count: saved %d, current %d\n",
29049ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen			dispc.ctx_loss_cnt, ctx);
29149ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
29275c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	/*RR(IRQENABLE);*/
29380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*RR(CONTROL);*/
29480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	RR(CONFIG);
29580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	RR(LINE_NUMBER);
296332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	if (dss_has_feature(FEAT_GLOBAL_ALPHA))
297332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		RR(GLOBAL_ALPHA);
298c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	if (dss_has_feature(FEAT_MGR_LCD2))
2992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		RR(CONFIG2);
30080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	for (i = 0; i < dss_feat_get_num_mgrs(); i++) {
302c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(DEFAULT_COLOR(i));
303c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(TRANS_COLOR(i));
304c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(SIZE_MGR(i));
305c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (i == OMAP_DSS_CHANNEL_DIGIT)
306c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			continue;
307c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(TIMING_H(i));
308c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(TIMING_V(i));
309c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(POL_FREQ(i));
310c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(DIVISORo(i));
311c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja
312c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(DATA_CYCLE1(i));
313c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(DATA_CYCLE2(i));
314c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(DATA_CYCLE3(i));
3152a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
316332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		if (dss_has_feature(FEAT_CPR)) {
317c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(CPR_COEF_R(i));
318c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(CPR_COEF_G(i));
319c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(CPR_COEF_B(i));
320332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		}
3212a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
32280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
323c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja	for (i = 0; i < dss_feat_get_num_ovls(); i++) {
324c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_BA0(i));
325c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_BA1(i));
326c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_POSITION(i));
327c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_SIZE(i));
328c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_ATTRIBUTES(i));
329c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_FIFO_THRESHOLD(i));
330c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_ROW_INC(i));
331c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_PIXEL_INC(i));
332c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_PRELOAD))
333c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_PRELOAD(i));
334c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (i == OMAP_DSS_GFX) {
335c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_WINDOW_SKIP(i));
336c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_TABLE_BA(i));
337c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			continue;
338c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
339c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_FIR(i));
340c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_PICTURE_SIZE(i));
341c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_ACCU0(i));
342c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		RR(OVL_ACCU1(i));
3439b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
344c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 8; j++)
345c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_FIR_COEF_H(i, j));
346ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
347c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 8; j++)
348c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_FIR_COEF_HV(i, j));
349ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
350c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		for (j = 0; j < 5; j++)
351c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_CONV_COEF(i, j));
352ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
353c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_FIR_COEF_V)) {
354c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
355c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				RR(OVL_FIR_COEF_V(i, j));
356c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
3579b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
358c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
359c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_BA0_UV(i));
360c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_BA1_UV(i));
361c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_FIR2(i));
362c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_ACCU2_0(i));
363c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_ACCU2_1(i));
364ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
365c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
366c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				RR(OVL_FIR_COEF_H2(i, j));
367ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
368c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
369c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				RR(OVL_FIR_COEF_HV2(i, j));
370ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
371c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			for (j = 0; j < 8; j++)
372c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja				RR(OVL_FIR_COEF_V2(i, j));
373c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		}
374c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja		if (dss_has_feature(FEAT_ATTR2))
375c6104b8e243de78169a65f087074ad60f9c02457Archit Taneja			RR(OVL_ATTRIBUTES2(i));
376ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	}
37780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3780cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV))
3790cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		RR(DIVISOR);
3800cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
38180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* enable last, because LCD & DIGIT enable are here */
38280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	RR(CONTROL);
3832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2))
3842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		RR(CONTROL2);
38575c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	/* clear spurious SYNC_LOST_DIGIT interrupts */
38675c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT);
38775c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä
38875c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	/*
38975c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	 * enable last so IRQs won't trigger before
39075c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	 * the context is fully restored
39175c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	 */
39275c7d59daf502a4eb040e181120fb83b4a8c0719Ville Syrjälä	RR(IRQENABLE);
39349ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen
39449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	DSSDBG("context restored\n");
39580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
39680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
39780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef SR
39880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef RR
39980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4004fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenint dispc_runtime_get(void)
4014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
4024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
4034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4044fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("dispc_runtime_get\n");
4054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = pm_runtime_get_sync(&dispc.pdev->dev);
4074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	WARN_ON(r < 0);
4084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return r < 0 ? r : 0;
4094fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
4104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenvoid dispc_runtime_put(void)
4124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
4134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
4144fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4154fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	DSSDBG("dispc_runtime_put\n");
4164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
4174fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = pm_runtime_put(&dispc.pdev->dev);
4184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	WARN_ON(r < 0);
41980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
42080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
42226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_go_busy(enum omap_channel channel)
42380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
42480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int bit;
42580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4262a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD ||
4272a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			channel == OMAP_DSS_CHANNEL_LCD2)
42880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 5; /* GOLCD */
42980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
43080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 6; /* GODIGIT */
43180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4322a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
4332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		return REG_GET(DISPC_CONTROL2, bit, bit) == 1;
4342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
4352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		return REG_GET(DISPC_CONTROL, bit, bit) == 1;
43680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
43780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
43826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_go(enum omap_channel channel)
43980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
44080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int bit;
4412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	bool enable_bit, go_bit;
44280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD ||
4442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			channel == OMAP_DSS_CHANNEL_LCD2)
44580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 0; /* LCDENABLE */
44680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
44780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 1; /* DIGITALENABLE */
44880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
44980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* if the channel is not enabled, we don't need GO */
4502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
4512a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enable_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1;
4522a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
4532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enable_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1;
4542a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
4552a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (!enable_bit)
456e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen		return;
45780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4582a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD ||
4592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			channel == OMAP_DSS_CHANNEL_LCD2)
46080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 5; /* GOLCD */
46180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
46280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bit = 6; /* GODIGIT */
46380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
4652a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		go_bit = REG_GET(DISPC_CONTROL2, bit, bit) == 1;
4662a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
4672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		go_bit = REG_GET(DISPC_CONTROL, bit, bit) == 1;
4682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
4692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (go_bit) {
47080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("GO bit not down for channel %d\n", channel);
471e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen		return;
47280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
47380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	DSSDBG("GO %s\n", channel == OMAP_DSS_CHANNEL_LCD ? "LCD" :
4752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		(channel == OMAP_DSS_CHANNEL_LCD2 ? "LCD2" : "DIGIT"));
47680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
4772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
4782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, 1, bit, bit);
4792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
4802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, 1, bit, bit);
48180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
48280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
483f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh_reg(enum omap_plane plane, int reg, u32 value)
48480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
4859b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_FIR_COEF_H(plane, reg), value);
48680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
48780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
488f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv_reg(enum omap_plane plane, int reg, u32 value)
48980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
4909b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_FIR_COEF_HV(plane, reg), value);
49180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
49280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
493f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv_reg(enum omap_plane plane, int reg, u32 value)
49480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
4959b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_FIR_COEF_V(plane, reg), value);
49680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
49780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
498f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firh2_reg(enum omap_plane plane, int reg, u32 value)
499ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
500ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
501ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
502ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_FIR_COEF_H2(plane, reg), value);
503ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
504ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
505f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firhv2_reg(enum omap_plane plane, int reg,
506f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		u32 value)
507ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
508ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
509ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
510ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_FIR_COEF_HV2(plane, reg), value);
511ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
512ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
513f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_write_firv2_reg(enum omap_plane plane, int reg, u32 value)
514ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
515ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
516ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
517ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_FIR_COEF_V2(plane, reg), value);
518ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
519ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
520f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scale_coef(enum omap_plane plane, int hscaleup,
5210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				  int vscaleup, int five_taps,
5220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				  enum omap_color_component color_comp)
52380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
52480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Coefficients for horizontal up-sampling */
52566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_h_coef coef_hup[8] = {
52666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,   0, 128,   0,  0 },
52766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1,  13, 124,  -8,  0 },
52866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2,  30, 112, -11, -1 },
52966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -5,  51,  95, -11, -2 },
53066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -9,  73,  73, -9 },
53166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2, -11,  95,  51, -5 },
53266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1, -11, 112,  30, -2 },
53366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -8, 124,  13, -1 },
53480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
53580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
53666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for vertical up-sampling */
53766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vup_3tap[8] = {
53866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  0, 128,  0, 0 },
53966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  3, 123,  2, 0 },
54066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 12, 111,  5, 0 },
54166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 32,  89,  7, 0 },
54266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  0,  64, 64, 0 },
54366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  7,  89, 32, 0 },
54466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  5, 111, 12, 0 },
54566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  2, 123,  3, 0 },
54680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
54780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
54866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vup_5tap[8] = {
54966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,   0, 128,   0,  0 },
55066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1,  13, 124,  -8,  0 },
55166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2,  30, 112, -11, -1 },
55266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -5,  51,  95, -11, -2 },
55366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -9,  73,  73, -9 },
55466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2, -11,  95,  51, -5 },
55566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1, -11, 112,  30, -2 },
55666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -8, 124,  13, -1 },
55780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
55880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
55966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for horizontal down-sampling */
56066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_h_coef coef_hdown[8] = {
56166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   0, 36, 56, 36,  0 },
56266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   4, 40, 55, 31, -2 },
56366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   8, 44, 54, 27, -5 },
56466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  12, 48, 53, 22, -7 },
56566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -9, 17, 52, 51, 17 },
56666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -7, 22, 53, 48, 12 },
56766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -5, 27, 54, 44,  8 },
56866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -2, 31, 55, 40,  4 },
56980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
57080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
57166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for vertical down-sampling */
57266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vdown_3tap[8] = {
57366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 36, 56, 36, 0 },
57466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 40, 57, 31, 0 },
57566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 45, 56, 27, 0 },
57666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 50, 55, 23, 0 },
57766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 18, 55, 55, 0 },
57866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 23, 55, 50, 0 },
57966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 27, 56, 45, 0 },
58066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 31, 57, 40, 0 },
58180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
58280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
58366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vdown_5tap[8] = {
58466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   0, 36, 56, 36,  0 },
58566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   4, 40, 55, 31, -2 },
58666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   8, 44, 54, 27, -5 },
58766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  12, 48, 53, 22, -7 },
58866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -9, 17, 52, 51, 17 },
58966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -7, 22, 53, 48, 12 },
59066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -5, 27, 54, 44,  8 },
59166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -2, 31, 55, 40,  4 },
59280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
59380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
59466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	const struct dispc_h_coef *h_coef;
59566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	const struct dispc_v_coef *v_coef;
59680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
59780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
59880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (hscaleup)
59980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		h_coef = coef_hup;
60080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
60180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		h_coef = coef_hdown;
60280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
60366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	if (vscaleup)
60466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		v_coef = five_taps ? coef_vup_5tap : coef_vup_3tap;
60566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	else
60666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		v_coef = five_taps ? coef_vdown_5tap : coef_vdown_3tap;
60780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
60880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < 8; i++) {
60980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 h, hv;
61080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
61166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		h = FLD_VAL(h_coef[i].hc0, 7, 0)
61266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc1, 15, 8)
61366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc2, 23, 16)
61466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc3, 31, 24);
61566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		hv = FLD_VAL(h_coef[i].hc4, 7, 0)
61666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc0, 15, 8)
61766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc1, 23, 16)
61866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc2, 31, 24);
61980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
6200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) {
621f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			dispc_ovl_write_firh_reg(plane, i, h);
622f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			dispc_ovl_write_firhv_reg(plane, i, hv);
6230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		} else {
624f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			dispc_ovl_write_firh2_reg(plane, i, h);
625f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			dispc_ovl_write_firhv2_reg(plane, i, hv);
6260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		}
6270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
62880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
62980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
63066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	if (five_taps) {
63166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		for (i = 0; i < 8; i++) {
63266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			u32 v;
63366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			v = FLD_VAL(v_coef[i].vc00, 7, 0)
63466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas				| FLD_VAL(v_coef[i].vc22, 15, 8);
6350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y)
636f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen				dispc_ovl_write_firv_reg(plane, i, v);
6370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			else
638f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen				dispc_ovl_write_firv2_reg(plane, i, v);
63966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		}
64080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
64180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
64280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
64380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_setup_color_conv_coef(void)
64480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
645ac01c29e5279fe31632e9118619b365514633235Archit Taneja	int i;
64680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const struct color_conv_coef {
64780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int  ry,  rcr,  rcb,   gy,  gcr,  gcb,   by,  bcr,  bcb;
64880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int  full_range;
64980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}  ctbl_bt601_5 = {
65080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		298,  409,    0,  298, -208, -100,  298,    0,  517, 0,
65180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
65280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const struct color_conv_coef *ct;
65480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0))
65680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ct = &ctbl_bt601_5;
65880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
659ac01c29e5279fe31632e9118619b365514633235Archit Taneja	for (i = 1; i < dss_feat_get_num_ovls(); i++) {
660ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 0),
661ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->rcr, ct->ry));
662ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 1),
663ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->gy,  ct->rcb));
664ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 2),
665ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->gcb, ct->gcr));
666ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 3),
667ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->bcr, ct->by));
668ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 4),
669ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(0, ct->bcb));
670ac01c29e5279fe31632e9118619b365514633235Archit Taneja
671ac01c29e5279fe31632e9118619b365514633235Archit Taneja		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), ct->full_range,
672ac01c29e5279fe31632e9118619b365514633235Archit Taneja			11, 11);
673ac01c29e5279fe31632e9118619b365514633235Archit Taneja	}
67480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
67580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef CVAL
67680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
67780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
67880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
679f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0(enum omap_plane plane, u32 paddr)
68080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
6819b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_BA0(plane), paddr);
68280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
68380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
684f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1(enum omap_plane plane, u32 paddr)
68580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
6869b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_BA1(plane), paddr);
68780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
68880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
689f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba0_uv(enum omap_plane plane, u32 paddr)
690ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
691ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_BA0_UV(plane), paddr);
692ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
693ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
694f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr)
695ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
696ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr);
697ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
698ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
699f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pos(enum omap_plane plane, int x, int y)
70080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
70180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
7029b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7039b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_POSITION(plane), val);
70480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
70580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
706f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pic_size(enum omap_plane plane, int width, int height)
70780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
70880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
7099b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7109b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	if (plane == OMAP_DSS_GFX)
7119b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		dispc_write_reg(DISPC_OVL_SIZE(plane), val);
7129b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	else
7139b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		dispc_write_reg(DISPC_OVL_PICTURE_SIZE(plane), val);
71480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
71580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
716f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_size(enum omap_plane plane, int width, int height)
71780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
71880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
71980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
72080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(plane == OMAP_DSS_GFX);
72180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
72280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
7239b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7249b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_SIZE(plane), val);
72580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
72680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
727f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pre_mult_alpha(enum omap_plane plane, bool enable)
728fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N{
729f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen	struct omap_overlay *ovl = omap_dss_get_overlay(plane);
730fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
731f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen	if ((ovl->caps & OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA) == 0)
732fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		return;
733fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
7349b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 28, 28);
735fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N}
736fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
737f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
73880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
739fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 0, 8, 16, };
740fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	int shift;
741f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen	struct omap_overlay *ovl = omap_dss_get_overlay(plane);
742fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
743f6dc815098bde08c09fd1219e0f77663f8a9a6c7Tomi Valkeinen	if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
744fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		return;
745a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
746fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
747fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, shift + 7, shift);
74880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
74980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
750f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_pix_inc(enum omap_plane plane, s32 inc)
75180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
7529b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_PIXEL_INC(plane), inc);
75380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
75480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
755f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_row_inc(enum omap_plane plane, s32 inc)
75680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
7579b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc);
75880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
75980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
760f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_color_mode(enum omap_plane plane,
76180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode)
76280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
76380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 m = 0;
764f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	if (plane != OMAP_DSS_GFX) {
765f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		switch (color_mode) {
766f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_NV12:
767f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x0; break;
768f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB12U:
769f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x1; break;
770f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA16:
771f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x2; break;
772f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX16:
773f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x4; break;
774f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16:
775f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x5; break;
776f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB16:
777f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x6; break;
778f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16_1555:
779f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x7; break;
780f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24U:
781f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x8; break;
782f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24P:
783f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x9; break;
784f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_YUV2:
785f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xa; break;
786f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_UYVY:
787f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xb; break;
788f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB32:
789f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xc; break;
790f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA32:
791f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xd; break;
792f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX32:
793f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xe; break;
794f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_XRGB16_1555:
795f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xf; break;
796f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		default:
797f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			BUG(); break;
798f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		}
799f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	} else {
800f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		switch (color_mode) {
801f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT1:
802f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x0; break;
803f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT2:
804f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x1; break;
805f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT4:
806f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x2; break;
807f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT8:
808f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x3; break;
809f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB12U:
810f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x4; break;
811f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16:
812f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x5; break;
813f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB16:
814f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x6; break;
815f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16_1555:
816f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x7; break;
817f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24U:
818f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x8; break;
819f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24P:
820f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x9; break;
821f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_YUV2:
822f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xa; break;
823f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_UYVY:
824f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xb; break;
825f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB32:
826f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xc; break;
827f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA32:
828f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xd; break;
829f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX32:
830f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xe; break;
831f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_XRGB16_1555:
832f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xf; break;
833f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		default:
834f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			BUG(); break;
835f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		}
83680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
83780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8389b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), m, 4, 1);
83980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
84080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
841f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_channel_out(enum omap_plane plane,
84280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_channel channel)
84380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
84480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int shift;
84580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
8462a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	int chan = 0, chan2 = 0;
84780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
84880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (plane) {
84980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_GFX:
85080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		shift = 8;
85180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
85280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_VIDEO1:
85380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_VIDEO2:
85480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		shift = 16;
85580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
85680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
85780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
85880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
85980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
86080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
8622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
8632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		switch (channel) {
8642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_LCD:
8652a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 0;
8662a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 0;
8672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_DIGIT:
8692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 1;
8702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 0;
8712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_LCD2:
8732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 0;
8742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 1;
8752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		default:
8772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			BUG();
8782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		}
8792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
8802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, chan, shift, shift);
8812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, chan2, 31, 30);
8822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	} else {
8832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, channel, shift, shift);
8842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
8859b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
88680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
88780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
888f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_burst_size(enum omap_plane plane,
88980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_burst_size burst_size)
89080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
891fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 6, 14, 14, };
89280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int shift;
89380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
894fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
8955ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), burst_size, shift + 1, shift);
89680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
89780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8985ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenstatic void dispc_configure_burst_sizes(void)
8995ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{
9005ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	int i;
9015ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	const int burst_size = BURST_SIZE_X8;
9025ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
9035ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	/* Configure burst size always to maximum size */
9045ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlays(); ++i)
905f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_burst_size(i, burst_size);
9065ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}
9075ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
908f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenu32 dispc_ovl_get_burst_size(enum omap_plane plane)
9095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{
9105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unsigned unit = dss_feat_get_burst_size_unit();
9115ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	/* burst multiplier is always x8 (see dispc_configure_burst_sizes()) */
9125ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	return unit * 8;
9135ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}
9145ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
915d3862610c95564a586951d5be291b9b0200d39feMythri P Kvoid dispc_enable_gamma_table(bool enable)
916d3862610c95564a586951d5be291b9b0200d39feMythri P K{
917d3862610c95564a586951d5be291b9b0200d39feMythri P K	/*
918d3862610c95564a586951d5be291b9b0200d39feMythri P K	 * This is partially implemented to support only disabling of
919d3862610c95564a586951d5be291b9b0200d39feMythri P K	 * the gamma table.
920d3862610c95564a586951d5be291b9b0200d39feMythri P K	 */
921d3862610c95564a586951d5be291b9b0200d39feMythri P K	if (enable) {
922d3862610c95564a586951d5be291b9b0200d39feMythri P K		DSSWARN("Gamma table enabling for TV not yet supported");
923d3862610c95564a586951d5be291b9b0200d39feMythri P K		return;
924d3862610c95564a586951d5be291b9b0200d39feMythri P K	}
925d3862610c95564a586951d5be291b9b0200d39feMythri P K
926d3862610c95564a586951d5be291b9b0200d39feMythri P K	REG_FLD_MOD(DISPC_CONFIG, enable, 9, 9);
927d3862610c95564a586951d5be291b9b0200d39feMythri P K}
928d3862610c95564a586951d5be291b9b0200d39feMythri P K
92926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_cpr(enum omap_channel channel, bool enable)
9303c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{
9313c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	u16 reg;
9323c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9333c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	if (channel == OMAP_DSS_CHANNEL_LCD)
9343c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		reg = DISPC_CONFIG;
9353c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_LCD2)
9363c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		reg = DISPC_CONFIG2;
9373c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	else
9383c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		return;
9393c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9403c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	REG_FLD_MOD(reg, enable, 15, 15);
9413c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen}
9423c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
94326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_cpr_coef(enum omap_channel channel,
9443c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		struct omap_dss_cpr_coefs *coefs)
9453c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{
9463c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	u32 coef_r, coef_g, coef_b;
9473c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9483c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	if (channel != OMAP_DSS_CHANNEL_LCD && channel != OMAP_DSS_CHANNEL_LCD2)
9493c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		return;
9503c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9513c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_r = FLD_VAL(coefs->rr, 31, 22) | FLD_VAL(coefs->rg, 20, 11) |
9523c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->rb, 9, 0);
9533c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_g = FLD_VAL(coefs->gr, 31, 22) | FLD_VAL(coefs->gg, 20, 11) |
9543c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->gb, 9, 0);
9553c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_b = FLD_VAL(coefs->br, 31, 22) | FLD_VAL(coefs->bg, 20, 11) |
9563c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->bb, 9, 0);
9573c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9583c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_R(channel), coef_r);
9593c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_G(channel), coef_g);
9603c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_B(channel), coef_b);
9613c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen}
9623c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
963f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable)
96480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
96580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
96680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
96780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(plane == OMAP_DSS_GFX);
96880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
9699b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
97080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_MOD(val, enable, 9, 9);
9719b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
97280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
97380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
974f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenvoid dispc_ovl_enable_replication(enum omap_plane plane, bool enable)
97580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
976fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 5, 10, 10 };
977fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	int shift;
97880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
979fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
980fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift);
98180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
98280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
98326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_size(enum omap_channel channel, u16 width, u16 height)
98480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
98580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
98680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON((width > (1 << 11)) || (height > (1 << 11)));
98780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
988702d144845086cacf8bb4f23196189f260c250e2Archit Taneja	dispc_write_reg(DISPC_SIZE_MGR(channel), val);
98980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
99080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
99180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_digit_size(u16 width, u16 height)
99280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
99380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
99480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON((width > (1 << 11)) || (height > (1 << 11)));
99580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
996702d144845086cacf8bb4f23196189f260c250e2Archit Taneja	dispc_write_reg(DISPC_SIZE_MGR(OMAP_DSS_CHANNEL_DIGIT), val);
99780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
99880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
99980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_read_plane_fifo_sizes(void)
100080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
100180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 size;
100280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int plane;
1003a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	u8 start, end;
10045ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	u32 unit;
10055ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10065ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unit = dss_feat_get_buffer_size_unit();
100780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1008a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end);
100980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1010e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja	for (plane = 0; plane < dss_feat_get_num_ovls(); ++plane) {
10115ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen		size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(plane), start, end);
10125ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen		size *= unit;
101380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.fifo_size[plane] = size;
101480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
101580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
101680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1017f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenu32 dispc_ovl_get_fifo_size(enum omap_plane plane)
101880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
101980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return dispc.fifo_size[plane];
102080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
102180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1022f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenvoid dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high)
102380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
1024a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	u8 hi_start, hi_end, lo_start, lo_end;
10255ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	u32 unit;
10265ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10275ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unit = dss_feat_get_buffer_size_unit();
10285ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10295ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	WARN_ON(low % unit != 0);
10305ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	WARN_ON(high % unit != 0);
10315ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10325ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	low /= unit;
10335ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	high /= unit;
1034a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10359b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
10369b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
10379b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
103880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n",
103980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			plane,
10409b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane),
10419b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja				lo_start, lo_end),
10429b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane),
10439b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja				hi_start, hi_end),
104480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			low, high);
104580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10469b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane),
1047a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja			FLD_VAL(high, hi_start, hi_end) |
1048a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja			FLD_VAL(low, lo_start, lo_end));
104980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
105080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
105180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_fifomerge(bool enable)
105280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
105380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled");
105480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14);
105580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
105680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1057f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_fir(enum omap_plane plane,
10580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				int hinc, int vinc,
10590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				enum omap_color_component color_comp)
106080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
106180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
106280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) {
10640d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 hinc_start, hinc_end, vinc_start, vinc_end;
1065a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10660d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dss_feat_get_reg_field(FEAT_REG_FIRHINC,
10670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain					&hinc_start, &hinc_end);
10680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dss_feat_get_reg_field(FEAT_REG_FIRVINC,
10690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain					&vinc_start, &vinc_end);
10700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		val = FLD_VAL(vinc, vinc_start, vinc_end) |
10710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				FLD_VAL(hinc, hinc_start, hinc_end);
1072a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dispc_write_reg(DISPC_OVL_FIR(plane), val);
10740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	} else {
10750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0);
10760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dispc_write_reg(DISPC_OVL_FIR2(plane), val);
10770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
107880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
107980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1080f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu)
108180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
108280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
108387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	u8 hor_start, hor_end, vert_start, vert_end;
108480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
108587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
108687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
108787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
108887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	val = FLD_VAL(vaccu, vert_start, vert_end) |
108987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			FLD_VAL(haccu, hor_start, hor_end);
109087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
10919b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ACCU0(plane), val);
109280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
109380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1094f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu)
109580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
109680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
109787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	u8 hor_start, hor_end, vert_start, vert_end;
109880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
109987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
110087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
110187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
110287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	val = FLD_VAL(vaccu, vert_start, vert_end) |
110387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			FLD_VAL(haccu, hor_start, hor_end);
110487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
11059b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ACCU1(plane), val);
110680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
110780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1108f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_0(enum omap_plane plane, int haccu,
1109f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		int vaccu)
1110ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
1111ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	u32 val;
1112ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1113ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0);
1114ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_ACCU2_0(plane), val);
1115ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
1116ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1117f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_vid_accu2_1(enum omap_plane plane, int haccu,
1118f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		int vaccu)
1119ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
1120ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	u32 val;
1121ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1122ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0);
1123ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_ACCU2_1(plane), val);
1124ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
112580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1126f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scale_param(enum omap_plane plane,
112780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 orig_width, u16 orig_height,
112880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 out_width, u16 out_height,
11290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool five_taps, u8 rotation,
11300d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		enum omap_color_component color_comp)
113180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
11320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int fir_hinc, fir_vinc;
113380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int hscaleup, vscaleup;
113480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
113580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	hscaleup = orig_width <= out_width;
113680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	vscaleup = orig_height <= out_height;
113780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1138f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_scale_coef(plane, hscaleup, vscaleup, five_taps,
1139f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			color_comp);
114080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1141ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	fir_hinc = 1024 * orig_width / out_width;
1142ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	fir_vinc = 1024 * orig_height / out_height;
114380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1144f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_fir(plane, fir_hinc, fir_vinc, color_comp);
11450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
11460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1147f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_common(enum omap_plane plane,
11480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
11490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
11500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
11510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
11520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
11530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
11540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int accu0 = 0;
11550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int accu1 = 0;
11560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	u32 l;
115780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1158f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_scale_param(plane, orig_width, orig_height,
11590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				out_width, out_height, five_taps,
11600d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				rotation, DISPC_COLOR_COMPONENT_RGB_Y);
11619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	l = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
116280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
116387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* RESIZEENABLE and VERTICALTAPS */
116487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	l &= ~((0x3 << 5) | (0x1 << 21));
1165ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	l |= (orig_width != out_width) ? (1 << 5) : 0;
1166ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	l |= (orig_height != out_height) ? (1 << 6) : 0;
116787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	l |= five_taps ? (1 << 21) : 0;
116880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
116987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* VRESIZECONF and HRESIZECONF */
117087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_RESIZECONF)) {
117187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l &= ~(0x3 << 7);
11720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		l |= (orig_width <= out_width) ? 0 : (1 << 7);
11730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		l |= (orig_height <= out_height) ? 0 : (1 << 8);
117487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	}
117580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
117687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* LINEBUFFERSPLIT */
117787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_LINEBUFFERSPLIT)) {
117887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l &= ~(0x1 << 22);
117987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l |= five_taps ? (1 << 22) : 0;
118087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	}
118180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11829b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), l);
118380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
118480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
118580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
118680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
118780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
118880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && !fieldmode) {
118980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		accu1 = 0;
11900d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		accu0 = ((1024 * orig_height / out_height) / 2) & 0x3ff;
119180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (accu0 >= 1024/2) {
119280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			accu1 = 1024/2;
119380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			accu0 -= accu1;
119480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
119580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
119680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1197f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_vid_accu0(plane, 0, accu0);
1198f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_vid_accu1(plane, 0, accu1);
119980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
120080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1201f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling_uv(enum omap_plane plane,
12020d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
12030d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
12040d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
12050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
12060d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
12070d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
12080d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int scale_x = out_width != orig_width;
12090d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int scale_y = out_height != orig_height;
12100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))
12120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		return;
12130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if ((color_mode != OMAP_DSS_COLOR_YUV2 &&
12140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode != OMAP_DSS_COLOR_UYVY &&
12150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode != OMAP_DSS_COLOR_NV12)) {
12160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* reset chroma resampling for RGB formats  */
12170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 0, 8, 8);
12180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		return;
12190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
12200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	switch (color_mode) {
12210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_NV12:
12220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* UV is subsampled by 2 vertically*/
12230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_height >>= 1;
12240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* UV is subsampled by 2 horz.*/
12250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_width >>= 1;
12260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		break;
12270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_YUV2:
12280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_UYVY:
12290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/*For YUV422 with 90/270 rotation,
12300d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		 *we don't upsample chroma
12310d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		 */
12320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (rotation == OMAP_DSS_ROT_0 ||
12330d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			rotation == OMAP_DSS_ROT_180)
12340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			/* UV is subsampled by 2 hrz*/
12350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			orig_width >>= 1;
12360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* must use FIR for YUV422 if rotated */
12370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (rotation != OMAP_DSS_ROT_0)
12380d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			scale_x = scale_y = true;
12390d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		break;
12400d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	default:
12410d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		BUG();
12420d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
12430d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (out_width != orig_width)
12450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		scale_x = true;
12460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (out_height != orig_height)
12470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		scale_y = true;
12480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1249f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_scale_param(plane, orig_width, orig_height,
12500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			out_width, out_height, five_taps,
12510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				rotation, DISPC_COLOR_COMPONENT_UV);
12520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane),
12540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		(scale_x || scale_y) ? 1 : 0, 8, 8);
12550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* set H scaling */
12560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_x ? 1 : 0, 5, 5);
12570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* set V scaling */
12580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_y ? 1 : 0, 6, 6);
12590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1260f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_vid_accu2_0(plane, 0x80, 0);
1261f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_vid_accu2_1(plane, 0x80, 0);
12620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
12630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1264f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_scaling(enum omap_plane plane,
12650d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
12660d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
12670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
12680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
12690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
12700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
12710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
12720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1273f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_scaling_common(plane,
12740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			orig_width, orig_height,
12750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			out_width, out_height,
12760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			ilace, five_taps,
12770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			fieldmode, color_mode,
12780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			rotation);
12790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1280f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_scaling_uv(plane,
12810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_width, orig_height,
12820d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		out_width, out_height,
12830d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		ilace, five_taps,
12840d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		fieldmode, color_mode,
12850d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		rotation);
12860d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
12870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1288f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenstatic void dispc_ovl_set_rotation_attrs(enum omap_plane plane, u8 rotation,
128980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bool mirroring, enum omap_color_mode color_mode)
129080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
129187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	bool row_repeat = false;
129287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	int vidrot = 0;
129387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
129480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (color_mode == OMAP_DSS_COLOR_YUV2 ||
129580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY) {
129680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
129780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (mirroring) {
129880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			switch (rotation) {
129980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_0:
130080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 2;
130180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_90:
130380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 1;
130480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_180:
130680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 0;
130780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_270:
130980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 3;
131080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
131180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
131280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		} else {
131380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			switch (rotation) {
131480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_0:
131580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 0;
131680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
131780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_90:
131880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 1;
131980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_180:
132180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 2;
132280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_270:
132480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 3;
132580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
132780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
132880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
132980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270)
133087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			row_repeat = true;
133180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
133287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			row_repeat = false;
133380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
133487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
13359b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), vidrot, 13, 12);
133687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_ROWREPEATENABLE))
13379b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane),
13389b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			row_repeat ? 1 : 0, 18, 18);
133980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
134080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
134180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic int color_mode_to_bpp(enum omap_color_mode color_mode)
134280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
134380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
134480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
134580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1;
134680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
134780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 2;
134880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
134980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 4;
135080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
1351f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_NV12:
135280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 8;
135380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB12U:
135480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB16:
135580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_ARGB16:
135680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_YUV2:
135780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_UYVY:
1358f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_RGBA16:
1359f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_RGBX16:
1360f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_ARGB16_1555:
1361f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_XRGB16_1555:
136280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 16;
136380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB24P:
136480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 24;
136580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB24U:
136680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_ARGB32:
136780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGBA32:
136880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGBX32:
136980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 32;
137080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
137180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
137280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
137380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
137480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
137580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic s32 pixinc(int pixels, u8 ps)
137680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
137780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (pixels == 1)
137880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1;
137980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (pixels > 1)
138080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1 + (pixels - 1) * ps;
138180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (pixels < 0)
138280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1 - (-pixels + 1) * ps;
138380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
138480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
138580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
138680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
138780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
138880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 screen_width,
138980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
139080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode, bool fieldmode,
139180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int field_offset,
139280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned *offset0, unsigned *offset1,
139380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		s32 *row_inc, s32 *pix_inc)
139480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
139580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u8 ps;
139680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
139780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME CLUT formats */
139880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
139980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
140080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
140180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
140280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
140380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
140480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
140580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_YUV2:
140680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_UYVY:
140780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = 4;
140880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
140980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
141080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = color_mode_to_bpp(color_mode) / 8;
141180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
141280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
141380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
141480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width,
141580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width, height);
141680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
141780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
141880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
141980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
142080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
142180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (rotation + mirror * 4) {
142280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0:
142380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180:
142480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/*
142580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * If the pixel format is YUV or UYVY divide the width
142680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * of the image by 2 for 0 and 180 degree rotation.
142780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
142880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
142980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY)
143080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width = width >> 1;
143180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90:
143280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270:
143380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
143480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
143580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = field_offset * screen_width * ps;
143680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
143780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = 0;
143880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
143980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 + (screen_width - width) +
144080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
144180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
144280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
144380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
144480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
144580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0 + 4:
144680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180 + 4:
144780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* If the pixel format is YUV or UYVY divide the width
144880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * of the image by 2  for 0 degree and 180 degree
144980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
145080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
145180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY)
145280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width = width >> 1;
145380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90 + 4:
145480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270 + 4:
145580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
145680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
145780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = field_offset * screen_width * ps;
145880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
145980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = 0;
146080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 - (screen_width + width) -
146180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
146280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
146380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
146480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
146580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
146680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
146780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
146880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
146980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
147080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
147180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_dma_rotation_offset(u8 rotation, bool mirror,
147280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 screen_width,
147380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
147480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode, bool fieldmode,
147580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int field_offset,
147680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned *offset0, unsigned *offset1,
147780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		s32 *row_inc, s32 *pix_inc)
147880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
147980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u8 ps;
148080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 fbw, fbh;
148180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
148280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME CLUT formats */
148380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
148480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
148580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
148680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
148780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
148880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
148980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
149080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
149180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = color_mode_to_bpp(color_mode) / 8;
149280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
149380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
149480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
149580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width,
149680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width, height);
149780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
149880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* width & height are overlay sizes, convert to fb sizes */
149980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
150080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (rotation == OMAP_DSS_ROT_0 || rotation == OMAP_DSS_ROT_180) {
150180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbw = width;
150280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbh = height;
150380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
150480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbw = height;
150580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbh = width;
150680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
150780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
150880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
150980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
151080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
151180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
151280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (rotation + mirror * 4) {
151380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0:
151480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
151580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
151680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * screen_width * ps;
151780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
151880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
151980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 + (screen_width - fbw) +
152080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
152180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
152280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
152380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
152480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90:
152580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = screen_width * (fbh - 1) * ps;
152680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
152780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * ps;
152880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
152980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
153080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * (fbh - 1) + 1 +
153180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0), ps);
153280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-screen_width, ps);
153380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
153480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180:
153580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
153680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
153780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * screen_width * ps;
153880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
153980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
154080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-1 -
154180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(screen_width - fbw) -
154280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
154380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
154480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-1, ps);
154580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
154680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270:
154780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (fbw - 1) * ps;
154880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
154980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * ps;
155080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
155180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
155280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-screen_width * (fbh - 1) - 1 -
155380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0), ps);
155480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(screen_width, ps);
155580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
155680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
155780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* mirroring */
155880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0 + 4:
155980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (fbw - 1) * ps;
156080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
156180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * screen_width * ps;
156280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
156380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
156480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * 2 - 1 +
156580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
156680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
156780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-1, ps);
156880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
156980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
157080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90 + 4:
157180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
157280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
157380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * ps;
157480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
157580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
157680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-screen_width * (fbh - 1) + 1 +
157780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0),
157880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
157980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(screen_width, ps);
158080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
158180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
158280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180 + 4:
158380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = screen_width * (fbh - 1) * ps;
158480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
158580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * screen_width * ps;
158680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
158780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
158880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 - screen_width * 2 -
158980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
159080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
159180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
159280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
159380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
159480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270 + 4:
159580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
159680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
159780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * ps;
159880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
159980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
160080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * (fbh - 1) - 1 -
160180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0),
160280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
160380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-screen_width, ps);
160480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
160580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
160680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
160780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
160880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
160980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
161080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1611ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk_five_taps(enum omap_channel channel, u16 width,
1612ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 height, u16 out_width, u16 out_height,
1613ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		enum omap_color_mode color_mode)
161480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
161580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 fclk = 0;
161680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME venc pclk? */
161726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	u64 tmp, pclk = dispc_mgr_pclk_rate(channel);
161880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
161980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (height > out_height) {
162080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* FIXME get real display PPL */
162180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int ppl = 800;
162280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
162380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		tmp = pclk * height * out_width;
162480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		do_div(tmp, 2 * out_height * ppl);
162580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fclk = tmp;
162680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
16272d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä		if (height > 2 * out_height) {
16282d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä			if (ppl == out_width)
16292d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä				return 0;
16302d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä
163180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			tmp = pclk * (height - 2 * out_height) * out_width;
163280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			do_div(tmp, 2 * out_height * (ppl - out_width));
163380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			fclk = max(fclk, (u32) tmp);
163480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
163580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
163680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
163780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (width > out_width) {
163880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		tmp = pclk * width;
163980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		do_div(tmp, out_width);
164080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fclk = max(fclk, (u32) tmp);
164180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
164280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_RGB24U)
164380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			fclk <<= 1;
164480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
164580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
164680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return fclk;
164780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
164880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1649ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk(enum omap_channel channel, u16 width,
1650ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 height, u16 out_width, u16 out_height)
165180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
165280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned int hf, vf;
165380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
165480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
165580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * FIXME how to determine the 'A' factor
165680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * for the no downscaling case ?
165780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
165880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
165980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (width > 3 * out_width)
166080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 4;
166180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (width > 2 * out_width)
166280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 3;
166380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (width > out_width)
166480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 2;
166580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
166680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 1;
166780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
166880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (height > out_height)
166980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		vf = 2;
167080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
167180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		vf = 1;
167280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
167380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME venc pclk? */
167426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	return dispc_mgr_pclk_rate(channel) * vf * hf;
167580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
167680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1677f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenint dispc_ovl_setup(enum omap_plane plane,
167880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 paddr, u16 screen_width,
167980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 pos_x, u16 pos_y,
168080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
168180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 out_width, u16 out_height,
168280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode,
168380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bool ilace,
168480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_rotation_type rotation_type,
1685e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen		u8 rotation, bool mirror,
168618faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal		u8 global_alpha, u8 pre_mult_alpha,
16870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		enum omap_channel channel, u32 puv_addr)
168880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
168980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const int maxdownscale = cpu_is_omap34xx() ? 4 : 2;
169080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool five_taps = 0;
169180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool fieldmode = 0;
169280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int cconv = 0;
169380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned offset0, offset1;
169480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	s32 row_inc;
169580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	s32 pix_inc;
169680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 frame_height = height;
169780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned int field_offset = 0;
169880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1699f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	DSSDBG("dispc_ovl_setup %d, pa %x, sw %d, %d,%d, %dx%d -> "
1700e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       "%dx%d, ilace %d, cmode %x, rot %d, mir %d chan %d\n",
1701e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       plane, paddr, screen_width, pos_x, pos_y,
1702e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       width, height,
1703e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       out_width, out_height,
1704e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       ilace, color_mode,
1705e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       rotation, mirror, channel);
1706e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
170780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (paddr == 0)
170880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
170980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
171080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && height == out_height)
171180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fieldmode = 1;
171280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
171380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace) {
171480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (fieldmode)
171580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			height /= 2;
171680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		pos_y /= 2;
171780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		out_height /= 2;
171880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
171980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("adjusting for ilace: height %d, pos_y %d, "
172080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				"out_height %d\n",
172180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				height, pos_y, out_height);
172280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
172380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17248dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja	if (!dss_feat_color_mode_supported(plane, color_mode))
17258dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja		return -EINVAL;
17268dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja
172780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (plane == OMAP_DSS_GFX) {
172880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (width != out_width || height != out_height)
172980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
173080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
173180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* video plane */
173280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
173380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long fclk = 0;
173480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
173580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (out_width < width / maxdownscale ||
173680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		   out_width > width * 8)
173780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
173880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
173980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (out_height < height / maxdownscale ||
174080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		   out_height > height * 8)
174180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
174280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17438dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
17440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode == OMAP_DSS_COLOR_UYVY ||
17450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode == OMAP_DSS_COLOR_NV12)
174680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			cconv = 1;
174780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
174880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* Must use 5-tap filter? */
174980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		five_taps = height > out_height * 2;
175080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
175180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!five_taps) {
175218faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal			fclk = calc_fclk(channel, width, height, out_width,
175318faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal					out_height);
175480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
175580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			/* Try 5-tap filter if 3-tap fclk is too high */
175680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (cpu_is_omap34xx() && height > out_height &&
175780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					fclk > dispc_fclk_rate())
175880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				five_taps = true;
175980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
176080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
176180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (width > (2048 >> five_taps)) {
176280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to set up scaling, fclk too low\n");
176380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
176480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
176580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
176680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (five_taps)
176718faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal			fclk = calc_fclk_five_taps(channel, width, height,
176818faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal					out_width, out_height, color_mode);
176980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
177080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("required fclk rate = %lu Hz\n", fclk);
177180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("current fclk rate = %lu Hz\n", dispc_fclk_rate());
177280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17732d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä		if (!fclk || fclk > dispc_fclk_rate()) {
177480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to set up scaling, "
177580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					"required fclk rate = %lu Hz, "
177680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					"current fclk rate = %lu Hz\n",
177780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					fclk, dispc_fclk_rate());
177880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
177980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
178080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
178180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
178280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && !fieldmode) {
178380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/*
178480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * when downscaling the bottom field may have to start several
178580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * source lines below the top field. Unfortunately ACCUI
178680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * registers will only hold the fractional part of the offset
178780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * so the integer part must be added to the base address of the
178880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * bottom field.
178980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
179080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!height || height == out_height)
179180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			field_offset = 0;
179280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
179380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			field_offset = height / out_height / 2;
179480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
179580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
179680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Fields are independent but interleaved in memory. */
179780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (fieldmode)
179880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		field_offset = 1;
179980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
180080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (rotation_type == OMAP_DSS_ROT_DMA)
180180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		calc_dma_rotation_offset(rotation, mirror,
180280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				screen_width, width, frame_height, color_mode,
180380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				fieldmode, field_offset,
180480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				&offset0, &offset1, &row_inc, &pix_inc);
180580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
180680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		calc_vrfb_rotation_offset(rotation, mirror,
180780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				screen_width, width, frame_height, color_mode,
180880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				fieldmode, field_offset,
180980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				&offset0, &offset1, &row_inc, &pix_inc);
181080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
181180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
181280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			offset0, offset1, row_inc, pix_inc);
181380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1814f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_color_mode(plane, color_mode);
181580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1816f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_ba0(plane, paddr + offset0);
1817f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_ba1(plane, paddr + offset1);
181880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (OMAP_DSS_COLOR_NV12 == color_mode) {
1820f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_ba0_uv(plane, puv_addr + offset0);
1821f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_ba1_uv(plane, puv_addr + offset1);
18220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
18230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
18240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
1825f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_row_inc(plane, row_inc);
1826f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_pix_inc(plane, pix_inc);
182780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
182880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("%d,%d %dx%d -> %dx%d\n", pos_x, pos_y, width, height,
182980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			out_width, out_height);
183080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1831f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_pos(plane, pos_x, pos_y);
183280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1833f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_pic_size(plane, width, height);
183480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
183580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (plane != OMAP_DSS_GFX) {
1836f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_scaling(plane, width, height,
183780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				   out_width, out_height,
18380d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				   ilace, five_taps, fieldmode,
18390d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				   color_mode, rotation);
1840f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_vid_size(plane, out_width, out_height);
1841f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen		dispc_ovl_set_vid_color_conv(plane, cconv);
184280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
184380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1844f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_rotation_attrs(plane, rotation, mirror, color_mode);
184580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1846f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_pre_mult_alpha(plane, pre_mult_alpha);
1847f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_setup_global_alpha(plane, global_alpha);
184880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1849f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen	dispc_ovl_set_channel_out(plane, channel);
18508fa8031c542986746ed4dfbd1eb52358bc86000bTomi Valkeinen
185180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
185280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
185380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1854f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinenint dispc_ovl_enable(enum omap_plane plane, bool enable)
185580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
1856e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	DSSDBG("dispc_enable_plane %d, %d\n", plane, enable);
1857e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
18589b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 0, 0);
1859e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
1860e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	return 0;
186180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
186280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
186380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_disable_isr(void *data, u32 mask)
186480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
186580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion *compl = data;
186680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	complete(compl);
186780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
186880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void _enable_lcd_out(enum omap_channel channel, bool enable)
187080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
18712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
18722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, enable ? 1 : 0, 0, 0);
18732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
18742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0);
187580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
187680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
187726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_lcd_out(enum omap_channel channel, bool enable)
187880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
187980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion frame_done_completion;
188080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool is_on;
188180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
18822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	u32 irq;
188380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
188480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* When we disable LCD output, we need to wait until frame is done.
188580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * Otherwise the DSS is still working, and turning off the clocks
188680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * prevents DSS from going to OFF mode */
18872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	is_on = channel == OMAP_DSS_CHANNEL_LCD2 ?
18882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			REG_GET(DISPC_CONTROL2, 0, 0) :
18892a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			REG_GET(DISPC_CONTROL, 0, 0);
18902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
18912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	irq = channel == OMAP_DSS_CHANNEL_LCD2 ? DISPC_IRQ_FRAMEDONE2 :
18922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			DISPC_IRQ_FRAMEDONE;
189380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
189480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!enable && is_on) {
189580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		init_completion(&frame_done_completion);
189680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
189780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		r = omap_dispc_register_isr(dispc_disable_isr,
18982a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				&frame_done_completion, irq);
189980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
190080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (r)
190180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to register FRAMEDONE isr\n");
190280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
190380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
19042a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	_enable_lcd_out(channel, enable);
190580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
190680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!enable && is_on) {
190780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!wait_for_completion_timeout(&frame_done_completion,
190880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					msecs_to_jiffies(100)))
190980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("timeout waiting for FRAME DONE\n");
191080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
191180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		r = omap_dispc_unregister_isr(dispc_disable_isr,
19122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				&frame_done_completion, irq);
191380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
191480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (r)
191580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to unregister FRAMEDONE isr\n");
191680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
191780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
191880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
191980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _enable_digit_out(bool enable)
192080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
192180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1);
192280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
192380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
192426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_enable_digit_out(bool enable)
192580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
192680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion frame_done_completion;
192780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
192880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1929e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	if (REG_GET(DISPC_CONTROL, 1, 1) == enable)
193080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
193180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
193280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (enable) {
193380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long flags;
193480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* When we enable digit output, we'll get an extra digit
193580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * sync lost interrupt, that we need to ignore */
193680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_lock_irqsave(&dispc.irq_lock, flags);
193780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT;
193880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
193980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_unlock_irqrestore(&dispc.irq_lock, flags);
194080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
194180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
194280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* When we disable digit output, we need to wait until fields are done.
194380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * Otherwise the DSS is still working, and turning off the clocks
194480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * prevents DSS from going to OFF mode. And when enabling, we need to
194580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * wait for the extra sync losts */
194680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	init_completion(&frame_done_completion);
194780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
194880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion,
194980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD);
195080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
195180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("failed to register EVSYNC isr\n");
195280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
195380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_enable_digit_out(enable);
195480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
195580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* XXX I understand from TRM that we should only wait for the
195680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * current field to complete. But it seems we have to wait
195780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * for both fields */
195880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!wait_for_completion_timeout(&frame_done_completion,
195980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				msecs_to_jiffies(100)))
196080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("timeout waiting for EVSYNC\n");
196180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
196280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!wait_for_completion_timeout(&frame_done_completion,
196380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				msecs_to_jiffies(100)))
196480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("timeout waiting for EVSYNC\n");
196580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
196680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_unregister_isr(dispc_disable_isr,
196780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			&frame_done_completion,
196880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD);
196980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
197080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("failed to unregister EVSYNC isr\n");
197180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
197280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (enable) {
197380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long flags;
197480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_lock_irqsave(&dispc.irq_lock, flags);
197580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
19762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		if (dss_has_feature(FEAT_MGR_LCD2))
19772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2;
197880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT);
197980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
198080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_unlock_irqrestore(&dispc.irq_lock, flags);
198180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
198280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
198380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
198426d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_is_enabled(enum omap_channel channel)
1985a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{
1986a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	if (channel == OMAP_DSS_CHANNEL_LCD)
1987a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		return !!REG_GET(DISPC_CONTROL, 0, 0);
1988a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_DIGIT)
1989a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		return !!REG_GET(DISPC_CONTROL, 1, 1);
19902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (channel == OMAP_DSS_CHANNEL_LCD2)
19912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		return !!REG_GET(DISPC_CONTROL2, 0, 0);
1992a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else
1993a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		BUG();
1994a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen}
1995a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen
199626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable(enum omap_channel channel, bool enable)
1997a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{
19982a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD ||
19992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			channel == OMAP_DSS_CHANNEL_LCD2)
200026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen		dispc_mgr_enable_lcd_out(channel, enable);
2001a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_DIGIT)
200226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen		dispc_mgr_enable_digit_out(enable);
2003a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else
2004a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		BUG();
2005a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen}
2006a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen
200780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal_polarity(bool act_high)
200880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20096ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_LCDENABLEPOL))
20106ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20116ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
201280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29);
201380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
201480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
201580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal(bool enable)
201680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20176ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_LCDENABLESIGNAL))
20186ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20196ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
202080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28);
202180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
202280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
202380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_pck_free_enable(bool enable)
202480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20256ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_PCKFREEENABLE))
20266ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20276ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
202880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27);
202980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
203080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
203126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_fifohandcheck(enum omap_channel channel, bool enable)
203280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20332a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
20342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable ? 1 : 0, 16, 16);
20352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
20362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16);
203780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
203880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
203980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
204026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_display_type(enum omap_channel channel,
204164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		enum omap_lcd_display_type type)
204280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
204380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int mode;
204480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
204580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (type) {
204680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_LCD_DISPLAY_STN:
204780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mode = 0;
204880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
204980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
205080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_LCD_DISPLAY_TFT:
205180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mode = 1;
205280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
205380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
205480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
205580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
205680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
205780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
205880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
20592a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
20602a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, mode, 3, 3);
20612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
20622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3);
206380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
206480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
206580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_loadmode(enum omap_dss_load_mode mode)
206680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
206780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1);
206880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
206980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_default_color(enum omap_channel channel, u32 color)
207280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20738613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	dispc_write_reg(DISPC_DEFAULT_COLOR(channel), color);
207480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
207580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenu32 dispc_mgr_get_default_color(enum omap_channel channel)
207780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
207880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
207980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
208080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(channel != OMAP_DSS_CHANNEL_DIGIT &&
20812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		channel != OMAP_DSS_CHANNEL_LCD &&
20822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		channel != OMAP_DSS_CHANNEL_LCD2);
208380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
20848613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	l = dispc_read_reg(DISPC_DEFAULT_COLOR(channel));
208580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
208680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return l;
208780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
208880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
208926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_trans_key(enum omap_channel ch,
209080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_trans_key_type type,
209180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 trans_key)
209280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
209380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
209480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, type, 11, 11);
20952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
209680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, type, 13, 13);
20972a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
20982a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, type, 11, 11);
209980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
21008613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	dispc_write_reg(DISPC_TRANS_COLOR(ch), trans_key);
210180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
210280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
210326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_get_trans_key(enum omap_channel ch,
210480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_trans_key_type *type,
210580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 *trans_key)
210680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
210780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (type) {
210880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (ch == OMAP_DSS_CHANNEL_LCD)
210980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*type = REG_GET(DISPC_CONFIG, 11, 11);
211080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else if (ch == OMAP_DSS_CHANNEL_DIGIT)
211180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*type = REG_GET(DISPC_CONFIG, 13, 13);
21122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		else if (ch == OMAP_DSS_CHANNEL_LCD2)
21132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			*type = REG_GET(DISPC_CONFIG2, 11, 11);
211480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
211580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			BUG();
211680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
211780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
211880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (trans_key)
21198613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal		*trans_key = dispc_read_reg(DISPC_TRANS_COLOR(ch));
212080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
212180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
212226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable)
212380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
212480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
212580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10);
21262a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
212780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12);
21282a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
21292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10);
213080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
213126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_enable_alpha_blending(enum omap_channel ch, bool enable)
213280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2133a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
213480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
213580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
213680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
213780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18);
21382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
213980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
21402a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
21412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable, 18, 18);
214280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
214326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_alpha_blending_enabled(enum omap_channel ch)
214480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
214580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool enabled;
214680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2147a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
214880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return false;
214980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
215080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
215180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 18, 18);
215280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
2153712247a6811530acdd604fa21574ccf1f2d80838Archit Taneja		enabled = REG_GET(DISPC_CONFIG, 19, 19);
21542a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_LCD2)
21552a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enabled = REG_GET(DISPC_CONFIG2, 18, 18);
215680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
215780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
215880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
215980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return enabled;
216080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
216180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenbool dispc_mgr_trans_key_enabled(enum omap_channel ch)
216480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
216580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool enabled;
216680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
216880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 10, 10);
216980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
217080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 12, 12);
21712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_LCD2)
21722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enabled = REG_GET(DISPC_CONFIG2, 10, 10);
217380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
217480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
217580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
217680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return enabled;
217780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
217880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
217980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
218026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines)
218180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
218280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int code;
218380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
218480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (data_lines) {
218580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 12:
218680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 0;
218780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
218880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 16:
218980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 1;
219080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 18:
219280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 2;
219380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 24:
219580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 3;
219680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
219880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
219980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
220080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
220180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
22022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
22032a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, code, 9, 8);
22042a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
22052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, code, 9, 8);
220680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
220780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2208569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode)
220980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
221080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
2211569969d6015f846926267cc40ed5fec936717f68Archit Taneja	int gpout0, gpout1;
221280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
221380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (mode) {
2214569969d6015f846926267cc40ed5fec936717f68Archit Taneja	case DSS_IO_PAD_MODE_RESET:
2215569969d6015f846926267cc40ed5fec936717f68Archit Taneja		gpout0 = 0;
2216569969d6015f846926267cc40ed5fec936717f68Archit Taneja		gpout1 = 0;
221780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
2218569969d6015f846926267cc40ed5fec936717f68Archit Taneja	case DSS_IO_PAD_MODE_RFBI:
2219569969d6015f846926267cc40ed5fec936717f68Archit Taneja		gpout0 = 1;
222080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		gpout1 = 0;
222180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
2222569969d6015f846926267cc40ed5fec936717f68Archit Taneja	case DSS_IO_PAD_MODE_BYPASS:
2223569969d6015f846926267cc40ed5fec936717f68Archit Taneja		gpout0 = 1;
222480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		gpout1 = 1;
222580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
222680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
222780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
222880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
222980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
223080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2231569969d6015f846926267cc40ed5fec936717f68Archit Taneja	l = dispc_read_reg(DISPC_CONTROL);
2232569969d6015f846926267cc40ed5fec936717f68Archit Taneja	l = FLD_MOD(l, gpout0, 15, 15);
2233569969d6015f846926267cc40ed5fec936717f68Archit Taneja	l = FLD_MOD(l, gpout1, 16, 16);
2234569969d6015f846926267cc40ed5fec936717f68Archit Taneja	dispc_write_reg(DISPC_CONTROL, l);
2235569969d6015f846926267cc40ed5fec936717f68Archit Taneja}
2236569969d6015f846926267cc40ed5fec936717f68Archit Taneja
2237569969d6015f846926267cc40ed5fec936717f68Archit Tanejavoid dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable)
2238569969d6015f846926267cc40ed5fec936717f68Archit Taneja{
2239569969d6015f846926267cc40ed5fec936717f68Archit Taneja	if (channel == OMAP_DSS_CHANNEL_LCD2)
2240569969d6015f846926267cc40ed5fec936717f68Archit Taneja		REG_FLD_MOD(DISPC_CONTROL2, enable, 11, 11);
2241569969d6015f846926267cc40ed5fec936717f68Archit Taneja	else
2242569969d6015f846926267cc40ed5fec936717f68Archit Taneja		REG_FLD_MOD(DISPC_CONTROL, enable, 11, 11);
224380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
224480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
224580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp,
224680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int vsw, int vfp, int vbp)
224780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
224880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
224980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (hsw < 1 || hsw > 64 ||
225080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hfp < 1 || hfp > 256 ||
225180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hbp < 1 || hbp > 256 ||
225280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vsw < 1 || vsw > 64 ||
225380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vfp < 0 || vfp > 255 ||
225480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vbp < 0 || vbp > 255)
225580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return false;
225680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
225780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (hsw < 1 || hsw > 256 ||
225880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hfp < 1 || hfp > 4096 ||
225980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hbp < 1 || hbp > 4096 ||
226080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vsw < 1 || vsw > 256 ||
226180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vfp < 0 || vfp > 4095 ||
226280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vbp < 0 || vbp > 4095)
226380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return false;
226480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
226580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
226680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return true;
226780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
226880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
226980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_lcd_timings_ok(struct omap_video_timings *timings)
227080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
227180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return _dispc_lcd_timings_ok(timings->hsw, timings->hfp,
227280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->hbp, timings->vsw,
227380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->vfp, timings->vbp);
227480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
227580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
227626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_lcd_timings(enum omap_channel channel, int hsw,
227764ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		int hfp, int hbp, int vsw, int vfp, int vbp)
227880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
227980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 timing_h, timing_v;
228080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
228180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
228280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) |
228380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(hbp-1, 27, 20);
228480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
228580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) |
228680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(vbp, 27, 20);
228780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
228880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) |
228980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(hbp-1, 31, 20);
229080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
229180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_v = FLD_VAL(vsw-1, 7, 0) | FLD_VAL(vfp, 19, 8) |
229280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(vbp, 31, 20);
229380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
229480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
229564ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	dispc_write_reg(DISPC_TIMING_H(channel), timing_h);
229664ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	dispc_write_reg(DISPC_TIMING_V(channel), timing_v);
229780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
229880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
229980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* change name to mode? */
230026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_lcd_timings(enum omap_channel channel,
230164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		struct omap_video_timings *timings)
230280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
230380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned xtot, ytot;
230480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long ht, vt;
230580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
230680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp,
230780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				timings->hbp, timings->vsw,
230880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				timings->vfp, timings->vbp))
230980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
231080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
231126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	_dispc_mgr_set_lcd_timings(channel, timings->hsw, timings->hfp,
231264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal			timings->hbp, timings->vsw, timings->vfp,
231364ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal			timings->vbp);
231480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
231526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	dispc_mgr_set_lcd_size(channel, timings->x_res, timings->y_res);
231680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
231780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp;
231880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp;
231980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
232080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ht = (timings->pixel_clock * 1000) / xtot;
232180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	vt = (timings->pixel_clock * 1000) / xtot / ytot;
232280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
23232a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	DSSDBG("channel %d xres %u yres %u\n", channel, timings->x_res,
23242a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			timings->y_res);
232580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("pck %u\n", timings->pixel_clock);
232680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n",
232780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->hsw, timings->hfp, timings->hbp,
232880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->vsw, timings->vfp, timings->vbp);
232980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
233080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt);
233180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
233280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
233326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_set_lcd_divisor(enum omap_channel channel, u16 lck_div,
2334ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 pck_div)
233580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
233680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(lck_div < 1);
23379eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	BUG_ON(pck_div < 1);
233880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2339ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	dispc_write_reg(DISPC_DIVISORo(channel),
234080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0));
234180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
234280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
234326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void dispc_mgr_get_lcd_divisor(enum omap_channel channel, int *lck_div,
23442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		int *pck_div)
234580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
234680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
2347ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
234880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	*lck_div = FLD_GET(l, 23, 16);
234980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	*pck_div = FLD_GET(l, 7, 0);
235080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
235180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
235280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenunsigned long dispc_fclk_rate(void)
235380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2354a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja	struct platform_device *dsidev;
235580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r = 0;
235680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
235766534e8e936a0b926863df90054dc59826d70528Archit Taneja	switch (dss_get_dispc_clk_source()) {
235889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_FCK:
23594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = clk_get_rate(dispc.dss_clk);
236066534e8e936a0b926863df90054dc59826d70528Archit Taneja		break;
236189a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
2362a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		dsidev = dsi_get_dsidev_from_id(0);
2363a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
236466534e8e936a0b926863df90054dc59826d70528Archit Taneja		break;
23655a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja	case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
23665a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		dsidev = dsi_get_dsidev_from_id(1);
23675a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
23685a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		break;
236966534e8e936a0b926863df90054dc59826d70528Archit Taneja	default:
237066534e8e936a0b926863df90054dc59826d70528Archit Taneja		BUG();
237166534e8e936a0b926863df90054dc59826d70528Archit Taneja	}
237266534e8e936a0b926863df90054dc59826d70528Archit Taneja
237380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return r;
237480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
237580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
237626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_lclk_rate(enum omap_channel channel)
237780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2378a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja	struct platform_device *dsidev;
237980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int lcd;
238080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r;
238180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
238280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2383ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
238480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
238580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	lcd = FLD_GET(l, 23, 16);
238680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2387ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	switch (dss_get_lcd_clk_source(channel)) {
238889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_FCK:
23894fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = clk_get_rate(dispc.dss_clk);
2390ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		break;
239189a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
2392a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		dsidev = dsi_get_dsidev_from_id(0);
2393a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
2394ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		break;
23955a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja	case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
23965a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		dsidev = dsi_get_dsidev_from_id(1);
23975a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
23985a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		break;
2399ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	default:
2400ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		BUG();
2401ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	}
240280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
240380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return r / lcd;
240480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
240580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
240626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenunsigned long dispc_mgr_pclk_rate(enum omap_channel channel)
240780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2408ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	int pcd;
240980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r;
241080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
241180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2412ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
241380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
241480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	pcd = FLD_GET(l, 7, 0);
241580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
241626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	r = dispc_mgr_lclk_rate(channel);
241780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2418ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	return r / pcd;
241980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
242080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
242180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_clocks(struct seq_file *s)
242280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
242380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int lcd, pcd;
24240cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	u32 l;
242589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	enum omap_dss_clk_source dispc_clk_src = dss_get_dispc_clk_source();
242689a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	enum omap_dss_clk_source lcd_clk_src;
242780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
24284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (dispc_runtime_get())
24294fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return;
243080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
243180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	seq_printf(s, "- DISPC -\n");
243280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2433067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja	seq_printf(s, "dispc fclk source = %s (%s)\n",
2434067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja			dss_get_generic_clk_source_name(dispc_clk_src),
2435067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja			dss_feat_get_clk_source_name(dispc_clk_src));
243680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
243780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	seq_printf(s, "fck\t\t%-16lu\n", dispc_fclk_rate());
24382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
24390cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV)) {
24400cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		seq_printf(s, "- DISPC-CORE-CLK -\n");
24410cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = dispc_read_reg(DISPC_DIVISOR);
24420cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		lcd = FLD_GET(l, 23, 16);
24430cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
24440cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
24450cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer				(dispc_fclk_rate()/lcd), lcd);
24460cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	}
24472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	seq_printf(s, "- LCD1 -\n");
24482a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2449ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD);
2450ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
2451ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	seq_printf(s, "lcd1_clk source = %s (%s)\n",
2452ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		dss_get_generic_clk_source_name(lcd_clk_src),
2453ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		dss_feat_get_clk_source_name(lcd_clk_src));
2454ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
245526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD, &lcd, &pcd);
24562a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2457ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
245826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen			dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD), lcd);
2459ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	seq_printf(s, "pck\t\t%-16lupck div\t%u\n",
246026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen			dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD), pcd);
24612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
24622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "- LCD2 -\n");
24632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2464ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD2);
2465ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
2466ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		seq_printf(s, "lcd2_clk source = %s (%s)\n",
2467ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja			dss_get_generic_clk_source_name(lcd_clk_src),
2468ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja			dss_feat_get_clk_source_name(lcd_clk_src));
2469ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
247026d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen		dispc_mgr_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD2, &lcd, &pcd);
247180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
24722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
247326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen				dispc_mgr_lclk_rate(OMAP_DSS_CHANNEL_LCD2), lcd);
24742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "pck\t\t%-16lupck div\t%u\n",
247526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen				dispc_mgr_pclk_rate(OMAP_DSS_CHANNEL_LCD2), pcd);
24762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
24774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
24784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
247980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
248080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2481dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
2482dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenvoid dispc_dump_irqs(struct seq_file *s)
2483dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen{
2484dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	unsigned long flags;
2485dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	struct dispc_irq_stats stats;
2486dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2487dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_lock_irqsave(&dispc.irq_stats_lock, flags);
2488dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2489dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	stats = dispc.irq_stats;
2490dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	memset(&dispc.irq_stats, 0, sizeof(dispc.irq_stats));
2491dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dispc.irq_stats.last_reset = jiffies;
2492dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2493dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_stats_lock, flags);
2494dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2495dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "period %u ms\n",
2496dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen			jiffies_to_msecs(jiffies - stats.last_reset));
2497dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2498dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "irqs %d\n", stats.irq_count);
2499dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \
2500dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "%-20s %10d\n", #x, stats.irqs[ffs(DISPC_IRQ_##x)-1]);
2501dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2502dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(FRAMEDONE);
2503dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VSYNC);
2504dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(EVSYNC_EVEN);
2505dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(EVSYNC_ODD);
2506dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(ACBIAS_COUNT_STAT);
2507dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(PROG_LINE_NUM);
2508dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(GFX_FIFO_UNDERFLOW);
2509dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(GFX_END_WIN);
2510dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(PAL_GAMMA_MASK);
2511dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(OCP_ERR);
2512dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID1_FIFO_UNDERFLOW);
2513dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID1_END_WIN);
2514dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID2_FIFO_UNDERFLOW);
2515dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID2_END_WIN);
2516dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(SYNC_LOST);
2517dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(SYNC_LOST_DIGIT);
2518dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(WAKEUP);
25192a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
25202a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(FRAMEDONE2);
25212a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(VSYNC2);
25222a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(ACBIAS_COUNT_STAT2);
25232a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(SYNC_LOST2);
25242a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
2525dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS
2526dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen}
2527dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif
2528dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
252980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_regs(struct seq_file *s)
253080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
25314dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	int i, j;
25324dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char *mgr_names[] = {
25334dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_LCD]		= "LCD",
25344dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_DIGIT]	= "TV",
25354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_LCD2]		= "LCD2",
25364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	};
25374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char *ovl_names[] = {
25384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_GFX]		= "GFX",
25394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_VIDEO1]	= "VID1",
25404dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_VIDEO2]	= "VID2",
25414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	};
25424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char **p_names;
25434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
25449b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r))
254580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25464fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (dispc_runtime_get())
25474fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return;
254880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25495010be80127eedfd1237627810d9f75e02036111Archit Taneja	/* DISPC common registers */
255080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_REVISION);
255180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_SYSCONFIG);
255280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_SYSSTATUS);
255380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_IRQSTATUS);
255480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_IRQENABLE);
255580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CONTROL);
255680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CONFIG);
255780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CAPABLE);
255880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_LINE_STATUS);
255980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_LINE_NUMBER);
2560332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	if (dss_has_feature(FEAT_GLOBAL_ALPHA))
2561332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		DUMPREG(DISPC_GLOBAL_ALPHA);
25622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
25632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		DUMPREG(DISPC_CONTROL2);
25642a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		DUMPREG(DISPC_CONFIG2);
25655010be80127eedfd1237627810d9f75e02036111Archit Taneja	}
25665010be80127eedfd1237627810d9f75e02036111Archit Taneja
25675010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG
25685010be80127eedfd1237627810d9f75e02036111Archit Taneja
25695010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(i, name) name(i)
25704dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja#define DUMPREG(i, r) seq_printf(s, "%s(%s)%*s %08x\n", #r, p_names[i], \
25714dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	48 - strlen(#r) - strlen(p_names[i]), " ", \
25725010be80127eedfd1237627810d9f75e02036111Archit Taneja	dispc_read_reg(DISPC_REG(i, r)))
25735010be80127eedfd1237627810d9f75e02036111Archit Taneja
25744dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	p_names = mgr_names;
25755010be80127eedfd1237627810d9f75e02036111Archit Taneja
25764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* DISPC channel specific registers */
25774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 0; i < dss_feat_get_num_mgrs(); i++) {
25784dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DEFAULT_COLOR);
25794dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TRANS_COLOR);
25804dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_SIZE_MGR);
258180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25824dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (i == OMAP_DSS_CHANNEL_DIGIT)
25834dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			continue;
25845010be80127eedfd1237627810d9f75e02036111Archit Taneja
25854dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DEFAULT_COLOR);
25864dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TRANS_COLOR);
25874dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TIMING_H);
25884dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TIMING_V);
25894dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_POL_FREQ);
25904dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DIVISORo);
25914dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_SIZE_MGR);
25925010be80127eedfd1237627810d9f75e02036111Archit Taneja
25934dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE1);
25944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE2);
25954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE3);
25962a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2597332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		if (dss_has_feature(FEAT_CPR)) {
25984dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_R);
25994dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_G);
26004dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_B);
2601332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		}
26022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
260380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
26044dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	p_names = ovl_names;
26054dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26064dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 0; i < dss_feat_get_num_ovls(); i++) {
26074dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_BA0);
26084dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_BA1);
26094dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_POSITION);
26104dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_SIZE);
26114dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ATTRIBUTES);
26124dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIFO_THRESHOLD);
26134dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS);
26144dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ROW_INC);
26154dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_PIXEL_INC);
26164dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_PRELOAD))
26174dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_PRELOAD);
26184dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26194dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (i == OMAP_DSS_GFX) {
26204dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_WINDOW_SKIP);
26214dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_TABLE_BA);
26224dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			continue;
26234dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26244dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26254dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIR);
26264dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_PICTURE_SIZE);
26274dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ACCU0);
26284dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ACCU1);
26294dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
26304dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_BA0_UV);
26314dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_BA1_UV);
26324dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR2);
26334dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ACCU2_0);
26344dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ACCU2_1);
26354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_ATTR2))
26374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ATTRIBUTES2);
26384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_PRELOAD))
26394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_PRELOAD);
2640ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	}
26415010be80127eedfd1237627810d9f75e02036111Archit Taneja
26425010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG
26435010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG
26445010be80127eedfd1237627810d9f75e02036111Archit Taneja
26455010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(plane, name, i) name(plane, i)
26465010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DUMPREG(plane, name, i) \
26474dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	seq_printf(s, "%s_%d(%s)%*s %08x\n", #name, i, p_names[plane], \
26484dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	46 - strlen(#name) - strlen(p_names[plane]), " ", \
26495010be80127eedfd1237627810d9f75e02036111Archit Taneja	dispc_read_reg(DISPC_REG(plane, name, i)))
26505010be80127eedfd1237627810d9f75e02036111Archit Taneja
26514dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* Video pipeline coefficient registers */
2652332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen
26534dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* start from OMAP_DSS_VIDEO1 */
26544dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 1; i < dss_feat_get_num_ovls(); i++) {
26554dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 8; j++)
26564dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR_COEF_H, j);
26579b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
26584dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 8; j++)
26594dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR_COEF_HV, j);
26605010be80127eedfd1237627810d9f75e02036111Archit Taneja
26614dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 5; j++)
26624dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_CONV_COEF, j);
2663ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
26644dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_FIR_COEF_V)) {
26654dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26664dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_V, j);
26674dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26684dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26694dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
26704dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26714dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_H2, j);
26724dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26734dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26744dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_HV2, j);
26754dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_V2, j);
26784dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
2679332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	}
268080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
26814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
26825010be80127eedfd1237627810d9f75e02036111Archit Taneja
26835010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG
268480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef DUMPREG
268580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
268680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
268726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenstatic void _dispc_mgr_set_pol_freq(enum omap_channel channel, bool onoff,
268826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen		bool rf, bool ieo, bool ipc, bool ihs, bool ivs, u8 acbi,
268926d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen		u8 acb)
269080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
269180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l = 0;
269280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
269380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n",
269480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			onoff, rf, ieo, ipc, ihs, ivs, acbi, acb);
269580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
269680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(onoff, 17, 17);
269780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(rf, 16, 16);
269880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ieo, 15, 15);
269980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ipc, 14, 14);
270080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ihs, 13, 13);
270180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ivs, 12, 12);
270280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(acbi, 11, 8);
270380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(acb, 7, 0);
270480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2705ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	dispc_write_reg(DISPC_POL_FREQ(channel), l);
270680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
270780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
270826d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenvoid dispc_mgr_set_pol_freq(enum omap_channel channel,
2709ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		enum omap_panel_config config, u8 acbi, u8 acb)
271080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
271126d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	_dispc_mgr_set_pol_freq(channel, (config & OMAP_DSS_LCD_ONOFF) != 0,
271280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_RF) != 0,
271380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IEO) != 0,
271480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IPC) != 0,
271580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IHS) != 0,
271680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IVS) != 0,
271780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			acbi, acb);
271880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
271980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
272080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* with fck as input clock rate, find dispc dividers that produce req_pck */
272180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_find_clk_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
272280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct dispc_clock_info *cinfo)
272380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
27249eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	u16 pcd_min, pcd_max;
272580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long best_pck;
272680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 best_ld, cur_ld;
272780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 best_pd, cur_pd;
272880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
27299eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	pcd_min = dss_feat_get_param_min(FEAT_PARAM_DSS_PCD);
27309eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	pcd_max = dss_feat_get_param_max(FEAT_PARAM_DSS_PCD);
27319eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen
27329eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	if (!is_tft)
27339eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen		pcd_min = 3;
27349eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen
273580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_pck = 0;
273680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_ld = 0;
273780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_pd = 0;
273880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
273980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (cur_ld = 1; cur_ld <= 255; ++cur_ld) {
274080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long lck = fck / cur_ld;
274180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
27429eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen		for (cur_pd = pcd_min; cur_pd <= pcd_max; ++cur_pd) {
274380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			unsigned long pck = lck / cur_pd;
274480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			long old_delta = abs(best_pck - req_pck);
274580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			long new_delta = abs(pck - req_pck);
274680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
274780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (best_pck == 0 || new_delta < old_delta) {
274880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_pck = pck;
274980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_ld = cur_ld;
275080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_pd = cur_pd;
275180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
275280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				if (pck == req_pck)
275380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					goto found;
275480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
275580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
275680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (pck < req_pck)
275780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
275880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
275980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
276080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (lck / pcd_min < req_pck)
276180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			break;
276280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
276380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
276480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenfound:
276580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck_div = best_ld;
276680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck_div = best_pd;
276780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = fck / cinfo->lck_div;
276880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
276980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
277080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
277180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* calculate clock rates using dividers in cinfo */
277280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint dispc_calc_clock_rates(unsigned long dispc_fclk_rate,
277380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct dispc_clock_info *cinfo)
277480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
277580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cinfo->lck_div > 255 || cinfo->lck_div == 0)
277680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
27779eaaf2076dac213c034c69051dd7a625cd41f56eTomi Valkeinen	if (cinfo->pck_div < 1 || cinfo->pck_div > 255)
277880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
277980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
278080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = dispc_fclk_rate / cinfo->lck_div;
278180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
278280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
278380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
278480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
278580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
278626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_set_clock_div(enum omap_channel channel,
2787ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		struct dispc_clock_info *cinfo)
278880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
278980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("lck = %lu (%u)\n", cinfo->lck, cinfo->lck_div);
279080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("pck = %lu (%u)\n", cinfo->pck, cinfo->pck_div);
279180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
279226d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen	dispc_mgr_set_lcd_divisor(channel, cinfo->lck_div, cinfo->pck_div);
279380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
279480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
279580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
279680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
279726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinenint dispc_mgr_get_clock_div(enum omap_channel channel,
2798ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		struct dispc_clock_info *cinfo)
279980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
280080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long fck;
280180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
280280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	fck = dispc_fclk_rate();
280380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2804ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	cinfo->lck_div = REG_GET(DISPC_DIVISORo(channel), 23, 16);
2805ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	cinfo->pck_div = REG_GET(DISPC_DIVISORo(channel), 7, 0);
280680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
280780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = fck / cinfo->lck_div;
280880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
280980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
281080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
281180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
281280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
281380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* dispc.irq_lock has to be locked by the caller */
281480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void)
281580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
281680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 mask;
281780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 old_mask;
281880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
281980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
282080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	mask = dispc.irq_error_mask;
282280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
282480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
282580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr == NULL)
282780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
282880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mask |= isr_data->mask;
283080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
283180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	old_mask = dispc_read_reg(DISPC_IRQENABLE);
283380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* clear the irqstatus for newly enabled irqs */
283480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask);
283580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQENABLE, mask);
283780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
283880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
284080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
284180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
284280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int ret;
284380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
284480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
284580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
284680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (isr == NULL)
284780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
284880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
284980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
285080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
285180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* check for duplicate entry */
285280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
285380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
285480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr == isr && isr_data->arg == arg &&
285580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				isr_data->mask == mask) {
285680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			ret = -EINVAL;
285780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			goto err;
285880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
285980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
286080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	isr_data = NULL;
286280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ret = -EBUSY;
286380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
286580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
286680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr != NULL)
286880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
286980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
287080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->isr = isr;
287180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->arg = arg;
287280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->mask = mask;
287380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ret = 0;
287480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
287580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
287680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
287780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2878b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen	if (ret)
2879b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen		goto err;
2880b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen
288180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
288280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
288480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
288680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenerr:
288780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
288880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return ret;
289080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
289180c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_register_isr);
289280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
289380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
289480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
289580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
289680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
289780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int ret = -EINVAL;
289880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
289980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
290180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
290380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
290480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr != isr || isr_data->arg != arg ||
290580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				isr_data->mask != mask)
290680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
290780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* found the correct isr */
290980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
291080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->isr = NULL;
291180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->arg = NULL;
291280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->mask = 0;
291380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
291480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ret = 0;
291580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
291680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
291780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
291880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ret == 0)
291980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
292080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
292280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return ret;
292480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
292580c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_unregister_isr);
292680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG
292880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void print_irq_status(u32 status)
292980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
293080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if ((status & dispc.irq_error_mask) == 0)
293180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
293280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
293380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status);
293480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
293580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define PIS(x) \
293680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (status & DISPC_IRQ_##x) \
293780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		printk(#x " ");
293880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(GFX_FIFO_UNDERFLOW);
293980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(OCP_ERR);
294080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(VID1_FIFO_UNDERFLOW);
294180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(VID2_FIFO_UNDERFLOW);
294280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(SYNC_LOST);
294380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(SYNC_LOST_DIGIT);
29442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2))
29452a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(SYNC_LOST2);
294680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef PIS
294780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
294880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	printk("\n");
294980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
295080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
295180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
295280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* Called from dss.c. Note that we don't touch clocks here,
295380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * but we presume they are on because we got an IRQ. However,
295480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * an irq handler may turn the clocks off, so we may not have
295580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * clock later in the function. */
2956affe360d13e54b415cde2f11cee02369b4ed54bdArchit Tanejastatic irqreturn_t omap_dispc_irq_handler(int irq, void *arg)
295780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
295880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
2959affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	u32 irqstatus, irqenable;
296080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 handledirqs = 0;
296180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 unhandled_errors;
296280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
296380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
296480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
296580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock(&dispc.irq_lock);
296680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
296780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	irqstatus = dispc_read_reg(DISPC_IRQSTATUS);
2968affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	irqenable = dispc_read_reg(DISPC_IRQENABLE);
2969affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
2970affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	/* IRQ is not for us */
2971affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (!(irqstatus & irqenable)) {
2972affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		spin_unlock(&dispc.irq_lock);
2973affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		return IRQ_NONE;
2974affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
297580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2976dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
2977dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_lock(&dispc.irq_stats_lock);
2978dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dispc.irq_stats.irq_count++;
2979dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dss_collect_irq_stats(irqstatus, dispc.irq_stats.irqs);
2980dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_unlock(&dispc.irq_stats_lock);
2981dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif
2982dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
298380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG
298480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (dss_debug)
298580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		print_irq_status(irqstatus);
298680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
298780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Ack the interrupt. Do it here before clocks are possibly turned
298880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * off */
298980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, irqstatus);
299080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* flush posted write */
299180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_read_reg(DISPC_IRQSTATUS);
299280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
299380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* make a copy and unlock, so that isrs can unregister
299480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * themselves */
299580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	memcpy(registered_isr, dispc.registered_isr,
299680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			sizeof(registered_isr));
299780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
299880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock(&dispc.irq_lock);
299980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
300080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
300180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &registered_isr[i];
300280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
300380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!isr_data->isr)
300480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
300580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
300680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->mask & irqstatus) {
300780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			isr_data->isr(isr_data->arg, irqstatus);
300880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			handledirqs |= isr_data->mask;
300980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
301080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
301180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock(&dispc.irq_lock);
301380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask;
301580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (unhandled_errors) {
301780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.error_irqs |= unhandled_errors;
301880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask &= ~unhandled_errors;
302080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
302180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
302280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		schedule_work(&dispc.error_work);
302380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
302480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
302580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock(&dispc.irq_lock);
3026affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
3027affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	return IRQ_HANDLED;
302880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
302980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
303080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_error_worker(struct work_struct *work)
303180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
303280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
303380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 errors;
303480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
3035fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned fifo_underflow_bits[] = {
3036fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_GFX_FIFO_UNDERFLOW,
3037fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_VID1_FIFO_UNDERFLOW,
3038fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_VID2_FIFO_UNDERFLOW,
3039fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	};
3040fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
3041fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned sync_lost_bits[] = {
3042fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST,
3043fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST_DIGIT,
3044fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST2,
3045fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	};
304680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
304780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
304880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	errors = dispc.error_irqs;
304980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.error_irqs = 0;
305080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
305180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
305213eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin	dispc_runtime_get();
305313eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin
3054fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
3055fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		struct omap_overlay *ovl;
3056fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		unsigned bit;
305780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3058fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		ovl = omap_dss_get_overlay(i);
3059fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		bit = fifo_underflow_bits[i];
306080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3061fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		if (bit & errors) {
3062fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			DSSERR("FIFO UNDERFLOW on %s, disabling the overlay\n",
3063fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					ovl->name);
3064f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen			dispc_ovl_enable(ovl->id, false);
306526d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen			dispc_mgr_go(ovl->manager->id);
306680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			mdelay(50);
306780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
306880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
306980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3070fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
3071fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		struct omap_overlay_manager *mgr;
3072fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		unsigned bit;
307380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3074fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
3075fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		bit = sync_lost_bits[i];
307680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3077fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		if (bit & errors) {
3078fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			struct omap_dss_device *dssdev = mgr->device;
3079fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			bool enable;
308080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3081fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			DSSERR("SYNC_LOST on channel %s, restarting the output "
3082fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					"with video overlays disabled\n",
3083fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					mgr->name);
30842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
3085fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			enable = dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
3086fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			dssdev->driver->disable(dssdev);
30872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
30882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
30892a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				struct omap_overlay *ovl;
30902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				ovl = omap_dss_get_overlay(i);
30912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
3092fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen				if (ovl->id != OMAP_DSS_GFX &&
3093fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen						ovl->manager == mgr)
3094f0e5caab9771173a6c7a47add4b2e5174c7f11bbTomi Valkeinen					dispc_ovl_enable(ovl->id, false);
30952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			}
30962a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
309726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen			dispc_mgr_go(mgr->id);
30982a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			mdelay(50);
3099fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
31002a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			if (enable)
31012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				dssdev->driver->enable(dssdev);
31022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		}
31032a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
31042a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
310580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (errors & DISPC_IRQ_OCP_ERR) {
310680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("OCP_ERR\n");
310780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
310880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			struct omap_overlay_manager *mgr;
310980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			mgr = omap_dss_get_overlay_manager(i);
31104a9e78abb76a2f1ddccab7098bdf73a2f095aaa6Tomi Valkeinen			mgr->device->driver->disable(mgr->device);
311180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
311280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
311380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
311480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
311580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.irq_error_mask |= errors;
311680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
311780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
311813eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin
311913eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin	dispc_runtime_put();
312080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
312180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
312280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout)
312380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
312480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void dispc_irq_wait_handler(void *data, u32 mask)
312580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	{
312680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		complete((struct completion *)data);
312780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
312880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
312980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
313080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DECLARE_COMPLETION_ONSTACK(completion);
313180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion,
313380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			irqmask);
313480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
313680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return r;
313780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	timeout = wait_for_completion_timeout(&completion, timeout);
313980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask);
314180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == 0)
314380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ETIMEDOUT;
314480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == -ERESTARTSYS)
314680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ERESTARTSYS;
314780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
314980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
315080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
315180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask,
315280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long timeout)
315380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
315480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void dispc_irq_wait_handler(void *data, u32 mask)
315580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	{
315680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		complete((struct completion *)data);
315780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
315880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
315980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
316080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DECLARE_COMPLETION_ONSTACK(completion);
316180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion,
316380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			irqmask);
316480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
316680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return r;
316780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	timeout = wait_for_completion_interruptible_timeout(&completion,
316980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timeout);
317080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask);
317280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == 0)
317480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ETIMEDOUT;
317580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == -ERESTARTSYS)
317780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ERESTARTSYS;
317880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
318080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
318180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
318280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC
318380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_fake_vsync_irq(void)
318480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
318580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 irqstatus = DISPC_IRQ_VSYNC;
318680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
318780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3188ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen	WARN_ON(!in_interrupt());
318980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
319080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
319180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct omap_dispc_isr_data *isr_data;
319280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
319380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
319480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!isr_data->isr)
319580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
319680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
319780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->mask & irqstatus)
319880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			isr_data->isr(isr_data->arg, irqstatus);
319980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
320080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
320180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
320280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initialize_irq(void)
320480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
320580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
320680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
320880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr));
321080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
32122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2))
32132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2;
321480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* there's SYNC_LOST_DIGIT waiting after enabling the DSS,
321680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * so clear it */
321780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS));
321880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
322080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
322280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
322380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_sidle(void)
322580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
322680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3);	/* SIDLEMODE: smart idle */
322780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
322880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_disable_sidle(void)
323080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
323180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3);	/* SIDLEMODE: no idle */
323280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
323380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
323480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initial_config(void)
323580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
323680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
323780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
32380cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	/* Exclusively enable DISPC_CORE_CLK and set divider to 1 */
32390cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV)) {
32400cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = dispc_read_reg(DISPC_DIVISOR);
32410cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		/* Use DISPC_DIVISOR.LCD, instead of DISPC_DIVISOR1.LCD */
32420cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = FLD_MOD(l, 1, 0, 0);
32430cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = FLD_MOD(l, 1, 23, 16);
32440cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		dispc_write_reg(DISPC_DIVISOR, l);
32450cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	}
32460cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
324780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FUNCGATED */
32486ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (dss_has_feature(FEAT_FUNCGATED))
32496ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9);
325080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* L3 firewall setting: enable access to OCM RAM */
325280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* XXX this should be somewhere in plat-omap */
325380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx())
325480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		__raw_writel(0x402000b0, OMAP2_L3_IO_ADDRESS(0x680050a0));
325580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_setup_color_conv_coef();
325780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY);
325980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
326080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_read_plane_fifo_sizes();
32615ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
32625ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	dispc_configure_burst_sizes();
326380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
326480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3265060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy/* DISPC HW IP initialisation */
3266060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_probe(struct platform_device *pdev)
3267060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3268060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	u32 rev;
3269affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	int r = 0;
3270ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	struct resource *dispc_mem;
32714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	struct clk *clk;
3272ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy
3273060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	dispc.pdev = pdev;
3274060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
32754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk = clk_get(&pdev->dev, "fck");
32764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (IS_ERR(clk)) {
32774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		DSSERR("can't get fck\n");
32784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = PTR_ERR(clk);
32794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_get_clk;
32804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	}
32814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
32824fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc.dss_clk = clk;
32834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3284060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	spin_lock_init(&dispc.irq_lock);
3285060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3286060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
3287060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	spin_lock_init(&dispc.irq_stats_lock);
3288060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	dispc.irq_stats.last_reset = jiffies;
3289060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#endif
3290060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3291060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	INIT_WORK(&dispc.error_work, dispc_error_worker);
3292060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3293ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0);
3294ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	if (!dispc_mem) {
3295ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy		DSSERR("can't get IORESOURCE_MEM DISPC\n");
3296affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -EINVAL;
32974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_ioremap;
3298ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	}
3299ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	dispc.base = ioremap(dispc_mem->start, resource_size(dispc_mem));
3300060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	if (!dispc.base) {
3301060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		DSSERR("can't ioremap DISPC\n");
3302affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -ENOMEM;
33034fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_ioremap;
3304affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
3305affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	dispc.irq = platform_get_irq(dispc.pdev, 0);
3306affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (dispc.irq < 0) {
3307affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		DSSERR("platform_get_irq failed\n");
3308affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -ENODEV;
33094fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_irq;
3310affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
3311affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
3312affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	r = request_irq(dispc.irq, omap_dispc_irq_handler, IRQF_SHARED,
3313affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		"OMAP DISPC", dispc.pdev);
3314affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (r < 0) {
3315affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		DSSERR("request_irq failed\n");
33164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_irq;
3317060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	}
3318060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33194fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_enable(&pdev->dev);
33204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = dispc_runtime_get();
33224fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r)
33234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_runtime_get;
3324060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3325060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	_omap_dispc_initial_config();
3326060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3327060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	_omap_dispc_initialize_irq();
3328060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3329060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	rev = dispc_read_reg(DISPC_REVISION);
3330a06b62f8004bd95c132fa312e8593c9a10f466ecSumit Semwal	dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n",
3331060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
3332060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
3334060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3335060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return 0;
33364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_runtime_get:
33384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
33394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	free_irq(dispc.irq, dispc.pdev);
33404fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_irq:
3341affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	iounmap(dispc.base);
33424fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_ioremap:
33434fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk_put(dispc.dss_clk);
33444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_clk:
3345affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	return r;
3346060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3347060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3348060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_remove(struct platform_device *pdev)
3349060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
33504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
33514fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk_put(dispc.dss_clk);
33534fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3354affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	free_irq(dispc.irq, dispc.pdev);
3355060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	iounmap(dispc.base);
3356060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return 0;
3357060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3358060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_suspend(struct device *dev)
33604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
33614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_save_context();
33624fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dss_runtime_put();
33634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
33654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
33664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_resume(struct device *dev)
33684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
33694fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
33704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = dss_runtime_get();
33724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r < 0)
33734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return r;
33744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
337549ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	dispc_restore_context();
33764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
33784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
33794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dispc_pm_ops = {
33814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_suspend = dispc_runtime_suspend,
33824fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_resume = dispc_runtime_resume,
33834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen};
33844fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3385060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic struct platform_driver omap_dispchw_driver = {
3386060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.probe          = omap_dispchw_probe,
3387060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.remove         = omap_dispchw_remove,
3388060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.driver         = {
3389060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		.name   = "omapdss_dispc",
3390060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		.owner  = THIS_MODULE,
33914fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		.pm	= &dispc_pm_ops,
3392060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	},
3393060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy};
3394060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3395060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyint dispc_init_platform_driver(void)
3396060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3397060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return platform_driver_register(&omap_dispchw_driver);
3398060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3399060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3400060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyvoid dispc_uninit_platform_driver(void)
3401060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3402060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return platform_driver_unregister(&omap_dispchw_driver);
3403060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3404