Commit 66c21c5a authored by Takashi Iwai's avatar Takashi Iwai

Merge branch 'topic/cleanup' into for-next

parents dec84316 0c8d9485
...@@ -186,7 +186,7 @@ static const struct file_operations snd_fops = ...@@ -186,7 +186,7 @@ static const struct file_operations snd_fops =
}; };
#ifdef CONFIG_SND_DYNAMIC_MINORS #ifdef CONFIG_SND_DYNAMIC_MINORS
static int snd_find_free_minor(int type) static int snd_find_free_minor(int type, struct snd_card *card, int dev)
{ {
int minor; int minor;
...@@ -209,7 +209,7 @@ static int snd_find_free_minor(int type) ...@@ -209,7 +209,7 @@ static int snd_find_free_minor(int type)
return -EBUSY; return -EBUSY;
} }
#else #else
static int snd_kernel_minor(int type, struct snd_card *card, int dev) static int snd_find_free_minor(int type, struct snd_card *card, int dev)
{ {
int minor; int minor;
...@@ -237,6 +237,8 @@ static int snd_kernel_minor(int type, struct snd_card *card, int dev) ...@@ -237,6 +237,8 @@ static int snd_kernel_minor(int type, struct snd_card *card, int dev)
} }
if (snd_BUG_ON(minor < 0 || minor >= SNDRV_OS_MINORS)) if (snd_BUG_ON(minor < 0 || minor >= SNDRV_OS_MINORS))
return -EINVAL; return -EINVAL;
if (snd_minors[minor])
return -EBUSY;
return minor; return minor;
} }
#endif #endif
...@@ -276,13 +278,7 @@ int snd_register_device(int type, struct snd_card *card, int dev, ...@@ -276,13 +278,7 @@ int snd_register_device(int type, struct snd_card *card, int dev,
preg->private_data = private_data; preg->private_data = private_data;
preg->card_ptr = card; preg->card_ptr = card;
mutex_lock(&sound_mutex); mutex_lock(&sound_mutex);
#ifdef CONFIG_SND_DYNAMIC_MINORS minor = snd_find_free_minor(type, card, dev);
minor = snd_find_free_minor(type);
#else
minor = snd_kernel_minor(type, card, dev);
if (minor >= 0 && snd_minors[minor])
minor = -EBUSY;
#endif
if (minor < 0) { if (minor < 0) {
err = minor; err = minor;
goto error; goto error;
......
...@@ -6043,23 +6043,30 @@ hdspm_hw_constraints_aes32_sample_rates = { ...@@ -6043,23 +6043,30 @@ hdspm_hw_constraints_aes32_sample_rates = {
.mask = 0 .mask = 0
}; };
static int snd_hdspm_playback_open(struct snd_pcm_substream *substream) static int snd_hdspm_open(struct snd_pcm_substream *substream)
{ {
struct hdspm *hdspm = snd_pcm_substream_chip(substream); struct hdspm *hdspm = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
snd_pcm_set_sync(substream); snd_pcm_set_sync(substream);
runtime->hw = (playback) ? snd_hdspm_playback_subinfo :
snd_hdspm_capture_subinfo;
if (playback) {
if (hdspm->capture_substream == NULL)
hdspm_stop_audio(hdspm);
runtime->hw = snd_hdspm_playback_subinfo; hdspm->playback_pid = current->pid;
hdspm->playback_substream = substream;
if (hdspm->capture_substream == NULL) } else {
hdspm_stop_audio(hdspm); if (hdspm->playback_substream == NULL)
hdspm_stop_audio(hdspm);
hdspm->playback_pid = current->pid; hdspm->capture_pid = current->pid;
hdspm->playback_substream = substream; hdspm->capture_substream = substream;
}
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
...@@ -6094,108 +6101,42 @@ static int snd_hdspm_playback_open(struct snd_pcm_substream *substream) ...@@ -6094,108 +6101,42 @@ static int snd_hdspm_playback_open(struct snd_pcm_substream *substream)
&hdspm_hw_constraints_aes32_sample_rates); &hdspm_hw_constraints_aes32_sample_rates);
} else { } else {
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
snd_hdspm_hw_rule_rate_out_channels, hdspm, (playback ?
snd_hdspm_hw_rule_rate_out_channels :
snd_hdspm_hw_rule_rate_in_channels), hdspm,
SNDRV_PCM_HW_PARAM_CHANNELS, -1); SNDRV_PCM_HW_PARAM_CHANNELS, -1);
} }
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
snd_hdspm_hw_rule_out_channels, hdspm, (playback ? snd_hdspm_hw_rule_out_channels :
snd_hdspm_hw_rule_in_channels), hdspm,
SNDRV_PCM_HW_PARAM_CHANNELS, -1); SNDRV_PCM_HW_PARAM_CHANNELS, -1);
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
snd_hdspm_hw_rule_out_channels_rate, hdspm, (playback ? snd_hdspm_hw_rule_out_channels_rate :
snd_hdspm_hw_rule_in_channels_rate), hdspm,
SNDRV_PCM_HW_PARAM_RATE, -1); SNDRV_PCM_HW_PARAM_RATE, -1);
return 0; return 0;
} }
static int snd_hdspm_playback_release(struct snd_pcm_substream *substream) static int snd_hdspm_release(struct snd_pcm_substream *substream)
{ {
struct hdspm *hdspm = snd_pcm_substream_chip(substream); struct hdspm *hdspm = snd_pcm_substream_chip(substream);
bool playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
spin_lock_irq(&hdspm->lock); spin_lock_irq(&hdspm->lock);
hdspm->playback_pid = -1; if (playback) {
hdspm->playback_substream = NULL; hdspm->playback_pid = -1;
hdspm->playback_substream = NULL;
spin_unlock_irq(&hdspm->lock);
return 0;
}
static int snd_hdspm_capture_open(struct snd_pcm_substream *substream)
{
struct hdspm *hdspm = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime;
spin_lock_irq(&hdspm->lock);
snd_pcm_set_sync(substream);
runtime->hw = snd_hdspm_capture_subinfo;
if (hdspm->playback_substream == NULL)
hdspm_stop_audio(hdspm);
hdspm->capture_pid = current->pid;
hdspm->capture_substream = substream;
spin_unlock_irq(&hdspm->lock);
snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
snd_pcm_hw_constraint_pow2(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE);
switch (hdspm->io_type) {
case AIO:
case RayDAT:
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
32, 4096);
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_BUFFER_SIZE,
16384, 16384);
break;
default:
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
64, 8192);
snd_pcm_hw_constraint_minmax(runtime,
SNDRV_PCM_HW_PARAM_PERIODS,
2, 2);
break;
}
if (AES32 == hdspm->io_type) {
runtime->hw.rates |= SNDRV_PCM_RATE_KNOT;
snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
&hdspm_hw_constraints_aes32_sample_rates);
} else { } else {
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE, hdspm->capture_pid = -1;
snd_hdspm_hw_rule_rate_in_channels, hdspm, hdspm->capture_substream = NULL;
SNDRV_PCM_HW_PARAM_CHANNELS, -1);
} }
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
snd_hdspm_hw_rule_in_channels, hdspm,
SNDRV_PCM_HW_PARAM_CHANNELS, -1);
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
snd_hdspm_hw_rule_in_channels_rate, hdspm,
SNDRV_PCM_HW_PARAM_RATE, -1);
return 0;
}
static int snd_hdspm_capture_release(struct snd_pcm_substream *substream)
{
struct hdspm *hdspm = snd_pcm_substream_chip(substream);
spin_lock_irq(&hdspm->lock);
hdspm->capture_pid = -1;
hdspm->capture_substream = NULL;
spin_unlock_irq(&hdspm->lock); spin_unlock_irq(&hdspm->lock);
return 0; return 0;
} }
...@@ -6413,21 +6354,9 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, ...@@ -6413,21 +6354,9 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep *hw, struct file *file,
return 0; return 0;
} }
static struct snd_pcm_ops snd_hdspm_playback_ops = { static struct snd_pcm_ops snd_hdspm_ops = {
.open = snd_hdspm_playback_open, .open = snd_hdspm_open,
.close = snd_hdspm_playback_release, .close = snd_hdspm_release,
.ioctl = snd_hdspm_ioctl,
.hw_params = snd_hdspm_hw_params,
.hw_free = snd_hdspm_hw_free,
.prepare = snd_hdspm_prepare,
.trigger = snd_hdspm_trigger,
.pointer = snd_hdspm_hw_pointer,
.page = snd_pcm_sgbuf_ops_page,
};
static struct snd_pcm_ops snd_hdspm_capture_ops = {
.open = snd_hdspm_capture_open,
.close = snd_hdspm_capture_release,
.ioctl = snd_hdspm_ioctl, .ioctl = snd_hdspm_ioctl,
.hw_params = snd_hdspm_hw_params, .hw_params = snd_hdspm_hw_params,
.hw_free = snd_hdspm_hw_free, .hw_free = snd_hdspm_hw_free,
...@@ -6521,9 +6450,9 @@ static int snd_hdspm_create_pcm(struct snd_card *card, ...@@ -6521,9 +6450,9 @@ static int snd_hdspm_create_pcm(struct snd_card *card,
strcpy(pcm->name, hdspm->card_name); strcpy(pcm->name, hdspm->card_name);
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK,
&snd_hdspm_playback_ops); &snd_hdspm_ops);
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE,
&snd_hdspm_capture_ops); &snd_hdspm_ops);
pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX; pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment