media: allegro: fix module removal if initialization failed
authorMichael Tretter <m.tretter@pengutronix.de>
Wed, 8 Sep 2021 13:03:11 +0000 (14:03 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Wed, 20 Oct 2021 14:52:50 +0000 (15:52 +0100)
If the module probe finished, but the firmware initialization failed,
removing the module must not revert the firmware initialization.

Add a field to track the status of the firmware initialization and only
roll it back, if the firmware was successfully initialized.

Signed-off-by: Michael Tretter <m.tretter@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/allegro-dvt/allegro-core.c

index 14a119b43bca0cc2fb3f2ed4d9d55dcb9920af71..89d6de6082f6c92c71f24d9a2509c08797757a45 100644 (file)
@@ -142,6 +142,7 @@ struct allegro_dev {
        struct allegro_buffer suballocator;
 
        struct completion init_complete;
+       bool initialized;
 
        /* The mailbox interface */
        struct allegro_mbox *mbox_command;
@@ -3632,6 +3633,8 @@ static void allegro_fw_callback(const struct firmware *fw, void *context)
                 "allegro codec registered as /dev/video%d\n",
                 dev->video_dev.num);
 
+       dev->initialized = true;
+
        release_firmware(fw_codec);
        release_firmware(fw);
 
@@ -3678,6 +3681,8 @@ static int allegro_probe(struct platform_device *pdev)
 
        mutex_init(&dev->lock);
 
+       dev->initialized = false;
+
        res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
        if (!res) {
                dev_err(&pdev->dev,
@@ -3748,11 +3753,13 @@ static int allegro_remove(struct platform_device *pdev)
 {
        struct allegro_dev *dev = platform_get_drvdata(pdev);
 
-       video_unregister_device(&dev->video_dev);
-       if (dev->m2m_dev)
-               v4l2_m2m_release(dev->m2m_dev);
-       allegro_mcu_hw_deinit(dev);
-       allegro_free_fw_codec(dev);
+       if (dev->initialized) {
+               video_unregister_device(&dev->video_dev);
+               if (dev->m2m_dev)
+                       v4l2_m2m_release(dev->m2m_dev);
+               allegro_mcu_hw_deinit(dev);
+               allegro_free_fw_codec(dev);
+       }
 
        v4l2_device_unregister(&dev->v4l2_dev);