blob: 49b1fbfab07ad6c2ec98d62d99a1d0362fede56f [file] [log] [blame]
/*
* Copyright 2018 NXP
*/
/*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
#ifndef MXC_PARALLEL_CSI_H_
#define MXC_PARALLEL_CSI_H_
#include <media/v4l2-device.h>
#define MXC_PARALLEL_CSI_DRIVER_NAME "mxc-parallel-csi"
#define MXC_PARALLEL_CSI_SUBDEV_NAME MXC_PARALLEL_CSI_DRIVER_NAME
#define PARALLEL_CSI_OF_NODE_NAME "pcsi"
#define BIT_U(nr) (1U << (nr))
#define MXC_PARALLEL_CSI_PAD_SOURCE 0
#define MXC_PARALLEL_CSI_PAD_SINK 1
#define MXC_PARALLEL_CSI_PADS_NUM 2
#define CI_PI_BASE_OFFSET 0x0U
/* CI_PI INTERFACE Control */
#define IF_CTRL_REG (CI_PI_BASE_OFFSET + 0x00)
#define IF_CTRL_REG_PL_ENABLE BIT_U(0)
#define IF_CTRL_REG_PL_VALID BIT_U(1)
#define IF_CTRL_REG_PL_ADDR(x) (((x) & 0x7U) << 2)
#define IF_CTRL_REG_IF_FORCE(x) (((x) & 0x7U) << 5)
#define IF_CTRL_REG_DATA_TYPE_SEL BIT_U(8)
#define IF_CTRL_REG_DATA_TYPE(x) (((x) & 0x1FU) << 9)
#define DATA_TYPE_OUT_NULL (0x00)
#define DATA_TYPE_OUT_RGB (0x04)
#define DATA_TYPE_OUT_YUV444 (0x08)
#define DATA_TYPE_OUT_YYU420_ODD (0x10)
#define DATA_TYPE_OUT_YYU420_EVEN (0x12)
#define DATA_TYPE_OUT_YYY_ODD (0x18)
#define DATA_TYPE_OUT_UYVY_EVEN (0x1A)
#define DATA_TYPE_OUT_RAW (0x1C)
#define IF_CTRL_REG_IF_FORCE_HSYNV_OVERRIDE 0x4
#define IF_CTRL_REG_IF_FORCE_VSYNV_OVERRIDE 0x2
#define IF_CTRL_REG_IF_FORCE_DATA_ENABLE_OVERRIDE 0x1
#define IF_CTRL_REG_SET (CI_PI_BASE_OFFSET + 0x04)
#define IF_CTRL_REG_CLR (CI_PI_BASE_OFFSET + 0x08)
#define IF_CTRL_REG_TOG (CI_PI_BASE_OFFSET + 0x0C)
/* CSI INTERFACE CONTROL REG */
#define CSI_CTRL_REG (CI_PI_BASE_OFFSET + 0x10)
#define CSI_CTRL_REG_CSI_EN BIT_U(0)
#define CSI_CTRL_REG_PIXEL_CLK_POL BIT_U(1)
#define CSI_CTRL_REG_HSYNC_POL BIT_U(2)
#define CSI_CTRL_REG_VSYNC_POL BIT_U(3)
#define CSI_CTRL_REG_DE_POL BIT_U(4)
#define CSI_CTRL_REG_PIXEL_DATA_POL BIT_U(5)
#define CSI_CTRL_REG_CCIR_EXT_VSYNC_EN BIT_U(6)
#define CSI_CTRL_REG_CCIR_EN BIT_U(7)
#define CSI_CTRL_REG_CCIR_VIDEO_MODE BIT_U(8)
#define CSI_CTRL_REG_CCIR_NTSC_EN BIT_U(9)
#define CSI_CTRL_REG_CCIR_VSYNC_RESET_EN BIT_U(10)
#define CSI_CTRL_REG_CCIR_ECC_ERR_CORRECT_EN BIT_U(11)
#define CSI_CTRL_REG_HSYNC_FORCE_EN BIT_U(12)
#define CSI_CTRL_REG_VSYNC_FORCE_EN BIT_U(13)
#define CSI_CTRL_REG_GCLK_MODE_EN BIT_U(14)
#define CSI_CTRL_REG_VALID_SEL BIT_U(15)
#define CSI_CTRL_REG_RAW_OUT_SEL BIT_U(16)
#define CSI_CTRL_REG_HSYNC_OUT_SEL BIT_U(17)
#define CSI_CTRL_REG_HSYNC_PULSE(x) (((x) & 0x7U) << 19)
#define CSI_CTRL_REG_UV_SWAP_EN BIT_U(22)
#define CSI_CTRL_REG_DATA_TYPE_IN(x) (((x) & 0xFU) << 23)
#define CSI_CTRL_REG_MASK_VSYNC_COUNTER(x) (((x) & 0x3U) << 27)
#define CSI_CTRL_REG_SOFTRST BIT_U(31)
#define DATA_TYPE_IN_UYVY_BT656_8BITS 0x0
#define DATA_TYPE_IN_UYVY_BT656_10BITS 0x1
#define DATA_TYPE_IN_RGB_8BITS 0x2
#define DATA_TYPE_IN_BGR_8BITS 0x3
#define DATA_TYPE_IN_RGB_24BITS 0x4
#define DATA_TYPE_IN_YVYU_8BITS 0x5
#define DATA_TYPE_IN_YUV_8BITS 0x6
#define DATA_TYPE_IN_YVYU_16BITS 0x7
#define DATA_TYPE_IN_YUV_24BITS 0x8
#define DATA_TYPE_IN_BAYER_8BITS 0x9
#define DATA_TYPE_IN_BAYER_10BITS 0xA
#define DATA_TYPE_IN_BAYER_12BITS 0xB
#define DATA_TYPE_IN_BAYER_16BITS 0xC
#define CSI_CTRL_REG_SET (CI_PI_BASE_OFFSET + 0x14)
#define CSI_CTRL_REG_CLR (CI_PI_BASE_OFFSET + 0x18)
#define CSI_CTRL_REG_TOG (CI_PI_BASE_OFFSET + 0x1C)
/* CSI interface Status */
#define CSI_STATUS (CI_PI_BASE_OFFSET + 0x20)
#define CSI_STATUS_FIELD_TOGGLE BIT_U(0)
#define CSI_STATUS_ECC_ERROR BIT_U(1)
#define CSI_STATUS_SET (CI_PI_BASE_OFFSET + 0x24)
#define CSI_STATUS_CLR (CI_PI_BASE_OFFSET + 0x28)
#define CSI_STATUS_TOG (CI_PI_BASE_OFFSET + 0x2C)
/* CSI INTERFACE CONTROL REG1 */
#define CSI_CTRL_REG1 (CI_PI_BASE_OFFSET + 0x30)
#define CSI_CTRL_REG1_PIXEL_WIDTH(v) (((v) & 0xFFFFU) << 0)
#define CSI_CTRL_REG1_VSYNC_PULSE(v) (((v) & 0xFFFFU) << 16)
#define CSI_CTRL_REG1_SET (CI_PI_BASE_OFFSET + 0x34)
#define CSI_CTRL_REG1_CLR (CI_PI_BASE_OFFSET + 0x38)
#define CSI_CTRL_REG1_TOG (CI_PI_BASE_OFFSET + 0x3C)
/***********************************************************/
#define LPCG_BASE (void __iomem *)0x58263000
#define LPCG_LIS_CLK (0x00)
#define LPCG_CSR_CLK (0x04)
#define LPCG_GPIO_CLK (0x08)
#define LPCG_PWM_CLK (0x0c)
#define LPCG_I2C_CLK (0x10)
#define LPCG_CSI_INTERFACE_CLK (0x18)
#define LPCG_CSI_MCLK (0x1c)
/***********************************************************/
//#define CSI_INTERFACE_CCIR656 1
struct mxc_parallel_csi_dev {
struct v4l2_device v4l2_dev;
struct v4l2_subdev sd;
struct v4l2_subdev *sensor_sd;
struct media_pad pads[MXC_PARALLEL_CSI_PADS_NUM];
struct v4l2_mbus_framefmt format;
void __iomem *csr_regs;
void __iomem *lpcg_regs;
struct platform_device *pdev;
u32 flags;
int irq;
struct clk *clk_ipg;
struct clk *clk_pixel;
struct clk *clk_sel;
struct clk *clk_div;
struct clk *clk_dpll;
bool clk_enable;
struct v4l2_async_subdev asd;
struct v4l2_async_notifier subdev_notifier;
struct v4l2_async_subdev *async_subdevs[2];
struct mutex lock;
u8 running;
u8 mode;
u8 uv_swap;
u8 tvdec;
};
#endif
enum {
GATE_CLOCK_MODE = 0x01,
CCIR_MODE = 0x02,
};