Merge tag 'fsi-for-5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/fsi...
[sfrench/cifs-2.6.git] / drivers / fsi / fsi-core.c
index 1d83f3ba478b961426415acb10b99487a165ca83..1f76740f33b6fc21b11534cb79216ce8cffbe9a4 100644 (file)
@@ -1029,6 +1029,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
 
        }
 
+       rc = fsi_slave_set_smode(slave);
+       if (rc) {
+               dev_warn(&master->dev,
+                               "can't set smode on slave:%02x:%02x %d\n",
+                               link, id, rc);
+               goto err_free;
+       }
+
        /* Allocate a minor in the FSI space */
        rc = __fsi_get_new_minor(slave, fsi_dev_cfam, &slave->dev.devt,
                                 &slave->cdev_idx);
@@ -1040,17 +1048,14 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
        rc = cdev_device_add(&slave->cdev, &slave->dev);
        if (rc) {
                dev_err(&slave->dev, "Error %d creating slave device\n", rc);
-               goto err_free;
+               goto err_free_ida;
        }
 
-       rc = fsi_slave_set_smode(slave);
-       if (rc) {
-               dev_warn(&master->dev,
-                               "can't set smode on slave:%02x:%02x %d\n",
-                               link, id, rc);
-               kfree(slave);
-               return -ENODEV;
-       }
+       /* Now that we have the cdev registered with the core, any fatal
+        * failures beyond this point will need to clean up through
+        * cdev_device_del(). Fortunately though, nothing past here is fatal.
+        */
+
        if (master->link_config)
                master->link_config(master, link,
                                    slave->t_send_delay,
@@ -1067,10 +1072,13 @@ static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
                dev_dbg(&master->dev, "failed during slave scan with: %d\n",
                                rc);
 
-       return rc;
+       return 0;
 
- err_free:
-       put_device(&slave->dev);
+err_free_ida:
+       fsi_free_minor(slave->dev.devt);
+err_free:
+       of_node_put(slave->dev.of_node);
+       kfree(slave);
        return rc;
 }