Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Sep 2009 03:52:32 +0000 (20:52 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 18 Sep 2009 03:52:32 +0000 (20:52 -0700)
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (51 commits)
  MIPS: BCM63xx: Add integrated ethernet mac support.
  MIPS: BCM63xx: Add support for the Broadcom BCM63xx family of SOCs.
  MIPS: BCM63xx: Add Broadcom 63xx CPU definitions.
  MIPS: Octeon:  Move some platform device registration to its own file.
  MIPS: Don't corrupt page tables on vmalloc fault.
  MIPS: Shrink the size of tlb handler
  MIPS: Alchemy: override loops_per_jiffy detection
  MIPS: hw_random: Add hardware RNG for Octeon SOCs.
  MIPS: Octeon:  Add hardware RNG platform device.
  MIPS: Remove useless zero initializations.
  MIPS: Alchemy: get rid of allow_au1k_wait
  MIPS: Octeon: Set kernel_uses_llsc to false on non-SMP builds.
  MIPS: Allow kernel use of LL/SC to be separate from the presence of LL/SC.
  MIPS: Get rid of CONFIG_CPU_HAS_LLSC
  MIPS: Malta: Remove pointless use use of CONFIG_CPU_HAS_LLSC
  MIPS: Rewrite clearing of ll_bit on context switch in C
  MIPS: Rewrite sysmips(MIPS_ATOMIC_SET, ...) in C with inline assembler
  MIPS: Consolidate all CONFIG_CPU_HAS_LLSC use in a single C file.
  MIPS: Clean up linker script using new linker script macros.
  MIPS: Use PAGE_SIZE in assembly instead of _PAGE_SIZE.
  ...

13 files changed:
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/amd.c
drivers/edac/Kconfig
drivers/edac/amd64_edac.c
drivers/edac/edac_mce_amd.c
sound/pci/hda/patch_realtek.c
sound/pci/hda/patch_sigmatel.c
sound/soc/codecs/ad1836.c
sound/soc/codecs/ad1938.c
sound/soc/codecs/wm8974.c
sound/soc/fsl/mpc5200_dma.c
sound/soc/s3c24xx/s3c-i2s-v2.c
sound/soc/soc-dapm.c

index e08ea04..42a3f93 100644 (file)
@@ -1020,4 +1020,6 @@ extern void start_thread(struct pt_regs *regs, unsigned long new_ip,
 extern int get_tsc_mode(unsigned long adr);
 extern int set_tsc_mode(unsigned int val);
 
+extern int amd_get_nb_id(int cpu);
+
 #endif /* _ASM_X86_PROCESSOR_H */
index 22a47c8..f32fa71 100644 (file)
@@ -333,6 +333,16 @@ static void __cpuinit amd_detect_cmp(struct cpuinfo_x86 *c)
 #endif
 }
 
+int amd_get_nb_id(int cpu)
+{
+       int id = 0;
+#ifdef CONFIG_SMP
+       id = per_cpu(cpu_llc_id, cpu);
+#endif
+       return id;
+}
+EXPORT_SYMBOL_GPL(amd_get_nb_id);
+
 static void __cpuinit srat_detect_node(struct cpuinfo_x86 *c)
 {
 #if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)
index 4339b1a..a3ca18e 100644 (file)
@@ -59,7 +59,7 @@ config EDAC_MM_EDAC
 
 config EDAC_AMD64
        tristate "AMD64 (Opteron, Athlon64) K8, F10h, F11h"
-       depends on EDAC_MM_EDAC && K8_NB && X86_64 && PCI
+       depends on EDAC_MM_EDAC && K8_NB && X86_64 && PCI && CPU_SUP_AMD
        help
          Support for error detection and correction on the AMD 64
          Families of Memory Controllers (K8, F10h and F11h)
index 173dc4a..4e551e6 100644 (file)
@@ -1255,7 +1255,9 @@ static int k8_dbam_map_to_pages(struct amd64_pvt *pvt, int dram_map)
  */
 static int f10_early_channel_count(struct amd64_pvt *pvt)
 {
+       int dbams[] = { DBAM0, DBAM1 };
        int err = 0, channels = 0;
+       int i, j;
        u32 dbam;
 
        err = pci_read_config_dword(pvt->dram_f2_ctl, F10_DCLR_0, &pvt->dclr0);
@@ -1288,46 +1290,19 @@ static int f10_early_channel_count(struct amd64_pvt *pvt)
         * is more than just one DIMM present in unganged mode. Need to check
         * both controllers since DIMMs can be placed in either one.
         */
-       channels = 0;
-       err = pci_read_config_dword(pvt->dram_f2_ctl, DBAM0, &dbam);
-       if (err)
-               goto err_reg;
-
-       if (DBAM_DIMM(0, dbam) > 0)
-               channels++;
-       if (DBAM_DIMM(1, dbam) > 0)
-               channels++;
-       if (DBAM_DIMM(2, dbam) > 0)
-               channels++;
-       if (DBAM_DIMM(3, dbam) > 0)
-               channels++;
-
-       /* If more than 2 DIMMs are present, then we have 2 channels */
-       if (channels > 2)
-               channels = 2;
-       else if (channels == 0) {
-               /* No DIMMs on DCT0, so look at DCT1 */
-               err = pci_read_config_dword(pvt->dram_f2_ctl, DBAM1, &dbam);
+       for (i = 0; i < ARRAY_SIZE(dbams); i++) {
+               err = pci_read_config_dword(pvt->dram_f2_ctl, dbams[i], &dbam);
                if (err)
                        goto err_reg;
 
-               if (DBAM_DIMM(0, dbam) > 0)
-                       channels++;
-               if (DBAM_DIMM(1, dbam) > 0)
-                       channels++;
-               if (DBAM_DIMM(2, dbam) > 0)
-                       channels++;
-               if (DBAM_DIMM(3, dbam) > 0)
-                       channels++;
-
-               if (channels > 2)
-                       channels = 2;
+               for (j = 0; j < 4; j++) {
+                       if (DBAM_DIMM(j, dbam) > 0) {
+                               channels++;
+                               break;
+                       }
+               }
        }
 
-       /* If we found ALL 0 values, then assume just ONE DIMM-ONE Channel */
-       if (channels == 0)
-               channels = 1;
-
        debugf0("MCT channel count: %d\n", channels);
 
        return channels;
@@ -2766,30 +2741,53 @@ static void amd64_restore_ecc_error_reporting(struct amd64_pvt *pvt)
        wrmsr_on_cpus(cpumask, K8_MSR_MCGCTL, msrs);
 }
 
-static void check_mcg_ctl(void *ret)
+/* get all cores on this DCT */
+static void get_cpus_on_this_dct_cpumask(cpumask_t *mask, int nid)
 {
-       u64 msr_val = 0;
-       u8 nbe;
-
-       rdmsrl(MSR_IA32_MCG_CTL, msr_val);
-       nbe = msr_val & K8_MSR_MCGCTL_NBE;
-
-       debugf0("core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
-               raw_smp_processor_id(), msr_val,
-               (nbe ? "enabled" : "disabled"));
+       int cpu;
 
-       if (!nbe)
-               *(int *)ret = 0;
+       for_each_online_cpu(cpu)
+               if (amd_get_nb_id(cpu) == nid)
+                       cpumask_set_cpu(cpu, mask);
 }
 
 /* check MCG_CTL on all the cpus on this node */
-static int amd64_mcg_ctl_enabled_on_cpus(const cpumask_t *mask)
+static bool amd64_nb_mce_bank_enabled_on_node(int nid)
 {
-       int ret = 1;
-       preempt_disable();
-       smp_call_function_many(mask, check_mcg_ctl, &ret, 1);
-       preempt_enable();
+       cpumask_t mask;
+       struct msr *msrs;
+       int cpu, nbe, idx = 0;
+       bool ret = false;
 
+       cpumask_clear(&mask);
+
+       get_cpus_on_this_dct_cpumask(&mask, nid);
+
+       msrs = kzalloc(sizeof(struct msr) * cpumask_weight(&mask), GFP_KERNEL);
+       if (!msrs) {
+               amd64_printk(KERN_WARNING, "%s: error allocating msrs\n",
+                             __func__);
+                return false;
+       }
+
+       rdmsr_on_cpus(&mask, MSR_IA32_MCG_CTL, msrs);
+
+       for_each_cpu(cpu, &mask) {
+               nbe = msrs[idx].l & K8_MSR_MCGCTL_NBE;
+
+               debugf0("core: %u, MCG_CTL: 0x%llx, NB MSR is %s\n",
+                       cpu, msrs[idx].q,
+                       (nbe ? "enabled" : "disabled"));
+
+               if (!nbe)
+                       goto out;
+
+               idx++;
+       }
+       ret = true;
+
+out:
+       kfree(msrs);
        return ret;
 }
 
@@ -2799,71 +2797,46 @@ static int amd64_mcg_ctl_enabled_on_cpus(const cpumask_t *mask)
  * the memory system completely. A command line option allows to force-enable
  * hardware ECC later in amd64_enable_ecc_error_reporting().
  */
+static const char *ecc_warning =
+       "WARNING: ECC is disabled by BIOS. Module will NOT be loaded.\n"
+       " Either Enable ECC in the BIOS, or set 'ecc_enable_override'.\n"
+       " Also, use of the override can cause unknown side effects.\n";
+
 static int amd64_check_ecc_enabled(struct amd64_pvt *pvt)
 {
        u32 value;
-       int err = 0, ret = 0;
+       int err = 0;
        u8 ecc_enabled = 0;
+       bool nb_mce_en = false;
 
        err = pci_read_config_dword(pvt->misc_f3_ctl, K8_NBCFG, &value);
        if (err)
                debugf0("Reading K8_NBCTL failed\n");
 
        ecc_enabled = !!(value & K8_NBCFG_ECC_ENABLE);
+       if (!ecc_enabled)
+               amd64_printk(KERN_WARNING, "This node reports that Memory ECC "
+                            "is currently disabled, set F3x%x[22] (%s).\n",
+                            K8_NBCFG, pci_name(pvt->misc_f3_ctl));
+       else
+               amd64_printk(KERN_INFO, "ECC is enabled by BIOS.\n");
 
-       ret = amd64_mcg_ctl_enabled_on_cpus(cpumask_of_node(pvt->mc_node_id));
-
-       debugf0("K8_NBCFG=0x%x,  DRAM ECC is %s\n", value,
-                       (value & K8_NBCFG_ECC_ENABLE ? "enabled" : "disabled"));
-
-       if (!ecc_enabled || !ret) {
-               if (!ecc_enabled) {
-                       amd64_printk(KERN_WARNING, "This node reports that "
-                                                  "Memory ECC is currently "
-                                                  "disabled.\n");
+       nb_mce_en = amd64_nb_mce_bank_enabled_on_node(pvt->mc_node_id);
+       if (!nb_mce_en)
+               amd64_printk(KERN_WARNING, "NB MCE bank disabled, set MSR "
+                            "0x%08x[4] on node %d to enable.\n",
+                            MSR_IA32_MCG_CTL, pvt->mc_node_id);
 
-                       amd64_printk(KERN_WARNING, "bit 0x%lx in register "
-                               "F3x%x of the MISC_CONTROL device (%s) "
-                               "should be enabled\n", K8_NBCFG_ECC_ENABLE,
-                               K8_NBCFG, pci_name(pvt->misc_f3_ctl));
-               }
-               if (!ret) {
-                       amd64_printk(KERN_WARNING, "bit 0x%016lx in MSR 0x%08x "
-                                       "of node %d should be enabled\n",
-                                       K8_MSR_MCGCTL_NBE, MSR_IA32_MCG_CTL,
-                                       pvt->mc_node_id);
-               }
+       if (!ecc_enabled || !nb_mce_en) {
                if (!ecc_enable_override) {
-                       amd64_printk(KERN_WARNING, "WARNING: ECC is NOT "
-                               "currently enabled by the BIOS. Module "
-                               "will NOT be loaded.\n"
-                               "    Either Enable ECC in the BIOS, "
-                               "or use the 'ecc_enable_override' "
-                               "parameter.\n"
-                               "    Might be a BIOS bug, if BIOS says "
-                               "ECC is enabled\n"
-                               "    Use of the override can cause "
-                               "unknown side effects.\n");
-                       ret = -ENODEV;
-               } else
-                       /*
-                        * enable further driver loading if ECC enable is
-                        * overridden.
-                        */
-                       ret = 0;
-       } else {
-               amd64_printk(KERN_INFO,
-                       "ECC is enabled by BIOS, Proceeding "
-                       "with EDAC module initialization\n");
-
-               /* Signal good ECC status */
-               ret = 0;
-
+                       amd64_printk(KERN_WARNING, "%s", ecc_warning);
+                       return -ENODEV;
+               }
+       } else
                /* CLEAR the override, since BIOS controlled it */
                ecc_enable_override = 0;
-       }
 
-       return ret;
+       return 0;
 }
 
 struct mcidev_sysfs_attribute sysfs_attrs[ARRAY_SIZE(amd64_dbg_attrs) +
index c8ca713..0c21c37 100644 (file)
@@ -405,7 +405,7 @@ void decode_mce(struct mce *m)
                regs.nbsh  = (u32)(m->status >> 32);
                regs.nbeal = (u32) m->addr;
                regs.nbeah = (u32)(m->addr >> 32);
-               node       = per_cpu(cpu_llc_id, m->extcpu);
+               node       = amd_get_nb_id(m->extcpu);
 
                amd_decode_nb_mce(node, &regs, 1);
                break;
index 7ed47f6..1296058 100644 (file)
@@ -7927,8 +7927,9 @@ static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
 
 static struct snd_kcontrol_new alc883_targa_mixer[] = {
        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
+       HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
        HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
-       HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
        HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
        HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
        HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
@@ -7947,8 +7948,9 @@ static struct snd_kcontrol_new alc883_targa_mixer[] = {
 
 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
+       HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
        HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
-       HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
        HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
        HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
        HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
@@ -7960,6 +7962,15 @@ static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
        { } /* end */
 };
 
+static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
+       HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
+       HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
+       HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
+       HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
+       HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
+       { } /* end */
+};
+
 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
        HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
        HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
@@ -9167,7 +9178,8 @@ static struct alc_config_preset alc882_presets[] = {
                .init_hook = alc882_targa_automute,
        },
        [ALC883_TARGA_8ch_DIG] = {
-               .mixers = { alc883_base_mixer, alc883_chmode_mixer },
+               .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
+                           alc883_chmode_mixer },
                .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
                                alc883_targa_verbs },
                .num_dacs = ARRAY_SIZE(alc883_dac_nids),
@@ -13370,7 +13382,8 @@ static const char *alc269_models[ALC269_MODEL_LAST] = {
        [ALC269_ASUS_EEEPC_P703]        = "eeepc-p703",
        [ALC269_ASUS_EEEPC_P901]        = "eeepc-p901",
        [ALC269_FUJITSU]                = "fujitsu",
-       [ALC269_LIFEBOOK]               = "lifebook"
+       [ALC269_LIFEBOOK]               = "lifebook",
+       [ALC269_AUTO]                   = "auto",
 };
 
 static struct snd_pci_quirk alc269_cfg_tbl[] = {
index e31e53d..826137e 100644 (file)
@@ -864,10 +864,6 @@ static struct hda_verb stac92hd73xx_core_init[] = {
 };
 
 static struct hda_verb stac92hd83xxx_core_init[] = {
-       { 0xa, AC_VERB_SET_CONNECT_SEL, 0x1},
-       { 0xb, AC_VERB_SET_CONNECT_SEL, 0x1},
-       { 0xd, AC_VERB_SET_CONNECT_SEL, 0x0},
-
        /* power state controls amps */
        { 0x01, AC_VERB_SET_EAPD, 1 << 2},
        {}
@@ -1590,8 +1586,8 @@ static unsigned int ref92hd83xxx_pin_configs[10] = {
 };
 
 static unsigned int dell_s14_pin_configs[10] = {
-       0x02214030, 0x02211010, 0x02a19020, 0x01014050,
-       0x40f000f0, 0x01819040, 0x40f000f0, 0x90a60160,
+       0x0221403f, 0x0221101f, 0x02a19020, 0x90170110,
+       0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a60160,
        0x40f000f0, 0x40f000f0,
 };
 
@@ -1690,6 +1686,8 @@ static struct snd_pci_quirk stac92hd71bxx_cfg_tbl[] = {
                      "HP mini 1000", STAC_HP_M4),
        SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
                      "HP HDX", STAC_HP_HDX),  /* HDX16 */
+       SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
+                     "HP dv6", STAC_HP_DV5),
        SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
                      "HP", STAC_HP_DV5),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
@@ -4166,7 +4164,10 @@ static int stac92xx_init(struct hda_codec *codec)
                stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
                                AC_PINCTL_OUT_EN);
                /* fake event to set up pins */
-               stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
+               if (cfg->hp_pins[0])
+                       stac_issue_unsol_event(codec, cfg->hp_pins[0]);
+               else if (cfg->line_out_pins[0])
+                       stac_issue_unsol_event(codec, cfg->line_out_pins[0]);
        } else {
                stac92xx_auto_init_multi_out(codec);
                stac92xx_auto_init_hp_out(codec);
@@ -4688,8 +4689,13 @@ static int stac92xx_resume(struct hda_codec *codec)
        snd_hda_codec_resume_amp(codec);
        snd_hda_codec_resume_cache(codec);
        /* fake event to set up pins again to override cached values */
-       if (spec->hp_detect)
-               stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
+       if (spec->hp_detect) {
+               if (spec->autocfg.hp_pins[0])
+                       stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
+               else if (spec->autocfg.line_out_pins[0])
+                       stac_issue_unsol_event(codec,
+                                              spec->autocfg.line_out_pins[0]);
+       }
        return 0;
 }
 
@@ -5016,7 +5022,7 @@ again:
                spec->eapd_switch = 1;
                break;
        }
-       if (spec->board_config > STAC_92HD73XX_REF) {
+       if (spec->board_config != STAC_92HD73XX_REF) {
                /* GPIO0 High = Enable EAPD */
                spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
                spec->gpio_data = 0x01;
@@ -5066,7 +5072,6 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
 
        codec->spec = spec;
        codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
-       spec->mono_nid = 0x19;
        spec->digbeep_nid = 0x21;
        spec->mux_nids = stac92hd83xxx_mux_nids;
        spec->num_muxes = ARRAY_SIZE(stac92hd83xxx_mux_nids);
@@ -5242,7 +5247,7 @@ again:
                stac92xx_set_config_regs(codec,
                                stac92hd71bxx_brd_tbl[spec->board_config]);
 
-       if (spec->board_config > STAC_92HD71BXX_REF) {
+       if (spec->board_config != STAC_92HD71BXX_REF) {
                /* GPIO0 = EAPD */
                spec->gpio_mask = 0x01;
                spec->gpio_dir = 0x01;
@@ -5375,6 +5380,11 @@ again:
        case STAC_HP_DV5:
                snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
                stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
+               /* HP dv6 gives the headphone pin as a line-out.  Thus we
+                * need to set hp_detect flag here to force to enable HP
+                * detection.
+                */
+               spec->hp_detect = 1;
                break;
        case STAC_HP_HDX:
                spec->num_dmics = 1;
@@ -5557,14 +5567,17 @@ static int patch_stac927x(struct hda_codec *codec)
        spec->dac_list = stac927x_dac_nids;
        spec->multiout.dac_nids = spec->dac_nids;
 
+       if (spec->board_config != STAC_D965_REF) {
+               /* GPIO0 High = Enable EAPD */
+               spec->eapd_mask = spec->gpio_mask = 0x01;
+               spec->gpio_dir = spec->gpio_data = 0x01;
+       }
+
        switch (spec->board_config) {
        case STAC_D965_3ST:
        case STAC_D965_5ST:
                /* GPIO0 High = Enable EAPD */
-               spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x01;
-               spec->gpio_data = 0x01;
                spec->num_dmics = 0;
-
                spec->init = d965_core_init;
                break;
        case STAC_DELL_BIOS:
@@ -5583,16 +5596,11 @@ static int patch_stac927x(struct hda_codec *codec)
                snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
                /* fallthru */
        case STAC_DELL_3ST:
-               /* GPIO2 High = Enable EAPD */
-               spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
-               spec->gpio_data = 0x04;
-               switch (codec->subsystem_id) {
-               case 0x1028022f:
-                       /* correct EAPD to be GPIO0 */
-                       spec->eapd_mask = spec->gpio_mask = 0x01;
-                       spec->gpio_dir = spec->gpio_data = 0x01;
-                       break;
-               };
+               if (codec->subsystem_id != 0x1028022f) {
+                       /* GPIO2 High = Enable EAPD */
+                       spec->eapd_mask = spec->gpio_mask = 0x04;
+                       spec->gpio_dir = spec->gpio_data = 0x04;
+               }
                spec->dmic_nids = stac927x_dmic_nids;
                spec->num_dmics = STAC927X_NUM_DMICS;
 
@@ -5601,14 +5609,9 @@ static int patch_stac927x(struct hda_codec *codec)
                spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
                break;
        default:
-               if (spec->board_config > STAC_D965_REF) {
-                       /* GPIO0 High = Enable EAPD */
-                       spec->eapd_mask = spec->gpio_mask = 0x01;
-                       spec->gpio_dir = spec->gpio_data = 0x01;
-               }
                spec->num_dmics = 0;
-
                spec->init = stac927x_core_init;
+               break;
        }
 
        spec->num_caps = STAC927X_NUM_CAPS;
index 3612bb9..01343dc 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/device.h>
 #include <sound/core.h>
index e62b277..9a049a1 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/device.h>
 #include <sound/core.h>
index d8a013a..98d663a 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <linux/module.h>
 #include <linux/moduleparam.h>
-#include <linux/version.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
index 9ff62e3..6096d22 100644 (file)
@@ -447,6 +447,7 @@ int mpc5200_audio_dma_create(struct of_device *op)
        int size, irq, rc;
        const __be32 *prop;
        void __iomem *regs;
+       int ret;
 
        /* Fetch the registers and IRQ of the PSC */
        irq = irq_of_parse_and_map(op->node, 0);
@@ -463,14 +464,16 @@ int mpc5200_audio_dma_create(struct of_device *op)
        /* Allocate and initialize the driver private data */
        psc_dma = kzalloc(sizeof *psc_dma, GFP_KERNEL);
        if (!psc_dma) {
-               iounmap(regs);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto out_unmap;
        }
 
        /* Get the PSC ID */
        prop = of_get_property(op->node, "cell-index", &size);
-       if (!prop || size < sizeof *prop)
-               return -ENODEV;
+       if (!prop || size < sizeof *prop) {
+               ret = -ENODEV;
+               goto out_free;
+       }
 
        spin_lock_init(&psc_dma->lock);
        mutex_init(&psc_dma->mutex);
@@ -493,9 +496,8 @@ int mpc5200_audio_dma_create(struct of_device *op)
        if (!psc_dma->capture.bcom_task ||
            !psc_dma->playback.bcom_task) {
                dev_err(&op->dev, "Could not allocate bestcomm tasks\n");
-               iounmap(regs);
-               kfree(psc_dma);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto out_free;
        }
 
        /* Disable all interrupts and reset the PSC */
@@ -537,12 +539,8 @@ int mpc5200_audio_dma_create(struct of_device *op)
                          &psc_dma_bcom_irq_tx, IRQF_SHARED,
                          "psc-dma-playback", &psc_dma->playback);
        if (rc) {
-               free_irq(psc_dma->irq, psc_dma);
-               free_irq(psc_dma->capture.irq,
-                        &psc_dma->capture);
-               free_irq(psc_dma->playback.irq,
-                        &psc_dma->playback);
-               return -ENODEV;
+               ret = -ENODEV;
+               goto out_irq;
        }
 
        /* Save what we've done so it can be found again later */
@@ -550,6 +548,15 @@ int mpc5200_audio_dma_create(struct of_device *op)
 
        /* Tell the ASoC OF helpers about it */
        return snd_soc_register_platform(&mpc5200_audio_dma_platform);
+out_irq:
+       free_irq(psc_dma->irq, psc_dma);
+       free_irq(psc_dma->capture.irq, &psc_dma->capture);
+       free_irq(psc_dma->playback.irq, &psc_dma->playback);
+out_free:
+       kfree(psc_dma);
+out_unmap:
+       iounmap(regs);
+       return ret;
 }
 EXPORT_SYMBOL_GPL(mpc5200_audio_dma_create);
 
index aa7af0b..9bc4aa3 100644 (file)
@@ -230,6 +230,8 @@ static void s3c2412_snd_rxctrl(struct s3c_i2sv2_info *i2s, int on)
        pr_debug("%s: IIS: CON=%x MOD=%x FIC=%x\n", __func__, con, mod, fic);
 }
 
+#define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)
+
 /*
  * Wait for the LR signal to allow synchronisation to the L/R clock
  * from the codec. May only be needed for slave mode.
@@ -237,19 +239,21 @@ static void s3c2412_snd_rxctrl(struct s3c_i2sv2_info *i2s, int on)
 static int s3c2412_snd_lrsync(struct s3c_i2sv2_info *i2s)
 {
        u32 iiscon;
-       unsigned long timeout = jiffies + msecs_to_jiffies(5);
+       unsigned long loops = msecs_to_loops(5);
 
        pr_debug("Entered %s\n", __func__);
 
-       while (1) {
+       while (--loops) {
                iiscon = readl(i2s->regs + S3C2412_IISCON);
                if (iiscon & S3C2412_IISCON_LRINDEX)
                        break;
 
-               if (timeout < jiffies) {
-                       printk(KERN_ERR "%s: timeout\n", __func__);
-                       return -ETIMEDOUT;
-               }
+               cpu_relax();
+       }
+
+       if (!loops) {
+               printk(KERN_ERR "%s: timeout\n", __func__);
+               return -ETIMEDOUT;
        }
 
        return 0;
index 0d8b08e..f79711b 100644 (file)
@@ -1131,9 +1131,10 @@ static ssize_t dapm_widget_power_read_file(struct file *file,
        ret = snprintf(buf, PAGE_SIZE, "%s: %s  in %d out %d\n",
                       w->name, w->power ? "On" : "Off", in, out);
 
-       if (w->active && w->sname)
-               ret += snprintf(buf, PAGE_SIZE - ret, " stream %s active\n",
-                               w->sname);
+       if (w->sname)
+               ret += snprintf(buf + ret, PAGE_SIZE - ret, " stream %s %s\n",
+                               w->sname,
+                               w->active ? "active" : "inactive");
 
        list_for_each_entry(p, &w->sources, list_sink) {
                if (p->connect)