aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_hdmi.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-07-06 13:56:51 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-07-06 13:56:51 -0400
commit920f2ecdf6c3b3526f60fbd38c68597953cad3ee (patch)
tree18188922ba38a5c53ee8d17032eb5c46dffc7fa2 /sound/pci/hda/patch_hdmi.c
parent9ced560b82606b35adb33a27012a148d418a4c1f (diff)
parentfc18282cdcba984ab89c74d7e844c10114ae0795 (diff)
Merge tag 'sound-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound updates from Takashi Iwai: "This development cycle resulted in a fair amount of changes in both core and driver sides. The most significant change in ALSA core is about PCM. Also the support of of-graph card and the new DAPM widget for DSP are noteworthy changes in ASoC core. And there're lots of small changes splat over the tree, as you can see in diffstat. Below are a few highlights: ALSA core: - Removal of set_fs() hackery from PCM core stuff, and the code reorganization / optimization thereafter - Improved support of PCM ack ops, and a new ABI for improved control/status mmap handling - Lots of constifications in various codes ASoC core: - The support of of-graph card, which may work as a better generic device for a replacement of simple-card - New widget types intended mainly for use with DSPs ASoC drivers: - New drivers for Allwinner V3s SoCs - Ensonic ES8316 codec support - More Intel SKL and KBL works - More device support for Intel SST Atom (mostly for cheap tablets and 2-in-1 devices) - Support for Rockchip PDM controllers - Support for STM32 I2S and S/PDIF controllers - Support for ZTE AUD96P22 codecs HD-audio: - Support of new Realtek codecs (ALC215/ALC285/ALC289), more quirks for HP and Dell machines - A few more fixes for i915 component binding" * tag 'sound-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (418 commits) ALSA: hda - Fix unbalance of i915 module refcount ASoC: Intel: Skylake: Remove driver debugfs exit ASoC: Intel: Skylake: explicitly add the headers sst-dsp.h ALSA: hda/realtek - Remove GPIO_MASK ALSA: hda/realtek - Fix typo of pincfg for Dell quirk ALSA: pcm: add a documentation for tracepoints ALSA: atmel: ac97c: fix error return code in atmel_ac97c_probe() ALSA: x86: fix error return code in hdmi_lpe_audio_probe() ASoC: Intel: Skylake: Add support to read firmware registers ASoC: Intel: Skylake: Add sram address to sst_addr structure ASoC: Intel: Skylake: Debugfs facility to dump module config ASoC: Intel: Skylake: Add debugfs support ASoC: fix semicolon.cocci warnings ASoC: rt5645: Add quirk override by module option ASoC: rsnd: make arrays path and cmd_case static const ASoC: audio-graph-card: add widgets and routing for external amplifier support ASoC: audio-graph-card: update bindings for amplifier support ASoC: rt5665: calibration should be done before jack detection ASoC: rsnd: constify dev_pm_ops structures. ASoC: nau8825: change crosstalk-bypass property to bool type ...
Diffstat (limited to 'sound/pci/hda/patch_hdmi.c')
-rw-r--r--sound/pci/hda/patch_hdmi.c104
1 files changed, 39 insertions, 65 deletions
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index 90e4ff87445e..76c85f08bea6 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -174,7 +174,6 @@ struct hdmi_spec {
174 /* i915/powerwell (Haswell+/Valleyview+) specific */ 174 /* i915/powerwell (Haswell+/Valleyview+) specific */
175 bool use_acomp_notifier; /* use i915 eld_notify callback for hotplug */ 175 bool use_acomp_notifier; /* use i915 eld_notify callback for hotplug */
176 struct i915_audio_component_audio_ops i915_audio_ops; 176 struct i915_audio_component_audio_ops i915_audio_ops;
177 bool i915_bound; /* was i915 bound in this driver? */
178 177
179 struct hdac_chmap chmap; 178 struct hdac_chmap chmap;
180 hda_nid_t vendor_nid; 179 hda_nid_t vendor_nid;
@@ -2234,8 +2233,6 @@ static void generic_spec_free(struct hda_codec *codec)
2234 struct hdmi_spec *spec = codec->spec; 2233 struct hdmi_spec *spec = codec->spec;
2235 2234
2236 if (spec) { 2235 if (spec) {
2237 if (spec->i915_bound)
2238 snd_hdac_i915_exit(&codec->bus->core);
2239 hdmi_array_free(spec); 2236 hdmi_array_free(spec);
2240 kfree(spec); 2237 kfree(spec);
2241 codec->spec = NULL; 2238 codec->spec = NULL;
@@ -2506,19 +2503,41 @@ static void i915_pin_cvt_fixup(struct hda_codec *codec,
2506 } 2503 }
2507} 2504}
2508 2505
2509/* Intel Haswell and onwards; audio component with eld notifier */ 2506/* precondition and allocation for Intel codecs */
2510static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid) 2507static int alloc_intel_hdmi(struct hda_codec *codec)
2511{ 2508{
2512 struct hdmi_spec *spec; 2509 /* requires i915 binding */
2513 int err;
2514
2515 /* HSW+ requires i915 binding */
2516 if (!codec->bus->core.audio_component) { 2510 if (!codec->bus->core.audio_component) {
2517 codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n"); 2511 codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n");
2518 return -ENODEV; 2512 return -ENODEV;
2519 } 2513 }
2520 2514
2521 err = alloc_generic_hdmi(codec); 2515 return alloc_generic_hdmi(codec);
2516}
2517
2518/* parse and post-process for Intel codecs */
2519static int parse_intel_hdmi(struct hda_codec *codec)
2520{
2521 int err;
2522
2523 err = hdmi_parse_codec(codec);
2524 if (err < 0) {
2525 generic_spec_free(codec);
2526 return err;
2527 }
2528
2529 generic_hdmi_init_per_pins(codec);
2530 register_i915_notifier(codec);
2531 return 0;
2532}
2533
2534/* Intel Haswell and onwards; audio component with eld notifier */
2535static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
2536{
2537 struct hdmi_spec *spec;
2538 int err;
2539
2540 err = alloc_intel_hdmi(codec);
2522 if (err < 0) 2541 if (err < 0)
2523 return err; 2542 return err;
2524 spec = codec->spec; 2543 spec = codec->spec;
@@ -2542,15 +2561,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
2542 spec->ops.setup_stream = i915_hsw_setup_stream; 2561 spec->ops.setup_stream = i915_hsw_setup_stream;
2543 spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup; 2562 spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup;
2544 2563
2545 err = hdmi_parse_codec(codec); 2564 return parse_intel_hdmi(codec);
2546 if (err < 0) {
2547 generic_spec_free(codec);
2548 return err;
2549 }
2550
2551 generic_hdmi_init_per_pins(codec);
2552 register_i915_notifier(codec);
2553 return 0;
2554} 2565}
2555 2566
2556static int patch_i915_hsw_hdmi(struct hda_codec *codec) 2567static int patch_i915_hsw_hdmi(struct hda_codec *codec)
@@ -2569,13 +2580,7 @@ static int patch_i915_byt_hdmi(struct hda_codec *codec)
2569 struct hdmi_spec *spec; 2580 struct hdmi_spec *spec;
2570 int err; 2581 int err;
2571 2582
2572 /* requires i915 binding */ 2583 err = alloc_intel_hdmi(codec);
2573 if (!codec->bus->core.audio_component) {
2574 codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n");
2575 return -ENODEV;
2576 }
2577
2578 err = alloc_generic_hdmi(codec);
2579 if (err < 0) 2584 if (err < 0)
2580 return err; 2585 return err;
2581 spec = codec->spec; 2586 spec = codec->spec;
@@ -2590,49 +2595,18 @@ static int patch_i915_byt_hdmi(struct hda_codec *codec)
2590 2595
2591 spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup; 2596 spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup;
2592 2597
2593 err = hdmi_parse_codec(codec); 2598 return parse_intel_hdmi(codec);
2594 if (err < 0) {
2595 generic_spec_free(codec);
2596 return err;
2597 }
2598
2599 generic_hdmi_init_per_pins(codec);
2600 register_i915_notifier(codec);
2601 return 0;
2602} 2599}
2603 2600
2604/* Intel IronLake, SandyBridge and IvyBridge; with eld notifier */ 2601/* Intel IronLake, SandyBridge and IvyBridge; with eld notifier */
2605static int patch_i915_cpt_hdmi(struct hda_codec *codec) 2602static int patch_i915_cpt_hdmi(struct hda_codec *codec)
2606{ 2603{
2607 struct hdmi_spec *spec;
2608 int err; 2604 int err;
2609 2605
2610 /* no i915 component should have been bound before this */ 2606 err = alloc_intel_hdmi(codec);
2611 if (WARN_ON(codec->bus->core.audio_component))
2612 return -EBUSY;
2613
2614 err = alloc_generic_hdmi(codec);
2615 if (err < 0) 2607 if (err < 0)
2616 return err; 2608 return err;
2617 spec = codec->spec; 2609 return parse_intel_hdmi(codec);
2618
2619 /* Try to bind with i915 now */
2620 err = snd_hdac_i915_init(&codec->bus->core);
2621 if (err < 0)
2622 goto error;
2623 spec->i915_bound = true;
2624
2625 err = hdmi_parse_codec(codec);
2626 if (err < 0)
2627 goto error;
2628
2629 generic_hdmi_init_per_pins(codec);
2630 register_i915_notifier(codec);
2631 return 0;
2632
2633 error:
2634 generic_spec_free(codec);
2635 return err;
2636} 2610}
2637 2611
2638/* 2612/*
@@ -2782,21 +2756,21 @@ static int nvhdmi_7x_init_8ch(struct hda_codec *codec)
2782 return 0; 2756 return 0;
2783} 2757}
2784 2758
2785static unsigned int channels_2_6_8[] = { 2759static const unsigned int channels_2_6_8[] = {
2786 2, 6, 8 2760 2, 6, 8
2787}; 2761};
2788 2762
2789static unsigned int channels_2_8[] = { 2763static const unsigned int channels_2_8[] = {
2790 2, 8 2764 2, 8
2791}; 2765};
2792 2766
2793static struct snd_pcm_hw_constraint_list hw_constraints_2_6_8_channels = { 2767static const struct snd_pcm_hw_constraint_list hw_constraints_2_6_8_channels = {
2794 .count = ARRAY_SIZE(channels_2_6_8), 2768 .count = ARRAY_SIZE(channels_2_6_8),
2795 .list = channels_2_6_8, 2769 .list = channels_2_6_8,
2796 .mask = 0, 2770 .mask = 0,
2797}; 2771};
2798 2772
2799static struct snd_pcm_hw_constraint_list hw_constraints_2_8_channels = { 2773static const struct snd_pcm_hw_constraint_list hw_constraints_2_8_channels = {
2800 .count = ARRAY_SIZE(channels_2_8), 2774 .count = ARRAY_SIZE(channels_2_8),
2801 .list = channels_2_8, 2775 .list = channels_2_8,
2802 .mask = 0, 2776 .mask = 0,
@@ -2807,7 +2781,7 @@ static int simple_playback_pcm_open(struct hda_pcm_stream *hinfo,
2807 struct snd_pcm_substream *substream) 2781 struct snd_pcm_substream *substream)
2808{ 2782{
2809 struct hdmi_spec *spec = codec->spec; 2783 struct hdmi_spec *spec = codec->spec;
2810 struct snd_pcm_hw_constraint_list *hw_constraints_channels = NULL; 2784 const struct snd_pcm_hw_constraint_list *hw_constraints_channels = NULL;
2811 2785
2812 switch (codec->preset->vendor_id) { 2786 switch (codec->preset->vendor_id) {
2813 case 0x10de0002: 2787 case 0x10de0002: