drivers/gpu/drm/display/drm_hdmi_audio_helper.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/display/drm_hdmi_audio_helper.c
Extension
.c
Size
5442 bytes
Lines
196
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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

// SPDX-License-Identifier: MIT
/*
 * Copyright (c) 2024 Linaro Ltd
 */

#include <linux/export.h>
#include <linux/mutex.h>
#include <linux/of_graph.h>
#include <linux/platform_device.h>

#include <drm/drm_connector.h>
#include <drm/drm_device.h>
#include <drm/display/drm_hdmi_audio_helper.h>

#include <sound/hdmi-codec.h>

static int drm_connector_hdmi_audio_startup(struct device *dev, void *data)
{
	struct drm_connector *connector = data;
	const struct drm_connector_hdmi_audio_funcs *funcs =
		connector->hdmi_audio.funcs;

	if (funcs->startup)
		return funcs->startup(connector);

	return 0;
}

static int drm_connector_hdmi_audio_prepare(struct device *dev, void *data,
					    struct hdmi_codec_daifmt *fmt,
					    struct hdmi_codec_params *hparms)
{
	struct drm_connector *connector = data;
	const struct drm_connector_hdmi_audio_funcs *funcs =
		connector->hdmi_audio.funcs;

	return funcs->prepare(connector, fmt, hparms);
}

static void drm_connector_hdmi_audio_shutdown(struct device *dev, void *data)
{
	struct drm_connector *connector = data;
	const struct drm_connector_hdmi_audio_funcs *funcs =
		connector->hdmi_audio.funcs;

	return funcs->shutdown(connector);
}

static int drm_connector_hdmi_audio_mute_stream(struct device *dev, void *data,
						bool enable, int direction)
{
	struct drm_connector *connector = data;
	const struct drm_connector_hdmi_audio_funcs *funcs =
		connector->hdmi_audio.funcs;

	if (funcs->mute_stream)
		return funcs->mute_stream(connector, enable, direction);

	return -ENOTSUPP;
}

static int drm_connector_hdmi_audio_get_dai_id(struct snd_soc_component *comment,
					       struct device_node *endpoint,
					       void *data)
{
	struct drm_connector *connector = data;
	struct of_endpoint of_ep;
	int ret;

	if (connector->hdmi_audio.dai_port < 0)
		return -ENOTSUPP;

	ret = of_graph_parse_endpoint(endpoint, &of_ep);
	if (ret < 0)
		return ret;

	if (of_ep.port == connector->hdmi_audio.dai_port)
		return 0;

	return -EINVAL;
}

static int drm_connector_hdmi_audio_get_eld(struct device *dev, void *data,
					    uint8_t *buf, size_t len)
{
	struct drm_connector *connector = data;

	mutex_lock(&connector->eld_mutex);
	memcpy(buf, connector->eld, min(sizeof(connector->eld), len));
	mutex_unlock(&connector->eld_mutex);

Annotation

Implementation Notes