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