mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
[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: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
parent
04837f6447
commit
27d3528425
@ -739,6 +739,7 @@ static int bluecard_open(bluecard_info_t *info)
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = bluecard_hci_open;
|
||||
hdev->close = bluecard_hci_close;
|
||||
|
@ -582,6 +582,7 @@ static int bt3c_open(bt3c_info_t *info)
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = bt3c_hci_open;
|
||||
hdev->close = bt3c_hci_close;
|
||||
|
@ -502,6 +502,7 @@ static int btuart_open(btuart_info_t *info)
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = btuart_hci_open;
|
||||
hdev->close = btuart_hci_close;
|
||||
|
@ -484,6 +484,7 @@ static int dtl1_open(dtl1_info_t *info)
|
||||
|
||||
hdev->type = HCI_PCCARD;
|
||||
hdev->driver_data = info;
|
||||
SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
|
||||
|
||||
hdev->open = dtl1_hci_open;
|
||||
hdev->close = dtl1_hci_close;
|
||||
|
@ -277,7 +277,6 @@ static int vhci_open(struct inode *inode, struct file *file)
|
||||
|
||||
hdev->type = HCI_VHCI;
|
||||
hdev->driver_data = vhci;
|
||||
SET_HCIDEV_DEV(hdev, vhci_miscdev.dev);
|
||||
|
||||
hdev->open = vhci_open_dev;
|
||||
hdev->close = vhci_close_dev;
|
||||
|
@ -124,6 +124,7 @@ struct hci_dev {
|
||||
|
||||
atomic_t promisc;
|
||||
|
||||
struct device *dev;
|
||||
struct class_device class_dev;
|
||||
|
||||
struct module *owner;
|
||||
|
@ -48,7 +48,7 @@
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "2.9"
|
||||
#define VERSION "2.10"
|
||||
|
||||
/* Bluetooth sockets */
|
||||
#define BT_MAX_PROTO 8
|
||||
@ -307,14 +307,22 @@ static struct net_proto_family bt_sock_family_ops = {
|
||||
|
||||
static int __init bt_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
BT_INFO("Core ver %s", VERSION);
|
||||
|
||||
sock_register(&bt_sock_family_ops);
|
||||
err = bt_sysfs_init();
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = sock_register(&bt_sock_family_ops);
|
||||
if (err < 0) {
|
||||
bt_sysfs_cleanup();
|
||||
return err;
|
||||
}
|
||||
|
||||
BT_INFO("HCI device and connection manager initialized");
|
||||
|
||||
bt_sysfs_init();
|
||||
|
||||
hci_sock_init();
|
||||
|
||||
return 0;
|
||||
@ -324,9 +332,9 @@ static void __exit bt_exit(void)
|
||||
{
|
||||
hci_sock_cleanup();
|
||||
|
||||
bt_sysfs_cleanup();
|
||||
|
||||
sock_unregister(PF_BLUETOOTH);
|
||||
|
||||
bt_sysfs_cleanup();
|
||||
}
|
||||
|
||||
subsys_initcall(bt_init);
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user