summaryrefslogtreecommitdiff
authorChuanzhi Wang <chuanzhi.wang@amlogic.com>2020-04-29 04:28:34 (GMT)
committer chuanzhi wang <chuanzhi.wang@amlogic.com>2020-05-13 03:05:04 (GMT)
commit67822bbf852d004a2eb78e7b295fff383179a6f2 (patch)
tree691b852d58a208300b5b21530284ba01ed16537f
parent4358db7bc9706611c4a1e043d89a2ffce290e98c (diff)
downloadmedia_modules-67822bbf852d004a2eb78e7b295fff383179a6f2.zip
media_modules-67822bbf852d004a2eb78e7b295fff383179a6f2.tar.gz
media_modules-67822bbf852d004a2eb78e7b295fff383179a6f2.tar.bz2
dvb: Reset the pcr register after reset dmx. [1/1]
PD#SWPL-24760 Problem: pcr value is equal to 0 after reset demux. Solution: Reset the pcr register after reset dmx. Verify: U215 Signed-off-by: Chuanzhi Wang <chuanzhi.wang@amlogic.com> Change-Id: Iaaa11af7e18c14f9ad9c64e2551df0140febce75
Diffstat
-rw-r--r--drivers/stream_input/parser/hw_demux/aml_dmx.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/stream_input/parser/hw_demux/aml_dmx.c b/drivers/stream_input/parser/hw_demux/aml_dmx.c
index 2be1515..787111e 100644
--- a/drivers/stream_input/parser/hw_demux/aml_dmx.c
+++ b/drivers/stream_input/parser/hw_demux/aml_dmx.c
@@ -476,6 +476,7 @@ static int asyncfifo_buf_len = ASYNCFIFO_BUFFER_SIZE_DEFAULT;
#define asyncfifo_get_dev(afifo) ((afifo)->dvb->dev)
+
/*Section buffer watchdog*/
static void section_buffer_watchdog_func(unsigned long arg)
{
@@ -3910,12 +3911,17 @@ void dmx_reset_hw(struct aml_dvb *dvb)
void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq)
{
int id, times;
+ u32 pcr_num[DMX_DEV_COUNT];
+ u32 pcr_reg[DMX_DEV_COUNT];
pr_dbg("[dmx_kpi] demux reset begin\n");
for (id = 0; id < DMX_DEV_COUNT; id++) {
if (!dvb->dmx[id].init)
continue;
+ pcr_reg[id] = DMX_READ_REG(id, PCR90K_CTL);
+ pcr_num[id] = DMX_READ_REG(id, ASSIGN_PID_NUMBER);
+ pr_dbg("reset demux, pcr_regs[%d]:0x%x, pcr_num[%d]:0x%x\n", id, pcr_reg[id], id, pcr_num[id]);
if (reset_irq) {
if (dvb->dmx[id].dmx_irq != -1)
disable_irq(dvb->dmx[id].dmx_irq);
@@ -4094,6 +4100,8 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq)
dmx->timeout.ch_disable,
dmx->timeout.match,
1);
+ DMX_WRITE_REG(id, ASSIGN_PID_NUMBER, pcr_num[id]);
+ DMX_WRITE_REG(id, PCR90K_CTL, pcr_reg[id]);
}
for (id = 0; id < DSC_DEV_COUNT; id++) {
@@ -4132,6 +4140,15 @@ void dmx_reset_hw_ex(struct aml_dvb *dvb, int reset_irq)
void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx,
int reset_irq)
{
+ u32 pcr_num = 0;
+ u32 pcr_regs = 0;
+ {
+ if (!dmx->init)
+ return;
+ pcr_regs = DMX_READ_REG(dmx->id, PCR90K_CTL);
+ pcr_num = DMX_READ_REG(dmx->id, ASSIGN_PID_NUMBER);
+ pr_dbg("reset demux, pcr_regs:0x%x, pcr_num:0x%x\n", pcr_regs, pcr_num);
+ }
{
if (!dmx->init)
return;
@@ -4347,6 +4364,10 @@ void dmx_reset_dmx_hw_ex_unlock(struct aml_dvb *dvb, struct aml_dmx *dmx,
dvb->dmx_watchdog_disable[dmx->id] = 0;
}
#endif
+ {
+ DMX_WRITE_REG(dmx->id, ASSIGN_PID_NUMBER, pcr_num);
+ DMX_WRITE_REG(dmx->id, PCR90K_CTL, pcr_regs);
+ }
}
void dmx_reset_dmx_id_hw_ex_unlock(struct aml_dvb *dvb, int id, int reset_irq)