1. 28 3月, 2016 7 次提交
    • T
      ALSA: hda - Enable i915 ELD notifier for Intel IronLake and Baytrail · 7ff652ff
      Takashi Iwai 提交于
      Since we have the fixed pin-port mapping for Intel IronLake (IbexPeak)
      and Baytrail (ValleyView) platforms in the code side, now it's time to
      add the support in the codec driver side.  This patch simply enables
      the i915 ELD notifier for these in addition with the fix of the
      mapping from the port to NID in the callback.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      7ff652ff
    • T
      ALSA: hda - Add the pin / port mapping on Intel ILK and VLV · d745f5e7
      Takashi Iwai 提交于
      Intel IronLake and ValleyView platforms have different HDMI widget pin
      and digital port mapping from other newer ones.  The recent ones
      (HSW+) have NID 0x05 to 0x07 for port B to port D, while these chips
      have NID 0x04 to 0x06.
      
      For adapting this mapping, pass the codec object instead of the bus
      object to snd_hdac_sync_audio_rate() and snd_hdac_acomp_get_eld() so
      that they can check the codec ID and calculate the mapping properly.
      
      The changes in the HDMI codec driver side will follow in the later
      patch.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      d745f5e7
    • T
      ALSA: hda - Use eld notifier for Intel SandyBridge and IvyBridge HDMI/DP · e85015a3
      Takashi Iwai 提交于
      Intel SandyBridge and IvyBridge (CougarPoint and PantherPoint
      platforms) have also the same digital port vs audio widget mapping
      (from port B = NID 0x05 to port D = NID 0x07) as Haswell & co.
      So, we can reuse the existing functions for HSW+ for these platforms
      without changing there, but just by re-adding the on-demand i915
      binding in HDMI codec driver.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      e85015a3
    • T
      ALSA: hda - Introduce pin_cvt_fixup() ops to hdmi parser · 4846a67e
      Takashi Iwai 提交于
      For reducing the splat of is_haswell_plus() or such macros, this patch
      introduces pin_cvt_fixup() ops to hdmi_spec.  For HSW+ and VLV+
      codecs, set this ops so that the driver can call the Intel-specific
      workarounds appropriately.
      
      A gratis bonus that we can remove the mux_id argument from
      hdmi_choose_cvt(), too, since the fixup function always refers the
      mux_idx from the given per_pin object.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      4846a67e
    • T
      ALSA: hda - Override HDMI setup_stream ops for Intel HSW+ · 2c1c9b86
      Takashi Iwai 提交于
      Instead of checking at each time with is_haswell_plus() macro,
      override the setup_stream ops itself for HSW+ chips.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      2c1c9b86
    • T
      ALSA: hda - Apply AMP fix in hdmi_setup_audio_infoframe() generically · 44bb6d0c
      Takashi Iwai 提交于
      The need for reprogramming the AMP mute bit at each audio info frame
      setup isn't always specific to Intel chips.  It's safer to set it
      generically for all codecs with the amp bit, as this verb execution
      itself isn't too much load.  This eliminates one usage of
      is_haswell_plus() macro, after all.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      44bb6d0c
    • T
      ALSA: hda - Split out Intel-specific codes from patch_generic_hdmi() · a686632f
      Takashi Iwai 提交于
      We have too many Intel-specific codes in patch_hdmi_generic() despite
      its function name.  And this makes it difficult to adjust per chipset,
      e.g. for allowing the audio notifier on an old chipset, one would need
      to add an explicit if() check.
      
      This patch attempts some code refactoring and cleanups in this regard;
      the Intel-specific codes are moved out of patch_generic_hdmi() into
      the new functions, patch_i915_hsw_hdmi() and patch_i915_byt_hdmi(),
      depending on the chipset.  The other old Intel chipsets keep using
      patch_generic_hdmi() without Intel hacks.  The existing
      patch_generic_hdmi() is also split to a few components so that they
      can be called from the Intel codec parsers.
      
      There are still many is_haswell*() and is_valleyview*() macro usages
      in the code.  They will be cleaned up later.  For the time being, only
      the entry are concerned.
      
      Along with this change, the i915_bound flag and the on-demand i915
      component binding have been removed as a cleanup, since there is no
      user at this moment.  This will be added back later once when Cougar
      Point and else start using the i915 eld notifier.
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      a686632f
  2. 23 3月, 2016 3 次提交
  3. 21 3月, 2016 1 次提交
  4. 20 3月, 2016 1 次提交
    • T
      ALSA: hda - Workaround for unbalanced i915 power refcount by concurrent probe · 7169701a
      Takashi Iwai 提交于
      The recent addition of on-demand i915 audio component binding in the
      codec driver seems leading to the unbalanced i915 power refcount,
      according to Intel CI tests.  Typically, it gets a kernel WARNING
      like:
        WARNING: CPU: 3 PID: 173 at sound/hda/hdac_i915.c:91 snd_hdac_display_power+0xf1/0x110 [snd_hda_core]()
        Call Trace:
         [<ffffffff813fef15>] dump_stack+0x67/0x92
         [<ffffffff81078a21>] warn_slowpath_common+0x81/0xc0
         [<ffffffff81078b15>] warn_slowpath_null+0x15/0x20
         [<ffffffffa00f77e1>] snd_hdac_display_power+0xf1/0x110 [snd_hda_core]
         [<ffffffffa015039d>] azx_intel_link_power+0xd/0x10 [snd_hda_intel]
         [<ffffffffa011e32a>] azx_link_power+0x1a/0x30 [snd_hda_codec]
         [<ffffffffa00f21f9>] snd_hdac_link_power+0x29/0x40 [snd_hda_core]
         [<ffffffffa01192a6>] hda_codec_runtime_suspend+0x76/0xa0 [snd_hda_codec]
         .....
      
      The scenario is like below:
      - HD-audio driver and i915 driver are probed concurrently at the
        (almost) same time; HDA bus tries to bind with i915, but it fails
        because i915 initialization is still being processed.
      - Later on, HD-audio probes the HDMI codec, where it again tries to
        bind with i915.  At this time, it succeeds.
      - At finishing the probe of HDA, it decreases the refcount as if it
        were already bound at the bus probe, since the component is bound
        now.  This triggers a kernel WARNING due to the unbalance.
      
      As a workaround, in this patch, we just disable the on-demand i915
      component binding in the codec driver.  This essentially reverts back
      to the state of 4.4 kernel.
      
      We know that this is no real solution, but it's a minimalistic simple
      change that can be applied to 4.5.x kernel as stable.
      
      Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94566Reported-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Cc: <stable@vger.kernel.org> # v4.5
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      7169701a
  5. 19 3月, 2016 2 次提交
  6. 18 3月, 2016 1 次提交
    • T
      ALSA: hda - Really restrict i915 notifier to HSW+ · 691be973
      Takashi Iwai 提交于
      The commit [b62232d4: ALSA: hda - Limit i915 HDMI binding only for
      HSW and later] tried to limit the usage of i915 audio notifier to the
      recent Intel models and switch to the old method on pre-Haswell
      models.  However, it assumed that the i915 component binding hasn't
      been done on such models, and the assumption was wrong: namely,
      Baytrail had already the i915 component binding due to powerwell
      control.  Thus, the workaround wasn't applied to Baytrail.
      
      For fixing this properly, this patch introduces a new flag indicating
      the usage of audio notifier and codec_has_acomp() refers to this flag
      instead of checking the existence of audio component.
      Reported-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Cc: <stable@vger.kernel.org> # v4.5
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      691be973
  7. 17 3月, 2016 1 次提交
    • T
      ALSA: hda - Fix mutex deadlock at HDMI/DP hotplug · 222bde03
      Takashi Iwai 提交于
      The recent change in HD-audio HDMI/DP codec driver for allowing the
      dynamic PCM binding introduced a new spec->pcm_mutex.  One of the
      protected area by this mutex is hdmi_present_sense().  As reported by
      Intel CI tests, unfortunately, the new mutex causes a deadlock when
      the hotplug/unplug is triggered during the codec is in runtime
      suspend.  The buggy code path is like the following:
      
        hdmi_unsol_event() -> ...
          -> hdmi_present_sense()
      ==>     ** here taking pcm_mutex
            -> hdmi_present_sense_via_verbs()
              -> snd_hda_power_up_pm() -> ... (runtime resume calls)
                -> generic_hdmi_resume()
                  -> hdmi_present_sense()
      ==>           ** here taking pcm_mutex again!
      
      As we can see here, the problem is that the mutex is taken before
      snd_hda_power_up_pm() call that triggers the runtime resume.  That is,
      the obvious solution is to move the power up/down call outside the
      mutex; it is exactly what this patch provides.
      
      The patch also clarifies why this bug wasn't caught beforehand.  We
      used to have the i915 audio component for hotplug for all Intel chips,
      and in that code path, there is no power up required but the
      information is taken directly from the graphics side.  However, we
      recently switched back to the old method for some old Intel chips due
      to regressions, and now the deadlock issue is surfaced.
      
      Fixes: a76056f2 ('ALSA: hda - hdmi dynamically bind PCM to pin when monitor hotplug')
      Reported-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Tested-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      222bde03
  8. 16 3月, 2016 1 次提交
  9. 15 3月, 2016 1 次提交
    • T
      ALSA: hda - Fix unconditional GPIO toggle via automute · 1f7c6658
      Takashi Iwai 提交于
      Cirrus HD-audio driver may adjust GPIO pins for EAPD dynamically
      depending on the jack plug state.  This works fine for the auto-mute
      mode where the speaker gets muted upon the HP jack plug.   OTOH, when
      the auto-mute mode is off, this turns off the EAPD unexpectedly
      depending on the jack state, which results in the silent speaker
      output.
      
      This patch fixes the silent speaker output issue by setting GPIO bits
      constantly when the auto-mute mode is off.
      
      Reported-and-tested-by: moosotc@gmail.com
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      1f7c6658
  10. 14 3月, 2016 2 次提交
  11. 11 3月, 2016 1 次提交
  12. 10 3月, 2016 2 次提交
  13. 07 3月, 2016 7 次提交
  14. 04 3月, 2016 2 次提交
  15. 03 3月, 2016 1 次提交
  16. 01 3月, 2016 1 次提交
  17. 27 2月, 2016 1 次提交
    • V
      ALSA: hda - Autosuspend controller after probe even if codecs are already suspended · 30ff5957
      Ville Syrjälä 提交于
      azx_probe_continue() uses pm_runtime_put_noidle() to drop the rpm
      usage_count, which means that if it's the last reference the
      autosuspend of the controller won't actually happen. So if the codecs
      autosuspend before the azx_probe_continue() drops the last
      reference we'll fail to autosuspend the controller. This does happen
      in practice, but not every time. As can be seen in [1] the controller
      autosuspend attempt fails due to the usage_count when suspending the
      codecs. A bit later we see the the contoller usage_count dropping to
      zero without further attempts at autosuspend.
      
      Fix the problem by using pm_runtime_put_autosuspend() instead, which
      will kick off the autosuspend of the controller even if the codecs
      are already asleep. As can be seen in [2] the controller autosuspend
      still fails while suspending the codecs, but later on we see another
      autosuspend attempt after dropping the usage_count to 0.
      
      I was also a bit worried that there might still be a race between the
      controller autosuspend and the rest of the code in azx_probe_continue().
      So I also tried replacing the the put_noidle() with put_sync_suspend().
      No explosions occurred, so I'm somewhat satisfied that there are no
      serious problems in this area.
      
      [1]
       kworker/1:2-122   [001] ....    63.661310: __pm_runtime_suspend: hdaudioC0D0 usage_count 0
       kworker/1:2-122   [001] d..2    63.661316: rpm_suspend: hdaudioC0D0 flags-d cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/1:2-122   [001] d..1    63.661317: rpm_check_suspend_allowed: hdaudioC0D0 retval 0
       kworker/1:2-122   [001] d..2    63.661332: rpm_return_int: rpm_suspend+0x406/0x5e8:hdaudioC0D0 ret=0
       kworker/1:1-72    [001] d..2    63.661543: rpm_suspend: hdaudioC0D0 flags-a cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/1:1-72    [001] d..1    63.661544: rpm_check_suspend_allowed: hdaudioC0D0 retval 0
       kworker/1:1-72    [001] ....    63.661545: hda_codec_runtime_suspend: hdaudioC0D0 suspend
       kworker/1:1-72    [001] d..2    63.661614: rpm_idle: 0000:00:03.0 flags-1 cnt-1  dep-0  auto-1 p-0 irq-0 child-0
       kworker/1:1-72    [001] d..1    63.661615: rpm_check_suspend_allowed: 0000:00:03.0 usage_count 1
       kworker/1:1-72    [001] d..1    63.661615: rpm_check_suspend_allowed: 0000:00:03.0 retval -11
       kworker/1:1-72    [001] d..2    63.661616: rpm_return_int: rpm_idle+0x249/0x487:0000:00:03.0 ret=-11
       kworker/1:1-72    [001] d..2    63.661616: rpm_return_int: rpm_suspend+0x406/0x5e8:hdaudioC0D0 ret=0
       kworker/1:2-122   [001] d..2    63.664834: rpm_idle: hdaudioC0D0 flags-8 cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/1:2-122   [001] d..1    63.664835: rpm_check_suspend_allowed: hdaudioC0D0 retval 1
       kworker/1:2-122   [001] d..2    63.664836: rpm_return_int: rpm_idle+0x249/0x487:hdaudioC0D0 ret=-11
       kworker/1:2-122   [001] d..2    63.664841: rpm_idle: hdaudioC0D0 flags-8 cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/1:2-122   [001] d..1    63.664841: rpm_check_suspend_allowed: hdaudioC0D0 retval 1
       kworker/1:2-122   [001] d..2    63.664841: rpm_return_int: rpm_idle+0x249/0x487:hdaudioC0D0 ret=-11
       kworker/1:2-122   [001] ....    63.664842: azx_probe_continue: 0000:00:03.0 usage_count=0
      
      [2]
       kworker/0:0-4     [000] ....    50.354567: __pm_runtime_suspend: hdaudioC0D0 usage_count 0
       kworker/0:0-4     [000] d..2    50.354574: rpm_suspend: hdaudioC0D0 flags-d cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:0-4     [000] d..1    50.354575: rpm_check_suspend_allowed: hdaudioC0D0 retval 0
       kworker/0:0-4     [000] d..2    50.354589: rpm_return_int: rpm_suspend+0x406/0x5e8:hdaudioC0D0 ret=0
       kworker/0:2-135   [000] d..2    50.354809: rpm_suspend: hdaudioC0D0 flags-a cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:2-135   [000] d..1    50.354810: rpm_check_suspend_allowed: hdaudioC0D0 retval 0
       kworker/0:2-135   [000] ....    50.354816: hda_codec_runtime_suspend: hdaudioC0D0 suspend
       kworker/0:2-135   [000] d..2    50.354908: rpm_idle: 0000:00:03.0 flags-1 cnt-1  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:2-135   [000] d..1    50.354909: rpm_check_suspend_allowed: 0000:00:03.0 usage_count 1
       kworker/0:2-135   [000] d..1    50.354909: rpm_check_suspend_allowed: 0000:00:03.0 retval -11
       kworker/0:2-135   [000] d..2    50.354909: rpm_return_int: rpm_idle+0x249/0x487:0000:00:03.0 ret=-11
       kworker/0:2-135   [000] d..2    50.354910: rpm_return_int: rpm_suspend+0x406/0x5e8:hdaudioC0D0 ret=0
       kworker/0:0-4     [000] d..2    50.373791: rpm_idle: hdaudioC0D0 flags-8 cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:0-4     [000] d..1    50.373792: rpm_check_suspend_allowed: hdaudioC0D0 retval 1
       kworker/0:0-4     [000] d..2    50.373793: rpm_return_int: rpm_idle+0x249/0x487:hdaudioC0D0 ret=-11
       kworker/0:0-4     [000] d..2    50.373797: rpm_idle: hdaudioC0D0 flags-8 cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:0-4     [000] d..1    50.373798: rpm_check_suspend_allowed: hdaudioC0D0 retval 1
       kworker/0:0-4     [000] d..2    50.373798: rpm_return_int: rpm_idle+0x249/0x487:hdaudioC0D0 ret=-11
       kworker/0:0-4     [000] ....    50.373799: __pm_runtime_suspend: 0000:00:03.0 usage_count 0
       kworker/0:0-4     [000] d..2    50.373800: rpm_suspend: 0000:00:03.0 flags-d cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:0-4     [000] d..1    50.373800: rpm_check_suspend_allowed: 0000:00:03.0 retval 0
       kworker/0:0-4     [000] d..2    50.373803: rpm_return_int: rpm_suspend+0x406/0x5e8:0000:00:03.0 ret=0
       kworker/0:0-4     [000] d..2    50.385164: rpm_suspend: 0000:00:03.0 flags-a cnt-0  dep-0  auto-1 p-0 irq-0 child-0
       kworker/0:0-4     [000] d..1    50.385165: rpm_check_suspend_allowed: 0000:00:03.0 retval 0
       kworker/0:0-4     [000] ....    50.385174: azx_runtime_suspend: 0000:00:03.0 azx suspend releaseing power well
       kworker/0:0-4     [000] ....    50.385179: azx_runtime_suspend: 0000:00:03.0 azx suspend
       kworker/0:0-4     [000] d..2    50.386872: rpm_return_int: rpm_suspend+0x406/0x5e8:0000:00:03.0 ret=0
      Signed-off-by: NVille Syrjälä <ville.syrjala@linux.intel.com>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      30ff5957
  18. 26 2月, 2016 1 次提交
    • T
      ALSA: hda - Loop interrupt handling until really cleared · 473f4145
      Takashi Iwai 提交于
      Currently the interrupt handler of HD-audio driver assumes that no irq
      update is needed while processing the irq.  But in reality, it has
      been confirmed that the HW irq is issued even during the irq
      handling.  Since we clear the irq status at the beginning, process the
      interrupt, then exits from the handler, the lately issued interrupt is
      left untouched without being properly processed.
      
      This patch changes the interrupt handler code to loop over the
      check-and-process.  The handler tries repeatedly as long as the IRQ
      status are turned on, and either stream or CORB/RIRB is handled.
      
      For checking the stream handling, snd_hdac_bus_handle_stream_irq()
      returns a value indicating the stream indices bits.  Other than that,
      the change is only in the irq handler itself.
      Reported-by: NLibin Yang <libin.yang@linux.intel.com>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NTakashi Iwai <tiwai@suse.de>
      473f4145
  19. 25 2月, 2016 3 次提交
  20. 23 2月, 2016 1 次提交