diff options
| -rw-r--r-- | sound/pci/hda/patch_realtek.c | 23 | ||||
| -rw-r--r-- | sound/pci/hda/patch_sigmatel.c | 5 | ||||
| -rw-r--r-- | sound/soc/pxa/pxa2xx-i2s.c | 40 |
3 files changed, 65 insertions, 3 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index d6ec9eef2910..66025161bd69 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
| @@ -14066,6 +14066,13 @@ static struct hda_verb alc662_auto_init_verbs[] = { | |||
| 14066 | { } | 14066 | { } |
| 14067 | }; | 14067 | }; |
| 14068 | 14068 | ||
| 14069 | /* additional verbs for ALC663 */ | ||
| 14070 | static struct hda_verb alc663_auto_init_verbs[] = { | ||
| 14071 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
| 14072 | {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
| 14073 | { } | ||
| 14074 | }; | ||
| 14075 | |||
| 14069 | static struct hda_verb alc663_m51va_init_verbs[] = { | 14076 | static struct hda_verb alc663_m51va_init_verbs[] = { |
| 14070 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | 14077 | {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, |
| 14071 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, | 14078 | {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, |
| @@ -14594,6 +14601,14 @@ static int alc662_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin, | |||
| 14594 | if (!pin) | 14601 | if (!pin) |
| 14595 | return 0; | 14602 | return 0; |
| 14596 | 14603 | ||
| 14604 | if (pin == 0x17) { | ||
| 14605 | /* ALC663 has a mono output pin on 0x17 */ | ||
| 14606 | sprintf(name, "%s Playback Switch", pfx); | ||
| 14607 | err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, | ||
| 14608 | HDA_COMPOSE_AMP_VAL(pin, 2, 0, HDA_OUTPUT)); | ||
| 14609 | return err; | ||
| 14610 | } | ||
| 14611 | |||
| 14597 | if (alc880_is_fixed_pin(pin)) { | 14612 | if (alc880_is_fixed_pin(pin)) { |
| 14598 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); | 14613 | nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin)); |
| 14599 | /* printk("DAC nid=%x\n",nid); */ | 14614 | /* printk("DAC nid=%x\n",nid); */ |
| @@ -14764,6 +14779,14 @@ static int alc662_parse_auto_config(struct hda_codec *codec) | |||
| 14764 | spec->input_mux = &spec->private_imux; | 14779 | spec->input_mux = &spec->private_imux; |
| 14765 | 14780 | ||
| 14766 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; | 14781 | spec->init_verbs[spec->num_init_verbs++] = alc662_auto_init_verbs; |
| 14782 | if (codec->vendor_id == 0x10ec0663) | ||
| 14783 | spec->init_verbs[spec->num_init_verbs++] = | ||
| 14784 | alc663_auto_init_verbs; | ||
| 14785 | |||
| 14786 | err = alc_auto_add_mic_boost(codec); | ||
| 14787 | if (err < 0) | ||
| 14788 | return err; | ||
| 14789 | |||
| 14767 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; | 14790 | spec->mixers[spec->num_mixers] = alc662_capture_mixer; |
| 14768 | spec->num_mixers++; | 14791 | spec->num_mixers++; |
| 14769 | return 1; | 14792 | return 1; |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index 7fdafcb0015d..ad994fcab725 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -560,8 +560,9 @@ static struct hda_verb dell_eq_core_init[] = { | |||
| 560 | }; | 560 | }; |
| 561 | 561 | ||
| 562 | static struct hda_verb dell_m6_core_init[] = { | 562 | static struct hda_verb dell_m6_core_init[] = { |
| 563 | /* set master volume and direct control */ | 563 | /* set master volume to max value without distortion |
| 564 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff}, | 564 | * and direct control */ |
| 565 | { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec}, | ||
| 565 | /* setup audio connections */ | 566 | /* setup audio connections */ |
| 566 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, | 567 | { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00}, |
| 567 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, | 568 | { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01}, |
diff --git a/sound/soc/pxa/pxa2xx-i2s.c b/sound/soc/pxa/pxa2xx-i2s.c index 8548818eea08..c796b1882776 100644 --- a/sound/soc/pxa/pxa2xx-i2s.c +++ b/sound/soc/pxa/pxa2xx-i2s.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/device.h> | 16 | #include <linux/device.h> |
| 17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
| 18 | #include <linux/clk.h> | 18 | #include <linux/clk.h> |
| 19 | #include <linux/platform_device.h> | ||
| 19 | #include <sound/core.h> | 20 | #include <sound/core.h> |
| 20 | #include <sound/pcm.h> | 21 | #include <sound/pcm.h> |
| 21 | #include <sound/initval.h> | 22 | #include <sound/initval.h> |
| @@ -81,7 +82,6 @@ static int pxa2xx_i2s_startup(struct snd_pcm_substream *substream) | |||
| 81 | struct snd_soc_pcm_runtime *rtd = substream->private_data; | 82 | struct snd_soc_pcm_runtime *rtd = substream->private_data; |
| 82 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; | 83 | struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; |
| 83 | 84 | ||
| 84 | clk_i2s = clk_get(NULL, "I2SCLK"); | ||
| 85 | if (IS_ERR(clk_i2s)) | 85 | if (IS_ERR(clk_i2s)) |
| 86 | return PTR_ERR(clk_i2s); | 86 | return PTR_ERR(clk_i2s); |
| 87 | 87 | ||
| @@ -152,6 +152,7 @@ static int pxa2xx_i2s_hw_params(struct snd_pcm_substream *substream, | |||
| 152 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); | 152 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].tx); |
| 153 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); | 153 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].frm); |
| 154 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); | 154 | pxa_gpio_mode(gpio_bus[pxa_i2s.master].clk); |
| 155 | BUG_ON(IS_ERR(clk_i2s)); | ||
| 155 | clk_enable(clk_i2s); | 156 | clk_enable(clk_i2s); |
| 156 | pxa_i2s_wait(); | 157 | pxa_i2s_wait(); |
| 157 | 158 | ||
| @@ -317,6 +318,43 @@ struct snd_soc_dai pxa_i2s_dai = { | |||
| 317 | 318 | ||
| 318 | EXPORT_SYMBOL_GPL(pxa_i2s_dai); | 319 | EXPORT_SYMBOL_GPL(pxa_i2s_dai); |
| 319 | 320 | ||
| 321 | static int pxa2xx_i2s_probe(struct platform_device *dev) | ||
| 322 | { | ||
| 323 | clk_i2s = clk_get(&dev->dev, "I2SCLK"); | ||
| 324 | return IS_ERR(clk_i2s) ? PTR_ERR(clk_i2s) : 0; | ||
| 325 | } | ||
| 326 | |||
| 327 | static int __devexit pxa2xx_i2s_remove(struct platform_device *dev) | ||
| 328 | { | ||
| 329 | clk_put(clk_i2s); | ||
| 330 | clk_i2s = ERR_PTR(-ENOENT); | ||
| 331 | return 0; | ||
| 332 | } | ||
| 333 | |||
| 334 | static struct platform_driver pxa2xx_i2s_driver = { | ||
| 335 | .probe = pxa2xx_i2s_probe, | ||
| 336 | .remove = __devexit_p(pxa2xx_i2s_remove), | ||
| 337 | |||
| 338 | .driver = { | ||
| 339 | .name = "pxa2xx-i2s", | ||
| 340 | .owner = THIS_MODULE, | ||
| 341 | }, | ||
| 342 | }; | ||
| 343 | |||
| 344 | static int __init pxa2xx_i2s_init(void) | ||
| 345 | { | ||
| 346 | clk_i2s = ERR_PTR(-ENOENT); | ||
| 347 | return platform_driver_register(&pxa2xx_i2s_driver); | ||
| 348 | } | ||
| 349 | |||
| 350 | static void __exit pxa2xx_i2s_exit(void) | ||
| 351 | { | ||
| 352 | platform_driver_unregister(&pxa2xx_i2s_driver); | ||
| 353 | } | ||
| 354 | |||
| 355 | module_init(pxa2xx_i2s_init); | ||
| 356 | module_exit(pxa2xx_i2s_exit); | ||
| 357 | |||
| 320 | /* Module information */ | 358 | /* Module information */ |
| 321 | MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); | 359 | MODULE_AUTHOR("Liam Girdwood, liam.girdwood@wolfsonmicro.com, www.wolfsonmicro.com"); |
| 322 | MODULE_DESCRIPTION("pxa2xx I2S SoC Interface"); | 360 | MODULE_DESCRIPTION("pxa2xx I2S SoC Interface"); |
