schedule_work(&conn->work);
 }
 
+static int __match_tty(struct device *dev, void *data)
+{
+       /* The rfcomm tty device will possibly retain even when conn
+        * is down, and sysfs doesn't support move zombie device,
+        * so we should move the device before conn device is destroyed.
+        * Due to the only child device of hci_conn dev is rfcomm
+        * tty_dev, here just return 1
+        */
+       return 1;
+}
+
 static void del_conn(struct work_struct *work)
 {
+       struct device *dev;
        struct hci_conn *conn = container_of(work, struct hci_conn, work);
+
+       while (dev = device_find_child(&conn->dev, NULL, __match_tty)) {
+               device_move(dev, NULL);
+               put_device(dev);
+       }
        device_del(&conn->dev);
        put_device(&conn->dev);
 }
 
        BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
 
        if (--dev->opened == 0) {
-               device_move(dev->tty_dev, NULL);
+               if (dev->tty_dev->parent)
+                       device_move(dev->tty_dev, NULL);
 
                /* Close DLC and dettach TTY */
                rfcomm_dlc_close(dev->dlc, 0);