Blame view

drivers/uwb/pal.c 3.2 KB
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  /*
   * UWB PAL support.
   *
   * Copyright (C) 2008 Cambridge Silicon Radio Ltd.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License version
   * 2 as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
   */
  #include <linux/kernel.h>
dcc7461ee   David Vrabel   wusb: add debug f...
19
  #include <linux/debugfs.h>
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
20
  #include <linux/uwb.h>
475c0a6b2   Paul Gortmaker   uwb: Add export.h...
21
  #include <linux/export.h>
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  
  #include "uwb-internal.h"
  
  /**
   * uwb_pal_init - initialize a UWB PAL
   * @pal: the PAL to initialize
   */
  void uwb_pal_init(struct uwb_pal *pal)
  {
  	INIT_LIST_HEAD(&pal->node);
  }
  EXPORT_SYMBOL_GPL(uwb_pal_init);
  
  /**
   * uwb_pal_register - register a UWB PAL
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
37
38
39
40
   * @pal: the PAL
   *
   * The PAL must be initialized with uwb_pal_init().
   */
6fae35f9c   David Vrabel   uwb: add basic ra...
41
  int uwb_pal_register(struct uwb_pal *pal)
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
42
  {
6fae35f9c   David Vrabel   uwb: add basic ra...
43
  	struct uwb_rc *rc = pal->rc;
b60066c14   David Vrabel   uwb: add symlinks...
44
45
46
  	int ret;
  
  	if (pal->device) {
a89957519   Thomas Pugliese   USB: HWA: fix dev...
47
  		/* create a link to the uwb_rc in the PAL device's directory. */
b60066c14   David Vrabel   uwb: add symlinks...
48
49
50
51
  		ret = sysfs_create_link(&pal->device->kobj,
  					&rc->uwb_dev.dev.kobj, "uwb_rc");
  		if (ret < 0)
  			return ret;
a89957519   Thomas Pugliese   USB: HWA: fix dev...
52
  		/* create a link to the PAL in the UWB device's directory. */
b60066c14   David Vrabel   uwb: add symlinks...
53
54
55
56
57
58
59
  		ret = sysfs_create_link(&rc->uwb_dev.dev.kobj,
  					&pal->device->kobj, pal->name);
  		if (ret < 0) {
  			sysfs_remove_link(&pal->device->kobj, "uwb_rc");
  			return ret;
  		}
  	}
dcc7461ee   David Vrabel   wusb: add debug f...
60
  	pal->debugfs_dir = uwb_dbg_create_pal_dir(pal);
6fae35f9c   David Vrabel   uwb: add basic ra...
61
  	mutex_lock(&rc->uwb_dev.mutex);
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
62
  	list_add(&pal->node, &rc->pals);
6fae35f9c   David Vrabel   uwb: add basic ra...
63
  	mutex_unlock(&rc->uwb_dev.mutex);
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
64
65
66
67
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(uwb_pal_register);
fbbde074a   Thomas Pugliese   UWB: fix sysfs wa...
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
  static int find_rc(struct device *dev, const void *data)
  {
  	const struct uwb_rc *target_rc = data;
  	struct uwb_rc *rc = dev_get_drvdata(dev);
  
  	if (rc == NULL) {
  		WARN_ON(1);
  		return 0;
  	}
  	if (rc == target_rc) {
  		if (rc->ready == 0)
  			return 0;
  		else
  			return 1;
  	}
  	return 0;
  }
  
  /**
   * Given a radio controller descriptor see if it is registered.
   *
   * @returns false if the rc does not exist or is quiescing; true otherwise.
   */
  static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc)
  {
  	struct device *dev;
  
  	dev = class_find_device(&uwb_rc_class, NULL, target_rc,	find_rc);
  
  	return (dev != NULL);
  }
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
99
  /**
fbbde074a   Thomas Pugliese   UWB: fix sysfs wa...
100
   * uwb_pal_unregister - unregister a UWB PAL
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
101
102
   * @pal: the PAL
   */
6fae35f9c   David Vrabel   uwb: add basic ra...
103
  void uwb_pal_unregister(struct uwb_pal *pal)
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
104
  {
6fae35f9c   David Vrabel   uwb: add basic ra...
105
106
107
108
109
  	struct uwb_rc *rc = pal->rc;
  
  	uwb_radio_stop(pal);
  
  	mutex_lock(&rc->uwb_dev.mutex);
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
110
  	list_del(&pal->node);
6fae35f9c   David Vrabel   uwb: add basic ra...
111
  	mutex_unlock(&rc->uwb_dev.mutex);
b60066c14   David Vrabel   uwb: add symlinks...
112

dcc7461ee   David Vrabel   wusb: add debug f...
113
  	debugfs_remove(pal->debugfs_dir);
b60066c14   David Vrabel   uwb: add symlinks...
114
  	if (pal->device) {
fbbde074a   Thomas Pugliese   UWB: fix sysfs wa...
115
116
117
118
119
  		/* remove link to the PAL in the UWB device's directory. */
  		if (uwb_rc_class_device_exists(rc))
  			sysfs_remove_link(&rc->uwb_dev.dev.kobj, pal->name);
  
  		/* remove link to uwb_rc in the PAL device's directory. */
b60066c14   David Vrabel   uwb: add symlinks...
120
121
  		sysfs_remove_link(&pal->device->kobj, "uwb_rc");
  	}
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
122
123
124
125
126
127
128
129
130
  }
  EXPORT_SYMBOL_GPL(uwb_pal_unregister);
  
  /**
   * uwb_rc_pal_init - initialize the PAL related parts of a radio controller
   * @rc: the radio controller
   */
  void uwb_rc_pal_init(struct uwb_rc *rc)
  {
183b9b592   Inaky Perez-Gonzalez   uwb: add the UWB ...
131
132
  	INIT_LIST_HEAD(&rc->pals);
  }