Commit 6964b103 authored by Manjunath Hadli's avatar Manjunath Hadli Committed by Mauro Carvalho Chehab

[media] davinci: vpif: add support for clipping on output data

add hardware clipping support for VPIF output data. This
is needed as it is possible that the external encoder
might get confused between the FF or 00 which are a part
of the data and that of the SAV or EAV codes.
Signed-off-by: default avatarManjunath Hadli <manjunath.hadli@ti.com>
Signed-off-by: default avatarLad, Prabhakar <prabhakar.lad@ti.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 2401dd25
...@@ -211,6 +211,12 @@ static inline void vpif_clr_bit(u32 reg, u32 bit) ...@@ -211,6 +211,12 @@ static inline void vpif_clr_bit(u32 reg, u32 bit)
#define VPIF_CH3_INT_CTRL_SHIFT (6) #define VPIF_CH3_INT_CTRL_SHIFT (6)
#define VPIF_CH_INT_CTRL_SHIFT (6) #define VPIF_CH_INT_CTRL_SHIFT (6)
#define VPIF_CH2_CLIP_ANC_EN 14
#define VPIF_CH2_CLIP_ACTIVE_EN 13
#define VPIF_CH3_CLIP_ANC_EN 14
#define VPIF_CH3_CLIP_ACTIVE_EN 13
/* enabled interrupt on both the fields on vpid_ch0_ctrl register */ /* enabled interrupt on both the fields on vpid_ch0_ctrl register */
#define channel0_intr_assert() (regw((regr(VPIF_CH0_CTRL)|\ #define channel0_intr_assert() (regw((regr(VPIF_CH0_CTRL)|\
(VPIF_INT_BOTH << VPIF_CH0_INT_CTRL_SHIFT)), VPIF_CH0_CTRL)) (VPIF_INT_BOTH << VPIF_CH0_INT_CTRL_SHIFT)), VPIF_CH0_CTRL))
...@@ -515,6 +521,30 @@ static inline void channel3_raw_enable(int enable, u8 index) ...@@ -515,6 +521,30 @@ static inline void channel3_raw_enable(int enable, u8 index)
vpif_clr_bit(VPIF_CH3_CTRL, mask); vpif_clr_bit(VPIF_CH3_CTRL, mask);
} }
/* function to enable clipping (for both active and blanking regions) on ch 2 */
static inline void channel2_clipping_enable(int enable)
{
if (enable) {
vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
vpif_set_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
} else {
vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ANC_EN);
vpif_clr_bit(VPIF_CH2_CTRL, VPIF_CH2_CLIP_ACTIVE_EN);
}
}
/* function to enable clipping (for both active and blanking regions) on ch 2 */
static inline void channel3_clipping_enable(int enable)
{
if (enable) {
vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
vpif_set_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
} else {
vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ANC_EN);
vpif_clr_bit(VPIF_CH3_CTRL, VPIF_CH3_CLIP_ACTIVE_EN);
}
}
/* inline function to set buffer addresses in case of Y/C non mux mode */ /* inline function to set buffer addresses in case of Y/C non mux mode */
static inline void ch2_set_videobuf_addr_yc_nmux(unsigned long top_strt_luma, static inline void ch2_set_videobuf_addr_yc_nmux(unsigned long top_strt_luma,
unsigned long btm_strt_luma, unsigned long btm_strt_luma,
......
...@@ -306,6 +306,8 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -306,6 +306,8 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count)
channel2_intr_assert(); channel2_intr_assert();
channel2_intr_enable(1); channel2_intr_enable(1);
enable_channel2(1); enable_channel2(1);
if (vpif_config_data->ch2_clip_en)
channel2_clipping_enable(1);
} }
if ((VPIF_CHANNEL3_VIDEO == ch->channel_id) if ((VPIF_CHANNEL3_VIDEO == ch->channel_id)
...@@ -313,6 +315,8 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count) ...@@ -313,6 +315,8 @@ static int vpif_start_streaming(struct vb2_queue *vq, unsigned int count)
channel3_intr_assert(); channel3_intr_assert();
channel3_intr_enable(1); channel3_intr_enable(1);
enable_channel3(1); enable_channel3(1);
if (vpif_config_data->ch3_clip_en)
channel3_clipping_enable(1);
} }
channel_first_int[VPIF_VIDEO_INDEX][ch->channel_id] = 1; channel_first_int[VPIF_VIDEO_INDEX][ch->channel_id] = 1;
...@@ -1140,6 +1144,8 @@ static int vpif_streamoff(struct file *file, void *priv, ...@@ -1140,6 +1144,8 @@ static int vpif_streamoff(struct file *file, void *priv,
struct vpif_fh *fh = priv; struct vpif_fh *fh = priv;
struct channel_obj *ch = fh->channel; struct channel_obj *ch = fh->channel;
struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX]; struct common_obj *common = &ch->common[VPIF_VIDEO_INDEX];
struct vpif_display_config *vpif_config_data =
vpif_dev->platform_data;
if (buftype != V4L2_BUF_TYPE_VIDEO_OUTPUT) { if (buftype != V4L2_BUF_TYPE_VIDEO_OUTPUT) {
vpif_err("buffer type not supported\n"); vpif_err("buffer type not supported\n");
...@@ -1159,11 +1165,15 @@ static int vpif_streamoff(struct file *file, void *priv, ...@@ -1159,11 +1165,15 @@ static int vpif_streamoff(struct file *file, void *priv,
if (buftype == V4L2_BUF_TYPE_VIDEO_OUTPUT) { if (buftype == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
/* disable channel */ /* disable channel */
if (VPIF_CHANNEL2_VIDEO == ch->channel_id) { if (VPIF_CHANNEL2_VIDEO == ch->channel_id) {
if (vpif_config_data->ch2_clip_en)
channel2_clipping_enable(0);
enable_channel2(0); enable_channel2(0);
channel2_intr_enable(0); channel2_intr_enable(0);
} }
if ((VPIF_CHANNEL3_VIDEO == ch->channel_id) || if ((VPIF_CHANNEL3_VIDEO == ch->channel_id) ||
(2 == common->started)) { (2 == common->started)) {
if (vpif_config_data->ch3_clip_en)
channel3_clipping_enable(0);
enable_channel3(0); enable_channel3(0);
channel3_intr_enable(0); channel3_intr_enable(0);
} }
......
...@@ -50,6 +50,8 @@ struct vpif_display_config { ...@@ -50,6 +50,8 @@ struct vpif_display_config {
const char **output; const char **output;
int output_count; int output_count;
const char *card_name; const char *card_name;
bool ch2_clip_en;
bool ch3_clip_en;
}; };
struct vpif_input { struct vpif_input {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment