aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-arm/suspend.h
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@rpsys.net>2005-09-09 13:54:04 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2005-09-09 13:54:04 -0400
commitdaad56661d56cc382948fc95b74e17d3326b901b (patch)
tree9c3b5195646882044f39baef859621cc27510de5 /include/asm-arm/suspend.h
parentaa6c2e794f7e1f54dc52c84471c750327fa21ccd (diff)
[ARM] 2894/1: Sharp Scoop driver pm_message_t type fix
Patch from Richard Purdie Fix a pm_message_t type warning in the Sharp scoop driver Signed-off-by: Richard Purdie <rpurdie@rpsys.net> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'include/asm-arm/suspend.h')
0 files changed, 0 insertions, 0 deletions
23120e0d6'>36acbb1adadf
4aa769b99724






4aa769b99724

4aa769b99724
1da177e4c3f4

1da177e4c3f4
1da177e4c3f4


4aa769b99724
1da177e4c3f4
155961e80017
4aa769b99724
1da177e4c3f4


9c724357f432
4aa769b99724
1da177e4c3f4


4aa769b99724
1da177e4c3f4
155961e80017
1da177e4c3f4
9c724357f432
1da177e4c3f4
4aa769b99724
1da177e4c3f4

4aa769b99724
1da177e4c3f4

9c724357f432
1da177e4c3f4

4aa769b99724
1da177e4c3f4





155961e80017
1da177e4c3f4
0d48d93947dd
9c724357f432
4aa769b99724
9c724357f432
1da177e4c3f4



9c724357f432
4aa769b99724
1da177e4c3f4





4aa769b99724

1da177e4c3f4
4aa769b99724
1da177e4c3f4




9c724357f432
0d48d93947dd
1da177e4c3f4




1da177e4c3f4

9c724357f432
4aa769b99724
1da177e4c3f4
1da177e4c3f4
4aa769b99724


1da177e4c3f4
1da177e4c3f4

4aa769b99724
1da177e4c3f4

9c724357f432
4aa769b99724
0d48d93947dd

9c724357f432
0d48d93947dd
1da177e4c3f4
0d48d93947dd
9c724357f432
0d48d93947dd
1da177e4c3f4
0d48d93947dd
4f7ac1814ef6
0d48d93947dd
2c24d454060a
1da177e4c3f4



9c724357f432

1da177e4c3f4
9c724357f432
1da177e4c3f4


1da177e4c3f4
9c724357f432
4db7589f3d88






1da177e4c3f4

4db7589f3d88



1da177e4c3f4
4db7589f3d88



1da177e4c3f4
1da177e4c3f4



4aa769b99724

1da177e4c3f4
9c724357f432
1da177e4c3f4
9c724357f432
1da177e4c3f4

4aa769b99724
1da177e4c3f4
9c724357f432
1da177e4c3f4
9c724357f432
1da177e4c3f4
9c724357f432
4aa769b99724




4aa769b99724
1da177e4c3f4
9c724357f432
1da177e4c3f4

9c724357f432

1da177e4c3f4

9c724357f432

1da177e4c3f4
1da177e4c3f4

9c724357f432
1da177e4c3f4


9c724357f432
1da177e4c3f4
c13854cef475
155961e80017
1da177e4c3f4
36acbb1adadf


4aa769b99724



1da177e4c3f4
1da177e4c3f4
4aa769b99724
9c724357f432
1da177e4c3f4



9c724357f432
0dea0141a9d9
4aa769b99724
0dea0141a9d9
1da177e4c3f4

4aa769b99724
1da177e4c3f4
9c724357f432

1da177e4c3f4
13ea4015d37d
1da177e4c3f4


bf18c7118cf8
4aa769b99724



2b8693c0617e
fed4c2508b74
4aa769b99724


4aa769b99724

6038f373a3dc
1da177e4c3f4

4aa769b99724
ac28494c51ad


1da177e4c3f4

4aa769b99724
1da177e4c3f4
4aa769b99724
1da177e4c3f4
329ab1b3e6ce
1da177e4c3f4

4aa769b99724
1da177e4c3f4
329ab1b3e6ce
1da177e4c3f4

4aa769b99724


36acbb1adadf


63fbd24e5102
4aa769b99724


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
  
  

                                


                                                                  















                                                                             
   
 

                         
                         
                       
                       


                        
                       



                             

                                    
 
                     
 

                






                                    

  
                                              

                                           
 


                 
                                               
 
                                                       
 


                                                           
                                      
 


                 
                                           
 
                                                       
 
                                      
 
                 

 
                                               

                                                           
                               

                    
                                                                   





                                                 
                                     
 
                                                           
                                          
 
                                                



                 
                                                           
                                                                             





                                       

                                              
                               
 




                                                              
                                       
                                                     




                            

 
                                                           
                                                                         
 
                               


                                                   
 

                                              
 

                     
                                        
 

                                       
                                          
                      
 
                             
                                          
                      
 
                             
                                          
                      
         



                     

                                                                            
 
                                                    


                            
                       
                                                






                                                                   

                 



                                                 
 



                                                                        
         



                   

                                                                          
 
                                                    
 
                                               

 
                                                                  
 
                                                    
 
                                                
 
                                           




                                           
                                                            
 
                               

                             

                                                             

                               

                                              
 

                               
                            


                               
                          
 
                                
                                    
 


                                         



                                         
 
                                         
                                                    
                            



                                   
                                  
                                      
 
                 

 
                                                               
 

                                                    
 
                                 


                                  
                    



                 
                                                 
                                      


                                     

                                       
                                    

  
                                        


                                     

  
                                 
 
                                                      
 
                                            

 
                                  
 
                                       

 


                       


                                                      
                                                       


                                                                
/*
 *
 *  Bluetooth virtual HCI driver
 *
 *  Copyright (C) 2000-2001  Qualcomm Incorporated
 *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
 *  Copyright (C) 2004-2006  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/poll.h>

#include <linux/skbuff.h>
#include <linux/miscdevice.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>

#define VERSION "1.3"

static bool amp;

struct vhci_data {
	struct hci_dev *hdev;

	unsigned long flags;

	wait_queue_head_t read_wait;
	struct sk_buff_head readq;
};

static int vhci_open_dev(struct hci_dev *hdev)
{
	set_bit(HCI_RUNNING, &hdev->flags);

	return 0;
}

static int vhci_close_dev(struct hci_dev *hdev)
{
	struct vhci_data *data = hci_get_drvdata(hdev);

	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
		return 0;

	skb_queue_purge(&data->readq);

	return 0;
}

static int vhci_flush(struct hci_dev *hdev)
{
	struct vhci_data *data = hci_get_drvdata(hdev);

	skb_queue_purge(&data->readq);

	return 0;
}

static int vhci_send_frame(struct sk_buff *skb)
{
	struct hci_dev* hdev = (struct hci_dev *) skb->dev;
	struct vhci_data *data;

	if (!hdev) {
		BT_ERR("Frame for unknown HCI device (hdev=NULL)");
		return -ENODEV;
	}

	if (!test_bit(HCI_RUNNING, &hdev->flags))
		return -EBUSY;

	data = hci_get_drvdata(hdev);

	memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
	skb_queue_tail(&data->readq, skb);

	wake_up_interruptible(&data->read_wait);

	return 0;
}

static inline ssize_t vhci_get_user(struct vhci_data *data,
					const char __user *buf, size_t count)
{
	struct sk_buff *skb;

	if (count > HCI_MAX_FRAME_SIZE)
		return -EINVAL;

	skb = bt_skb_alloc(count, GFP_KERNEL);
	if (!skb)
		return -ENOMEM;

	if (copy_from_user(skb_put(skb, count), buf, count)) {
		kfree_skb(skb);
		return -EFAULT;
	}

	skb->dev = (void *) data->hdev;
	bt_cb(skb)->pkt_type = *((__u8 *) skb->data);
	skb_pull(skb, 1);

	hci_recv_frame(skb);

	return count;
}

static inline ssize_t vhci_put_user(struct vhci_data *data,
			struct sk_buff *skb, char __user *buf, int count)
{
	char __user *ptr = buf;
	int len, total = 0;

	len = min_t(unsigned int, skb->len, count);

	if (copy_to_user(ptr, skb->data, len))
		return -EFAULT;

	total += len;

	data->hdev->stat.byte_tx += len;

	switch (bt_cb(skb)->pkt_type) {
	case HCI_COMMAND_PKT:
		data->hdev->stat.cmd_tx++;
		break;

	case HCI_ACLDATA_PKT:
		data->hdev->stat.acl_tx++;
		break;

	case HCI_SCODATA_PKT:
		data->hdev->stat.sco_tx++;
		break;
	}

	return total;
}

static ssize_t vhci_read(struct file *file,
				char __user *buf, size_t count, loff_t *pos)
{
	struct vhci_data *data = file->private_data;
	struct sk_buff *skb;
	ssize_t ret = 0;

	while (count) {
		skb = skb_dequeue(&data->readq);
		if (skb) {
			ret = vhci_put_user(data, skb, buf, count);
			if (ret < 0)
				skb_queue_head(&data->readq, skb);
			else
				kfree_skb(skb);
			break;
		}

		if (file->f_flags & O_NONBLOCK) {
			ret = -EAGAIN;
			break;
		}

		ret = wait_event_interruptible(data->read_wait,
					!skb_queue_empty(&data->readq));
		if (ret < 0)
			break;
	}

	return ret;
}

static ssize_t vhci_write(struct file *file,
			const char __user *buf, size_t count, loff_t *pos)
{
	struct vhci_data *data = file->private_data;

	return vhci_get_user(data, buf, count);
}

static unsigned int vhci_poll(struct file *file, poll_table *wait)
{
	struct vhci_data *data = file->private_data;

	poll_wait(file, &data->read_wait, wait);

	if (!skb_queue_empty(&data->readq))
		return POLLIN | POLLRDNORM;

	return POLLOUT | POLLWRNORM;
}

static int vhci_open(struct inode *inode, struct file *file)
{
	struct vhci_data *data;
	struct hci_dev *hdev;

	data = kzalloc(sizeof(struct vhci_data), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	skb_queue_head_init(&data->readq);
	init_waitqueue_head(&data->read_wait);

	hdev = hci_alloc_dev();
	if (!hdev) {
		kfree(data);
		return -ENOMEM;
	}

	data->hdev = hdev;

	hdev->bus = HCI_VIRTUAL;
	hci_set_drvdata(hdev, data);

	if (amp)
		hdev->dev_type = HCI_AMP;

	hdev->open     = vhci_open_dev;
	hdev->close    = vhci_close_dev;
	hdev->flush    = vhci_flush;
	hdev->send     = vhci_send_frame;

	if (hci_register_dev(hdev) < 0) {
		BT_ERR("Can't register HCI device");
		kfree(data);
		hci_free_dev(hdev);
		return -EBUSY;
	}

	file->private_data = data;
	nonseekable_open(inode, file);

	return 0;
}

static int vhci_release(struct inode *inode, struct file *file)
{
	struct vhci_data *data = file->private_data;
	struct hci_dev *hdev = data->hdev;

	hci_unregister_dev(hdev);
	hci_free_dev(hdev);

	file->private_data = NULL;
	kfree(data);

	return 0;
}

static const struct file_operations vhci_fops = {
	.owner		= THIS_MODULE,
	.read		= vhci_read,
	.write		= vhci_write,
	.poll		= vhci_poll,
	.open		= vhci_open,
	.release	= vhci_release,
	.llseek		= no_llseek,
};

static struct miscdevice vhci_miscdev= {
	.name	= "vhci",
	.fops	= &vhci_fops,
	.minor	= MISC_DYNAMIC_MINOR,
};

static int __init vhci_init(void)
{
	BT_INFO("Virtual HCI driver ver %s", VERSION);

	return misc_register(&vhci_miscdev);
}

static void __exit vhci_exit(void)
{
	misc_deregister(&vhci_miscdev);
}

module_init(vhci_init);
module_exit(vhci_exit);

module_param(amp, bool, 0644);
MODULE_PARM_DESC(amp, "Create AMP controller device");

MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION);
MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL");