media: rockchip: isp1: fix receive mipi isr before isp clock resume

The mipi interrupt is auto on in resume operation,
so we may receive interrupt before isp clock resume,
and the kernel will be dead when access isp register in mipi isr function.

Change-Id: I73779111cb103457b0a4f125d8e4c9420a2d8553
Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
This commit is contained in:
Hu Kejun
2019-06-28 08:47:34 +08:00
committed by Tao Huang
parent 75591b28bd
commit 273b21ef08
2 changed files with 20 additions and 0 deletions

View File

@@ -998,6 +998,7 @@ static int rkisp1_plat_probe(struct platform_device *pdev)
return PTR_ERR(isp_dev->base_addr);
match_data = match->data;
isp_dev->mipi_irq = -1;
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ,
match_data->irqs[0].name);
if (res) {
@@ -1011,6 +1012,9 @@ static int rkisp1_plat_probe(struct platform_device *pdev)
return irq;
}
if (!strcmp(match_data->irqs[i].name, "mipi_irq"))
isp_dev->mipi_irq = irq;
ret = devm_request_irq(dev, irq,
match_data->irqs[i].irq_hdl,
IRQF_SHARED,
@@ -1022,6 +1026,9 @@ static int rkisp1_plat_probe(struct platform_device *pdev)
ret);
return ret;
}
if (isp_dev->mipi_irq == irq)
disable_irq(isp_dev->mipi_irq);
}
} else {
/* no irq names in dts */
@@ -1138,6 +1145,10 @@ static int __maybe_unused rkisp1_runtime_suspend(struct device *dev)
{
struct rkisp1_device *isp_dev = dev_get_drvdata(dev);
if (isp_dev->isp_ver == ISP_V12 || isp_dev->isp_ver == ISP_V13) {
if (isp_dev->mipi_irq >= 0)
disable_irq(isp_dev->mipi_irq);
}
rkisp1_disable_sys_clk(isp_dev);
return pinctrl_pm_select_sleep_state(dev);
}
@@ -1152,6 +1163,14 @@ static int __maybe_unused rkisp1_runtime_resume(struct device *dev)
return ret;
rkisp1_enable_sys_clk(isp_dev);
if (isp_dev->isp_ver == ISP_V12 || isp_dev->isp_ver == ISP_V13) {
writel(0, isp_dev->base_addr + CIF_ISP_CSI0_MASK1);
writel(0, isp_dev->base_addr + CIF_ISP_CSI0_MASK2);
writel(0, isp_dev->base_addr + CIF_ISP_CSI0_MASK3);
if (isp_dev->mipi_irq >= 0)
enable_irq(isp_dev->mipi_irq);
}
return 0;
}

View File

@@ -159,6 +159,7 @@ struct rkisp1_device {
unsigned int emd_vc;
unsigned int emd_dt;
int vs_irq;
int mipi_irq;
struct gpio_desc *vs_irq_gpio;
struct v4l2_subdev *hdr_sensor;
enum rkisp1_isp_state isp_state;