};
 
 int  rfcomm_dev_ioctl(struct sock *sk, unsigned int cmd, void __user *arg);
+
+#ifdef CONFIG_BT_RFCOMM_TTY
 int  rfcomm_init_ttys(void);
 void rfcomm_cleanup_ttys(void);
-
+#else
+static inline int rfcomm_init_ttys(void)
+{
+       return 0;
+}
+static inline void rfcomm_cleanup_ttys(void)
+{
+}
+#endif
 #endif /* __RFCOMM_H */
 
 /* ---- Initialization ---- */
 static int __init rfcomm_init(void)
 {
+       int ret;
+
        l2cap_load();
 
        hci_register_cb(&rfcomm_cb);
 
        rfcomm_thread = kthread_run(rfcomm_run, NULL, "krfcommd");
        if (IS_ERR(rfcomm_thread)) {
-               hci_unregister_cb(&rfcomm_cb);
-               return PTR_ERR(rfcomm_thread);
+               ret = PTR_ERR(rfcomm_thread);
+               goto out_thread;
        }
 
        if (class_create_file(bt_class, &class_attr_rfcomm_dlc) < 0)
                BT_ERR("Failed to create RFCOMM info file");
 
-       rfcomm_init_sockets();
+       ret = rfcomm_init_ttys();
+       if (ret)
+               goto out_tty;
 
-#ifdef CONFIG_BT_RFCOMM_TTY
-       rfcomm_init_ttys();
-#endif
+       ret = rfcomm_init_sockets();
+       if (ret)
+               goto out_sock;
 
        BT_INFO("RFCOMM ver %s", VERSION);
 
        return 0;
+
+out_sock:
+       rfcomm_cleanup_ttys();
+out_tty:
+       kthread_stop(rfcomm_thread);
+out_thread:
+       hci_unregister_cb(&rfcomm_cb);
+
+       return ret;
 }
 
 static void __exit rfcomm_exit(void)
 
        kthread_stop(rfcomm_thread);
 
-#ifdef CONFIG_BT_RFCOMM_TTY
        rfcomm_cleanup_ttys();
-#endif
 
        rfcomm_cleanup_sockets();
 }