[PATCH dev-5.0 4/4] media: aspeed: clear interrupt status flags immediately
Eddie James
eajames at linux.ibm.com
Tue Apr 30 08:29:59 AEST 2019
On 4/25/19 5:20 PM, Jae Hyun Yoo wrote:
> Interrupt status flags should be cleared immediately otherwise
> interrupt handler will be called again and again until the flag
> is cleared, but this driver clears some flags through a 500ms
> delayed work which is a bad idea in interrupt handling, so this
> commit makes the interrupt handler clear the status flags
> immediately.
>
> Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo at linux.intel.com>
> ---
> drivers/media/platform/aspeed-video.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c
> index 77c209a472ca..e218f375b9f5 100644
> --- a/drivers/media/platform/aspeed-video.c
> +++ b/drivers/media/platform/aspeed-video.c
> @@ -546,17 +546,18 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg)
> * re-initialize
> */
> if (sts & VE_INTERRUPT_MODE_DETECT_WD) {
> + aspeed_video_write(video, VE_INTERRUPT_STATUS,
> + VE_INTERRUPT_MODE_DETECT_WD);
aspeed_video_irq_res_change disables all IRQs and turns off the clocks.
This shouldn't be necessary.
The rest looks fine.
Thanks,
Eddie
> aspeed_video_irq_res_change(video);
> return IRQ_HANDLED;
> }
>
> if (sts & VE_INTERRUPT_MODE_DETECT) {
> + aspeed_video_write(video, VE_INTERRUPT_STATUS,
> + VE_INTERRUPT_MODE_DETECT);
> if (test_bit(VIDEO_RES_DETECT, &video->flags)) {
> aspeed_video_update(video, VE_INTERRUPT_CTRL,
> VE_INTERRUPT_MODE_DETECT, 0);
> - aspeed_video_write(video, VE_INTERRUPT_STATUS,
> - VE_INTERRUPT_MODE_DETECT);
> -
> set_bit(VIDEO_MODE_DETECT_DONE, &video->flags);
> wake_up_interruptible_all(&video->wait);
> } else {
> @@ -574,6 +575,9 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg)
> u32 frame_size = aspeed_video_read(video,
> VE_OFFSET_COMP_STREAM);
>
> + aspeed_video_write(video, VE_INTERRUPT_STATUS,
> + VE_INTERRUPT_COMP_COMPLETE);
> +
> spin_lock(&video->lock);
> clear_bit(VIDEO_FRAME_INPRG, &video->flags);
> buf = list_first_entry_or_null(&video->buffers,
> @@ -599,8 +603,6 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg)
> VE_SEQ_CTRL_TRIG_COMP, 0);
> aspeed_video_update(video, VE_INTERRUPT_CTRL,
> VE_INTERRUPT_COMP_COMPLETE, 0);
> - aspeed_video_write(video, VE_INTERRUPT_STATUS,
> - VE_INTERRUPT_COMP_COMPLETE);
>
> if (test_bit(VIDEO_STREAMING, &video->flags) && buf)
> aspeed_video_start_frame(video);
More information about the openbmc
mailing list