blob: f1ac368d483da2e42ff370d99f74b8a0b1d2947a [file] [log] [blame]
/*
* drivers/amlogic/media/vin/tvin/bt656/bt656_601_in.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __BT656_601_INPUT_H
#define __BT656_601_INPUT_H
#include <linux/cdev.h>
#include <linux/clk.h>
#include <linux/amlogic/media/frame_provider/tvin/tvin_v4l2.h>
#include "../tvin_frontend.h"
#include "../tvin_global.h"
#include <linux/amlogic/cpu_version.h>
#define BT656PR(fmt, args...) pr_info("amvdec_bt656in: "fmt"", ## args)
#define BT656ERR(fmt, args...) pr_err("amvdec_bt656in: error: "fmt"", ## args)
#define BT656_1 0xd0048000//0xd0048000~0xd004_ffff
#define BT656_2 0xd0050000//0xd0050000~0xd005_ffff
/* registers */
#define BT_CTRL 0x00
#define BT_VBISTART 0x01
#define BT_VBIEND 0x02
#define BT_FIELDSADR 0x03
#define BT_LINECTRL 0x04
#define BT_VIDEOSTART 0x05
#define BT_VIDEOEND 0x06
#define BT_SLICELINE0 0x07
#define BT_SLICELINE1 0x08
#define BT_PORT_CTRL 0x09
#define BT_SWAP_CTRL 0x0a
#define BT_AFIFO_CTRL 0x0d
#define BT_601_CTRL0 0x0e
#define BT_601_CTRL1 0x0f
#define BT_601_CTRL2 0x10
#define BT_601_CTRL3 0x11
#define BT_FIELD_LUMA 0x12
#define BT_RAW_CTRL 0x13
#define BT_STATUS 0x14
#define BT_INT_CTRL 0x15
#define BT_VLINE_STATUS 0x17
#define BT_ERR_CNT 0x19
#define BT_LCNT_STATUS 0x1a
#define BT_PCNT_STATUS 0x1c
#define BT_DELAY_CTRL 0x1d
/* #define VDIN_WR_V_START_END 0x1222 */
#define RESET1_REGISTER 0x1102
#define HHI_CSI_PHY_CNTL0 0x10d3
#define HHI_CSI_PHY_CNTL1 0x10d4
#define HHI_CSI_PHY_CNTL2 0x10d5
/* bit defines */
/*BT656 MACRO */
/* #define BT_CTRL 0x0 */
/* Soft reset */
#define BT_SOFT_RESET 31
/* Sync fifo soft reset_n at system clock domain.
* Level reset. 0 = reset. 1 : normal mode.
*/
/* 30 The reset of syncfifo output */
#define BT_SYSCLOCK_RESET 30
/* Sync fifo soft reset_n at bt656 clock domain.
* Level reset. 0 = reset. 1 : normal mode.
*/
/* 29 The reset of syncfifo input */
#define BT_656CLOCK_RESET 29
/*0: use 3 port send raw data;
* 1: use 1 port send raw data;
*/
#define BT_RAW_ISP 27
/* 25:26 VDIN VS selection. 00 : SOF. 01: EOF.
* 10: vbi start point. 11 : vbi end point.
*/
#define BT_VSYNC_SEL 25
/* 24:23 VDIN HS selection. 00 : EAV. 01: SAV.
* 10: EOL. 11: SOL
*/
#define BT_HSYNC_SEL 23
/* Camera_mode */
#define BT_CAMERA_MODE 22
/* 16 Update all status register. */
#define BT_UPDATE_ST_SEL 16
/* 15 Format select of YCbCr422 to YCbCr444. */
#define BT_COLOR_REPEAT 15
/* 14 Input format and output format.
*0:YCbCr;1:565RGB;
*2:1byte raw;3:2byte raw;
*/
#define BT_VIDEO_MODE 14
/*12 Go to ntsc/pal state.*/
#define BT_AUTO_FMT 12
/*11 Go to DVP state.*/
#define BT_PROG_MODE 11
/* 9 Go to RAW state. */
#define BT_RAW_MODE 9
/* 1: enable bt656 clock. 0:
* disable bt656 clock.
*/
#define BT_CLOCK_ENABLE 7
/* 6 clk27_phase Reverse of clk27. */
#define BT_PHASE_REVERSE 6
/*5 Reset after error occurs. */
#define BT_AUTO_COVER_ERROR 5
/* 2 Use data or port control */
#define BT_REF_MODE 2
/* 0 bt_data_en */
#define BT_EN_BIT 0
/* #define BT_LINECTRL 0x04 */
/* [31] soft_video_active
* 0: control by vs/hs/field;
* 1: control by cnt and sw;
*/
#define BT_SW_VACTIVE 31
/* [30:16] The end of active pixel*/
#define BT_HEND 16
/* [14:0] The start of active pixel*/
#define BT_HOFFSET 0
/* #define BT_VIDEOSTART 0x05 */
/* [28:16] video1_start The start of active line, field1*/
#define BT_F1_VSTART 16
/* [12:0] video0_start The start of active line, field0*/
#define BT_F0_VSTART 0
/* #define BT_VIDEOEND 0x06 */
/* [28:16] video1_end The end of active line, field1*/
#define BT_F1_VEND 16
/* [12:0] video0_end The end of active line, field0*/
#define BT_F0_VEND 0
/* #define BT_SOFT_RESET 31 Soft reset */
/* #define BT_JPEG_START 30 */
/* #define BT_JPEG_IGNORE_BYTES 18 //20:18 */
/* #define BT_JPEG_IGNORE_LAST 17 */
/* #define BT_UPDATE_ST_SEL 16 */
/* #define BT_COLOR_REPEAT 15 */
/* #define BT_VIDEO_MODE 13 // 14:13 */
/* #define BT_AUTO_FMT 12 */
/* #define BT_PROG_MODE 11 */
/* #define BT_JPEG_MODE 10 */
/* 1 : xclk27 is input. 0 : xclk27 is output. */
#define BT_XCLK27_EN_BIT 9
#define BT_FID_EN_BIT 8 /* 1 : enable use FID port. */
/* 1 : external xclk27 0 : internal clk27. */
#define BT_CLK27_SEL_BIT 7
/* 1 : no inverted 0 : inverted. */
/* #define BT_CLK27_PHASE_BIT 6 */
/* 1 : auto cover error by hardware. */
/* #define BT_ACE_MODE_BIT 5 */
/* 1 : no ancillay flag 0 : with ancillay flag. */
#define BT_SLICE_MODE_BIT 4
/* 1 : ntsc 0 : pal. */
#define BT_FMT_MODE_BIT 3
/* 1 : from bit stream. 0 : from ports. */
#define BT_REF_MODE_BIT 2
/* 1 : BT656 model 0 : SAA7118 mode. */
#define BT_MODE_BIT 1
/* #define BT_PORT_CTRL 0x09 */
/* 26 data_endian
* 0: afifo_wdata = {data1,data2}
* 1: afifo_wdata = {data2,data1}
*/
#define BT_DATA_ENDIAN 26
/* 25 clk_inv_sel Reverse clk in*/
#define BT_CLK_REVERSE 25
/* 24 dual_edge_clk_en Use dual edge clock*/
#define BT_CLK_EDGE_EN 24
/* 23 port_active_hmode
* 0: active data when hsync is low;
* 1: active data when hsync is high;
*/
#define BT_ACTIVE_HMODE 23
/* 22 vref_fro_vs_only 0: use reference reverse vblank
* 1£ºuse vsync reverse vblank;
*/
#define BT_VREF_VS 22
/* 21 fid_hsvs_falling For 601 format:
*0: do not use falling edge of vsync
*1:use falling edge of vsync
*/
#define BT_HSVS_FALLING 21
/* 20 fid_hsvs_rising For 601 format:
*0: do not use rising edge of vsync
*1:use rising edge of vsync
*/
#define BT_HSVS_RISING 20
/*19 fid_hsvs_pcnt For 601 format:
*0£ºuse hs/vs generate field
*1£ºuse pixel cnt generate field;
*/
#define BT_FID_HSVS_PCNT 19
/*[18:16] hsync_delay Skew of hsync*/
#define BT_HSYNC_DELAY 16
/*[15:13] vsync_delay Skew of vsync*/
#define BT_VSYNC_DELAY 13
/*[12:10] fid_delay Skew of field*/
#define BT_FID_DELAY 10
/*9 bt_10bto8b When use 8bits data port:
*0£º[9:2]£»
*1£º[9:2] + [1]£
*/
#define BT_10BTO8B 9
/*8 bt_d8b 0£ºuse 10bits data port£»
*1£ºuse 8bits data port;
*/
#define BT_D8B 8
/*7 idq_phase Reverse de port*/
#define BT_IDQ_PHASE 7
/*6 idq_en Enable de port*/
#define BT_IDQ_EN 6
/*5 fid_hsvs For 601 format:
*0: use hs/vs generate fid;
*1: use field port directly;
*/
#define BT_FID_HSVS 5
/*4 fid_phase Reverse field port*/
#define BT_FID_PHASE 4
/*1 vsync_phase Reverse vsync port*/
#define BT_HSYNC_PHASE 1
/*0 hsync_phase Reverse hsync port*/
#define BT_VSYNC_PHASE 0
/* registers rw */
#define BT656_MAX_DEVS 2
static void __iomem *bt656_reg_base[BT656_MAX_DEVS];
static int bt656_reg_read(u32 index, unsigned int reg, unsigned int *val)
{
if (index <= BT656_MAX_DEVS) {
*val = readl(bt656_reg_base[index-1]+reg);
return 0;
} else
return -1;
}
static int bt656_reg_write(u32 index, unsigned int reg, unsigned int val)
{
if (index <= BT656_MAX_DEVS) {
writel(val, (bt656_reg_base[index-1]+reg));
return 0;
} else
return -1;
}
static inline uint32_t bt656_rd(u32 index, uint32_t reg)
{
int val = 0;
bt656_reg_read(index, (reg<<2), &val);
return val;
}
static inline void bt656_wr(u32 index, uint32_t reg, const uint32_t val)
{
bt656_reg_write(index, (reg<<2), val);
}
static inline void bt656_wr_bits(u32 index, uint32_t reg,
const uint32_t value, const uint32_t start, const uint32_t len)
{
bt656_wr(index, reg, ((bt656_rd(index, reg) &
~(((1L << (len)) - 1) << (start))) |
(((value) & ((1L << (len)) - 1)) << (start))));
}
static inline uint32_t bt656_rd_bits(u32 index, uint32_t reg,
const uint32_t start, const uint32_t len)
{
uint32_t val;
val = ((bt656_rd(index, reg) >> (start)) & ((1L << (len)) - 1));
return val;
}
enum am656_status_e {
TVIN_AM656_STOP,
TVIN_AM656_RUNNING,
};
struct am656in_dev_s {
int index;
dev_t devt;
struct cdev cdev;
struct device *dev;
/* void __iomem *reg_base; */
unsigned int overflow_cnt;
unsigned int skip_vdin_frame_count;
enum am656_status_e dec_status;
struct vdin_parm_s para;
struct tvin_frontend_s frontend;
/* clktree */
struct clk *bt656_clk;
struct clk *gate_bt656;
struct clk *gate_bt656_pclk;
};
#endif