162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * VPIF header file
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2009 Texas Instruments Incorporated - https://www.ti.com/
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef VPIF_H
962306a36Sopenharmony_ci#define VPIF_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/io.h>
1262306a36Sopenharmony_ci#include <linux/videodev2.h>
1362306a36Sopenharmony_ci#include <media/davinci/vpif_types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Maximum channel allowed */
1662306a36Sopenharmony_ci#define VPIF_NUM_CHANNELS		(4)
1762306a36Sopenharmony_ci#define VPIF_CAPTURE_NUM_CHANNELS	(2)
1862306a36Sopenharmony_ci#define VPIF_DISPLAY_NUM_CHANNELS	(2)
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Macros to read/write registers */
2162306a36Sopenharmony_ciextern void __iomem *vpif_base;
2262306a36Sopenharmony_ciextern spinlock_t vpif_lock;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define regr(reg)               readl((reg) + vpif_base)
2562306a36Sopenharmony_ci#define regw(value, reg)        writel(value, (reg + vpif_base))
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* Register Address Offsets */
2862306a36Sopenharmony_ci#define VPIF_PID			(0x0000)
2962306a36Sopenharmony_ci#define VPIF_CH0_CTRL			(0x0004)
3062306a36Sopenharmony_ci#define VPIF_CH1_CTRL			(0x0008)
3162306a36Sopenharmony_ci#define VPIF_CH2_CTRL			(0x000C)
3262306a36Sopenharmony_ci#define VPIF_CH3_CTRL			(0x0010)
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define VPIF_INTEN			(0x0020)
3562306a36Sopenharmony_ci#define VPIF_INTEN_SET			(0x0024)
3662306a36Sopenharmony_ci#define VPIF_INTEN_CLR			(0x0028)
3762306a36Sopenharmony_ci#define VPIF_STATUS			(0x002C)
3862306a36Sopenharmony_ci#define VPIF_STATUS_CLR			(0x0030)
3962306a36Sopenharmony_ci#define VPIF_EMULATION_CTRL		(0x0034)
4062306a36Sopenharmony_ci#define VPIF_REQ_SIZE			(0x0038)
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define VPIF_CH0_TOP_STRT_ADD_LUMA	(0x0040)
4362306a36Sopenharmony_ci#define VPIF_CH0_BTM_STRT_ADD_LUMA	(0x0044)
4462306a36Sopenharmony_ci#define VPIF_CH0_TOP_STRT_ADD_CHROMA	(0x0048)
4562306a36Sopenharmony_ci#define VPIF_CH0_BTM_STRT_ADD_CHROMA	(0x004c)
4662306a36Sopenharmony_ci#define VPIF_CH0_TOP_STRT_ADD_HANC	(0x0050)
4762306a36Sopenharmony_ci#define VPIF_CH0_BTM_STRT_ADD_HANC	(0x0054)
4862306a36Sopenharmony_ci#define VPIF_CH0_TOP_STRT_ADD_VANC	(0x0058)
4962306a36Sopenharmony_ci#define VPIF_CH0_BTM_STRT_ADD_VANC	(0x005c)
5062306a36Sopenharmony_ci#define VPIF_CH0_SP_CFG			(0x0060)
5162306a36Sopenharmony_ci#define VPIF_CH0_IMG_ADD_OFST		(0x0064)
5262306a36Sopenharmony_ci#define VPIF_CH0_HANC_ADD_OFST		(0x0068)
5362306a36Sopenharmony_ci#define VPIF_CH0_H_CFG			(0x006c)
5462306a36Sopenharmony_ci#define VPIF_CH0_V_CFG_00		(0x0070)
5562306a36Sopenharmony_ci#define VPIF_CH0_V_CFG_01		(0x0074)
5662306a36Sopenharmony_ci#define VPIF_CH0_V_CFG_02		(0x0078)
5762306a36Sopenharmony_ci#define VPIF_CH0_V_CFG_03		(0x007c)
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define VPIF_CH1_TOP_STRT_ADD_LUMA	(0x0080)
6062306a36Sopenharmony_ci#define VPIF_CH1_BTM_STRT_ADD_LUMA	(0x0084)
6162306a36Sopenharmony_ci#define VPIF_CH1_TOP_STRT_ADD_CHROMA	(0x0088)
6262306a36Sopenharmony_ci#define VPIF_CH1_BTM_STRT_ADD_CHROMA	(0x008c)
6362306a36Sopenharmony_ci#define VPIF_CH1_TOP_STRT_ADD_HANC	(0x0090)
6462306a36Sopenharmony_ci#define VPIF_CH1_BTM_STRT_ADD_HANC	(0x0094)
6562306a36Sopenharmony_ci#define VPIF_CH1_TOP_STRT_ADD_VANC	(0x0098)
6662306a36Sopenharmony_ci#define VPIF_CH1_BTM_STRT_ADD_VANC	(0x009c)
6762306a36Sopenharmony_ci#define VPIF_CH1_SP_CFG			(0x00a0)
6862306a36Sopenharmony_ci#define VPIF_CH1_IMG_ADD_OFST		(0x00a4)
6962306a36Sopenharmony_ci#define VPIF_CH1_HANC_ADD_OFST		(0x00a8)
7062306a36Sopenharmony_ci#define VPIF_CH1_H_CFG			(0x00ac)
7162306a36Sopenharmony_ci#define VPIF_CH1_V_CFG_00		(0x00b0)
7262306a36Sopenharmony_ci#define VPIF_CH1_V_CFG_01		(0x00b4)
7362306a36Sopenharmony_ci#define VPIF_CH1_V_CFG_02		(0x00b8)
7462306a36Sopenharmony_ci#define VPIF_CH1_V_CFG_03		(0x00bc)
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci#define VPIF_CH2_TOP_STRT_ADD_LUMA	(0x00c0)
7762306a36Sopenharmony_ci#define VPIF_CH2_BTM_STRT_ADD_LUMA	(0x00c4)
7862306a36Sopenharmony_ci#define VPIF_CH2_TOP_STRT_ADD_CHROMA	(0x00c8)
7962306a36Sopenharmony_ci#define VPIF_CH2_BTM_STRT_ADD_CHROMA	(0x00cc)
8062306a36Sopenharmony_ci#define VPIF_CH2_TOP_STRT_ADD_HANC	(0x00d0)
8162306a36Sopenharmony_ci#define VPIF_CH2_BTM_STRT_ADD_HANC	(0x00d4)
8262306a36Sopenharmony_ci#define VPIF_CH2_TOP_STRT_ADD_VANC	(0x00d8)
8362306a36Sopenharmony_ci#define VPIF_CH2_BTM_STRT_ADD_VANC	(0x00dc)
8462306a36Sopenharmony_ci#define VPIF_CH2_SP_CFG			(0x00e0)
8562306a36Sopenharmony_ci#define VPIF_CH2_IMG_ADD_OFST		(0x00e4)
8662306a36Sopenharmony_ci#define VPIF_CH2_HANC_ADD_OFST		(0x00e8)
8762306a36Sopenharmony_ci#define VPIF_CH2_H_CFG			(0x00ec)
8862306a36Sopenharmony_ci#define VPIF_CH2_V_CFG_00		(0x00f0)
8962306a36Sopenharmony_ci#define VPIF_CH2_V_CFG_01		(0x00f4)
9062306a36Sopenharmony_ci#define VPIF_CH2_V_CFG_02		(0x00f8)
9162306a36Sopenharmony_ci#define VPIF_CH2_V_CFG_03		(0x00fc)
9262306a36Sopenharmony_ci#define VPIF_CH2_HANC0_STRT		(0x0100)
9362306a36Sopenharmony_ci#define VPIF_CH2_HANC0_SIZE		(0x0104)
9462306a36Sopenharmony_ci#define VPIF_CH2_HANC1_STRT		(0x0108)
9562306a36Sopenharmony_ci#define VPIF_CH2_HANC1_SIZE		(0x010c)
9662306a36Sopenharmony_ci#define VPIF_CH2_VANC0_STRT		(0x0110)
9762306a36Sopenharmony_ci#define VPIF_CH2_VANC0_SIZE		(0x0114)
9862306a36Sopenharmony_ci#define VPIF_CH2_VANC1_STRT		(0x0118)
9962306a36Sopenharmony_ci#define VPIF_CH2_VANC1_SIZE		(0x011c)
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#define VPIF_CH3_TOP_STRT_ADD_LUMA	(0x0140)
10262306a36Sopenharmony_ci#define VPIF_CH3_BTM_STRT_ADD_LUMA	(0x0144)
10362306a36Sopenharmony_ci#define VPIF_CH3_TOP_STRT_ADD_CHROMA	(0x0148)
10462306a36Sopenharmony_ci#define VPIF_CH3_BTM_STRT_ADD_CHROMA	(0x014c)
10562306a36Sopenharmony_ci#define VPIF_CH3_TOP_STRT_ADD_HANC	(0x0150)
10662306a36Sopenharmony_ci#define VPIF_CH3_BTM_STRT_ADD_HANC	(0x0154)
10762306a36Sopenharmony_ci#define VPIF_CH3_TOP_STRT_ADD_VANC	(0x0158)
10862306a36Sopenharmony_ci#define VPIF_CH3_BTM_STRT_ADD_VANC	(0x015c)
10962306a36Sopenharmony_ci#define VPIF_CH3_SP_CFG			(0x0160)
11062306a36Sopenharmony_ci#define VPIF_CH3_IMG_ADD_OFST		(0x0164)
11162306a36Sopenharmony_ci#define VPIF_CH3_HANC_ADD_OFST		(0x0168)
11262306a36Sopenharmony_ci#define VPIF_CH3_H_CFG			(0x016c)
11362306a36Sopenharmony_ci#define VPIF_CH3_V_CFG_00		(0x0170)
11462306a36Sopenharmony_ci#define VPIF_CH3_V_CFG_01		(0x0174)
11562306a36Sopenharmony_ci#define VPIF_CH3_V_CFG_02		(0x0178)
11662306a36Sopenharmony_ci#define VPIF_CH3_V_CFG_03		(0x017c)
11762306a36Sopenharmony_ci#define VPIF_CH3_HANC0_STRT		(0x0180)
11862306a36Sopenharmony_ci#define VPIF_CH3_HANC0_SIZE		(0x0184)
11962306a36Sopenharmony_ci#define VPIF_CH3_HANC1_STRT		(0x0188)
12062306a36Sopenharmony_ci#define VPIF_CH3_HANC1_SIZE		(0x018c)
12162306a36Sopenharmony_ci#define VPIF_CH3_VANC0_STRT		(0x0190)
12262306a36Sopenharmony_ci#define VPIF_CH3_VANC0_SIZE		(0x0194)
12362306a36Sopenharmony_ci#define VPIF_CH3_VANC1_STRT		(0x0198)
12462306a36Sopenharmony_ci#define VPIF_CH3_VANC1_SIZE		(0x019c)
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci#define VPIF_IODFT_CTRL			(0x01c0)
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci/* Functions for bit Manipulation */
12962306a36Sopenharmony_cistatic inline void vpif_set_bit(u32 reg, u32 bit)
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	regw((regr(reg)) | (0x01 << bit), reg);
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistatic inline void vpif_clr_bit(u32 reg, u32 bit)
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci	regw(((regr(reg)) & ~(0x01 << bit)), reg);
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/* Macro for Generating mask */
14062306a36Sopenharmony_ci#ifdef GENERATE_MASK
14162306a36Sopenharmony_ci#undef GENERATE_MASK
14262306a36Sopenharmony_ci#endif
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci#define GENERATE_MASK(bits, pos) \
14562306a36Sopenharmony_ci		((((0xFFFFFFFF) << (32 - bits)) >> (32 - bits)) << pos)
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/* Bit positions in the channel control registers */
14862306a36Sopenharmony_ci#define VPIF_CH_DATA_MODE_BIT	(2)
14962306a36Sopenharmony_ci#define VPIF_CH_YC_MUX_BIT	(3)
15062306a36Sopenharmony_ci#define VPIF_CH_SDR_FMT_BIT	(4)
15162306a36Sopenharmony_ci#define VPIF_CH_HANC_EN_BIT	(8)
15262306a36Sopenharmony_ci#define VPIF_CH_VANC_EN_BIT	(9)
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci#define VPIF_CAPTURE_CH_NIP	(10)
15562306a36Sopenharmony_ci#define VPIF_DISPLAY_CH_NIP	(11)
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci#define VPIF_DISPLAY_PIX_EN_BIT	(10)
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci#define VPIF_CH_INPUT_FIELD_FRAME_BIT	(12)
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci#define VPIF_CH_FID_POLARITY_BIT	(15)
16262306a36Sopenharmony_ci#define VPIF_CH_V_VALID_POLARITY_BIT	(14)
16362306a36Sopenharmony_ci#define VPIF_CH_H_VALID_POLARITY_BIT	(13)
16462306a36Sopenharmony_ci#define VPIF_CH_DATA_WIDTH_BIT		(28)
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define VPIF_CH_CLK_EDGE_CTRL_BIT	(31)
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci/* Mask various length */
16962306a36Sopenharmony_ci#define VPIF_CH_EAVSAV_MASK	GENERATE_MASK(13, 0)
17062306a36Sopenharmony_ci#define VPIF_CH_LEN_MASK	GENERATE_MASK(12, 0)
17162306a36Sopenharmony_ci#define VPIF_CH_WIDTH_MASK	GENERATE_MASK(13, 0)
17262306a36Sopenharmony_ci#define VPIF_CH_LEN_SHIFT	(16)
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci/* VPIF masks for registers */
17562306a36Sopenharmony_ci#define VPIF_REQ_SIZE_MASK	(0x1ff)
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_ci/* bit posotion of interrupt vpif_ch_intr register */
17862306a36Sopenharmony_ci#define VPIF_INTEN_FRAME_CH0	(0x00000001)
17962306a36Sopenharmony_ci#define VPIF_INTEN_FRAME_CH1	(0x00000002)
18062306a36Sopenharmony_ci#define VPIF_INTEN_FRAME_CH2	(0x00000004)
18162306a36Sopenharmony_ci#define VPIF_INTEN_FRAME_CH3	(0x00000008)
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci/* bit position of clock and channel enable in vpif_chn_ctrl register */
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci#define VPIF_CH0_CLK_EN		(0x00000002)
18662306a36Sopenharmony_ci#define VPIF_CH0_EN		(0x00000001)
18762306a36Sopenharmony_ci#define VPIF_CH1_CLK_EN		(0x00000002)
18862306a36Sopenharmony_ci#define VPIF_CH1_EN		(0x00000001)
18962306a36Sopenharmony_ci#define VPIF_CH2_CLK_EN		(0x00000002)
19062306a36Sopenharmony_ci#define VPIF_CH2_EN		(0x00000001)
19162306a36Sopenharmony_ci#define VPIF_CH3_CLK_EN		(0x00000002)
19262306a36Sopenharmony_ci#define VPIF_CH3_EN		(0x00000001)
19362306a36Sopenharmony_ci#define VPIF_CH_CLK_EN		(0x00000002)
19462306a36Sopenharmony_ci#define VPIF_CH_EN		(0x00000001)
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci#define VPIF_INT_TOP	(0x00)
19762306a36Sopenharmony_ci#define VPIF_INT_BOTTOM	(0x01)
19862306a36Sopenharmony_ci#define VPIF_INT_BOTH	(0x02)
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci#define VPIF_CH0_INT_CTRL_SHIFT	(6)
20162306a36Sopenharmony_ci#define VPIF_CH1_INT_CTRL_SHIFT	(6)
20262306a36Sopenharmony_ci#define VPIF_CH2_INT_CTRL_SHIFT	(6)
20362306a36Sopenharmony_ci#define VPIF_CH3_INT_CTRL_SHIFT	(6)
20462306a36Sopenharmony_ci#define VPIF_CH_INT_CTRL_SHIFT	(6)
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci#define VPIF_CH2_CLIP_ANC_EN	14
20762306a36Sopenharmony_ci#define VPIF_CH2_CLIP_ACTIVE_EN	13
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci#define VPIF_CH3_CLIP_ANC_EN	14
21062306a36Sopenharmony_ci#define VPIF_CH3_CLIP_ACTIVE_EN	13
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci/* enabled interrupt on both the fields on vpid_ch0_ctrl register */
21362306a36Sopenharmony_ci#define channel0_intr_assert()	(regw((regr(VPIF_CH0_CTRL)|\
21462306a36Sopenharmony_ci	(VPIF_INT_BOTH << VPIF_CH0_INT_CTRL_SHIFT)), VPIF_CH0_CTRL))
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/* enabled interrupt on both the fields on vpid_ch1_ctrl register */
21762306a36Sopenharmony_ci#define channel1_intr_assert()	(regw((regr(VPIF_CH1_CTRL)|\
21862306a36Sopenharmony_ci	(VPIF_INT_BOTH << VPIF_CH1_INT_CTRL_SHIFT)), VPIF_CH1_CTRL))
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci/* enabled interrupt on both the fields on vpid_ch0_ctrl register */
22162306a36Sopenharmony_ci#define channel2_intr_assert()	(regw((regr(VPIF_CH2_CTRL)|\
22262306a36Sopenharmony_ci	(VPIF_INT_BOTH << VPIF_CH2_INT_CTRL_SHIFT)), VPIF_CH2_CTRL))
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci/* enabled interrupt on both the fields on vpid_ch1_ctrl register */
22562306a36Sopenharmony_ci#define channel3_intr_assert()	(regw((regr(VPIF_CH3_CTRL)|\
22662306a36Sopenharmony_ci	(VPIF_INT_BOTH << VPIF_CH3_INT_CTRL_SHIFT)), VPIF_CH3_CTRL))
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci#define VPIF_CH_FID_MASK	(0x20)
22962306a36Sopenharmony_ci#define VPIF_CH_FID_SHIFT	(5)
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci#define VPIF_NTSC_VBI_START_FIELD0	(1)
23262306a36Sopenharmony_ci#define VPIF_NTSC_VBI_START_FIELD1	(263)
23362306a36Sopenharmony_ci#define VPIF_PAL_VBI_START_FIELD0	(624)
23462306a36Sopenharmony_ci#define VPIF_PAL_VBI_START_FIELD1	(311)
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci#define VPIF_NTSC_HBI_START_FIELD0	(1)
23762306a36Sopenharmony_ci#define VPIF_NTSC_HBI_START_FIELD1	(263)
23862306a36Sopenharmony_ci#define VPIF_PAL_HBI_START_FIELD0	(624)
23962306a36Sopenharmony_ci#define VPIF_PAL_HBI_START_FIELD1	(311)
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci#define VPIF_NTSC_VBI_COUNT_FIELD0	(20)
24262306a36Sopenharmony_ci#define VPIF_NTSC_VBI_COUNT_FIELD1	(19)
24362306a36Sopenharmony_ci#define VPIF_PAL_VBI_COUNT_FIELD0	(24)
24462306a36Sopenharmony_ci#define VPIF_PAL_VBI_COUNT_FIELD1	(25)
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci#define VPIF_NTSC_HBI_COUNT_FIELD0	(263)
24762306a36Sopenharmony_ci#define VPIF_NTSC_HBI_COUNT_FIELD1	(262)
24862306a36Sopenharmony_ci#define VPIF_PAL_HBI_COUNT_FIELD0	(312)
24962306a36Sopenharmony_ci#define VPIF_PAL_HBI_COUNT_FIELD1	(313)
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci#define VPIF_NTSC_VBI_SAMPLES_PER_LINE	(720)
25262306a36Sopenharmony_ci#define VPIF_PAL_VBI_SAMPLES_PER_LINE	(720)
25362306a36Sopenharmony_ci#define VPIF_NTSC_HBI_SAMPLES_PER_LINE	(268)
25462306a36Sopenharmony_ci#define VPIF_PAL_HBI_SAMPLES_PER_LINE	(280)
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci#define VPIF_CH_VANC_EN			(0x20)
25762306a36Sopenharmony_ci#define VPIF_DMA_REQ_SIZE		(0x080)
25862306a36Sopenharmony_ci#define VPIF_EMULATION_DISABLE		(0x01)
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ciextern u8 irq_vpif_capture_channel[VPIF_NUM_CHANNELS];
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/* inline function to enable/disable channel0 */
26362306a36Sopenharmony_cistatic inline void enable_channel0(int enable)
26462306a36Sopenharmony_ci{
26562306a36Sopenharmony_ci	if (enable)
26662306a36Sopenharmony_ci		regw((regr(VPIF_CH0_CTRL) | (VPIF_CH0_EN)), VPIF_CH0_CTRL);
26762306a36Sopenharmony_ci	else
26862306a36Sopenharmony_ci		regw((regr(VPIF_CH0_CTRL) & (~VPIF_CH0_EN)), VPIF_CH0_CTRL);
26962306a36Sopenharmony_ci}
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci/* inline function to enable/disable channel1 */
27262306a36Sopenharmony_cistatic inline void enable_channel1(int enable)
27362306a36Sopenharmony_ci{
27462306a36Sopenharmony_ci	if (enable)
27562306a36Sopenharmony_ci		regw((regr(VPIF_CH1_CTRL) | (VPIF_CH1_EN)), VPIF_CH1_CTRL);
27662306a36Sopenharmony_ci	else
27762306a36Sopenharmony_ci		regw((regr(VPIF_CH1_CTRL) & (~VPIF_CH1_EN)), VPIF_CH1_CTRL);
27862306a36Sopenharmony_ci}
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci/* inline function to enable interrupt for channel0 */
28162306a36Sopenharmony_cistatic inline void channel0_intr_enable(int enable)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	unsigned long flags;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	spin_lock_irqsave(&vpif_lock, flags);
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci	if (enable) {
28862306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | 0x10), VPIF_INTEN);
28962306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | 0x10), VPIF_INTEN_SET);
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | VPIF_INTEN_FRAME_CH0), VPIF_INTEN);
29262306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH0),
29362306a36Sopenharmony_ci							VPIF_INTEN_SET);
29462306a36Sopenharmony_ci	} else {
29562306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) & (~VPIF_INTEN_FRAME_CH0)), VPIF_INTEN);
29662306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH0),
29762306a36Sopenharmony_ci							VPIF_INTEN_SET);
29862306a36Sopenharmony_ci	}
29962306a36Sopenharmony_ci	spin_unlock_irqrestore(&vpif_lock, flags);
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci/* inline function to enable interrupt for channel1 */
30362306a36Sopenharmony_cistatic inline void channel1_intr_enable(int enable)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	unsigned long flags;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	spin_lock_irqsave(&vpif_lock, flags);
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	if (enable) {
31062306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | 0x10), VPIF_INTEN);
31162306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | 0x10), VPIF_INTEN_SET);
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | VPIF_INTEN_FRAME_CH1), VPIF_INTEN);
31462306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH1),
31562306a36Sopenharmony_ci							VPIF_INTEN_SET);
31662306a36Sopenharmony_ci	} else {
31762306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) & (~VPIF_INTEN_FRAME_CH1)), VPIF_INTEN);
31862306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH1),
31962306a36Sopenharmony_ci							VPIF_INTEN_SET);
32062306a36Sopenharmony_ci	}
32162306a36Sopenharmony_ci	spin_unlock_irqrestore(&vpif_lock, flags);
32262306a36Sopenharmony_ci}
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci/* inline function to set buffer addresses in case of Y/C non mux mode */
32562306a36Sopenharmony_cistatic inline void ch0_set_video_buf_addr_yc_nmux(unsigned long top_strt_luma,
32662306a36Sopenharmony_ci						  unsigned long btm_strt_luma,
32762306a36Sopenharmony_ci						  unsigned long top_strt_chroma,
32862306a36Sopenharmony_ci						  unsigned long btm_strt_chroma)
32962306a36Sopenharmony_ci{
33062306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH0_TOP_STRT_ADD_LUMA);
33162306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH0_BTM_STRT_ADD_LUMA);
33262306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH1_TOP_STRT_ADD_CHROMA);
33362306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH1_BTM_STRT_ADD_CHROMA);
33462306a36Sopenharmony_ci}
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci/* inline function to set buffer addresses in VPIF registers for video data */
33762306a36Sopenharmony_cistatic inline void ch0_set_video_buf_addr(unsigned long top_strt_luma,
33862306a36Sopenharmony_ci					  unsigned long btm_strt_luma,
33962306a36Sopenharmony_ci					  unsigned long top_strt_chroma,
34062306a36Sopenharmony_ci					  unsigned long btm_strt_chroma)
34162306a36Sopenharmony_ci{
34262306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH0_TOP_STRT_ADD_LUMA);
34362306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH0_BTM_STRT_ADD_LUMA);
34462306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH0_TOP_STRT_ADD_CHROMA);
34562306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH0_BTM_STRT_ADD_CHROMA);
34662306a36Sopenharmony_ci}
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_cistatic inline void ch1_set_video_buf_addr(unsigned long top_strt_luma,
34962306a36Sopenharmony_ci					  unsigned long btm_strt_luma,
35062306a36Sopenharmony_ci					  unsigned long top_strt_chroma,
35162306a36Sopenharmony_ci					  unsigned long btm_strt_chroma)
35262306a36Sopenharmony_ci{
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH1_TOP_STRT_ADD_LUMA);
35562306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH1_BTM_STRT_ADD_LUMA);
35662306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH1_TOP_STRT_ADD_CHROMA);
35762306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH1_BTM_STRT_ADD_CHROMA);
35862306a36Sopenharmony_ci}
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_cistatic inline void ch0_set_vbi_addr(unsigned long top_vbi,
36162306a36Sopenharmony_ci	unsigned long btm_vbi, unsigned long a, unsigned long b)
36262306a36Sopenharmony_ci{
36362306a36Sopenharmony_ci	regw(top_vbi, VPIF_CH0_TOP_STRT_ADD_VANC);
36462306a36Sopenharmony_ci	regw(btm_vbi, VPIF_CH0_BTM_STRT_ADD_VANC);
36562306a36Sopenharmony_ci}
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_cistatic inline void ch0_set_hbi_addr(unsigned long top_vbi,
36862306a36Sopenharmony_ci	unsigned long btm_vbi, unsigned long a, unsigned long b)
36962306a36Sopenharmony_ci{
37062306a36Sopenharmony_ci	regw(top_vbi, VPIF_CH0_TOP_STRT_ADD_HANC);
37162306a36Sopenharmony_ci	regw(btm_vbi, VPIF_CH0_BTM_STRT_ADD_HANC);
37262306a36Sopenharmony_ci}
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_cistatic inline void ch1_set_vbi_addr(unsigned long top_vbi,
37562306a36Sopenharmony_ci	unsigned long btm_vbi, unsigned long a, unsigned long b)
37662306a36Sopenharmony_ci{
37762306a36Sopenharmony_ci	regw(top_vbi, VPIF_CH1_TOP_STRT_ADD_VANC);
37862306a36Sopenharmony_ci	regw(btm_vbi, VPIF_CH1_BTM_STRT_ADD_VANC);
37962306a36Sopenharmony_ci}
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_cistatic inline void ch1_set_hbi_addr(unsigned long top_vbi,
38262306a36Sopenharmony_ci	unsigned long btm_vbi, unsigned long a, unsigned long b)
38362306a36Sopenharmony_ci{
38462306a36Sopenharmony_ci	regw(top_vbi, VPIF_CH1_TOP_STRT_ADD_HANC);
38562306a36Sopenharmony_ci	regw(btm_vbi, VPIF_CH1_BTM_STRT_ADD_HANC);
38662306a36Sopenharmony_ci}
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci/* Inline function to enable raw vbi in the given channel */
38962306a36Sopenharmony_cistatic inline void disable_raw_feature(u8 channel_id, u8 index)
39062306a36Sopenharmony_ci{
39162306a36Sopenharmony_ci	u32 ctrl_reg;
39262306a36Sopenharmony_ci	if (0 == channel_id)
39362306a36Sopenharmony_ci		ctrl_reg = VPIF_CH0_CTRL;
39462306a36Sopenharmony_ci	else
39562306a36Sopenharmony_ci		ctrl_reg = VPIF_CH1_CTRL;
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci	if (1 == index)
39862306a36Sopenharmony_ci		vpif_clr_bit(ctrl_reg, VPIF_CH_VANC_EN_BIT);
39962306a36Sopenharmony_ci	else
40062306a36Sopenharmony_ci		vpif_clr_bit(ctrl_reg, VPIF_CH_HANC_EN_BIT);
40162306a36Sopenharmony_ci}
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_cistatic inline void enable_raw_feature(u8 channel_id, u8 index)
40462306a36Sopenharmony_ci{
40562306a36Sopenharmony_ci	u32 ctrl_reg;
40662306a36Sopenharmony_ci	if (0 == channel_id)
40762306a36Sopenharmony_ci		ctrl_reg = VPIF_CH0_CTRL;
40862306a36Sopenharmony_ci	else
40962306a36Sopenharmony_ci		ctrl_reg = VPIF_CH1_CTRL;
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci	if (1 == index)
41262306a36Sopenharmony_ci		vpif_set_bit(ctrl_reg, VPIF_CH_VANC_EN_BIT);
41362306a36Sopenharmony_ci	else
41462306a36Sopenharmony_ci		vpif_set_bit(ctrl_reg, VPIF_CH_HANC_EN_BIT);
41562306a36Sopenharmony_ci}
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_ci/* inline function to enable/disable channel2 */
41862306a36Sopenharmony_cistatic inline void enable_channel2(int enable)
41962306a36Sopenharmony_ci{
42062306a36Sopenharmony_ci	if (enable) {
42162306a36Sopenharmony_ci		regw((regr(VPIF_CH2_CTRL) | (VPIF_CH2_CLK_EN)), VPIF_CH2_CTRL);
42262306a36Sopenharmony_ci		regw((regr(VPIF_CH2_CTRL) | (VPIF_CH2_EN)), VPIF_CH2_CTRL);
42362306a36Sopenharmony_ci	} else {
42462306a36Sopenharmony_ci		regw((regr(VPIF_CH2_CTRL) & (~VPIF_CH2_CLK_EN)), VPIF_CH2_CTRL);
42562306a36Sopenharmony_ci		regw((regr(VPIF_CH2_CTRL) & (~VPIF_CH2_EN)), VPIF_CH2_CTRL);
42662306a36Sopenharmony_ci	}
42762306a36Sopenharmony_ci}
42862306a36Sopenharmony_ci
42962306a36Sopenharmony_ci/* inline function to enable/disable channel3 */
43062306a36Sopenharmony_cistatic inline void enable_channel3(int enable)
43162306a36Sopenharmony_ci{
43262306a36Sopenharmony_ci	if (enable) {
43362306a36Sopenharmony_ci		regw((regr(VPIF_CH3_CTRL) | (VPIF_CH3_CLK_EN)), VPIF_CH3_CTRL);
43462306a36Sopenharmony_ci		regw((regr(VPIF_CH3_CTRL) | (VPIF_CH3_EN)), VPIF_CH3_CTRL);
43562306a36Sopenharmony_ci	} else {
43662306a36Sopenharmony_ci		regw((regr(VPIF_CH3_CTRL) & (~VPIF_CH3_CLK_EN)), VPIF_CH3_CTRL);
43762306a36Sopenharmony_ci		regw((regr(VPIF_CH3_CTRL) & (~VPIF_CH3_EN)), VPIF_CH3_CTRL);
43862306a36Sopenharmony_ci	}
43962306a36Sopenharmony_ci}
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci/* inline function to enable interrupt for channel2 */
44262306a36Sopenharmony_cistatic inline void channel2_intr_enable(int enable)
44362306a36Sopenharmony_ci{
44462306a36Sopenharmony_ci	unsigned long flags;
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	spin_lock_irqsave(&vpif_lock, flags);
44762306a36Sopenharmony_ci
44862306a36Sopenharmony_ci	if (enable) {
44962306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | 0x10), VPIF_INTEN);
45062306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | 0x10), VPIF_INTEN_SET);
45162306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | VPIF_INTEN_FRAME_CH2), VPIF_INTEN);
45262306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH2),
45362306a36Sopenharmony_ci							VPIF_INTEN_SET);
45462306a36Sopenharmony_ci	} else {
45562306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) & (~VPIF_INTEN_FRAME_CH2)), VPIF_INTEN);
45662306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH2),
45762306a36Sopenharmony_ci							VPIF_INTEN_SET);
45862306a36Sopenharmony_ci	}
45962306a36Sopenharmony_ci	spin_unlock_irqrestore(&vpif_lock, flags);
46062306a36Sopenharmony_ci}
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci/* inline function to enable interrupt for channel3 */
46362306a36Sopenharmony_cistatic inline void channel3_intr_enable(int enable)
46462306a36Sopenharmony_ci{
46562306a36Sopenharmony_ci	unsigned long flags;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	spin_lock_irqsave(&vpif_lock, flags);
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	if (enable) {
47062306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | 0x10), VPIF_INTEN);
47162306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | 0x10), VPIF_INTEN_SET);
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) | VPIF_INTEN_FRAME_CH3), VPIF_INTEN);
47462306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH3),
47562306a36Sopenharmony_ci							VPIF_INTEN_SET);
47662306a36Sopenharmony_ci	} else {
47762306a36Sopenharmony_ci		regw((regr(VPIF_INTEN) & (~VPIF_INTEN_FRAME_CH3)), VPIF_INTEN);
47862306a36Sopenharmony_ci		regw((regr(VPIF_INTEN_SET) | VPIF_INTEN_FRAME_CH3),
47962306a36Sopenharmony_ci							VPIF_INTEN_SET);
48062306a36Sopenharmony_ci	}
48162306a36Sopenharmony_ci	spin_unlock_irqrestore(&vpif_lock, flags);
48262306a36Sopenharmony_ci}
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci/* inline function to enable raw vbi data for channel2 */
48562306a36Sopenharmony_cistatic inline void channel2_raw_enable(int enable, u8 index)
48662306a36Sopenharmony_ci{
48762306a36Sopenharmony_ci	u32 mask;
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	if (1 == index)
49062306a36Sopenharmony_ci		mask = VPIF_CH_VANC_EN_BIT;
49162306a36Sopenharmony_ci	else
49262306a36Sopenharmony_ci		mask = VPIF_CH_HANC_EN_BIT;
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci	if (enable)
49562306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH2_CTRL, mask);
49662306a36Sopenharmony_ci	else
49762306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH2_CTRL, mask);
49862306a36Sopenharmony_ci}
49962306a36Sopenharmony_ci
50062306a36Sopenharmony_ci/* inline function to enable raw vbi data for channel3*/
50162306a36Sopenharmony_cistatic inline void channel3_raw_enable(int enable, u8 index)
50262306a36Sopenharmony_ci{
50362306a36Sopenharmony_ci	u32 mask;
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	if (1 == index)
50662306a36Sopenharmony_ci		mask = VPIF_CH_VANC_EN_BIT;
50762306a36Sopenharmony_ci	else
50862306a36Sopenharmony_ci		mask = VPIF_CH_HANC_EN_BIT;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	if (enable)
51162306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH3_CTRL, mask);
51262306a36Sopenharmony_ci	else
51362306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH3_CTRL, mask);
51462306a36Sopenharmony_ci}
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci/* function to enable clipping (for both active and blanking regions) on ch 2 */
51762306a36Sopenharmony_cistatic inline void channel2_clipping_enable(int enable)
51862306a36Sopenharmony_ci{
51962306a36Sopenharmony_ci	if (enable) {
52062306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
52162306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
52262306a36Sopenharmony_ci	} else {
52362306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
52462306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
52562306a36Sopenharmony_ci	}
52662306a36Sopenharmony_ci}
52762306a36Sopenharmony_ci
52862306a36Sopenharmony_ci/* function to enable clipping (for both active and blanking regions) on ch 3 */
52962306a36Sopenharmony_cistatic inline void channel3_clipping_enable(int enable)
53062306a36Sopenharmony_ci{
53162306a36Sopenharmony_ci	if (enable) {
53262306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
53362306a36Sopenharmony_ci		vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
53462306a36Sopenharmony_ci	} else {
53562306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
53662306a36Sopenharmony_ci		vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
53762306a36Sopenharmony_ci	}
53862306a36Sopenharmony_ci}
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci/* inline function to set buffer addresses in case of Y/C non mux mode */
54162306a36Sopenharmony_cistatic inline void ch2_set_video_buf_addr_yc_nmux(unsigned long top_strt_luma,
54262306a36Sopenharmony_ci						  unsigned long btm_strt_luma,
54362306a36Sopenharmony_ci						  unsigned long top_strt_chroma,
54462306a36Sopenharmony_ci						  unsigned long btm_strt_chroma)
54562306a36Sopenharmony_ci{
54662306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH2_TOP_STRT_ADD_LUMA);
54762306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH2_BTM_STRT_ADD_LUMA);
54862306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH3_TOP_STRT_ADD_CHROMA);
54962306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH3_BTM_STRT_ADD_CHROMA);
55062306a36Sopenharmony_ci}
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci/* inline function to set buffer addresses in VPIF registers for video data */
55362306a36Sopenharmony_cistatic inline void ch2_set_video_buf_addr(unsigned long top_strt_luma,
55462306a36Sopenharmony_ci					  unsigned long btm_strt_luma,
55562306a36Sopenharmony_ci					  unsigned long top_strt_chroma,
55662306a36Sopenharmony_ci					  unsigned long btm_strt_chroma)
55762306a36Sopenharmony_ci{
55862306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH2_TOP_STRT_ADD_LUMA);
55962306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH2_BTM_STRT_ADD_LUMA);
56062306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH2_TOP_STRT_ADD_CHROMA);
56162306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH2_BTM_STRT_ADD_CHROMA);
56262306a36Sopenharmony_ci}
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_cistatic inline void ch3_set_video_buf_addr(unsigned long top_strt_luma,
56562306a36Sopenharmony_ci					  unsigned long btm_strt_luma,
56662306a36Sopenharmony_ci					  unsigned long top_strt_chroma,
56762306a36Sopenharmony_ci					  unsigned long btm_strt_chroma)
56862306a36Sopenharmony_ci{
56962306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH3_TOP_STRT_ADD_LUMA);
57062306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH3_BTM_STRT_ADD_LUMA);
57162306a36Sopenharmony_ci	regw(top_strt_chroma, VPIF_CH3_TOP_STRT_ADD_CHROMA);
57262306a36Sopenharmony_ci	regw(btm_strt_chroma, VPIF_CH3_BTM_STRT_ADD_CHROMA);
57362306a36Sopenharmony_ci}
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci/* inline function to set buffer addresses in VPIF registers for vbi data */
57662306a36Sopenharmony_cistatic inline void ch2_set_vbi_addr(unsigned long top_strt_luma,
57762306a36Sopenharmony_ci				    unsigned long btm_strt_luma,
57862306a36Sopenharmony_ci				    unsigned long top_strt_chroma,
57962306a36Sopenharmony_ci				    unsigned long btm_strt_chroma)
58062306a36Sopenharmony_ci{
58162306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH2_TOP_STRT_ADD_VANC);
58262306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH2_BTM_STRT_ADD_VANC);
58362306a36Sopenharmony_ci}
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_cistatic inline void ch3_set_vbi_addr(unsigned long top_strt_luma,
58662306a36Sopenharmony_ci				    unsigned long btm_strt_luma,
58762306a36Sopenharmony_ci				    unsigned long top_strt_chroma,
58862306a36Sopenharmony_ci				    unsigned long btm_strt_chroma)
58962306a36Sopenharmony_ci{
59062306a36Sopenharmony_ci	regw(top_strt_luma, VPIF_CH3_TOP_STRT_ADD_VANC);
59162306a36Sopenharmony_ci	regw(btm_strt_luma, VPIF_CH3_BTM_STRT_ADD_VANC);
59262306a36Sopenharmony_ci}
59362306a36Sopenharmony_ci
59462306a36Sopenharmony_cistatic inline int vpif_intr_status(int channel)
59562306a36Sopenharmony_ci{
59662306a36Sopenharmony_ci	int status = 0;
59762306a36Sopenharmony_ci	int mask;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	if (channel < 0 || channel > 3)
60062306a36Sopenharmony_ci		return 0;
60162306a36Sopenharmony_ci
60262306a36Sopenharmony_ci	mask = 1 << channel;
60362306a36Sopenharmony_ci	status = regr(VPIF_STATUS) & mask;
60462306a36Sopenharmony_ci	regw(status, VPIF_STATUS_CLR);
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	return status;
60762306a36Sopenharmony_ci}
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci#define VPIF_MAX_NAME	(30)
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci/* This structure will store size parameters as per the mode selected by user */
61262306a36Sopenharmony_cistruct vpif_channel_config_params {
61362306a36Sopenharmony_ci	char name[VPIF_MAX_NAME];	/* Name of the mode */
61462306a36Sopenharmony_ci	u16 width;			/* Indicates width of the image */
61562306a36Sopenharmony_ci	u16 height;			/* Indicates height of the image */
61662306a36Sopenharmony_ci	u8 frm_fmt;			/* Interlaced (0) or progressive (1) */
61762306a36Sopenharmony_ci	u8 ycmux_mode;			/* This mode requires one (0) or two (1)
61862306a36Sopenharmony_ci					   channels */
61962306a36Sopenharmony_ci	u16 eav2sav;			/* length of eav 2 sav */
62062306a36Sopenharmony_ci	u16 sav2eav;			/* length of sav 2 eav */
62162306a36Sopenharmony_ci	u16 l1, l3, l5, l7, l9, l11;	/* Other parameter configurations */
62262306a36Sopenharmony_ci	u16 vsize;			/* Vertical size of the image */
62362306a36Sopenharmony_ci	u8 capture_format;		/* Indicates whether capture format
62462306a36Sopenharmony_ci					 * is in BT or in CCD/CMOS */
62562306a36Sopenharmony_ci	u8  vbi_supported;		/* Indicates whether this mode
62662306a36Sopenharmony_ci					 * supports capturing vbi or not */
62762306a36Sopenharmony_ci	u8 hd_sd;			/* HDTV (1) or SDTV (0) format */
62862306a36Sopenharmony_ci	v4l2_std_id stdid;		/* SDTV format */
62962306a36Sopenharmony_ci	struct v4l2_dv_timings dv_timings;	/* HDTV format */
63062306a36Sopenharmony_ci};
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ciextern const unsigned int vpif_ch_params_count;
63362306a36Sopenharmony_ciextern const struct vpif_channel_config_params vpif_ch_params[];
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_cistruct vpif_video_params;
63662306a36Sopenharmony_cistruct vpif_params;
63762306a36Sopenharmony_cistruct vpif_vbi_params;
63862306a36Sopenharmony_ci
63962306a36Sopenharmony_ciint vpif_set_video_params(struct vpif_params *vpifparams, u8 channel_id);
64062306a36Sopenharmony_civoid vpif_set_vbi_display_params(struct vpif_vbi_params *vbiparams,
64162306a36Sopenharmony_ci							u8 channel_id);
64262306a36Sopenharmony_ciint vpif_channel_getfid(u8 channel_id);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_cienum data_size {
64562306a36Sopenharmony_ci	_8BITS = 0,
64662306a36Sopenharmony_ci	_10BITS,
64762306a36Sopenharmony_ci	_12BITS,
64862306a36Sopenharmony_ci};
64962306a36Sopenharmony_ci
65062306a36Sopenharmony_ci/* Structure for vpif parameters for raw vbi data */
65162306a36Sopenharmony_cistruct vpif_vbi_params {
65262306a36Sopenharmony_ci	__u32 hstart0;  /* Horizontal start of raw vbi data for first field */
65362306a36Sopenharmony_ci	__u32 vstart0;  /* Vertical start of raw vbi data for first field */
65462306a36Sopenharmony_ci	__u32 hsize0;   /* Horizontal size of raw vbi data for first field */
65562306a36Sopenharmony_ci	__u32 vsize0;   /* Vertical size of raw vbi data for first field */
65662306a36Sopenharmony_ci	__u32 hstart1;  /* Horizontal start of raw vbi data for second field */
65762306a36Sopenharmony_ci	__u32 vstart1;  /* Vertical start of raw vbi data for second field */
65862306a36Sopenharmony_ci	__u32 hsize1;   /* Horizontal size of raw vbi data for second field */
65962306a36Sopenharmony_ci	__u32 vsize1;   /* Vertical size of raw vbi data for second field */
66062306a36Sopenharmony_ci};
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci/* structure for vpif parameters */
66362306a36Sopenharmony_cistruct vpif_video_params {
66462306a36Sopenharmony_ci	__u8 storage_mode;	/* Indicates field or frame mode */
66562306a36Sopenharmony_ci	unsigned long hpitch;
66662306a36Sopenharmony_ci	v4l2_std_id stdid;
66762306a36Sopenharmony_ci};
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_cistruct vpif_params {
67062306a36Sopenharmony_ci	struct vpif_interface iface;
67162306a36Sopenharmony_ci	struct vpif_video_params video_params;
67262306a36Sopenharmony_ci	struct vpif_channel_config_params std_info;
67362306a36Sopenharmony_ci	union param {
67462306a36Sopenharmony_ci		struct vpif_vbi_params	vbi_params;
67562306a36Sopenharmony_ci		enum data_size data_sz;
67662306a36Sopenharmony_ci	} params;
67762306a36Sopenharmony_ci};
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci#endif				/* End of #ifndef VPIF_H */
680