drivers/staging/greybus/audio_topology.c
Source file repositories/reference/linux-study-clean/drivers/staging/greybus/audio_topology.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/staging/greybus/audio_topology.c- Extension
.c- Size
- 39647 bytes
- Lines
- 1444
- Domain
- Driver Families
- Bucket
- drivers/staging
- 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.
- 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/greybus.haudio_codec.h
Detected Declarations
struct gbaudio_ctl_pvtfunction list_for_each_entryfunction gbaudio_map_controlnamefunction list_for_each_entryfunction gbaudio_map_wcontrolnamefunction list_for_each_entryfunction gbaudio_map_widgetnamefunction list_for_each_entryfunction list_for_each_entryfunction gbcodec_mixer_ctl_infofunction gbcodec_mixer_ctl_getfunction gbcodec_mixer_ctl_putfunction gbcodec_mixer_dapm_ctl_infofunction gbcodec_mixer_dapm_ctl_getfunction gbcodec_mixer_dapm_ctl_putfunction gbcodec_event_spkfunction gbcodec_event_hpfunction gbcodec_event_int_micfunction gbaudio_validate_kcontrol_countfunction gbcodec_enum_ctl_getfunction gbcodec_enum_ctl_putfunction gbaudio_tplg_create_enum_kctlfunction gbaudio_tplg_create_kcontrolfunction gbcodec_enum_dapm_ctl_getfunction gbcodec_enum_dapm_ctl_putfunction gbaudio_tplg_create_enum_ctlfunction gbaudio_tplg_create_mixer_ctlfunction gbaudio_tplg_create_wcontrolfunction gbaudio_widget_eventfunction gbaudio_tplg_create_widgetfunction gbaudio_tplg_process_kcontrolsfunction gbaudio_tplg_process_widgetsfunction gbaudio_tplg_process_routesfunction gbaudio_tplg_process_headerfunction gbaudio_tplg_parse_datafunction gbaudio_tplg_release
Annotated Snippet
struct gbaudio_ctl_pvt {
unsigned int ctl_id;
unsigned int data_cport;
unsigned int access;
unsigned int vcount;
struct gb_audio_ctl_elem_info *info;
};
static struct gbaudio_module_info *find_gb_module(struct gbaudio_codec_info *codec,
char const *name)
{
int dev_id;
char begin[NAME_SIZE];
struct gbaudio_module_info *module;
if (!name)
return NULL;
if (sscanf(name, "%s %d", begin, &dev_id) != 2)
return NULL;
dev_dbg(codec->dev, "%s:Find module#%d\n", __func__, dev_id);
mutex_lock(&codec->lock);
list_for_each_entry(module, &codec->module_list, list) {
if (module->dev_id == dev_id) {
mutex_unlock(&codec->lock);
return module;
}
}
mutex_unlock(&codec->lock);
dev_warn(codec->dev, "%s: module#%d missing in codec list\n", name,
dev_id);
return NULL;
}
static const char *gbaudio_map_controlid(struct gbaudio_module_info *module,
__u8 control_id, __u8 index)
{
struct gbaudio_control *control;
if (control_id == GBAUDIO_INVALID_ID)
return NULL;
list_for_each_entry(control, &module->ctl_list, list) {
if (control->id == control_id) {
if (index == GBAUDIO_INVALID_ID)
return control->name;
if (index >= control->items)
return NULL;
return control->texts[index];
}
}
list_for_each_entry(control, &module->widget_ctl_list, list) {
if (control->id == control_id) {
if (index == GBAUDIO_INVALID_ID)
return control->name;
if (index >= control->items)
return NULL;
return control->texts[index];
}
}
return NULL;
}
static int gbaudio_map_controlname(struct gbaudio_module_info *module,
const char *name)
{
struct gbaudio_control *control;
list_for_each_entry(control, &module->ctl_list, list) {
if (!strncmp(control->name, name, NAME_SIZE))
return control->id;
}
dev_warn(module->dev, "%s: missing in modules controls list\n", name);
return -EINVAL;
}
static int gbaudio_map_wcontrolname(struct gbaudio_module_info *module,
const char *name)
{
struct gbaudio_control *control;
list_for_each_entry(control, &module->widget_ctl_list, list) {
if (!strncmp(control->wname, name, NAME_SIZE))
return control->id;
}
dev_warn(module->dev, "%s: missing in modules controls list\n", name);
Annotation
- Immediate include surface: `linux/greybus.h`, `audio_codec.h`.
- Detected declarations: `struct gbaudio_ctl_pvt`, `function list_for_each_entry`, `function gbaudio_map_controlname`, `function list_for_each_entry`, `function gbaudio_map_wcontrolname`, `function list_for_each_entry`, `function gbaudio_map_widgetname`, `function list_for_each_entry`, `function list_for_each_entry`, `function gbcodec_mixer_ctl_info`.
- Atlas domain: Driver Families / drivers/staging.
- 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.