Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74b0c2d7 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

drm/i915, HD-audio: Don't continue probing when nomodeset is given



When a machine is booted with nomodeset option, i915 driver skips the
whole initialization.  Meanwhile, HD-audio tries to bind wth i915 just
by request_symbol() without knowing that the initialization was
skipped, and eventually it hits WARN_ON() in i915_request_power_well()
and i915_release_power_well() wrongly but still continues probing,
even though it doesn't work at all.

In this patch, both functions are changed to return an error in case
of uninitialized state instead of WARN_ON(), so that HD-audio driver
can give up HDMI controller initialization at the right time.

Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Cc: <stable@vger.kernel.org> [3.15]
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 7171511e
Loading
Loading
Loading
Loading
+8 −6
Original line number Original line Diff line number Diff line
@@ -6024,30 +6024,32 @@ void intel_display_power_put(struct drm_i915_private *dev_priv,
static struct i915_power_domains *hsw_pwr;
static struct i915_power_domains *hsw_pwr;


/* Display audio driver power well request */
/* Display audio driver power well request */
void i915_request_power_well(void)
int i915_request_power_well(void)
{
{
	struct drm_i915_private *dev_priv;
	struct drm_i915_private *dev_priv;


	if (WARN_ON(!hsw_pwr))
	if (!hsw_pwr)
		return;
		return -ENODEV;


	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
				power_domains);
				power_domains);
	intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
	intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
	return 0;
}
}
EXPORT_SYMBOL_GPL(i915_request_power_well);
EXPORT_SYMBOL_GPL(i915_request_power_well);


/* Display audio driver power well release */
/* Display audio driver power well release */
void i915_release_power_well(void)
int i915_release_power_well(void)
{
{
	struct drm_i915_private *dev_priv;
	struct drm_i915_private *dev_priv;


	if (WARN_ON(!hsw_pwr))
	if (!hsw_pwr)
		return;
		return -ENODEV;


	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
	dev_priv = container_of(hsw_pwr, struct drm_i915_private,
				power_domains);
				power_domains);
	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
	return 0;
}
}
EXPORT_SYMBOL_GPL(i915_release_power_well);
EXPORT_SYMBOL_GPL(i915_release_power_well);


+2 −2
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@
#define _I915_POWERWELL_H_
#define _I915_POWERWELL_H_


/* For use by hda_i915 driver */
/* For use by hda_i915 driver */
extern void i915_request_power_well(void);
extern int i915_request_power_well(void);
extern void i915_release_power_well(void);
extern int i915_release_power_well(void);


#endif				/* _I915_POWERWELL_H_ */
#endif				/* _I915_POWERWELL_H_ */
+6 −6
Original line number Original line Diff line number Diff line
@@ -22,20 +22,20 @@
#include <drm/i915_powerwell.h>
#include <drm/i915_powerwell.h>
#include "hda_i915.h"
#include "hda_i915.h"


static void (*get_power)(void);
static int (*get_power)(void);
static void (*put_power)(void);
static int (*put_power)(void);


void hda_display_power(bool enable)
int hda_display_power(bool enable)
{
{
	if (!get_power || !put_power)
	if (!get_power || !put_power)
		return;
		return -ENODEV;


	pr_debug("HDA display power %s \n",
	pr_debug("HDA display power %s \n",
			enable ? "Enable" : "Disable");
			enable ? "Enable" : "Disable");
	if (enable)
	if (enable)
		get_power();
		return get_power();
	else
	else
		put_power();
		return put_power();
}
}


int hda_i915_init(void)
int hda_i915_init(void)
+2 −2
Original line number Original line Diff line number Diff line
@@ -17,11 +17,11 @@
#define __SOUND_HDA_I915_H
#define __SOUND_HDA_I915_H


#ifdef CONFIG_SND_HDA_I915
#ifdef CONFIG_SND_HDA_I915
void hda_display_power(bool enable);
int hda_display_power(bool enable);
int hda_i915_init(void);
int hda_i915_init(void);
int hda_i915_exit(void);
int hda_i915_exit(void);
#else
#else
static inline void hda_display_power(bool enable) {}
static inline int hda_display_power(bool enable) { return 0; }
static inline int hda_i915_init(void)
static inline int hda_i915_init(void)
{
{
	return -ENODEV;
	return -ENODEV;
+6 −1
Original line number Original line Diff line number Diff line
@@ -1656,8 +1656,13 @@ static int azx_probe_continue(struct azx *chip)
				"Error request power-well from i915\n");
				"Error request power-well from i915\n");
			goto out_free;
			goto out_free;
		}
		}
		err = hda_display_power(true);
		if (err < 0) {
			dev_err(chip->card->dev,
				"Cannot turn on display power on i915\n");
			goto out_free;
		}
#endif
#endif
		hda_display_power(true);
	}
	}


	err = azx_first_init(chip);
	err = azx_first_init(chip);