The receive interrupt is requested masked early in probe and enabled further down, once the glink instance has been stored in the transport. Now that the version command is no longer sent from qcom_glink_native_probe(), nothing needs to happen between those two points.
Request the interrupt where it used to be enabled, and drop IRQF_NO_AUTOEN along with the enable_irq() call. The RPM error path becomes a set of labels, the way SMEM already unwinds. Signed-off-by: Chunkai Deng <[email protected]> Assisted-by: Claude:claude-opus-5 --- drivers/rpmsg/qcom_glink_rpm.c | 34 ++++++++++++++++++---------------- drivers/rpmsg/qcom_glink_smem.c | 19 +++++++++---------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/drivers/rpmsg/qcom_glink_rpm.c b/drivers/rpmsg/qcom_glink_rpm.c index 34f18c3e58c8..a85d78f8283e 100644 --- a/drivers/rpmsg/qcom_glink_rpm.c +++ b/drivers/rpmsg/qcom_glink_rpm.c @@ -316,15 +316,6 @@ static int glink_rpm_probe(struct platform_device *pdev) if (ret) return ret; - rpm->irq = of_irq_get(dev->of_node, 0); - ret = devm_request_irq(dev, rpm->irq, qcom_glink_rpm_intr, - IRQF_NO_SUSPEND | IRQF_NO_AUTOEN, - "glink-rpm", rpm); - if (ret) { - dev_err(dev, "failed to request IRQ\n"); - return ret; - } - rpm->mbox_client.dev = dev; rpm->mbox_client.knows_txdone = true; rpm->mbox_chan = mbox_request_channel(&rpm->mbox_client, 0); @@ -356,17 +347,28 @@ static int glink_rpm_probe(struct platform_device *pdev) platform_set_drvdata(pdev, rpm); - enable_irq(rpm->irq); - - ret = qcom_glink_native_start(glink); + rpm->irq = of_irq_get(dev->of_node, 0); + ret = devm_request_irq(dev, rpm->irq, qcom_glink_rpm_intr, + IRQF_NO_SUSPEND, "glink-rpm", rpm); if (ret) { - disable_irq(rpm->irq); - qcom_glink_native_remove(glink); - mbox_free_channel(rpm->mbox_chan); - return ret; + dev_err(dev, "failed to request IRQ\n"); + goto err_glink_remove; } + ret = qcom_glink_native_start(glink); + if (ret) + goto err_disable_irq; + return 0; + +err_disable_irq: + disable_irq(rpm->irq); + +err_glink_remove: + qcom_glink_native_remove(glink); + mbox_free_channel(rpm->mbox_chan); + + return ret; } static void glink_rpm_remove(struct platform_device *pdev) diff --git a/drivers/rpmsg/qcom_glink_smem.c b/drivers/rpmsg/qcom_glink_smem.c index 28f6cfda6352..2d6fa2d3a99b 100644 --- a/drivers/rpmsg/qcom_glink_smem.c +++ b/drivers/rpmsg/qcom_glink_smem.c @@ -304,15 +304,6 @@ struct qcom_glink_smem *qcom_glink_smem_register(struct device *parent, goto err_put_dev; } - smem->irq = of_irq_get(smem->dev.of_node, 0); - ret = devm_request_irq(&smem->dev, smem->irq, qcom_glink_smem_intr, - IRQF_NO_SUSPEND | IRQF_NO_AUTOEN, - "glink-smem", smem); - if (ret) { - dev_err(&smem->dev, "failed to request IRQ\n"); - goto err_put_dev; - } - smem->mbox_client.dev = &smem->dev; smem->mbox_client.knows_txdone = true; smem->mbox_chan = mbox_request_channel(&smem->mbox_client, 0); @@ -346,7 +337,13 @@ struct qcom_glink_smem *qcom_glink_smem_register(struct device *parent, smem->glink = glink; - enable_irq(smem->irq); + smem->irq = of_irq_get(smem->dev.of_node, 0); + ret = devm_request_irq(&smem->dev, smem->irq, qcom_glink_smem_intr, + IRQF_NO_SUSPEND, "glink-smem", smem); + if (ret) { + dev_err(&smem->dev, "failed to request IRQ\n"); + goto err_glink_remove; + } ret = qcom_glink_native_start(glink); if (ret) @@ -356,6 +353,8 @@ struct qcom_glink_smem *qcom_glink_smem_register(struct device *parent, err_disable_irq: disable_irq(smem->irq); + +err_glink_remove: qcom_glink_native_remove(glink); err_free_mbox: -- 2.43.0

