Skip to content

Commit

Permalink
media: sun8i-di: Fix coefficient writes
Browse files Browse the repository at this point in the history
[ Upstream commit 794b581f8c6eb7b60fe468ccb96dd3cd38ff779f ]

Currently coefficients are applied only once, since they don't change.
However, this is done before enable bit is set and thus it doesn't get
applied properly.

Fix that by applying coefficients after enable bit is set. While this
means that it will be done evey time, it doesn't bring much time
penalty.

Fixes: a4260ea ("media: sun4i: Add H3 deinterlace driver")
Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
jernejsk authored and Sasha Levin committed Mar 26, 2024
1 parent 850249e commit fdd9b1f
Showing 1 changed file with 21 additions and 21 deletions.
42 changes: 21 additions & 21 deletions drivers/media/platform/sunxi/sun8i-di/sun8i-di.c
Expand Up @@ -66,6 +66,7 @@ static void deinterlace_device_run(void *priv)
struct vb2_v4l2_buffer *src, *dst;
unsigned int hstep, vstep;
dma_addr_t addr;
int i;

src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx);
Expand Down Expand Up @@ -160,6 +161,26 @@ static void deinterlace_device_run(void *priv)
deinterlace_write(dev, DEINTERLACE_CH1_HORZ_FACT, hstep);
deinterlace_write(dev, DEINTERLACE_CH1_VERT_FACT, vstep);

/* neutral filter coefficients */
deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL,
DEINTERLACE_FRM_CTRL_COEF_ACCESS);
readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val,
val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40);

for (i = 0; i < 32; i++) {
deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4,
DEINTERLACE_IDENTITY_COEF);
}

deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL,
DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0);

deinterlace_clr_set_bits(dev, DEINTERLACE_FIELD_CTRL,
DEINTERLACE_FIELD_CTRL_FIELD_CNT_MSK,
DEINTERLACE_FIELD_CTRL_FIELD_CNT(ctx->field));
Expand Down Expand Up @@ -248,7 +269,6 @@ static irqreturn_t deinterlace_irq(int irq, void *data)
static void deinterlace_init(struct deinterlace_dev *dev)
{
u32 val;
int i;

deinterlace_write(dev, DEINTERLACE_BYPASS,
DEINTERLACE_BYPASS_CSC);
Expand Down Expand Up @@ -285,26 +305,6 @@ static void deinterlace_init(struct deinterlace_dev *dev)
deinterlace_clr_set_bits(dev, DEINTERLACE_CHROMA_DIFF,
DEINTERLACE_CHROMA_DIFF_TH_MSK,
DEINTERLACE_CHROMA_DIFF_TH(5));

/* neutral filter coefficients */
deinterlace_set_bits(dev, DEINTERLACE_FRM_CTRL,
DEINTERLACE_FRM_CTRL_COEF_ACCESS);
readl_poll_timeout(dev->base + DEINTERLACE_STATUS, val,
val & DEINTERLACE_STATUS_COEF_STATUS, 2, 40);

for (i = 0; i < 32; i++) {
deinterlace_write(dev, DEINTERLACE_CH0_HORZ_COEF0 + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH0_VERT_COEF + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH1_HORZ_COEF0 + i * 4,
DEINTERLACE_IDENTITY_COEF);
deinterlace_write(dev, DEINTERLACE_CH1_VERT_COEF + i * 4,
DEINTERLACE_IDENTITY_COEF);
}

deinterlace_clr_set_bits(dev, DEINTERLACE_FRM_CTRL,
DEINTERLACE_FRM_CTRL_COEF_ACCESS, 0);
}

static inline struct deinterlace_ctx *deinterlace_file2ctx(struct file *file)
Expand Down

0 comments on commit fdd9b1f

Please sign in to comment.