[media] davinci: vpfe: dm365: add IPIPEIF driver based on media framework
add support for dm365 IPIPEIF driver based on media framework. The IPIPEIF is exposed as a subdev, and it supports features like fault pixel correction, dark frame subtraction and other necessary hardware setup. Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com> Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Acked-by: Sakari Ailus <sakari.ailus@iki.fi> Acked-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
622897da67
Коммит
f7fa454dc1
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,233 @@
|
|||
/*
|
||||
* Copyright (C) 2012 Texas Instruments Inc
|
||||
*
|
||||
* 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 version 2.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Contributors:
|
||||
* Manjunath Hadli <manjunath.hadli@ti.com>
|
||||
* Prabhakar Lad <prabhakar.lad@ti.com>
|
||||
*/
|
||||
|
||||
#ifndef _DAVINCI_VPFE_DM365_IPIPEIF_H
|
||||
#define _DAVINCI_VPFE_DM365_IPIPEIF_H
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <media/davinci/vpss.h>
|
||||
#include <media/v4l2-ctrls.h>
|
||||
#include <media/v4l2-subdev.h>
|
||||
|
||||
#include "dm365_ipipeif_user.h"
|
||||
#include "vpfe_video.h"
|
||||
|
||||
/* IPIPE base specific types */
|
||||
enum ipipeif_data_shift {
|
||||
IPIPEIF_BITS15_2 = 0,
|
||||
IPIPEIF_BITS14_1 = 1,
|
||||
IPIPEIF_BITS13_0 = 2,
|
||||
IPIPEIF_BITS12_0 = 3,
|
||||
IPIPEIF_BITS11_0 = 4,
|
||||
IPIPEIF_BITS10_0 = 5,
|
||||
IPIPEIF_BITS9_0 = 6,
|
||||
};
|
||||
|
||||
enum ipipeif_clkdiv {
|
||||
IPIPEIF_DIVIDE_HALF = 0,
|
||||
IPIPEIF_DIVIDE_THIRD = 1,
|
||||
IPIPEIF_DIVIDE_FOURTH = 2,
|
||||
IPIPEIF_DIVIDE_FIFTH = 3,
|
||||
IPIPEIF_DIVIDE_SIXTH = 4,
|
||||
IPIPEIF_DIVIDE_EIGHTH = 5,
|
||||
IPIPEIF_DIVIDE_SIXTEENTH = 6,
|
||||
IPIPEIF_DIVIDE_THIRTY = 7,
|
||||
};
|
||||
|
||||
enum ipipeif_pack_mode {
|
||||
IPIPEIF_PACK_16_BIT = 0,
|
||||
IPIPEIF_PACK_8_BIT = 1,
|
||||
};
|
||||
|
||||
enum ipipeif_5_1_pack_mode {
|
||||
IPIPEIF_5_1_PACK_16_BIT = 0,
|
||||
IPIPEIF_5_1_PACK_8_BIT = 1,
|
||||
IPIPEIF_5_1_PACK_8_BIT_A_LAW = 2,
|
||||
IPIPEIF_5_1_PACK_12_BIT = 3
|
||||
};
|
||||
|
||||
enum ipipeif_input_source {
|
||||
IPIPEIF_CCDC = 0,
|
||||
IPIPEIF_SDRAM_RAW = 1,
|
||||
IPIPEIF_CCDC_DARKFM = 2,
|
||||
IPIPEIF_SDRAM_YUV = 3,
|
||||
};
|
||||
|
||||
enum ipipeif_ialaw {
|
||||
IPIPEIF_ALAW_OFF = 0,
|
||||
IPIPEIF_ALAW_ON = 1,
|
||||
};
|
||||
|
||||
enum ipipeif_input_src1 {
|
||||
IPIPEIF_SRC1_PARALLEL_PORT = 0,
|
||||
IPIPEIF_SRC1_SDRAM_RAW = 1,
|
||||
IPIPEIF_SRC1_ISIF_DARKFM = 2,
|
||||
IPIPEIF_SRC1_SDRAM_YUV = 3,
|
||||
};
|
||||
|
||||
enum ipipeif_dfs_dir {
|
||||
IPIPEIF_PORT_MINUS_SDRAM = 0,
|
||||
IPIPEIF_SDRAM_MINUS_PORT = 1,
|
||||
};
|
||||
|
||||
enum ipipeif_chroma_phase {
|
||||
IPIPEIF_CBCR_Y = 0,
|
||||
IPIPEIF_Y_CBCR = 1,
|
||||
};
|
||||
|
||||
enum ipipeif_dpcm_type {
|
||||
IPIPEIF_DPCM_8BIT_10BIT = 0,
|
||||
IPIPEIF_DPCM_8BIT_12BIT = 1,
|
||||
};
|
||||
|
||||
/* data shift for IPIPE 5.1 */
|
||||
enum ipipeif_5_1_data_shift {
|
||||
IPIPEIF_5_1_BITS11_0 = 0,
|
||||
IPIPEIF_5_1_BITS10_0 = 1,
|
||||
IPIPEIF_5_1_BITS9_0 = 2,
|
||||
IPIPEIF_5_1_BITS8_0 = 3,
|
||||
IPIPEIF_5_1_BITS7_0 = 4,
|
||||
IPIPEIF_5_1_BITS15_4 = 5,
|
||||
};
|
||||
|
||||
#define IPIPEIF_PAD_SINK 0
|
||||
#define IPIPEIF_PAD_SOURCE 1
|
||||
|
||||
#define IPIPEIF_NUM_PADS 2
|
||||
|
||||
enum ipipeif_input_entity {
|
||||
IPIPEIF_INPUT_NONE = 0,
|
||||
IPIPEIF_INPUT_ISIF = 1,
|
||||
IPIPEIF_INPUT_MEMORY = 2,
|
||||
};
|
||||
|
||||
enum ipipeif_output_entity {
|
||||
IPIPEIF_OUTPUT_NONE = 0,
|
||||
IPIPEIF_OUTPUT_IPIPE = 1,
|
||||
IPIPEIF_OUTPUT_RESIZER = 2,
|
||||
};
|
||||
|
||||
struct vpfe_ipipeif_device {
|
||||
struct v4l2_subdev subdev;
|
||||
struct media_pad pads[IPIPEIF_NUM_PADS];
|
||||
struct v4l2_mbus_framefmt formats[IPIPEIF_NUM_PADS];
|
||||
enum ipipeif_input_entity input;
|
||||
unsigned int output;
|
||||
struct vpfe_video_device video_in;
|
||||
struct v4l2_ctrl_handler ctrls;
|
||||
void *__iomem ipipeif_base_addr;
|
||||
struct ipipeif_params config;
|
||||
int dpcm_predictor;
|
||||
int gain;
|
||||
};
|
||||
|
||||
/* IPIPEIF Register Offsets from the base address */
|
||||
#define IPIPEIF_ENABLE 0x00
|
||||
#define IPIPEIF_CFG1 0x04
|
||||
#define IPIPEIF_PPLN 0x08
|
||||
#define IPIPEIF_LPFR 0x0c
|
||||
#define IPIPEIF_HNUM 0x10
|
||||
#define IPIPEIF_VNUM 0x14
|
||||
#define IPIPEIF_ADDRU 0x18
|
||||
#define IPIPEIF_ADDRL 0x1c
|
||||
#define IPIPEIF_ADOFS 0x20
|
||||
#define IPIPEIF_RSZ 0x24
|
||||
#define IPIPEIF_GAIN 0x28
|
||||
|
||||
/* Below registers are available only on IPIPE 5.1 */
|
||||
#define IPIPEIF_DPCM 0x2c
|
||||
#define IPIPEIF_CFG2 0x30
|
||||
#define IPIPEIF_INIRSZ 0x34
|
||||
#define IPIPEIF_OCLIP 0x38
|
||||
#define IPIPEIF_DTUDF 0x3c
|
||||
#define IPIPEIF_CLKDIV 0x40
|
||||
#define IPIPEIF_DPC1 0x44
|
||||
#define IPIPEIF_DPC2 0x48
|
||||
#define IPIPEIF_DFSGVL 0x4c
|
||||
#define IPIPEIF_DFSGTH 0x50
|
||||
#define IPIPEIF_RSZ3A 0x54
|
||||
#define IPIPEIF_INIRSZ3A 0x58
|
||||
#define IPIPEIF_RSZ_MIN 16
|
||||
#define IPIPEIF_RSZ_MAX 112
|
||||
#define IPIPEIF_RSZ_CONST 16
|
||||
#define SETBIT(reg, bit) (reg = ((reg) | ((0x00000001)<<(bit))))
|
||||
#define RESETBIT(reg, bit) (reg = ((reg) & (~(0x00000001<<(bit)))))
|
||||
|
||||
#define IPIPEIF_ADOFS_LSB_MASK 0x1ff
|
||||
#define IPIPEIF_ADOFS_LSB_SHIFT 5
|
||||
#define IPIPEIF_ADOFS_MSB_MASK 0x200
|
||||
#define IPIPEIF_ADDRU_MASK 0x7ff
|
||||
#define IPIPEIF_ADDRL_SHIFT 5
|
||||
#define IPIPEIF_ADDRL_MASK 0xffff
|
||||
#define IPIPEIF_ADDRU_SHIFT 21
|
||||
#define IPIPEIF_ADDRMSB_SHIFT 31
|
||||
#define IPIPEIF_ADDRMSB_LEFT_SHIFT 10
|
||||
|
||||
/* CFG1 Masks and shifts */
|
||||
#define ONESHOT_SHIFT 0
|
||||
#define DECIM_SHIFT 1
|
||||
#define INPSRC_SHIFT 2
|
||||
#define CLKDIV_SHIFT 4
|
||||
#define AVGFILT_SHIFT 7
|
||||
#define PACK8IN_SHIFT 8
|
||||
#define IALAW_SHIFT 9
|
||||
#define CLKSEL_SHIFT 10
|
||||
#define DATASFT_SHIFT 11
|
||||
#define INPSRC1_SHIFT 14
|
||||
|
||||
/* DPC2 */
|
||||
#define IPIPEIF_DPC2_EN_SHIFT 12
|
||||
#define IPIPEIF_DPC2_THR_MASK 0xfff
|
||||
/* Applicable for IPIPE 5.1 */
|
||||
#define IPIPEIF_DF_GAIN_EN_SHIFT 10
|
||||
#define IPIPEIF_DF_GAIN_MASK 0x3ff
|
||||
#define IPIPEIF_DF_GAIN_THR_MASK 0xfff
|
||||
/* DPCM */
|
||||
#define IPIPEIF_DPCM_BITS_SHIFT 2
|
||||
#define IPIPEIF_DPCM_PRED_SHIFT 1
|
||||
/* CFG2 */
|
||||
#define IPIPEIF_CFG2_HDPOL_SHIFT 1
|
||||
#define IPIPEIF_CFG2_VDPOL_SHIFT 2
|
||||
#define IPIPEIF_CFG2_YUV8_SHIFT 6
|
||||
#define IPIPEIF_CFG2_YUV16_SHIFT 3
|
||||
#define IPIPEIF_CFG2_YUV8P_SHIFT 7
|
||||
|
||||
/* INIRSZ */
|
||||
#define IPIPEIF_INIRSZ_ALNSYNC_SHIFT 13
|
||||
#define IPIPEIF_INIRSZ_MASK 0x1fff
|
||||
|
||||
/* CLKDIV */
|
||||
#define IPIPEIF_CLKDIV_M_SHIFT 8
|
||||
|
||||
void vpfe_ipipeif_enable(struct vpfe_device *vpfe_dev);
|
||||
void vpfe_ipipeif_ss_buffer_isr(struct vpfe_ipipeif_device *ipipeif);
|
||||
int vpfe_ipipeif_decimation_enabled(struct vpfe_device *vpfe_dev);
|
||||
int vpfe_ipipeif_get_rsz(struct vpfe_device *vpfe_dev);
|
||||
void vpfe_ipipeif_cleanup(struct vpfe_ipipeif_device *ipipeif,
|
||||
struct platform_device *pdev);
|
||||
int vpfe_ipipeif_init(struct vpfe_ipipeif_device *ipipeif,
|
||||
struct platform_device *pdev);
|
||||
int vpfe_ipipeif_register_entities(struct vpfe_ipipeif_device *ipipeif,
|
||||
struct v4l2_device *vdev);
|
||||
void vpfe_ipipeif_unregister_entities(struct vpfe_ipipeif_device *ipipeif);
|
||||
|
||||
#endif /* _DAVINCI_VPFE_DM365_IPIPEIF_H */
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright (C) 2012 Texas Instruments Inc
|
||||
*
|
||||
* 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 version 2.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
* Contributors:
|
||||
* Manjunath Hadli <manjunath.hadli@ti.com>
|
||||
* Prabhakar Lad <prabhakar.lad@ti.com>
|
||||
*/
|
||||
|
||||
#ifndef _DAVINCI_VPFE_DM365_IPIPEIF_USER_H
|
||||
#define _DAVINCI_VPFE_DM365_IPIPEIF_USER_H
|
||||
|
||||
/* clockdiv for IPIPE 5.1 */
|
||||
struct ipipeif_5_1_clkdiv {
|
||||
unsigned char m;
|
||||
unsigned char n;
|
||||
};
|
||||
|
||||
enum ipipeif_decimation {
|
||||
IPIPEIF_DECIMATION_OFF,
|
||||
IPIPEIF_DECIMATION_ON
|
||||
};
|
||||
|
||||
/* DPC at the if for IPIPE 5.1 */
|
||||
struct ipipeif_dpc {
|
||||
/* 0 - disable, 1 - enable */
|
||||
unsigned char en;
|
||||
/* threshold */
|
||||
unsigned short thr;
|
||||
};
|
||||
|
||||
enum ipipeif_clock {
|
||||
IPIPEIF_PIXCEL_CLK,
|
||||
IPIPEIF_SDRAM_CLK
|
||||
};
|
||||
|
||||
enum ipipeif_avg_filter {
|
||||
IPIPEIF_AVG_OFF,
|
||||
IPIPEIF_AVG_ON
|
||||
};
|
||||
|
||||
struct ipipeif_5_1 {
|
||||
struct ipipeif_5_1_clkdiv clk_div;
|
||||
/* Defect pixel correction */
|
||||
struct ipipeif_dpc dpc;
|
||||
/* clipped to this value */
|
||||
unsigned short clip;
|
||||
/* Align HSync and VSync to rsz_start */
|
||||
unsigned char align_sync;
|
||||
/* resizer start position */
|
||||
unsigned int rsz_start;
|
||||
/* DF gain enable */
|
||||
unsigned char df_gain_en;
|
||||
/* DF gain value */
|
||||
unsigned short df_gain;
|
||||
/* DF gain threshold value */
|
||||
unsigned short df_gain_thr;
|
||||
};
|
||||
|
||||
struct ipipeif_params {
|
||||
enum ipipeif_clock clock_select;
|
||||
unsigned int ppln;
|
||||
unsigned int lpfr;
|
||||
unsigned char rsz;
|
||||
enum ipipeif_decimation decimation;
|
||||
enum ipipeif_avg_filter avg_filter;
|
||||
/* IPIPE 5.1 */
|
||||
struct ipipeif_5_1 if_5_1;
|
||||
};
|
||||
|
||||
/*
|
||||
* Private IOCTL
|
||||
* VIDIOC_VPFE_IPIPEIF_S_CONFIG: Set IPIEIF configuration
|
||||
* VIDIOC_VPFE_IPIPEIF_G_CONFIG: Get IPIEIF configuration
|
||||
*/
|
||||
#define VIDIOC_VPFE_IPIPEIF_S_CONFIG \
|
||||
_IOWR('I', BASE_VIDIOC_PRIVATE + 1, struct ipipeif_params)
|
||||
#define VIDIOC_VPFE_IPIPEIF_G_CONFIG \
|
||||
_IOWR('I', BASE_VIDIOC_PRIVATE + 2, struct ipipeif_params)
|
||||
|
||||
#endif /* _DAVINCI_VPFE_DM365_IPIPEIF_USER_H */
|
Загрузка…
Ссылка в новой задаче