drivers/staging/greybus/audio_codec.c
Source file repositories/reference/linux-study-clean/drivers/staging/greybus/audio_codec.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/staging/greybus/audio_codec.c- Extension
.c- Size
- 29055 bytes
- Lines
- 1101
- Domain
- Driver Families
- Bucket
- drivers/staging
- 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.
- 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/module.hlinux/pm_runtime.hsound/soc.hsound/pcm_params.huapi/linux/input.haudio_codec.haudio_apbridgea.haudio_manager.haudio_helper.h
Detected Declarations
function find_datafunction list_for_each_entryfunction find_dai_stream_paramsfunction list_for_each_entryfunction gbaudio_module_enable_txfunction gbaudio_module_disable_txfunction gbaudio_module_enable_rxfunction gbaudio_module_disable_rxfunction gbaudio_module_updatefunction gbcodec_startupfunction gbcodec_shutdownfunction gbcodec_hw_paramsfunction gbcodec_preparefunction list_for_each_entryfunction gbcodec_mute_streamfunction list_for_each_entryfunction gbaudio_init_jackfunction gbaudio_register_modulefunction list_for_each_entryfunction gbaudio_codec_clean_data_txfunction gbaudio_codec_clean_data_rxfunction gbaudio_codec_cleanupfunction gbaudio_unregister_modulefunction gbcodec_probefunction gbcodec_writefunction gbcodec_readfunction gbaudio_codec_suspendfunction gbaudio_codec_resumefunction gbaudio_codec_probeexport gbaudio_module_updateexport gbaudio_register_moduleexport gbaudio_unregister_module
Annotated Snippet
if (ret) {
dev_err_ratelimited(module->dev, "reg_cport failed:%d\n", ret);
return ret;
}
data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_STARTUP;
dev_dbg(module->dev, "Dynamic Register %d DAI\n", cportid);
}
/* hw_params */
if (module_state < GBAUDIO_CODEC_HWPARAMS) {
format = params->format;
channels = params->channels;
rate = params->rate;
sig_bits = params->sig_bits;
data_cport = data->connection->intf_cport_id;
ret = gb_audio_gb_set_pcm(module->mgmt_connection, data_cport,
format, rate, channels, sig_bits);
if (ret) {
dev_err_ratelimited(module->dev, "set_pcm failed:%d\n", ret);
return ret;
}
data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_HWPARAMS;
dev_dbg(module->dev, "Dynamic hw_params %d DAI\n", data_cport);
}
/* prepare */
if (module_state < GBAUDIO_CODEC_PREPARE) {
data_cport = data->connection->intf_cport_id;
ret = gb_audio_gb_set_tx_data_size(module->mgmt_connection,
data_cport, 192);
if (ret) {
dev_err_ratelimited(module->dev,
"set_tx_data_size failed:%d\n",
ret);
return ret;
}
ret = gb_audio_gb_activate_tx(module->mgmt_connection, data_cport);
if (ret) {
dev_err_ratelimited(module->dev,
"activate_tx failed:%d\n", ret);
return ret;
}
data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_PREPARE;
dev_dbg(module->dev, "Dynamic prepare %d DAI\n", data_cport);
}
return 0;
}
static int gbaudio_module_disable_tx(struct gbaudio_module_info *module, int id)
{
int ret;
u16 data_cport, cportid, i2s_port;
int module_state;
struct gbaudio_data_connection *data;
/* find the dai */
data = find_data(module, id);
if (!data) {
dev_err(module->dev, "%d:DATA connection missing\n", id);
return -ENODEV;
}
module_state = data->state[SNDRV_PCM_STREAM_PLAYBACK];
if (module_state > GBAUDIO_CODEC_HWPARAMS) {
data_cport = data->connection->intf_cport_id;
ret = gb_audio_gb_deactivate_tx(module->mgmt_connection,
data_cport);
if (ret) {
dev_err_ratelimited(module->dev,
"deactivate_tx failed:%d\n", ret);
return ret;
}
dev_dbg(module->dev, "Dynamic deactivate %d DAI\n", data_cport);
data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_HWPARAMS;
}
if (module_state > GBAUDIO_CODEC_SHUTDOWN) {
i2s_port = 0; /* fixed for now */
cportid = data->connection->hd_cport_id;
ret = gb_audio_apbridgea_unregister_cport(data->connection,
i2s_port, cportid,
AUDIO_APBRIDGEA_DIRECTION_TX);
if (ret) {
dev_err_ratelimited(module->dev,
"unregister_cport failed:%d\n", ret);
return ret;
}
dev_dbg(module->dev, "Dynamic Unregister %d DAI\n", cportid);
data->state[SNDRV_PCM_STREAM_PLAYBACK] = GBAUDIO_CODEC_SHUTDOWN;
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/pm_runtime.h`, `sound/soc.h`, `sound/pcm_params.h`, `uapi/linux/input.h`, `audio_codec.h`, `audio_apbridgea.h`.
- Detected declarations: `function find_data`, `function list_for_each_entry`, `function find_dai_stream_params`, `function list_for_each_entry`, `function gbaudio_module_enable_tx`, `function gbaudio_module_disable_tx`, `function gbaudio_module_enable_rx`, `function gbaudio_module_disable_rx`, `function gbaudio_module_update`, `function gbcodec_startup`.
- Atlas domain: Driver Families / drivers/staging.
- Implementation status: integration 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.