/* Default driver model device. */
        struct platform_device *pdev;
 
+       /* Have we added the device group to the device? */
+       bool dev_group_added;
+
        /* Counters and things for the proc filesystem. */
        atomic_t stats[SI_NUM_STATS];
 
        if (initialized) {
                rv = try_smi_init(new_smi);
                if (rv) {
-                       mutex_unlock(&smi_infos_lock);
                        cleanup_one_si(new_smi);
+                       mutex_unlock(&smi_infos_lock);
                        return rv;
                }
        }
                        rv);
                goto out_err_stop_timer;
        }
+       new_smi->dev_group_added = true;
 
        rv = ipmi_register_smi(&handlers,
                               new_smi,
        return 0;
 
 out_err_remove_attrs:
-       device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group);
+       if (new_smi->dev_group_added) {
+               device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group);
+               new_smi->dev_group_added = false;
+       }
        dev_set_drvdata(new_smi->io.dev, NULL);
 
 out_err_stop_timer:
                else
                        platform_device_put(new_smi->pdev);
                new_smi->pdev = NULL;
+               new_smi->io.dev = NULL;
        }
 
        kfree(init_name);
                }
        }
 
-       device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group);
-       dev_set_drvdata(to_clean->io.dev, NULL);
+       if (to_clean->dev_group_added)
+               device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group);
+       if (to_clean->io.dev)
+               dev_set_drvdata(to_clean->io.dev, NULL);
 
        list_del(&to_clean->link);