Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.13 115 lines 2.2 kB view raw
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 8static struct class *bt_class; 9 10static void bt_link_release(struct device *dev) 11{ 12 struct hci_conn *conn = to_hci_conn(dev); 13 kfree(conn); 14} 15 16static 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 */ 26static int __match_tty(struct device *dev, void *data) 27{ 28 return !strncmp(dev_name(dev), "rfcomm", 6); 29} 30 31void 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 44void 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 60void 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 82static 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 89static struct device_type bt_host = { 90 .name = "host", 91 .release = bt_host_release, 92}; 93 94void 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 105int __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 112void bt_sysfs_cleanup(void) 113{ 114 class_destroy(bt_class); 115}