diff options
Diffstat (limited to 'drivers/uwb/pal.c')
-rw-r--r-- | drivers/uwb/pal.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c new file mode 100644 index 000000000000..1afb38eacb9a --- /dev/null +++ b/drivers/uwb/pal.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* | ||
2 | * UWB PAL support. | ||
3 | * | ||
4 | * Copyright (C) 2008 Cambridge Silicon Radio Ltd. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
17 | */ | ||
18 | #include <linux/kernel.h> | ||
19 | #include <linux/uwb.h> | ||
20 | |||
21 | #include "uwb-internal.h" | ||
22 | |||
23 | /** | ||
24 | * uwb_pal_init - initialize a UWB PAL | ||
25 | * @pal: the PAL to initialize | ||
26 | */ | ||
27 | void uwb_pal_init(struct uwb_pal *pal) | ||
28 | { | ||
29 | INIT_LIST_HEAD(&pal->node); | ||
30 | } | ||
31 | EXPORT_SYMBOL_GPL(uwb_pal_init); | ||
32 | |||
33 | /** | ||
34 | * uwb_pal_register - register a UWB PAL | ||
35 | * @rc: the radio controller the PAL will be using | ||
36 | * @pal: the PAL | ||
37 | * | ||
38 | * The PAL must be initialized with uwb_pal_init(). | ||
39 | */ | ||
40 | int uwb_pal_register(struct uwb_rc *rc, struct uwb_pal *pal) | ||
41 | { | ||
42 | int ret; | ||
43 | |||
44 | if (pal->device) { | ||
45 | ret = sysfs_create_link(&pal->device->kobj, | ||
46 | &rc->uwb_dev.dev.kobj, "uwb_rc"); | ||
47 | if (ret < 0) | ||
48 | return ret; | ||
49 | ret = sysfs_create_link(&rc->uwb_dev.dev.kobj, | ||
50 | &pal->device->kobj, pal->name); | ||
51 | if (ret < 0) { | ||
52 | sysfs_remove_link(&pal->device->kobj, "uwb_rc"); | ||
53 | return ret; | ||
54 | } | ||
55 | } | ||
56 | |||
57 | spin_lock(&rc->pal_lock); | ||
58 | list_add(&pal->node, &rc->pals); | ||
59 | spin_unlock(&rc->pal_lock); | ||
60 | |||
61 | return 0; | ||
62 | } | ||
63 | EXPORT_SYMBOL_GPL(uwb_pal_register); | ||
64 | |||
65 | /** | ||
66 | * uwb_pal_register - unregister a UWB PAL | ||
67 | * @rc: the radio controller the PAL was using | ||
68 | * @pal: the PAL | ||
69 | */ | ||
70 | void uwb_pal_unregister(struct uwb_rc *rc, struct uwb_pal *pal) | ||
71 | { | ||
72 | spin_lock(&rc->pal_lock); | ||
73 | list_del(&pal->node); | ||
74 | spin_unlock(&rc->pal_lock); | ||
75 | |||
76 | if (pal->device) { | ||
77 | sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); | ||
78 | sysfs_remove_link(&pal->device->kobj, "uwb_rc"); | ||
79 | } | ||
80 | } | ||
81 | EXPORT_SYMBOL_GPL(uwb_pal_unregister); | ||
82 | |||
83 | /** | ||
84 | * uwb_rc_pal_init - initialize the PAL related parts of a radio controller | ||
85 | * @rc: the radio controller | ||
86 | */ | ||
87 | void uwb_rc_pal_init(struct uwb_rc *rc) | ||
88 | { | ||
89 | spin_lock_init(&rc->pal_lock); | ||
90 | INIT_LIST_HEAD(&rc->pals); | ||
91 | } | ||