Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 23 Mar 2011 14:58:09 +0000 (07:58 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 23 Mar 2011 14:58:09 +0000 (07:58 -0700)
* '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.

arch/arm/mach-s3c2440/mach-mini2440.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_via.c
sound/soc/codecs/sgtl5000.c
sound/soc/codecs/uda134x.c
sound/soc/samsung/s3c24xx_uda134x.c
sound/soc/soc-core.c
sound/sound_firmware.c
sound/usb/card.c

index d80f129..dfedc9c 100644 (file)
@@ -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)
index f1a03f2..5d582de 100644 (file)
@@ -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;
                }
index 63b0054..1371b57 100644 (file)
@@ -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);
-       /* update jack power state */
-       set_jack_power_state(codec);
 
-       return snd_hda_input_mux_put(codec, spec->input_mux, ucontrol,
+       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 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;
 }
 
index 1f7217f..ff29380 100644 (file)
@@ -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
index e76847a..48ffd40 100644 (file)
@@ -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");
index 3cb7007..dc9d551 100644 (file)
@@ -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");
index 17efacd..4dda589 100644 (file)
@@ -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))
index 340a0bc..7e96249 100644 (file)
@@ -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);
index 40722f8..a90662a 100644 (file)
@@ -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));