drm/bridge: lt9611uxc: fix the race in the error path
[platform/kernel/linux-starfive.git] / drivers / gpu / drm / bridge / lontium-lt9611uxc.c
index 22c84d2..6f33bb0 100644 (file)
@@ -929,9 +929,9 @@ retry:
        init_waitqueue_head(&lt9611uxc->wq);
        INIT_WORK(&lt9611uxc->work, lt9611uxc_hpd_work);
 
-       ret = devm_request_threaded_irq(dev, client->irq, NULL,
-                                       lt9611uxc_irq_thread_handler,
-                                       IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
+       ret = request_threaded_irq(client->irq, NULL,
+                                  lt9611uxc_irq_thread_handler,
+                                  IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
        if (ret) {
                dev_err(dev, "failed to request irq\n");
                goto err_disable_regulators;
@@ -967,6 +967,8 @@ retry:
        return lt9611uxc_audio_init(dev, lt9611uxc);
 
 err_remove_bridge:
+       free_irq(client->irq, lt9611uxc);
+       cancel_work_sync(&lt9611uxc->work);
        drm_bridge_remove(&lt9611uxc->bridge);
 
 err_disable_regulators:
@@ -983,7 +985,7 @@ static void lt9611uxc_remove(struct i2c_client *client)
 {
        struct lt9611uxc *lt9611uxc = i2c_get_clientdata(client);
 
-       disable_irq(client->irq);
+       free_irq(client->irq, lt9611uxc);
        cancel_work_sync(&lt9611uxc->work);
        lt9611uxc_audio_exit(lt9611uxc);
        drm_bridge_remove(&lt9611uxc->bridge);