summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/uwb/pal.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c
index 690577d2a35b..c1304b8d4985 100644
--- a/drivers/uwb/pal.c
+++ b/drivers/uwb/pal.c
@@ -68,8 +68,40 @@ int uwb_pal_register(struct uwb_pal *pal)
68} 68}
69EXPORT_SYMBOL_GPL(uwb_pal_register); 69EXPORT_SYMBOL_GPL(uwb_pal_register);
70 70
71static int find_rc(struct device *dev, const void *data)
72{
73 const struct uwb_rc *target_rc = data;
74 struct uwb_rc *rc = dev_get_drvdata(dev);
75
76 if (rc == NULL) {
77 WARN_ON(1);
78 return 0;
79 }
80 if (rc == target_rc) {
81 if (rc->ready == 0)
82 return 0;
83 else
84 return 1;
85 }
86 return 0;
87}
88
89/**
90 * Given a radio controller descriptor see if it is registered.
91 *
92 * @returns false if the rc does not exist or is quiescing; true otherwise.
93 */
94static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc)
95{
96 struct device *dev;
97
98 dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc);
99
100 return (dev != NULL);
101}
102
71/** 103/**
72 * uwb_pal_register - unregister a UWB PAL 104 * uwb_pal_unregister - unregister a UWB PAL
73 * @pal: the PAL 105 * @pal: the PAL
74 */ 106 */
75void uwb_pal_unregister(struct uwb_pal *pal) 107void uwb_pal_unregister(struct uwb_pal *pal)
@@ -85,7 +117,11 @@ void uwb_pal_unregister(struct uwb_pal *pal)
85 debugfs_remove(pal->debugfs_dir); 117 debugfs_remove(pal->debugfs_dir);
86 118
87 if (pal->device) { 119 if (pal->device) {
88 sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name); 120 /* remove link to the PAL in the UWB device's directory. */
121 if (uwb_rc_class_device_exists(rc))
122 sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name);
123
124 /* remove link to uwb_rc in the PAL device's directory. */
89 sysfs_remove_link(&pal->device->kobj, "uwb_rc"); 125 sysfs_remove_link(&pal->device->kobj, "uwb_rc");
90 } 126 }
91} 127}