Skip to content

Commit ac00b65

Browse files
committed
Merge tag 'media/v6.8-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
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"
2 parents 4a75714 + 346c84e commit ac00b65

File tree

14 files changed

+156
-68
lines changed

14 files changed

+156
-68
lines changed

drivers/media/platform/rockchip/rkisp1/rkisp1-capture.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,9 @@ irqreturn_t rkisp1_capture_isr(int irq, void *ctx)
725725
unsigned int i;
726726
u32 status;
727727

728+
if (!rkisp1->irqs_enabled)
729+
return IRQ_NONE;
730+
728731
status = rkisp1_read(rkisp1, RKISP1_CIF_MI_MIS);
729732
if (!status)
730733
return IRQ_NONE;

drivers/media/platform/rockchip/rkisp1/rkisp1-common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,7 @@ struct rkisp1_debug {
450450
* @debug: debug params to be exposed on debugfs
451451
* @info: version-specific ISP information
452452
* @irqs: IRQ line numbers
453+
* @irqs_enabled: the hardware is enabled and can cause interrupts
453454
*/
454455
struct rkisp1_device {
455456
void __iomem *base_addr;
@@ -471,6 +472,7 @@ struct rkisp1_device {
471472
struct rkisp1_debug debug;
472473
const struct rkisp1_info *info;
473474
int irqs[RKISP1_NUM_IRQS];
475+
bool irqs_enabled;
474476
};
475477

476478
/*

drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ irqreturn_t rkisp1_csi_isr(int irq, void *ctx)
196196
struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);
197197
u32 val, status;
198198

199+
if (!rkisp1->irqs_enabled)
200+
return IRQ_NONE;
201+
199202
status = rkisp1_read(rkisp1, RKISP1_CIF_MIPI_MIS);
200203
if (!status)
201204
return IRQ_NONE;

drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,24 @@ static int __maybe_unused rkisp1_runtime_suspend(struct device *dev)
305305
{
306306
struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);
307307

308+
rkisp1->irqs_enabled = false;
309+
/* Make sure the IRQ handler will see the above */
310+
mb();
311+
312+
/*
313+
* Wait until any running IRQ handler has returned. The IRQ handler
314+
* may get called even after this (as it's a shared interrupt line)
315+
* but the 'irqs_enabled' flag will make the handler return immediately.
316+
*/
317+
for (unsigned int il = 0; il < ARRAY_SIZE(rkisp1->irqs); ++il) {
318+
if (rkisp1->irqs[il] == -1)
319+
continue;
320+
321+
/* Skip if the irq line is the same as previous */
322+
if (il == 0 || rkisp1->irqs[il - 1] != rkisp1->irqs[il])
323+
synchronize_irq(rkisp1->irqs[il]);
324+
}
325+
308326
clk_bulk_disable_unprepare(rkisp1->clk_size, rkisp1->clks);
309327
return pinctrl_pm_select_sleep_state(dev);
310328
}
@@ -321,6 +339,10 @@ static int __maybe_unused rkisp1_runtime_resume(struct device *dev)
321339
if (ret)
322340
return ret;
323341

342+
rkisp1->irqs_enabled = true;
343+
/* Make sure the IRQ handler will see the above */
344+
mb();
345+
324346
return 0;
325347
}
326348

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

562-
ret = devm_request_irq(dev, irq, info->isrs[i].isr, 0,
584+
ret = devm_request_irq(dev, irq, info->isrs[i].isr, IRQF_SHARED,
563585
dev_driver_string(dev), dev);
564586
if (ret) {
565587
dev_err(dev, "request irq failed: %d\n", ret);

drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,9 @@ irqreturn_t rkisp1_isp_isr(int irq, void *ctx)
976976
struct rkisp1_device *rkisp1 = dev_get_drvdata(dev);
977977
u32 status, isp_err;
978978

979+
if (!rkisp1->irqs_enabled)
980+
return IRQ_NONE;
981+
979982
status = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
980983
if (!status)
981984
return IRQ_NONE;

drivers/media/rc/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ config IR_PWM_TX
319319
tristate "PWM IR transmitter"
320320
depends on LIRC
321321
depends on PWM
322+
depends on HIGH_RES_TIMERS
322323
depends on OF
323324
help
324325
Say Y if you want to use a PWM based IR transmitter. This is

drivers/media/rc/bpf-lirc.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ int lirc_prog_attach(const union bpf_attr *attr, struct bpf_prog *prog)
253253
if (attr->attach_flags)
254254
return -EINVAL;
255255

256-
rcdev = rc_dev_get_from_fd(attr->target_fd);
256+
rcdev = rc_dev_get_from_fd(attr->target_fd, true);
257257
if (IS_ERR(rcdev))
258258
return PTR_ERR(rcdev);
259259

@@ -278,7 +278,7 @@ int lirc_prog_detach(const union bpf_attr *attr)
278278
if (IS_ERR(prog))
279279
return PTR_ERR(prog);
280280

281-
rcdev = rc_dev_get_from_fd(attr->target_fd);
281+
rcdev = rc_dev_get_from_fd(attr->target_fd, true);
282282
if (IS_ERR(rcdev)) {
283283
bpf_prog_put(prog);
284284
return PTR_ERR(rcdev);
@@ -303,7 +303,7 @@ int lirc_prog_query(const union bpf_attr *attr, union bpf_attr __user *uattr)
303303
if (attr->query.query_flags)
304304
return -EINVAL;
305305

306-
rcdev = rc_dev_get_from_fd(attr->query.target_fd);
306+
rcdev = rc_dev_get_from_fd(attr->query.target_fd, false);
307307
if (IS_ERR(rcdev))
308308
return PTR_ERR(rcdev);
309309

drivers/media/rc/ir_toy.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,15 @@ static int irtoy_tx(struct rc_dev *rc, uint *txbuf, uint count)
332332
sizeof(COMMAND_SMODE_EXIT), STATE_COMMAND_NO_RESP);
333333
if (err) {
334334
dev_err(irtoy->dev, "exit sample mode: %d\n", err);
335+
kfree(buf);
335336
return err;
336337
}
337338

338339
err = irtoy_command(irtoy, COMMAND_SMODE_ENTER,
339340
sizeof(COMMAND_SMODE_ENTER), STATE_COMMAND);
340341
if (err) {
341342
dev_err(irtoy->dev, "enter sample mode: %d\n", err);
343+
kfree(buf);
342344
return err;
343345
}
344346

drivers/media/rc/lirc_dev.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ void __exit lirc_dev_exit(void)
814814
unregister_chrdev_region(lirc_base_dev, RC_DEV_MAX);
815815
}
816816

817-
struct rc_dev *rc_dev_get_from_fd(int fd)
817+
struct rc_dev *rc_dev_get_from_fd(int fd, bool write)
818818
{
819819
struct fd f = fdget(fd);
820820
struct lirc_fh *fh;
@@ -828,6 +828,9 @@ struct rc_dev *rc_dev_get_from_fd(int fd)
828828
return ERR_PTR(-EINVAL);
829829
}
830830

831+
if (write && !(f.file->f_mode & FMODE_WRITE))
832+
return ERR_PTR(-EPERM);
833+
831834
fh = f.file->private_data;
832835
dev = fh->rc;
833836

drivers/media/rc/rc-core-priv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ void lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev);
325325
void lirc_scancode_event(struct rc_dev *dev, struct lirc_scancode *lsc);
326326
int lirc_register(struct rc_dev *dev);
327327
void lirc_unregister(struct rc_dev *dev);
328-
struct rc_dev *rc_dev_get_from_fd(int fd);
328+
struct rc_dev *rc_dev_get_from_fd(int fd, bool write);
329329
#else
330330
static inline int lirc_dev_init(void) { return 0; }
331331
static inline void lirc_dev_exit(void) {}

0 commit comments

Comments
 (0)