diff options
Diffstat (limited to 'sound/drivers/opl3/opl3_seq.c')
| -rw-r--r-- | sound/drivers/opl3/opl3_seq.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/sound/drivers/opl3/opl3_seq.c b/sound/drivers/opl3/opl3_seq.c index c4ead790008a..57becf34f43e 100644 --- a/sound/drivers/opl3/opl3_seq.c +++ b/sound/drivers/opl3/opl3_seq.c | |||
| @@ -52,13 +52,13 @@ int snd_opl3_synth_setup(struct snd_opl3 * opl3) | |||
| 52 | { | 52 | { |
| 53 | int idx; | 53 | int idx; |
| 54 | 54 | ||
| 55 | down(&opl3->access_mutex); | 55 | mutex_lock(&opl3->access_mutex); |
| 56 | if (opl3->used) { | 56 | if (opl3->used) { |
| 57 | up(&opl3->access_mutex); | 57 | mutex_unlock(&opl3->access_mutex); |
| 58 | return -EBUSY; | 58 | return -EBUSY; |
| 59 | } | 59 | } |
| 60 | opl3->used++; | 60 | opl3->used++; |
| 61 | up(&opl3->access_mutex); | 61 | mutex_unlock(&opl3->access_mutex); |
| 62 | 62 | ||
| 63 | snd_opl3_reset(opl3); | 63 | snd_opl3_reset(opl3); |
| 64 | 64 | ||
| @@ -91,9 +91,9 @@ void snd_opl3_synth_cleanup(struct snd_opl3 * opl3) | |||
| 91 | spin_unlock_irqrestore(&opl3->sys_timer_lock, flags); | 91 | spin_unlock_irqrestore(&opl3->sys_timer_lock, flags); |
| 92 | 92 | ||
| 93 | snd_opl3_reset(opl3); | 93 | snd_opl3_reset(opl3); |
| 94 | down(&opl3->access_mutex); | 94 | mutex_lock(&opl3->access_mutex); |
| 95 | opl3->used--; | 95 | opl3->used--; |
| 96 | up(&opl3->access_mutex); | 96 | mutex_unlock(&opl3->access_mutex); |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | static int snd_opl3_synth_use(void *private_data, struct snd_seq_port_subscribe * info) | 99 | static int snd_opl3_synth_use(void *private_data, struct snd_seq_port_subscribe * info) |
| @@ -207,8 +207,10 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3) | |||
| 207 | 16, voices, | 207 | 16, voices, |
| 208 | name); | 208 | name); |
| 209 | if (opl3->chset->port < 0) { | 209 | if (opl3->chset->port < 0) { |
| 210 | int port; | ||
| 211 | port = opl3->chset->port; | ||
| 210 | snd_midi_channel_free_set(opl3->chset); | 212 | snd_midi_channel_free_set(opl3->chset); |
| 211 | return opl3->chset->port; | 213 | return port; |
| 212 | } | 214 | } |
| 213 | return 0; | 215 | return 0; |
| 214 | } | 216 | } |
| @@ -218,7 +220,7 @@ static int snd_opl3_synth_create_port(struct snd_opl3 * opl3) | |||
| 218 | static int snd_opl3_seq_new_device(struct snd_seq_device *dev) | 220 | static int snd_opl3_seq_new_device(struct snd_seq_device *dev) |
| 219 | { | 221 | { |
| 220 | struct snd_opl3 *opl3; | 222 | struct snd_opl3 *opl3; |
| 221 | int client; | 223 | int client, err; |
| 222 | char name[32]; | 224 | char name[32]; |
| 223 | int opl_ver; | 225 | int opl_ver; |
| 224 | 226 | ||
| @@ -239,7 +241,11 @@ static int snd_opl3_seq_new_device(struct snd_seq_device *dev) | |||
| 239 | if (client < 0) | 241 | if (client < 0) |
| 240 | return client; | 242 | return client; |
| 241 | 243 | ||
| 242 | snd_opl3_synth_create_port(opl3); | 244 | if ((err = snd_opl3_synth_create_port(opl3)) < 0) { |
| 245 | snd_seq_delete_kernel_client(client); | ||
| 246 | opl3->seq_client = -1; | ||
| 247 | return err; | ||
| 248 | } | ||
| 243 | 249 | ||
| 244 | /* initialize instrument list */ | 250 | /* initialize instrument list */ |
| 245 | opl3->ilist = snd_seq_instr_list_new(); | 251 | opl3->ilist = snd_seq_instr_list_new(); |
