drm/amdgpu: fix error checking in amdgpu_read_mm_registers for nv
[platform/kernel/linux-starfive.git] / sound / core / rawmidi.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  Abstract layer for MIDI v1.0 stream
4  *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
5  */
6
7 #include <sound/core.h>
8 #include <linux/major.h>
9 #include <linux/init.h>
10 #include <linux/sched/signal.h>
11 #include <linux/slab.h>
12 #include <linux/time.h>
13 #include <linux/wait.h>
14 #include <linux/mutex.h>
15 #include <linux/module.h>
16 #include <linux/delay.h>
17 #include <linux/mm.h>
18 #include <linux/nospec.h>
19 #include <sound/rawmidi.h>
20 #include <sound/info.h>
21 #include <sound/control.h>
22 #include <sound/minors.h>
23 #include <sound/initval.h>
24
25 MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
26 MODULE_DESCRIPTION("Midlevel RawMidi code for ALSA.");
27 MODULE_LICENSE("GPL");
28
29 #ifdef CONFIG_SND_OSSEMUL
30 static int midi_map[SNDRV_CARDS];
31 static int amidi_map[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = 1};
32 module_param_array(midi_map, int, NULL, 0444);
33 MODULE_PARM_DESC(midi_map, "Raw MIDI device number assigned to 1st OSS device.");
34 module_param_array(amidi_map, int, NULL, 0444);
35 MODULE_PARM_DESC(amidi_map, "Raw MIDI device number assigned to 2nd OSS device.");
36 #endif /* CONFIG_SND_OSSEMUL */
37
38 static int snd_rawmidi_free(struct snd_rawmidi *rmidi);
39 static int snd_rawmidi_dev_free(struct snd_device *device);
40 static int snd_rawmidi_dev_register(struct snd_device *device);
41 static int snd_rawmidi_dev_disconnect(struct snd_device *device);
42
43 static LIST_HEAD(snd_rawmidi_devices);
44 static DEFINE_MUTEX(register_mutex);
45
46 #define rmidi_err(rmidi, fmt, args...) \
47         dev_err(&(rmidi)->dev, fmt, ##args)
48 #define rmidi_warn(rmidi, fmt, args...) \
49         dev_warn(&(rmidi)->dev, fmt, ##args)
50 #define rmidi_dbg(rmidi, fmt, args...) \
51         dev_dbg(&(rmidi)->dev, fmt, ##args)
52
53 struct snd_rawmidi_status32 {
54         s32 stream;
55         s32 tstamp_sec;                 /* Timestamp */
56         s32 tstamp_nsec;
57         u32 avail;                      /* available bytes */
58         u32 xruns;                      /* count of overruns since last status (in bytes) */
59         unsigned char reserved[16];     /* reserved for future use */
60 };
61
62 #define SNDRV_RAWMIDI_IOCTL_STATUS32    _IOWR('W', 0x20, struct snd_rawmidi_status32)
63
64 struct snd_rawmidi_status64 {
65         int stream;
66         u8 rsvd[4];                     /* alignment */
67         s64 tstamp_sec;                 /* Timestamp */
68         s64 tstamp_nsec;
69         size_t avail;                   /* available bytes */
70         size_t xruns;                   /* count of overruns since last status (in bytes) */
71         unsigned char reserved[16];     /* reserved for future use */
72 };
73
74 #define SNDRV_RAWMIDI_IOCTL_STATUS64    _IOWR('W', 0x20, struct snd_rawmidi_status64)
75
76 static struct snd_rawmidi *snd_rawmidi_search(struct snd_card *card, int device)
77 {
78         struct snd_rawmidi *rawmidi;
79
80         list_for_each_entry(rawmidi, &snd_rawmidi_devices, list)
81                 if (rawmidi->card == card && rawmidi->device == device)
82                         return rawmidi;
83         return NULL;
84 }
85
86 static inline unsigned short snd_rawmidi_file_flags(struct file *file)
87 {
88         switch (file->f_mode & (FMODE_READ | FMODE_WRITE)) {
89         case FMODE_WRITE:
90                 return SNDRV_RAWMIDI_LFLG_OUTPUT;
91         case FMODE_READ:
92                 return SNDRV_RAWMIDI_LFLG_INPUT;
93         default:
94                 return SNDRV_RAWMIDI_LFLG_OPEN;
95         }
96 }
97
98 static inline bool __snd_rawmidi_ready(struct snd_rawmidi_runtime *runtime)
99 {
100         return runtime->avail >= runtime->avail_min;
101 }
102
103 static bool snd_rawmidi_ready(struct snd_rawmidi_substream *substream)
104 {
105         unsigned long flags;
106         bool ready;
107
108         spin_lock_irqsave(&substream->lock, flags);
109         ready = __snd_rawmidi_ready(substream->runtime);
110         spin_unlock_irqrestore(&substream->lock, flags);
111         return ready;
112 }
113
114 static inline int snd_rawmidi_ready_append(struct snd_rawmidi_substream *substream,
115                                            size_t count)
116 {
117         struct snd_rawmidi_runtime *runtime = substream->runtime;
118
119         return runtime->avail >= runtime->avail_min &&
120                (!substream->append || runtime->avail >= count);
121 }
122
123 static void snd_rawmidi_input_event_work(struct work_struct *work)
124 {
125         struct snd_rawmidi_runtime *runtime =
126                 container_of(work, struct snd_rawmidi_runtime, event_work);
127
128         if (runtime->event)
129                 runtime->event(runtime->substream);
130 }
131
132 /* buffer refcount management: call with substream->lock held */
133 static inline void snd_rawmidi_buffer_ref(struct snd_rawmidi_runtime *runtime)
134 {
135         runtime->buffer_ref++;
136 }
137
138 static inline void snd_rawmidi_buffer_unref(struct snd_rawmidi_runtime *runtime)
139 {
140         runtime->buffer_ref--;
141 }
142
143 static void snd_rawmidi_buffer_ref_sync(struct snd_rawmidi_substream *substream)
144 {
145         int loop = HZ;
146
147         spin_lock_irq(&substream->lock);
148         while (substream->runtime->buffer_ref) {
149                 spin_unlock_irq(&substream->lock);
150                 if (!--loop) {
151                         rmidi_err(substream->rmidi, "Buffer ref sync timeout\n");
152                         return;
153                 }
154                 schedule_timeout_uninterruptible(1);
155                 spin_lock_irq(&substream->lock);
156         }
157         spin_unlock_irq(&substream->lock);
158 }
159
160 static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
161 {
162         struct snd_rawmidi_runtime *runtime;
163
164         runtime = kzalloc(sizeof(*runtime), GFP_KERNEL);
165         if (!runtime)
166                 return -ENOMEM;
167         runtime->substream = substream;
168         init_waitqueue_head(&runtime->sleep);
169         INIT_WORK(&runtime->event_work, snd_rawmidi_input_event_work);
170         runtime->event = NULL;
171         runtime->buffer_size = PAGE_SIZE;
172         runtime->avail_min = 1;
173         if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
174                 runtime->avail = 0;
175         else
176                 runtime->avail = runtime->buffer_size;
177         runtime->buffer = kvzalloc(runtime->buffer_size, GFP_KERNEL);
178         if (!runtime->buffer) {
179                 kfree(runtime);
180                 return -ENOMEM;
181         }
182         runtime->appl_ptr = runtime->hw_ptr = 0;
183         substream->runtime = runtime;
184         return 0;
185 }
186
187 static int snd_rawmidi_runtime_free(struct snd_rawmidi_substream *substream)
188 {
189         struct snd_rawmidi_runtime *runtime = substream->runtime;
190
191         kvfree(runtime->buffer);
192         kfree(runtime);
193         substream->runtime = NULL;
194         return 0;
195 }
196
197 static inline void snd_rawmidi_output_trigger(struct snd_rawmidi_substream *substream, int up)
198 {
199         if (!substream->opened)
200                 return;
201         substream->ops->trigger(substream, up);
202 }
203
204 static void snd_rawmidi_input_trigger(struct snd_rawmidi_substream *substream, int up)
205 {
206         if (!substream->opened)
207                 return;
208         substream->ops->trigger(substream, up);
209         if (!up)
210                 cancel_work_sync(&substream->runtime->event_work);
211 }
212
213 static void __reset_runtime_ptrs(struct snd_rawmidi_runtime *runtime,
214                                  bool is_input)
215 {
216         runtime->drain = 0;
217         runtime->appl_ptr = runtime->hw_ptr = 0;
218         runtime->avail = is_input ? 0 : runtime->buffer_size;
219 }
220
221 static void reset_runtime_ptrs(struct snd_rawmidi_substream *substream,
222                                bool is_input)
223 {
224         unsigned long flags;
225
226         spin_lock_irqsave(&substream->lock, flags);
227         if (substream->opened && substream->runtime)
228                 __reset_runtime_ptrs(substream->runtime, is_input);
229         spin_unlock_irqrestore(&substream->lock, flags);
230 }
231
232 int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream)
233 {
234         snd_rawmidi_output_trigger(substream, 0);
235         reset_runtime_ptrs(substream, false);
236         return 0;
237 }
238 EXPORT_SYMBOL(snd_rawmidi_drop_output);
239
240 int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream)
241 {
242         int err = 0;
243         long timeout;
244         struct snd_rawmidi_runtime *runtime;
245
246         spin_lock_irq(&substream->lock);
247         runtime = substream->runtime;
248         if (!substream->opened || !runtime || !runtime->buffer) {
249                 err = -EINVAL;
250         } else {
251                 snd_rawmidi_buffer_ref(runtime);
252                 runtime->drain = 1;
253         }
254         spin_unlock_irq(&substream->lock);
255         if (err < 0)
256                 return err;
257
258         timeout = wait_event_interruptible_timeout(runtime->sleep,
259                                 (runtime->avail >= runtime->buffer_size),
260                                 10*HZ);
261
262         spin_lock_irq(&substream->lock);
263         if (signal_pending(current))
264                 err = -ERESTARTSYS;
265         if (runtime->avail < runtime->buffer_size && !timeout) {
266                 rmidi_warn(substream->rmidi,
267                            "rawmidi drain error (avail = %li, buffer_size = %li)\n",
268                            (long)runtime->avail, (long)runtime->buffer_size);
269                 err = -EIO;
270         }
271         runtime->drain = 0;
272         spin_unlock_irq(&substream->lock);
273
274         if (err != -ERESTARTSYS) {
275                 /* we need wait a while to make sure that Tx FIFOs are empty */
276                 if (substream->ops->drain)
277                         substream->ops->drain(substream);
278                 else
279                         msleep(50);
280                 snd_rawmidi_drop_output(substream);
281         }
282
283         spin_lock_irq(&substream->lock);
284         snd_rawmidi_buffer_unref(runtime);
285         spin_unlock_irq(&substream->lock);
286
287         return err;
288 }
289 EXPORT_SYMBOL(snd_rawmidi_drain_output);
290
291 int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream)
292 {
293         snd_rawmidi_input_trigger(substream, 0);
294         reset_runtime_ptrs(substream, true);
295         return 0;
296 }
297 EXPORT_SYMBOL(snd_rawmidi_drain_input);
298
299 /* look for an available substream for the given stream direction;
300  * if a specific subdevice is given, try to assign it
301  */
302 static int assign_substream(struct snd_rawmidi *rmidi, int subdevice,
303                             int stream, int mode,
304                             struct snd_rawmidi_substream **sub_ret)
305 {
306         struct snd_rawmidi_substream *substream;
307         struct snd_rawmidi_str *s = &rmidi->streams[stream];
308         static const unsigned int info_flags[2] = {
309                 [SNDRV_RAWMIDI_STREAM_OUTPUT] = SNDRV_RAWMIDI_INFO_OUTPUT,
310                 [SNDRV_RAWMIDI_STREAM_INPUT] = SNDRV_RAWMIDI_INFO_INPUT,
311         };
312
313         if (!(rmidi->info_flags & info_flags[stream]))
314                 return -ENXIO;
315         if (subdevice >= 0 && subdevice >= s->substream_count)
316                 return -ENODEV;
317
318         list_for_each_entry(substream, &s->substreams, list) {
319                 if (substream->opened) {
320                         if (stream == SNDRV_RAWMIDI_STREAM_INPUT ||
321                             !(mode & SNDRV_RAWMIDI_LFLG_APPEND) ||
322                             !substream->append)
323                                 continue;
324                 }
325                 if (subdevice < 0 || subdevice == substream->number) {
326                         *sub_ret = substream;
327                         return 0;
328                 }
329         }
330         return -EAGAIN;
331 }
332
333 /* open and do ref-counting for the given substream */
334 static int open_substream(struct snd_rawmidi *rmidi,
335                           struct snd_rawmidi_substream *substream,
336                           int mode)
337 {
338         int err;
339
340         if (substream->use_count == 0) {
341                 err = snd_rawmidi_runtime_create(substream);
342                 if (err < 0)
343                         return err;
344                 err = substream->ops->open(substream);
345                 if (err < 0) {
346                         snd_rawmidi_runtime_free(substream);
347                         return err;
348                 }
349                 spin_lock_irq(&substream->lock);
350                 substream->opened = 1;
351                 substream->active_sensing = 0;
352                 if (mode & SNDRV_RAWMIDI_LFLG_APPEND)
353                         substream->append = 1;
354                 substream->pid = get_pid(task_pid(current));
355                 rmidi->streams[substream->stream].substream_opened++;
356                 spin_unlock_irq(&substream->lock);
357         }
358         substream->use_count++;
359         return 0;
360 }
361
362 static void close_substream(struct snd_rawmidi *rmidi,
363                             struct snd_rawmidi_substream *substream,
364                             int cleanup);
365
366 static int rawmidi_open_priv(struct snd_rawmidi *rmidi, int subdevice, int mode,
367                              struct snd_rawmidi_file *rfile)
368 {
369         struct snd_rawmidi_substream *sinput = NULL, *soutput = NULL;
370         int err;
371
372         rfile->input = rfile->output = NULL;
373         if (mode & SNDRV_RAWMIDI_LFLG_INPUT) {
374                 err = assign_substream(rmidi, subdevice,
375                                        SNDRV_RAWMIDI_STREAM_INPUT,
376                                        mode, &sinput);
377                 if (err < 0)
378                         return err;
379         }
380         if (mode & SNDRV_RAWMIDI_LFLG_OUTPUT) {
381                 err = assign_substream(rmidi, subdevice,
382                                        SNDRV_RAWMIDI_STREAM_OUTPUT,
383                                        mode, &soutput);
384                 if (err < 0)
385                         return err;
386         }
387
388         if (sinput) {
389                 err = open_substream(rmidi, sinput, mode);
390                 if (err < 0)
391                         return err;
392         }
393         if (soutput) {
394                 err = open_substream(rmidi, soutput, mode);
395                 if (err < 0) {
396                         if (sinput)
397                                 close_substream(rmidi, sinput, 0);
398                         return err;
399                 }
400         }
401
402         rfile->rmidi = rmidi;
403         rfile->input = sinput;
404         rfile->output = soutput;
405         return 0;
406 }
407
408 /* called from sound/core/seq/seq_midi.c */
409 int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
410                             int mode, struct snd_rawmidi_file *rfile)
411 {
412         struct snd_rawmidi *rmidi;
413         int err = 0;
414
415         if (snd_BUG_ON(!rfile))
416                 return -EINVAL;
417
418         mutex_lock(&register_mutex);
419         rmidi = snd_rawmidi_search(card, device);
420         if (!rmidi)
421                 err = -ENODEV;
422         else if (!try_module_get(rmidi->card->module))
423                 err = -ENXIO;
424         mutex_unlock(&register_mutex);
425         if (err < 0)
426                 return err;
427
428         mutex_lock(&rmidi->open_mutex);
429         err = rawmidi_open_priv(rmidi, subdevice, mode, rfile);
430         mutex_unlock(&rmidi->open_mutex);
431         if (err < 0)
432                 module_put(rmidi->card->module);
433         return err;
434 }
435 EXPORT_SYMBOL(snd_rawmidi_kernel_open);
436
437 static int snd_rawmidi_open(struct inode *inode, struct file *file)
438 {
439         int maj = imajor(inode);
440         struct snd_card *card;
441         int subdevice;
442         unsigned short fflags;
443         int err;
444         struct snd_rawmidi *rmidi;
445         struct snd_rawmidi_file *rawmidi_file = NULL;
446         wait_queue_entry_t wait;
447
448         if ((file->f_flags & O_APPEND) && !(file->f_flags & O_NONBLOCK))
449                 return -EINVAL;         /* invalid combination */
450
451         err = stream_open(inode, file);
452         if (err < 0)
453                 return err;
454
455         if (maj == snd_major) {
456                 rmidi = snd_lookup_minor_data(iminor(inode),
457                                               SNDRV_DEVICE_TYPE_RAWMIDI);
458 #ifdef CONFIG_SND_OSSEMUL
459         } else if (maj == SOUND_MAJOR) {
460                 rmidi = snd_lookup_oss_minor_data(iminor(inode),
461                                                   SNDRV_OSS_DEVICE_TYPE_MIDI);
462 #endif
463         } else
464                 return -ENXIO;
465
466         if (rmidi == NULL)
467                 return -ENODEV;
468
469         if (!try_module_get(rmidi->card->module)) {
470                 snd_card_unref(rmidi->card);
471                 return -ENXIO;
472         }
473
474         mutex_lock(&rmidi->open_mutex);
475         card = rmidi->card;
476         err = snd_card_file_add(card, file);
477         if (err < 0)
478                 goto __error_card;
479         fflags = snd_rawmidi_file_flags(file);
480         if ((file->f_flags & O_APPEND) || maj == SOUND_MAJOR) /* OSS emul? */
481                 fflags |= SNDRV_RAWMIDI_LFLG_APPEND;
482         rawmidi_file = kmalloc(sizeof(*rawmidi_file), GFP_KERNEL);
483         if (rawmidi_file == NULL) {
484                 err = -ENOMEM;
485                 goto __error;
486         }
487         rawmidi_file->user_pversion = 0;
488         init_waitqueue_entry(&wait, current);
489         add_wait_queue(&rmidi->open_wait, &wait);
490         while (1) {
491                 subdevice = snd_ctl_get_preferred_subdevice(card, SND_CTL_SUBDEV_RAWMIDI);
492                 err = rawmidi_open_priv(rmidi, subdevice, fflags, rawmidi_file);
493                 if (err >= 0)
494                         break;
495                 if (err == -EAGAIN) {
496                         if (file->f_flags & O_NONBLOCK) {
497                                 err = -EBUSY;
498                                 break;
499                         }
500                 } else
501                         break;
502                 set_current_state(TASK_INTERRUPTIBLE);
503                 mutex_unlock(&rmidi->open_mutex);
504                 schedule();
505                 mutex_lock(&rmidi->open_mutex);
506                 if (rmidi->card->shutdown) {
507                         err = -ENODEV;
508                         break;
509                 }
510                 if (signal_pending(current)) {
511                         err = -ERESTARTSYS;
512                         break;
513                 }
514         }
515         remove_wait_queue(&rmidi->open_wait, &wait);
516         if (err < 0) {
517                 kfree(rawmidi_file);
518                 goto __error;
519         }
520 #ifdef CONFIG_SND_OSSEMUL
521         if (rawmidi_file->input && rawmidi_file->input->runtime)
522                 rawmidi_file->input->runtime->oss = (maj == SOUND_MAJOR);
523         if (rawmidi_file->output && rawmidi_file->output->runtime)
524                 rawmidi_file->output->runtime->oss = (maj == SOUND_MAJOR);
525 #endif
526         file->private_data = rawmidi_file;
527         mutex_unlock(&rmidi->open_mutex);
528         snd_card_unref(rmidi->card);
529         return 0;
530
531  __error:
532         snd_card_file_remove(card, file);
533  __error_card:
534         mutex_unlock(&rmidi->open_mutex);
535         module_put(rmidi->card->module);
536         snd_card_unref(rmidi->card);
537         return err;
538 }
539
540 static void close_substream(struct snd_rawmidi *rmidi,
541                             struct snd_rawmidi_substream *substream,
542                             int cleanup)
543 {
544         if (--substream->use_count)
545                 return;
546
547         if (cleanup) {
548                 if (substream->stream == SNDRV_RAWMIDI_STREAM_INPUT)
549                         snd_rawmidi_input_trigger(substream, 0);
550                 else {
551                         if (substream->active_sensing) {
552                                 unsigned char buf = 0xfe;
553                                 /* sending single active sensing message
554                                  * to shut the device up
555                                  */
556                                 snd_rawmidi_kernel_write(substream, &buf, 1);
557                         }
558                         if (snd_rawmidi_drain_output(substream) == -ERESTARTSYS)
559                                 snd_rawmidi_output_trigger(substream, 0);
560                 }
561                 snd_rawmidi_buffer_ref_sync(substream);
562         }
563         spin_lock_irq(&substream->lock);
564         substream->opened = 0;
565         substream->append = 0;
566         spin_unlock_irq(&substream->lock);
567         substream->ops->close(substream);
568         if (substream->runtime->private_free)
569                 substream->runtime->private_free(substream);
570         snd_rawmidi_runtime_free(substream);
571         put_pid(substream->pid);
572         substream->pid = NULL;
573         rmidi->streams[substream->stream].substream_opened--;
574 }
575
576 static void rawmidi_release_priv(struct snd_rawmidi_file *rfile)
577 {
578         struct snd_rawmidi *rmidi;
579
580         rmidi = rfile->rmidi;
581         mutex_lock(&rmidi->open_mutex);
582         if (rfile->input) {
583                 close_substream(rmidi, rfile->input, 1);
584                 rfile->input = NULL;
585         }
586         if (rfile->output) {
587                 close_substream(rmidi, rfile->output, 1);
588                 rfile->output = NULL;
589         }
590         rfile->rmidi = NULL;
591         mutex_unlock(&rmidi->open_mutex);
592         wake_up(&rmidi->open_wait);
593 }
594
595 /* called from sound/core/seq/seq_midi.c */
596 int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile)
597 {
598         struct snd_rawmidi *rmidi;
599
600         if (snd_BUG_ON(!rfile))
601                 return -ENXIO;
602
603         rmidi = rfile->rmidi;
604         rawmidi_release_priv(rfile);
605         module_put(rmidi->card->module);
606         return 0;
607 }
608 EXPORT_SYMBOL(snd_rawmidi_kernel_release);
609
610 static int snd_rawmidi_release(struct inode *inode, struct file *file)
611 {
612         struct snd_rawmidi_file *rfile;
613         struct snd_rawmidi *rmidi;
614         struct module *module;
615
616         rfile = file->private_data;
617         rmidi = rfile->rmidi;
618         rawmidi_release_priv(rfile);
619         kfree(rfile);
620         module = rmidi->card->module;
621         snd_card_file_remove(rmidi->card, file);
622         module_put(module);
623         return 0;
624 }
625
626 static int snd_rawmidi_info(struct snd_rawmidi_substream *substream,
627                             struct snd_rawmidi_info *info)
628 {
629         struct snd_rawmidi *rmidi;
630
631         if (substream == NULL)
632                 return -ENODEV;
633         rmidi = substream->rmidi;
634         memset(info, 0, sizeof(*info));
635         info->card = rmidi->card->number;
636         info->device = rmidi->device;
637         info->subdevice = substream->number;
638         info->stream = substream->stream;
639         info->flags = rmidi->info_flags;
640         strcpy(info->id, rmidi->id);
641         strcpy(info->name, rmidi->name);
642         strcpy(info->subname, substream->name);
643         info->subdevices_count = substream->pstr->substream_count;
644         info->subdevices_avail = (substream->pstr->substream_count -
645                                   substream->pstr->substream_opened);
646         return 0;
647 }
648
649 static int snd_rawmidi_info_user(struct snd_rawmidi_substream *substream,
650                                  struct snd_rawmidi_info __user *_info)
651 {
652         struct snd_rawmidi_info info;
653         int err;
654
655         err = snd_rawmidi_info(substream, &info);
656         if (err < 0)
657                 return err;
658         if (copy_to_user(_info, &info, sizeof(struct snd_rawmidi_info)))
659                 return -EFAULT;
660         return 0;
661 }
662
663 static int __snd_rawmidi_info_select(struct snd_card *card,
664                                      struct snd_rawmidi_info *info)
665 {
666         struct snd_rawmidi *rmidi;
667         struct snd_rawmidi_str *pstr;
668         struct snd_rawmidi_substream *substream;
669
670         rmidi = snd_rawmidi_search(card, info->device);
671         if (!rmidi)
672                 return -ENXIO;
673         if (info->stream < 0 || info->stream > 1)
674                 return -EINVAL;
675         info->stream = array_index_nospec(info->stream, 2);
676         pstr = &rmidi->streams[info->stream];
677         if (pstr->substream_count == 0)
678                 return -ENOENT;
679         if (info->subdevice >= pstr->substream_count)
680                 return -ENXIO;
681         list_for_each_entry(substream, &pstr->substreams, list) {
682                 if ((unsigned int)substream->number == info->subdevice)
683                         return snd_rawmidi_info(substream, info);
684         }
685         return -ENXIO;
686 }
687
688 int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info)
689 {
690         int ret;
691
692         mutex_lock(&register_mutex);
693         ret = __snd_rawmidi_info_select(card, info);
694         mutex_unlock(&register_mutex);
695         return ret;
696 }
697 EXPORT_SYMBOL(snd_rawmidi_info_select);
698
699 static int snd_rawmidi_info_select_user(struct snd_card *card,
700                                         struct snd_rawmidi_info __user *_info)
701 {
702         int err;
703         struct snd_rawmidi_info info;
704
705         if (get_user(info.device, &_info->device))
706                 return -EFAULT;
707         if (get_user(info.stream, &_info->stream))
708                 return -EFAULT;
709         if (get_user(info.subdevice, &_info->subdevice))
710                 return -EFAULT;
711         err = snd_rawmidi_info_select(card, &info);
712         if (err < 0)
713                 return err;
714         if (copy_to_user(_info, &info, sizeof(struct snd_rawmidi_info)))
715                 return -EFAULT;
716         return 0;
717 }
718
719 static int resize_runtime_buffer(struct snd_rawmidi_substream *substream,
720                                  struct snd_rawmidi_params *params,
721                                  bool is_input)
722 {
723         struct snd_rawmidi_runtime *runtime = substream->runtime;
724         char *newbuf, *oldbuf;
725         unsigned int framing = params->mode & SNDRV_RAWMIDI_MODE_FRAMING_MASK;
726
727         if (params->buffer_size < 32 || params->buffer_size > 1024L * 1024L)
728                 return -EINVAL;
729         if (framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP && (params->buffer_size & 0x1f) != 0)
730                 return -EINVAL;
731         if (params->avail_min < 1 || params->avail_min > params->buffer_size)
732                 return -EINVAL;
733         if (params->buffer_size != runtime->buffer_size) {
734                 newbuf = kvzalloc(params->buffer_size, GFP_KERNEL);
735                 if (!newbuf)
736                         return -ENOMEM;
737                 spin_lock_irq(&substream->lock);
738                 if (runtime->buffer_ref) {
739                         spin_unlock_irq(&substream->lock);
740                         kvfree(newbuf);
741                         return -EBUSY;
742                 }
743                 oldbuf = runtime->buffer;
744                 runtime->buffer = newbuf;
745                 runtime->buffer_size = params->buffer_size;
746                 __reset_runtime_ptrs(runtime, is_input);
747                 spin_unlock_irq(&substream->lock);
748                 kvfree(oldbuf);
749         }
750         runtime->avail_min = params->avail_min;
751         return 0;
752 }
753
754 int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
755                               struct snd_rawmidi_params *params)
756 {
757         int err;
758
759         snd_rawmidi_drain_output(substream);
760         mutex_lock(&substream->rmidi->open_mutex);
761         if (substream->append && substream->use_count > 1)
762                 err = -EBUSY;
763         else
764                 err = resize_runtime_buffer(substream, params, false);
765
766         if (!err)
767                 substream->active_sensing = !params->no_active_sensing;
768         mutex_unlock(&substream->rmidi->open_mutex);
769         return err;
770 }
771 EXPORT_SYMBOL(snd_rawmidi_output_params);
772
773 int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
774                              struct snd_rawmidi_params *params)
775 {
776         unsigned int framing = params->mode & SNDRV_RAWMIDI_MODE_FRAMING_MASK;
777         unsigned int clock_type = params->mode & SNDRV_RAWMIDI_MODE_CLOCK_MASK;
778         int err;
779
780         snd_rawmidi_drain_input(substream);
781         mutex_lock(&substream->rmidi->open_mutex);
782         if (framing == SNDRV_RAWMIDI_MODE_FRAMING_NONE && clock_type != SNDRV_RAWMIDI_MODE_CLOCK_NONE)
783                 err = -EINVAL;
784         else if (clock_type > SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC_RAW)
785                 err = -EINVAL;
786         else if (framing > SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP)
787                 err = -EINVAL;
788         else
789                 err = resize_runtime_buffer(substream, params, true);
790
791         if (!err) {
792                 substream->framing = framing;
793                 substream->clock_type = clock_type;
794         }
795         mutex_unlock(&substream->rmidi->open_mutex);
796         return 0;
797 }
798 EXPORT_SYMBOL(snd_rawmidi_input_params);
799
800 static int snd_rawmidi_output_status(struct snd_rawmidi_substream *substream,
801                                      struct snd_rawmidi_status64 *status)
802 {
803         struct snd_rawmidi_runtime *runtime = substream->runtime;
804
805         memset(status, 0, sizeof(*status));
806         status->stream = SNDRV_RAWMIDI_STREAM_OUTPUT;
807         spin_lock_irq(&substream->lock);
808         status->avail = runtime->avail;
809         spin_unlock_irq(&substream->lock);
810         return 0;
811 }
812
813 static int snd_rawmidi_input_status(struct snd_rawmidi_substream *substream,
814                                     struct snd_rawmidi_status64 *status)
815 {
816         struct snd_rawmidi_runtime *runtime = substream->runtime;
817
818         memset(status, 0, sizeof(*status));
819         status->stream = SNDRV_RAWMIDI_STREAM_INPUT;
820         spin_lock_irq(&substream->lock);
821         status->avail = runtime->avail;
822         status->xruns = runtime->xruns;
823         runtime->xruns = 0;
824         spin_unlock_irq(&substream->lock);
825         return 0;
826 }
827
828 static int snd_rawmidi_ioctl_status32(struct snd_rawmidi_file *rfile,
829                                       struct snd_rawmidi_status32 __user *argp)
830 {
831         int err = 0;
832         struct snd_rawmidi_status32 __user *status = argp;
833         struct snd_rawmidi_status32 status32;
834         struct snd_rawmidi_status64 status64;
835
836         if (copy_from_user(&status32, argp,
837                            sizeof(struct snd_rawmidi_status32)))
838                 return -EFAULT;
839
840         switch (status32.stream) {
841         case SNDRV_RAWMIDI_STREAM_OUTPUT:
842                 if (rfile->output == NULL)
843                         return -EINVAL;
844                 err = snd_rawmidi_output_status(rfile->output, &status64);
845                 break;
846         case SNDRV_RAWMIDI_STREAM_INPUT:
847                 if (rfile->input == NULL)
848                         return -EINVAL;
849                 err = snd_rawmidi_input_status(rfile->input, &status64);
850                 break;
851         default:
852                 return -EINVAL;
853         }
854         if (err < 0)
855                 return err;
856
857         status32 = (struct snd_rawmidi_status32) {
858                 .stream = status64.stream,
859                 .tstamp_sec = status64.tstamp_sec,
860                 .tstamp_nsec = status64.tstamp_nsec,
861                 .avail = status64.avail,
862                 .xruns = status64.xruns,
863         };
864
865         if (copy_to_user(status, &status32, sizeof(*status)))
866                 return -EFAULT;
867
868         return 0;
869 }
870
871 static int snd_rawmidi_ioctl_status64(struct snd_rawmidi_file *rfile,
872                                       struct snd_rawmidi_status64 __user *argp)
873 {
874         int err = 0;
875         struct snd_rawmidi_status64 status;
876
877         if (copy_from_user(&status, argp, sizeof(struct snd_rawmidi_status64)))
878                 return -EFAULT;
879
880         switch (status.stream) {
881         case SNDRV_RAWMIDI_STREAM_OUTPUT:
882                 if (rfile->output == NULL)
883                         return -EINVAL;
884                 err = snd_rawmidi_output_status(rfile->output, &status);
885                 break;
886         case SNDRV_RAWMIDI_STREAM_INPUT:
887                 if (rfile->input == NULL)
888                         return -EINVAL;
889                 err = snd_rawmidi_input_status(rfile->input, &status);
890                 break;
891         default:
892                 return -EINVAL;
893         }
894         if (err < 0)
895                 return err;
896         if (copy_to_user(argp, &status,
897                          sizeof(struct snd_rawmidi_status64)))
898                 return -EFAULT;
899         return 0;
900 }
901
902 static long snd_rawmidi_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
903 {
904         struct snd_rawmidi_file *rfile;
905         void __user *argp = (void __user *)arg;
906
907         rfile = file->private_data;
908         if (((cmd >> 8) & 0xff) != 'W')
909                 return -ENOTTY;
910         switch (cmd) {
911         case SNDRV_RAWMIDI_IOCTL_PVERSION:
912                 return put_user(SNDRV_RAWMIDI_VERSION, (int __user *)argp) ? -EFAULT : 0;
913         case SNDRV_RAWMIDI_IOCTL_INFO:
914         {
915                 int stream;
916                 struct snd_rawmidi_info __user *info = argp;
917
918                 if (get_user(stream, &info->stream))
919                         return -EFAULT;
920                 switch (stream) {
921                 case SNDRV_RAWMIDI_STREAM_INPUT:
922                         return snd_rawmidi_info_user(rfile->input, info);
923                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
924                         return snd_rawmidi_info_user(rfile->output, info);
925                 default:
926                         return -EINVAL;
927                 }
928         }
929         case SNDRV_RAWMIDI_IOCTL_USER_PVERSION:
930                 if (get_user(rfile->user_pversion, (unsigned int __user *)arg))
931                         return -EFAULT;
932                 return 0;
933
934         case SNDRV_RAWMIDI_IOCTL_PARAMS:
935         {
936                 struct snd_rawmidi_params params;
937
938                 if (copy_from_user(&params, argp, sizeof(struct snd_rawmidi_params)))
939                         return -EFAULT;
940                 if (rfile->user_pversion < SNDRV_PROTOCOL_VERSION(2, 0, 2)) {
941                         params.mode = 0;
942                         memset(params.reserved, 0, sizeof(params.reserved));
943                 }
944                 switch (params.stream) {
945                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
946                         if (rfile->output == NULL)
947                                 return -EINVAL;
948                         return snd_rawmidi_output_params(rfile->output, &params);
949                 case SNDRV_RAWMIDI_STREAM_INPUT:
950                         if (rfile->input == NULL)
951                                 return -EINVAL;
952                         return snd_rawmidi_input_params(rfile->input, &params);
953                 default:
954                         return -EINVAL;
955                 }
956         }
957         case SNDRV_RAWMIDI_IOCTL_STATUS32:
958                 return snd_rawmidi_ioctl_status32(rfile, argp);
959         case SNDRV_RAWMIDI_IOCTL_STATUS64:
960                 return snd_rawmidi_ioctl_status64(rfile, argp);
961         case SNDRV_RAWMIDI_IOCTL_DROP:
962         {
963                 int val;
964
965                 if (get_user(val, (int __user *) argp))
966                         return -EFAULT;
967                 switch (val) {
968                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
969                         if (rfile->output == NULL)
970                                 return -EINVAL;
971                         return snd_rawmidi_drop_output(rfile->output);
972                 default:
973                         return -EINVAL;
974                 }
975         }
976         case SNDRV_RAWMIDI_IOCTL_DRAIN:
977         {
978                 int val;
979
980                 if (get_user(val, (int __user *) argp))
981                         return -EFAULT;
982                 switch (val) {
983                 case SNDRV_RAWMIDI_STREAM_OUTPUT:
984                         if (rfile->output == NULL)
985                                 return -EINVAL;
986                         return snd_rawmidi_drain_output(rfile->output);
987                 case SNDRV_RAWMIDI_STREAM_INPUT:
988                         if (rfile->input == NULL)
989                                 return -EINVAL;
990                         return snd_rawmidi_drain_input(rfile->input);
991                 default:
992                         return -EINVAL;
993                 }
994         }
995         default:
996                 rmidi_dbg(rfile->rmidi,
997                           "rawmidi: unknown command = 0x%x\n", cmd);
998         }
999         return -ENOTTY;
1000 }
1001
1002 static int snd_rawmidi_control_ioctl(struct snd_card *card,
1003                                      struct snd_ctl_file *control,
1004                                      unsigned int cmd,
1005                                      unsigned long arg)
1006 {
1007         void __user *argp = (void __user *)arg;
1008
1009         switch (cmd) {
1010         case SNDRV_CTL_IOCTL_RAWMIDI_NEXT_DEVICE:
1011         {
1012                 int device;
1013
1014                 if (get_user(device, (int __user *)argp))
1015                         return -EFAULT;
1016                 if (device >= SNDRV_RAWMIDI_DEVICES) /* next device is -1 */
1017                         device = SNDRV_RAWMIDI_DEVICES - 1;
1018                 mutex_lock(&register_mutex);
1019                 device = device < 0 ? 0 : device + 1;
1020                 while (device < SNDRV_RAWMIDI_DEVICES) {
1021                         if (snd_rawmidi_search(card, device))
1022                                 break;
1023                         device++;
1024                 }
1025                 if (device == SNDRV_RAWMIDI_DEVICES)
1026                         device = -1;
1027                 mutex_unlock(&register_mutex);
1028                 if (put_user(device, (int __user *)argp))
1029                         return -EFAULT;
1030                 return 0;
1031         }
1032         case SNDRV_CTL_IOCTL_RAWMIDI_PREFER_SUBDEVICE:
1033         {
1034                 int val;
1035
1036                 if (get_user(val, (int __user *)argp))
1037                         return -EFAULT;
1038                 control->preferred_subdevice[SND_CTL_SUBDEV_RAWMIDI] = val;
1039                 return 0;
1040         }
1041         case SNDRV_CTL_IOCTL_RAWMIDI_INFO:
1042                 return snd_rawmidi_info_select_user(card, argp);
1043         }
1044         return -ENOIOCTLCMD;
1045 }
1046
1047 static int receive_with_tstamp_framing(struct snd_rawmidi_substream *substream,
1048                         const unsigned char *buffer, int src_count, const struct timespec64 *tstamp)
1049 {
1050         struct snd_rawmidi_runtime *runtime = substream->runtime;
1051         struct snd_rawmidi_framing_tstamp *dest_ptr;
1052         struct snd_rawmidi_framing_tstamp frame = { .tv_sec = tstamp->tv_sec, .tv_nsec = tstamp->tv_nsec };
1053         int orig_count = src_count;
1054         int frame_size = sizeof(struct snd_rawmidi_framing_tstamp);
1055
1056         BUILD_BUG_ON(frame_size != 0x20);
1057         if (snd_BUG_ON((runtime->hw_ptr & 0x1f) != 0))
1058                 return -EINVAL;
1059
1060         while (src_count > 0) {
1061                 if ((int)(runtime->buffer_size - runtime->avail) < frame_size) {
1062                         runtime->xruns += src_count;
1063                         break;
1064                 }
1065                 if (src_count >= SNDRV_RAWMIDI_FRAMING_DATA_LENGTH)
1066                         frame.length = SNDRV_RAWMIDI_FRAMING_DATA_LENGTH;
1067                 else {
1068                         frame.length = src_count;
1069                         memset(frame.data, 0, SNDRV_RAWMIDI_FRAMING_DATA_LENGTH);
1070                 }
1071                 memcpy(frame.data, buffer, frame.length);
1072                 buffer += frame.length;
1073                 src_count -= frame.length;
1074                 dest_ptr = (struct snd_rawmidi_framing_tstamp *) (runtime->buffer + runtime->hw_ptr);
1075                 *dest_ptr = frame;
1076                 runtime->avail += frame_size;
1077                 runtime->hw_ptr += frame_size;
1078                 runtime->hw_ptr %= runtime->buffer_size;
1079         }
1080         return orig_count - src_count;
1081 }
1082
1083 static struct timespec64 get_framing_tstamp(struct snd_rawmidi_substream *substream)
1084 {
1085         struct timespec64 ts64 = {0, 0};
1086
1087         switch (substream->clock_type) {
1088         case SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC_RAW:
1089                 ktime_get_raw_ts64(&ts64);
1090                 break;
1091         case SNDRV_RAWMIDI_MODE_CLOCK_MONOTONIC:
1092                 ktime_get_ts64(&ts64);
1093                 break;
1094         case SNDRV_RAWMIDI_MODE_CLOCK_REALTIME:
1095                 ktime_get_real_ts64(&ts64);
1096                 break;
1097         }
1098         return ts64;
1099 }
1100
1101 /**
1102  * snd_rawmidi_receive - receive the input data from the device
1103  * @substream: the rawmidi substream
1104  * @buffer: the buffer pointer
1105  * @count: the data size to read
1106  *
1107  * Reads the data from the internal buffer.
1108  *
1109  * Return: The size of read data, or a negative error code on failure.
1110  */
1111 int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
1112                         const unsigned char *buffer, int count)
1113 {
1114         unsigned long flags;
1115         struct timespec64 ts64 = get_framing_tstamp(substream);
1116         int result = 0, count1;
1117         struct snd_rawmidi_runtime *runtime;
1118
1119         spin_lock_irqsave(&substream->lock, flags);
1120         if (!substream->opened) {
1121                 result = -EBADFD;
1122                 goto unlock;
1123         }
1124         runtime = substream->runtime;
1125         if (!runtime || !runtime->buffer) {
1126                 rmidi_dbg(substream->rmidi,
1127                           "snd_rawmidi_receive: input is not active!!!\n");
1128                 result = -EINVAL;
1129                 goto unlock;
1130         }
1131
1132         if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1133                 result = receive_with_tstamp_framing(substream, buffer, count, &ts64);
1134         } else if (count == 1) {        /* special case, faster code */
1135                 substream->bytes++;
1136                 if (runtime->avail < runtime->buffer_size) {
1137                         runtime->buffer[runtime->hw_ptr++] = buffer[0];
1138                         runtime->hw_ptr %= runtime->buffer_size;
1139                         runtime->avail++;
1140                         result++;
1141                 } else {
1142                         runtime->xruns++;
1143                 }
1144         } else {
1145                 substream->bytes += count;
1146                 count1 = runtime->buffer_size - runtime->hw_ptr;
1147                 if (count1 > count)
1148                         count1 = count;
1149                 if (count1 > (int)(runtime->buffer_size - runtime->avail))
1150                         count1 = runtime->buffer_size - runtime->avail;
1151                 memcpy(runtime->buffer + runtime->hw_ptr, buffer, count1);
1152                 runtime->hw_ptr += count1;
1153                 runtime->hw_ptr %= runtime->buffer_size;
1154                 runtime->avail += count1;
1155                 count -= count1;
1156                 result += count1;
1157                 if (count > 0) {
1158                         buffer += count1;
1159                         count1 = count;
1160                         if (count1 > (int)(runtime->buffer_size - runtime->avail)) {
1161                                 count1 = runtime->buffer_size - runtime->avail;
1162                                 runtime->xruns += count - count1;
1163                         }
1164                         if (count1 > 0) {
1165                                 memcpy(runtime->buffer, buffer, count1);
1166                                 runtime->hw_ptr = count1;
1167                                 runtime->avail += count1;
1168                                 result += count1;
1169                         }
1170                 }
1171         }
1172         if (result > 0) {
1173                 if (runtime->event)
1174                         schedule_work(&runtime->event_work);
1175                 else if (__snd_rawmidi_ready(runtime))
1176                         wake_up(&runtime->sleep);
1177         }
1178  unlock:
1179         spin_unlock_irqrestore(&substream->lock, flags);
1180         return result;
1181 }
1182 EXPORT_SYMBOL(snd_rawmidi_receive);
1183
1184 static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream,
1185                                      unsigned char __user *userbuf,
1186                                      unsigned char *kernelbuf, long count)
1187 {
1188         unsigned long flags;
1189         long result = 0, count1;
1190         struct snd_rawmidi_runtime *runtime = substream->runtime;
1191         unsigned long appl_ptr;
1192         int err = 0;
1193
1194         spin_lock_irqsave(&substream->lock, flags);
1195         snd_rawmidi_buffer_ref(runtime);
1196         while (count > 0 && runtime->avail) {
1197                 count1 = runtime->buffer_size - runtime->appl_ptr;
1198                 if (count1 > count)
1199                         count1 = count;
1200                 if (count1 > (int)runtime->avail)
1201                         count1 = runtime->avail;
1202
1203                 /* update runtime->appl_ptr before unlocking for userbuf */
1204                 appl_ptr = runtime->appl_ptr;
1205                 runtime->appl_ptr += count1;
1206                 runtime->appl_ptr %= runtime->buffer_size;
1207                 runtime->avail -= count1;
1208
1209                 if (kernelbuf)
1210                         memcpy(kernelbuf + result, runtime->buffer + appl_ptr, count1);
1211                 if (userbuf) {
1212                         spin_unlock_irqrestore(&substream->lock, flags);
1213                         if (copy_to_user(userbuf + result,
1214                                          runtime->buffer + appl_ptr, count1))
1215                                 err = -EFAULT;
1216                         spin_lock_irqsave(&substream->lock, flags);
1217                         if (err)
1218                                 goto out;
1219                 }
1220                 result += count1;
1221                 count -= count1;
1222         }
1223  out:
1224         snd_rawmidi_buffer_unref(runtime);
1225         spin_unlock_irqrestore(&substream->lock, flags);
1226         return result > 0 ? result : err;
1227 }
1228
1229 long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
1230                              unsigned char *buf, long count)
1231 {
1232         snd_rawmidi_input_trigger(substream, 1);
1233         return snd_rawmidi_kernel_read1(substream, NULL/*userbuf*/, buf, count);
1234 }
1235 EXPORT_SYMBOL(snd_rawmidi_kernel_read);
1236
1237 static ssize_t snd_rawmidi_read(struct file *file, char __user *buf, size_t count,
1238                                 loff_t *offset)
1239 {
1240         long result;
1241         int count1;
1242         struct snd_rawmidi_file *rfile;
1243         struct snd_rawmidi_substream *substream;
1244         struct snd_rawmidi_runtime *runtime;
1245
1246         rfile = file->private_data;
1247         substream = rfile->input;
1248         if (substream == NULL)
1249                 return -EIO;
1250         runtime = substream->runtime;
1251         snd_rawmidi_input_trigger(substream, 1);
1252         result = 0;
1253         while (count > 0) {
1254                 spin_lock_irq(&substream->lock);
1255                 while (!__snd_rawmidi_ready(runtime)) {
1256                         wait_queue_entry_t wait;
1257
1258                         if ((file->f_flags & O_NONBLOCK) != 0 || result > 0) {
1259                                 spin_unlock_irq(&substream->lock);
1260                                 return result > 0 ? result : -EAGAIN;
1261                         }
1262                         init_waitqueue_entry(&wait, current);
1263                         add_wait_queue(&runtime->sleep, &wait);
1264                         set_current_state(TASK_INTERRUPTIBLE);
1265                         spin_unlock_irq(&substream->lock);
1266                         schedule();
1267                         remove_wait_queue(&runtime->sleep, &wait);
1268                         if (rfile->rmidi->card->shutdown)
1269                                 return -ENODEV;
1270                         if (signal_pending(current))
1271                                 return result > 0 ? result : -ERESTARTSYS;
1272                         spin_lock_irq(&substream->lock);
1273                         if (!runtime->avail) {
1274                                 spin_unlock_irq(&substream->lock);
1275                                 return result > 0 ? result : -EIO;
1276                         }
1277                 }
1278                 spin_unlock_irq(&substream->lock);
1279                 count1 = snd_rawmidi_kernel_read1(substream,
1280                                                   (unsigned char __user *)buf,
1281                                                   NULL/*kernelbuf*/,
1282                                                   count);
1283                 if (count1 < 0)
1284                         return result > 0 ? result : count1;
1285                 result += count1;
1286                 buf += count1;
1287                 count -= count1;
1288         }
1289         return result;
1290 }
1291
1292 /**
1293  * snd_rawmidi_transmit_empty - check whether the output buffer is empty
1294  * @substream: the rawmidi substream
1295  *
1296  * Return: 1 if the internal output buffer is empty, 0 if not.
1297  */
1298 int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream)
1299 {
1300         struct snd_rawmidi_runtime *runtime;
1301         int result;
1302         unsigned long flags;
1303
1304         spin_lock_irqsave(&substream->lock, flags);
1305         runtime = substream->runtime;
1306         if (!substream->opened || !runtime || !runtime->buffer) {
1307                 rmidi_dbg(substream->rmidi,
1308                           "snd_rawmidi_transmit_empty: output is not active!!!\n");
1309                 result = 1;
1310         } else {
1311                 result = runtime->avail >= runtime->buffer_size;
1312         }
1313         spin_unlock_irqrestore(&substream->lock, flags);
1314         return result;
1315 }
1316 EXPORT_SYMBOL(snd_rawmidi_transmit_empty);
1317
1318 /*
1319  * __snd_rawmidi_transmit_peek - copy data from the internal buffer
1320  * @substream: the rawmidi substream
1321  * @buffer: the buffer pointer
1322  * @count: data size to transfer
1323  *
1324  * This is a variant of snd_rawmidi_transmit_peek() without spinlock.
1325  */
1326 static int __snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1327                                        unsigned char *buffer, int count)
1328 {
1329         int result, count1;
1330         struct snd_rawmidi_runtime *runtime = substream->runtime;
1331
1332         if (runtime->buffer == NULL) {
1333                 rmidi_dbg(substream->rmidi,
1334                           "snd_rawmidi_transmit_peek: output is not active!!!\n");
1335                 return -EINVAL;
1336         }
1337         result = 0;
1338         if (runtime->avail >= runtime->buffer_size) {
1339                 /* warning: lowlevel layer MUST trigger down the hardware */
1340                 goto __skip;
1341         }
1342         if (count == 1) {       /* special case, faster code */
1343                 *buffer = runtime->buffer[runtime->hw_ptr];
1344                 result++;
1345         } else {
1346                 count1 = runtime->buffer_size - runtime->hw_ptr;
1347                 if (count1 > count)
1348                         count1 = count;
1349                 if (count1 > (int)(runtime->buffer_size - runtime->avail))
1350                         count1 = runtime->buffer_size - runtime->avail;
1351                 memcpy(buffer, runtime->buffer + runtime->hw_ptr, count1);
1352                 count -= count1;
1353                 result += count1;
1354                 if (count > 0) {
1355                         if (count > (int)(runtime->buffer_size - runtime->avail - count1))
1356                                 count = runtime->buffer_size - runtime->avail - count1;
1357                         memcpy(buffer + count1, runtime->buffer, count);
1358                         result += count;
1359                 }
1360         }
1361       __skip:
1362         return result;
1363 }
1364
1365 /**
1366  * snd_rawmidi_transmit_peek - copy data from the internal buffer
1367  * @substream: the rawmidi substream
1368  * @buffer: the buffer pointer
1369  * @count: data size to transfer
1370  *
1371  * Copies data from the internal output buffer to the given buffer.
1372  *
1373  * Call this in the interrupt handler when the midi output is ready,
1374  * and call snd_rawmidi_transmit_ack() after the transmission is
1375  * finished.
1376  *
1377  * Return: The size of copied data, or a negative error code on failure.
1378  */
1379 int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
1380                               unsigned char *buffer, int count)
1381 {
1382         int result;
1383         unsigned long flags;
1384
1385         spin_lock_irqsave(&substream->lock, flags);
1386         if (!substream->opened || !substream->runtime)
1387                 result = -EBADFD;
1388         else
1389                 result = __snd_rawmidi_transmit_peek(substream, buffer, count);
1390         spin_unlock_irqrestore(&substream->lock, flags);
1391         return result;
1392 }
1393 EXPORT_SYMBOL(snd_rawmidi_transmit_peek);
1394
1395 /*
1396  * __snd_rawmidi_transmit_ack - acknowledge the transmission
1397  * @substream: the rawmidi substream
1398  * @count: the transferred count
1399  *
1400  * This is a variant of __snd_rawmidi_transmit_ack() without spinlock.
1401  */
1402 static int __snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream,
1403                                       int count)
1404 {
1405         struct snd_rawmidi_runtime *runtime = substream->runtime;
1406
1407         if (runtime->buffer == NULL) {
1408                 rmidi_dbg(substream->rmidi,
1409                           "snd_rawmidi_transmit_ack: output is not active!!!\n");
1410                 return -EINVAL;
1411         }
1412         snd_BUG_ON(runtime->avail + count > runtime->buffer_size);
1413         runtime->hw_ptr += count;
1414         runtime->hw_ptr %= runtime->buffer_size;
1415         runtime->avail += count;
1416         substream->bytes += count;
1417         if (count > 0) {
1418                 if (runtime->drain || __snd_rawmidi_ready(runtime))
1419                         wake_up(&runtime->sleep);
1420         }
1421         return count;
1422 }
1423
1424 /**
1425  * snd_rawmidi_transmit_ack - acknowledge the transmission
1426  * @substream: the rawmidi substream
1427  * @count: the transferred count
1428  *
1429  * Advances the hardware pointer for the internal output buffer with
1430  * the given size and updates the condition.
1431  * Call after the transmission is finished.
1432  *
1433  * Return: The advanced size if successful, or a negative error code on failure.
1434  */
1435 int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count)
1436 {
1437         int result;
1438         unsigned long flags;
1439
1440         spin_lock_irqsave(&substream->lock, flags);
1441         if (!substream->opened || !substream->runtime)
1442                 result = -EBADFD;
1443         else
1444                 result = __snd_rawmidi_transmit_ack(substream, count);
1445         spin_unlock_irqrestore(&substream->lock, flags);
1446         return result;
1447 }
1448 EXPORT_SYMBOL(snd_rawmidi_transmit_ack);
1449
1450 /**
1451  * snd_rawmidi_transmit - copy from the buffer to the device
1452  * @substream: the rawmidi substream
1453  * @buffer: the buffer pointer
1454  * @count: the data size to transfer
1455  *
1456  * Copies data from the buffer to the device and advances the pointer.
1457  *
1458  * Return: The copied size if successful, or a negative error code on failure.
1459  */
1460 int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
1461                          unsigned char *buffer, int count)
1462 {
1463         int result;
1464         unsigned long flags;
1465
1466         spin_lock_irqsave(&substream->lock, flags);
1467         if (!substream->opened)
1468                 result = -EBADFD;
1469         else {
1470                 count = __snd_rawmidi_transmit_peek(substream, buffer, count);
1471                 if (count <= 0)
1472                         result = count;
1473                 else
1474                         result = __snd_rawmidi_transmit_ack(substream, count);
1475         }
1476         spin_unlock_irqrestore(&substream->lock, flags);
1477         return result;
1478 }
1479 EXPORT_SYMBOL(snd_rawmidi_transmit);
1480
1481 /**
1482  * snd_rawmidi_proceed - Discard the all pending bytes and proceed
1483  * @substream: rawmidi substream
1484  *
1485  * Return: the number of discarded bytes
1486  */
1487 int snd_rawmidi_proceed(struct snd_rawmidi_substream *substream)
1488 {
1489         struct snd_rawmidi_runtime *runtime;
1490         unsigned long flags;
1491         int count = 0;
1492
1493         spin_lock_irqsave(&substream->lock, flags);
1494         runtime = substream->runtime;
1495         if (substream->opened && runtime &&
1496             runtime->avail < runtime->buffer_size) {
1497                 count = runtime->buffer_size - runtime->avail;
1498                 __snd_rawmidi_transmit_ack(substream, count);
1499         }
1500         spin_unlock_irqrestore(&substream->lock, flags);
1501         return count;
1502 }
1503 EXPORT_SYMBOL(snd_rawmidi_proceed);
1504
1505 static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream,
1506                                       const unsigned char __user *userbuf,
1507                                       const unsigned char *kernelbuf,
1508                                       long count)
1509 {
1510         unsigned long flags;
1511         long count1, result;
1512         struct snd_rawmidi_runtime *runtime = substream->runtime;
1513         unsigned long appl_ptr;
1514
1515         if (!kernelbuf && !userbuf)
1516                 return -EINVAL;
1517         if (snd_BUG_ON(!runtime->buffer))
1518                 return -EINVAL;
1519
1520         result = 0;
1521         spin_lock_irqsave(&substream->lock, flags);
1522         if (substream->append) {
1523                 if ((long)runtime->avail < count) {
1524                         spin_unlock_irqrestore(&substream->lock, flags);
1525                         return -EAGAIN;
1526                 }
1527         }
1528         snd_rawmidi_buffer_ref(runtime);
1529         while (count > 0 && runtime->avail > 0) {
1530                 count1 = runtime->buffer_size - runtime->appl_ptr;
1531                 if (count1 > count)
1532                         count1 = count;
1533                 if (count1 > (long)runtime->avail)
1534                         count1 = runtime->avail;
1535
1536                 /* update runtime->appl_ptr before unlocking for userbuf */
1537                 appl_ptr = runtime->appl_ptr;
1538                 runtime->appl_ptr += count1;
1539                 runtime->appl_ptr %= runtime->buffer_size;
1540                 runtime->avail -= count1;
1541
1542                 if (kernelbuf)
1543                         memcpy(runtime->buffer + appl_ptr,
1544                                kernelbuf + result, count1);
1545                 else if (userbuf) {
1546                         spin_unlock_irqrestore(&substream->lock, flags);
1547                         if (copy_from_user(runtime->buffer + appl_ptr,
1548                                            userbuf + result, count1)) {
1549                                 spin_lock_irqsave(&substream->lock, flags);
1550                                 result = result > 0 ? result : -EFAULT;
1551                                 goto __end;
1552                         }
1553                         spin_lock_irqsave(&substream->lock, flags);
1554                 }
1555                 result += count1;
1556                 count -= count1;
1557         }
1558       __end:
1559         count1 = runtime->avail < runtime->buffer_size;
1560         snd_rawmidi_buffer_unref(runtime);
1561         spin_unlock_irqrestore(&substream->lock, flags);
1562         if (count1)
1563                 snd_rawmidi_output_trigger(substream, 1);
1564         return result;
1565 }
1566
1567 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
1568                               const unsigned char *buf, long count)
1569 {
1570         return snd_rawmidi_kernel_write1(substream, NULL, buf, count);
1571 }
1572 EXPORT_SYMBOL(snd_rawmidi_kernel_write);
1573
1574 static ssize_t snd_rawmidi_write(struct file *file, const char __user *buf,
1575                                  size_t count, loff_t *offset)
1576 {
1577         long result, timeout;
1578         int count1;
1579         struct snd_rawmidi_file *rfile;
1580         struct snd_rawmidi_runtime *runtime;
1581         struct snd_rawmidi_substream *substream;
1582
1583         rfile = file->private_data;
1584         substream = rfile->output;
1585         runtime = substream->runtime;
1586         /* we cannot put an atomic message to our buffer */
1587         if (substream->append && count > runtime->buffer_size)
1588                 return -EIO;
1589         result = 0;
1590         while (count > 0) {
1591                 spin_lock_irq(&substream->lock);
1592                 while (!snd_rawmidi_ready_append(substream, count)) {
1593                         wait_queue_entry_t wait;
1594
1595                         if (file->f_flags & O_NONBLOCK) {
1596                                 spin_unlock_irq(&substream->lock);
1597                                 return result > 0 ? result : -EAGAIN;
1598                         }
1599                         init_waitqueue_entry(&wait, current);
1600                         add_wait_queue(&runtime->sleep, &wait);
1601                         set_current_state(TASK_INTERRUPTIBLE);
1602                         spin_unlock_irq(&substream->lock);
1603                         timeout = schedule_timeout(30 * HZ);
1604                         remove_wait_queue(&runtime->sleep, &wait);
1605                         if (rfile->rmidi->card->shutdown)
1606                                 return -ENODEV;
1607                         if (signal_pending(current))
1608                                 return result > 0 ? result : -ERESTARTSYS;
1609                         spin_lock_irq(&substream->lock);
1610                         if (!runtime->avail && !timeout) {
1611                                 spin_unlock_irq(&substream->lock);
1612                                 return result > 0 ? result : -EIO;
1613                         }
1614                 }
1615                 spin_unlock_irq(&substream->lock);
1616                 count1 = snd_rawmidi_kernel_write1(substream, buf, NULL, count);
1617                 if (count1 < 0)
1618                         return result > 0 ? result : count1;
1619                 result += count1;
1620                 buf += count1;
1621                 if ((size_t)count1 < count && (file->f_flags & O_NONBLOCK))
1622                         break;
1623                 count -= count1;
1624         }
1625         if (file->f_flags & O_DSYNC) {
1626                 spin_lock_irq(&substream->lock);
1627                 while (runtime->avail != runtime->buffer_size) {
1628                         wait_queue_entry_t wait;
1629                         unsigned int last_avail = runtime->avail;
1630
1631                         init_waitqueue_entry(&wait, current);
1632                         add_wait_queue(&runtime->sleep, &wait);
1633                         set_current_state(TASK_INTERRUPTIBLE);
1634                         spin_unlock_irq(&substream->lock);
1635                         timeout = schedule_timeout(30 * HZ);
1636                         remove_wait_queue(&runtime->sleep, &wait);
1637                         if (signal_pending(current))
1638                                 return result > 0 ? result : -ERESTARTSYS;
1639                         if (runtime->avail == last_avail && !timeout)
1640                                 return result > 0 ? result : -EIO;
1641                         spin_lock_irq(&substream->lock);
1642                 }
1643                 spin_unlock_irq(&substream->lock);
1644         }
1645         return result;
1646 }
1647
1648 static __poll_t snd_rawmidi_poll(struct file *file, poll_table *wait)
1649 {
1650         struct snd_rawmidi_file *rfile;
1651         struct snd_rawmidi_runtime *runtime;
1652         __poll_t mask;
1653
1654         rfile = file->private_data;
1655         if (rfile->input != NULL) {
1656                 runtime = rfile->input->runtime;
1657                 snd_rawmidi_input_trigger(rfile->input, 1);
1658                 poll_wait(file, &runtime->sleep, wait);
1659         }
1660         if (rfile->output != NULL) {
1661                 runtime = rfile->output->runtime;
1662                 poll_wait(file, &runtime->sleep, wait);
1663         }
1664         mask = 0;
1665         if (rfile->input != NULL) {
1666                 if (snd_rawmidi_ready(rfile->input))
1667                         mask |= EPOLLIN | EPOLLRDNORM;
1668         }
1669         if (rfile->output != NULL) {
1670                 if (snd_rawmidi_ready(rfile->output))
1671                         mask |= EPOLLOUT | EPOLLWRNORM;
1672         }
1673         return mask;
1674 }
1675
1676 /*
1677  */
1678 #ifdef CONFIG_COMPAT
1679 #include "rawmidi_compat.c"
1680 #else
1681 #define snd_rawmidi_ioctl_compat        NULL
1682 #endif
1683
1684 /*
1685  */
1686
1687 static void snd_rawmidi_proc_info_read(struct snd_info_entry *entry,
1688                                        struct snd_info_buffer *buffer)
1689 {
1690         struct snd_rawmidi *rmidi;
1691         struct snd_rawmidi_substream *substream;
1692         struct snd_rawmidi_runtime *runtime;
1693         unsigned long buffer_size, avail, xruns;
1694         unsigned int clock_type;
1695         static const char *clock_names[4] = { "none", "realtime", "monotonic", "monotonic raw" };
1696
1697         rmidi = entry->private_data;
1698         snd_iprintf(buffer, "%s\n\n", rmidi->name);
1699         mutex_lock(&rmidi->open_mutex);
1700         if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_OUTPUT) {
1701                 list_for_each_entry(substream,
1702                                     &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams,
1703                                     list) {
1704                         snd_iprintf(buffer,
1705                                     "Output %d\n"
1706                                     "  Tx bytes     : %lu\n",
1707                                     substream->number,
1708                                     (unsigned long) substream->bytes);
1709                         if (substream->opened) {
1710                                 snd_iprintf(buffer,
1711                                     "  Owner PID    : %d\n",
1712                                     pid_vnr(substream->pid));
1713                                 runtime = substream->runtime;
1714                                 spin_lock_irq(&substream->lock);
1715                                 buffer_size = runtime->buffer_size;
1716                                 avail = runtime->avail;
1717                                 spin_unlock_irq(&substream->lock);
1718                                 snd_iprintf(buffer,
1719                                     "  Mode         : %s\n"
1720                                     "  Buffer size  : %lu\n"
1721                                     "  Avail        : %lu\n",
1722                                     runtime->oss ? "OSS compatible" : "native",
1723                                     buffer_size, avail);
1724                         }
1725                 }
1726         }
1727         if (rmidi->info_flags & SNDRV_RAWMIDI_INFO_INPUT) {
1728                 list_for_each_entry(substream,
1729                                     &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams,
1730                                     list) {
1731                         snd_iprintf(buffer,
1732                                     "Input %d\n"
1733                                     "  Rx bytes     : %lu\n",
1734                                     substream->number,
1735                                     (unsigned long) substream->bytes);
1736                         if (substream->opened) {
1737                                 snd_iprintf(buffer,
1738                                             "  Owner PID    : %d\n",
1739                                             pid_vnr(substream->pid));
1740                                 runtime = substream->runtime;
1741                                 spin_lock_irq(&substream->lock);
1742                                 buffer_size = runtime->buffer_size;
1743                                 avail = runtime->avail;
1744                                 xruns = runtime->xruns;
1745                                 spin_unlock_irq(&substream->lock);
1746                                 snd_iprintf(buffer,
1747                                             "  Buffer size  : %lu\n"
1748                                             "  Avail        : %lu\n"
1749                                             "  Overruns     : %lu\n",
1750                                             buffer_size, avail, xruns);
1751                                 if (substream->framing == SNDRV_RAWMIDI_MODE_FRAMING_TSTAMP) {
1752                                         clock_type = substream->clock_type >> SNDRV_RAWMIDI_MODE_CLOCK_SHIFT;
1753                                         if (!snd_BUG_ON(clock_type >= ARRAY_SIZE(clock_names)))
1754                                                 snd_iprintf(buffer,
1755                                                             "  Framing      : tstamp\n"
1756                                                             "  Clock type   : %s\n",
1757                                                             clock_names[clock_type]);
1758                                 }
1759                         }
1760                 }
1761         }
1762         mutex_unlock(&rmidi->open_mutex);
1763 }
1764
1765 /*
1766  *  Register functions
1767  */
1768
1769 static const struct file_operations snd_rawmidi_f_ops = {
1770         .owner =        THIS_MODULE,
1771         .read =         snd_rawmidi_read,
1772         .write =        snd_rawmidi_write,
1773         .open =         snd_rawmidi_open,
1774         .release =      snd_rawmidi_release,
1775         .llseek =       no_llseek,
1776         .poll =         snd_rawmidi_poll,
1777         .unlocked_ioctl =       snd_rawmidi_ioctl,
1778         .compat_ioctl = snd_rawmidi_ioctl_compat,
1779 };
1780
1781 static int snd_rawmidi_alloc_substreams(struct snd_rawmidi *rmidi,
1782                                         struct snd_rawmidi_str *stream,
1783                                         int direction,
1784                                         int count)
1785 {
1786         struct snd_rawmidi_substream *substream;
1787         int idx;
1788
1789         for (idx = 0; idx < count; idx++) {
1790                 substream = kzalloc(sizeof(*substream), GFP_KERNEL);
1791                 if (!substream)
1792                         return -ENOMEM;
1793                 substream->stream = direction;
1794                 substream->number = idx;
1795                 substream->rmidi = rmidi;
1796                 substream->pstr = stream;
1797                 spin_lock_init(&substream->lock);
1798                 list_add_tail(&substream->list, &stream->substreams);
1799                 stream->substream_count++;
1800         }
1801         return 0;
1802 }
1803
1804 static void release_rawmidi_device(struct device *dev)
1805 {
1806         kfree(container_of(dev, struct snd_rawmidi, dev));
1807 }
1808
1809 /**
1810  * snd_rawmidi_new - create a rawmidi instance
1811  * @card: the card instance
1812  * @id: the id string
1813  * @device: the device index
1814  * @output_count: the number of output streams
1815  * @input_count: the number of input streams
1816  * @rrawmidi: the pointer to store the new rawmidi instance
1817  *
1818  * Creates a new rawmidi instance.
1819  * Use snd_rawmidi_set_ops() to set the operators to the new instance.
1820  *
1821  * Return: Zero if successful, or a negative error code on failure.
1822  */
1823 int snd_rawmidi_new(struct snd_card *card, char *id, int device,
1824                     int output_count, int input_count,
1825                     struct snd_rawmidi **rrawmidi)
1826 {
1827         struct snd_rawmidi *rmidi;
1828         int err;
1829         static const struct snd_device_ops ops = {
1830                 .dev_free = snd_rawmidi_dev_free,
1831                 .dev_register = snd_rawmidi_dev_register,
1832                 .dev_disconnect = snd_rawmidi_dev_disconnect,
1833         };
1834
1835         if (snd_BUG_ON(!card))
1836                 return -ENXIO;
1837         if (rrawmidi)
1838                 *rrawmidi = NULL;
1839         rmidi = kzalloc(sizeof(*rmidi), GFP_KERNEL);
1840         if (!rmidi)
1841                 return -ENOMEM;
1842         rmidi->card = card;
1843         rmidi->device = device;
1844         mutex_init(&rmidi->open_mutex);
1845         init_waitqueue_head(&rmidi->open_wait);
1846         INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT].substreams);
1847         INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams);
1848
1849         if (id != NULL)
1850                 strscpy(rmidi->id, id, sizeof(rmidi->id));
1851
1852         snd_device_initialize(&rmidi->dev, card);
1853         rmidi->dev.release = release_rawmidi_device;
1854         dev_set_name(&rmidi->dev, "midiC%iD%i", card->number, device);
1855
1856         err = snd_rawmidi_alloc_substreams(rmidi,
1857                                            &rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT],
1858                                            SNDRV_RAWMIDI_STREAM_INPUT,
1859                                            input_count);
1860         if (err < 0)
1861                 goto error;
1862         err = snd_rawmidi_alloc_substreams(rmidi,
1863                                            &rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT],
1864                                            SNDRV_RAWMIDI_STREAM_OUTPUT,
1865                                            output_count);
1866         if (err < 0)
1867                 goto error;
1868         err = snd_device_new(card, SNDRV_DEV_RAWMIDI, rmidi, &ops);
1869         if (err < 0)
1870                 goto error;
1871
1872         if (rrawmidi)
1873                 *rrawmidi = rmidi;
1874         return 0;
1875
1876  error:
1877         snd_rawmidi_free(rmidi);
1878         return err;
1879 }
1880 EXPORT_SYMBOL(snd_rawmidi_new);
1881
1882 static void snd_rawmidi_free_substreams(struct snd_rawmidi_str *stream)
1883 {
1884         struct snd_rawmidi_substream *substream;
1885
1886         while (!list_empty(&stream->substreams)) {
1887                 substream = list_entry(stream->substreams.next, struct snd_rawmidi_substream, list);
1888                 list_del(&substream->list);
1889                 kfree(substream);
1890         }
1891 }
1892
1893 static int snd_rawmidi_free(struct snd_rawmidi *rmidi)
1894 {
1895         if (!rmidi)
1896                 return 0;
1897
1898         snd_info_free_entry(rmidi->proc_entry);
1899         rmidi->proc_entry = NULL;
1900         if (rmidi->ops && rmidi->ops->dev_unregister)
1901                 rmidi->ops->dev_unregister(rmidi);
1902
1903         snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_INPUT]);
1904         snd_rawmidi_free_substreams(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT]);
1905         if (rmidi->private_free)
1906                 rmidi->private_free(rmidi);
1907         put_device(&rmidi->dev);
1908         return 0;
1909 }
1910
1911 static int snd_rawmidi_dev_free(struct snd_device *device)
1912 {
1913         struct snd_rawmidi *rmidi = device->device_data;
1914
1915         return snd_rawmidi_free(rmidi);
1916 }
1917
1918 #if IS_ENABLED(CONFIG_SND_SEQUENCER)
1919 static void snd_rawmidi_dev_seq_free(struct snd_seq_device *device)
1920 {
1921         struct snd_rawmidi *rmidi = device->private_data;
1922
1923         rmidi->seq_dev = NULL;
1924 }
1925 #endif
1926
1927 static int snd_rawmidi_dev_register(struct snd_device *device)
1928 {
1929         int err;
1930         struct snd_info_entry *entry;
1931         char name[16];
1932         struct snd_rawmidi *rmidi = device->device_data;
1933
1934         if (rmidi->device >= SNDRV_RAWMIDI_DEVICES)
1935                 return -ENOMEM;
1936         err = 0;
1937         mutex_lock(&register_mutex);
1938         if (snd_rawmidi_search(rmidi->card, rmidi->device))
1939                 err = -EBUSY;
1940         else
1941                 list_add_tail(&rmidi->list, &snd_rawmidi_devices);
1942         mutex_unlock(&register_mutex);
1943         if (err < 0)
1944                 return err;
1945
1946         err = snd_register_device(SNDRV_DEVICE_TYPE_RAWMIDI,
1947                                   rmidi->card, rmidi->device,
1948                                   &snd_rawmidi_f_ops, rmidi, &rmidi->dev);
1949         if (err < 0) {
1950                 rmidi_err(rmidi, "unable to register\n");
1951                 goto error;
1952         }
1953         if (rmidi->ops && rmidi->ops->dev_register) {
1954                 err = rmidi->ops->dev_register(rmidi);
1955                 if (err < 0)
1956                         goto error_unregister;
1957         }
1958 #ifdef CONFIG_SND_OSSEMUL
1959         rmidi->ossreg = 0;
1960         if ((int)rmidi->device == midi_map[rmidi->card->number]) {
1961                 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1962                                             rmidi->card, 0, &snd_rawmidi_f_ops,
1963                                             rmidi) < 0) {
1964                         rmidi_err(rmidi,
1965                                   "unable to register OSS rawmidi device %i:%i\n",
1966                                   rmidi->card->number, 0);
1967                 } else {
1968                         rmidi->ossreg++;
1969 #ifdef SNDRV_OSS_INFO_DEV_MIDI
1970                         snd_oss_info_register(SNDRV_OSS_INFO_DEV_MIDI, rmidi->card->number, rmidi->name);
1971 #endif
1972                 }
1973         }
1974         if ((int)rmidi->device == amidi_map[rmidi->card->number]) {
1975                 if (snd_register_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI,
1976                                             rmidi->card, 1, &snd_rawmidi_f_ops,
1977                                             rmidi) < 0) {
1978                         rmidi_err(rmidi,
1979                                   "unable to register OSS rawmidi device %i:%i\n",
1980                                   rmidi->card->number, 1);
1981                 } else {
1982                         rmidi->ossreg++;
1983                 }
1984         }
1985 #endif /* CONFIG_SND_OSSEMUL */
1986         sprintf(name, "midi%d", rmidi->device);
1987         entry = snd_info_create_card_entry(rmidi->card, name, rmidi->card->proc_root);
1988         if (entry) {
1989                 entry->private_data = rmidi;
1990                 entry->c.text.read = snd_rawmidi_proc_info_read;
1991                 if (snd_info_register(entry) < 0) {
1992                         snd_info_free_entry(entry);
1993                         entry = NULL;
1994                 }
1995         }
1996         rmidi->proc_entry = entry;
1997 #if IS_ENABLED(CONFIG_SND_SEQUENCER)
1998         if (!rmidi->ops || !rmidi->ops->dev_register) { /* own registration mechanism */
1999                 if (snd_seq_device_new(rmidi->card, rmidi->device, SNDRV_SEQ_DEV_ID_MIDISYNTH, 0, &rmidi->seq_dev) >= 0) {
2000                         rmidi->seq_dev->private_data = rmidi;
2001                         rmidi->seq_dev->private_free = snd_rawmidi_dev_seq_free;
2002                         sprintf(rmidi->seq_dev->name, "MIDI %d-%d", rmidi->card->number, rmidi->device);
2003                         snd_device_register(rmidi->card, rmidi->seq_dev);
2004                 }
2005         }
2006 #endif
2007         return 0;
2008
2009  error_unregister:
2010         snd_unregister_device(&rmidi->dev);
2011  error:
2012         mutex_lock(&register_mutex);
2013         list_del(&rmidi->list);
2014         mutex_unlock(&register_mutex);
2015         return err;
2016 }
2017
2018 static int snd_rawmidi_dev_disconnect(struct snd_device *device)
2019 {
2020         struct snd_rawmidi *rmidi = device->device_data;
2021         int dir;
2022
2023         mutex_lock(&register_mutex);
2024         mutex_lock(&rmidi->open_mutex);
2025         wake_up(&rmidi->open_wait);
2026         list_del_init(&rmidi->list);
2027         for (dir = 0; dir < 2; dir++) {
2028                 struct snd_rawmidi_substream *s;
2029
2030                 list_for_each_entry(s, &rmidi->streams[dir].substreams, list) {
2031                         if (s->runtime)
2032                                 wake_up(&s->runtime->sleep);
2033                 }
2034         }
2035
2036 #ifdef CONFIG_SND_OSSEMUL
2037         if (rmidi->ossreg) {
2038                 if ((int)rmidi->device == midi_map[rmidi->card->number]) {
2039                         snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->card, 0);
2040 #ifdef SNDRV_OSS_INFO_DEV_MIDI
2041                         snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_MIDI, rmidi->card->number);
2042 #endif
2043                 }
2044                 if ((int)rmidi->device == amidi_map[rmidi->card->number])
2045                         snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_MIDI, rmidi->card, 1);
2046                 rmidi->ossreg = 0;
2047         }
2048 #endif /* CONFIG_SND_OSSEMUL */
2049         snd_unregister_device(&rmidi->dev);
2050         mutex_unlock(&rmidi->open_mutex);
2051         mutex_unlock(&register_mutex);
2052         return 0;
2053 }
2054
2055 /**
2056  * snd_rawmidi_set_ops - set the rawmidi operators
2057  * @rmidi: the rawmidi instance
2058  * @stream: the stream direction, SNDRV_RAWMIDI_STREAM_XXX
2059  * @ops: the operator table
2060  *
2061  * Sets the rawmidi operators for the given stream direction.
2062  */
2063 void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,
2064                          const struct snd_rawmidi_ops *ops)
2065 {
2066         struct snd_rawmidi_substream *substream;
2067
2068         list_for_each_entry(substream, &rmidi->streams[stream].substreams, list)
2069                 substream->ops = ops;
2070 }
2071 EXPORT_SYMBOL(snd_rawmidi_set_ops);
2072
2073 /*
2074  *  ENTRY functions
2075  */
2076
2077 static int __init alsa_rawmidi_init(void)
2078 {
2079
2080         snd_ctl_register_ioctl(snd_rawmidi_control_ioctl);
2081         snd_ctl_register_ioctl_compat(snd_rawmidi_control_ioctl);
2082 #ifdef CONFIG_SND_OSSEMUL
2083         { int i;
2084         /* check device map table */
2085         for (i = 0; i < SNDRV_CARDS; i++) {
2086                 if (midi_map[i] < 0 || midi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
2087                         pr_err("ALSA: rawmidi: invalid midi_map[%d] = %d\n",
2088                                i, midi_map[i]);
2089                         midi_map[i] = 0;
2090                 }
2091                 if (amidi_map[i] < 0 || amidi_map[i] >= SNDRV_RAWMIDI_DEVICES) {
2092                         pr_err("ALSA: rawmidi: invalid amidi_map[%d] = %d\n",
2093                                i, amidi_map[i]);
2094                         amidi_map[i] = 1;
2095                 }
2096         }
2097         }
2098 #endif /* CONFIG_SND_OSSEMUL */
2099         return 0;
2100 }
2101
2102 static void __exit alsa_rawmidi_exit(void)
2103 {
2104         snd_ctl_unregister_ioctl(snd_rawmidi_control_ioctl);
2105         snd_ctl_unregister_ioctl_compat(snd_rawmidi_control_ioctl);
2106 }
2107
2108 module_init(alsa_rawmidi_init)
2109 module_exit(alsa_rawmidi_exit)