dispc.c revision fe3cc9d6cd4c8279f4ea70acc71525a489cfc38a
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
42280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_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
43880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_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
48380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_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
48880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_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
49380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_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
498ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_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
505ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_write_firhv2_reg(enum omap_plane plane, int reg, u32 value)
506ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
507ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
508ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
509ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_FIR_COEF_HV2(plane, reg), value);
510ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
511ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
512ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_write_firv2_reg(enum omap_plane plane, int reg, u32 value)
513ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
514ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
515ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
516ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_FIR_COEF_V2(plane, reg), value);
517ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
518ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
51980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup,
5200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				  int vscaleup, int five_taps,
5210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				  enum omap_color_component color_comp)
52280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
52380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Coefficients for horizontal up-sampling */
52466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_h_coef coef_hup[8] = {
52566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,   0, 128,   0,  0 },
52666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1,  13, 124,  -8,  0 },
52766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2,  30, 112, -11, -1 },
52866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -5,  51,  95, -11, -2 },
52966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -9,  73,  73, -9 },
53066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2, -11,  95,  51, -5 },
53166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1, -11, 112,  30, -2 },
53266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -8, 124,  13, -1 },
53380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
53480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
53566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for vertical up-sampling */
53666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vup_3tap[8] = {
53766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  0, 128,  0, 0 },
53866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  3, 123,  2, 0 },
53966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 12, 111,  5, 0 },
54066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 32,  89,  7, 0 },
54166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  0,  64, 64, 0 },
54266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  7,  89, 32, 0 },
54366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  5, 111, 12, 0 },
54466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0,  2, 123,  3, 0 },
54580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
54680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
54766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vup_5tap[8] = {
54866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,   0, 128,   0,  0 },
54966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1,  13, 124,  -8,  0 },
55066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2,  30, 112, -11, -1 },
55166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -5,  51,  95, -11, -2 },
55266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -9,  73,  73, -9 },
55366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -2, -11,  95,  51, -5 },
55466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ -1, -11, 112,  30, -2 },
55566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  0,  -8, 124,  13, -1 },
55680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
55780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
55866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for horizontal down-sampling */
55966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_h_coef coef_hdown[8] = {
56066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   0, 36, 56, 36,  0 },
56166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   4, 40, 55, 31, -2 },
56266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   8, 44, 54, 27, -5 },
56366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  12, 48, 53, 22, -7 },
56466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -9, 17, 52, 51, 17 },
56566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -7, 22, 53, 48, 12 },
56666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -5, 27, 54, 44,  8 },
56766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -2, 31, 55, 40,  4 },
56880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
56980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
57066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	/* Coefficients for vertical down-sampling */
57166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vdown_3tap[8] = {
57266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 36, 56, 36, 0 },
57366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 40, 57, 31, 0 },
57466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 45, 56, 27, 0 },
57566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 50, 55, 23, 0 },
57666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 18, 55, 55, 0 },
57766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 23, 55, 50, 0 },
57866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 27, 56, 45, 0 },
57966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{ 0, 31, 57, 40, 0 },
58080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
58180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
58266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	static const struct dispc_v_coef coef_vdown_5tap[8] = {
58366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   0, 36, 56, 36,  0 },
58466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   4, 40, 55, 31, -2 },
58566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{   8, 44, 54, 27, -5 },
58666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  12, 48, 53, 22, -7 },
58766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -9, 17, 52, 51, 17 },
58866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -7, 22, 53, 48, 12 },
58966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -5, 27, 54, 44,  8 },
59066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		{  -2, 31, 55, 40,  4 },
59180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
59280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
59366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	const struct dispc_h_coef *h_coef;
59466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	const struct dispc_v_coef *v_coef;
59580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
59680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
59780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (hscaleup)
59880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		h_coef = coef_hup;
59980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
60080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		h_coef = coef_hdown;
60180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
60266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	if (vscaleup)
60366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		v_coef = five_taps ? coef_vup_5tap : coef_vup_3tap;
60466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	else
60566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		v_coef = five_taps ? coef_vdown_5tap : coef_vdown_3tap;
60680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
60780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < 8; i++) {
60880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 h, hv;
60980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
61066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		h = FLD_VAL(h_coef[i].hc0, 7, 0)
61166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc1, 15, 8)
61266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc2, 23, 16)
61366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(h_coef[i].hc3, 31, 24);
61466be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		hv = FLD_VAL(h_coef[i].hc4, 7, 0)
61566be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc0, 15, 8)
61666be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc1, 23, 16)
61766be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			| FLD_VAL(v_coef[i].vc2, 31, 24);
61880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
6190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) {
6200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			_dispc_write_firh_reg(plane, i, h);
6210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			_dispc_write_firhv_reg(plane, i, hv);
6220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		} else {
6230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			_dispc_write_firh2_reg(plane, i, h);
6240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			_dispc_write_firhv2_reg(plane, i, hv);
6250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		}
6260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
62780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
62880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
62966be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas	if (five_taps) {
63066be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		for (i = 0; i < 8; i++) {
63166be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			u32 v;
63266be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas			v = FLD_VAL(v_coef[i].vc00, 7, 0)
63366be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas				| FLD_VAL(v_coef[i].vc22, 15, 8);
6340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y)
6350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				_dispc_write_firv_reg(plane, i, v);
6360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			else
6370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				_dispc_write_firv2_reg(plane, i, v);
63866be8f6cec4ffd78e5d59921ec9d5e299c0cfa3cGrazvydas Ignotas		}
63980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
64080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
64180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
64280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_setup_color_conv_coef(void)
64380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
644ac01c29e5279fe31632e9118619b365514633235Archit Taneja	int i;
64580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const struct color_conv_coef {
64680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int  ry,  rcr,  rcb,   gy,  gcr,  gcb,   by,  bcr,  bcb;
64780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int  full_range;
64880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}  ctbl_bt601_5 = {
64980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		298,  409,    0,  298, -208, -100,  298,    0,  517, 0,
65080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	};
65180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const struct color_conv_coef *ct;
65380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define CVAL(x, y) (FLD_VAL(x, 26, 16) | FLD_VAL(y, 10, 0))
65580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
65680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ct = &ctbl_bt601_5;
65780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
658ac01c29e5279fe31632e9118619b365514633235Archit Taneja	for (i = 1; i < dss_feat_get_num_ovls(); i++) {
659ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 0),
660ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->rcr, ct->ry));
661ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 1),
662ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->gy,  ct->rcb));
663ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 2),
664ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->gcb, ct->gcr));
665ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 3),
666ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(ct->bcr, ct->by));
667ac01c29e5279fe31632e9118619b365514633235Archit Taneja		dispc_write_reg(DISPC_OVL_CONV_COEF(i, 4),
668ac01c29e5279fe31632e9118619b365514633235Archit Taneja			CVAL(0, ct->bcb));
669ac01c29e5279fe31632e9118619b365514633235Archit Taneja
670ac01c29e5279fe31632e9118619b365514633235Archit Taneja		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), ct->full_range,
671ac01c29e5279fe31632e9118619b365514633235Archit Taneja			11, 11);
672ac01c29e5279fe31632e9118619b365514633235Archit Taneja	}
67380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
67480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef CVAL
67580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
67680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
67780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
67880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_plane_ba0(enum omap_plane plane, u32 paddr)
67980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
6809b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_BA0(plane), paddr);
68180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
68280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
68380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_plane_ba1(enum omap_plane plane, u32 paddr)
68480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
6859b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_BA1(plane), paddr);
68680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
68780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
688ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_set_plane_ba0_uv(enum omap_plane plane, u32 paddr)
689ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
690ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_BA0_UV(plane), paddr);
691ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
692ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
693ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_set_plane_ba1_uv(enum omap_plane plane, u32 paddr)
694ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
695ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr);
696ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
697ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
69880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_plane_pos(enum omap_plane plane, int x, int y)
69980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
70080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
7019b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7029b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_POSITION(plane), val);
70380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
70480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
70580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_pic_size(enum omap_plane plane, int width, int height)
70680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
70780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
7089b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7099b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	if (plane == OMAP_DSS_GFX)
7109b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		dispc_write_reg(DISPC_OVL_SIZE(plane), val);
7119b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	else
7129b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		dispc_write_reg(DISPC_OVL_PICTURE_SIZE(plane), val);
71380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
71480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
71580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_vid_size(enum omap_plane plane, int width, int height)
71680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
71780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
71880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
71980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(plane == OMAP_DSS_GFX);
72080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
72180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
7229b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
7239b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_SIZE(plane), val);
72480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
72580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
726fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar Nstatic void _dispc_set_pre_mult_alpha(enum omap_plane plane, bool enable)
727fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N{
728fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N	if (!dss_has_feature(FEAT_PRE_MULT_ALPHA))
729fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		return;
730fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
731fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N	if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
732fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		plane == OMAP_DSS_VIDEO1)
733fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		return;
734fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
7359b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 28, 28);
736fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N}
737fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N
73880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
73980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
740fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 0, 8, 16, };
741fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	int shift;
742fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
743a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
74480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
74580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
746fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N	if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) &&
747fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		plane == OMAP_DSS_VIDEO1)
748fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N		return;
749a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
750fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
751fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, shift + 7, shift);
75280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
75380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
75480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_pix_inc(enum omap_plane plane, s32 inc)
75580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
7569b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_PIXEL_INC(plane), inc);
75780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
75880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
75980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_row_inc(enum omap_plane plane, s32 inc)
76080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
7619b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc);
76280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
76380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
76480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_color_mode(enum omap_plane plane,
76580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode)
76680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
76780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 m = 0;
768f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	if (plane != OMAP_DSS_GFX) {
769f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		switch (color_mode) {
770f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_NV12:
771f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x0; break;
772f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB12U:
773f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x1; break;
774f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA16:
775f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x2; break;
776f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX16:
777f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x4; break;
778f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16:
779f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x5; break;
780f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB16:
781f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x6; break;
782f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16_1555:
783f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x7; break;
784f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24U:
785f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x8; break;
786f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24P:
787f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x9; break;
788f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_YUV2:
789f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xa; break;
790f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_UYVY:
791f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xb; break;
792f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB32:
793f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xc; break;
794f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA32:
795f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xd; break;
796f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX32:
797f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xe; break;
798f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_XRGB16_1555:
799f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xf; break;
800f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		default:
801f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			BUG(); break;
802f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		}
803f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	} else {
804f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		switch (color_mode) {
805f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT1:
806f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x0; break;
807f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT2:
808f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x1; break;
809f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT4:
810f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x2; break;
811f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_CLUT8:
812f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x3; break;
813f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB12U:
814f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x4; break;
815f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16:
816f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x5; break;
817f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB16:
818f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x6; break;
819f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB16_1555:
820f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x7; break;
821f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24U:
822f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x8; break;
823f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGB24P:
824f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0x9; break;
825f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_YUV2:
826f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xa; break;
827f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_UYVY:
828f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xb; break;
829f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_ARGB32:
830f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xc; break;
831f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBA32:
832f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xd; break;
833f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_RGBX32:
834f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xe; break;
835f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		case OMAP_DSS_COLOR_XRGB16_1555:
836f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			m = 0xf; break;
837f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		default:
838f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain			BUG(); break;
839f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain		}
84080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
84180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8429b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), m, 4, 1);
84380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
84480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8458fa8031c542986746ed4dfbd1eb52358bc86000bTomi Valkeinenstatic void dispc_set_channel_out(enum omap_plane plane,
84680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_channel channel)
84780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
84880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int shift;
84980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
8502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	int chan = 0, chan2 = 0;
85180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
85280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (plane) {
85380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_GFX:
85480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		shift = 8;
85580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
85680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_VIDEO1:
85780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_VIDEO2:
85880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		shift = 16;
85980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
86080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
86180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
86280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
86380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
86480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8659b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
8662a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
8672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		switch (channel) {
8682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_LCD:
8692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 0;
8702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 0;
8712a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_DIGIT:
8732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 1;
8742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 0;
8752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		case OMAP_DSS_CHANNEL_LCD2:
8772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan = 0;
8782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			chan2 = 1;
8792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			break;
8802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		default:
8812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			BUG();
8822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		}
8832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
8842a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, chan, shift, shift);
8852a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, chan2, 31, 30);
8862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	} else {
8872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		val = FLD_MOD(val, channel, shift, shift);
8882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
8899b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
89080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
89180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
8925ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenstatic void dispc_set_burst_size(enum omap_plane plane,
89380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_burst_size burst_size)
89480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
895fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 6, 14, 14, };
89680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int shift;
89780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
898fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
8995ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), burst_size, shift + 1, shift);
90080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
90180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
9025ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenstatic void dispc_configure_burst_sizes(void)
9035ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{
9045ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	int i;
9055ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	const int burst_size = BURST_SIZE_X8;
9065ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
9075ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	/* Configure burst size always to maximum size */
9085ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlays(); ++i)
9095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen		dispc_set_burst_size(i, burst_size);
9105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}
9115ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
9125ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenu32 dispc_get_burst_size(enum omap_plane plane)
9135ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen{
9145ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unsigned unit = dss_feat_get_burst_size_unit();
9155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	/* burst multiplier is always x8 (see dispc_configure_burst_sizes()) */
9165ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	return unit * 8;
9175ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen}
9185ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
919d3862610c95564a586951d5be291b9b0200d39feMythri P Kvoid dispc_enable_gamma_table(bool enable)
920d3862610c95564a586951d5be291b9b0200d39feMythri P K{
921d3862610c95564a586951d5be291b9b0200d39feMythri P K	/*
922d3862610c95564a586951d5be291b9b0200d39feMythri P K	 * This is partially implemented to support only disabling of
923d3862610c95564a586951d5be291b9b0200d39feMythri P K	 * the gamma table.
924d3862610c95564a586951d5be291b9b0200d39feMythri P K	 */
925d3862610c95564a586951d5be291b9b0200d39feMythri P K	if (enable) {
926d3862610c95564a586951d5be291b9b0200d39feMythri P K		DSSWARN("Gamma table enabling for TV not yet supported");
927d3862610c95564a586951d5be291b9b0200d39feMythri P K		return;
928d3862610c95564a586951d5be291b9b0200d39feMythri P K	}
929d3862610c95564a586951d5be291b9b0200d39feMythri P K
930d3862610c95564a586951d5be291b9b0200d39feMythri P K	REG_FLD_MOD(DISPC_CONFIG, enable, 9, 9);
931d3862610c95564a586951d5be291b9b0200d39feMythri P K}
932d3862610c95564a586951d5be291b9b0200d39feMythri P K
9333c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinenvoid dispc_enable_cpr(enum omap_channel channel, bool enable)
9343c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{
9353c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	u16 reg;
9363c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9373c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	if (channel == OMAP_DSS_CHANNEL_LCD)
9383c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		reg = DISPC_CONFIG;
9393c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_LCD2)
9403c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		reg = DISPC_CONFIG2;
9413c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	else
9423c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		return;
9433c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9443c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	REG_FLD_MOD(reg, enable, 15, 15);
9453c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen}
9463c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9473c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinenvoid dispc_set_cpr_coef(enum omap_channel channel,
9483c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		struct omap_dss_cpr_coefs *coefs)
9493c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen{
9503c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	u32 coef_r, coef_g, coef_b;
9513c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9523c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	if (channel != OMAP_DSS_CHANNEL_LCD && channel != OMAP_DSS_CHANNEL_LCD2)
9533c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		return;
9543c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9553c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_r = FLD_VAL(coefs->rr, 31, 22) | FLD_VAL(coefs->rg, 20, 11) |
9563c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->rb, 9, 0);
9573c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_g = FLD_VAL(coefs->gr, 31, 22) | FLD_VAL(coefs->gg, 20, 11) |
9583c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->gb, 9, 0);
9593c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	coef_b = FLD_VAL(coefs->br, 31, 22) | FLD_VAL(coefs->bg, 20, 11) |
9603c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen		FLD_VAL(coefs->bb, 9, 0);
9613c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
9623c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_R(channel), coef_r);
9633c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_G(channel), coef_g);
9643c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen	dispc_write_reg(DISPC_CPR_COEF_B(channel), coef_b);
9653c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen}
9663c07cae2cccc4e40ff66521701a3c8eeda8726e1Tomi Valkeinen
96780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_vid_color_conv(enum omap_plane plane, bool enable)
96880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
96980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
97080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
97180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(plane == OMAP_DSS_GFX);
97280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
9739b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	val = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
97480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_MOD(val, enable, 9, 9);
9759b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
97680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
97780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
97880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_replication(enum omap_plane plane, bool enable)
97980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
980fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned shifts[] = { 5, 10, 10 };
981fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	int shift;
98280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
983fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	shift = shifts[plane];
984fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift);
98580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
98680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
98764ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_set_lcd_size(enum omap_channel channel, u16 width, u16 height)
98880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
98980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
99080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON((width > (1 << 11)) || (height > (1 << 11)));
99180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
992702d144845086cacf8bb4f23196189f260c250e2Archit Taneja	dispc_write_reg(DISPC_SIZE_MGR(channel), val);
99380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
99480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
99580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_digit_size(u16 width, u16 height)
99680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
99780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
99880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON((width > (1 << 11)) || (height > (1 << 11)));
99980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
1000702d144845086cacf8bb4f23196189f260c250e2Archit Taneja	dispc_write_reg(DISPC_SIZE_MGR(OMAP_DSS_CHANNEL_DIGIT), val);
100180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
100280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
100380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_read_plane_fifo_sizes(void)
100480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
100580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 size;
100680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int plane;
1007a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	u8 start, end;
10085ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	u32 unit;
10095ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10105ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unit = dss_feat_get_buffer_size_unit();
101180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1012a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end);
101380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1014e13a138bc68259dc630cb903942975efa40d2bd9Archit Taneja	for (plane = 0; plane < dss_feat_get_num_ovls(); ++plane) {
10155ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen		size = REG_GET(DISPC_OVL_FIFO_SIZE_STATUS(plane), start, end);
10165ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen		size *= unit;
101780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.fifo_size[plane] = size;
101880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
101980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
102080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
102180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenu32 dispc_get_plane_fifo_size(enum omap_plane plane)
102280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
102380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return dispc.fifo_size[plane];
102480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
102580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10265ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinenvoid dispc_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high)
102780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
1028a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	u8 hi_start, hi_end, lo_start, lo_end;
10295ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	u32 unit;
10305ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10315ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	unit = dss_feat_get_buffer_size_unit();
10325ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10335ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	WARN_ON(low % unit != 0);
10345ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	WARN_ON(high % unit != 0);
10355ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
10365ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	low /= unit;
10375ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	high /= unit;
1038a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10399b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end);
10409b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end);
10419b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
104280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n",
104380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			plane,
10449b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane),
10459b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja				lo_start, lo_end),
10469b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			REG_GET(DISPC_OVL_FIFO_THRESHOLD(plane),
10479b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja				hi_start, hi_end),
104880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			low, high);
104980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10509b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane),
1051a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja			FLD_VAL(high, hi_start, hi_end) |
1052a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja			FLD_VAL(low, lo_start, lo_end));
105380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
105480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
105580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_fifomerge(bool enable)
105680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
105780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("FIFO merge %s\n", enable ? "enabled" : "disabled");
105880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 14, 14);
105980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
106080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10610d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainstatic void _dispc_set_fir(enum omap_plane plane,
10620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				int hinc, int vinc,
10630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				enum omap_color_component color_comp)
106480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
106580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
106680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
10670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) {
10680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 hinc_start, hinc_end, vinc_start, vinc_end;
1069a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dss_feat_get_reg_field(FEAT_REG_FIRHINC,
10710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain					&hinc_start, &hinc_end);
10720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dss_feat_get_reg_field(FEAT_REG_FIRVINC,
10730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain					&vinc_start, &vinc_end);
10740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		val = FLD_VAL(vinc, vinc_start, vinc_end) |
10750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				FLD_VAL(hinc, hinc_start, hinc_end);
1076a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja
10770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dispc_write_reg(DISPC_OVL_FIR(plane), val);
10780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	} else {
10790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0);
10800d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		dispc_write_reg(DISPC_OVL_FIR2(plane), val);
10810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
108280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
108380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
108480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_vid_accu0(enum omap_plane plane, int haccu, int vaccu)
108580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
108680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
108787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	u8 hor_start, hor_end, vert_start, vert_end;
108880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
108987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
109087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
109187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
109287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	val = FLD_VAL(vaccu, vert_start, vert_end) |
109387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			FLD_VAL(haccu, hor_start, hor_end);
109487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
10959b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ACCU0(plane), val);
109680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
109780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
109880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_vid_accu1(enum omap_plane plane, int haccu, int vaccu)
109980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
110080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 val;
110187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	u8 hor_start, hor_end, vert_start, vert_end;
110280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
110387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_HORIZONTALACCU, &hor_start, &hor_end);
110487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	dss_feat_get_reg_field(FEAT_REG_VERTICALACCU, &vert_start, &vert_end);
110587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
110687a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	val = FLD_VAL(vaccu, vert_start, vert_end) |
110787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			FLD_VAL(haccu, hor_start, hor_end);
110887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
11099b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ACCU1(plane), val);
111080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
111180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1112ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_set_vid_accu2_0(enum omap_plane plane, int haccu, int vaccu)
1113ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
1114ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	u32 val;
1115ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1116ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0);
1117ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_ACCU2_0(plane), val);
1118ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
1119ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1120ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jainstatic void _dispc_set_vid_accu2_1(enum omap_plane plane, int haccu, int vaccu)
1121ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain{
1122ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	u32 val;
1123ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
1124ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	val = FLD_VAL(vaccu, 26, 16) | FLD_VAL(haccu, 10, 0);
1125ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	dispc_write_reg(DISPC_OVL_ACCU2_1(plane), val);
1126ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain}
112780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainstatic void _dispc_set_scale_param(enum omap_plane plane,
112980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 orig_width, u16 orig_height,
113080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 out_width, u16 out_height,
11310d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool five_taps, u8 rotation,
11320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		enum omap_color_component color_comp)
113380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
11340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int fir_hinc, fir_vinc;
113580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int hscaleup, vscaleup;
113680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
113780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	hscaleup = orig_width <= out_width;
113880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	vscaleup = orig_height <= out_height;
113980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11400d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_scale_coef(plane, hscaleup, vscaleup, five_taps, color_comp);
114180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1142ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	fir_hinc = 1024 * orig_width / out_width;
1143ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	fir_vinc = 1024 * orig_height / out_height;
114480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_fir(plane, fir_hinc, fir_vinc, color_comp);
11460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
11470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
11480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainstatic void _dispc_set_scaling_common(enum omap_plane plane,
11490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
11500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
11510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
11520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
11530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
11540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
11550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int accu0 = 0;
11560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int accu1 = 0;
11570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	u32 l;
115880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_scale_param(plane, orig_width, orig_height,
11600d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				out_width, out_height, five_taps,
11610d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				rotation, DISPC_COLOR_COMPONENT_RGB_Y);
11629b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	l = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane));
116380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
116487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* RESIZEENABLE and VERTICALTAPS */
116587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	l &= ~((0x3 << 5) | (0x1 << 21));
1166ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	l |= (orig_width != out_width) ? (1 << 5) : 0;
1167ed14a3ce9878185ea8348cc2f2e9b53129f84dc7Amber Jain	l |= (orig_height != out_height) ? (1 << 6) : 0;
116887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	l |= five_taps ? (1 << 21) : 0;
116980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
117087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* VRESIZECONF and HRESIZECONF */
117187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_RESIZECONF)) {
117287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l &= ~(0x3 << 7);
11730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		l |= (orig_width <= out_width) ? 0 : (1 << 7);
11740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		l |= (orig_height <= out_height) ? 0 : (1 << 8);
117587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	}
117680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
117787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	/* LINEBUFFERSPLIT */
117887a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_LINEBUFFERSPLIT)) {
117987a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l &= ~(0x1 << 22);
118087a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja		l |= five_taps ? (1 << 22) : 0;
118187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	}
118280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
11839b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), l);
118480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
118580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
118680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
118780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
118880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
118980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && !fieldmode) {
119080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		accu1 = 0;
11910d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		accu0 = ((1024 * orig_height / out_height) / 2) & 0x3ff;
119280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (accu0 >= 1024/2) {
119380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			accu1 = 1024/2;
119480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			accu0 -= accu1;
119580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
119680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
119780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
119880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_vid_accu0(plane, 0, accu0);
119980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_vid_accu1(plane, 0, accu1);
120080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
120180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
12020d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainstatic void _dispc_set_scaling_uv(enum omap_plane plane,
12030d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
12040d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
12050d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
12060d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
12070d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
12080d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
12090d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int scale_x = out_width != orig_width;
12100d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	int scale_y = out_height != orig_height;
12110d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12120d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))
12130d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		return;
12140d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if ((color_mode != OMAP_DSS_COLOR_YUV2 &&
12150d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode != OMAP_DSS_COLOR_UYVY &&
12160d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode != OMAP_DSS_COLOR_NV12)) {
12170d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* reset chroma resampling for RGB formats  */
12180d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane), 0, 8, 8);
12190d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		return;
12200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
12210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	switch (color_mode) {
12220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_NV12:
12230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* UV is subsampled by 2 vertically*/
12240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_height >>= 1;
12250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* UV is subsampled by 2 horz.*/
12260d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_width >>= 1;
12270d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		break;
12280d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_YUV2:
12290d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	case OMAP_DSS_COLOR_UYVY:
12300d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/*For YUV422 with 90/270 rotation,
12310d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		 *we don't upsample chroma
12320d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		 */
12330d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (rotation == OMAP_DSS_ROT_0 ||
12340d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			rotation == OMAP_DSS_ROT_180)
12350d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			/* UV is subsampled by 2 hrz*/
12360d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			orig_width >>= 1;
12370d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		/* must use FIR for YUV422 if rotated */
12380d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		if (rotation != OMAP_DSS_ROT_0)
12390d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			scale_x = scale_y = true;
12400d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		break;
12410d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	default:
12420d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		BUG();
12430d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
12440d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (out_width != orig_width)
12460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		scale_x = true;
12470d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (out_height != orig_height)
12480d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		scale_y = true;
12490d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12500d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_scale_param(plane, orig_width, orig_height,
12510d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			out_width, out_height, five_taps,
12520d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				rotation, DISPC_COLOR_COMPONENT_UV);
12530d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12540d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES2(plane),
12550d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		(scale_x || scale_y) ? 1 : 0, 8, 8);
12560d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* set H scaling */
12570d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_x ? 1 : 0, 5, 5);
12580d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	/* set V scaling */
12590d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), scale_y ? 1 : 0, 6, 6);
12600d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12610d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_vid_accu2_0(plane, 0x80, 0);
12620d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_vid_accu2_1(plane, 0x80, 0);
12630d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
12640d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12650d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jainstatic void _dispc_set_scaling(enum omap_plane plane,
12660d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 orig_width, u16 orig_height,
12670d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u16 out_width, u16 out_height,
12680d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool ilace, bool five_taps,
12690d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		bool fieldmode, enum omap_color_mode color_mode,
12700d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		u8 rotation)
12710d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain{
12720d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	BUG_ON(plane == OMAP_DSS_GFX);
12730d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12740d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_scaling_common(plane,
12750d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			orig_width, orig_height,
12760d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			out_width, out_height,
12770d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			ilace, five_taps,
12780d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			fieldmode, color_mode,
12790d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			rotation);
12800d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
12810d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	_dispc_set_scaling_uv(plane,
12820d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		orig_width, orig_height,
12830d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		out_width, out_height,
12840d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		ilace, five_taps,
12850d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		fieldmode, color_mode,
12860d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		rotation);
12870d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain}
12880d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
128980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _dispc_set_rotation_attrs(enum omap_plane plane, u8 rotation,
129080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bool mirroring, enum omap_color_mode color_mode)
129180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
129287a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	bool row_repeat = false;
129387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	int vidrot = 0;
129487a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
129580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (color_mode == OMAP_DSS_COLOR_YUV2 ||
129680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY) {
129780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
129880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (mirroring) {
129980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			switch (rotation) {
130080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_0:
130180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 2;
130280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_90:
130480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 1;
130580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_180:
130780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 0;
130880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
130980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_270:
131080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 3;
131180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
131280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
131380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		} else {
131480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			switch (rotation) {
131580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_0:
131680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 0;
131780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
131880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_90:
131980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 1;
132080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_180:
132280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 2;
132380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			case OMAP_DSS_ROT_270:
132580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vidrot = 3;
132680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
132780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
132880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
132980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
133080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270)
133187a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			row_repeat = true;
133280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
133387a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja			row_repeat = false;
133480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
133587a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja
13369b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), vidrot, 13, 12);
133787a7484b6a9ceaa9e7a9a238154b02ed4495f26aArchit Taneja	if (dss_has_feature(FEAT_ROWREPEATENABLE))
13389b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja		REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane),
13399b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja			row_repeat ? 1 : 0, 18, 18);
134080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
134180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
134280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic int color_mode_to_bpp(enum omap_color_mode color_mode)
134380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
134480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
134580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
134680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1;
134780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
134880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 2;
134980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
135080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 4;
135180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
1352f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_NV12:
135380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 8;
135480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB12U:
135580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB16:
135680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_ARGB16:
135780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_YUV2:
135880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_UYVY:
1359f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_RGBA16:
1360f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_RGBX16:
1361f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_ARGB16_1555:
1362f20e42205ab172cfd449c10e5183e2e371a629d6Amber Jain	case OMAP_DSS_COLOR_XRGB16_1555:
136380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 16;
136480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB24P:
136580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 24;
136680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGB24U:
136780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_ARGB32:
136880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGBA32:
136980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_RGBX32:
137080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 32;
137180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
137280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
137380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
137480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
137580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
137680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic s32 pixinc(int pixels, u8 ps)
137780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
137880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (pixels == 1)
137980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1;
138080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (pixels > 1)
138180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1 + (pixels - 1) * ps;
138280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (pixels < 0)
138380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return 1 - (-pixels + 1) * ps;
138480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
138580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
138680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
138780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
138880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_vrfb_rotation_offset(u8 rotation, bool mirror,
138980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 screen_width,
139080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
139180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode, bool fieldmode,
139280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int field_offset,
139380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned *offset0, unsigned *offset1,
139480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		s32 *row_inc, s32 *pix_inc)
139580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
139680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u8 ps;
139780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
139880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME CLUT formats */
139980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
140080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
140180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
140280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
140380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
140480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
140580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
140680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_YUV2:
140780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_UYVY:
140880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = 4;
140980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
141080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
141180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = color_mode_to_bpp(color_mode) / 8;
141280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
141380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
141480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
141580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width,
141680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width, height);
141780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
141880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
141980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
142080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
142180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
142280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (rotation + mirror * 4) {
142380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0:
142480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180:
142580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/*
142680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * If the pixel format is YUV or UYVY divide the width
142780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * of the image by 2 for 0 and 180 degree rotation.
142880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
142980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
143080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY)
143180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width = width >> 1;
143280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90:
143380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270:
143480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
143580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
143680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = field_offset * screen_width * ps;
143780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
143880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = 0;
143980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
144080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 + (screen_width - width) +
144180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
144280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
144380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
144480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
144580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
144680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0 + 4:
144780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180 + 4:
144880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* If the pixel format is YUV or UYVY divide the width
144980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * of the image by 2  for 0 degree and 180 degree
145080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
145180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
145280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			color_mode == OMAP_DSS_COLOR_UYVY)
145380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width = width >> 1;
145480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90 + 4:
145580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270 + 4:
145680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
145780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
145880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = field_offset * screen_width * ps;
145980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
146080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = 0;
146180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 - (screen_width + width) -
146280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
146380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
146480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
146580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
146680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
146780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
146880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
146980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
147080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
147180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
147280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void calc_dma_rotation_offset(u8 rotation, bool mirror,
147380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 screen_width,
147480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
147580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode, bool fieldmode,
147680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int field_offset,
147780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned *offset0, unsigned *offset1,
147880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		s32 *row_inc, s32 *pix_inc)
147980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
148080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u8 ps;
148180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 fbw, fbh;
148280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
148380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME CLUT formats */
148480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (color_mode) {
148580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT1:
148680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT2:
148780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT4:
148880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_COLOR_CLUT8:
148980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
149080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
149180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
149280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ps = color_mode_to_bpp(color_mode) / 8;
149380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
149480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
149580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
149680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("calc_rot(%d): scrw %d, %dx%d\n", rotation, screen_width,
149780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			width, height);
149880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
149980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* width & height are overlay sizes, convert to fb sizes */
150080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
150180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (rotation == OMAP_DSS_ROT_0 || rotation == OMAP_DSS_ROT_180) {
150280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbw = width;
150380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbh = height;
150480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
150580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbw = height;
150680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fbh = width;
150780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
150880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
150980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
151080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 0 = even field = bottom field
151180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * field 1 = odd field = top field
151280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
151380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (rotation + mirror * 4) {
151480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0:
151580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
151680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
151780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * screen_width * ps;
151880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
151980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
152080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 + (screen_width - fbw) +
152180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
152280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
152380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
152480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
152580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90:
152680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = screen_width * (fbh - 1) * ps;
152780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
152880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * ps;
152980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
153080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
153180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * (fbh - 1) + 1 +
153280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0), ps);
153380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-screen_width, ps);
153480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
153580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180:
153680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
153780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
153880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * screen_width * ps;
153980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
154080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
154180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-1 -
154280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(screen_width - fbw) -
154380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
154480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
154580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-1, ps);
154680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
154780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270:
154880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (fbw - 1) * ps;
154980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
155080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * ps;
155180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
155280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
155380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-screen_width * (fbh - 1) - 1 -
155480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0), ps);
155580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(screen_width, ps);
155680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
155780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
155880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* mirroring */
155980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_0 + 4:
156080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (fbw - 1) * ps;
156180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
156280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * screen_width * ps;
156380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
156480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
156580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * 2 - 1 +
156680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
156780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
156880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-1, ps);
156980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
157080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
157180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_90 + 4:
157280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = 0;
157380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
157480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 + field_offset * ps;
157580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
157680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
157780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(-screen_width * (fbh - 1) + 1 +
157880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0),
157980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
158080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(screen_width, ps);
158180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
158280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
158380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_180 + 4:
158480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = screen_width * (fbh - 1) * ps;
158580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
158680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * screen_width * ps;
158780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
158880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
158980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(1 - screen_width * 2 -
159080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? screen_width : 0),
159180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
159280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(1, ps);
159380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
159480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
159580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_ROT_270 + 4:
159680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*offset1 = (screen_width * (fbh - 1) + fbw - 1) * ps;
159780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (field_offset)
159880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1 - field_offset * ps;
159980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
160080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*offset0 = *offset1;
160180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*row_inc = pixinc(screen_width * (fbh - 1) - 1 -
160280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				(fieldmode ? 1 : 0),
160380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				ps);
160480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		*pix_inc = pixinc(-screen_width, ps);
160580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
160680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
160780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
160880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
160980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
161080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
161180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1612ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk_five_taps(enum omap_channel channel, u16 width,
1613ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 height, u16 out_width, u16 out_height,
1614ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		enum omap_color_mode color_mode)
161580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
161680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 fclk = 0;
161780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME venc pclk? */
1618ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	u64 tmp, pclk = dispc_pclk_rate(channel);
161980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
162080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (height > out_height) {
162180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* FIXME get real display PPL */
162280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned int ppl = 800;
162380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
162480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		tmp = pclk * height * out_width;
162580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		do_div(tmp, 2 * out_height * ppl);
162680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fclk = tmp;
162780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
16282d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä		if (height > 2 * out_height) {
16292d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä			if (ppl == out_width)
16302d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä				return 0;
16312d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä
163280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			tmp = pclk * (height - 2 * out_height) * out_width;
163380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			do_div(tmp, 2 * out_height * (ppl - out_width));
163480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			fclk = max(fclk, (u32) tmp);
163580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
163680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
163780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
163880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (width > out_width) {
163980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		tmp = pclk * width;
164080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		do_div(tmp, out_width);
164180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fclk = max(fclk, (u32) tmp);
164280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
164380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (color_mode == OMAP_DSS_COLOR_RGB24U)
164480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			fclk <<= 1;
164580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
164680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
164780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return fclk;
164880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
164980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1650ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic unsigned long calc_fclk(enum omap_channel channel, u16 width,
1651ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 height, u16 out_width, u16 out_height)
165280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
165380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned int hf, vf;
165480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
165580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/*
165680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * FIXME how to determine the 'A' factor
165780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * for the no downscaling case ?
165880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 */
165980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
166080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (width > 3 * out_width)
166180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 4;
166280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (width > 2 * out_width)
166380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 3;
166480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (width > out_width)
166580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 2;
166680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
166780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		hf = 1;
166880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
166980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (height > out_height)
167080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		vf = 2;
167180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
167280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		vf = 1;
167380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
167480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FIXME venc pclk? */
1675ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	return dispc_pclk_rate(channel) * vf * hf;
167680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
167780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1678e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinenint dispc_setup_plane(enum omap_plane plane,
167980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 paddr, u16 screen_width,
168080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 pos_x, u16 pos_y,
168180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 width, u16 height,
168280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u16 out_width, u16 out_height,
168380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_color_mode color_mode,
168480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		bool ilace,
168580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_rotation_type rotation_type,
1686e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen		u8 rotation, bool mirror,
168718faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal		u8 global_alpha, u8 pre_mult_alpha,
16880d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		enum omap_channel channel, u32 puv_addr)
168980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
169080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	const int maxdownscale = cpu_is_omap34xx() ? 4 : 2;
169180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool five_taps = 0;
169280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool fieldmode = 0;
169380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int cconv = 0;
169480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned offset0, offset1;
169580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	s32 row_inc;
169680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	s32 pix_inc;
169780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 frame_height = height;
169880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned int field_offset = 0;
169980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1700e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	DSSDBG("dispc_setup_plane %d, pa %x, sw %d, %d,%d, %dx%d -> "
1701e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       "%dx%d, ilace %d, cmode %x, rot %d, mir %d chan %d\n",
1702e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       plane, paddr, screen_width, pos_x, pos_y,
1703e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       width, height,
1704e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       out_width, out_height,
1705e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       ilace, color_mode,
1706e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	       rotation, mirror, channel);
1707e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
170880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (paddr == 0)
170980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
171080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
171180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && height == out_height)
171280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		fieldmode = 1;
171380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
171480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace) {
171580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (fieldmode)
171680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			height /= 2;
171780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		pos_y /= 2;
171880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		out_height /= 2;
171980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
172080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("adjusting for ilace: height %d, pos_y %d, "
172180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				"out_height %d\n",
172280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				height, pos_y, out_height);
172380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
172480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17258dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja	if (!dss_feat_color_mode_supported(plane, color_mode))
17268dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja		return -EINVAL;
17278dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja
172880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (plane == OMAP_DSS_GFX) {
172980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (width != out_width || height != out_height)
173080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
173180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
173280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* video plane */
173380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
173480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long fclk = 0;
173580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
173680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (out_width < width / maxdownscale ||
173780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		   out_width > width * 8)
173880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
173980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
174080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (out_height < height / maxdownscale ||
174180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		   out_height > height * 8)
174280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
174380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17448dad2ab6727f4dd9fdef06b890d736d7c6d1a725Archit Taneja		if (color_mode == OMAP_DSS_COLOR_YUV2 ||
17450d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode == OMAP_DSS_COLOR_UYVY ||
17460d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain			color_mode == OMAP_DSS_COLOR_NV12)
174780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			cconv = 1;
174880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
174980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* Must use 5-tap filter? */
175080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		five_taps = height > out_height * 2;
175180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
175280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!five_taps) {
175318faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal			fclk = calc_fclk(channel, width, height, out_width,
175418faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal					out_height);
175580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
175680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			/* Try 5-tap filter if 3-tap fclk is too high */
175780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (cpu_is_omap34xx() && height > out_height &&
175880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					fclk > dispc_fclk_rate())
175980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				five_taps = true;
176080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
176180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
176280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (width > (2048 >> five_taps)) {
176380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to set up scaling, fclk too low\n");
176480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
176580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
176680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
176780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (five_taps)
176818faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal			fclk = calc_fclk_five_taps(channel, width, height,
176918faa1b68a54ff976dd03bfd9ace2c4ef4f7315cSumit Semwal					out_width, out_height, color_mode);
177080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
177180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("required fclk rate = %lu Hz\n", fclk);
177280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSDBG("current fclk rate = %lu Hz\n", dispc_fclk_rate());
177380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
17742d9c5597ad1408885fdef5838aa27a8a0ee9e915Ville Syrjälä		if (!fclk || fclk > dispc_fclk_rate()) {
177580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to set up scaling, "
177680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					"required fclk rate = %lu Hz, "
177780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					"current fclk rate = %lu Hz\n",
177880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					fclk, dispc_fclk_rate());
177980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return -EINVAL;
178080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
178180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
178280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
178380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ilace && !fieldmode) {
178480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/*
178580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * when downscaling the bottom field may have to start several
178680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * source lines below the top field. Unfortunately ACCUI
178780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * registers will only hold the fractional part of the offset
178880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * so the integer part must be added to the base address of the
178980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * bottom field.
179080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 */
179180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!height || height == out_height)
179280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			field_offset = 0;
179380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
179480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			field_offset = height / out_height / 2;
179580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
179680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
179780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Fields are independent but interleaved in memory. */
179880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (fieldmode)
179980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		field_offset = 1;
180080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
180180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (rotation_type == OMAP_DSS_ROT_DMA)
180280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		calc_dma_rotation_offset(rotation, mirror,
180380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				screen_width, width, frame_height, color_mode,
180480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				fieldmode, field_offset,
180580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				&offset0, &offset1, &row_inc, &pix_inc);
180680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
180780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		calc_vrfb_rotation_offset(rotation, mirror,
180880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				screen_width, width, frame_height, color_mode,
180980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				fieldmode, field_offset,
181080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				&offset0, &offset1, &row_inc, &pix_inc);
181180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
181280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
181380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			offset0, offset1, row_inc, pix_inc);
181480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
181580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_color_mode(plane, color_mode);
181680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
181780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_plane_ba0(plane, paddr + offset0);
181880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_plane_ba1(plane, paddr + offset1);
181980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18200d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	if (OMAP_DSS_COLOR_NV12 == color_mode) {
18210d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		_dispc_set_plane_ba0_uv(plane, puv_addr + offset0);
18220d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain		_dispc_set_plane_ba1_uv(plane, puv_addr + offset1);
18230d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain	}
18240d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
18250d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain
182680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_row_inc(plane, row_inc);
182780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_pix_inc(plane, pix_inc);
182880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
182980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("%d,%d %dx%d -> %dx%d\n", pos_x, pos_y, width, height,
183080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			out_width, out_height);
183180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
183280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_plane_pos(plane, pos_x, pos_y);
183380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
183480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_pic_size(plane, width, height);
183580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
183680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (plane != OMAP_DSS_GFX) {
183780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_dispc_set_scaling(plane, width, height,
183880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				   out_width, out_height,
18390d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				   ilace, five_taps, fieldmode,
18400d66cbb53eca4ab3db85d9189d5a85c9fac49b84Amber Jain				   color_mode, rotation);
184180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_dispc_set_vid_size(plane, out_width, out_height);
184280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_dispc_set_vid_color_conv(plane, cconv);
184380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
184480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
184580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_set_rotation_attrs(plane, rotation, mirror, color_mode);
184680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1847fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N	_dispc_set_pre_mult_alpha(plane, pre_mult_alpha);
1848fd28a39071cee34ec59021f620f6dfca5f89ac9bRajkumar N	_dispc_setup_global_alpha(plane, global_alpha);
184980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18508fa8031c542986746ed4dfbd1eb52358bc86000bTomi Valkeinen	dispc_set_channel_out(plane, channel);
18518fa8031c542986746ed4dfbd1eb52358bc86000bTomi Valkeinen
185280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
185380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
185480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1855e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinenint dispc_enable_plane(enum omap_plane plane, bool enable)
185680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
1857e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	DSSDBG("dispc_enable_plane %d, %d\n", plane, enable);
1858e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
18599b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja	REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 0, 0);
1860e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen
1861e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	return 0;
186280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
186380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
186480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_disable_isr(void *data, u32 mask)
186580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
186680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion *compl = data;
186780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	complete(compl);
186880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
186980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void _enable_lcd_out(enum omap_channel channel, bool enable)
187180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
18722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
18732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, enable ? 1 : 0, 0, 0);
18742a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
18752a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0);
187680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
187780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
18782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void dispc_enable_lcd_out(enum omap_channel channel, bool enable)
187980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
188080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion frame_done_completion;
188180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool is_on;
188280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
18832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	u32 irq;
188480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
188580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* When we disable LCD output, we need to wait until frame is done.
188680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * Otherwise the DSS is still working, and turning off the clocks
188780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * prevents DSS from going to OFF mode */
18882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	is_on = channel == OMAP_DSS_CHANNEL_LCD2 ?
18892a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			REG_GET(DISPC_CONTROL2, 0, 0) :
18902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			REG_GET(DISPC_CONTROL, 0, 0);
18912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
18922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	irq = channel == OMAP_DSS_CHANNEL_LCD2 ? DISPC_IRQ_FRAMEDONE2 :
18932a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			DISPC_IRQ_FRAMEDONE;
189480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
189580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!enable && is_on) {
189680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		init_completion(&frame_done_completion);
189780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
189880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		r = omap_dispc_register_isr(dispc_disable_isr,
18992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				&frame_done_completion, irq);
190080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
190180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (r)
190280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to register FRAMEDONE isr\n");
190380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
190480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
19052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	_enable_lcd_out(channel, enable);
190680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
190780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!enable && is_on) {
190880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!wait_for_completion_timeout(&frame_done_completion,
190980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					msecs_to_jiffies(100)))
191080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("timeout waiting for FRAME DONE\n");
191180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
191280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		r = omap_dispc_unregister_isr(dispc_disable_isr,
19132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				&frame_done_completion, irq);
191480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
191580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (r)
191680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DSSERR("failed to unregister FRAMEDONE isr\n");
191780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
191880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
191980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
192080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _enable_digit_out(bool enable)
192180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
192280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1);
192380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
192480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1925a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinenstatic void dispc_enable_digit_out(bool enable)
192680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
192780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct completion frame_done_completion;
192880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
192980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1930e6d80f950a77ca48eada6457a290dc5471e1dd73Tomi Valkeinen	if (REG_GET(DISPC_CONTROL, 1, 1) == enable)
193180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
193280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
193380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (enable) {
193480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long flags;
193580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* When we enable digit output, we'll get an extra digit
193680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		 * sync lost interrupt, that we need to ignore */
193780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_lock_irqsave(&dispc.irq_lock, flags);
193880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask &= ~DISPC_IRQ_SYNC_LOST_DIGIT;
193980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
194080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_unlock_irqrestore(&dispc.irq_lock, flags);
194180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
194280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
194380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* When we disable digit output, we need to wait until fields are done.
194480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * Otherwise the DSS is still working, and turning off the clocks
194580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * prevents DSS from going to OFF mode. And when enabling, we need to
194680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * wait for the extra sync losts */
194780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	init_completion(&frame_done_completion);
194880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
194980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_disable_isr, &frame_done_completion,
195080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD);
195180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
195280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("failed to register EVSYNC isr\n");
195380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
195480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_enable_digit_out(enable);
195580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
195680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* XXX I understand from TRM that we should only wait for the
195780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * current field to complete. But it seems we have to wait
195880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * for both fields */
195980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!wait_for_completion_timeout(&frame_done_completion,
196080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				msecs_to_jiffies(100)))
196180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("timeout waiting for EVSYNC\n");
196280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
196380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!wait_for_completion_timeout(&frame_done_completion,
196480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				msecs_to_jiffies(100)))
196580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("timeout waiting for EVSYNC\n");
196680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
196780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_unregister_isr(dispc_disable_isr,
196880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			&frame_done_completion,
196980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			DISPC_IRQ_EVSYNC_EVEN | DISPC_IRQ_EVSYNC_ODD);
197080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
197180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("failed to unregister EVSYNC isr\n");
197280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
197380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (enable) {
197480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long flags;
197580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_lock_irqsave(&dispc.irq_lock, flags);
197680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
19772a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		if (dss_has_feature(FEAT_MGR_LCD2))
19782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2;
197980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT);
198080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
198180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		spin_unlock_irqrestore(&dispc.irq_lock, flags);
198280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
198380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
198480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
1985a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinenbool dispc_is_channel_enabled(enum omap_channel channel)
1986a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{
1987a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	if (channel == OMAP_DSS_CHANNEL_LCD)
1988a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		return !!REG_GET(DISPC_CONTROL, 0, 0);
1989a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_DIGIT)
1990a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		return !!REG_GET(DISPC_CONTROL, 1, 1);
19912a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (channel == OMAP_DSS_CHANNEL_LCD2)
19922a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		return !!REG_GET(DISPC_CONTROL2, 0, 0);
1993a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else
1994a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		BUG();
1995a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen}
1996a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen
1997a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinenvoid dispc_enable_channel(enum omap_channel channel, bool enable)
1998a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen{
19992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD ||
20002a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			channel == OMAP_DSS_CHANNEL_LCD2)
20012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc_enable_lcd_out(channel, enable);
2002a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else if (channel == OMAP_DSS_CHANNEL_DIGIT)
2003a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		dispc_enable_digit_out(enable);
2004a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen	else
2005a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen		BUG();
2006a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen}
2007a2faee84f6d8e35150d60514c6638d223509fa13Tomi Valkeinen
200880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal_polarity(bool act_high)
200980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20106ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_LCDENABLEPOL))
20116ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20126ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
201380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, act_high ? 1 : 0, 29, 29);
201480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
201580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
201680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_lcd_enable_signal(bool enable)
201780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20186ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_LCDENABLESIGNAL))
20196ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20206ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
202180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 28, 28);
202280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
202380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
202480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_pck_free_enable(bool enable)
202580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20266ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (!dss_has_feature(FEAT_PCKFREEENABLE))
20276ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		return;
20286ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja
202980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 27, 27);
203080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
203180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
203264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_enable_fifohandcheck(enum omap_channel channel, bool enable)
203380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20342a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
20352a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable ? 1 : 0, 16, 16);
20362a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
20372a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG, enable ? 1 : 0, 16, 16);
203880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
203980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
204080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
204164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_set_lcd_display_type(enum omap_channel channel,
204264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		enum omap_lcd_display_type type)
204380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
204480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int mode;
204580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
204680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (type) {
204780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_LCD_DISPLAY_STN:
204880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mode = 0;
204980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
205080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
205180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_LCD_DISPLAY_TFT:
205280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mode = 1;
205380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
205480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
205580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
205680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
205780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
205880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
205980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
20602a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
20612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, mode, 3, 3);
20622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
20632a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, mode, 3, 3);
206480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
206580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
206680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_loadmode(enum omap_dss_load_mode mode)
206780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
206880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_CONFIG, mode, 2, 1);
206980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
207080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_default_color(enum omap_channel channel, u32 color)
207380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
20748613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	dispc_write_reg(DISPC_DEFAULT_COLOR(channel), color);
207580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
207680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
207780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenu32 dispc_get_default_color(enum omap_channel channel)
207880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
207980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
208080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
208180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(channel != OMAP_DSS_CHANNEL_DIGIT &&
20822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		channel != OMAP_DSS_CHANNEL_LCD &&
20832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		channel != OMAP_DSS_CHANNEL_LCD2);
208480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
20858613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	l = dispc_read_reg(DISPC_DEFAULT_COLOR(channel));
208680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
208780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return l;
208880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
208980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
209080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_set_trans_key(enum omap_channel ch,
209180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_trans_key_type type,
209280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 trans_key)
209380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
209480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
209580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, type, 11, 11);
20962a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
209780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, type, 13, 13);
20982a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
20992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, type, 11, 11);
210080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
21018613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal	dispc_write_reg(DISPC_TRANS_COLOR(ch), trans_key);
210280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
210380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
210480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_get_trans_key(enum omap_channel ch,
210580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enum omap_dss_trans_key_type *type,
210680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		u32 *trans_key)
210780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
210880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (type) {
210980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (ch == OMAP_DSS_CHANNEL_LCD)
211080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*type = REG_GET(DISPC_CONFIG, 11, 11);
211180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else if (ch == OMAP_DSS_CHANNEL_DIGIT)
211280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			*type = REG_GET(DISPC_CONFIG, 13, 13);
21132a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		else if (ch == OMAP_DSS_CHANNEL_LCD2)
21142a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			*type = REG_GET(DISPC_CONFIG2, 11, 11);
211580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		else
211680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			BUG();
211780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
211880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
211980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (trans_key)
21208613b0005d315582a988bbeb2249d69df343eb3aSumit Semwal		*trans_key = dispc_read_reg(DISPC_TRANS_COLOR(ch));
212180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
212280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
212380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_trans_key(enum omap_channel ch, bool enable)
212480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
212580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
212680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 10, 10);
21272a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
212880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 12, 12);
21292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
21302a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10);
213180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
213280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_alpha_blending(enum omap_channel ch, bool enable)
213380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2134a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
213580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
213680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
213780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
213880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18);
21392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
214080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
21412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else /* OMAP_DSS_CHANNEL_LCD2 */
21422a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONFIG2, enable, 18, 18);
214380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
214480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_alpha_blending_enabled(enum omap_channel ch)
214580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
214680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool enabled;
214780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2148a0acb5574b01f1a82dc5d863b4d89d84397aeafaArchit Taneja	if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
214980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return false;
215080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
215180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
215280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 18, 18);
215380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
2154712247a6811530acdd604fa21574ccf1f2d80838Archit Taneja		enabled = REG_GET(DISPC_CONFIG, 19, 19);
21552a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_LCD2)
21562a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enabled = REG_GET(DISPC_CONFIG2, 18, 18);
215780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
215880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
215980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return enabled;
216180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
216280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_trans_key_enabled(enum omap_channel ch)
216580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
216680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	bool enabled;
216780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
216880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ch == OMAP_DSS_CHANNEL_LCD)
216980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 10, 10);
217080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else if (ch == OMAP_DSS_CHANNEL_DIGIT)
217180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		enabled = REG_GET(DISPC_CONFIG, 12, 12);
21722a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else if (ch == OMAP_DSS_CHANNEL_LCD2)
21732a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		enabled = REG_GET(DISPC_CONFIG2, 10, 10);
217480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	else
217580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
217680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
217780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return enabled;
217880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
217980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
218080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
218164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_set_tft_data_lines(enum omap_channel channel, u8 data_lines)
218280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
218380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int code;
218480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
218580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (data_lines) {
218680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 12:
218780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 0;
218880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
218980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 16:
219080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 1;
219180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 18:
219380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 2;
219480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case 24:
219680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		code = 3;
219780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
219880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
219980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
220080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
220180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
220280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
22032a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2)
22042a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL2, code, 9, 8);
22052a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	else
22062a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		REG_FLD_MOD(DISPC_CONTROL, code, 9, 8);
220780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
220880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
220964ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_set_parallel_interface_mode(enum omap_channel channel,
221064ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		enum omap_parallel_interface_mode mode)
221180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
221280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
221380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int stallmode;
221480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int gpout0 = 1;
221580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int gpout1;
221680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
221780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	switch (mode) {
221880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_PARALLELMODE_BYPASS:
221980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		stallmode = 0;
222080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		gpout1 = 1;
222180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
222280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
222380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_PARALLELMODE_RFBI:
222480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		stallmode = 1;
222580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		gpout1 = 0;
222680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
222780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
222880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	case OMAP_DSS_PARALLELMODE_DSI:
222980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		stallmode = 1;
223080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		gpout1 = 1;
223180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
223280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
223380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	default:
223480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
223580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
223680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
223780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
22382a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (channel == OMAP_DSS_CHANNEL_LCD2) {
22392a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		l = dispc_read_reg(DISPC_CONTROL2);
22402a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		l = FLD_MOD(l, stallmode, 11, 11);
22412a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc_write_reg(DISPC_CONTROL2, l);
22422a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	} else {
22432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		l = dispc_read_reg(DISPC_CONTROL);
22442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		l = FLD_MOD(l, stallmode, 11, 11);
224564ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		l = FLD_MOD(l, gpout0, 15, 15);
224664ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		l = FLD_MOD(l, gpout1, 16, 16);
22472a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc_write_reg(DISPC_CONTROL, l);
224864ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	}
224980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
225080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
225180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp,
225280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		int vsw, int vfp, int vbp)
225380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
225480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
225580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (hsw < 1 || hsw > 64 ||
225680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hfp < 1 || hfp > 256 ||
225780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hbp < 1 || hbp > 256 ||
225880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vsw < 1 || vsw > 64 ||
225980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vfp < 0 || vfp > 255 ||
226080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vbp < 0 || vbp > 255)
226180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return false;
226280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
226380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (hsw < 1 || hsw > 256 ||
226480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hfp < 1 || hfp > 4096 ||
226580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				hbp < 1 || hbp > 4096 ||
226680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vsw < 1 || vsw > 256 ||
226780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vfp < 0 || vfp > 4095 ||
226880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				vbp < 0 || vbp > 4095)
226980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			return false;
227080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
227180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
227280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return true;
227380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
227480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
227580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenbool dispc_lcd_timings_ok(struct omap_video_timings *timings)
227680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
227780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return _dispc_lcd_timings_ok(timings->hsw, timings->hfp,
227880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->hbp, timings->vsw,
227980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->vfp, timings->vbp);
228080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
228180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
228264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalstatic void _dispc_set_lcd_timings(enum omap_channel channel, int hsw,
228364ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		int hfp, int hbp, int vsw, int vfp, int vbp)
228480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
228580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 timing_h, timing_v;
228680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
228780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx() || omap_rev() < OMAP3430_REV_ES3_0) {
228880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_h = FLD_VAL(hsw-1, 5, 0) | FLD_VAL(hfp-1, 15, 8) |
228980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(hbp-1, 27, 20);
229080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
229180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_v = FLD_VAL(vsw-1, 5, 0) | FLD_VAL(vfp, 15, 8) |
229280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(vbp, 27, 20);
229380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	} else {
229480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_h = FLD_VAL(hsw-1, 7, 0) | FLD_VAL(hfp-1, 19, 8) |
229580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(hbp-1, 31, 20);
229680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
229780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		timing_v = FLD_VAL(vsw-1, 7, 0) | FLD_VAL(vfp, 19, 8) |
229880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(vbp, 31, 20);
229980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
230080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
230164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	dispc_write_reg(DISPC_TIMING_H(channel), timing_h);
230264ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	dispc_write_reg(DISPC_TIMING_V(channel), timing_v);
230380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
230480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
230580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* change name to mode? */
230664ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwalvoid dispc_set_lcd_timings(enum omap_channel channel,
230764ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal		struct omap_video_timings *timings)
230880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
230980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned xtot, ytot;
231080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long ht, vt;
231180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
231280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (!_dispc_lcd_timings_ok(timings->hsw, timings->hfp,
231380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				timings->hbp, timings->vsw,
231480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				timings->vfp, timings->vbp))
231580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		BUG();
231680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
231764ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	_dispc_set_lcd_timings(channel, timings->hsw, timings->hfp,
231864ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal			timings->hbp, timings->vsw, timings->vfp,
231964ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal			timings->vbp);
232080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
232164ba4f748a005a44c03c98e082d8ee157f4ee66fSumit Semwal	dispc_set_lcd_size(channel, timings->x_res, timings->y_res);
232280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
232380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	xtot = timings->x_res + timings->hfp + timings->hsw + timings->hbp;
232480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ytot = timings->y_res + timings->vfp + timings->vsw + timings->vbp;
232580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
232680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ht = (timings->pixel_clock * 1000) / xtot;
232780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	vt = (timings->pixel_clock * 1000) / xtot / ytot;
232880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
23292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	DSSDBG("channel %d xres %u yres %u\n", channel, timings->x_res,
23302a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			timings->y_res);
233180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("pck %u\n", timings->pixel_clock);
233280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("hsw %d hfp %d hbp %d vsw %d vfp %d vbp %d\n",
233380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->hsw, timings->hfp, timings->hbp,
233480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timings->vsw, timings->vfp, timings->vbp);
233580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
233680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("hsync %luHz, vsync %luHz\n", ht, vt);
233780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
233880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2339ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic void dispc_set_lcd_divisor(enum omap_channel channel, u16 lck_div,
2340ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		u16 pck_div)
234180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
234280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(lck_div < 1);
234380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	BUG_ON(pck_div < 2);
234480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2345ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	dispc_write_reg(DISPC_DIVISORo(channel),
234680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			FLD_VAL(lck_div, 23, 16) | FLD_VAL(pck_div, 7, 0));
234780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
234880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
23492a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwalstatic void dispc_get_lcd_divisor(enum omap_channel channel, int *lck_div,
23502a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		int *pck_div)
235180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
235280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
2353ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
235480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	*lck_div = FLD_GET(l, 23, 16);
235580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	*pck_div = FLD_GET(l, 7, 0);
235680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
235780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
235880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenunsigned long dispc_fclk_rate(void)
235980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2360a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja	struct platform_device *dsidev;
236180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r = 0;
236280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
236366534e8e936a0b926863df90054dc59826d70528Archit Taneja	switch (dss_get_dispc_clk_source()) {
236489a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_FCK:
23654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = clk_get_rate(dispc.dss_clk);
236666534e8e936a0b926863df90054dc59826d70528Archit Taneja		break;
236789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
2368a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		dsidev = dsi_get_dsidev_from_id(0);
2369a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
237066534e8e936a0b926863df90054dc59826d70528Archit Taneja		break;
23715a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja	case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
23725a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		dsidev = dsi_get_dsidev_from_id(1);
23735a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
23745a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		break;
237566534e8e936a0b926863df90054dc59826d70528Archit Taneja	default:
237666534e8e936a0b926863df90054dc59826d70528Archit Taneja		BUG();
237766534e8e936a0b926863df90054dc59826d70528Archit Taneja	}
237866534e8e936a0b926863df90054dc59826d70528Archit Taneja
237980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return r;
238080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
238180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2382ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalunsigned long dispc_lclk_rate(enum omap_channel channel)
238380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2384a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja	struct platform_device *dsidev;
238580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int lcd;
238680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r;
238780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
238880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2389ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
239080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
239180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	lcd = FLD_GET(l, 23, 16);
239280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2393ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	switch (dss_get_lcd_clk_source(channel)) {
239489a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_FCK:
23954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = clk_get_rate(dispc.dss_clk);
2396ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		break;
239789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC:
2398a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		dsidev = dsi_get_dsidev_from_id(0);
2399a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
2400ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		break;
24015a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja	case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC:
24025a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		dsidev = dsi_get_dsidev_from_id(1);
24035a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		r = dsi_get_pll_hsdiv_dispc_rate(dsidev);
24045a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja		break;
2405ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	default:
2406ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		BUG();
2407ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	}
240880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
240980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return r / lcd;
241080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
241180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2412ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalunsigned long dispc_pclk_rate(enum omap_channel channel)
241380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2414ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	int pcd;
241580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long r;
241680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
241780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2418ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	l = dispc_read_reg(DISPC_DIVISORo(channel));
241980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
242080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	pcd = FLD_GET(l, 7, 0);
242180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2422ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	r = dispc_lclk_rate(channel);
242380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2424ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	return r / pcd;
242580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
242680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
242780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_clocks(struct seq_file *s)
242880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
242980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int lcd, pcd;
24300cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	u32 l;
243189a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	enum omap_dss_clk_source dispc_clk_src = dss_get_dispc_clk_source();
243289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja	enum omap_dss_clk_source lcd_clk_src;
243380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
24344fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (dispc_runtime_get())
24354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return;
243680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
243780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	seq_printf(s, "- DISPC -\n");
243880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2439067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja	seq_printf(s, "dispc fclk source = %s (%s)\n",
2440067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja			dss_get_generic_clk_source_name(dispc_clk_src),
2441067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja			dss_feat_get_clk_source_name(dispc_clk_src));
244280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
244380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	seq_printf(s, "fck\t\t%-16lu\n", dispc_fclk_rate());
24442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
24450cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV)) {
24460cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		seq_printf(s, "- DISPC-CORE-CLK -\n");
24470cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = dispc_read_reg(DISPC_DIVISOR);
24480cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		lcd = FLD_GET(l, 23, 16);
24490cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
24500cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
24510cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer				(dispc_fclk_rate()/lcd), lcd);
24520cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	}
24532a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	seq_printf(s, "- LCD1 -\n");
24542a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2455ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD);
2456ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
2457ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja	seq_printf(s, "lcd1_clk source = %s (%s)\n",
2458ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		dss_get_generic_clk_source_name(lcd_clk_src),
2459ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		dss_feat_get_clk_source_name(lcd_clk_src));
2460ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
24612a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	dispc_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD, &lcd, &pcd);
24622a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2463ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
2464ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal			dispc_lclk_rate(OMAP_DSS_CHANNEL_LCD), lcd);
2465ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	seq_printf(s, "pck\t\t%-16lupck div\t%u\n",
2466ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal			dispc_pclk_rate(OMAP_DSS_CHANNEL_LCD), pcd);
24672a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
24682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "- LCD2 -\n");
24692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2470ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		lcd_clk_src = dss_get_lcd_clk_source(OMAP_DSS_CHANNEL_LCD2);
2471ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
2472ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja		seq_printf(s, "lcd2_clk source = %s (%s)\n",
2473ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja			dss_get_generic_clk_source_name(lcd_clk_src),
2474ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja			dss_feat_get_clk_source_name(lcd_clk_src));
2475ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja
24762a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc_get_lcd_divisor(OMAP_DSS_CHANNEL_LCD2, &lcd, &pcd);
247780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
24782a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "lck\t\t%-16lulck div\t%u\n",
24792a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				dispc_lclk_rate(OMAP_DSS_CHANNEL_LCD2), lcd);
24802a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		seq_printf(s, "pck\t\t%-16lupck div\t%u\n",
24812a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				dispc_pclk_rate(OMAP_DSS_CHANNEL_LCD2), pcd);
24822a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
24834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
24844fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
248580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
248680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2487dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
2488dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenvoid dispc_dump_irqs(struct seq_file *s)
2489dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen{
2490dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	unsigned long flags;
2491dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	struct dispc_irq_stats stats;
2492dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2493dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_lock_irqsave(&dispc.irq_stats_lock, flags);
2494dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2495dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	stats = dispc.irq_stats;
2496dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	memset(&dispc.irq_stats, 0, sizeof(dispc.irq_stats));
2497dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dispc.irq_stats.last_reset = jiffies;
2498dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2499dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_stats_lock, flags);
2500dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2501dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "period %u ms\n",
2502dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen			jiffies_to_msecs(jiffies - stats.last_reset));
2503dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2504dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "irqs %d\n", stats.irq_count);
2505dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \
2506dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	seq_printf(s, "%-20s %10d\n", #x, stats.irqs[ffs(DISPC_IRQ_##x)-1]);
2507dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
2508dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(FRAMEDONE);
2509dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VSYNC);
2510dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(EVSYNC_EVEN);
2511dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(EVSYNC_ODD);
2512dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(ACBIAS_COUNT_STAT);
2513dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(PROG_LINE_NUM);
2514dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(GFX_FIFO_UNDERFLOW);
2515dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(GFX_END_WIN);
2516dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(PAL_GAMMA_MASK);
2517dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(OCP_ERR);
2518dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID1_FIFO_UNDERFLOW);
2519dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID1_END_WIN);
2520dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID2_FIFO_UNDERFLOW);
2521dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(VID2_END_WIN);
2522dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(SYNC_LOST);
2523dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(SYNC_LOST_DIGIT);
2524dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	PIS(WAKEUP);
25252a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
25262a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(FRAMEDONE2);
25272a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(VSYNC2);
25282a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(ACBIAS_COUNT_STAT2);
25292a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(SYNC_LOST2);
25302a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
2531dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS
2532dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen}
2533dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif
2534dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
253580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_dump_regs(struct seq_file *s)
253680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
25374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	int i, j;
25384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char *mgr_names[] = {
25394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_LCD]		= "LCD",
25404dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_DIGIT]	= "TV",
25414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_CHANNEL_LCD2]		= "LCD2",
25424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	};
25434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char *ovl_names[] = {
25444dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_GFX]		= "GFX",
25454dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_VIDEO1]	= "VID1",
25464dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		[OMAP_DSS_VIDEO2]	= "VID2",
25474dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	};
25484dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	const char **p_names;
25494dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
25509b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja#define DUMPREG(r) seq_printf(s, "%-50s %08x\n", #r, dispc_read_reg(r))
255180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (dispc_runtime_get())
25534fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return;
255480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25555010be80127eedfd1237627810d9f75e02036111Archit Taneja	/* DISPC common registers */
255680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_REVISION);
255780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_SYSCONFIG);
255880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_SYSSTATUS);
255980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_IRQSTATUS);
256080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_IRQENABLE);
256180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CONTROL);
256280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CONFIG);
256380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_CAPABLE);
256480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_LINE_STATUS);
256580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DUMPREG(DISPC_LINE_NUMBER);
2566332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	if (dss_has_feature(FEAT_GLOBAL_ALPHA))
2567332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		DUMPREG(DISPC_GLOBAL_ALPHA);
25682a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2)) {
25692a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		DUMPREG(DISPC_CONTROL2);
25702a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		DUMPREG(DISPC_CONFIG2);
25715010be80127eedfd1237627810d9f75e02036111Archit Taneja	}
25725010be80127eedfd1237627810d9f75e02036111Archit Taneja
25735010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG
25745010be80127eedfd1237627810d9f75e02036111Archit Taneja
25755010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(i, name) name(i)
25764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja#define DUMPREG(i, r) seq_printf(s, "%s(%s)%*s %08x\n", #r, p_names[i], \
25774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	48 - strlen(#r) - strlen(p_names[i]), " ", \
25785010be80127eedfd1237627810d9f75e02036111Archit Taneja	dispc_read_reg(DISPC_REG(i, r)))
25795010be80127eedfd1237627810d9f75e02036111Archit Taneja
25804dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	p_names = mgr_names;
25815010be80127eedfd1237627810d9f75e02036111Archit Taneja
25824dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* DISPC channel specific registers */
25834dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 0; i < dss_feat_get_num_mgrs(); i++) {
25844dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DEFAULT_COLOR);
25854dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TRANS_COLOR);
25864dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_SIZE_MGR);
258780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
25884dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (i == OMAP_DSS_CHANNEL_DIGIT)
25894dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			continue;
25905010be80127eedfd1237627810d9f75e02036111Archit Taneja
25914dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DEFAULT_COLOR);
25924dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TRANS_COLOR);
25934dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TIMING_H);
25944dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_TIMING_V);
25954dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_POL_FREQ);
25964dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DIVISORo);
25974dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_SIZE_MGR);
25985010be80127eedfd1237627810d9f75e02036111Archit Taneja
25994dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE1);
26004dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE2);
26014dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_DATA_CYCLE3);
26022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
2603332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		if (dss_has_feature(FEAT_CPR)) {
26044dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_R);
26054dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_G);
26064dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_CPR_COEF_B);
2607332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen		}
26082a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
260980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
26104dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	p_names = ovl_names;
26114dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26124dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 0; i < dss_feat_get_num_ovls(); i++) {
26134dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_BA0);
26144dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_BA1);
26154dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_POSITION);
26164dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_SIZE);
26174dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ATTRIBUTES);
26184dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIFO_THRESHOLD);
26194dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIFO_SIZE_STATUS);
26204dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ROW_INC);
26214dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_PIXEL_INC);
26224dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_PRELOAD))
26234dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_PRELOAD);
26244dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26254dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (i == OMAP_DSS_GFX) {
26264dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_WINDOW_SKIP);
26274dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_TABLE_BA);
26284dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			continue;
26294dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26304dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26314dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_FIR);
26324dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_PICTURE_SIZE);
26334dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ACCU0);
26344dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		DUMPREG(i, DISPC_OVL_ACCU1);
26354dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
26364dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_BA0_UV);
26374dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_BA1_UV);
26384dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR2);
26394dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ACCU2_0);
26404dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ACCU2_1);
26414dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26424dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_ATTR2))
26434dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_ATTRIBUTES2);
26444dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_PRELOAD))
26454dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_PRELOAD);
2646ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain	}
26475010be80127eedfd1237627810d9f75e02036111Archit Taneja
26485010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG
26495010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DUMPREG
26505010be80127eedfd1237627810d9f75e02036111Archit Taneja
26515010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DISPC_REG(plane, name, i) name(plane, i)
26525010be80127eedfd1237627810d9f75e02036111Archit Taneja#define DUMPREG(plane, name, i) \
26534dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	seq_printf(s, "%s_%d(%s)%*s %08x\n", #name, i, p_names[plane], \
26544dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	46 - strlen(#name) - strlen(p_names[plane]), " ", \
26555010be80127eedfd1237627810d9f75e02036111Archit Taneja	dispc_read_reg(DISPC_REG(plane, name, i)))
26565010be80127eedfd1237627810d9f75e02036111Archit Taneja
26574dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* Video pipeline coefficient registers */
2658332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen
26594dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	/* start from OMAP_DSS_VIDEO1 */
26604dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja	for (i = 1; i < dss_feat_get_num_ovls(); i++) {
26614dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 8; j++)
26624dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR_COEF_H, j);
26639b372c2d9da43be00e8a267730a2428e0eae12e8Archit Taneja
26644dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 8; j++)
26654dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_FIR_COEF_HV, j);
26665010be80127eedfd1237627810d9f75e02036111Archit Taneja
26674dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		for (j = 0; j < 5; j++)
26684dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			DUMPREG(i, DISPC_OVL_CONV_COEF, j);
2669ab5ca071e231e6d6da5f6aa9484a2cd233f7c746Amber Jain
26704dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_FIR_COEF_V)) {
26714dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26724dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_V, j);
26734dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
26744dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26754dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		if (dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) {
26764dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26774dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_H2, j);
26784dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26794dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26804dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_HV2, j);
26814dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja
26824dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja			for (j = 0; j < 8; j++)
26834dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja				DUMPREG(i, DISPC_OVL_FIR_COEF_V2, j);
26844dd2da15fc258fe6364047060e599886e5efc76bArchit Taneja		}
2685332e9d70518b55a70068739bc7ea134e1d8a269bTomi Valkeinen	}
268680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
26874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
26885010be80127eedfd1237627810d9f75e02036111Archit Taneja
26895010be80127eedfd1237627810d9f75e02036111Archit Taneja#undef DISPC_REG
269080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef DUMPREG
269180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
269280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2693ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic void _dispc_set_pol_freq(enum omap_channel channel, bool onoff, bool rf,
2694ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		bool ieo, bool ipc, bool ihs, bool ivs, u8 acbi, u8 acb)
269580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
269680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l = 0;
269780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
269880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("onoff %d rf %d ieo %d ipc %d ihs %d ivs %d acbi %d acb %d\n",
269980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			onoff, rf, ieo, ipc, ihs, ivs, acbi, acb);
270080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
270180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(onoff, 17, 17);
270280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(rf, 16, 16);
270380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ieo, 15, 15);
270480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ipc, 14, 14);
270580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ihs, 13, 13);
270680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(ivs, 12, 12);
270780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(acbi, 11, 8);
270880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	l |= FLD_VAL(acb, 7, 0);
270980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2710ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	dispc_write_reg(DISPC_POL_FREQ(channel), l);
271180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
271280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2713ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalvoid dispc_set_pol_freq(enum omap_channel channel,
2714ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		enum omap_panel_config config, u8 acbi, u8 acb)
271580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
2716ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	_dispc_set_pol_freq(channel, (config & OMAP_DSS_LCD_ONOFF) != 0,
271780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_RF) != 0,
271880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IEO) != 0,
271980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IPC) != 0,
272080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IHS) != 0,
272180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			(config & OMAP_DSS_LCD_IVS) != 0,
272280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			acbi, acb);
272380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
272480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
272580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* with fck as input clock rate, find dispc dividers that produce req_pck */
272680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_find_clk_divs(bool is_tft, unsigned long req_pck, unsigned long fck,
272780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct dispc_clock_info *cinfo)
272880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
272980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 pcd_min = is_tft ? 2 : 3;
273080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long best_pck;
273180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 best_ld, cur_ld;
273280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u16 best_pd, cur_pd;
273380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
273480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_pck = 0;
273580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_ld = 0;
273680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	best_pd = 0;
273780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
273880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (cur_ld = 1; cur_ld <= 255; ++cur_ld) {
273980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long lck = fck / cur_ld;
274080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
274180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		for (cur_pd = pcd_min; cur_pd <= 255; ++cur_pd) {
274280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			unsigned long pck = lck / cur_pd;
274380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			long old_delta = abs(best_pck - req_pck);
274480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			long new_delta = abs(pck - req_pck);
274580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
274680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (best_pck == 0 || new_delta < old_delta) {
274780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_pck = pck;
274880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_ld = cur_ld;
274980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				best_pd = cur_pd;
275080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
275180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				if (pck == req_pck)
275280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen					goto found;
275380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			}
275480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
275580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			if (pck < req_pck)
275680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				break;
275780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
275880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
275980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (lck / pcd_min < req_pck)
276080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			break;
276180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
276280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
276380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenfound:
276480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck_div = best_ld;
276580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck_div = best_pd;
276680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = fck / cinfo->lck_div;
276780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
276880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
276980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
277080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* calculate clock rates using dividers in cinfo */
277180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint dispc_calc_clock_rates(unsigned long dispc_fclk_rate,
277280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct dispc_clock_info *cinfo)
277380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
277480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cinfo->lck_div > 255 || cinfo->lck_div == 0)
277580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
277680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cinfo->pck_div < 2 || cinfo->pck_div > 255)
277780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
277880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
277980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = dispc_fclk_rate / cinfo->lck_div;
278080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
278180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
278280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
278380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
278480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2785ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalint dispc_set_clock_div(enum omap_channel channel,
2786ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		struct dispc_clock_info *cinfo)
278780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
278880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("lck = %lu (%u)\n", cinfo->lck, cinfo->lck_div);
278980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DSSDBG("pck = %lu (%u)\n", cinfo->pck, cinfo->pck_div);
279080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2791ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal	dispc_set_lcd_divisor(channel, cinfo->lck_div, cinfo->pck_div);
279280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
279380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
279480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
279580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2796ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalint dispc_get_clock_div(enum omap_channel channel,
2797ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal		struct dispc_clock_info *cinfo)
279880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
279980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long fck;
280080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
280180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	fck = dispc_fclk_rate();
280280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2803ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	cinfo->lck_div = REG_GET(DISPC_DIVISORo(channel), 23, 16);
2804ce7fa5eb1e815e79e4dd5db42d0d1f8c9d96925bMurthy, Raghuveer	cinfo->pck_div = REG_GET(DISPC_DIVISORo(channel), 7, 0);
280580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
280680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->lck = fck / cinfo->lck_div;
280780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	cinfo->pck = cinfo->lck / cinfo->pck_div;
280880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
280980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
281080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
281180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
281280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* dispc.irq_lock has to be locked by the caller */
281380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_set_irqs(void)
281480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
281580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 mask;
281680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 old_mask;
281780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
281880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
281980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	mask = dispc.irq_error_mask;
282180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
282380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
282480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr == NULL)
282680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
282780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
282880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		mask |= isr_data->mask;
282980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
283080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	old_mask = dispc_read_reg(DISPC_IRQENABLE);
283280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* clear the irqstatus for newly enabled irqs */
283380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask);
283480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQENABLE, mask);
283680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
283780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
283880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
283980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
284080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
284180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int ret;
284280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
284380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
284480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
284580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (isr == NULL)
284680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -EINVAL;
284780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
284880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
284980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
285080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* check for duplicate entry */
285180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
285280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
285380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr == isr && isr_data->arg == arg &&
285480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				isr_data->mask == mask) {
285580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			ret = -EINVAL;
285680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			goto err;
285780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
285880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
285980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	isr_data = NULL;
286180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	ret = -EBUSY;
286280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
286480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
286580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr != NULL)
286780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
286880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
286980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->isr = isr;
287080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->arg = arg;
287180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->mask = mask;
287280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ret = 0;
287380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
287480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
287580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
287680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2877b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen	if (ret)
2878b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen		goto err;
2879b9cb0984a6e6a09a4bcdc11ebc9f0eb71e5b6c85Tomi Valkeinen
288080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
288180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
288380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
288580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenerr:
288680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
288780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
288880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return ret;
288980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
289080c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_register_isr);
289180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
289280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
289380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
289480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
289580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
289680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int ret = -EINVAL;
289780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
289880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
289980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
290080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
290280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
290380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->isr != isr || isr_data->arg != arg ||
290480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen				isr_data->mask != mask)
290580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
290680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		/* found the correct isr */
290880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
290980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->isr = NULL;
291080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->arg = NULL;
291180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data->mask = 0;
291280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
291380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		ret = 0;
291480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		break;
291580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
291680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
291780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (ret == 0)
291880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
291980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
292180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return ret;
292380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
292480c397120fd2436c79f6e0552882feb5ed4549c3Tomi ValkeinenEXPORT_SYMBOL(omap_dispc_unregister_isr);
292580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
292680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG
292780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void print_irq_status(u32 status)
292880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
292980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if ((status & dispc.irq_error_mask) == 0)
293080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return;
293180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
293280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	printk(KERN_DEBUG "DISPC IRQ: 0x%x: ", status);
293380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
293480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#define PIS(x) \
293580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (status & DISPC_IRQ_##x) \
293680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		printk(#x " ");
293780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(GFX_FIFO_UNDERFLOW);
293880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(OCP_ERR);
293980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(VID1_FIFO_UNDERFLOW);
294080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(VID2_FIFO_UNDERFLOW);
294180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(SYNC_LOST);
294280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	PIS(SYNC_LOST_DIGIT);
29432a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2))
29442a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		PIS(SYNC_LOST2);
294580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#undef PIS
294680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
294780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	printk("\n");
294880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
294980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
295080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
295180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen/* Called from dss.c. Note that we don't touch clocks here,
295280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * but we presume they are on because we got an IRQ. However,
295380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * an irq handler may turn the clocks off, so we may not have
295480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen * clock later in the function. */
2955affe360d13e54b415cde2f11cee02369b4ed54bdArchit Tanejastatic irqreturn_t omap_dispc_irq_handler(int irq, void *arg)
295680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
295780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
2958affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	u32 irqstatus, irqenable;
295980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 handledirqs = 0;
296080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 unhandled_errors;
296180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data *isr_data;
296280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS];
296380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
296480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock(&dispc.irq_lock);
296580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
296680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	irqstatus = dispc_read_reg(DISPC_IRQSTATUS);
2967affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	irqenable = dispc_read_reg(DISPC_IRQENABLE);
2968affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
2969affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	/* IRQ is not for us */
2970affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (!(irqstatus & irqenable)) {
2971affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		spin_unlock(&dispc.irq_lock);
2972affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		return IRQ_NONE;
2973affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
297480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
2975dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
2976dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_lock(&dispc.irq_stats_lock);
2977dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dispc.irq_stats.irq_count++;
2978dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	dss_collect_irq_stats(irqstatus, dispc.irq_stats.irqs);
2979dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen	spin_unlock(&dispc.irq_stats_lock);
2980dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif
2981dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen
298280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef DEBUG
298380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (dss_debug)
298480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		print_irq_status(irqstatus);
298580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
298680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* Ack the interrupt. Do it here before clocks are possibly turned
298780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * off */
298880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, irqstatus);
298980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* flush posted write */
299080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_read_reg(DISPC_IRQSTATUS);
299180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
299280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* make a copy and unlock, so that isrs can unregister
299380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * themselves */
299480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	memcpy(registered_isr, dispc.registered_isr,
299580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			sizeof(registered_isr));
299680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
299780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock(&dispc.irq_lock);
299880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
299980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
300080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &registered_isr[i];
300180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
300280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!isr_data->isr)
300380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
300480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
300580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->mask & irqstatus) {
300680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			isr_data->isr(isr_data->arg, irqstatus);
300780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			handledirqs |= isr_data->mask;
300880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
300980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
301080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock(&dispc.irq_lock);
301280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask;
301480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (unhandled_errors) {
301680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.error_irqs |= unhandled_errors;
301780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
301880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		dispc.irq_error_mask &= ~unhandled_errors;
301980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		_omap_dispc_set_irqs();
302080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
302180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		schedule_work(&dispc.error_work);
302280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
302380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
302480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock(&dispc.irq_lock);
3025affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
3026affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	return IRQ_HANDLED;
302780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
302880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
302980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void dispc_error_worker(struct work_struct *work)
303080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
303180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
303280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 errors;
303380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
3034fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned fifo_underflow_bits[] = {
3035fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_GFX_FIFO_UNDERFLOW,
3036fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_VID1_FIFO_UNDERFLOW,
3037fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_VID2_FIFO_UNDERFLOW,
3038fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	};
3039fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
3040fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	static const unsigned sync_lost_bits[] = {
3041fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST,
3042fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST_DIGIT,
3043fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		DISPC_IRQ_SYNC_LOST2,
3044fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	};
304580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
304680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
304780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	errors = dispc.error_irqs;
304880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.error_irqs = 0;
304980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
305080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
305113eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin	dispc_runtime_get();
305213eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin
3053fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
3054fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		struct omap_overlay *ovl;
3055fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		unsigned bit;
305680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3057fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		ovl = omap_dss_get_overlay(i);
3058fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		bit = fifo_underflow_bits[i];
305980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3060fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		if (bit & errors) {
3061fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			DSSERR("FIFO UNDERFLOW on %s, disabling the overlay\n",
3062fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					ovl->name);
3063fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			dispc_enable_plane(ovl->id, false);
3064fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			dispc_go(ovl->manager->id);
306580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			mdelay(50);
306680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
306780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
306880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3069fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen	for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
3070fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		struct omap_overlay_manager *mgr;
3071fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		unsigned bit;
307280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3073fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		mgr = omap_dss_get_overlay_manager(i);
3074fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		bit = sync_lost_bits[i];
307580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3076fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen		if (bit & errors) {
3077fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			struct omap_dss_device *dssdev = mgr->device;
3078fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			bool enable;
307980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3080fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			DSSERR("SYNC_LOST on channel %s, restarting the output "
3081fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					"with video overlays disabled\n",
3082fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					mgr->name);
30832a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
3084fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			enable = dssdev->state == OMAP_DSS_DISPLAY_ACTIVE;
3085fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			dssdev->driver->disable(dssdev);
30862a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
30872a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			for (i = 0; i < omap_dss_get_num_overlays(); ++i) {
30882a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				struct omap_overlay *ovl;
30892a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				ovl = omap_dss_get_overlay(i);
30902a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
3091fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen				if (ovl->id != OMAP_DSS_GFX &&
3092fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen						ovl->manager == mgr)
3093fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen					dispc_enable_plane(ovl->id, false);
30942a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			}
30952a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
3096fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen			dispc_go(mgr->id);
30972a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			mdelay(50);
3098fe3cc9d6cd4c8279f4ea70acc71525a489cfc38aTomi Valkeinen
30992a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal			if (enable)
31002a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal				dssdev->driver->enable(dssdev);
31012a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		}
31022a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	}
31032a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal
310480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (errors & DISPC_IRQ_OCP_ERR) {
310580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		DSSERR("OCP_ERR\n");
310680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
310780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			struct omap_overlay_manager *mgr;
310880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			mgr = omap_dss_get_overlay_manager(i);
31094a9e78abb76a2f1ddccab7098bdf73a2f095aaa6Tomi Valkeinen			mgr->device->driver->disable(mgr->device);
311080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		}
311180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
311280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
311380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
311480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.irq_error_mask |= errors;
311580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
311680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
311713eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin
311813eae1f98255bddcbfe27ae4bd58fe3dc374bc0bDima Zavin	dispc_runtime_put();
311980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
312080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
312180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_timeout(u32 irqmask, unsigned long timeout)
312280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
312380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void dispc_irq_wait_handler(void *data, u32 mask)
312480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	{
312580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		complete((struct completion *)data);
312680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
312780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
312880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
312980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DECLARE_COMPLETION_ONSTACK(completion);
313080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion,
313280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			irqmask);
313380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
313580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return r;
313680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	timeout = wait_for_completion_timeout(&completion, timeout);
313880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
313980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask);
314080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == 0)
314280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ETIMEDOUT;
314380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == -ERESTARTSYS)
314580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ERESTARTSYS;
314680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
314780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
314880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
314980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
315080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenint omap_dispc_wait_for_irq_interruptible_timeout(u32 irqmask,
315180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		unsigned long timeout)
315280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
315380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	void dispc_irq_wait_handler(void *data, u32 mask)
315480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	{
315580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		complete((struct completion *)data);
315680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
315780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
315880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int r;
315980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	DECLARE_COMPLETION_ONSTACK(completion);
316080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	r = omap_dispc_register_isr(dispc_irq_wait_handler, &completion,
316280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			irqmask);
316380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (r)
316580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return r;
316680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
316780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	timeout = wait_for_completion_interruptible_timeout(&completion,
316880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			timeout);
316980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	omap_dispc_unregister_isr(dispc_irq_wait_handler, &completion, irqmask);
317180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == 0)
317380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ETIMEDOUT;
317480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (timeout == -ERESTARTSYS)
317680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		return -ERESTARTSYS;
317780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
317880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	return 0;
317980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
318080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
318180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC
318280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_fake_vsync_irq(void)
318380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
318480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 irqstatus = DISPC_IRQ_VSYNC;
318580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	int i;
318680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3187ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen	WARN_ON(!in_interrupt());
318880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
318980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	for (i = 0; i < DISPC_MAX_NR_ISRS; i++) {
319080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		struct omap_dispc_isr_data *isr_data;
319180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		isr_data = &dispc.registered_isr[i];
319280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
319380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (!isr_data->isr)
319480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			continue;
319580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
319680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		if (isr_data->mask & irqstatus)
319780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen			isr_data->isr(isr_data->arg, irqstatus);
319880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	}
319980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
320080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen#endif
320180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initialize_irq(void)
320380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
320480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	unsigned long flags;
320580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_lock_irqsave(&dispc.irq_lock, flags);
320780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
320880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	memset(dispc.registered_isr, 0, sizeof(dispc.registered_isr));
320980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc.irq_error_mask = DISPC_IRQ_MASK_ERROR;
32112a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal	if (dss_has_feature(FEAT_MGR_LCD2))
32122a205f34b8fb2b86887b177befa7b42efd7a60b9Sumit Semwal		dispc.irq_error_mask |= DISPC_IRQ_SYNC_LOST2;
321380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* there's SYNC_LOST_DIGIT waiting after enabling the DSS,
321580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	 * so clear it */
321680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS));
321780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
321880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_omap_dispc_set_irqs();
321980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	spin_unlock_irqrestore(&dispc.irq_lock, flags);
322180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
322280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_enable_sidle(void)
322480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
322580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_SYSCONFIG, 2, 4, 3);	/* SIDLEMODE: smart idle */
322680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
322780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
322880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenvoid dispc_disable_sidle(void)
322980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
323080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	REG_FLD_MOD(DISPC_SYSCONFIG, 1, 4, 3);	/* SIDLEMODE: no idle */
323180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
323280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
323380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinenstatic void _omap_dispc_initial_config(void)
323480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen{
323580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	u32 l;
323680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
32370cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	/* Exclusively enable DISPC_CORE_CLK and set divider to 1 */
32380cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	if (dss_has_feature(FEAT_CORE_CLK_DIV)) {
32390cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = dispc_read_reg(DISPC_DIVISOR);
32400cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		/* Use DISPC_DIVISOR.LCD, instead of DISPC_DIVISOR1.LCD */
32410cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = FLD_MOD(l, 1, 0, 0);
32420cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		l = FLD_MOD(l, 1, 23, 16);
32430cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer		dispc_write_reg(DISPC_DIVISOR, l);
32440cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer	}
32450cf35df353e8c36d4be0da2d7483896de599f397Murthy, Raghuveer
324680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* FUNCGATED */
32476ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja	if (dss_has_feature(FEAT_FUNCGATED))
32486ced40bfc01f016de89b65d9c733c1fb5eeb06d0Archit Taneja		REG_FLD_MOD(DISPC_CONFIG, 1, 9, 9);
324980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325080c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* L3 firewall setting: enable access to OCM RAM */
325180c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	/* XXX this should be somewhere in plat-omap */
325280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	if (cpu_is_omap24xx())
325380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen		__raw_writel(0x402000b0, OMAP2_L3_IO_ADDRESS(0x680050a0));
325480c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325580c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	_dispc_setup_color_conv_coef();
325680c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325780c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_set_loadmode(OMAP_DSS_LOAD_FRAME_ONLY);
325880c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
325980c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen	dispc_read_plane_fifo_sizes();
32605ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen
32615ed8cf5b8e053832a3d0552e0a9681a3ff0325eeTomi Valkeinen	dispc_configure_burst_sizes();
326280c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen}
326380c397120fd2436c79f6e0552882feb5ed4549c3Tomi Valkeinen
3264060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy/* DISPC HW IP initialisation */
3265060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_probe(struct platform_device *pdev)
3266060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3267060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	u32 rev;
3268affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	int r = 0;
3269ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	struct resource *dispc_mem;
32704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	struct clk *clk;
3271ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy
3272060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	dispc.pdev = pdev;
3273060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
32744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk = clk_get(&pdev->dev, "fck");
32754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (IS_ERR(clk)) {
32764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		DSSERR("can't get fck\n");
32774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		r = PTR_ERR(clk);
32784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_get_clk;
32794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	}
32804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
32814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc.dss_clk = clk;
32824fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3283060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	spin_lock_init(&dispc.irq_lock);
3284060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3285060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS
3286060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	spin_lock_init(&dispc.irq_stats_lock);
3287060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	dispc.irq_stats.last_reset = jiffies;
3288060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy#endif
3289060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3290060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	INIT_WORK(&dispc.error_work, dispc_error_worker);
3291060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3292ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	dispc_mem = platform_get_resource(dispc.pdev, IORESOURCE_MEM, 0);
3293ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	if (!dispc_mem) {
3294ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy		DSSERR("can't get IORESOURCE_MEM DISPC\n");
3295affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -EINVAL;
32964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_ioremap;
3297ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	}
3298ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy	dispc.base = ioremap(dispc_mem->start, resource_size(dispc_mem));
3299060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	if (!dispc.base) {
3300060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		DSSERR("can't ioremap DISPC\n");
3301affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -ENOMEM;
33024fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_ioremap;
3303affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
3304affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	dispc.irq = platform_get_irq(dispc.pdev, 0);
3305affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (dispc.irq < 0) {
3306affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		DSSERR("platform_get_irq failed\n");
3307affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		r = -ENODEV;
33084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_irq;
3309affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	}
3310affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja
3311affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	r = request_irq(dispc.irq, omap_dispc_irq_handler, IRQF_SHARED,
3312affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		"OMAP DISPC", dispc.pdev);
3313affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	if (r < 0) {
3314affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja		DSSERR("request_irq failed\n");
33154fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_irq;
3316060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	}
3317060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_enable(&pdev->dev);
33194fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = dispc_runtime_get();
33214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r)
33224fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		goto err_runtime_get;
3323060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3324060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	_omap_dispc_initial_config();
3325060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3326060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	_omap_dispc_initialize_irq();
3327060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3328060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	rev = dispc_read_reg(DISPC_REVISION);
3329a06b62f8004bd95c132fa312e8593c9a10f466ecSumit Semwal	dev_dbg(&pdev->dev, "OMAP DISPC rev %d.%d\n",
3330060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	       FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0));
3331060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33324fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_runtime_put();
3333060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3334060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return 0;
33354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_runtime_get:
33374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
33384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	free_irq(dispc.irq, dispc.pdev);
33394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_irq:
3340affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	iounmap(dispc.base);
33414fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_ioremap:
33424fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk_put(dispc.dss_clk);
33434fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_clk:
3344affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	return r;
3345060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3346060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3347060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic int omap_dispchw_remove(struct platform_device *pdev)
3348060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
33494fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	pm_runtime_disable(&pdev->dev);
33504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33514fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	clk_put(dispc.dss_clk);
33524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3353affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja	free_irq(dispc.irq, dispc.pdev);
3354060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	iounmap(dispc.base);
3355060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return 0;
3356060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3357060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
33584fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_suspend(struct device *dev)
33594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
33604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dispc_save_context();
33614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	dss_runtime_put();
33624fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
33644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
33654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dispc_runtime_resume(struct device *dev)
33674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{
33684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	int r;
33694fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	r = dss_runtime_get();
33714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	if (r < 0)
33724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		return r;
33734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
337449ea86f3fae21dd0334668b621e9c88f43a73c86Tomi Valkeinen	dispc_restore_context();
33754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	return 0;
33774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}
33784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
33794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dispc_pm_ops = {
33804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_suspend = dispc_runtime_suspend,
33814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen	.runtime_resume = dispc_runtime_resume,
33824fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen};
33834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen
3384060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamystatic struct platform_driver omap_dispchw_driver = {
3385060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.probe          = omap_dispchw_probe,
3386060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.remove         = omap_dispchw_remove,
3387060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	.driver         = {
3388060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		.name   = "omapdss_dispc",
3389060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy		.owner  = THIS_MODULE,
33904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen		.pm	= &dispc_pm_ops,
3391060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	},
3392060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy};
3393060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3394060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyint dispc_init_platform_driver(void)
3395060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3396060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return platform_driver_register(&omap_dispchw_driver);
3397060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3398060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy
3399060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamyvoid dispc_uninit_platform_driver(void)
3400060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy{
3401060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy	return platform_driver_unregister(&omap_dispchw_driver);
3402060b6d9cbab03f1379dbe00393ab26d6eb371ce2Senthilvadivu Guruswamy}
3403