[Bluetooth] Add platform device for virtual and serial devices
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / net / bluetooth / hci_sysfs.c
index 89918d2f1fdccbb33d9eb35c93b9bfad91fb38d3..7789e26c84b9d20afc748d13d8e65b8d62f22d4d 100644 (file)
@@ -3,6 +3,8 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 
+#include <linux/platform_device.h>
+
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 
@@ -197,9 +199,14 @@ struct class bt_class = {
        .uevent         = bt_uevent,
 #endif
 };
-
 EXPORT_SYMBOL_GPL(bt_class);
 
+static struct bus_type bt_bus = {
+       .name   = "bluetooth",
+};
+
+static struct platform_device *bt_platform;
+
 int hci_register_sysfs(struct hci_dev *hdev)
 {
        struct class_device *cdev = &hdev->class_dev;
@@ -211,6 +218,11 @@ int hci_register_sysfs(struct hci_dev *hdev)
        cdev->class = &bt_class;
        class_set_devdata(cdev, hdev);
 
+       if (!cdev->dev)
+               cdev->dev = &bt_platform->dev;
+
+       hdev->dev = cdev->dev;
+
        strlcpy(cdev->class_id, hdev->name, BUS_ID_SIZE);
        err = class_device_register(cdev);
        if (err < 0)
@@ -233,10 +245,33 @@ void hci_unregister_sysfs(struct hci_dev *hdev)
 
 int __init bt_sysfs_init(void)
 {
-       return class_register(&bt_class);
+       int err;
+
+       bt_platform = platform_device_register_simple("bluetooth", -1, NULL, 0);
+       if (IS_ERR(bt_platform))
+               return PTR_ERR(bt_platform);
+
+       err = bus_register(&bt_bus);
+       if (err < 0) {
+               platform_device_unregister(bt_platform);
+               return err;
+       }
+
+       err = class_register(&bt_class);
+       if (err < 0) {
+               bus_unregister(&bt_bus);
+               platform_device_unregister(bt_platform);
+               return err;
+       }
+
+       return 0;
 }
 
 void __exit bt_sysfs_cleanup(void)
 {
        class_unregister(&bt_class);
+
+       bus_unregister(&bt_bus);
+
+       platform_device_unregister(bt_platform);
 }