forked from Minki/linux
[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: Manjunath Hadli <manjunath.hadli@ti.com> Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
2401dd25c7
commit
6964b10363
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user