[PATCH] i2c: spacemit: request IRQ after controller initialization
Alex Elder
elder at riscstar.com
Wed Jul 22 05:20:01 PDT 2026
On 7/22/26 4:43 AM, Linmao Li wrote:
> spacemit_i2c_probe() requests the IRQ before it enables the clocks, resets
> the controller and runs init_completion(). If an interrupt is already
> pending, the handler runs too early: it reads registers while the clocks
> are still off and calls complete() on an uninitialized completion. Request
> the IRQ after the controller and completion are initialized, but still
> before the adapter is registered.
>
> Fixes: 5ea558473fa3 ("i2c: spacemit: add support for SpacemiT K1 SoC")
> Signed-off-by: Linmao Li <lilinmao at kylinos.cn>
This looks correct.
Reviewed-by: Alex Elder <elder at riscstar.com>
> ---
> drivers/i2c/busses/i2c-k1.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-k1.c b/drivers/i2c/busses/i2c-k1.c
> index 51a0c3d80fc9..3fe716cc153d 100644
> --- a/drivers/i2c/busses/i2c-k1.c
> +++ b/drivers/i2c/busses/i2c-k1.c
> @@ -723,11 +723,6 @@ static int spacemit_i2c_probe(struct platform_device *pdev)
> if (i2c->irq < 0)
> return dev_err_probe(dev, i2c->irq, "failed to get irq resource");
>
> - ret = devm_request_irq(i2c->dev, i2c->irq, spacemit_i2c_irq_handler,
> - IRQF_NO_SUSPEND, dev_name(i2c->dev), i2c);
> - if (ret)
> - return dev_err_probe(dev, ret, "failed to request irq");
> -
> clk = devm_clk_get_enabled(dev, "func");
> if (IS_ERR(clk))
> return dev_err_probe(dev, PTR_ERR(clk), "failed to enable func clock");
> @@ -755,6 +750,11 @@ static int spacemit_i2c_probe(struct platform_device *pdev)
>
> init_completion(&i2c->complete);
>
> + ret = devm_request_irq(i2c->dev, i2c->irq, spacemit_i2c_irq_handler,
> + IRQF_NO_SUSPEND, dev_name(i2c->dev), i2c);
> + if (ret)
> + return dev_err_probe(dev, ret, "failed to request irq");
> +
> platform_set_drvdata(pdev, i2c);
>
> ret = i2c_add_numbered_adapter(&i2c->adapt);
More information about the linux-riscv
mailing list