| From 3ba90e002ab1e8a9263ce89c4c8cef5714b96176 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 7 Dec 2023 08:57:47 +0100 |
| Subject: media: rkisp1: Store IRQ lines |
| |
| From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> |
| |
| [ Upstream commit 0753874617de883c6d4da903142f334f76a75d70 ] |
| |
| 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-358a2c871a3c@ideasonboard.com |
| |
| Tested-by: Adam Ford <aford173@gmail.com> #imx8mp-beacon |
| Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../platform/rockchip/rkisp1/rkisp1-common.h | 11 ++++++++++- |
| .../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 a1293c45aae1..f9ec1c613894 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, |
| @@ -441,7 +449,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 |
| @@ -459,6 +466,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; |
| @@ -479,6 +487,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 8d990957ea21..aeb6bb63667e 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) { |
| -- |
| 2.43.0 |
| |