199 lines · c
1/* SPDX-License-Identifier: GPL-2.02 *3 * linux/sound/soc-topology.h -- ALSA SoC Firmware Controls and DAPM4 *5 * Copyright (C) 2012 Texas Instruments Inc.6 * Copyright (C) 2015 Intel Corporation.7 *8 * Simple file API to load FW that includes mixers, coefficients, DAPM graphs,9 * algorithms, equalisers, DAIs, widgets, FE caps, BE caps, codec link caps etc.10 */11 12#ifndef __LINUX_SND_SOC_TPLG_H13#define __LINUX_SND_SOC_TPLG_H14 15#include <sound/asoc.h>16#include <linux/list.h>17 18struct firmware;19struct snd_kcontrol;20struct snd_soc_tplg_pcm_be;21struct snd_ctl_elem_value;22struct snd_ctl_elem_info;23struct snd_soc_dapm_widget;24struct snd_soc_component;25struct snd_soc_tplg_pcm_fe;26struct snd_soc_dapm_context;27struct snd_soc_card;28struct snd_kcontrol_new;29struct snd_soc_dai_link;30struct snd_soc_dai_driver;31struct snd_soc_dai;32struct snd_soc_dapm_route;33 34/* dynamic object type */35enum snd_soc_dobj_type {36 SND_SOC_DOBJ_NONE = 0, /* object is not dynamic */37 SND_SOC_DOBJ_MIXER,38 SND_SOC_DOBJ_BYTES,39 SND_SOC_DOBJ_ENUM,40 SND_SOC_DOBJ_GRAPH,41 SND_SOC_DOBJ_WIDGET,42 SND_SOC_DOBJ_DAI_LINK,43 SND_SOC_DOBJ_PCM,44 SND_SOC_DOBJ_CODEC_LINK,45 SND_SOC_DOBJ_BACKEND_LINK,46};47 48/* dynamic control object */49struct snd_soc_dobj_control {50 struct snd_kcontrol *kcontrol;51 char **dtexts;52 unsigned long *dvalues;53};54 55/* dynamic widget object */56struct snd_soc_dobj_widget {57 unsigned int *kcontrol_type; /* kcontrol type: mixer, enum, bytes */58};59 60/* generic dynamic object - all dynamic objects belong to this struct */61struct snd_soc_dobj {62 enum snd_soc_dobj_type type;63 unsigned int index; /* objects can belong in different groups */64 struct list_head list;65 int (*unload)(struct snd_soc_component *comp, struct snd_soc_dobj *dobj);66 union {67 struct snd_soc_dobj_control control;68 struct snd_soc_dobj_widget widget;69 };70 void *private; /* core does not touch this */71};72 73/*74 * Kcontrol operations - used to map handlers onto firmware based controls.75 */76struct snd_soc_tplg_kcontrol_ops {77 u32 id;78 int (*get)(struct snd_kcontrol *kcontrol,79 struct snd_ctl_elem_value *ucontrol);80 int (*put)(struct snd_kcontrol *kcontrol,81 struct snd_ctl_elem_value *ucontrol);82 int (*info)(struct snd_kcontrol *kcontrol,83 struct snd_ctl_elem_info *uinfo);84};85 86/* Bytes ext operations, for TLV byte controls */87struct snd_soc_tplg_bytes_ext_ops {88 u32 id;89 int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,90 unsigned int size);91 int (*put)(struct snd_kcontrol *kcontrol,92 const unsigned int __user *bytes, unsigned int size);93};94 95/*96 * DAPM widget event handlers - used to map handlers onto widgets.97 */98struct snd_soc_tplg_widget_events {99 u16 type;100 int (*event_handler)(struct snd_soc_dapm_widget *w,101 struct snd_kcontrol *k, int event);102};103 104/*105 * Public API - Used by component drivers to load and unload dynamic objects106 * and their resources.107 */108struct snd_soc_tplg_ops {109 110 /* external kcontrol init - used for any driver specific init */111 int (*control_load)(struct snd_soc_component *, int index,112 struct snd_kcontrol_new *, struct snd_soc_tplg_ctl_hdr *);113 int (*control_unload)(struct snd_soc_component *,114 struct snd_soc_dobj *);115 116 /* DAPM graph route element loading and unloading */117 int (*dapm_route_load)(struct snd_soc_component *, int index,118 struct snd_soc_dapm_route *route);119 int (*dapm_route_unload)(struct snd_soc_component *,120 struct snd_soc_dobj *);121 122 /* external widget init - used for any driver specific init */123 int (*widget_load)(struct snd_soc_component *, int index,124 struct snd_soc_dapm_widget *,125 struct snd_soc_tplg_dapm_widget *);126 int (*widget_ready)(struct snd_soc_component *, int index,127 struct snd_soc_dapm_widget *,128 struct snd_soc_tplg_dapm_widget *);129 int (*widget_unload)(struct snd_soc_component *,130 struct snd_soc_dobj *);131 132 /* FE DAI - used for any driver specific init */133 int (*dai_load)(struct snd_soc_component *, int index,134 struct snd_soc_dai_driver *dai_drv,135 struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai);136 137 int (*dai_unload)(struct snd_soc_component *,138 struct snd_soc_dobj *);139 140 /* DAI link - used for any driver specific init */141 int (*link_load)(struct snd_soc_component *, int index,142 struct snd_soc_dai_link *link,143 struct snd_soc_tplg_link_config *cfg);144 int (*link_unload)(struct snd_soc_component *,145 struct snd_soc_dobj *);146 147 /* callback to handle vendor bespoke data */148 int (*vendor_load)(struct snd_soc_component *, int index,149 struct snd_soc_tplg_hdr *);150 int (*vendor_unload)(struct snd_soc_component *,151 struct snd_soc_tplg_hdr *);152 153 /* completion - called at completion of firmware loading */154 int (*complete)(struct snd_soc_component *comp);155 156 /* manifest - optional to inform component of manifest */157 int (*manifest)(struct snd_soc_component *, int index,158 struct snd_soc_tplg_manifest *);159 160 /* vendor specific kcontrol handlers available for binding */161 const struct snd_soc_tplg_kcontrol_ops *io_ops;162 int io_ops_count;163 164 /* vendor specific bytes ext handlers available for binding */165 const struct snd_soc_tplg_bytes_ext_ops *bytes_ext_ops;166 int bytes_ext_ops_count;167};168 169#ifdef CONFIG_SND_SOC_TOPOLOGY170 171/* gets a pointer to data from the firmware block header */172static inline const void *snd_soc_tplg_get_data(struct snd_soc_tplg_hdr *hdr)173{174 const void *ptr = hdr;175 176 return ptr + sizeof(*hdr);177}178 179/* Dynamic Object loading and removal for component drivers */180int snd_soc_tplg_component_load(struct snd_soc_component *comp,181 const struct snd_soc_tplg_ops *ops, const struct firmware *fw);182int snd_soc_tplg_component_remove(struct snd_soc_component *comp);183 184/* Binds event handlers to dynamic widgets */185int snd_soc_tplg_widget_bind_event(struct snd_soc_dapm_widget *w,186 const struct snd_soc_tplg_widget_events *events, int num_events,187 u16 event_type);188 189#else190 191static inline int snd_soc_tplg_component_remove(struct snd_soc_component *comp)192{193 return 0;194}195 196#endif197 198#endif199