Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: ALSA: HDA: Realtek: Avoid unnecessary volume control index on Surround/Side ASoC: Support !REGULATOR build for sgtl5000 ALSA: hda - VIA: Fix VT1708 can't build up Headphone control issue ALSA: hda - VIA: Correct stream names for VT1818S ALSA: hda - VIA: Fix codec type for VT1708BCE at the right timing ALSA: hda - VIA: Fix invalid A-A path volume adjust issue ALSA: hda - VIA: Add missing support for VT1718S in A-A path ALSA: hda - VIA: Fix independent headphone no sound issue ALSA: hda - VIA: Fix stereo mixer recording no sound issue ALSA: hda - Set EAPD for Realtek ALC665 ALSA: usb - Remove trailing spaces from USB card name strings sound: read i_size with i_size_read() ASoC: Remove bogus check for register validity in debugfs write ASoC: mini2440: Fix uda134x codec problem.
This commit is contained in:
commit
4bbba111d9
@ -488,6 +488,11 @@ static struct i2c_board_info mini2440_i2c_devs[] __initdata = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device uda1340_codec = {
|
||||
.name = "uda134x-codec",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device *mini2440_devices[] __initdata = {
|
||||
&s3c_device_ohci,
|
||||
&s3c_device_wdt,
|
||||
@ -503,7 +508,9 @@ static struct platform_device *mini2440_devices[] __initdata = {
|
||||
&s3c_device_nand,
|
||||
&s3c_device_sdi,
|
||||
&s3c_device_iis,
|
||||
&uda1340_codec,
|
||||
&mini2440_audio,
|
||||
&samsung_asoc_dma,
|
||||
};
|
||||
|
||||
static void __init mini2440_map_io(void)
|
||||
|
@ -1265,6 +1265,7 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type)
|
||||
case 0x10ec0660:
|
||||
case 0x10ec0662:
|
||||
case 0x10ec0663:
|
||||
case 0x10ec0665:
|
||||
case 0x10ec0862:
|
||||
case 0x10ec0889:
|
||||
set_eapd(codec, 0x14, 1);
|
||||
@ -4240,6 +4241,7 @@ static void alc_power_eapd(struct hda_codec *codec)
|
||||
case 0x10ec0660:
|
||||
case 0x10ec0662:
|
||||
case 0x10ec0663:
|
||||
case 0x10ec0665:
|
||||
case 0x10ec0862:
|
||||
case 0x10ec0889:
|
||||
set_eapd(codec, 0x14, 0);
|
||||
@ -16006,9 +16008,12 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
|
||||
return err;
|
||||
} else {
|
||||
const char *name = pfx;
|
||||
if (!name)
|
||||
int index = i;
|
||||
if (!name) {
|
||||
name = chname[i];
|
||||
err = __alc861_create_out_sw(codec, name, nid, i, 3);
|
||||
index = 0;
|
||||
}
|
||||
err = __alc861_create_out_sw(codec, name, nid, index, 3);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
@ -17159,16 +17164,19 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
|
||||
return err;
|
||||
} else {
|
||||
const char *name = pfx;
|
||||
if (!name)
|
||||
int index = i;
|
||||
if (!name) {
|
||||
name = chname[i];
|
||||
index = 0;
|
||||
}
|
||||
err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
|
||||
name, i,
|
||||
name, index,
|
||||
HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
|
||||
HDA_OUTPUT));
|
||||
if (err < 0)
|
||||
return err;
|
||||
err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
|
||||
name, i,
|
||||
name, index,
|
||||
HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
|
||||
HDA_INPUT));
|
||||
if (err < 0)
|
||||
@ -19217,12 +19225,15 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
|
||||
return err;
|
||||
} else {
|
||||
const char *name = pfx;
|
||||
if (!name)
|
||||
int index = i;
|
||||
if (!name) {
|
||||
name = chname[i];
|
||||
err = __alc662_add_vol_ctl(spec, name, nid, i, 3);
|
||||
index = 0;
|
||||
}
|
||||
err = __alc662_add_vol_ctl(spec, name, nid, index, 3);
|
||||
if (err < 0)
|
||||
return err;
|
||||
err = __alc662_add_sw_ctl(spec, name, mix, i, 3);
|
||||
err = __alc662_add_sw_ctl(spec, name, mix, index, 3);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
@ -159,6 +159,7 @@ struct via_spec {
|
||||
#endif
|
||||
};
|
||||
|
||||
static enum VIA_HDA_CODEC get_codec_type(struct hda_codec *codec);
|
||||
static struct via_spec * via_new_spec(struct hda_codec *codec)
|
||||
{
|
||||
struct via_spec *spec;
|
||||
@ -169,6 +170,10 @@ static struct via_spec * via_new_spec(struct hda_codec *codec)
|
||||
|
||||
codec->spec = spec;
|
||||
spec->codec = codec;
|
||||
spec->codec_type = get_codec_type(codec);
|
||||
/* VT1708BCE & VT1708S are almost same */
|
||||
if (spec->codec_type == VT1708BCE)
|
||||
spec->codec_type = VT1708S;
|
||||
return spec;
|
||||
}
|
||||
|
||||
@ -1101,6 +1106,7 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct via_spec *spec = codec->spec;
|
||||
unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
|
||||
int ret;
|
||||
|
||||
if (!spec->mux_nids[adc_idx])
|
||||
return -EINVAL;
|
||||
@ -1109,12 +1115,14 @@ static int via_mux_enum_put(struct snd_kcontrol *kcontrol,
|
||||
AC_VERB_GET_POWER_STATE, 0x00) != AC_PWRST_D0)
|
||||
snd_hda_codec_write(codec, spec->mux_nids[adc_idx], 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D0);
|
||||
|
||||
ret = snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
spec->mux_nids[adc_idx],
|
||||
&spec->cur_mux[adc_idx]);
|
||||
/* update jack power state */
|
||||
set_jack_power_state(codec);
|
||||
|
||||
return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
|
||||
spec->mux_nids[adc_idx],
|
||||
&spec->cur_mux[adc_idx]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int via_independent_hp_info(struct snd_kcontrol *kcontrol,
|
||||
@ -1188,8 +1196,16 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol,
|
||||
/* Get Independent Mode index of headphone pin widget */
|
||||
spec->hp_independent_mode = spec->hp_independent_mode_index == pinsel
|
||||
? 1 : 0;
|
||||
snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, pinsel);
|
||||
if (spec->codec_type == VT1718S)
|
||||
snd_hda_codec_write(codec, nid, 0,
|
||||
AC_VERB_SET_CONNECT_SEL, pinsel ? 2 : 0);
|
||||
else
|
||||
snd_hda_codec_write(codec, nid, 0,
|
||||
AC_VERB_SET_CONNECT_SEL, pinsel);
|
||||
|
||||
if (spec->codec_type == VT1812)
|
||||
snd_hda_codec_write(codec, 0x35, 0,
|
||||
AC_VERB_SET_CONNECT_SEL, pinsel);
|
||||
if (spec->multiout.hp_nid && spec->multiout.hp_nid
|
||||
!= spec->multiout.dac_nids[HDA_FRONT])
|
||||
snd_hda_codec_setup_stream(codec, spec->multiout.hp_nid,
|
||||
@ -1208,6 +1224,8 @@ static int via_independent_hp_put(struct snd_kcontrol *kcontrol,
|
||||
activate_ctl(codec, "Headphone Playback Switch",
|
||||
spec->hp_independent_mode);
|
||||
}
|
||||
/* update jack power state */
|
||||
set_jack_power_state(codec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1248,9 +1266,12 @@ static int via_hp_build(struct hda_codec *codec)
|
||||
break;
|
||||
}
|
||||
|
||||
nums = snd_hda_get_connections(codec, nid, conn, HDA_MAX_CONNECTIONS);
|
||||
if (nums <= 1)
|
||||
return 0;
|
||||
if (spec->codec_type != VT1708) {
|
||||
nums = snd_hda_get_connections(codec, nid,
|
||||
conn, HDA_MAX_CONNECTIONS);
|
||||
if (nums <= 1)
|
||||
return 0;
|
||||
}
|
||||
|
||||
knew = via_clone_control(spec, &via_hp_mixer[0]);
|
||||
if (knew == NULL)
|
||||
@ -1310,6 +1331,11 @@ static void mute_aa_path(struct hda_codec *codec, int mute)
|
||||
start_idx = 2;
|
||||
end_idx = 4;
|
||||
break;
|
||||
case VT1718S:
|
||||
nid_mixer = 0x21;
|
||||
start_idx = 1;
|
||||
end_idx = 3;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
@ -2185,10 +2211,6 @@ static int via_init(struct hda_codec *codec)
|
||||
for (i = 0; i < spec->num_iverbs; i++)
|
||||
snd_hda_sequence_write(codec, spec->init_verbs[i]);
|
||||
|
||||
spec->codec_type = get_codec_type(codec);
|
||||
if (spec->codec_type == VT1708BCE)
|
||||
spec->codec_type = VT1708S; /* VT1708BCE & VT1708S are almost
|
||||
same */
|
||||
/* Lydia Add for EAPD enable */
|
||||
if (!spec->dig_in_nid) { /* No Digital In connection */
|
||||
if (spec->dig_in_pin) {
|
||||
@ -2438,7 +2460,14 @@ static int vt_auto_create_analog_input_ctls(struct hda_codec *codec,
|
||||
else
|
||||
type_idx = 0;
|
||||
label = hda_get_autocfg_input_label(codec, cfg, i);
|
||||
err = via_new_analog_input(spec, label, type_idx, idx, cap_nid);
|
||||
if (spec->codec_type == VT1708S ||
|
||||
spec->codec_type == VT1702 ||
|
||||
spec->codec_type == VT1716S)
|
||||
err = via_new_analog_input(spec, label, type_idx,
|
||||
idx+1, cap_nid);
|
||||
else
|
||||
err = via_new_analog_input(spec, label, type_idx,
|
||||
idx, cap_nid);
|
||||
if (err < 0)
|
||||
return err;
|
||||
snd_hda_add_imux_item(imux, label, idx, NULL);
|
||||
@ -4147,6 +4176,11 @@ static int patch_vt1708S(struct hda_codec *codec)
|
||||
spec->stream_name_analog = "VT1708BCE Analog";
|
||||
spec->stream_name_digital = "VT1708BCE Digital";
|
||||
}
|
||||
/* correct names for VT1818S */
|
||||
if (codec->vendor_id == 0x11060440) {
|
||||
spec->stream_name_analog = "VT1818S Analog";
|
||||
spec->stream_name_digital = "VT1818S Digital";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -772,6 +772,7 @@ static int sgtl5000_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_REGULATOR
|
||||
static int ldo_regulator_is_enabled(struct regulator_dev *dev)
|
||||
{
|
||||
struct ldo_regulator *ldo = rdev_get_drvdata(dev);
|
||||
@ -901,6 +902,19 @@ static int ldo_regulator_remove(struct snd_soc_codec *codec)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int ldo_regulator_register(struct snd_soc_codec *codec,
|
||||
struct regulator_init_data *init_data,
|
||||
int voltage)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int ldo_regulator_remove(struct snd_soc_codec *codec)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* set dac bias
|
||||
|
@ -486,7 +486,8 @@ static struct snd_soc_dai_driver uda134x_dai = {
|
||||
static int uda134x_soc_probe(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct uda134x_priv *uda134x;
|
||||
struct uda134x_platform_data *pd = dev_get_drvdata(codec->card->dev);
|
||||
struct uda134x_platform_data *pd = codec->card->dev->platform_data;
|
||||
|
||||
int ret;
|
||||
|
||||
printk(KERN_INFO "UDA134X SoC Audio Codec\n");
|
||||
|
@ -219,7 +219,7 @@ static struct snd_soc_ops s3c24xx_uda134x_ops = {
|
||||
static struct snd_soc_dai_link s3c24xx_uda134x_dai_link = {
|
||||
.name = "UDA134X",
|
||||
.stream_name = "UDA134X",
|
||||
.codec_name = "uda134x-hifi",
|
||||
.codec_name = "uda134x-codec",
|
||||
.codec_dai_name = "uda134x-hifi",
|
||||
.cpu_dai_name = "s3c24xx-iis",
|
||||
.ops = &s3c24xx_uda134x_ops,
|
||||
@ -314,6 +314,7 @@ static int s3c24xx_uda134x_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(s3c24xx_uda134x_snd_device,
|
||||
&snd_soc_s3c24xx_uda134x);
|
||||
platform_device_add_data(s3c24xx_uda134x_snd_device, &s3c24xx_uda134x, sizeof(s3c24xx_uda134x));
|
||||
ret = platform_device_add(s3c24xx_uda134x_snd_device);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: Unable to add\n");
|
||||
|
@ -259,8 +259,6 @@ static ssize_t codec_reg_write_file(struct file *file,
|
||||
while (*start == ' ')
|
||||
start++;
|
||||
reg = simple_strtoul(start, &start, 16);
|
||||
if ((reg >= codec->driver->reg_cache_size) || (reg % step))
|
||||
return -EINVAL;
|
||||
while (*start == ' ')
|
||||
start++;
|
||||
if (strict_strtoul(start, 16, &value))
|
||||
|
@ -19,7 +19,7 @@ static int do_mod_firmware_load(const char *fn, char **fp)
|
||||
printk(KERN_INFO "Unable to load '%s'.\n", fn);
|
||||
return 0;
|
||||
}
|
||||
l = filp->f_path.dentry->d_inode->i_size;
|
||||
l = i_size_read(filp->f_path.dentry->d_inode);
|
||||
if (l <= 0 || l > 131072)
|
||||
{
|
||||
printk(KERN_INFO "Invalid firmware '%s'\n", fn);
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/mutex.h>
|
||||
@ -283,6 +284,15 @@ static int snd_usb_audio_dev_free(struct snd_device *device)
|
||||
return snd_usb_audio_free(chip);
|
||||
}
|
||||
|
||||
static void remove_trailing_spaces(char *str)
|
||||
{
|
||||
char *p;
|
||||
|
||||
if (!*str)
|
||||
return;
|
||||
for (p = str + strlen(str) - 1; p >= str && isspace(*p); p--)
|
||||
*p = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* create a chip instance and set its names.
|
||||
@ -351,7 +361,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
snd_component_add(card, component);
|
||||
|
||||
/* retrieve the device string as shortname */
|
||||
if (quirk && quirk->product_name) {
|
||||
if (quirk && quirk->product_name && *quirk->product_name) {
|
||||
strlcpy(card->shortname, quirk->product_name, sizeof(card->shortname));
|
||||
} else {
|
||||
if (!dev->descriptor.iProduct ||
|
||||
@ -363,9 +373,10 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
USB_ID_PRODUCT(chip->usb_id));
|
||||
}
|
||||
}
|
||||
remove_trailing_spaces(card->shortname);
|
||||
|
||||
/* retrieve the vendor and device strings as longname */
|
||||
if (quirk && quirk->vendor_name) {
|
||||
if (quirk && quirk->vendor_name && *quirk->vendor_name) {
|
||||
len = strlcpy(card->longname, quirk->vendor_name, sizeof(card->longname));
|
||||
} else {
|
||||
if (dev->descriptor.iManufacturer)
|
||||
@ -375,8 +386,11 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
len = 0;
|
||||
/* we don't really care if there isn't any vendor string */
|
||||
}
|
||||
if (len > 0)
|
||||
strlcat(card->longname, " ", sizeof(card->longname));
|
||||
if (len > 0) {
|
||||
remove_trailing_spaces(card->longname);
|
||||
if (*card->longname)
|
||||
strlcat(card->longname, " ", sizeof(card->longname));
|
||||
}
|
||||
|
||||
strlcat(card->longname, card->shortname, sizeof(card->longname));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user