diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c index 6d36d2ff2bac537acefdd50eebbf8c72e933b5f0..28d90fec9aea6a7a0ec598f91f277cd010c0a98b 100644 --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c @@ -264,6 +264,7 @@ static void cedrus_h265_pred_weight_write(struct cedrus_dev *dev, static void cedrus_h265_skip_bits(struct cedrus_dev *dev, int num) { int count = 0; + u32 reg; while (count < num) { int tmp = min(num - count, 32); @@ -271,8 +272,11 @@ static void cedrus_h265_skip_bits(struct cedrus_dev *dev, int num) cedrus_write(dev, VE_DEC_H265_TRIGGER, VE_DEC_H265_TRIGGER_FLUSH_BITS | VE_DEC_H265_TRIGGER_TYPE_N_BITS(tmp)); - while (cedrus_read(dev, VE_DEC_H265_STATUS) & VE_DEC_H265_STATUS_VLD_BUSY) - udelay(1); + + if (read_poll_timeout(cedrus_read, reg, + !(reg & VE_DEC_H265_STATUS_VLD_BUSY), + 1, 1000, false, dev, VE_DEC_H265_STATUS)) + dev_err_ratelimited(dev->dev, "timed out waiting to skip bits\n"); count += tmp; }