1 /* Bluetooth HCI driver model support. */ 2 3 #include <linux/module.h> 4 5 #include <net/bluetooth/bluetooth.h> 6 #include <net/bluetooth/hci_core.h> 7 8 static struct class *bt_class; 9 10 static void bt_link_release(struct device *dev) 11 { 12 struct hci_conn *conn = to_hci_conn(dev); 13 kfree(conn); 14 } 15 16 static const struct device_type bt_link = { 17 .name = "link", 18 .release = bt_link_release, 19 }; 20 21 /* 22 * The rfcomm tty device will possibly retain even when conn 23 * is down, and sysfs doesn't support move zombie device, 24 * so we should move the device before conn device is destroyed. 25 */ 26 static int __match_tty(struct device *dev, void *data) 27 { 28 return !strncmp(dev_name(dev), "rfcomm", 6); 29 } 30 31 void hci_conn_init_sysfs(struct hci_conn *conn) 32 { 33 struct hci_dev *hdev = conn->hdev; 34 35 BT_DBG("conn %p", conn); 36 37 conn->dev.type = &bt_link; 38 conn->dev.class = bt_class; 39 conn->dev.parent = &hdev->dev; 40 41 device_initialize(&conn->dev); 42 } 43 44 void hci_conn_add_sysfs(struct hci_conn *conn) 45 { 46 struct hci_dev *hdev = conn->hdev; 47 48 BT_DBG("conn %p", conn); 49 50 dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); 51 52 if (device_add(&conn->dev) < 0) { 53 BT_ERR("Failed to register connection device"); 54 return; 55 } 56 57 hci_dev_hold(hdev); 58 } 59 60 void hci_conn_del_sysfs(struct hci_conn *conn) 61 { 62 struct hci_dev *hdev = conn->hdev; 63 64 if (!device_is_registered(&conn->dev)) 65 return; 66 67 while (1) { 68 struct device *dev; 69 70 dev = device_find_child(&conn->dev, NULL, __match_tty); 71 if (!dev) 72 break; 73 device_move(dev, NULL, DPM_ORDER_DEV_LAST); 74 put_device(dev); 75 } 76 77 device_del(&conn->dev); 78 79 hci_dev_put(hdev); 80 } 81 82 static void bt_host_release(struct device *dev) 83 { 84 struct hci_dev *hdev = to_hci_dev(dev); 85 kfree(hdev); 86 module_put(THIS_MODULE); 87 } 88 89 static const struct device_type bt_host = { 90 .name = "host", 91 .release = bt_host_release, 92 }; 93 94 void hci_init_sysfs(struct hci_dev *hdev) 95 { 96 struct device *dev = &hdev->dev; 97 98 dev->type = &bt_host; 99 dev->class = bt_class; 100 101 __module_get(THIS_MODULE); 102 device_initialize(dev); 103 } 104 105 int __init bt_sysfs_init(void) 106 { 107 bt_class = class_create(THIS_MODULE, "bluetooth"); 108 109 return PTR_ERR_OR_ZERO(bt_class); 110 } 111 112 void bt_sysfs_cleanup(void) 113 { 114 class_destroy(bt_class); 115 } 116