linux/net/bluetooth/hci_sysfs.c
<<
>>
Prefs
   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}
 116