Message ID | 20200512120522.25960-2-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: staging: rkisp1: change workqueue to threaded irq in stats | expand |
Hi Dafna, I love your patch! Yet something to improve: [auto build test ERROR on linuxtv-media/master] [also build test ERROR on v5.7-rc5 next-20200512] [cannot apply to staging/staging-testing] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982] url: https://github.com/0day-ci/linux/commits/Dafna-Hirschfeld/media-staging-rkisp1-change-workqueue-to-threaded-irq-in-stats/20200512-200942 base: git://linuxtv.org/media_tree.git master config: nios2-allyesconfig (attached as .config) compiler: nios2-linux-gcc (GCC) 9.3.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day GCC_VERSION=9.3.0 make.cross ARCH=nios2 If you fix the issue, kindly add following tag as appropriate Reported-by: kbuild test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): In file included from drivers/staging/media/rkisp1/rkisp1-capture.c:21: >> drivers/staging/media/rkisp1/rkisp1-common.h:308:1: error: unknown type name 'irqreturn_t' 308 | irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:309:1: error: unknown type name 'irqreturn_t' 309 | irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:310:1: error: unknown type name 'irqreturn_t' 310 | irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ >> drivers/staging/media/rkisp1/rkisp1-capture.c:652:1: error: unknown type name 'irqreturn_t' 652 | irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1) | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-capture.c: In function 'rkisp1_capture_isr': >> drivers/staging/media/rkisp1/rkisp1-capture.c:659:10: error: 'IRQ_NONE' undeclared (first use in this function) 659 | return IRQ_NONE; | ^~~~~~~~ drivers/staging/media/rkisp1/rkisp1-capture.c:659:10: note: each undeclared identifier is reported only once for each function it appears in >> drivers/staging/media/rkisp1/rkisp1-capture.c:689:9: error: 'IRQ_HANDLED' undeclared (first use in this function) 689 | return IRQ_HANDLED; | ^~~~~~~~~~~ >> drivers/staging/media/rkisp1/rkisp1-capture.c:690:1: warning: control reaches end of non-void function [-Wreturn-type] 690 | } | ^ -- In file included from drivers/staging/media/rkisp1/rkisp1-common.c:10: >> drivers/staging/media/rkisp1/rkisp1-common.h:308:1: error: unknown type name 'irqreturn_t' 308 | irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:309:1: error: unknown type name 'irqreturn_t' 309 | irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:310:1: error: unknown type name 'irqreturn_t' 310 | irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ -- In file included from drivers/staging/media/rkisp1/rkisp1-isp.c:19: >> drivers/staging/media/rkisp1/rkisp1-common.h:308:1: error: unknown type name 'irqreturn_t' 308 | irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:309:1: error: unknown type name 'irqreturn_t' 309 | irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-common.h:310:1: error: unknown type name 'irqreturn_t' 310 | irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); | ^~~~~~~~~~~ >> drivers/staging/media/rkisp1/rkisp1-isp.c:1049:1: error: unknown type name 'irqreturn_t' 1049 | irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1) | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c: In function 'rkisp1_mipi_isr': >> drivers/staging/media/rkisp1/rkisp1-isp.c:1055:10: error: 'IRQ_NONE' undeclared (first use in this function) 1055 | return IRQ_NONE; | ^~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c:1055:10: note: each undeclared identifier is reported only once for each function it appears in >> drivers/staging/media/rkisp1/rkisp1-isp.c:1091:9: error: 'IRQ_HANDLED' undeclared (first use in this function) 1091 | return IRQ_HANDLED; | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c: At top level: drivers/staging/media/rkisp1/rkisp1-isp.c:1111:1: error: unknown type name 'irqreturn_t' 1111 | irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1) | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c: In function 'rkisp1_isp_isr': drivers/staging/media/rkisp1/rkisp1-isp.c:1117:10: error: 'IRQ_NONE' undeclared (first use in this function) 1117 | return IRQ_NONE; | ^~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c:1154:9: error: 'IRQ_HANDLED' undeclared (first use in this function) 1154 | return IRQ_HANDLED; | ^~~~~~~~~~~ drivers/staging/media/rkisp1/rkisp1-isp.c: In function 'rkisp1_mipi_isr': >> drivers/staging/media/rkisp1/rkisp1-isp.c:1092:1: warning: control reaches end of non-void function [-Wreturn-type] 1092 | } | ^ drivers/staging/media/rkisp1/rkisp1-isp.c: In function 'rkisp1_isp_isr': drivers/staging/media/rkisp1/rkisp1-isp.c:1155:1: warning: control reaches end of non-void function [-Wreturn-type] 1155 | } | ^ vim +/irqreturn_t +308 drivers/staging/media/rkisp1/rkisp1-common.h 307 > 308 irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); 309 irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); 310 irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); 311 void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); 312 void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis); 313 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dafna, Thanks for the patch. On 5/12/20 9:05 AM, Dafna Hirschfeld wrote: > From: Helen Koike <helen.koike@collabora.com> > > rkisp1 shares the interrupt line, then it shouldn't always return > IRQ_HANDLED, otherwise it can flag as handled an interrupt that wans't > meant for ISP. > > return IRQ_NONE when the interrupt wans't meant for ISP > > Fixes: d65dd85281fb ("media: staging: rkisp1: add Rockchip ISP1 base driver") > > Signed-off-by: Helen Koike <helen.koike@collabora.com> > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > --- > drivers/staging/media/rkisp1/rkisp1-capture.c | 7 ++++++- > drivers/staging/media/rkisp1/rkisp1-common.h | 6 +++--- > drivers/staging/media/rkisp1/rkisp1-dev.c | 14 ++++++++++---- > drivers/staging/media/rkisp1/rkisp1-isp.c | 12 ++++++++---- > 4 files changed, 27 insertions(+), 12 deletions(-) > > diff --git a/drivers/staging/media/rkisp1/rkisp1-capture.c b/drivers/staging/media/rkisp1/rkisp1-capture.c > index f69235f82c45..19021875e8a9 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-capture.c > +++ b/drivers/staging/media/rkisp1/rkisp1-capture.c > @@ -649,12 +649,15 @@ static void rkisp1_handle_buffer(struct rkisp1_capture *cap) > rkisp1_set_next_buf(cap); > } > > -void rkisp1_capture_isr(struct rkisp1_device *rkisp1) > +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1) > { > unsigned int i; > u32 status; > > status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS); > + if (!status) > + return IRQ_NONE; > + > rkisp1_write(rkisp1, status, RKISP1_CIF_MI_ICR); > > for (i = 0; i < ARRAY_SIZE(rkisp1->capture_devs); ++i) { > @@ -682,6 +685,8 @@ void rkisp1_capture_isr(struct rkisp1_device *rkisp1) > cap->is_streaming = false; > wake_up(&cap->done); > } > + > + return IRQ_HANDLED; > } > > /* ---------------------------------------------------------------------------- > diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h > index 0c4fe503adc9..33dffe21c769 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-common.h > +++ b/drivers/staging/media/rkisp1/rkisp1-common.h > @@ -305,9 +305,9 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); > > const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code); > > -void rkisp1_isp_isr(struct rkisp1_device *rkisp1); > -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1); > -void rkisp1_capture_isr(struct rkisp1_device *rkisp1); > +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); > +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); > +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); > void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); > void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis); > > diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c > index 9ac38bafb839..b7f43dab71c8 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-dev.c > +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c > @@ -387,10 +387,13 @@ static int rkisp1_entities_register(struct rkisp1_device *rkisp1) > return ret; > } > > -static irqreturn_t rkisp1_isr(int irq, void *ctx) > +irqreturn_t rkisp1_isr(int irq, void *ctx) > { > struct device *dev = ctx; > struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); > + irqreturn_t isp_ret; > + irqreturn_t cap_ret; > + irqreturn_t mipi_ret; Just cosmetics, you could declare them in a single line irqreturn_t cap_ret, isp_ret, mipi_ret; With or without this change: Acked-by: Helen Koike <helen.koike@collabora.com> Thanks Helen > > /* > * Call rkisp1_capture_isr() first to handle the frame that > @@ -398,9 +401,12 @@ static irqreturn_t rkisp1_isr(int irq, void *ctx) > * it is potentially incremented by rkisp1_isp_isr() in the vertical > * sync. > */ > - rkisp1_capture_isr(rkisp1); > - rkisp1_isp_isr(rkisp1); > - rkisp1_mipi_isr(rkisp1); > + cap_ret = rkisp1_capture_isr(rkisp1); > + isp_ret = rkisp1_isp_isr(rkisp1); > + mipi_ret = rkisp1_mipi_isr(rkisp1); > + > + if (isp_ret == IRQ_NONE && cap_ret == IRQ_NONE && mipi_ret == IRQ_NONE) > + return IRQ_NONE; > > return IRQ_HANDLED; > } > diff --git a/drivers/staging/media/rkisp1/rkisp1-isp.c b/drivers/staging/media/rkisp1/rkisp1-isp.c > index dc2b59a0160a..19ab0ed323aa 100644 > --- a/drivers/staging/media/rkisp1/rkisp1-isp.c > +++ b/drivers/staging/media/rkisp1/rkisp1-isp.c > @@ -1046,13 +1046,13 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1) > * Interrupt handlers > */ > > -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > { > u32 val, status; > > status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS); > if (!status) > - return; > + return IRQ_NONE; > > rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR); > > @@ -1087,6 +1087,8 @@ void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > } else { > rkisp1->debug.mipi_error++; > } > + > + return IRQ_HANDLED; > } > > static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) > @@ -1106,13 +1108,13 @@ static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) > v4l2_event_queue(isp->sd.devnode, &event); > } > > -void rkisp1_isp_isr(struct rkisp1_device *rkisp1) > +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1) > { > u32 status, isp_err; > > status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS); > if (!status) > - return; > + return IRQ_NONE; > > rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR); > > @@ -1148,4 +1150,6 @@ void rkisp1_isp_isr(struct rkisp1_device *rkisp1) > * Do the updates in the order of the processing flow. > */ > rkisp1_params_isr(rkisp1, status); > + > + return IRQ_HANDLED; > } >
Hi Dafna, Thank you for the patch. On Wed, May 20, 2020 at 07:58:41AM -0300, Helen Koike wrote: > On 5/12/20 9:05 AM, Dafna Hirschfeld wrote: > > From: Helen Koike <helen.koike@collabora.com> > > > > rkisp1 shares the interrupt line, then it shouldn't always return > > IRQ_HANDLED, otherwise it can flag as handled an interrupt that wans't > > meant for ISP. > > > > return IRQ_NONE when the interrupt wans't meant for ISP > > > > Fixes: d65dd85281fb ("media: staging: rkisp1: add Rockchip ISP1 base driver") > > > > Signed-off-by: Helen Koike <helen.koike@collabora.com> > > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > > --- > > drivers/staging/media/rkisp1/rkisp1-capture.c | 7 ++++++- > > drivers/staging/media/rkisp1/rkisp1-common.h | 6 +++--- > > drivers/staging/media/rkisp1/rkisp1-dev.c | 14 ++++++++++---- > > drivers/staging/media/rkisp1/rkisp1-isp.c | 12 ++++++++---- > > 4 files changed, 27 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/staging/media/rkisp1/rkisp1-capture.c b/drivers/staging/media/rkisp1/rkisp1-capture.c > > index f69235f82c45..19021875e8a9 100644 > > --- a/drivers/staging/media/rkisp1/rkisp1-capture.c > > +++ b/drivers/staging/media/rkisp1/rkisp1-capture.c > > @@ -649,12 +649,15 @@ static void rkisp1_handle_buffer(struct rkisp1_capture *cap) > > rkisp1_set_next_buf(cap); > > } > > > > -void rkisp1_capture_isr(struct rkisp1_device *rkisp1) > > +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1) > > { > > unsigned int i; > > u32 status; > > > > status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS); > > + if (!status) > > + return IRQ_NONE; > > + > > rkisp1_write(rkisp1, status, RKISP1_CIF_MI_ICR); > > > > for (i = 0; i < ARRAY_SIZE(rkisp1->capture_devs); ++i) { > > @@ -682,6 +685,8 @@ void rkisp1_capture_isr(struct rkisp1_device *rkisp1) > > cap->is_streaming = false; > > wake_up(&cap->done); > > } > > + > > + return IRQ_HANDLED; > > } > > > > /* ---------------------------------------------------------------------------- > > diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h > > index 0c4fe503adc9..33dffe21c769 100644 > > --- a/drivers/staging/media/rkisp1/rkisp1-common.h > > +++ b/drivers/staging/media/rkisp1/rkisp1-common.h > > @@ -305,9 +305,9 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); > > > > const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code); > > > > -void rkisp1_isp_isr(struct rkisp1_device *rkisp1); > > -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1); > > -void rkisp1_capture_isr(struct rkisp1_device *rkisp1); > > +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); > > +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); > > +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); > > void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); > > void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis); > > > > diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c > > index 9ac38bafb839..b7f43dab71c8 100644 > > --- a/drivers/staging/media/rkisp1/rkisp1-dev.c > > +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c > > @@ -387,10 +387,13 @@ static int rkisp1_entities_register(struct rkisp1_device *rkisp1) > > return ret; > > } > > > > -static irqreturn_t rkisp1_isr(int irq, void *ctx) > > +irqreturn_t rkisp1_isr(int irq, void *ctx) > > { > > struct device *dev = ctx; > > struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); > > + irqreturn_t isp_ret; > > + irqreturn_t cap_ret; > > + irqreturn_t mipi_ret; > > Just cosmetics, you could declare them in a single line > > irqreturn_t cap_ret, isp_ret, mipi_ret; > > With or without this change: > > Acked-by: Helen Koike <helen.koike@collabora.com> > > > > > /* > > * Call rkisp1_capture_isr() first to handle the frame that > > @@ -398,9 +401,12 @@ static irqreturn_t rkisp1_isr(int irq, void *ctx) > > * it is potentially incremented by rkisp1_isp_isr() in the vertical > > * sync. > > */ > > - rkisp1_capture_isr(rkisp1); > > - rkisp1_isp_isr(rkisp1); > > - rkisp1_mipi_isr(rkisp1); > > + cap_ret = rkisp1_capture_isr(rkisp1); > > + isp_ret = rkisp1_isp_isr(rkisp1); > > + mipi_ret = rkisp1_mipi_isr(rkisp1); > > + > > + if (isp_ret == IRQ_NONE && cap_ret == IRQ_NONE && mipi_ret == IRQ_NONE) > > + return IRQ_NONE; Another cosmetic change proposal: irqreturn_t ret = IRQ_NONE; ... if (rkisp1_capture_isr(rkisp1) == IRQ_HANDLED) ret = IRQ_HANDLED; if (rkisp1_isp_isr(rkisp1) == IRQ_HANDLED) ret = IRQ_HANDLED; if (rkisp1_mipi_isr(rkisp1) == IRQ_HANDLED) ret = IRQ_HANDLED; return ret; With or without it, Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > > > > return IRQ_HANDLED; > > } > > diff --git a/drivers/staging/media/rkisp1/rkisp1-isp.c b/drivers/staging/media/rkisp1/rkisp1-isp.c > > index dc2b59a0160a..19ab0ed323aa 100644 > > --- a/drivers/staging/media/rkisp1/rkisp1-isp.c > > +++ b/drivers/staging/media/rkisp1/rkisp1-isp.c > > @@ -1046,13 +1046,13 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1) > > * Interrupt handlers > > */ > > > > -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > > +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > > { > > u32 val, status; > > > > status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS); > > if (!status) > > - return; > > + return IRQ_NONE; > > > > rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR); > > > > @@ -1087,6 +1087,8 @@ void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) > > } else { > > rkisp1->debug.mipi_error++; > > } > > + > > + return IRQ_HANDLED; > > } > > > > static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) > > @@ -1106,13 +1108,13 @@ static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) > > v4l2_event_queue(isp->sd.devnode, &event); > > } > > > > -void rkisp1_isp_isr(struct rkisp1_device *rkisp1) > > +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1) > > { > > u32 status, isp_err; > > > > status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS); > > if (!status) > > - return; > > + return IRQ_NONE; > > > > rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR); > > > > @@ -1148,4 +1150,6 @@ void rkisp1_isp_isr(struct rkisp1_device *rkisp1) > > * Do the updates in the order of the processing flow. > > */ > > rkisp1_params_isr(rkisp1, status); > > + > > + return IRQ_HANDLED; > > } > >
diff --git a/drivers/staging/media/rkisp1/rkisp1-capture.c b/drivers/staging/media/rkisp1/rkisp1-capture.c index f69235f82c45..19021875e8a9 100644 --- a/drivers/staging/media/rkisp1/rkisp1-capture.c +++ b/drivers/staging/media/rkisp1/rkisp1-capture.c @@ -649,12 +649,15 @@ static void rkisp1_handle_buffer(struct rkisp1_capture *cap) rkisp1_set_next_buf(cap); } -void rkisp1_capture_isr(struct rkisp1_device *rkisp1) +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1) { unsigned int i; u32 status; status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS); + if (!status) + return IRQ_NONE; + rkisp1_write(rkisp1, status, RKISP1_CIF_MI_ICR); for (i = 0; i < ARRAY_SIZE(rkisp1->capture_devs); ++i) { @@ -682,6 +685,8 @@ void rkisp1_capture_isr(struct rkisp1_device *rkisp1) cap->is_streaming = false; wake_up(&cap->done); } + + return IRQ_HANDLED; } /* ---------------------------------------------------------------------------- diff --git a/drivers/staging/media/rkisp1/rkisp1-common.h b/drivers/staging/media/rkisp1/rkisp1-common.h index 0c4fe503adc9..33dffe21c769 100644 --- a/drivers/staging/media/rkisp1/rkisp1-common.h +++ b/drivers/staging/media/rkisp1/rkisp1-common.h @@ -305,9 +305,9 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1); const struct rkisp1_isp_mbus_info *rkisp1_isp_mbus_info_get(u32 mbus_code); -void rkisp1_isp_isr(struct rkisp1_device *rkisp1); -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1); -void rkisp1_capture_isr(struct rkisp1_device *rkisp1); +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1); +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1); +irqreturn_t rkisp1_capture_isr(struct rkisp1_device *rkisp1); void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris); void rkisp1_params_isr(struct rkisp1_device *rkisp1, u32 isp_mis); diff --git a/drivers/staging/media/rkisp1/rkisp1-dev.c b/drivers/staging/media/rkisp1/rkisp1-dev.c index 9ac38bafb839..b7f43dab71c8 100644 --- a/drivers/staging/media/rkisp1/rkisp1-dev.c +++ b/drivers/staging/media/rkisp1/rkisp1-dev.c @@ -387,10 +387,13 @@ static int rkisp1_entities_register(struct rkisp1_device *rkisp1) return ret; } -static irqreturn_t rkisp1_isr(int irq, void *ctx) +irqreturn_t rkisp1_isr(int irq, void *ctx) { struct device *dev = ctx; struct rkisp1_device *rkisp1 = dev_get_drvdata(dev); + irqreturn_t isp_ret; + irqreturn_t cap_ret; + irqreturn_t mipi_ret; /* * Call rkisp1_capture_isr() first to handle the frame that @@ -398,9 +401,12 @@ static irqreturn_t rkisp1_isr(int irq, void *ctx) * it is potentially incremented by rkisp1_isp_isr() in the vertical * sync. */ - rkisp1_capture_isr(rkisp1); - rkisp1_isp_isr(rkisp1); - rkisp1_mipi_isr(rkisp1); + cap_ret = rkisp1_capture_isr(rkisp1); + isp_ret = rkisp1_isp_isr(rkisp1); + mipi_ret = rkisp1_mipi_isr(rkisp1); + + if (isp_ret == IRQ_NONE && cap_ret == IRQ_NONE && mipi_ret == IRQ_NONE) + return IRQ_NONE; return IRQ_HANDLED; } diff --git a/drivers/staging/media/rkisp1/rkisp1-isp.c b/drivers/staging/media/rkisp1/rkisp1-isp.c index dc2b59a0160a..19ab0ed323aa 100644 --- a/drivers/staging/media/rkisp1/rkisp1-isp.c +++ b/drivers/staging/media/rkisp1/rkisp1-isp.c @@ -1046,13 +1046,13 @@ void rkisp1_isp_unregister(struct rkisp1_device *rkisp1) * Interrupt handlers */ -void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) +irqreturn_t rkisp1_mipi_isr(struct rkisp1_device *rkisp1) { u32 val, status; status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS); if (!status) - return; + return IRQ_NONE; rkisp1_write(rkisp1, status, RKISP1_CIF_MIPI_ICR); @@ -1087,6 +1087,8 @@ void rkisp1_mipi_isr(struct rkisp1_device *rkisp1) } else { rkisp1->debug.mipi_error++; } + + return IRQ_HANDLED; } static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) @@ -1106,13 +1108,13 @@ static void rkisp1_isp_queue_event_sof(struct rkisp1_isp *isp) v4l2_event_queue(isp->sd.devnode, &event); } -void rkisp1_isp_isr(struct rkisp1_device *rkisp1) +irqreturn_t rkisp1_isp_isr(struct rkisp1_device *rkisp1) { u32 status, isp_err; status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS); if (!status) - return; + return IRQ_NONE; rkisp1_write(rkisp1, status, RKISP1_CIF_ISP_ICR); @@ -1148,4 +1150,6 @@ void rkisp1_isp_isr(struct rkisp1_device *rkisp1) * Do the updates in the order of the processing flow. */ rkisp1_params_isr(rkisp1, status); + + return IRQ_HANDLED; }