drivers/gpu/drm/radeon/radeon_audio.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/radeon/radeon_audio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/radeon/radeon_audio.c- Extension
.c- Size
- 26281 bytes
- Lines
- 849
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/gcd.hlinux/component.hdrm/drm_crtc.hdrm/drm_eld.hdrm/drm_edid.hdce6_afmt.hevergreen_hdmi.hradeon.hatom.hr600.hradeon_audio.h
Detected Declarations
function radeon_audio_rregfunction radeon_audio_wregfunction radeon_audio_enablefunction radeon_audio_interface_initfunction radeon_audio_chipset_supportedfunction radeon_audio_initfunction radeon_audio_endpoint_rregfunction radeon_audio_endpoint_wregfunction radeon_audio_write_sad_regsfunction radeon_audio_write_speaker_allocationfunction radeon_audio_write_latency_fieldsfunction radeon_audio_select_pinfunction radeon_audio_detectfunction radeon_audio_finifunction radeon_audio_set_dtofunction radeon_audio_set_avi_packetfunction radeon_audio_calc_ctsfunction radeon_audio_update_acrfunction radeon_audio_set_vbi_packetfunction radeon_hdmi_set_color_depthfunction radeon_audio_set_audio_packetfunction radeon_audio_set_mutefunction radeon_audio_hdmi_mode_setfunction radeon_audio_dp_mode_setfunction radeon_audio_mode_setfunction radeon_audio_dpmsfunction radeon_audio_decode_dfs_divfunction radeon_audio_component_notifyfunction radeon_audio_component_get_eldfunction list_for_each_entryfunction radeon_audio_component_bindfunction radeon_audio_component_unbindfunction radeon_audio_component_initfunction radeon_audio_component_fini
Annotated Snippet
list_for_each_entry(encoder, &rdev_to_drm(rdev)->mode_config.encoder_list, head) {
if (radeon_encoder_is_digital(encoder)) {
radeon_encoder = to_radeon_encoder(encoder);
dig = radeon_encoder->enc_priv;
if (dig->pin == pin)
pin_count++;
}
}
if ((pin_count > 1) && (enable_mask == 0))
return;
}
if (rdev->audio.funcs->enable)
rdev->audio.funcs->enable(rdev, pin, enable_mask);
radeon_audio_component_notify(rdev, pin->id);
}
static void radeon_audio_interface_init(struct radeon_device *rdev)
{
if (ASIC_IS_DCE6(rdev)) {
rdev->audio.funcs = &dce6_funcs;
rdev->audio.hdmi_funcs = &dce6_hdmi_funcs;
rdev->audio.dp_funcs = &dce6_dp_funcs;
} else if (ASIC_IS_DCE4(rdev)) {
rdev->audio.funcs = &dce4_funcs;
rdev->audio.hdmi_funcs = &dce4_hdmi_funcs;
rdev->audio.dp_funcs = &dce4_dp_funcs;
} else if (ASIC_IS_DCE32(rdev)) {
rdev->audio.funcs = &dce32_funcs;
rdev->audio.hdmi_funcs = &dce32_hdmi_funcs;
rdev->audio.dp_funcs = &dce32_dp_funcs;
} else {
rdev->audio.funcs = &r600_funcs;
rdev->audio.hdmi_funcs = &r600_hdmi_funcs;
rdev->audio.dp_funcs = NULL;
}
}
static int radeon_audio_chipset_supported(struct radeon_device *rdev)
{
return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev);
}
int radeon_audio_init(struct radeon_device *rdev)
{
int i;
if (!radeon_audio || !radeon_audio_chipset_supported(rdev))
return 0;
rdev->audio.enabled = true;
if (ASIC_IS_DCE83(rdev)) /* KB: 2 streams, 3 endpoints */
rdev->audio.num_pins = 3;
else if (ASIC_IS_DCE81(rdev)) /* KV: 4 streams, 7 endpoints */
rdev->audio.num_pins = 7;
else if (ASIC_IS_DCE8(rdev)) /* BN/HW: 6 streams, 7 endpoints */
rdev->audio.num_pins = 7;
else if (ASIC_IS_DCE64(rdev)) /* OL: 2 streams, 2 endpoints */
rdev->audio.num_pins = 2;
else if (ASIC_IS_DCE61(rdev)) /* TN: 4 streams, 6 endpoints */
rdev->audio.num_pins = 6;
else if (ASIC_IS_DCE6(rdev)) /* SI: 6 streams, 6 endpoints */
rdev->audio.num_pins = 6;
else
rdev->audio.num_pins = 1;
for (i = 0; i < rdev->audio.num_pins; i++) {
rdev->audio.pin[i].channels = -1;
rdev->audio.pin[i].rate = -1;
rdev->audio.pin[i].bits_per_sample = -1;
rdev->audio.pin[i].status_bits = 0;
rdev->audio.pin[i].category_code = 0;
rdev->audio.pin[i].connected = false;
rdev->audio.pin[i].offset = pin_offsets[i];
rdev->audio.pin[i].id = i;
}
radeon_audio_interface_init(rdev);
/* disable audio. it will be set up later */
for (i = 0; i < rdev->audio.num_pins; i++)
radeon_audio_enable(rdev, &rdev->audio.pin[i], 0);
return 0;
}
u32 radeon_audio_endpoint_rreg(struct radeon_device *rdev, u32 offset, u32 reg)
Annotation
- Immediate include surface: `linux/gcd.h`, `linux/component.h`, `drm/drm_crtc.h`, `drm/drm_eld.h`, `drm/drm_edid.h`, `dce6_afmt.h`, `evergreen_hdmi.h`, `radeon.h`.
- Detected declarations: `function radeon_audio_rreg`, `function radeon_audio_wreg`, `function radeon_audio_enable`, `function radeon_audio_interface_init`, `function radeon_audio_chipset_supported`, `function radeon_audio_init`, `function radeon_audio_endpoint_rreg`, `function radeon_audio_endpoint_wreg`, `function radeon_audio_write_sad_regs`, `function radeon_audio_write_speaker_allocation`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.