Merge tag 'sound-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai:
"A relatively calm release at this time, and no massive code changes
are found in the stats, while a wide range of code refactoring and
cleanup have been done.
Note that this update includes the tree-wide trivial changes for
dropping the return value from ISA remove callbacks, too.
Below lists up some highlight:
ALSA Core:
- Support for the software jack injection via debugfs
- Fixes for sync_stop PCM operations
HD-audio and USB-audio:
- A few usual HD-audio device quirks
- Updates for Tegra HD-audio
- More quirks for Pioneer and other USB-audio devices
- Stricter state checks at USB-audio disconnection
ASoC:
- Continued code refactoring, cleanup and fixes in ASoC core API
- A KUnit testsuite for the topology code
- Lots of ASoC Intel driver Realtek codec updates, quirk additions
and fixes
- Support for Ingenic JZ4760(B), Intel AlderLake-P, DT configured
nVidia cards, Qualcomm lpass-rx-macro and lpass-tx-macro
- Removal of obsolete SIRF prima/atlas, Txx9 and ZTE zx drivers
Others:
- Drop return value from ISA driver remove callback
- Cleanup with DIV_ROUND_UP() macro
- FireWire updates, HDSP output loopback support"
* tag 'sound-5.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (322 commits)
ALSA: hda: intel-dsp-config: add Alder Lake support
ASoC: soc-pcm: fix hw param limits calculation for multi-DAI
ASoC: Intel: bytcr_rt5640: Add quirk for the Acer One S1002 tablet
ASoC: Intel: bytcr_rt5651: Add quirk for the Jumper EZpad 7 tablet
ASoC: Intel: bytcr_rt5640: Add quirk for the Voyo Winpad A15 tablet
ASoC: Intel: bytcr_rt5640: Add quirk for the Estar Beauty HD MID 7316R tablet
ASoC: soc-pcm: fix hwparams min/max init for dpcm
ALSA: hda/realtek: Quirk for HP Spectre x360 14 amp setup
ALSA: usb-audio: Add implicit fb quirk for BOSS GP-10
ALSA: hda: Add another CometLake-H PCI ID
ASoC: soc-pcm: add soc_pcm_hw_update_format()
ASoC: soc-pcm: add soc_pcm_hw_update_chan()
ASoC: soc-pcm: add soc_pcm_hw_update_rate()
ASoC: wm_adsp: Remove unused control callback structure
ASoC: SOF: relax ABI checks and avoid unnecessary warnings
ASoC: codecs: lpass-tx-macro: add dapm widgets and route
ASoC: codecs: lpass-tx-macro: add support for lpass tx macro
ASoC: qcom: dt-bindings: add bindings for lpass tx macro codec
ASoC: codecs: lpass-rx-macro: add iir widgets
ASoC: codecs: lpass-rx-macro: add dapm widgets and route
...
This commit is contained in:
@@ -273,7 +273,7 @@ static struct attribute *ac97_controller_device_attrs[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group ac97_adapter_attr_group = {
|
||||
static const struct attribute_group ac97_adapter_attr_group = {
|
||||
.name = "ac97_operations",
|
||||
.attrs = ac97_controller_device_attrs,
|
||||
};
|
||||
|
||||
@@ -1013,7 +1013,7 @@ static int onyx_i2c_probe(struct i2c_client *client,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
strlcpy(onyx->codec.name, "onyx", MAX_CODEC_NAME_LEN);
|
||||
strscpy(onyx->codec.name, "onyx", MAX_CODEC_NAME_LEN);
|
||||
onyx->codec.owner = THIS_MODULE;
|
||||
onyx->codec.init = onyx_init_codec;
|
||||
onyx->codec.exit = onyx_exit_codec;
|
||||
|
||||
@@ -894,7 +894,7 @@ static int tas_i2c_probe(struct i2c_client *client,
|
||||
/* seems that half is a saner default */
|
||||
tas->drc_range = TAS3004_DRC_MAX / 2;
|
||||
|
||||
strlcpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN);
|
||||
strscpy(tas->codec.name, "tas", MAX_CODEC_NAME_LEN);
|
||||
tas->codec.owner = THIS_MODULE;
|
||||
tas->codec.init = tas_init_codec;
|
||||
tas->codec.exit = tas_exit_codec;
|
||||
|
||||
@@ -126,7 +126,7 @@ static int __init toonie_init(void)
|
||||
if (!toonie)
|
||||
return -ENOMEM;
|
||||
|
||||
strlcpy(toonie->codec.name, "toonie", sizeof(toonie->codec.name));
|
||||
strscpy(toonie->codec.name, "toonie", sizeof(toonie->codec.name));
|
||||
toonie->codec.owner = THIS_MODULE;
|
||||
toonie->codec.init = toonie_init_codec;
|
||||
toonie->codec.exit = toonie_exit_codec;
|
||||
|
||||
@@ -28,10 +28,10 @@ int aoa_alsa_init(char *name, struct module *mod, struct device *dev)
|
||||
return err;
|
||||
aoa_card = alsa_card->private_data;
|
||||
aoa_card->alsa_card = alsa_card;
|
||||
strlcpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver));
|
||||
strlcpy(alsa_card->shortname, name, sizeof(alsa_card->shortname));
|
||||
strlcpy(alsa_card->longname, name, sizeof(alsa_card->longname));
|
||||
strlcpy(alsa_card->mixername, name, sizeof(alsa_card->mixername));
|
||||
strscpy(alsa_card->driver, "AppleOnbdAudio", sizeof(alsa_card->driver));
|
||||
strscpy(alsa_card->shortname, name, sizeof(alsa_card->shortname));
|
||||
strscpy(alsa_card->longname, name, sizeof(alsa_card->longname));
|
||||
strscpy(alsa_card->mixername, name, sizeof(alsa_card->mixername));
|
||||
err = snd_card_register(aoa_card->alsa_card);
|
||||
if (err < 0) {
|
||||
printk(KERN_ERR "snd-aoa: couldn't register alsa card\n");
|
||||
|
||||
@@ -948,7 +948,7 @@ static void layout_attached_codec(struct aoa_codec *codec)
|
||||
ldev->gpio.methods->set_lineout(codec->gpio, 1);
|
||||
ctl = snd_ctl_new1(&lineout_ctl, codec->gpio);
|
||||
if (cc->connected & CC_LINEOUT_LABELLED_HEADPHONE)
|
||||
strlcpy(ctl->id.name,
|
||||
strscpy(ctl->id.name,
|
||||
"Headphone Switch", sizeof(ctl->id.name));
|
||||
ldev->lineout_ctrl = ctl;
|
||||
aoa_snd_ctl_add(ctl);
|
||||
@@ -962,14 +962,14 @@ static void layout_attached_codec(struct aoa_codec *codec)
|
||||
ctl = snd_ctl_new1(&lineout_detect_choice,
|
||||
ldev);
|
||||
if (cc->connected & CC_LINEOUT_LABELLED_HEADPHONE)
|
||||
strlcpy(ctl->id.name,
|
||||
strscpy(ctl->id.name,
|
||||
"Headphone Detect Autoswitch",
|
||||
sizeof(ctl->id.name));
|
||||
aoa_snd_ctl_add(ctl);
|
||||
ctl = snd_ctl_new1(&lineout_detected,
|
||||
ldev);
|
||||
if (cc->connected & CC_LINEOUT_LABELLED_HEADPHONE)
|
||||
strlcpy(ctl->id.name,
|
||||
strscpy(ctl->id.name,
|
||||
"Headphone Detected",
|
||||
sizeof(ctl->id.name));
|
||||
ldev->lineout_detected_ctrl = ctl;
|
||||
|
||||
@@ -13,7 +13,7 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
||||
int length;
|
||||
|
||||
if (*sdev->modalias) {
|
||||
strlcpy(buf, sdev->modalias, sizeof(sdev->modalias) + 1);
|
||||
strscpy(buf, sdev->modalias, sizeof(sdev->modalias) + 1);
|
||||
strcat(buf, "\n");
|
||||
length = strlen(buf);
|
||||
} else {
|
||||
|
||||
@@ -890,8 +890,8 @@ static struct aaci *aaci_init_card(struct amba_device *dev)
|
||||
|
||||
card->private_free = aaci_free_card;
|
||||
|
||||
strlcpy(card->driver, DRIVER_NAME, sizeof(card->driver));
|
||||
strlcpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname));
|
||||
strscpy(card->driver, DRIVER_NAME, sizeof(card->driver));
|
||||
strscpy(card->shortname, "ARM AC'97 Interface", sizeof(card->shortname));
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s PL%03x rev%u at 0x%08llx, irq %d",
|
||||
card->shortname, amba_part(dev), amba_rev(dev),
|
||||
@@ -921,7 +921,7 @@ static int aaci_init_pcm(struct aaci *aaci)
|
||||
pcm->private_data = aaci;
|
||||
pcm->info_flags = 0;
|
||||
|
||||
strlcpy(pcm->name, DRIVER_NAME, sizeof(pcm->name));
|
||||
strscpy(pcm->name, DRIVER_NAME, sizeof(pcm->name));
|
||||
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &aaci_playback_ops);
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &aaci_capture_ops);
|
||||
|
||||
@@ -235,7 +235,7 @@ static int pxa2xx_ac97_probe(struct platform_device *dev)
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
strlcpy(card->driver, dev->dev.driver->name, sizeof(card->driver));
|
||||
strscpy(card->driver, dev->dev.driver->name, sizeof(card->driver));
|
||||
|
||||
ret = pxa2xx_ac97_pcm_new(card);
|
||||
if (ret)
|
||||
|
||||
@@ -187,6 +187,15 @@ config SND_CTL_VALIDATION
|
||||
from the driver are in the proper ranges or the check of the invalid
|
||||
access at out-of-array areas.
|
||||
|
||||
config SND_JACK_INJECTION_DEBUG
|
||||
bool "Sound jack injection interface via debugfs"
|
||||
depends on SND_JACK && SND_DEBUG && DEBUG_FS
|
||||
help
|
||||
This option can be used to enable or disable sound jack
|
||||
software injection.
|
||||
Say Y if you are debugging via jack injection interface.
|
||||
If unsure select "N".
|
||||
|
||||
config SND_VMASTER
|
||||
bool
|
||||
|
||||
|
||||
@@ -1132,7 +1132,7 @@ static void snd_compress_proc_done(struct snd_compr *compr)
|
||||
|
||||
static inline void snd_compress_set_id(struct snd_compr *compr, const char *id)
|
||||
{
|
||||
strlcpy(compr->id, id, sizeof(compr->id));
|
||||
strscpy(compr->id, id, sizeof(compr->id));
|
||||
}
|
||||
#else
|
||||
static inline int snd_compress_proc_init(struct snd_compr *compr)
|
||||
|
||||
@@ -261,7 +261,7 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
|
||||
kctl->id.device = ncontrol->device;
|
||||
kctl->id.subdevice = ncontrol->subdevice;
|
||||
if (ncontrol->name) {
|
||||
strlcpy(kctl->id.name, ncontrol->name, sizeof(kctl->id.name));
|
||||
strscpy(kctl->id.name, ncontrol->name, sizeof(kctl->id.name));
|
||||
if (strcmp(ncontrol->name, kctl->id.name) != 0)
|
||||
pr_warn("ALSA: Control name '%s' truncated to '%s'\n",
|
||||
ncontrol->name, kctl->id.name);
|
||||
@@ -701,12 +701,12 @@ static int snd_ctl_card_info(struct snd_card *card, struct snd_ctl_file * ctl,
|
||||
return -ENOMEM;
|
||||
down_read(&snd_ioctl_rwsem);
|
||||
info->card = card->number;
|
||||
strlcpy(info->id, card->id, sizeof(info->id));
|
||||
strlcpy(info->driver, card->driver, sizeof(info->driver));
|
||||
strlcpy(info->name, card->shortname, sizeof(info->name));
|
||||
strlcpy(info->longname, card->longname, sizeof(info->longname));
|
||||
strlcpy(info->mixername, card->mixername, sizeof(info->mixername));
|
||||
strlcpy(info->components, card->components, sizeof(info->components));
|
||||
strscpy(info->id, card->id, sizeof(info->id));
|
||||
strscpy(info->driver, card->driver, sizeof(info->driver));
|
||||
strscpy(info->name, card->shortname, sizeof(info->name));
|
||||
strscpy(info->longname, card->longname, sizeof(info->longname));
|
||||
strscpy(info->mixername, card->mixername, sizeof(info->mixername));
|
||||
strscpy(info->components, card->components, sizeof(info->components));
|
||||
up_read(&snd_ioctl_rwsem);
|
||||
if (copy_to_user(arg, info, sizeof(struct snd_ctl_card_info))) {
|
||||
kfree(info);
|
||||
@@ -836,7 +836,7 @@ static void fill_remaining_elem_value(struct snd_ctl_elem_value *control,
|
||||
{
|
||||
size_t offset = value_sizes[info->type] * info->count;
|
||||
|
||||
offset = (offset + sizeof(u32) - 1) / sizeof(u32);
|
||||
offset = DIV_ROUND_UP(offset, sizeof(u32));
|
||||
memset32((u32 *)control->value.bytes.data + offset, pattern,
|
||||
sizeof(control->value) / sizeof(u32) - offset);
|
||||
}
|
||||
@@ -928,7 +928,7 @@ static int sanity_check_elem_value(struct snd_card *card,
|
||||
|
||||
/* check whether the remaining area kept untouched */
|
||||
offset = value_sizes[info->type] * info->count;
|
||||
offset = (offset + sizeof(u32) - 1) / sizeof(u32);
|
||||
offset = DIV_ROUND_UP(offset, sizeof(u32));
|
||||
p = (u32 *)control->value.bytes.data + offset;
|
||||
for (; offset < sizeof(control->value) / sizeof(u32); offset++, p++) {
|
||||
if (*p != pattern) {
|
||||
@@ -2137,7 +2137,7 @@ int snd_ctl_enum_info(struct snd_ctl_elem_info *info, unsigned int channels,
|
||||
WARN(strlen(names[info->value.enumerated.item]) >= sizeof(info->value.enumerated.name),
|
||||
"ALSA: too long item name '%s'\n",
|
||||
names[info->value.enumerated.item]);
|
||||
strlcpy(info->value.enumerated.name,
|
||||
strscpy(info->value.enumerated.name,
|
||||
names[info->value.enumerated.item],
|
||||
sizeof(info->value.enumerated.name));
|
||||
return 0;
|
||||
|
||||
@@ -35,7 +35,7 @@ static int get_available_index(struct snd_card *card, const char *name)
|
||||
|
||||
sid.index = 0;
|
||||
sid.iface = SNDRV_CTL_ELEM_IFACE_CARD;
|
||||
strlcpy(sid.name, name, sizeof(sid.name));
|
||||
strscpy(sid.name, name, sizeof(sid.name));
|
||||
|
||||
while (snd_ctl_find_id(card, &sid)) {
|
||||
sid.index++;
|
||||
|
||||
@@ -177,8 +177,8 @@ static int snd_hwdep_info(struct snd_hwdep *hw,
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
info.card = hw->card->number;
|
||||
strlcpy(info.id, hw->id, sizeof(info.id));
|
||||
strlcpy(info.name, hw->name, sizeof(info.name));
|
||||
strscpy(info.id, hw->id, sizeof(info.id));
|
||||
strscpy(info.name, hw->name, sizeof(info.name));
|
||||
info.iface = hw->iface;
|
||||
if (copy_to_user(_info, &info, sizeof(info)))
|
||||
return -EFAULT;
|
||||
@@ -379,7 +379,7 @@ int snd_hwdep_new(struct snd_card *card, char *id, int device,
|
||||
hwdep->card = card;
|
||||
hwdep->device = device;
|
||||
if (id)
|
||||
strlcpy(hwdep->id, id, sizeof(hwdep->id));
|
||||
strscpy(hwdep->id, id, sizeof(hwdep->id));
|
||||
|
||||
snd_device_initialize(&hwdep->dev, card);
|
||||
hwdep->dev.release = release_hwdep_device;
|
||||
|
||||
@@ -13,7 +13,9 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <sound/core.h>
|
||||
#include <sound/control.h>
|
||||
@@ -161,6 +163,9 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
|
||||
{
|
||||
struct snd_card *card;
|
||||
int err;
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
char name[8];
|
||||
#endif
|
||||
|
||||
if (snd_BUG_ON(!card_ret))
|
||||
return -EINVAL;
|
||||
@@ -174,7 +179,7 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
|
||||
if (extra_size > 0)
|
||||
card->private_data = (char *)card + sizeof(struct snd_card);
|
||||
if (xid)
|
||||
strlcpy(card->id, xid, sizeof(card->id));
|
||||
strscpy(card->id, xid, sizeof(card->id));
|
||||
err = 0;
|
||||
mutex_lock(&snd_card_mutex);
|
||||
if (idx < 0) /* first check the matching module-name slot */
|
||||
@@ -244,6 +249,12 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
|
||||
dev_err(parent, "unable to create card info\n");
|
||||
goto __error_ctl;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
sprintf(name, "card%d", idx);
|
||||
card->debugfs_root = debugfs_create_dir(name, sound_debugfs_root);
|
||||
#endif
|
||||
|
||||
*card_ret = card;
|
||||
return 0;
|
||||
|
||||
@@ -416,6 +427,9 @@ int snd_card_disconnect(struct snd_card *card)
|
||||
/* notify all devices that we are disconnected */
|
||||
snd_device_disconnect_all(card);
|
||||
|
||||
if (card->sync_irq > 0)
|
||||
synchronize_irq(card->sync_irq);
|
||||
|
||||
snd_info_card_disconnect(card);
|
||||
if (card->registered) {
|
||||
device_del(&card->card_dev);
|
||||
@@ -477,6 +491,10 @@ static int snd_card_do_free(struct snd_card *card)
|
||||
dev_warn(card->dev, "unable to free card info\n");
|
||||
/* Not fatal error */
|
||||
}
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
debugfs_remove(card->debugfs_root);
|
||||
card->debugfs_root = NULL;
|
||||
#endif
|
||||
if (card->release_completion)
|
||||
complete(card->release_completion);
|
||||
kfree(card);
|
||||
@@ -526,6 +544,7 @@ int snd_card_free(struct snd_card *card)
|
||||
return ret;
|
||||
/* wait, until all devices are ready for the free operation */
|
||||
wait_for_completion(&released);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_card_free);
|
||||
@@ -623,7 +642,7 @@ static void snd_card_set_id_no_lock(struct snd_card *card, const char *src,
|
||||
/* last resort... */
|
||||
dev_err(card->dev, "unable to set card id (%s)\n", id);
|
||||
if (card->proc_root->name)
|
||||
strlcpy(card->id, card->proc_root->name, sizeof(card->id));
|
||||
strscpy(card->id, card->proc_root->name, sizeof(card->id));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <sound/jack.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/control.h>
|
||||
@@ -16,6 +19,11 @@ struct snd_jack_kctl {
|
||||
struct snd_kcontrol *kctl;
|
||||
struct list_head list; /* list of controls belong to the same jack */
|
||||
unsigned int mask_bits; /* only masked status bits are reported via kctl */
|
||||
struct snd_jack *jack; /* pointer to struct snd_jack */
|
||||
bool sw_inject_enable; /* allow to inject plug event via debugfs */
|
||||
#ifdef CONFIG_SND_JACK_INJECTION_DEBUG
|
||||
struct dentry *jack_debugfs_root; /* jack_kctl debugfs root */
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
@@ -109,12 +117,291 @@ static int snd_jack_dev_register(struct snd_device *device)
|
||||
}
|
||||
#endif /* CONFIG_SND_JACK_INPUT_DEV */
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INJECTION_DEBUG
|
||||
static void snd_jack_inject_report(struct snd_jack_kctl *jack_kctl, int status)
|
||||
{
|
||||
struct snd_jack *jack;
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
int i;
|
||||
#endif
|
||||
if (!jack_kctl)
|
||||
return;
|
||||
|
||||
jack = jack_kctl->jack;
|
||||
|
||||
if (jack_kctl->sw_inject_enable)
|
||||
snd_kctl_jack_report(jack->card, jack_kctl->kctl,
|
||||
status & jack_kctl->mask_bits);
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
if (!jack->input_dev)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
|
||||
int testbit = ((SND_JACK_BTN_0 >> i) & jack_kctl->mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_key(jack->input_dev, jack->key[i],
|
||||
status & testbit);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) {
|
||||
int testbit = ((1 << i) & jack_kctl->mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_switch(jack->input_dev,
|
||||
jack_switch_types[i],
|
||||
status & testbit);
|
||||
}
|
||||
|
||||
input_sync(jack->input_dev);
|
||||
#endif /* CONFIG_SND_JACK_INPUT_DEV */
|
||||
}
|
||||
|
||||
static ssize_t sw_inject_enable_read(struct file *file,
|
||||
char __user *to, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
int len, ret;
|
||||
char buf[128];
|
||||
|
||||
len = scnprintf(buf, sizeof(buf), "%s: %s\t\t%s: %i\n", "Jack", jack_kctl->kctl->id.name,
|
||||
"Inject Enabled", jack_kctl->sw_inject_enable);
|
||||
ret = simple_read_from_buffer(to, count, ppos, buf, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t sw_inject_enable_write(struct file *file,
|
||||
const char __user *from, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
int ret, err;
|
||||
unsigned long enable;
|
||||
char buf[8] = { 0 };
|
||||
|
||||
ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, from, count);
|
||||
err = kstrtoul(buf, 0, &enable);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (jack_kctl->sw_inject_enable == (!!enable))
|
||||
return ret;
|
||||
|
||||
jack_kctl->sw_inject_enable = !!enable;
|
||||
|
||||
if (!jack_kctl->sw_inject_enable)
|
||||
snd_jack_report(jack_kctl->jack, jack_kctl->jack->hw_status_cache);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t jackin_inject_write(struct file *file,
|
||||
const char __user *from, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
int ret, err;
|
||||
unsigned long enable;
|
||||
char buf[8] = { 0 };
|
||||
|
||||
if (!jack_kctl->sw_inject_enable)
|
||||
return -EINVAL;
|
||||
|
||||
ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, from, count);
|
||||
err = kstrtoul(buf, 0, &enable);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
snd_jack_inject_report(jack_kctl, !!enable ? jack_kctl->mask_bits : 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t jack_kctl_id_read(struct file *file,
|
||||
char __user *to, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
char buf[64];
|
||||
int len, ret;
|
||||
|
||||
len = scnprintf(buf, sizeof(buf), "%s\n", jack_kctl->kctl->id.name);
|
||||
ret = simple_read_from_buffer(to, count, ppos, buf, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* the bit definition is aligned with snd_jack_types in jack.h */
|
||||
static const char * const jack_events_name[] = {
|
||||
"HEADPHONE(0x0001)", "MICROPHONE(0x0002)", "LINEOUT(0x0004)",
|
||||
"MECHANICAL(0x0008)", "VIDEOOUT(0x0010)", "LINEIN(0x0020)",
|
||||
"", "", "", "BTN_5(0x0200)", "BTN_4(0x0400)", "BTN_3(0x0800)",
|
||||
"BTN_2(0x1000)", "BTN_1(0x2000)", "BTN_0(0x4000)", "",
|
||||
};
|
||||
|
||||
/* the recommended buffer size is 256 */
|
||||
static int parse_mask_bits(unsigned int mask_bits, char *buf, size_t buf_size)
|
||||
{
|
||||
int i;
|
||||
|
||||
scnprintf(buf, buf_size, "0x%04x", mask_bits);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack_events_name); i++)
|
||||
if (mask_bits & (1 << i)) {
|
||||
strlcat(buf, " ", buf_size);
|
||||
strlcat(buf, jack_events_name[i], buf_size);
|
||||
}
|
||||
strlcat(buf, "\n", buf_size);
|
||||
|
||||
return strlen(buf);
|
||||
}
|
||||
|
||||
static ssize_t jack_kctl_mask_bits_read(struct file *file,
|
||||
char __user *to, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
char buf[256];
|
||||
int len, ret;
|
||||
|
||||
len = parse_mask_bits(jack_kctl->mask_bits, buf, sizeof(buf));
|
||||
ret = simple_read_from_buffer(to, count, ppos, buf, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t jack_kctl_status_read(struct file *file,
|
||||
char __user *to, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
char buf[16];
|
||||
int len, ret;
|
||||
|
||||
len = scnprintf(buf, sizeof(buf), "%s\n", jack_kctl->kctl->private_value ?
|
||||
"Plugged" : "Unplugged");
|
||||
ret = simple_read_from_buffer(to, count, ppos, buf, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
static ssize_t jack_type_read(struct file *file,
|
||||
char __user *to, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl = file->private_data;
|
||||
char buf[256];
|
||||
int len, ret;
|
||||
|
||||
len = parse_mask_bits(jack_kctl->jack->type, buf, sizeof(buf));
|
||||
ret = simple_read_from_buffer(to, count, ppos, buf, len);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations jack_type_fops = {
|
||||
.open = simple_open,
|
||||
.read = jack_type_read,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct file_operations sw_inject_enable_fops = {
|
||||
.open = simple_open,
|
||||
.read = sw_inject_enable_read,
|
||||
.write = sw_inject_enable_write,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static const struct file_operations jackin_inject_fops = {
|
||||
.open = simple_open,
|
||||
.write = jackin_inject_write,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static const struct file_operations jack_kctl_id_fops = {
|
||||
.open = simple_open,
|
||||
.read = jack_kctl_id_read,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static const struct file_operations jack_kctl_mask_bits_fops = {
|
||||
.open = simple_open,
|
||||
.read = jack_kctl_mask_bits_read,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static const struct file_operations jack_kctl_status_fops = {
|
||||
.open = simple_open,
|
||||
.read = jack_kctl_status_read,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
|
||||
struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
char *tname;
|
||||
int i;
|
||||
|
||||
/* Don't create injection interface for Phantom jacks */
|
||||
if (strstr(jack_kctl->kctl->id.name, "Phantom"))
|
||||
return 0;
|
||||
|
||||
tname = kstrdup(jack_kctl->kctl->id.name, GFP_KERNEL);
|
||||
if (!tname)
|
||||
return -ENOMEM;
|
||||
|
||||
/* replace the chars which are not suitable for folder's name with _ */
|
||||
for (i = 0; tname[i]; i++)
|
||||
if (!isalnum(tname[i]))
|
||||
tname[i] = '_';
|
||||
|
||||
jack_kctl->jack_debugfs_root = debugfs_create_dir(tname, jack->card->debugfs_root);
|
||||
kfree(tname);
|
||||
|
||||
debugfs_create_file("sw_inject_enable", 0644, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&sw_inject_enable_fops);
|
||||
|
||||
debugfs_create_file("jackin_inject", 0200, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&jackin_inject_fops);
|
||||
|
||||
debugfs_create_file("kctl_id", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&jack_kctl_id_fops);
|
||||
|
||||
debugfs_create_file("mask_bits", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&jack_kctl_mask_bits_fops);
|
||||
|
||||
debugfs_create_file("status", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&jack_kctl_status_fops);
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
debugfs_create_file("type", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
|
||||
&jack_type_fops);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_jack_debugfs_clear_inject_node(struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
debugfs_remove(jack_kctl->jack_debugfs_root);
|
||||
jack_kctl->jack_debugfs_root = NULL;
|
||||
}
|
||||
#else /* CONFIG_SND_JACK_INJECTION_DEBUG */
|
||||
static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
|
||||
struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_jack_debugfs_clear_inject_node(struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_SND_JACK_INJECTION_DEBUG */
|
||||
|
||||
static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
|
||||
jack_kctl = kctl->private_data;
|
||||
if (jack_kctl) {
|
||||
snd_jack_debugfs_clear_inject_node(jack_kctl);
|
||||
list_del(&jack_kctl->list);
|
||||
kfree(jack_kctl);
|
||||
}
|
||||
@@ -122,7 +409,9 @@ static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
|
||||
|
||||
static void snd_jack_kctl_add(struct snd_jack *jack, struct snd_jack_kctl *jack_kctl)
|
||||
{
|
||||
jack_kctl->jack = jack;
|
||||
list_add_tail(&jack_kctl->list, &jack->kctl_list);
|
||||
snd_jack_debugfs_add_inject_node(jack, jack_kctl);
|
||||
}
|
||||
|
||||
static struct snd_jack_kctl * snd_jack_kctl_new(struct snd_card *card, const char *name, unsigned int mask)
|
||||
@@ -340,6 +629,7 @@ EXPORT_SYMBOL(snd_jack_set_key);
|
||||
void snd_jack_report(struct snd_jack *jack, int status)
|
||||
{
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
unsigned int mask_bits = 0;
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
int i;
|
||||
#endif
|
||||
@@ -347,16 +637,21 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
if (!jack)
|
||||
return;
|
||||
|
||||
jack->hw_status_cache = status;
|
||||
|
||||
list_for_each_entry(jack_kctl, &jack->kctl_list, list)
|
||||
snd_kctl_jack_report(jack->card, jack_kctl->kctl,
|
||||
status & jack_kctl->mask_bits);
|
||||
if (jack_kctl->sw_inject_enable)
|
||||
mask_bits |= jack_kctl->mask_bits;
|
||||
else
|
||||
snd_kctl_jack_report(jack->card, jack_kctl->kctl,
|
||||
status & jack_kctl->mask_bits);
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
if (!jack->input_dev)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
|
||||
int testbit = SND_JACK_BTN_0 >> i;
|
||||
int testbit = ((SND_JACK_BTN_0 >> i) & ~mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_key(jack->input_dev, jack->key[i],
|
||||
@@ -364,7 +659,8 @@ void snd_jack_report(struct snd_jack *jack, int status)
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) {
|
||||
int testbit = 1 << i;
|
||||
int testbit = ((1 << i) & ~mask_bits);
|
||||
|
||||
if (jack->type & testbit)
|
||||
input_report_switch(jack->input_dev,
|
||||
jack_switch_types[i],
|
||||
|
||||
@@ -87,8 +87,8 @@ static int snd_mixer_oss_info(struct snd_mixer_oss_file *fmixer,
|
||||
struct mixer_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
strlcpy(info.id, mixer && mixer->id[0] ? mixer->id : card->driver, sizeof(info.id));
|
||||
strlcpy(info.name, mixer && mixer->name[0] ? mixer->name : card->mixername, sizeof(info.name));
|
||||
strscpy(info.id, mixer && mixer->id[0] ? mixer->id : card->driver, sizeof(info.id));
|
||||
strscpy(info.name, mixer && mixer->name[0] ? mixer->name : card->mixername, sizeof(info.name));
|
||||
info.modify_counter = card->mixer_oss_change_count;
|
||||
if (copy_to_user(_info, &info, sizeof(info)))
|
||||
return -EFAULT;
|
||||
@@ -103,8 +103,8 @@ static int snd_mixer_oss_info_obsolete(struct snd_mixer_oss_file *fmixer,
|
||||
_old_mixer_info info;
|
||||
|
||||
memset(&info, 0, sizeof(info));
|
||||
strlcpy(info.id, mixer && mixer->id[0] ? mixer->id : card->driver, sizeof(info.id));
|
||||
strlcpy(info.name, mixer && mixer->name[0] ? mixer->name : card->mixername, sizeof(info.name));
|
||||
strscpy(info.id, mixer && mixer->id[0] ? mixer->id : card->driver, sizeof(info.id));
|
||||
strscpy(info.name, mixer && mixer->name[0] ? mixer->name : card->mixername, sizeof(info.name));
|
||||
if (copy_to_user(_info, &info, sizeof(info)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
@@ -418,7 +418,7 @@ static long snd_mixer_oss_conv(long val, long omin, long omax, long nmin, long n
|
||||
|
||||
if (orange == 0)
|
||||
return 0;
|
||||
return ((nrange * (val - omin)) + (orange / 2)) / orange + nmin;
|
||||
return DIV_ROUND_CLOSEST(nrange * (val - omin), orange) + nmin;
|
||||
}
|
||||
|
||||
/* convert from alsa native to oss values (0-100) */
|
||||
@@ -499,7 +499,7 @@ static struct snd_kcontrol *snd_mixer_oss_test_id(struct snd_mixer_oss *mixer, c
|
||||
|
||||
memset(&id, 0, sizeof(id));
|
||||
id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
strlcpy(id.name, name, sizeof(id.name));
|
||||
strscpy(id.name, name, sizeof(id.name));
|
||||
id.index = index;
|
||||
return snd_ctl_find_id(card, &id);
|
||||
}
|
||||
@@ -1355,7 +1355,7 @@ static int snd_mixer_oss_notify_handler(struct snd_card *card, int cmd)
|
||||
mixer->oss_dev_alloc = 1;
|
||||
mixer->card = card;
|
||||
if (*card->mixername)
|
||||
strlcpy(mixer->name, card->mixername, sizeof(mixer->name));
|
||||
strscpy(mixer->name, card->mixername, sizeof(mixer->name));
|
||||
else
|
||||
snprintf(mixer->name, sizeof(mixer->name),
|
||||
"mixer%i", card->number);
|
||||
|
||||
@@ -193,7 +193,7 @@ static snd_pcm_sframes_t rate_src_frames(struct snd_pcm_plugin *plugin, snd_pcm_
|
||||
if (plugin->src_format.rate < plugin->dst_format.rate) {
|
||||
res = (((frames * data->pitch) + (BITS/2)) >> SHIFT);
|
||||
} else {
|
||||
res = (((frames << SHIFT) + (data->pitch / 2)) / data->pitch);
|
||||
res = DIV_ROUND_CLOSEST(frames << SHIFT, data->pitch);
|
||||
}
|
||||
if (data->old_src_frames > 0) {
|
||||
snd_pcm_sframes_t frames1 = frames, res1 = data->old_dst_frames;
|
||||
@@ -224,7 +224,7 @@ static snd_pcm_sframes_t rate_dst_frames(struct snd_pcm_plugin *plugin, snd_pcm_
|
||||
return 0;
|
||||
data = (struct rate_priv *)plugin->extra_data;
|
||||
if (plugin->src_format.rate < plugin->dst_format.rate) {
|
||||
res = (((frames << SHIFT) + (data->pitch / 2)) / data->pitch);
|
||||
res = DIV_ROUND_CLOSEST(frames << SHIFT, data->pitch);
|
||||
} else {
|
||||
res = (((frames * data->pitch) + (BITS/2)) >> SHIFT);
|
||||
}
|
||||
|
||||
@@ -729,7 +729,7 @@ static int _snd_pcm_new(struct snd_card *card, const char *id, int device,
|
||||
init_waitqueue_head(&pcm->open_wait);
|
||||
INIT_LIST_HEAD(&pcm->list);
|
||||
if (id)
|
||||
strlcpy(pcm->id, id, sizeof(pcm->id));
|
||||
strscpy(pcm->id, id, sizeof(pcm->id));
|
||||
|
||||
err = snd_pcm_new_stream(pcm, SNDRV_PCM_STREAM_PLAYBACK,
|
||||
playback_count);
|
||||
@@ -1095,22 +1095,23 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
||||
mutex_lock(&pcm->open_mutex);
|
||||
wake_up(&pcm->open_wait);
|
||||
list_del_init(&pcm->list);
|
||||
for (cidx = 0; cidx < 2; cidx++) {
|
||||
for (substream = pcm->streams[cidx].substream; substream; substream = substream->next) {
|
||||
snd_pcm_stream_lock_irq(substream);
|
||||
if (substream->runtime) {
|
||||
if (snd_pcm_running(substream))
|
||||
snd_pcm_stop(substream,
|
||||
SNDRV_PCM_STATE_DISCONNECTED);
|
||||
/* to be sure, set the state unconditionally */
|
||||
substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
|
||||
wake_up(&substream->runtime->sleep);
|
||||
wake_up(&substream->runtime->tsleep);
|
||||
}
|
||||
snd_pcm_stream_unlock_irq(substream);
|
||||
|
||||
for_each_pcm_substream(pcm, cidx, substream) {
|
||||
snd_pcm_stream_lock_irq(substream);
|
||||
if (substream->runtime) {
|
||||
if (snd_pcm_running(substream))
|
||||
snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED);
|
||||
/* to be sure, set the state unconditionally */
|
||||
substream->runtime->status->state = SNDRV_PCM_STATE_DISCONNECTED;
|
||||
wake_up(&substream->runtime->sleep);
|
||||
wake_up(&substream->runtime->tsleep);
|
||||
}
|
||||
snd_pcm_stream_unlock_irq(substream);
|
||||
}
|
||||
|
||||
for_each_pcm_substream(pcm, cidx, substream)
|
||||
snd_pcm_sync_stop(substream, false);
|
||||
|
||||
pcm_call_notify(pcm, n_disconnect);
|
||||
for (cidx = 0; cidx < 2; cidx++) {
|
||||
snd_unregister_device(&pcm->streams[cidx].dev);
|
||||
|
||||
@@ -125,6 +125,8 @@ void snd_dmaengine_pcm_set_config_from_dai_data(
|
||||
}
|
||||
|
||||
slave_config->slave_id = dma_data->slave_id;
|
||||
slave_config->peripheral_config = dma_data->peripheral_config;
|
||||
slave_config->peripheral_size = dma_data->peripheral_size;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_set_config_from_dai_data);
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
|
||||
|
||||
void __snd_pcm_xrun(struct snd_pcm_substream *substream);
|
||||
void snd_pcm_group_init(struct snd_pcm_group *group);
|
||||
void snd_pcm_sync_stop(struct snd_pcm_substream *substream, bool sync_irq);
|
||||
|
||||
#ifdef CONFIG_SND_DMA_SGBUF
|
||||
struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,
|
||||
@@ -71,4 +72,10 @@ struct page *snd_pcm_sgbuf_ops_page(struct snd_pcm_substream *substream,
|
||||
|
||||
#define PCM_RUNTIME_CHECK(sub) snd_BUG_ON(!(sub) || !(sub)->runtime)
|
||||
|
||||
/* loop over all PCM substreams */
|
||||
#define for_each_pcm_substream(pcm, str, subs) \
|
||||
for ((str) = 0; (str) < 2; (str)++) \
|
||||
for ((subs) = (pcm)->streams[str].substream; (subs); \
|
||||
(subs) = (subs)->next)
|
||||
|
||||
#endif /* __SOUND_CORE_PCM_LOCAL_H */
|
||||
|
||||
@@ -111,9 +111,8 @@ void snd_pcm_lib_preallocate_free_for_all(struct snd_pcm *pcm)
|
||||
struct snd_pcm_substream *substream;
|
||||
int stream;
|
||||
|
||||
for (stream = 0; stream < 2; stream++)
|
||||
for (substream = pcm->streams[stream].substream; substream; substream = substream->next)
|
||||
snd_pcm_lib_preallocate_free(substream);
|
||||
for_each_pcm_substream(pcm, stream, substream)
|
||||
snd_pcm_lib_preallocate_free(substream);
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_lib_preallocate_free_for_all);
|
||||
|
||||
@@ -246,11 +245,8 @@ static void preallocate_pages_for_all(struct snd_pcm *pcm, int type,
|
||||
struct snd_pcm_substream *substream;
|
||||
int stream;
|
||||
|
||||
for (stream = 0; stream < 2; stream++)
|
||||
for (substream = pcm->streams[stream].substream; substream;
|
||||
substream = substream->next)
|
||||
preallocate_pages(substream, type, data, size, max,
|
||||
managed);
|
||||
for_each_pcm_substream(pcm, stream, substream)
|
||||
preallocate_pages(substream, type, data, size, max, managed);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -209,13 +209,13 @@ int snd_pcm_info(struct snd_pcm_substream *substream, struct snd_pcm_info *info)
|
||||
info->device = pcm->device;
|
||||
info->stream = substream->stream;
|
||||
info->subdevice = substream->number;
|
||||
strlcpy(info->id, pcm->id, sizeof(info->id));
|
||||
strlcpy(info->name, pcm->name, sizeof(info->name));
|
||||
strscpy(info->id, pcm->id, sizeof(info->id));
|
||||
strscpy(info->name, pcm->name, sizeof(info->name));
|
||||
info->dev_class = pcm->dev_class;
|
||||
info->dev_subclass = pcm->dev_subclass;
|
||||
info->subdevices_count = pstr->substream_count;
|
||||
info->subdevices_avail = pstr->substream_count - pstr->substream_opened;
|
||||
strlcpy(info->subname, substream->name, sizeof(info->subname));
|
||||
strscpy(info->subname, substream->name, sizeof(info->subname));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -583,13 +583,13 @@ static inline void snd_pcm_timer_notify(struct snd_pcm_substream *substream,
|
||||
#endif
|
||||
}
|
||||
|
||||
static void snd_pcm_sync_stop(struct snd_pcm_substream *substream)
|
||||
void snd_pcm_sync_stop(struct snd_pcm_substream *substream, bool sync_irq)
|
||||
{
|
||||
if (substream->runtime->stop_operating) {
|
||||
if (substream->runtime && substream->runtime->stop_operating) {
|
||||
substream->runtime->stop_operating = false;
|
||||
if (substream->ops->sync_stop)
|
||||
if (substream->ops && substream->ops->sync_stop)
|
||||
substream->ops->sync_stop(substream);
|
||||
else if (substream->pcm->card->sync_irq > 0)
|
||||
else if (sync_irq && substream->pcm->card->sync_irq > 0)
|
||||
synchronize_irq(substream->pcm->card->sync_irq);
|
||||
}
|
||||
}
|
||||
@@ -686,7 +686,7 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
if (atomic_read(&substream->mmap_count))
|
||||
return -EBADFD;
|
||||
|
||||
snd_pcm_sync_stop(substream);
|
||||
snd_pcm_sync_stop(substream, true);
|
||||
|
||||
params->rmask = ~0U;
|
||||
err = snd_pcm_hw_refine(substream, params);
|
||||
@@ -809,7 +809,7 @@ static int do_hw_free(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
snd_pcm_sync_stop(substream);
|
||||
snd_pcm_sync_stop(substream, true);
|
||||
if (substream->ops->hw_free)
|
||||
result = substream->ops->hw_free(substream);
|
||||
if (substream->managed_buffer_alloc)
|
||||
@@ -1421,8 +1421,10 @@ static int snd_pcm_do_stop(struct snd_pcm_substream *substream,
|
||||
snd_pcm_state_t state)
|
||||
{
|
||||
if (substream->runtime->trigger_master == substream &&
|
||||
snd_pcm_running(substream))
|
||||
snd_pcm_running(substream)) {
|
||||
substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP);
|
||||
substream->runtime->stop_operating = true;
|
||||
}
|
||||
return 0; /* unconditonally stop all substreams */
|
||||
}
|
||||
|
||||
@@ -1435,7 +1437,6 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream,
|
||||
runtime->status->state = state;
|
||||
snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MSTOP);
|
||||
}
|
||||
runtime->stop_operating = true;
|
||||
wake_up(&runtime->sleep);
|
||||
wake_up(&runtime->tsleep);
|
||||
}
|
||||
@@ -1615,6 +1616,7 @@ static int snd_pcm_do_suspend(struct snd_pcm_substream *substream,
|
||||
if (! snd_pcm_running(substream))
|
||||
return 0;
|
||||
substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_SUSPEND);
|
||||
runtime->stop_operating = true;
|
||||
return 0; /* suspend unconditionally */
|
||||
}
|
||||
|
||||
@@ -1672,25 +1674,26 @@ int snd_pcm_suspend_all(struct snd_pcm *pcm)
|
||||
if (! pcm)
|
||||
return 0;
|
||||
|
||||
for (stream = 0; stream < 2; stream++) {
|
||||
for (substream = pcm->streams[stream].substream;
|
||||
substream; substream = substream->next) {
|
||||
/* FIXME: the open/close code should lock this as well */
|
||||
if (substream->runtime == NULL)
|
||||
continue;
|
||||
for_each_pcm_substream(pcm, stream, substream) {
|
||||
/* FIXME: the open/close code should lock this as well */
|
||||
if (!substream->runtime)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Skip BE dai link PCM's that are internal and may
|
||||
* not have their substream ops set.
|
||||
*/
|
||||
if (!substream->ops)
|
||||
continue;
|
||||
/*
|
||||
* Skip BE dai link PCM's that are internal and may
|
||||
* not have their substream ops set.
|
||||
*/
|
||||
if (!substream->ops)
|
||||
continue;
|
||||
|
||||
err = snd_pcm_suspend(substream);
|
||||
if (err < 0 && err != -EBUSY)
|
||||
return err;
|
||||
}
|
||||
err = snd_pcm_suspend(substream);
|
||||
if (err < 0 && err != -EBUSY)
|
||||
return err;
|
||||
}
|
||||
|
||||
for_each_pcm_substream(pcm, stream, substream)
|
||||
snd_pcm_sync_stop(substream, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(snd_pcm_suspend_all);
|
||||
@@ -1736,7 +1739,6 @@ static void snd_pcm_post_resume(struct snd_pcm_substream *substream,
|
||||
snd_pcm_trigger_tstamp(substream);
|
||||
runtime->status->state = runtime->status->suspended_state;
|
||||
snd_pcm_timer_notify(substream, SNDRV_TIMER_EVENT_MRESUME);
|
||||
snd_pcm_sync_stop(substream);
|
||||
}
|
||||
|
||||
static const struct action_ops snd_pcm_action_resume = {
|
||||
@@ -1866,7 +1868,7 @@ static int snd_pcm_do_prepare(struct snd_pcm_substream *substream,
|
||||
snd_pcm_state_t state)
|
||||
{
|
||||
int err;
|
||||
snd_pcm_sync_stop(substream);
|
||||
snd_pcm_sync_stop(substream, true);
|
||||
err = substream->ops->prepare(substream);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
@@ -1686,7 +1686,7 @@ int snd_rawmidi_new(struct snd_card *card, char *id, int device,
|
||||
INIT_LIST_HEAD(&rmidi->streams[SNDRV_RAWMIDI_STREAM_OUTPUT].substreams);
|
||||
|
||||
if (id != NULL)
|
||||
strlcpy(rmidi->id, id, sizeof(rmidi->id));
|
||||
strscpy(rmidi->id, id, sizeof(rmidi->id));
|
||||
|
||||
snd_device_initialize(&rmidi->dev, card);
|
||||
rmidi->dev.release = release_rawmidi_device;
|
||||
|
||||
@@ -173,7 +173,7 @@ snd_seq_oss_midi_check_new_port(struct snd_seq_port_info *pinfo)
|
||||
snd_use_lock_init(&mdev->use_lock);
|
||||
|
||||
/* copy and truncate the name of synth device */
|
||||
strlcpy(mdev->name, pinfo->name, sizeof(mdev->name));
|
||||
strscpy(mdev->name, pinfo->name, sizeof(mdev->name));
|
||||
|
||||
/* create MIDI coder */
|
||||
if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &mdev->coder) < 0) {
|
||||
@@ -647,7 +647,7 @@ snd_seq_oss_midi_make_info(struct seq_oss_devinfo *dp, int dev, struct midi_info
|
||||
inf->device = dev;
|
||||
inf->dev_type = 0; /* FIXME: ?? */
|
||||
inf->capabilities = 0; /* FIXME: ?? */
|
||||
strlcpy(inf->name, mdev->name, sizeof(inf->name));
|
||||
strscpy(inf->name, mdev->name, sizeof(inf->name));
|
||||
snd_use_lock_free(&mdev->use_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ snd_seq_oss_synth_probe(struct device *_dev)
|
||||
snd_use_lock_init(&rec->use_lock);
|
||||
|
||||
/* copy and truncate the name of synth device */
|
||||
strlcpy(rec->name, dev->name, sizeof(rec->name));
|
||||
strscpy(rec->name, dev->name, sizeof(rec->name));
|
||||
|
||||
/* registration */
|
||||
spin_lock_irqsave(®ister_lock, flags);
|
||||
@@ -617,7 +617,7 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
|
||||
inf->synth_subtype = 0;
|
||||
inf->nr_voices = 16;
|
||||
inf->device = dev;
|
||||
strlcpy(inf->name, minf.name, sizeof(inf->name));
|
||||
strscpy(inf->name, minf.name, sizeof(inf->name));
|
||||
} else {
|
||||
if ((rec = get_synthdev(dp, dev)) == NULL)
|
||||
return -ENXIO;
|
||||
@@ -625,7 +625,7 @@ snd_seq_oss_synth_make_info(struct seq_oss_devinfo *dp, int dev, struct synth_in
|
||||
inf->synth_subtype = rec->synth_subtype;
|
||||
inf->nr_voices = rec->nr_voices;
|
||||
inf->device = dev;
|
||||
strlcpy(inf->name, rec->name, sizeof(inf->name));
|
||||
strscpy(inf->name, rec->name, sizeof(inf->name));
|
||||
snd_use_lock_free(&rec->use_lock);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -1584,7 +1584,7 @@ static int snd_seq_ioctl_get_queue_info(struct snd_seq_client *client,
|
||||
info->queue = q->queue;
|
||||
info->owner = q->owner;
|
||||
info->locked = q->locked;
|
||||
strlcpy(info->name, q->name, sizeof(info->name));
|
||||
strscpy(info->name, q->name, sizeof(info->name));
|
||||
queuefree(q);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -290,7 +290,7 @@ int snd_seq_event_dup(struct snd_seq_pool *pool, struct snd_seq_event *event,
|
||||
extlen = 0;
|
||||
if (snd_seq_ev_is_variable(event)) {
|
||||
extlen = event->data.ext.len & ~SNDRV_SEQ_EXT_MASK;
|
||||
ncells = (extlen + sizeof(struct snd_seq_event) - 1) / sizeof(struct snd_seq_event);
|
||||
ncells = DIV_ROUND_UP(extlen, sizeof(struct snd_seq_event));
|
||||
}
|
||||
if (ncells >= pool->total_elements)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -327,7 +327,7 @@ int snd_seq_set_port_info(struct snd_seq_client_port * port,
|
||||
|
||||
/* set port name */
|
||||
if (info->name[0])
|
||||
strlcpy(port->name, info->name, sizeof(port->name));
|
||||
strscpy(port->name, info->name, sizeof(port->name));
|
||||
|
||||
/* set capabilities */
|
||||
port->capability = info->capability;
|
||||
@@ -356,7 +356,7 @@ int snd_seq_get_port_info(struct snd_seq_client_port * port,
|
||||
return -EINVAL;
|
||||
|
||||
/* get port name */
|
||||
strlcpy(info->name, port->name, sizeof(info->name));
|
||||
strscpy(info->name, port->name, sizeof(info->name));
|
||||
|
||||
/* get capabilities */
|
||||
info->capability = port->capability;
|
||||
@@ -654,7 +654,7 @@ int snd_seq_event_port_attach(int client,
|
||||
/* Set up the port */
|
||||
memset(&portinfo, 0, sizeof(portinfo));
|
||||
portinfo.addr.client = client;
|
||||
strlcpy(portinfo.name, portname ? portname : "Unnamed port",
|
||||
strscpy(portinfo.name, portname ? portname : "Unnamed port",
|
||||
sizeof(portinfo.name));
|
||||
|
||||
portinfo.capability = cap;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <linux/time.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/minors.h>
|
||||
#include <sound/info.h>
|
||||
@@ -39,6 +40,11 @@ MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
|
||||
int snd_ecards_limit;
|
||||
EXPORT_SYMBOL(snd_ecards_limit);
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
struct dentry *sound_debugfs_root;
|
||||
EXPORT_SYMBOL_GPL(sound_debugfs_root);
|
||||
#endif
|
||||
|
||||
static struct snd_minor *snd_minors[SNDRV_OS_MINORS];
|
||||
static DEFINE_MUTEX(sound_mutex);
|
||||
|
||||
@@ -337,6 +343,8 @@ static const char *snd_device_type_name(int type)
|
||||
return "sequencer";
|
||||
case SNDRV_DEVICE_TYPE_TIMER:
|
||||
return "timer";
|
||||
case SNDRV_DEVICE_TYPE_COMPRESS:
|
||||
return "compress";
|
||||
default:
|
||||
return "?";
|
||||
}
|
||||
@@ -395,6 +403,10 @@ static int __init alsa_sound_init(void)
|
||||
unregister_chrdev(major, "alsa");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
sound_debugfs_root = debugfs_create_dir("sound", NULL);
|
||||
#endif
|
||||
#ifndef MODULE
|
||||
pr_info("Advanced Linux Sound Architecture Driver Initialized.\n");
|
||||
#endif
|
||||
@@ -403,6 +415,9 @@ static int __init alsa_sound_init(void)
|
||||
|
||||
static void __exit alsa_sound_exit(void)
|
||||
{
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
debugfs_remove(sound_debugfs_root);
|
||||
#endif
|
||||
snd_info_done();
|
||||
unregister_chrdev(major, "alsa");
|
||||
}
|
||||
|
||||
@@ -959,7 +959,7 @@ int snd_timer_new(struct snd_card *card, char *id, struct snd_timer_id *tid,
|
||||
timer->tmr_device = tid->device;
|
||||
timer->tmr_subdevice = tid->subdevice;
|
||||
if (id)
|
||||
strlcpy(timer->id, id, sizeof(timer->id));
|
||||
strscpy(timer->id, id, sizeof(timer->id));
|
||||
timer->sticks = 1;
|
||||
INIT_LIST_HEAD(&timer->device_list);
|
||||
INIT_LIST_HEAD(&timer->open_list_head);
|
||||
@@ -1659,8 +1659,8 @@ static int snd_timer_user_ginfo(struct file *file,
|
||||
ginfo->card = t->card ? t->card->number : -1;
|
||||
if (t->hw.flags & SNDRV_TIMER_HW_SLAVE)
|
||||
ginfo->flags |= SNDRV_TIMER_FLG_SLAVE;
|
||||
strlcpy(ginfo->id, t->id, sizeof(ginfo->id));
|
||||
strlcpy(ginfo->name, t->name, sizeof(ginfo->name));
|
||||
strscpy(ginfo->id, t->id, sizeof(ginfo->id));
|
||||
strscpy(ginfo->name, t->name, sizeof(ginfo->name));
|
||||
ginfo->resolution = t->hw.resolution;
|
||||
if (t->hw.resolution_min > 0) {
|
||||
ginfo->resolution_min = t->hw.resolution_min;
|
||||
@@ -1814,8 +1814,8 @@ static int snd_timer_user_info(struct file *file,
|
||||
info->card = t->card ? t->card->number : -1;
|
||||
if (t->hw.flags & SNDRV_TIMER_HW_SLAVE)
|
||||
info->flags |= SNDRV_TIMER_FLG_SLAVE;
|
||||
strlcpy(info->id, t->id, sizeof(info->id));
|
||||
strlcpy(info->name, t->name, sizeof(info->name));
|
||||
strscpy(info->id, t->id, sizeof(info->id));
|
||||
strscpy(info->name, t->name, sizeof(info->name));
|
||||
info->resolution = t->hw.resolution;
|
||||
if (copy_to_user(_info, info, sizeof(*_info)))
|
||||
err = -EFAULT;
|
||||
|
||||
@@ -61,8 +61,8 @@ static int snd_timer_user_info_compat(struct file *file,
|
||||
info.card = t->card ? t->card->number : -1;
|
||||
if (t->hw.flags & SNDRV_TIMER_HW_SLAVE)
|
||||
info.flags |= SNDRV_TIMER_FLG_SLAVE;
|
||||
strlcpy(info.id, t->id, sizeof(info.id));
|
||||
strlcpy(info.name, t->name, sizeof(info.name));
|
||||
strscpy(info.id, t->id, sizeof(info.id));
|
||||
strscpy(info.name, t->name, sizeof(info.name));
|
||||
info.resolution = t->hw.resolution;
|
||||
if (copy_to_user(_info, &info, sizeof(*_info)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -219,7 +219,7 @@ static int loopback_jiffies_timer_start(struct loopback_pcm *dpcm)
|
||||
dpcm->period_update_pending = 1;
|
||||
}
|
||||
tick = dpcm->period_size_frac - dpcm->irq_pos;
|
||||
tick = (tick + dpcm->pcm_bps - 1) / dpcm->pcm_bps;
|
||||
tick = DIV_ROUND_UP(tick, dpcm->pcm_bps);
|
||||
mod_timer(&dpcm->timer, jiffies + tick);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -236,7 +236,7 @@ struct dummy_systimer_pcm {
|
||||
static void dummy_systimer_rearm(struct dummy_systimer_pcm *dpcm)
|
||||
{
|
||||
mod_timer(&dpcm->timer, jiffies +
|
||||
(dpcm->frac_period_rest + dpcm->rate - 1) / dpcm->rate);
|
||||
DIV_ROUND_UP(dpcm->frac_period_rest, dpcm->rate));
|
||||
}
|
||||
|
||||
static void dummy_systimer_update(struct dummy_systimer_pcm *dpcm)
|
||||
|
||||
@@ -97,7 +97,7 @@ void snd_opl3_init_seq_oss(struct snd_opl3 *opl3, char *name)
|
||||
return;
|
||||
|
||||
opl3->oss_seq_dev = dev;
|
||||
strlcpy(dev->name, name, sizeof(dev->name));
|
||||
strscpy(dev->name, name, sizeof(dev->name));
|
||||
arg = SNDRV_SEQ_DEVICE_ARGPTR(dev);
|
||||
arg->type = SYNTH_TYPE_FM;
|
||||
if (opl3->hardware < OPL3_HW_OPL3) {
|
||||
|
||||
@@ -290,7 +290,7 @@ int snd_opl3_load_patch(struct snd_opl3 *opl3,
|
||||
}
|
||||
|
||||
if (name)
|
||||
strlcpy(patch->name, name, sizeof(patch->name));
|
||||
strscpy(patch->name, name, sizeof(patch->name));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1154,8 +1154,7 @@ static int vx_init_audio_io(struct vx_core *chip)
|
||||
chip->ibl.size = 0;
|
||||
vx_set_ibl(chip, &chip->ibl); /* query the info */
|
||||
if (preferred > 0) {
|
||||
chip->ibl.size = ((preferred + chip->ibl.granularity - 1) /
|
||||
chip->ibl.granularity) * chip->ibl.granularity;
|
||||
chip->ibl.size = roundup(preferred, chip->ibl.granularity);
|
||||
if (chip->ibl.size > chip->ibl.max_size)
|
||||
chip->ibl.size = chip->ibl.max_size;
|
||||
} else
|
||||
|
||||
@@ -37,11 +37,9 @@ hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
|
||||
|
||||
memset(&event, 0, sizeof(event));
|
||||
count = min_t(long, count, sizeof(event.lock_status));
|
||||
if (bebob->dev_lock_changed) {
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (bebob->dev_lock_count > 0);
|
||||
bebob->dev_lock_changed = false;
|
||||
}
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (bebob->dev_lock_count > 0);
|
||||
bebob->dev_lock_changed = false;
|
||||
|
||||
spin_unlock_irq(&bebob->lock);
|
||||
|
||||
@@ -80,7 +78,7 @@ hwdep_get_info(struct snd_bebob *bebob, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
snd-dice-objs := dice-transaction.o dice-stream.o dice-proc.o dice-midi.o \
|
||||
dice-pcm.o dice-hwdep.o dice.o dice-tcelectronic.o \
|
||||
dice-alesis.o dice-extension.o dice-mytek.o dice-presonus.o
|
||||
dice-alesis.o dice-extension.o dice-mytek.o dice-presonus.o \
|
||||
dice-harman.o
|
||||
obj-$(CONFIG_SND_DICE) += snd-dice.o
|
||||
|
||||
26
sound/firewire/dice/dice-harman.c
Normal file
26
sound/firewire/dice/dice-harman.c
Normal file
@@ -0,0 +1,26 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
// dice-harman.c - a part of driver for DICE based devices
|
||||
//
|
||||
// Copyright (c) 2021 Takashi Sakamoto
|
||||
//
|
||||
// Licensed under the terms of the GNU General Public License, version 2.
|
||||
|
||||
#include "dice.h"
|
||||
|
||||
int snd_dice_detect_harman_formats(struct snd_dice *dice)
|
||||
{
|
||||
int i;
|
||||
|
||||
// Lexicon I-ONYX FW810s supports sampling transfer frequency up to
|
||||
// 96.0 kHz, 12 PCM channels and 1 MIDI channel in its first tx stream
|
||||
// , 10 PCM channels and 1 MIDI channel in its first rx stream for all
|
||||
// of the frequencies.
|
||||
for (i = 0; i < 2; ++i) {
|
||||
dice->tx_pcm_chs[0][i] = 12;
|
||||
dice->tx_midi_ports[0] = 1;
|
||||
dice->rx_pcm_chs[0][i] = 10;
|
||||
dice->rx_midi_ports[0] = 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -79,7 +79,7 @@ static int hwdep_get_info(struct snd_dice *dice, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -20,10 +20,12 @@ MODULE_LICENSE("GPL v2");
|
||||
#define OUI_MYTEK 0x001ee8
|
||||
#define OUI_SSL 0x0050c2 // Actually ID reserved by IEEE.
|
||||
#define OUI_PRESONUS 0x000a92
|
||||
#define OUI_HARMAN 0x000fd7
|
||||
|
||||
#define DICE_CATEGORY_ID 0x04
|
||||
#define WEISS_CATEGORY_ID 0x00
|
||||
#define LOUD_CATEGORY_ID 0x10
|
||||
#define HARMAN_CATEGORY_ID 0x20
|
||||
|
||||
#define MODEL_ALESIS_IO_BOTH 0x000001
|
||||
|
||||
@@ -56,6 +58,8 @@ static int check_dice_category(struct fw_unit *unit)
|
||||
category = WEISS_CATEGORY_ID;
|
||||
else if (vendor == OUI_LOUD)
|
||||
category = LOUD_CATEGORY_ID;
|
||||
else if (vendor == OUI_HARMAN)
|
||||
category = HARMAN_CATEGORY_ID;
|
||||
else
|
||||
category = DICE_CATEGORY_ID;
|
||||
if (device->config_rom[3] != ((vendor << 8) | category) ||
|
||||
@@ -388,6 +392,14 @@ static const struct ieee1394_device_id dice_id_table[] = {
|
||||
.model_id = 0x000008,
|
||||
.driver_data = (kernel_ulong_t)snd_dice_detect_presonus_formats,
|
||||
},
|
||||
// Lexicon I-ONYX FW810S.
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VENDOR_ID |
|
||||
IEEE1394_MATCH_MODEL_ID,
|
||||
.vendor_id = OUI_HARMAN,
|
||||
.model_id = 0x000001,
|
||||
.driver_data = (kernel_ulong_t)snd_dice_detect_harman_formats,
|
||||
},
|
||||
{
|
||||
.match_flags = IEEE1394_MATCH_VERSION,
|
||||
.version = DICE_INTERFACE,
|
||||
|
||||
@@ -233,5 +233,6 @@ int snd_dice_detect_alesis_mastercontrol_formats(struct snd_dice *dice);
|
||||
int snd_dice_detect_extension_formats(struct snd_dice *dice);
|
||||
int snd_dice_detect_mytek_formats(struct snd_dice *dice);
|
||||
int snd_dice_detect_presonus_formats(struct snd_dice *dice);
|
||||
int snd_dice_detect_harman_formats(struct snd_dice *dice);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -87,7 +87,7 @@ static int hwdep_get_info(struct snd_dg00x *dg00x, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -35,13 +35,11 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
|
||||
}
|
||||
|
||||
memset(&event, 0, sizeof(event));
|
||||
if (ff->dev_lock_changed) {
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (ff->dev_lock_count > 0);
|
||||
ff->dev_lock_changed = false;
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (ff->dev_lock_count > 0);
|
||||
ff->dev_lock_changed = false;
|
||||
|
||||
count = min_t(long, count, sizeof(event.lock_status));
|
||||
}
|
||||
count = min_t(long, count, sizeof(event.lock_status));
|
||||
|
||||
spin_unlock_irq(&ff->lock);
|
||||
|
||||
@@ -79,7 +77,7 @@ static int hwdep_get_info(struct snd_ff *ff, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -15,6 +15,61 @@
|
||||
#define LATTER_FETCH_MODE 0xffff00000010ULL
|
||||
#define LATTER_SYNC_STATUS 0x0000801c0000ULL
|
||||
|
||||
// The content of sync status register differs between models.
|
||||
//
|
||||
// Fireface UCX:
|
||||
// 0xf0000000: (unidentified)
|
||||
// 0x0f000000: effective rate of sampling clock
|
||||
// 0x00f00000: detected rate of word clock on BNC interface
|
||||
// 0x000f0000: detected rate of ADAT or S/PDIF on optical interface
|
||||
// 0x0000f000: detected rate of S/PDIF on coaxial interface
|
||||
// 0x00000e00: effective source of sampling clock
|
||||
// 0x00000e00: Internal
|
||||
// 0x00000800: (unidentified)
|
||||
// 0x00000600: Word clock on BNC interface
|
||||
// 0x00000400: ADAT on optical interface
|
||||
// 0x00000200: S/PDIF on coaxial or optical interface
|
||||
// 0x00000100: Optical interface is used for ADAT signal
|
||||
// 0x00000080: (unidentified)
|
||||
// 0x00000040: Synchronized to word clock on BNC interface
|
||||
// 0x00000020: Synchronized to ADAT or S/PDIF on optical interface
|
||||
// 0x00000010: Synchronized to S/PDIF on coaxial interface
|
||||
// 0x00000008: (unidentified)
|
||||
// 0x00000004: Lock word clock on BNC interface
|
||||
// 0x00000002: Lock ADAT or S/PDIF on optical interface
|
||||
// 0x00000001: Lock S/PDIF on coaxial interface
|
||||
//
|
||||
// Fireface 802 (and perhaps UFX):
|
||||
// 0xf0000000: effective rate of sampling clock
|
||||
// 0x0f000000: detected rate of ADAT-B on 2nd optical interface
|
||||
// 0x00f00000: detected rate of ADAT-A on 1st optical interface
|
||||
// 0x000f0000: detected rate of AES/EBU on XLR or coaxial interface
|
||||
// 0x0000f000: detected rate of word clock on BNC interface
|
||||
// 0x00000e00: effective source of sampling clock
|
||||
// 0x00000e00: internal
|
||||
// 0x00000800: ADAT-B
|
||||
// 0x00000600: ADAT-A
|
||||
// 0x00000400: AES/EBU
|
||||
// 0x00000200: Word clock
|
||||
// 0x00000080: Synchronized to ADAT-B on 2nd optical interface
|
||||
// 0x00000040: Synchronized to ADAT-A on 1st optical interface
|
||||
// 0x00000020: Synchronized to AES/EBU on XLR or 2nd optical interface
|
||||
// 0x00000010: Synchronized to word clock on BNC interface
|
||||
// 0x00000008: Lock ADAT-B on 2nd optical interface
|
||||
// 0x00000004: Lock ADAT-A on 1st optical interface
|
||||
// 0x00000002: Lock AES/EBU on XLR or 2nd optical interface
|
||||
// 0x00000001: Lock word clock on BNC interface
|
||||
//
|
||||
// The pattern for rate bits:
|
||||
// 0x00: 32.0 kHz
|
||||
// 0x01: 44.1 kHz
|
||||
// 0x02: 48.0 kHz
|
||||
// 0x04: 64.0 kHz
|
||||
// 0x05: 88.2 kHz
|
||||
// 0x06: 96.0 kHz
|
||||
// 0x08: 128.0 kHz
|
||||
// 0x09: 176.4 kHz
|
||||
// 0x0a: 192.0 kHz
|
||||
static int parse_clock_bits(u32 data, unsigned int *rate,
|
||||
enum snd_ff_clock_src *src,
|
||||
enum snd_ff_unit_version unit_version)
|
||||
@@ -23,35 +78,48 @@ static int parse_clock_bits(u32 data, unsigned int *rate,
|
||||
unsigned int rate;
|
||||
u32 flag;
|
||||
} *rate_entry, rate_entries[] = {
|
||||
{ 32000, 0x00000000, },
|
||||
{ 44100, 0x01000000, },
|
||||
{ 48000, 0x02000000, },
|
||||
{ 64000, 0x04000000, },
|
||||
{ 88200, 0x05000000, },
|
||||
{ 96000, 0x06000000, },
|
||||
{ 128000, 0x08000000, },
|
||||
{ 176400, 0x09000000, },
|
||||
{ 192000, 0x0a000000, },
|
||||
{ 32000, 0x00, },
|
||||
{ 44100, 0x01, },
|
||||
{ 48000, 0x02, },
|
||||
{ 64000, 0x04, },
|
||||
{ 88200, 0x05, },
|
||||
{ 96000, 0x06, },
|
||||
{ 128000, 0x08, },
|
||||
{ 176400, 0x09, },
|
||||
{ 192000, 0x0a, },
|
||||
};
|
||||
static const struct {
|
||||
enum snd_ff_clock_src src;
|
||||
u32 flag;
|
||||
} *clk_entry, clk_entries[] = {
|
||||
} *clk_entry, *clk_entries, ucx_clk_entries[] = {
|
||||
{ SND_FF_CLOCK_SRC_SPDIF, 0x00000200, },
|
||||
{ SND_FF_CLOCK_SRC_ADAT1, 0x00000400, },
|
||||
{ SND_FF_CLOCK_SRC_WORD, 0x00000600, },
|
||||
{ SND_FF_CLOCK_SRC_INTERNAL, 0x00000e00, },
|
||||
}, ufx_ff802_clk_entries[] = {
|
||||
{ SND_FF_CLOCK_SRC_WORD, 0x00000200, },
|
||||
{ SND_FF_CLOCK_SRC_SPDIF, 0x00000400, },
|
||||
{ SND_FF_CLOCK_SRC_ADAT1, 0x00000600, },
|
||||
{ SND_FF_CLOCK_SRC_ADAT2, 0x00000800, },
|
||||
{ SND_FF_CLOCK_SRC_INTERNAL, 0x00000e00, },
|
||||
};
|
||||
u32 rate_bits;
|
||||
unsigned int clk_entry_count;
|
||||
int i;
|
||||
|
||||
if (unit_version != SND_FF_UNIT_VERSION_UCX) {
|
||||
// e.g. 0x00fe0f20 but expected 0x00eff002.
|
||||
data = ((data & 0xf0f0f0f0) >> 4) | ((data & 0x0f0f0f0f) << 4);
|
||||
if (unit_version == SND_FF_UNIT_VERSION_UCX) {
|
||||
rate_bits = (data & 0x0f000000) >> 24;
|
||||
clk_entries = ucx_clk_entries;
|
||||
clk_entry_count = ARRAY_SIZE(ucx_clk_entries);
|
||||
} else {
|
||||
rate_bits = (data & 0xf0000000) >> 28;
|
||||
clk_entries = ufx_ff802_clk_entries;
|
||||
clk_entry_count = ARRAY_SIZE(ufx_ff802_clk_entries);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(rate_entries); ++i) {
|
||||
rate_entry = rate_entries + i;
|
||||
if ((data & 0x0f000000) == rate_entry->flag) {
|
||||
if (rate_bits == rate_entry->flag) {
|
||||
*rate = rate_entry->rate;
|
||||
break;
|
||||
}
|
||||
@@ -59,14 +127,14 @@ static int parse_clock_bits(u32 data, unsigned int *rate,
|
||||
if (i == ARRAY_SIZE(rate_entries))
|
||||
return -EIO;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(clk_entries); ++i) {
|
||||
for (i = 0; i < clk_entry_count; ++i) {
|
||||
clk_entry = clk_entries + i;
|
||||
if ((data & 0x000e00) == clk_entry->flag) {
|
||||
*src = clk_entry->src;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (i == ARRAY_SIZE(clk_entries))
|
||||
if (i == clk_entry_count)
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
@@ -249,16 +317,22 @@ static void latter_dump_status(struct snd_ff *ff, struct snd_info_buffer *buffer
|
||||
char *const label;
|
||||
u32 locked_mask;
|
||||
u32 synced_mask;
|
||||
} *clk_entry, clk_entries[] = {
|
||||
} *clk_entry, *clk_entries, ucx_clk_entries[] = {
|
||||
{ "S/PDIF", 0x00000001, 0x00000010, },
|
||||
{ "ADAT", 0x00000002, 0x00000020, },
|
||||
{ "WDClk", 0x00000004, 0x00000040, },
|
||||
}, ufx_ff802_clk_entries[] = {
|
||||
{ "WDClk", 0x00000001, 0x00000010, },
|
||||
{ "AES/EBU", 0x00000002, 0x00000020, },
|
||||
{ "ADAT-A", 0x00000004, 0x00000040, },
|
||||
{ "ADAT-B", 0x00000008, 0x00000080, },
|
||||
};
|
||||
__le32 reg;
|
||||
u32 data;
|
||||
unsigned int rate;
|
||||
enum snd_ff_clock_src src;
|
||||
const char *label;
|
||||
unsigned int clk_entry_count;
|
||||
int i;
|
||||
int err;
|
||||
|
||||
@@ -270,7 +344,15 @@ static void latter_dump_status(struct snd_ff *ff, struct snd_info_buffer *buffer
|
||||
|
||||
snd_iprintf(buffer, "External source detection:\n");
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(clk_entries); ++i) {
|
||||
if (ff->unit_version == SND_FF_UNIT_VERSION_UCX) {
|
||||
clk_entries = ucx_clk_entries;
|
||||
clk_entry_count = ARRAY_SIZE(ucx_clk_entries);
|
||||
} else {
|
||||
clk_entries = ufx_ff802_clk_entries;
|
||||
clk_entry_count = ARRAY_SIZE(ufx_ff802_clk_entries);
|
||||
}
|
||||
|
||||
for (i = 0; i < clk_entry_count; ++i) {
|
||||
clk_entry = clk_entries + i;
|
||||
snd_iprintf(buffer, "%s: ", clk_entry->label);
|
||||
if (data & clk_entry->locked_mask) {
|
||||
|
||||
@@ -212,7 +212,7 @@ hwdep_get_info(struct snd_efw *efw, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -86,7 +86,7 @@ static int hwdep_get_info(struct snd_motu *motu, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -35,13 +35,11 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,
|
||||
}
|
||||
|
||||
memset(&event, 0, sizeof(event));
|
||||
if (oxfw->dev_lock_changed) {
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (oxfw->dev_lock_count > 0);
|
||||
oxfw->dev_lock_changed = false;
|
||||
event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
|
||||
event.lock_status.status = (oxfw->dev_lock_count > 0);
|
||||
oxfw->dev_lock_changed = false;
|
||||
|
||||
count = min_t(long, count, sizeof(event.lock_status));
|
||||
}
|
||||
count = min_t(long, count, sizeof(event.lock_status));
|
||||
|
||||
spin_unlock_irq(&oxfw->lock);
|
||||
|
||||
@@ -79,7 +77,7 @@ static int hwdep_get_info(struct snd_oxfw *oxfw, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -154,7 +154,7 @@ static int hwdep_get_info(struct snd_tscm *tscm, void __user *arg)
|
||||
info.card = dev->card->index;
|
||||
*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
|
||||
*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
|
||||
strlcpy(info.device_name, dev_name(&dev->device),
|
||||
strscpy(info.device_name, dev_name(&dev->device),
|
||||
sizeof(info.device_name));
|
||||
|
||||
if (copy_to_user(arg, &info, sizeof(info)))
|
||||
|
||||
@@ -46,3 +46,17 @@ config SND_INTEL_DSP_CONFIG
|
||||
select SND_INTEL_NHLT if ACPI
|
||||
# this config should be selected only for Intel DSP platforms.
|
||||
# A fallback is provided so that the code compiles in all cases.
|
||||
|
||||
config SND_INTEL_BYT_PREFER_SOF
|
||||
bool "Prefer SOF driver over SST on BY/CHT platforms"
|
||||
depends on SND_SST_ATOM_HIFI2_PLATFORM_ACPI && SND_SOC_SOF_BAYTRAIL
|
||||
default n
|
||||
help
|
||||
The kernel has 2 drivers for the Low Power Engine audio-block on
|
||||
Bay- and Cherry-Trail SoCs. The old SST driver and the new SOF
|
||||
driver. If both drivers are enabled then the kernel will default
|
||||
to using the old SST driver, unless told otherwise through the
|
||||
snd_intel_dspcfg.dsp_driver module-parameter.
|
||||
|
||||
Set this option to Y to make the kernel default to the new SOF
|
||||
driver instead.
|
||||
|
||||
@@ -332,3 +332,40 @@ int snd_hdac_ext_bus_link_put(struct hdac_bus *bus,
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_put);
|
||||
|
||||
static void hdac_ext_codec_link_up(struct hdac_device *codec)
|
||||
{
|
||||
const char *devname = dev_name(&codec->dev);
|
||||
struct hdac_ext_link *hlink =
|
||||
snd_hdac_ext_bus_get_link(codec->bus, devname);
|
||||
|
||||
if (hlink)
|
||||
snd_hdac_ext_bus_link_get(codec->bus, hlink);
|
||||
}
|
||||
|
||||
static void hdac_ext_codec_link_down(struct hdac_device *codec)
|
||||
{
|
||||
const char *devname = dev_name(&codec->dev);
|
||||
struct hdac_ext_link *hlink =
|
||||
snd_hdac_ext_bus_get_link(codec->bus, devname);
|
||||
|
||||
if (hlink)
|
||||
snd_hdac_ext_bus_link_put(codec->bus, hlink);
|
||||
}
|
||||
|
||||
void snd_hdac_ext_bus_link_power(struct hdac_device *codec, bool enable)
|
||||
{
|
||||
struct hdac_bus *bus = codec->bus;
|
||||
bool oldstate = test_bit(codec->addr, &bus->codec_powered);
|
||||
|
||||
if (enable == oldstate)
|
||||
return;
|
||||
|
||||
snd_hdac_bus_link_power(codec, enable);
|
||||
|
||||
if (enable)
|
||||
hdac_ext_codec_link_up(codec);
|
||||
else
|
||||
hdac_ext_codec_link_down(codec);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power);
|
||||
|
||||
@@ -17,6 +17,7 @@ static void snd_hdac_bus_process_unsol_events(struct work_struct *work);
|
||||
static const struct hdac_bus_ops default_ops = {
|
||||
.command = snd_hdac_bus_send_cmd,
|
||||
.get_response = snd_hdac_bus_get_response,
|
||||
.link_power = snd_hdac_bus_link_power,
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -264,3 +265,25 @@ void snd_hdac_aligned_write(unsigned int val, void __iomem *addr,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_aligned_write);
|
||||
#endif /* CONFIG_SND_HDA_ALIGNED_MMIO */
|
||||
|
||||
void snd_hdac_codec_link_up(struct hdac_device *codec)
|
||||
{
|
||||
struct hdac_bus *bus = codec->bus;
|
||||
|
||||
if (bus->ops->link_power)
|
||||
bus->ops->link_power(codec, true);
|
||||
else
|
||||
snd_hdac_bus_link_power(codec, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_codec_link_up);
|
||||
|
||||
void snd_hdac_codec_link_down(struct hdac_device *codec)
|
||||
{
|
||||
struct hdac_bus *bus = codec->bus;
|
||||
|
||||
if (bus->ops->link_power)
|
||||
bus->ops->link_power(codec, false);
|
||||
else
|
||||
snd_hdac_bus_link_power(codec, false);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_codec_link_down);
|
||||
|
||||
@@ -648,3 +648,17 @@ void snd_hdac_bus_free_stream_pages(struct hdac_bus *bus)
|
||||
snd_dma_free_pages(&bus->posbuf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_free_stream_pages);
|
||||
|
||||
/**
|
||||
* snd_hdac_bus_link_power - power up/down codec link
|
||||
* @codec: HD-audio device
|
||||
* @enable: whether to power-up the link
|
||||
*/
|
||||
void snd_hdac_bus_link_power(struct hdac_device *codec, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
set_bit(codec->addr, &codec->bus->codec_powered);
|
||||
else
|
||||
clear_bit(codec->addr, &codec->bus->codec_powered);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_bus_link_power);
|
||||
|
||||
@@ -435,12 +435,11 @@ int snd_hdac_stream_setup_periods(struct hdac_stream *azx_dev)
|
||||
pos_adj = bus->bdl_pos_adj;
|
||||
if (!azx_dev->no_period_wakeup && pos_adj > 0) {
|
||||
pos_align = pos_adj;
|
||||
pos_adj = (pos_adj * runtime->rate + 47999) / 48000;
|
||||
pos_adj = DIV_ROUND_UP(pos_adj * runtime->rate, 48000);
|
||||
if (!pos_adj)
|
||||
pos_adj = pos_align;
|
||||
else
|
||||
pos_adj = ((pos_adj + pos_align - 1) / pos_align) *
|
||||
pos_align;
|
||||
pos_adj = roundup(pos_adj, pos_align);
|
||||
pos_adj = frames_to_bytes(runtime, pos_adj);
|
||||
if (pos_adj >= period_bytes) {
|
||||
dev_warn(bus->dev, "Too big adjustment %d\n",
|
||||
|
||||
@@ -66,7 +66,7 @@ static struct attribute *hdac_dev_attrs[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct attribute_group hdac_dev_attr_group = {
|
||||
static const struct attribute_group hdac_dev_attr_group = {
|
||||
.attrs = hdac_dev_attrs,
|
||||
};
|
||||
|
||||
|
||||
@@ -321,6 +321,18 @@ static const struct config_entry config_table[] = {
|
||||
},
|
||||
#endif
|
||||
|
||||
/* Alder Lake */
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_ALDERLAKE)
|
||||
{
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = 0x7ad0,
|
||||
},
|
||||
{
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = 0x51c8,
|
||||
},
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
static const struct config_entry *snd_intel_dsp_find_config
|
||||
@@ -452,35 +464,30 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_intel_dsp_driver_probe);
|
||||
|
||||
/* Should we default to SOF or SST for BYT/CHT ? */
|
||||
#if IS_ENABLED(CONFIG_SND_INTEL_BYT_PREFER_SOF) || \
|
||||
!IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
|
||||
#define FLAG_SST_OR_SOF_BYT FLAG_SOF
|
||||
#else
|
||||
#define FLAG_SST_OR_SOF_BYT FLAG_SST
|
||||
#endif
|
||||
|
||||
/*
|
||||
* configuration table
|
||||
* - the order of similar ACPI ID entries is important!
|
||||
* - the first successful match will win
|
||||
*/
|
||||
static const struct config_entry acpi_config_table[] = {
|
||||
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI) || \
|
||||
IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||
/* BayTrail */
|
||||
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
|
||||
{
|
||||
.flags = FLAG_SST,
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "80860F28",
|
||||
},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||
{
|
||||
.flags = FLAG_SOF,
|
||||
.acpi_hid = "80860F28",
|
||||
},
|
||||
#endif
|
||||
/* CherryTrail */
|
||||
#if IS_ENABLED(CONFIG_SND_SST_ATOM_HIFI2_PLATFORM_ACPI)
|
||||
{
|
||||
.flags = FLAG_SST,
|
||||
.acpi_hid = "808622A8",
|
||||
},
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_BAYTRAIL)
|
||||
{
|
||||
.flags = FLAG_SOF,
|
||||
.flags = FLAG_SST_OR_SOF_BYT,
|
||||
.acpi_hid = "808622A8",
|
||||
},
|
||||
#endif
|
||||
|
||||
@@ -84,7 +84,7 @@ int snd_i2c_bus_create(struct snd_card *card, const char *name,
|
||||
list_add_tail(&bus->buses, &master->buses);
|
||||
bus->master = master;
|
||||
}
|
||||
strlcpy(bus->name, name, sizeof(bus->name));
|
||||
strscpy(bus->name, name, sizeof(bus->name));
|
||||
err = snd_device_new(card, SNDRV_DEV_BUS, bus, &ops);
|
||||
if (err < 0) {
|
||||
snd_i2c_bus_free(bus);
|
||||
@@ -108,7 +108,7 @@ int snd_i2c_device_create(struct snd_i2c_bus *bus, const char *name,
|
||||
if (device == NULL)
|
||||
return -ENOMEM;
|
||||
device->addr = addr;
|
||||
strlcpy(device->name, name, sizeof(device->name));
|
||||
strscpy(device->name, name, sizeof(device->name));
|
||||
list_add_tail(&device->list, &bus->devices);
|
||||
device->bus = bus;
|
||||
*rdevice = device;
|
||||
|
||||
@@ -95,8 +95,8 @@ static int snd_ad1848_probe(struct device *dev, unsigned int n)
|
||||
if (error < 0)
|
||||
goto out;
|
||||
|
||||
strlcpy(card->driver, "AD1848", sizeof(card->driver));
|
||||
strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
strscpy(card->driver, "AD1848", sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
|
||||
if (!thinkpad[n])
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
@@ -118,10 +118,9 @@ out: snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_ad1848_remove(struct device *dev, unsigned int n)
|
||||
static void snd_ad1848_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -97,10 +97,9 @@ out: snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_adlib_remove(struct device *dev, unsigned int n)
|
||||
static void snd_adlib_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_adlib_driver = {
|
||||
|
||||
@@ -403,7 +403,7 @@ error:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_cmi8328_remove(struct device *pdev, unsigned int dev)
|
||||
static void snd_cmi8328_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(pdev);
|
||||
struct snd_cmi8328 *cmi = card->private_data;
|
||||
@@ -420,7 +420,6 @@ static int snd_cmi8328_remove(struct device *pdev, unsigned int dev)
|
||||
snd_cmi8328_cfg_write(cmi->port, CFG2, 0);
|
||||
snd_cmi8328_cfg_write(cmi->port, CFG3, 0);
|
||||
snd_card_free(card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -631,11 +631,10 @@ static int snd_cmi8330_isa_probe(struct device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_cmi8330_isa_remove(struct device *devptr,
|
||||
static void snd_cmi8330_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -95,8 +95,8 @@ static int snd_cs4231_probe(struct device *dev, unsigned int n)
|
||||
if (error < 0)
|
||||
goto out;
|
||||
|
||||
strlcpy(card->driver, "CS4231", sizeof(card->driver));
|
||||
strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
strscpy(card->driver, "CS4231", sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
|
||||
if (dma2[n] < 0)
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
@@ -135,10 +135,9 @@ out: snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_cs4231_remove(struct device *dev, unsigned int n)
|
||||
static void snd_cs4231_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -405,8 +405,8 @@ static int snd_cs423x_probe(struct snd_card *card, int dev)
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
strlcpy(card->driver, chip->pcm->name, sizeof(card->driver));
|
||||
strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
strscpy(card->driver, chip->pcm->name, sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
if (dma2[dev] < 0)
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i",
|
||||
@@ -487,11 +487,10 @@ static int snd_cs423x_isa_probe(struct device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_cs423x_isa_remove(struct device *pdev,
|
||||
static void snd_cs423x_isa_remove(struct device *pdev,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -133,8 +133,8 @@ static int snd_es1688_probe(struct snd_card *card, unsigned int n)
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
strlcpy(card->driver, "ES1688", sizeof(card->driver));
|
||||
strlcpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
strscpy(card->driver, "ES1688", sizeof(card->driver));
|
||||
strscpy(card->shortname, chip->pcm->name, sizeof(card->shortname));
|
||||
snprintf(card->longname, sizeof(card->longname),
|
||||
"%s at 0x%lx, irq %i, dma %i", chip->pcm->name, chip->port,
|
||||
chip->irq, chip->dma8);
|
||||
@@ -192,10 +192,9 @@ out:
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_es1688_isa_remove(struct device *dev, unsigned int n)
|
||||
static void snd_es1688_isa_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_es1688_driver = {
|
||||
|
||||
@@ -2210,11 +2210,10 @@ static int snd_es18xx_isa_probe(struct device *pdev, unsigned int dev)
|
||||
}
|
||||
}
|
||||
|
||||
static int snd_es18xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
static void snd_es18xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -608,10 +608,9 @@ error:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_galaxy_remove(struct device *dev, unsigned int n)
|
||||
static void snd_galaxy_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_galaxy_driver = {
|
||||
|
||||
@@ -195,10 +195,9 @@ out: snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_gusclassic_remove(struct device *dev, unsigned int n)
|
||||
static void snd_gusclassic_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_gusclassic_driver = {
|
||||
|
||||
@@ -324,10 +324,9 @@ out: snd_card_free(card);
|
||||
return error;
|
||||
}
|
||||
|
||||
static int snd_gusextreme_remove(struct device *dev, unsigned int n)
|
||||
static void snd_gusextreme_remove(struct device *dev, unsigned int n)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(dev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_gusextreme_driver = {
|
||||
|
||||
@@ -338,10 +338,9 @@ static int snd_gusmax_probe(struct device *pdev, unsigned int dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_gusmax_remove(struct device *devptr, unsigned int dev)
|
||||
static void snd_gusmax_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEV_NAME "gusmax"
|
||||
|
||||
@@ -825,10 +825,9 @@ static int snd_interwave_isa_probe(struct device *pdev,
|
||||
}
|
||||
}
|
||||
|
||||
static int snd_interwave_isa_remove(struct device *devptr, unsigned int dev)
|
||||
static void snd_interwave_isa_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_interwave_driver = {
|
||||
|
||||
@@ -1049,10 +1049,9 @@ cfg_error:
|
||||
#endif
|
||||
}
|
||||
|
||||
static int snd_msnd_isa_remove(struct device *pdev, unsigned int dev)
|
||||
static void snd_msnd_isa_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_msnd_unload(dev_get_drvdata(pdev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_msnd_driver = {
|
||||
|
||||
@@ -878,11 +878,10 @@ static int snd_opl3sa2_isa_probe(struct device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_opl3sa2_isa_remove(struct device *devptr,
|
||||
static void snd_opl3sa2_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -1480,11 +1480,10 @@ static int snd_miro_isa_probe(struct device *devptr, unsigned int n)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_miro_isa_remove(struct device *devptr,
|
||||
static void snd_miro_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEV_NAME "miro"
|
||||
|
||||
@@ -1024,11 +1024,10 @@ static int snd_opti9xx_isa_probe(struct device *devptr,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_opti9xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
static void snd_opti9xx_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -339,12 +339,11 @@ err_free:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_jazz16_remove(struct device *devptr, unsigned int dev)
|
||||
static void snd_jazz16_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(devptr);
|
||||
|
||||
snd_card_free(card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -547,10 +547,9 @@ static int snd_sb16_isa_probe(struct device *pdev, unsigned int dev)
|
||||
}
|
||||
}
|
||||
|
||||
static int snd_sb16_isa_remove(struct device *pdev, unsigned int dev)
|
||||
static void snd_sb16_isa_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -388,7 +388,7 @@ static int snd_sb_csp_riff_load(struct snd_sb_csp * p,
|
||||
return err;
|
||||
|
||||
/* fill in codec header */
|
||||
strlcpy(p->codec_name, info.codec_name, sizeof(p->codec_name));
|
||||
strscpy(p->codec_name, info.codec_name, sizeof(p->codec_name));
|
||||
p->func_nr = func_nr;
|
||||
p->mode = le16_to_cpu(funcdesc_h.flags_play_rec);
|
||||
switch (le16_to_cpu(funcdesc_h.VOC_type)) {
|
||||
|
||||
@@ -192,10 +192,9 @@ static int snd_sb8_probe(struct device *pdev, unsigned int dev)
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_sb8_remove(struct device *pdev, unsigned int dev)
|
||||
static void snd_sb8_remove(struct device *pdev, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(pdev));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -482,7 +482,7 @@ int snd_sbmixer_add_ctl(struct snd_sb *chip, const char *name, int index, int ty
|
||||
ctl = snd_ctl_new1(&newctls[type], chip);
|
||||
if (! ctl)
|
||||
return -ENOMEM;
|
||||
strlcpy(ctl->id.name, name, sizeof(ctl->id.name));
|
||||
strscpy(ctl->id.name, name, sizeof(ctl->id.name));
|
||||
ctl->id.index = index;
|
||||
ctl->private_value = value;
|
||||
if ((err = snd_ctl_add(chip->card, ctl)) < 0)
|
||||
|
||||
@@ -672,7 +672,7 @@ err_exit:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_sc6000_remove(struct device *devptr, unsigned int dev)
|
||||
static void snd_sc6000_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
struct snd_card *card = dev_get_drvdata(devptr);
|
||||
char __iomem **vport = card->private_data;
|
||||
@@ -684,7 +684,6 @@ static int snd_sc6000_remove(struct device *devptr, unsigned int dev)
|
||||
release_region(mss_port[dev], 4);
|
||||
|
||||
snd_card_free(card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct isa_driver snd_sc6000_driver = {
|
||||
|
||||
@@ -1183,10 +1183,9 @@ _release_card:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int snd_sscape_remove(struct device *devptr, unsigned int dev)
|
||||
static void snd_sscape_remove(struct device *devptr, unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEV_NAME "sscape"
|
||||
|
||||
@@ -565,11 +565,10 @@ static int snd_wavefront_isa_probe(struct device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int snd_wavefront_isa_remove(struct device *devptr,
|
||||
static void snd_wavefront_isa_remove(struct device *devptr,
|
||||
unsigned int dev)
|
||||
{
|
||||
snd_card_free(dev_get_drvdata(devptr));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define DEV_NAME "wavefront"
|
||||
|
||||
@@ -355,8 +355,8 @@ static int mixer_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
{
|
||||
mixer_info info;
|
||||
memset(&info, 0, sizeof(info));
|
||||
strlcpy(info.id, dmasound.mach.name2, sizeof(info.id));
|
||||
strlcpy(info.name, dmasound.mach.name2, sizeof(info.name));
|
||||
strscpy(info.id, dmasound.mach.name2, sizeof(info.id));
|
||||
strscpy(info.name, dmasound.mach.name2, sizeof(info.name));
|
||||
info.modify_counter = mixer.modify_counter;
|
||||
if (copy_to_user((void __user *)arg, &info, sizeof(info)))
|
||||
return -EFAULT;
|
||||
|
||||
@@ -857,8 +857,7 @@ snd_ad1889_create(struct snd_card *card,
|
||||
return err;
|
||||
|
||||
/* check PCI availability (32bit DMA) */
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
|
||||
dev_err(card->dev, "error setting 32-bit DMA mask.\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -2057,8 +2057,7 @@ static int snd_ali_create(struct snd_card *card,
|
||||
if (err < 0)
|
||||
return err;
|
||||
/* check, if we can restrict PCI DMA transfers to 31 bits */
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(31)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(31)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(31))) {
|
||||
dev_err(card->dev,
|
||||
"architecture does not support 31bit PCI busmaster DMA\n");
|
||||
pci_disable_device(pci);
|
||||
|
||||
@@ -625,8 +625,7 @@ static int snd_als300_create(struct snd_card *card,
|
||||
if ((err = pci_enable_device(pci)) < 0)
|
||||
return err;
|
||||
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(28)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(28)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(28))) {
|
||||
dev_err(card->dev, "error setting 28bit DMA mask\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -837,8 +837,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
return err;
|
||||
}
|
||||
/* check, if we can restrict PCI DMA transfers to 24 bits */
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(24)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(24)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
|
||||
dev_err(&pci->dev, "architecture does not support 24bit PCI busmaster DMA\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -52,7 +52,7 @@ void hpi_debug_data(u16 *pdata, u32 len)
|
||||
int lines;
|
||||
int cols = 8;
|
||||
|
||||
lines = (len + cols - 1) / cols;
|
||||
lines = DIV_ROUND_UP(len, cols);
|
||||
if (lines > 8)
|
||||
lines = 8;
|
||||
|
||||
|
||||
@@ -151,8 +151,7 @@ snd_vortex_create(struct snd_card *card, struct pci_dev *pci, vortex_t ** rchip)
|
||||
// check PCI availability (DMA).
|
||||
if ((err = pci_enable_device(pci)) < 0)
|
||||
return err;
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
|
||||
dev_err(card->dev, "error to set DMA mask\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -236,8 +236,7 @@ static int snd_aw2_create(struct snd_card *card,
|
||||
pci_set_master(pci);
|
||||
|
||||
/* check PCI availability (32bit DMA) */
|
||||
if ((dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) ||
|
||||
(dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0)) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
|
||||
dev_err(card->dev, "Impossible to set 32bit mask DMA\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -2379,8 +2379,7 @@ snd_azf3328_create(struct snd_card *card,
|
||||
chip->irq = -1;
|
||||
|
||||
/* check if we can restrict PCI DMA transfers to 24 bits */
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(24)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(24)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
|
||||
dev_err(card->dev,
|
||||
"architecture does not support 24bit PCI busmaster DMA\n"
|
||||
);
|
||||
@@ -2448,7 +2447,7 @@ snd_azf3328_create(struct snd_card *card,
|
||||
|
||||
/* shutdown codecs to reduce power / noise */
|
||||
/* have ...ctrl_codec_activity() act properly */
|
||||
codec->running = 1;
|
||||
codec->running = true;
|
||||
snd_azf3328_ctrl_codec_activity(chip, codec_type, 0);
|
||||
|
||||
spin_lock_irq(codec->lock);
|
||||
|
||||
@@ -327,7 +327,8 @@ static irqreturn_t snd_bt87x_interrupt(int irq, void *dev_id)
|
||||
current_block = chip->current_line * 16 / chip->lines;
|
||||
irq_block = status >> INT_RISCS_SHIFT;
|
||||
if (current_block != irq_block)
|
||||
chip->current_line = (irq_block * chip->lines + 15) / 16;
|
||||
chip->current_line = DIV_ROUND_UP(irq_block * chip->lines,
|
||||
16);
|
||||
|
||||
snd_pcm_period_elapsed(chip->substream);
|
||||
}
|
||||
|
||||
@@ -1605,8 +1605,7 @@ static int snd_ca0106_create(int dev, struct snd_card *card,
|
||||
err = pci_enable_device(pci);
|
||||
if (err < 0)
|
||||
return err;
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
|
||||
dev_err(card->dev, "error to set 32bit mask DMA\n");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
|
||||
@@ -813,7 +813,7 @@ static void snd_cs46xx_set_capture_sample_rate(struct snd_cs46xx *chip, unsigned
|
||||
correctionPerGOF = tmp1 / GOF_PER_SEC;
|
||||
tmp1 -= correctionPerGOF * GOF_PER_SEC;
|
||||
correctionPerSec = tmp1;
|
||||
initialDelay = ((48000 * 24) + rate - 1) / rate;
|
||||
initialDelay = DIV_ROUND_UP(48000 * 24, rate);
|
||||
|
||||
/*
|
||||
* Fill in the VariDecimate control block.
|
||||
|
||||
@@ -269,8 +269,7 @@ static int snd_cs5535audio_create(struct snd_card *card,
|
||||
if ((err = pci_enable_device(pci)) < 0)
|
||||
return err;
|
||||
|
||||
if (dma_set_mask(&pci->dev, DMA_BIT_MASK(32)) < 0 ||
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)) < 0) {
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
|
||||
dev_warn(card->dev, "unable to get 32bit dma\n");
|
||||
err = -ENXIO;
|
||||
goto pcifail;
|
||||
|
||||
@@ -158,13 +158,13 @@ int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
|
||||
/* drop the original AD1888 HPF control */
|
||||
memset(&elem, 0, sizeof(elem));
|
||||
elem.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
strlcpy(elem.name, "High Pass Filter Enable", sizeof(elem.name));
|
||||
strscpy(elem.name, "High Pass Filter Enable", sizeof(elem.name));
|
||||
snd_ctl_remove_id(card, &elem);
|
||||
|
||||
/* drop the original V_REFOUT control */
|
||||
memset(&elem, 0, sizeof(elem));
|
||||
elem.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
strlcpy(elem.name, "V_REFOUT Enable", sizeof(elem.name));
|
||||
strscpy(elem.name, "V_REFOUT Enable", sizeof(elem.name));
|
||||
snd_ctl_remove_id(card, &elem);
|
||||
|
||||
/* add the OLPC-specific controls */
|
||||
|
||||
@@ -1901,12 +1901,8 @@ static int hw_card_start(struct hw *hw)
|
||||
return err;
|
||||
|
||||
/* Set DMA transfer mask */
|
||||
if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
|
||||
} else {
|
||||
dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
|
||||
}
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(dma_bits)))
|
||||
dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32));
|
||||
|
||||
if (!hw->io_base) {
|
||||
err = pci_request_regions(pci, "XFi");
|
||||
|
||||
@@ -2026,12 +2026,8 @@ static int hw_card_start(struct hw *hw)
|
||||
return err;
|
||||
|
||||
/* Set DMA transfer mask */
|
||||
if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
|
||||
} else {
|
||||
dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
|
||||
dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
|
||||
}
|
||||
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(dma_bits)))
|
||||
dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32));
|
||||
|
||||
if (!hw->io_base) {
|
||||
err = pci_request_regions(pci, "XFi");
|
||||
|
||||
@@ -433,7 +433,7 @@ int ct_alsa_pcm_create(struct ct_atc *atc,
|
||||
pcm->private_data = atc;
|
||||
pcm->info_flags = 0;
|
||||
pcm->dev_subclass = SNDRV_PCM_SUBCLASS_GENERIC_MIX;
|
||||
strlcpy(pcm->name, device_name, sizeof(pcm->name));
|
||||
strscpy(pcm->name, device_name, sizeof(pcm->name));
|
||||
|
||||
snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &ct_pcm_playback_ops);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user