drivers/gpu/drm/i915/display/intel_lpe_audio.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/i915/display/intel_lpe_audio.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/i915/display/intel_lpe_audio.c
Extension
.c
Size
10607 bytes
Lines
368
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!pci_dev_present(atom_hdaudio_ids)) {
			drm_info(display->drm,
				 "HDaudio controller not detected, using LPE audio instead\n");
			lpe_present = true;
		}
	}
	return lpe_present;
}

static int lpe_audio_setup(struct intel_display *display)
{
	int ret;

	display->audio.lpe.irq = irq_alloc_desc(0);
	if (display->audio.lpe.irq < 0) {
		drm_err(display->drm, "Failed to allocate IRQ desc: %d\n",
			display->audio.lpe.irq);
		ret = display->audio.lpe.irq;
		goto err;
	}

	drm_dbg(display->drm, "irq = %d\n", display->audio.lpe.irq);

	ret = lpe_audio_irq_init(display);

	if (ret) {
		drm_err(display->drm,
			"Failed to initialize irqchip for lpe audio: %d\n",
			ret);
		goto err_free_irq;
	}

	display->audio.lpe.platdev = lpe_audio_platdev_create(display);

	if (IS_ERR(display->audio.lpe.platdev)) {
		ret = PTR_ERR(display->audio.lpe.platdev);
		drm_err(display->drm,
			"Failed to create lpe audio platform device: %d\n",
			ret);
		goto err_free_irq;
	}

	/* enable chicken bit; at least this is required for Dell Wyse 3040
	 * with DP outputs (but only sometimes by some reason!)
	 */
	intel_de_write(display, VLV_AUD_CHICKEN_BIT_REG,
		       VLV_CHICKEN_BIT_DBG_ENABLE);

	return 0;
err_free_irq:
	irq_free_desc(display->audio.lpe.irq);
err:
	display->audio.lpe.irq = -1;
	display->audio.lpe.platdev = NULL;
	return ret;
}

/**
 * intel_lpe_audio_irq_handler() - forwards the LPE audio irq
 * @display: display device
 *
 * the LPE Audio irq is forwarded to the irq handler registered by LPE audio
 * driver.
 */
void intel_lpe_audio_irq_handler(struct intel_display *display)
{
	int ret;

	if (!HAS_LPE_AUDIO(display))
		return;

	ret = generic_handle_irq(display->audio.lpe.irq);
	if (ret)
		drm_err_ratelimited(display->drm,
				    "error handling LPE audio irq: %d\n", ret);
}

/**
 * intel_lpe_audio_init() - detect and setup the bridge between HDMI LPE Audio
 * driver and i915
 * @display: display device
 *
 * Return: 0 if successful. non-zero if detection or
 * llocation/initialization fails
 */
int intel_lpe_audio_init(struct intel_display *display)
{
	int ret = -ENODEV;

	if (lpe_audio_detect(display)) {

Annotation

Implementation Notes