From: David Cohen Date: Fri, 30 Dec 2011 20:43:30 +0000 (+0200) Subject: [PORT FROM R2] atomisp: do not restart ISP from ISR when next stage is accel fw X-Git-Tag: 2.1b_release~1579 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ee3cd46d686c0af9bf6ce23e74f49866875efaa9;p=kernel%2Fkernel-mfld-blackbay.git [PORT FROM R2] atomisp: do not restart ISP from ISR when next stage is accel fw BZ: 20531 Accel fw always do memory (de)allocation when starting. For such reason, accel stages cannot be started from atomic context. Change-Id: Ifefb7fe6a076bb9f62430a50f8bbd80dadf2f308 Orig-Change-Id: Ibd982ea9e90363f0f9b816c57157d9b5e1ec525a Signed-off-by: David Cohen Reviewed-on: http://android.intel.com:8080/30237 Reviewed-by: Wang, Wen W Reviewed-by: Koski, Anttu Reviewed-by: Von Oerthel, Jurgen Tested-by: Koski, Anttu Reviewed-by: buildbot Tested-by: buildbot Reviewed-on: http://android.intel.com:8080/32443 Reviewed-by: Lampila, KalleX Tested-by: Lampila, KalleX --- diff --git a/drivers/media/video/atomisp/atomisp_cmd.c b/drivers/media/video/atomisp/atomisp_cmd.c index 8e153ca..d335a1c 100644 --- a/drivers/media/video/atomisp/atomisp_cmd.c +++ b/drivers/media/video/atomisp/atomisp_cmd.c @@ -321,7 +321,9 @@ irqreturn_t atomisp_isr(int irq, void *dev) /* We're fine to proceed in atomic context */ if (irq_infos & SH_CSS_IRQ_INFO_START_NEXT_STAGE) { - sh_css_start_next_stage(); + if (sh_css_next_stage_is_acc() || + sh_css_start_next_stage()) + goto no_frame_done; irq_infos &= ~SH_CSS_IRQ_INFO_START_NEXT_STAGE; } diff --git a/drivers/media/video/atomisp/css/sh_css.c b/drivers/media/video/atomisp/css/sh_css.c index 6de9c31..547b321 100644 --- a/drivers/media/video/atomisp/css/sh_css.c +++ b/drivers/media/video/atomisp/css/sh_css.c @@ -1440,6 +1440,27 @@ sh_css_terminate_firmware(void) #endif } +bool +sh_css_next_stage_is_acc(void) +{ + struct sh_css_pipeline_stage *stage; + struct sh_css_pipeline *pipeline; + + if (my_css.mode == sh_css_mode_preview) + pipeline = &my_css.preview_settings.pipeline; + else if (my_css.mode == sh_css_mode_video) + pipeline = &my_css.video_settings.pipeline; + else + pipeline = &my_css.capture_settings.pipeline; + + if (pipeline->current_stage) + stage = pipeline->current_stage->next; + else + stage = pipeline->stages; + + return stage != NULL ? !!stage->firmware : false; +} + static enum sh_css_err sh_css_pipeline_start_next_stage(struct sh_css_pipeline *me) { diff --git a/drivers/media/video/atomisp/css/sh_css.h b/drivers/media/video/atomisp/css/sh_css.h index 490c8df..468ea65 100644 --- a/drivers/media/video/atomisp/css/sh_css.h +++ b/drivers/media/video/atomisp/css/sh_css.h @@ -85,6 +85,9 @@ sh_css_rx_clear_interrupt_info(unsigned int irq_infos); void sh_css_terminate_firmware(void); +bool +sh_css_next_stage_is_acc(void); + enum sh_css_err sh_css_start_next_stage(void);