~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/um/drivers/hostaudio_kern.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/um/drivers/hostaudio_kern.c (Architecture mips) and /arch/i386/drivers/hostaudio_kern.c (Architecture i386)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 /*                                                
  3  * Copyright (C) 2002 Steve Schmidtke             
  4  */                                               
  5                                                   
  6 #include <linux/fs.h>                             
  7 #include <linux/module.h>                         
  8 #include <linux/slab.h>                           
  9 #include <linux/sound.h>                          
 10 #include <linux/soundcard.h>                      
 11 #include <linux/mutex.h>                          
 12 #include <linux/uaccess.h>                        
 13 #include <init.h>                                 
 14 #include <os.h>                                   
 15                                                   
 16 struct hostaudio_state {                          
 17         int fd;                                   
 18 };                                                
 19                                                   
 20 struct hostmixer_state {                          
 21         int fd;                                   
 22 };                                                
 23                                                   
 24 #define HOSTAUDIO_DEV_DSP "/dev/sound/dsp"        
 25 #define HOSTAUDIO_DEV_MIXER "/dev/sound/mixer"    
 26                                                   
 27 /*                                                
 28  * Changed either at boot time or module load     
 29  * single-threaded; at module load, multiple m    
 30  * their own copy of these variables.             
 31  */                                               
 32 static char *dsp = HOSTAUDIO_DEV_DSP;             
 33 static char *mixer = HOSTAUDIO_DEV_MIXER;         
 34                                                   
 35 #define DSP_HELP \                                
 36 "    This is used to specify the host dsp devi    
 37 "    The default is \"" HOSTAUDIO_DEV_DSP "\".    
 38                                                   
 39 #define MIXER_HELP \                              
 40 "    This is used to specify the host mixer de    
 41 "    The default is \"" HOSTAUDIO_DEV_MIXER "\    
 42                                                   
 43 module_param(dsp, charp, 0644);                   
 44 MODULE_PARM_DESC(dsp, DSP_HELP);                  
 45 module_param(mixer, charp, 0644);                 
 46 MODULE_PARM_DESC(mixer, MIXER_HELP);              
 47                                                   
 48 #ifndef MODULE                                    
 49 static int set_dsp(char *name, int *add)          
 50 {                                                 
 51         dsp = name;                               
 52         return 0;                                 
 53 }                                                 
 54                                                   
 55 __uml_setup("dsp=", set_dsp, "dsp=<dsp device>    
 56                                                   
 57 static int set_mixer(char *name, int *add)        
 58 {                                                 
 59         mixer = name;                             
 60         return 0;                                 
 61 }                                                 
 62                                                   
 63 __uml_setup("mixer=", set_mixer, "mixer=<mixer    
 64 #endif                                            
 65                                                   
 66 static DEFINE_MUTEX(hostaudio_mutex);             
 67                                                   
 68 /* /dev/dsp file operations */                    
 69                                                   
 70 static ssize_t hostaudio_read(struct file *fil    
 71                               size_t count, lo    
 72 {                                                 
 73         struct hostaudio_state *state = file->    
 74         void *kbuf;                               
 75         int err;                                  
 76                                                   
 77 #ifdef DEBUG                                      
 78         printk(KERN_DEBUG "hostaudio: read cal    
 79 #endif                                            
 80                                                   
 81         kbuf = kmalloc(count, GFP_KERNEL);        
 82         if (kbuf == NULL)                         
 83                 return -ENOMEM;                   
 84                                                   
 85         err = os_read_file(state->fd, kbuf, co    
 86         if (err < 0)                              
 87                 goto out;                         
 88                                                   
 89         if (copy_to_user(buffer, kbuf, err))      
 90                 err = -EFAULT;                    
 91                                                   
 92 out:                                              
 93         kfree(kbuf);                              
 94         return err;                               
 95 }                                                 
 96                                                   
 97 static ssize_t hostaudio_write(struct file *fi    
 98                                size_t count, l    
 99 {                                                 
100         struct hostaudio_state *state = file->    
101         void *kbuf;                               
102         int err;                                  
103                                                   
104 #ifdef DEBUG                                      
105         printk(KERN_DEBUG "hostaudio: write ca    
106 #endif                                            
107                                                   
108         kbuf = memdup_user(buffer, count);        
109         if (IS_ERR(kbuf))                         
110                 return PTR_ERR(kbuf);             
111                                                   
112         err = os_write_file(state->fd, kbuf, c    
113         if (err < 0)                              
114                 goto out;                         
115         *ppos += err;                             
116                                                   
117  out:                                             
118         kfree(kbuf);                              
119         return err;                               
120 }                                                 
121                                                   
122 static __poll_t hostaudio_poll(struct file *fi    
123                                 struct poll_ta    
124 {                                                 
125 #ifdef DEBUG                                      
126         printk(KERN_DEBUG "hostaudio: poll cal    
127 #endif                                            
128                                                   
129         return 0;                                 
130 }                                                 
131                                                   
132 static long hostaudio_ioctl(struct file *file,    
133                            unsigned int cmd, u    
134 {                                                 
135         struct hostaudio_state *state = file->    
136         unsigned long data = 0;                   
137         int err;                                  
138                                                   
139 #ifdef DEBUG                                      
140         printk(KERN_DEBUG "hostaudio: ioctl ca    
141 #endif                                            
142         switch(cmd){                              
143         case SNDCTL_DSP_SPEED:                    
144         case SNDCTL_DSP_STEREO:                   
145         case SNDCTL_DSP_GETBLKSIZE:               
146         case SNDCTL_DSP_CHANNELS:                 
147         case SNDCTL_DSP_SUBDIVIDE:                
148         case SNDCTL_DSP_SETFRAGMENT:              
149                 if (get_user(data, (int __user    
150                         return -EFAULT;           
151                 break;                            
152         default:                                  
153                 break;                            
154         }                                         
155                                                   
156         err = os_ioctl_generic(state->fd, cmd,    
157                                                   
158         switch(cmd){                              
159         case SNDCTL_DSP_SPEED:                    
160         case SNDCTL_DSP_STEREO:                   
161         case SNDCTL_DSP_GETBLKSIZE:               
162         case SNDCTL_DSP_CHANNELS:                 
163         case SNDCTL_DSP_SUBDIVIDE:                
164         case SNDCTL_DSP_SETFRAGMENT:              
165                 if (put_user(data, (int __user    
166                         return -EFAULT;           
167                 break;                            
168         default:                                  
169                 break;                            
170         }                                         
171                                                   
172         return err;                               
173 }                                                 
174                                                   
175 static int hostaudio_open(struct inode *inode,    
176 {                                                 
177         struct hostaudio_state *state;            
178         int r = 0, w = 0;                         
179         int ret;                                  
180                                                   
181 #ifdef DEBUG                                      
182         kernel_param_lock(THIS_MODULE);           
183         printk(KERN_DEBUG "hostaudio: open cal    
184         kernel_param_unlock(THIS_MODULE);         
185 #endif                                            
186                                                   
187         state = kmalloc(sizeof(struct hostaudi    
188         if (state == NULL)                        
189                 return -ENOMEM;                   
190                                                   
191         if (file->f_mode & FMODE_READ)            
192                 r = 1;                            
193         if (file->f_mode & FMODE_WRITE)           
194                 w = 1;                            
195                                                   
196         kernel_param_lock(THIS_MODULE);           
197         mutex_lock(&hostaudio_mutex);             
198         ret = os_open_file(dsp, of_set_rw(OPEN    
199         mutex_unlock(&hostaudio_mutex);           
200         kernel_param_unlock(THIS_MODULE);         
201                                                   
202         if (ret < 0) {                            
203                 kfree(state);                     
204                 return ret;                       
205         }                                         
206         state->fd = ret;                          
207         file->private_data = state;               
208         return 0;                                 
209 }                                                 
210                                                   
211 static int hostaudio_release(struct inode *ino    
212 {                                                 
213         struct hostaudio_state *state = file->    
214                                                   
215 #ifdef DEBUG                                      
216         printk(KERN_DEBUG "hostaudio: release     
217 #endif                                            
218         os_close_file(state->fd);                 
219         kfree(state);                             
220                                                   
221         return 0;                                 
222 }                                                 
223                                                   
224 /* /dev/mixer file operations */                  
225                                                   
226 static long hostmixer_ioctl_mixdev(struct file    
227                                   unsigned int    
228 {                                                 
229         struct hostmixer_state *state = file->    
230                                                   
231 #ifdef DEBUG                                      
232         printk(KERN_DEBUG "hostmixer: ioctl ca    
233 #endif                                            
234                                                   
235         return os_ioctl_generic(state->fd, cmd    
236 }                                                 
237                                                   
238 static int hostmixer_open_mixdev(struct inode     
239 {                                                 
240         struct hostmixer_state *state;            
241         int r = 0, w = 0;                         
242         int ret;                                  
243                                                   
244 #ifdef DEBUG                                      
245         printk(KERN_DEBUG "hostmixer: open cal    
246 #endif                                            
247                                                   
248         state = kmalloc(sizeof(struct hostmixe    
249         if (state == NULL)                        
250                 return -ENOMEM;                   
251                                                   
252         if (file->f_mode & FMODE_READ)            
253                 r = 1;                            
254         if (file->f_mode & FMODE_WRITE)           
255                 w = 1;                            
256                                                   
257         kernel_param_lock(THIS_MODULE);           
258         mutex_lock(&hostaudio_mutex);             
259         ret = os_open_file(mixer, of_set_rw(OP    
260         mutex_unlock(&hostaudio_mutex);           
261         kernel_param_unlock(THIS_MODULE);         
262                                                   
263         if (ret < 0) {                            
264                 kernel_param_lock(THIS_MODULE)    
265                 printk(KERN_ERR "hostaudio_ope    
266                        "err = %d\n", dsp, -ret    
267                 kernel_param_unlock(THIS_MODUL    
268                 kfree(state);                     
269                 return ret;                       
270         }                                         
271                                                   
272         file->private_data = state;               
273         return 0;                                 
274 }                                                 
275                                                   
276 static int hostmixer_release(struct inode *ino    
277 {                                                 
278         struct hostmixer_state *state = file->    
279                                                   
280 #ifdef DEBUG                                      
281         printk(KERN_DEBUG "hostmixer: release     
282 #endif                                            
283                                                   
284         os_close_file(state->fd);                 
285         kfree(state);                             
286                                                   
287         return 0;                                 
288 }                                                 
289                                                   
290 /* kernel module operations */                    
291                                                   
292 static const struct file_operations hostaudio_    
293         .owner          = THIS_MODULE,            
294         .llseek         = no_llseek,              
295         .read           = hostaudio_read,         
296         .write          = hostaudio_write,        
297         .poll           = hostaudio_poll,         
298         .unlocked_ioctl = hostaudio_ioctl,        
299         .compat_ioctl   = compat_ptr_ioctl,       
300         .mmap           = NULL,                   
301         .open           = hostaudio_open,         
302         .release        = hostaudio_release,      
303 };                                                
304                                                   
305 static const struct file_operations hostmixer_    
306         .owner          = THIS_MODULE,            
307         .llseek         = no_llseek,              
308         .unlocked_ioctl = hostmixer_ioctl_mixd    
309         .open           = hostmixer_open_mixde    
310         .release        = hostmixer_release,      
311 };                                                
312                                                   
313 static struct {                                   
314         int dev_audio;                            
315         int dev_mixer;                            
316 } module_data;                                    
317                                                   
318 MODULE_AUTHOR("Steve Schmidtke");                 
319 MODULE_DESCRIPTION("UML Audio Relay");            
320 MODULE_LICENSE("GPL");                            
321                                                   
322 static int __init hostaudio_init_module(void)     
323 {                                                 
324         kernel_param_lock(THIS_MODULE);           
325         printk(KERN_INFO "UML Audio Relay (hos    
326                dsp, mixer);                       
327         kernel_param_unlock(THIS_MODULE);         
328                                                   
329         module_data.dev_audio = register_sound    
330         if (module_data.dev_audio < 0) {          
331                 printk(KERN_ERR "hostaudio: co    
332                 return -ENODEV;                   
333         }                                         
334                                                   
335         module_data.dev_mixer = register_sound    
336         if (module_data.dev_mixer < 0) {          
337                 printk(KERN_ERR "hostmixer: co    
338                        "device!\n");              
339                 unregister_sound_dsp(module_da    
340                 return -ENODEV;                   
341         }                                         
342                                                   
343         return 0;                                 
344 }                                                 
345                                                   
346 static void __exit hostaudio_cleanup_module (v    
347 {                                                 
348         unregister_sound_mixer(module_data.dev    
349         unregister_sound_dsp(module_data.dev_a    
350 }                                                 
351                                                   
352 module_init(hostaudio_init_module);               
353 module_exit(hostaudio_cleanup_module);            
354                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php