]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: hantro: make irq names configurable
authorPhilipp Zabel <p.zabel@pengutronix.de>
Wed, 12 Jun 2019 09:39:09 +0000 (05:39 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 12 Jun 2019 14:39:18 +0000 (10:39 -0400)
The i.MX8MQ bindings will use different IRQ names ("g1" instead of
"vdpu", and "g2"), so make them configurable. This also allows to
register more than two IRQs, which will be required for i.MX8MM support
later (it will add "h1" instead of "vepu").

Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/staging/media/hantro/hantro.h
drivers/staging/media/hantro/hantro_drv.c
drivers/staging/media/hantro/rk3288_vpu_hw.c
drivers/staging/media/hantro/rk3399_vpu_hw.c

index 296b9ffad5474b6938229f39ffc53788e148947e..d041d36a0805767cad519709226ac4feb1201e4e 100644 (file)
@@ -44,6 +44,17 @@ struct hantro_codec_ops;
 #define HANTRO_MPEG2_DECODER   BIT(16)
 #define HANTRO_DECODERS                0xffff0000
 
+/**
+ * struct hantro_irq - irq handler and name
+ *
+ * @name:                      irq name for device tree lookup
+ * @handler:                   interrupt handler
+ */
+struct hantro_irq {
+       const char *name;
+       irqreturn_t (*handler)(int irq, void *priv);
+};
+
 /**
  * struct hantro_variant - information about VPU hardware variant
  *
@@ -57,8 +68,8 @@ struct hantro_codec_ops;
  * @codec_ops:                 Codec ops.
  * @init:                      Initialize hardware.
  * @runtime_resume:            reenable hardware after power gating
- * @vepu_irq:                  encoder interrupt handler
- * @vdpu_irq:                  decoder interrupt handler
+ * @irqs:                      array of irq names and interrupt handlers
+ * @num_irqs:                  number of irqs in the array
  * @clk_names:                 array of clock names
  * @num_clocks:                        number of clocks in the array
  */
@@ -73,8 +84,8 @@ struct hantro_variant {
        const struct hantro_codec_ops *codec_ops;
        int (*init)(struct hantro_dev *vpu);
        int (*runtime_resume)(struct hantro_dev *vpu);
-       irqreturn_t (*vepu_irq)(int irq, void *priv);
-       irqreturn_t (*vdpu_irq)(int irq, void *priv);
+       const struct hantro_irq *irqs;
+       int num_irqs;
        const char *clk_names[HANTRO_MAX_CLOCKS];
        int num_clocks;
 };
index ed10052dc1c85b90ff03ed6f97fcbd28c575cbc9..4ed39728da3d4433c923409e6bc5415eabe6b275 100644 (file)
@@ -706,36 +706,25 @@ static int hantro_probe(struct platform_device *pdev)
                return ret;
        }
 
-       if (vpu->variant->vdpu_irq) {
+       for (i = 0; i < vpu->variant->num_irqs; i++) {
+               const char *irq_name = vpu->variant->irqs[i].name;
                int irq;
 
-               irq = platform_get_irq_byname(vpu->pdev, "vdpu");
-               if (irq <= 0) {
-                       dev_err(vpu->dev, "Could not get vdpu IRQ.\n");
-                       return -ENXIO;
-               }
-
-               ret = devm_request_irq(vpu->dev, irq, vpu->variant->vdpu_irq,
-                                      0, dev_name(vpu->dev), vpu);
-               if (ret) {
-                       dev_err(vpu->dev, "Could not request vdpu IRQ.\n");
-                       return ret;
-               }
-       }
-
-       if (vpu->variant->vepu_irq) {
-               int irq;
+               if (!vpu->variant->irqs[i].handler)
+                       continue;
 
-               irq = platform_get_irq_byname(vpu->pdev, "vepu");
+               irq = platform_get_irq_byname(vpu->pdev, irq_name);
                if (irq <= 0) {
-                       dev_err(vpu->dev, "Could not get vepu IRQ.\n");
+                       dev_err(vpu->dev, "Could not get %s IRQ.\n", irq_name);
                        return -ENXIO;
                }
 
-               ret = devm_request_irq(vpu->dev, irq, vpu->variant->vepu_irq,
-                                      0, dev_name(vpu->dev), vpu);
+               ret = devm_request_irq(vpu->dev, irq,
+                                      vpu->variant->irqs[i].handler, 0,
+                                      dev_name(vpu->dev), vpu);
                if (ret) {
-                       dev_err(vpu->dev, "Could not request vepu IRQ.\n");
+                       dev_err(vpu->dev, "Could not request %s IRQ.\n",
+                               irq_name);
                        return ret;
                }
        }
index f0d3f0eec07b83ac2647e084bdc53f15fc600979..c5473bc1ac295c91ad6844c680f006897beeca38 100644 (file)
@@ -161,6 +161,11 @@ static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = {
  * VPU variant.
  */
 
+static const struct hantro_irq rk3288_irqs[] = {
+       { "vepu", rk3288_vepu_irq },
+       { "vdpu", rk3288_vdpu_irq },
+};
+
 const struct hantro_variant rk3288_vpu_variant = {
        .enc_offset = 0x0,
        .enc_fmts = rk3288_vpu_enc_fmts,
@@ -170,8 +175,8 @@ const struct hantro_variant rk3288_vpu_variant = {
        .num_dec_fmts = ARRAY_SIZE(rk3288_vpu_dec_fmts),
        .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER,
        .codec_ops = rk3288_vpu_codec_ops,
-       .vepu_irq = rk3288_vepu_irq,
-       .vdpu_irq = rk3288_vdpu_irq,
+       .irqs = rk3288_irqs,
+       .num_irqs = ARRAY_SIZE(rk3288_irqs),
        .init = rk3288_vpu_hw_init,
        .clk_names = {"aclk", "hclk"},
        .num_clocks = 2
index 0a43e07771893febb2ab87a6c1799db7aa8a6403..965030e21ea9b1e3baf23ebafc05255ad6a4390c 100644 (file)
@@ -160,6 +160,11 @@ static const struct hantro_codec_ops rk3399_vpu_codec_ops[] = {
  * VPU variant.
  */
 
+static const struct hantro_irq rk3399_irqs[] = {
+       { "vepu", rk3399_vepu_irq },
+       { "vdpu", rk3399_vdpu_irq },
+};
+
 const struct hantro_variant rk3399_vpu_variant = {
        .enc_offset = 0x0,
        .enc_fmts = rk3399_vpu_enc_fmts,
@@ -169,8 +174,8 @@ const struct hantro_variant rk3399_vpu_variant = {
        .num_dec_fmts = ARRAY_SIZE(rk3399_vpu_dec_fmts),
        .codec = HANTRO_JPEG_ENCODER | HANTRO_MPEG2_DECODER,
        .codec_ops = rk3399_vpu_codec_ops,
-       .vepu_irq = rk3399_vepu_irq,
-       .vdpu_irq = rk3399_vdpu_irq,
+       .irqs = rk3399_irqs,
+       .num_irqs = ARRAY_SIZE(rk3399_irqs),
        .init = rk3399_vpu_hw_init,
        .clk_names = {"aclk", "hclk"},
        .num_clocks = 2