mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 21:07:02 +09:00
vdin: config vdin mif/afbc path directly [1/1]
PD#SWPL-6277 Problem: switch hdmi port maybe display green screen Solution: 1.optimize vdin stop sequence, reduce afbc state polling interval, and rest afbc to get a clean state 2.change vdin mif/afbc patch directly, not rdma method, for vdin0/1 rdma are independent Verify: x301 Change-Id: I0ddf5d27dcfc0fd930eeb681f876c4c5e92e8d70 Signed-off-by: Evoke Zhang <evoke.zhang@amlogic.com>
This commit is contained in:
@@ -360,6 +360,7 @@ void vdin_afbce_cma_release(struct vdin_dev_s *devp)
|
|||||||
devp->cma_mem_alloc = 0;
|
devp->cma_mem_alloc = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*can not use RDMA, because vdin0/1 both use the register */
|
||||||
void vdin_write_mif_or_afbce(struct vdin_dev_s *devp,
|
void vdin_write_mif_or_afbce(struct vdin_dev_s *devp,
|
||||||
enum vdin_output_mif_e sel)
|
enum vdin_output_mif_e sel)
|
||||||
{
|
{
|
||||||
@@ -367,37 +368,37 @@ void vdin_write_mif_or_afbce(struct vdin_dev_s *devp,
|
|||||||
|
|
||||||
if (offset == 0) {
|
if (offset == 0) {
|
||||||
if (sel == VDIN_OUTPUT_TO_MIF) {
|
if (sel == VDIN_OUTPUT_TO_MIF) {
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN0_MIF_ENABLE_BIT, 1);
|
1, VDIN0_MIF_ENABLE_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN0_OUT_MIF_BIT, 1);
|
1, VDIN0_OUT_MIF_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
0, VDIN0_OUT_AFBCE_BIT, 1);
|
0, VDIN0_OUT_AFBCE_BIT, 1);
|
||||||
} else if (sel == VDIN_OUTPUT_TO_AFBCE) {
|
} else if (sel == VDIN_OUTPUT_TO_AFBCE) {
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN0_MIF_ENABLE_BIT, 1);
|
1, VDIN0_MIF_ENABLE_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
0, VDIN0_OUT_MIF_BIT, 1);
|
0, VDIN0_OUT_MIF_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN0_OUT_AFBCE_BIT, 1);
|
1, VDIN0_OUT_AFBCE_BIT, 1);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (sel == VDIN_OUTPUT_TO_MIF) {
|
if (sel == VDIN_OUTPUT_TO_MIF) {
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN1_MIF_ENABLE_BIT, 1);
|
1, VDIN1_MIF_ENABLE_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN1_OUT_MIF_BIT, 1);
|
1, VDIN1_OUT_MIF_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
0, VDIN1_OUT_AFBCE_BIT, 1);
|
0, VDIN1_OUT_AFBCE_BIT, 1);
|
||||||
} else if (sel == VDIN_OUTPUT_TO_AFBCE) {
|
} else if (sel == VDIN_OUTPUT_TO_AFBCE) {
|
||||||
/*sel vdin1 afbce: not support in sw now,
|
/*sel vdin1 afbce: not support in sw now,
|
||||||
*just reserved interface
|
*just reserved interface
|
||||||
*/
|
*/
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN1_MIF_ENABLE_BIT, 1);
|
1, VDIN1_MIF_ENABLE_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
0, VDIN1_OUT_MIF_BIT, 1);
|
0, VDIN1_OUT_MIF_BIT, 1);
|
||||||
rdma_write_reg_bits(devp->rdma_handle, VDIN_MISC_CTRL,
|
W_VCBUS_BIT(VDIN_MISC_CTRL,
|
||||||
1, VDIN1_OUT_AFBCE_BIT, 1);
|
1, VDIN1_OUT_AFBCE_BIT, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -692,3 +693,10 @@ void vdin_afbce_hw_enable(struct vdin_dev_s *devp)
|
|||||||
//enable afbce
|
//enable afbce
|
||||||
rdma_write_reg_bits(devp->rdma_handle, AFBCE_ENABLE, 1, 8, 1);
|
rdma_write_reg_bits(devp->rdma_handle, AFBCE_ENABLE, 1, 8, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vdin_afbce_soft_reset(void)
|
||||||
|
{
|
||||||
|
W_VCBUS_BIT(AFBCE_MODE, 0, 30, 1);
|
||||||
|
W_VCBUS_BIT(AFBCE_MODE, 1, 30, 1);
|
||||||
|
W_VCBUS_BIT(AFBCE_MODE, 0, 30, 1);
|
||||||
|
}
|
||||||
|
|||||||
@@ -312,5 +312,6 @@ extern void vdin_afbce_clear_writedown_flag(struct vdin_dev_s *devp);
|
|||||||
extern int vdin_afbce_read_writedown_flag(void);
|
extern int vdin_afbce_read_writedown_flag(void);
|
||||||
extern void vdin_afbce_hw_disable(void);
|
extern void vdin_afbce_hw_disable(void);
|
||||||
extern void vdin_afbce_hw_enable(struct vdin_dev_s *devp);
|
extern void vdin_afbce_hw_enable(struct vdin_dev_s *devp);
|
||||||
|
extern void vdin_afbce_soft_reset(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ static struct vdin_dev_s *vdin_devp[VDIN_MAX_DEVS];
|
|||||||
static unsigned long mem_start, mem_end;
|
static unsigned long mem_start, mem_end;
|
||||||
static unsigned int use_reserved_mem;
|
static unsigned int use_reserved_mem;
|
||||||
static int afbc_init_flag[VDIN_MAX_DEVS];
|
static int afbc_init_flag[VDIN_MAX_DEVS];
|
||||||
static int afbc_write_down_flag[VDIN_MAX_DEVS];
|
|
||||||
static unsigned int pr_times;
|
static unsigned int pr_times;
|
||||||
unsigned int tl1_vdin1_preview_flag;
|
unsigned int tl1_vdin1_preview_flag;
|
||||||
static unsigned int tl1_vdin1_data_readied;
|
static unsigned int tl1_vdin1_data_readied;
|
||||||
@@ -107,8 +106,8 @@ static int tl1_vdin1_preview_ready_flag;
|
|||||||
static unsigned int vdin_afbc_force_drop_frame = 1;
|
static unsigned int vdin_afbc_force_drop_frame = 1;
|
||||||
static struct vf_entry *vfe_drop_force;
|
static struct vf_entry *vfe_drop_force;
|
||||||
|
|
||||||
unsigned int vdin_afbc_preview_force_drop_frame_cnt = 1;
|
unsigned int vdin_afbc_preview_force_drop_frame_cnt;
|
||||||
unsigned int vdin_afbc_force_drop_frame_cnt = 2;
|
unsigned int vdin_afbc_force_drop_frame_cnt;
|
||||||
unsigned int max_ignore_frame_cnt = 2;
|
unsigned int max_ignore_frame_cnt = 2;
|
||||||
unsigned int skip_frame_debug;
|
unsigned int skip_frame_debug;
|
||||||
|
|
||||||
@@ -553,7 +552,6 @@ void vdin_start_dec(struct vdin_dev_s *devp)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
afbc_write_down_flag[devp->index] = 0;
|
|
||||||
/* h_active/v_active will be used by bellow calling */
|
/* h_active/v_active will be used by bellow calling */
|
||||||
if (devp->afbce_mode == 0) {
|
if (devp->afbce_mode == 0) {
|
||||||
if (canvas_config_mode == 1)
|
if (canvas_config_mode == 1)
|
||||||
@@ -703,7 +701,8 @@ void vdin_start_dec(struct vdin_dev_s *devp)
|
|||||||
*/
|
*/
|
||||||
void vdin_stop_dec(struct vdin_dev_s *devp)
|
void vdin_stop_dec(struct vdin_dev_s *devp)
|
||||||
{
|
{
|
||||||
int afbc_write_down_test_times = 7;
|
int afbc_write_down_timeout = 500; /* 50ms to cover a 24Hz vsync */
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
/* avoid null pointer oops */
|
/* avoid null pointer oops */
|
||||||
if (!devp || !devp->frontend)
|
if (!devp || !devp->frontend)
|
||||||
@@ -714,16 +713,19 @@ void vdin_stop_dec(struct vdin_dev_s *devp)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
disable_irq_nosync(devp->irq);
|
disable_irq_nosync(devp->irq);
|
||||||
afbc_init_flag[devp->index] = 0;
|
afbc_init_flag[devp->index] = 0;
|
||||||
|
|
||||||
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
||||||
while (++afbc_write_down_flag[devp->index] <
|
while (i++ < afbc_write_down_timeout) {
|
||||||
afbc_write_down_test_times) {
|
if (vdin_afbce_read_writedown_flag())
|
||||||
if (vdin_afbce_read_writedown_flag() == 0)
|
|
||||||
usleep_range(5000, 5001);
|
|
||||||
else
|
|
||||||
break;
|
break;
|
||||||
|
usleep_range(100, 105);
|
||||||
|
}
|
||||||
|
if (i >= afbc_write_down_timeout) {
|
||||||
|
pr_info("vdin.%d afbc write done timeout\n",
|
||||||
|
devp->index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is_meson_tl1_cpu() && (tl1_vdin1_preview_flag == 1)) {
|
if (is_meson_tl1_cpu() && (tl1_vdin1_preview_flag == 1)) {
|
||||||
@@ -757,8 +759,10 @@ void vdin_stop_dec(struct vdin_dev_s *devp)
|
|||||||
vf_unreg_provider(&devp->vprov);
|
vf_unreg_provider(&devp->vprov);
|
||||||
devp->dv.dv_config = 0;
|
devp->dv.dv_config = 0;
|
||||||
|
|
||||||
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1))
|
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
||||||
vdin_afbce_hw_disable();
|
vdin_afbce_hw_disable();
|
||||||
|
vdin_afbce_soft_reset();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
|
#ifdef CONFIG_AMLOGIC_MEDIA_ENHANCEMENT_DOLBYVISION
|
||||||
vdin_dolby_addr_release(devp, devp->vfp->size);
|
vdin_dolby_addr_release(devp, devp->vfp->size);
|
||||||
@@ -1435,17 +1439,16 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
|
|||||||
|
|
||||||
offset = devp->addr_offset;
|
offset = devp->addr_offset;
|
||||||
|
|
||||||
if (afbc_init_flag[devp->index] == 0) {
|
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
||||||
afbc_init_flag[devp->index] = 1;
|
if (afbc_init_flag[devp->index] == 0) {
|
||||||
/*set mem power on*/
|
afbc_init_flag[devp->index] = 1;
|
||||||
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
/*set mem power on*/
|
||||||
vdin_afbce_hw_enable(devp);
|
vdin_afbce_hw_enable(devp);
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
} else if (afbc_init_flag[devp->index] == 1) {
|
||||||
} else if (afbc_init_flag[devp->index] == 1) {
|
afbc_init_flag[devp->index] = 2;
|
||||||
afbc_init_flag[devp->index] = 2;
|
|
||||||
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1))
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isr_log(devp->vfp);
|
isr_log(devp->vfp);
|
||||||
@@ -1457,8 +1460,13 @@ irqreturn_t vdin_isr(int irq, void *dev_id)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
spin_lock_irqsave(&devp->isr_lock, flags);
|
spin_lock_irqsave(&devp->isr_lock, flags);
|
||||||
/* W_VCBUS_BIT(VDIN_MISC_CTRL, 0, 0, 2); */
|
if (is_meson_tl1_cpu() && (devp->afbce_mode == 1)) {
|
||||||
devp->vdin_reset_flag = vdin_vsync_reset_mif(devp->index);
|
/* no need reset mif under afbc mode */
|
||||||
|
devp->vdin_reset_flag = 0;
|
||||||
|
} else {
|
||||||
|
/* W_VCBUS_BIT(VDIN_MISC_CTRL, 0, 0, 2); */
|
||||||
|
devp->vdin_reset_flag = vdin_vsync_reset_mif(devp->index);
|
||||||
|
}
|
||||||
if ((devp->flags & VDIN_FLAG_DEC_STOP_ISR) &&
|
if ((devp->flags & VDIN_FLAG_DEC_STOP_ISR) &&
|
||||||
(!(isr_flag & VDIN_BYPASS_STOP_CHECK))) {
|
(!(isr_flag & VDIN_BYPASS_STOP_CHECK))) {
|
||||||
vdin_hw_disable(offset);
|
vdin_hw_disable(offset);
|
||||||
|
|||||||
Reference in New Issue
Block a user