Commit ac00b654 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull media fixes from Mauro Carvalho Chehab:

 - regression fix for rkisp1 shared IRQ logic

 - fix atomisp breakage due to a kAPI change

 - permission fix for remote controller BPF support

 - memleak fix in ir_toy driver

 - Kconfig dependency fix for pwm-ir-rx

* tag 'media/v6.8-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  media: pwm-ir-tx: Depend on CONFIG_HIGH_RES_TIMERS
  media: ir_toy: fix a memleak in irtoy_tx
  media: rc: bpf attach/detach requires write permission
  media: atomisp: Adjust for v4l2_subdev_state handling changes in 6.8
  media: rkisp1: Fix IRQ handling due to shared interrupts
  media: Revert "media: rkisp1: Drop IRQF_SHARED"
parents 4a757148 346c84e2
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -725,6 +725,9 @@ irqreturn_t rkisp1_capture_isr(int irq, void *ctx)
	unsigned int i;
	u32 status;

	if (!rkisp1->irqs_enabled)
		return IRQ_NONE;

	status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS);
	if (!status)
		return IRQ_NONE;
+2 −0
Original line number Diff line number Diff line
@@ -450,6 +450,7 @@ struct rkisp1_debug {
 * @debug:	   debug params to be exposed on debugfs
 * @info:	   version-specific ISP information
 * @irqs:          IRQ line numbers
 * @irqs_enabled:  the hardware is enabled and can cause interrupts
 */
struct rkisp1_device {
	void __iomem *base_addr;
@@ -471,6 +472,7 @@ struct rkisp1_device {
	struct rkisp1_debug debug;
	const struct rkisp1_info *info;
	int irqs[RKISP1_NUM_IRQS];
	bool irqs_enabled;
};

/*
+3 −0
Original line number Diff line number Diff line
@@ -196,6 +196,9 @@ irqreturn_t rkisp1_csi_isr(int irq, void *ctx)
	struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);
	u32 val, status;

	if (!rkisp1->irqs_enabled)
		return IRQ_NONE;

	status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS);
	if (!status)
		return IRQ_NONE;
+23 −1
Original line number Diff line number Diff line
@@ -305,6 +305,24 @@ static int __maybe_unused rkisp1_runtime_suspend(struct device *dev)
{
	struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);

	rkisp1->irqs_enabled = false;
	/* Make sure the IRQ handler will see the above */
	mb();

	/*
	 * Wait until any running IRQ handler has returned. The IRQ handler
	 * may get called even after this (as it's a shared interrupt line)
	 * but the 'irqs_enabled' flag will make the handler return immediately.
	 */
	for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) {
		if (rkisp1->irqs[il] == -1)
			continue;

		/* Skip if the irq line is the same as previous */
		if (il == 0 || rkisp1->irqs[il - 1] != rkisp1->irqs[il])
			synchronize_irq(rkisp1->irqs[il]);
	}

	clk_bulk_disable_unprepare(rkisp1->clk_size, rkisp1->clks);
	return pinctrl_pm_select_sleep_state(dev);
}
@@ -321,6 +339,10 @@ static int __maybe_unused rkisp1_runtime_resume(struct device *dev)
	if (ret)
		return ret;

	rkisp1->irqs_enabled = true;
	/* Make sure the IRQ handler will see the above */
	mb();

	return 0;
}

@@ -559,7 +581,7 @@ static int rkisp1_probe(struct platform_device *pdev)
				rkisp1->irqs[il] = irq;
		}

		ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
		ret = devm_request_irq(dev, irq, info->isrs[i].isr, IRQF_SHARED,
				       dev_driver_string(dev), dev);
		if (ret) {
			dev_err(dev, "request irq failed: %d\n", ret);
+3 −0
Original line number Diff line number Diff line
@@ -976,6 +976,9 @@ irqreturn_t rkisp1_isp_isr(int irq, void *ctx)
	struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);
	u32 status, isp_err;

	if (!rkisp1->irqs_enabled)
		return IRQ_NONE;

	status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
	if (!status)
		return IRQ_NONE;
Loading