Commit 27d35284 authored by Marcel Holtmann's avatar Marcel Holtmann Committed by David S. Miller

[Bluetooth] Add platform device for virtual and serial devices

This patch adds a generic Bluetooth platform device that can be used
as parent device by virtual and serial devices.
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 04837f64
...@@ -739,6 +739,7 @@ static int bluecard_open(bluecard_info_t *info) ...@@ -739,6 +739,7 @@ static int bluecard_open(bluecard_info_t *info)
hdev->type = HCI_PCCARD; hdev->type = HCI_PCCARD;
hdev->driver_data = info; hdev->driver_data = info;
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = bluecard_hci_open; hdev->open = bluecard_hci_open;
hdev->close = bluecard_hci_close; hdev->close = bluecard_hci_close;
......
...@@ -582,6 +582,7 @@ static int bt3c_open(bt3c_info_t *info) ...@@ -582,6 +582,7 @@ static int bt3c_open(bt3c_info_t *info)
hdev->type = HCI_PCCARD; hdev->type = HCI_PCCARD;
hdev->driver_data = info; hdev->driver_data = info;
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = bt3c_hci_open; hdev->open = bt3c_hci_open;
hdev->close = bt3c_hci_close; hdev->close = bt3c_hci_close;
......
...@@ -502,6 +502,7 @@ static int btuart_open(btuart_info_t *info) ...@@ -502,6 +502,7 @@ static int btuart_open(btuart_info_t *info)
hdev->type = HCI_PCCARD; hdev->type = HCI_PCCARD;
hdev->driver_data = info; hdev->driver_data = info;
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = btuart_hci_open; hdev->open = btuart_hci_open;
hdev->close = btuart_hci_close; hdev->close = btuart_hci_close;
......
...@@ -484,6 +484,7 @@ static int dtl1_open(dtl1_info_t *info) ...@@ -484,6 +484,7 @@ static int dtl1_open(dtl1_info_t *info)
hdev->type = HCI_PCCARD; hdev->type = HCI_PCCARD;
hdev->driver_data = info; hdev->driver_data = info;
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = dtl1_hci_open; hdev->open = dtl1_hci_open;
hdev->close = dtl1_hci_close; hdev->close = dtl1_hci_close;
......
...@@ -277,7 +277,6 @@ static int vhci_open(struct inode *inode, struct file *file) ...@@ -277,7 +277,6 @@ static int vhci_open(struct inode *inode, struct file *file)
hdev->type = HCI_VHCI; hdev->type = HCI_VHCI;
hdev->driver_data = vhci; hdev->driver_data = vhci;
SET_HCIDEV_DEV(hdev, vhci_miscdev.dev);
hdev->open = vhci_open_dev; hdev->open = vhci_open_dev;
hdev->close = vhci_close_dev; hdev->close = vhci_close_dev;
......
...@@ -124,6 +124,7 @@ struct hci_dev { ...@@ -124,6 +124,7 @@ struct hci_dev {
atomic_t promisc; atomic_t promisc;
struct device *dev;
struct class_device class_dev; struct class_device class_dev;
struct module *owner; struct module *owner;
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
#define BT_DBG(D...) #define BT_DBG(D...)
#endif #endif
#define VERSION "2.9" #define VERSION "2.10"
/* Bluetooth sockets */ /* Bluetooth sockets */
#define BT_MAX_PROTO 8 #define BT_MAX_PROTO 8
...@@ -307,13 +307,21 @@ static struct net_proto_family bt_sock_family_ops = { ...@@ -307,13 +307,21 @@ static struct net_proto_family bt_sock_family_ops = {
static int __init bt_init(void) static int __init bt_init(void)
{ {
int err;
BT_INFO("Core ver %s", VERSION); BT_INFO("Core ver %s", VERSION);
sock_register(&bt_sock_family_ops); err = bt_sysfs_init();
if (err < 0)
return err;
BT_INFO("HCI device and connection manager initialized"); err = sock_register(&bt_sock_family_ops);
if (err < 0) {
bt_sysfs_cleanup();
return err;
}
bt_sysfs_init(); BT_INFO("HCI device and connection manager initialized");
hci_sock_init(); hci_sock_init();
...@@ -324,9 +332,9 @@ static void __exit bt_exit(void) ...@@ -324,9 +332,9 @@ static void __exit bt_exit(void)
{ {
hci_sock_cleanup(); hci_sock_cleanup();
bt_sysfs_cleanup();
sock_unregister(PF_BLUETOOTH); sock_unregister(PF_BLUETOOTH);
bt_sysfs_cleanup();
} }
subsys_initcall(bt_init); subsys_initcall(bt_init);
......
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h>
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
...@@ -197,9 +199,14 @@ struct class bt_class = { ...@@ -197,9 +199,14 @@ struct class bt_class = {
.uevent = bt_uevent, .uevent = bt_uevent,
#endif #endif
}; };
EXPORT_SYMBOL_GPL(bt_class); 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) int hci_register_sysfs(struct hci_dev *hdev)
{ {
struct class_device *cdev = &hdev->class_dev; struct class_device *cdev = &hdev->class_dev;
...@@ -211,6 +218,11 @@ int hci_register_sysfs(struct hci_dev *hdev) ...@@ -211,6 +218,11 @@ int hci_register_sysfs(struct hci_dev *hdev)
cdev->class = &bt_class; cdev->class = &bt_class;
class_set_devdata(cdev, hdev); 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); strlcpy(cdev->class_id, hdev->name, BUS_ID_SIZE);
err = class_device_register(cdev); err = class_device_register(cdev);
if (err < 0) if (err < 0)
...@@ -233,10 +245,33 @@ void hci_unregister_sysfs(struct hci_dev *hdev) ...@@ -233,10 +245,33 @@ void hci_unregister_sysfs(struct hci_dev *hdev)
int __init bt_sysfs_init(void) 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) void __exit bt_sysfs_cleanup(void)
{ {
class_unregister(&bt_class); class_unregister(&bt_class);
bus_unregister(&bt_bus);
platform_device_unregister(bt_platform);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment