ALSA: hda: Refactor display power management
The current HD-audio code manages the DRM audio power via too complex redirections, and this seems even still unbalanced in a corner case as Intel DRM CI has been intermittently reporting. This patch is a big surgery for addressing the complexity and the possible unbalance. Basically the patch changes the display PM in the following ways: - Both HD-audio controller and codec drivers call a single helper, snd_hdac_display_power(). (Formerly, the display power control from a codec was done indirectly via link_power bus ops.) - snd_hdac_display_power() receives the codec address index. For turning on/off from the controller, pass HDA_CODEC_IDX_CONTROLLER. - snd_hdac_display_power() doesn't manage refcounts any longer, but keeps the power status in bitmap. If any of controller or codecs is turned on, the function updates the DRM power state via get_power() or put_power(). Also this refactor allows us more cleanup: - The link_power bus ops is dropped, so there is no longer indirect management, as mentioned in the above. - hdac_device link_power_control flag is moved to hda_codec display_power_control flag, as it's only for HDA legacy. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106525 Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -334,7 +334,7 @@ static int skl_suspend(struct device *dev)
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
||||
ret = snd_hdac_display_power(bus, false);
|
||||
ret = snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
if (ret < 0)
|
||||
dev_err(bus->dev,
|
||||
"Cannot turn OFF display power on i915\n");
|
||||
@@ -353,7 +353,7 @@ static int skl_resume(struct device *dev)
|
||||
|
||||
/* Turned OFF in HDMI codec driver after codec reconfiguration */
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
||||
ret = snd_hdac_display_power(bus, true);
|
||||
ret = snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true);
|
||||
if (ret < 0) {
|
||||
dev_err(bus->dev,
|
||||
"Cannot turn on display power on i915\n");
|
||||
@@ -783,7 +783,7 @@ static int skl_i915_init(struct hdac_bus *bus)
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
err = snd_hdac_display_power(bus, true);
|
||||
err = snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true);
|
||||
if (err < 0)
|
||||
dev_err(bus->dev, "Cannot turn on display power on i915\n");
|
||||
|
||||
@@ -838,7 +838,7 @@ static void skl_probe_work(struct work_struct *work)
|
||||
snd_hdac_ext_bus_link_put(bus, hlink);
|
||||
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
||||
err = snd_hdac_display_power(bus, false);
|
||||
err = snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
if (err < 0) {
|
||||
dev_err(bus->dev, "Cannot turn off display power on i915\n");
|
||||
skl_machine_device_unregister(skl);
|
||||
@@ -855,7 +855,7 @@ static void skl_probe_work(struct work_struct *work)
|
||||
|
||||
out_err:
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
|
||||
err = snd_hdac_display_power(bus, false);
|
||||
err = snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Viittaa uudesa ongelmassa
Block a user