This is an automatic generated email to let you know that the following patch 
were queued:

Subject: media: rkisp1: Store IRQ lines
Author:  Tomi Valkeinen <tomi.valkei...@ideasonboard.com>
Date:    Thu Dec 7 08:57:47 2023 +0100

Store the IRQ lines used by the driver for easy access. These are needed
in future patches which fix IRQ race issues.

Link: 
https://lore.kernel.org/r/20231207-rkisp-irq-fix-v3-3-358a2c871...@ideasonboard.com

Tested-by: Adam Ford <aford...@gmail.com>  #imx8mp-beacon
Signed-off-by: Tomi Valkeinen <tomi.valkei...@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mche...@kernel.org>

 drivers/media/platform/rockchip/rkisp1/rkisp1-common.h | 11 ++++++++++-
 drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c    | 17 +++++++++++++----
 2 files changed, 23 insertions(+), 5 deletions(-)

---

diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h 
b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
index 1e7cea1bea5e..2d7f06281c39 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-common.h
@@ -61,6 +61,14 @@ struct dentry;
                                                 RKISP1_CIF_ISP_EXP_END |       
\
                                                 
RKISP1_CIF_ISP_HIST_MEASURE_RDY)
 
+/* IRQ lines */
+enum rkisp1_irq_line {
+       RKISP1_IRQ_ISP = 0,
+       RKISP1_IRQ_MI,
+       RKISP1_IRQ_MIPI,
+       RKISP1_NUM_IRQS,
+};
+
 /* enum for the resizer pads */
 enum rkisp1_rsz_pad {
        RKISP1_RSZ_PAD_SINK,
@@ -423,7 +431,6 @@ struct rkisp1_debug {
  * struct rkisp1_device - ISP platform device
  *
  * @base_addr:    base register address
- * @irq:          the irq number
  * @dev:          a pointer to the struct device
  * @clk_size:     number of clocks
  * @clks:         array of clocks
@@ -441,6 +448,7 @@ struct rkisp1_debug {
  * @stream_lock:   serializes {start/stop}_streaming callbacks between the 
capture devices.
  * @debug:        debug params to be exposed on debugfs
  * @info:         version-specific ISP information
+ * @irqs:          IRQ line numbers
  */
 struct rkisp1_device {
        void __iomem *base_addr;
@@ -461,6 +469,7 @@ struct rkisp1_device {
        struct mutex stream_lock; /* serialize {start/stop}_streaming cb 
between capture devices */
        struct rkisp1_debug debug;
        const struct rkisp1_info *info;
+       int irqs[RKISP1_NUM_IRQS];
 };
 
 /*
diff --git a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c 
b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
index 7b8a361d4c4a..f96f821a7b50 100644
--- a/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
+++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c
@@ -114,6 +114,7 @@
 struct rkisp1_isr_data {
        const char *name;
        irqreturn_t (*isr)(int irq, void *ctx);
+       u32 line_mask;
 };
 
 /* ----------------------------------------------------------------------------
@@ -471,9 +472,9 @@ static const char * const px30_isp_clks[] = {
 };
 
 static const struct rkisp1_isr_data px30_isp_isrs[] = {
-       { "isp", rkisp1_isp_isr },
-       { "mi", rkisp1_capture_isr },
-       { "mipi", rkisp1_csi_isr },
+       { "isp", rkisp1_isp_isr, BIT(RKISP1_IRQ_ISP) },
+       { "mi", rkisp1_capture_isr, BIT(RKISP1_IRQ_MI) },
+       { "mipi", rkisp1_csi_isr, BIT(RKISP1_IRQ_MIPI) },
 };
 
 static const struct rkisp1_info px30_isp_info = {
@@ -492,7 +493,7 @@ static const char * const rk3399_isp_clks[] = {
 };
 
 static const struct rkisp1_isr_data rk3399_isp_isrs[] = {
-       { NULL, rkisp1_isr },
+       { NULL, rkisp1_isr, BIT(RKISP1_IRQ_ISP) | BIT(RKISP1_IRQ_MI) | 
BIT(RKISP1_IRQ_MIPI) },
 };
 
 static const struct rkisp1_info rk3399_isp_info = {
@@ -543,6 +544,9 @@ static int rkisp1_probe(struct platform_device *pdev)
        if (IS_ERR(rkisp1->base_addr))
                return PTR_ERR(rkisp1->base_addr);
 
+       for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il)
+               rkisp1->irqs[il] = -1;
+
        for (i = 0; i < info->isr_size; i++) {
                irq = info->isrs[i].name
                    ? platform_get_irq_byname(pdev, info->isrs[i].name)
@@ -550,6 +554,11 @@ static int rkisp1_probe(struct platform_device *pdev)
                if (irq < 0)
                        return irq;
 
+               for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) {
+                       if (info->isrs[i].line_mask & BIT(il))
+                               rkisp1->irqs[il] = irq;
+               }
+
                ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
                                       dev_driver_string(dev), dev);
                if (ret) {

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to