| /* |
| * linux/sound/soc-fw.h -- ALSA SoC Firmware Controls and DAPM |
| * |
| * Copyright: 2012 Texas Instruments Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * Simple file API to load FW that includes mixers, coefficients, DAPM graphs, |
| * algorithms, equalisers, DAIs, widgets etc. |
| */ |
| |
| #ifndef __LINUX_SND_SOC_FW_H |
| #define __LINUX_SND_SOC_FW_H |
| |
| #include <uapi/sound/asoc.h> |
| |
| struct firmware; |
| |
| /* |
| * Kcontrol operations - used to map handlers onto firmware based controls. |
| */ |
| struct snd_soc_fw_kcontrol_ops { |
| u32 id; |
| int (*get)(struct snd_kcontrol *kcontrol, |
| struct snd_ctl_elem_value *ucontrol); |
| int (*put)(struct snd_kcontrol *kcontrol, |
| struct snd_ctl_elem_value *ucontrol); |
| int (*info)(struct snd_kcontrol *kcontrol, |
| struct snd_ctl_elem_info *uinfo); |
| }; |
| |
| /* |
| * Dai operations - used to map dai ops structure to firmware based dais. |
| */ |
| struct snd_soc_fw_dai_ops { |
| u32 id; |
| struct snd_soc_dai_ops *ops; |
| }; |
| |
| struct snd_soc_fw_widget_events { |
| u16 type; |
| int (*event_handler)(struct snd_soc_dapm_widget *w, |
| struct snd_kcontrol *k, int event); |
| }; |
| |
| /* |
| * Public API - Used by component drivers to load new mixers, DAPM, vendor |
| * specific data. |
| */ |
| struct snd_soc_fw_codec_ops { |
| |
| /* external kcontrol init - can be used to set ext funcs + pdata */ |
| int (*control_load) (struct snd_soc_codec *, struct snd_kcontrol_new *); |
| |
| /* external widget init - can be used to set ext funcs + pdata */ |
| int (*widget_load) (struct snd_soc_codec *, struct snd_soc_dapm_widget *, |
| struct snd_soc_fw_dapm_widget *); |
| |
| /* callback to handle vendor data */ |
| int (*vendor_load) (struct snd_soc_codec *, struct snd_soc_fw_hdr *); |
| int (*vendor_unload) (struct snd_soc_codec *, struct snd_soc_fw_hdr *); |
| |
| |
| int (*pvt_load) (struct snd_soc_codec *, u32, unsigned long, unsigned long); |
| |
| /* completion - called at completion of firmware loading */ |
| void (*complete) (struct snd_soc_codec *); |
| |
| /* kcontrols operations */ |
| const struct snd_soc_fw_kcontrol_ops *io_ops; |
| int io_ops_count; |
| }; |
| |
| struct snd_soc_fw_platform_ops { |
| |
| /* external kcontrol init - can be used to set ext funcs + pdata */ |
| int (*control_load) (struct snd_soc_platform *, struct snd_kcontrol_new *); |
| |
| /* external widget init - can be used to set ext funcs + pdata */ |
| int (*widget_load) (struct snd_soc_platform *, struct snd_soc_dapm_widget *, |
| struct snd_soc_fw_dapm_widget *); |
| |
| /* external dai init - can be used to set ext funcs + pdata */ |
| int (*dai_load) (struct snd_soc_platform *, struct snd_soc_dai_driver *dai_drv, int n); |
| |
| /* callback to handle vendor data */ |
| int (*vendor_load) (struct snd_soc_platform *, struct snd_soc_fw_hdr *); |
| int (*vendor_unload) (struct snd_soc_platform *, struct snd_soc_fw_hdr *); |
| |
| int (*pvt_load) (struct snd_soc_platform *, u32, unsigned long, unsigned long); |
| |
| /* completion - called at completion of firmware loading */ |
| void (*complete) (struct snd_soc_platform *); |
| |
| /* kcontrols operations */ |
| const struct snd_soc_fw_kcontrol_ops *io_ops; |
| int io_ops_count; |
| |
| /* dai operations */ |
| const struct snd_soc_fw_dai_ops *dai_ops; |
| int dai_ops_count; |
| }; |
| |
| struct snd_soc_fw_card_ops { |
| |
| /* external kcontrol init - can be used to set ext funcs + pdata */ |
| int (*control_load) (struct snd_soc_card *, struct snd_kcontrol_new *); |
| |
| /* external widget init - can be used to set ext funcs + pdata */ |
| int (*widget_load) (struct snd_soc_card *, struct snd_soc_dapm_widget *, |
| struct snd_soc_fw_dapm_widget *); |
| |
| /* callback to handle vendor data */ |
| int (*vendor_load) (struct snd_soc_card *, struct snd_soc_fw_hdr *); |
| int (*vendor_unload) (struct snd_soc_card *, struct snd_soc_fw_hdr *); |
| |
| int (*pvt_load) (struct snd_soc_card *, u32, unsigned long, unsigned long); |
| |
| /* completion */ |
| void (*complete) (struct snd_soc_card *); |
| |
| /* kcontrols operations */ |
| const struct snd_soc_fw_kcontrol_ops *io_ops; |
| int io_ops_count; |
| }; |
| |
| /* gets a pointer to data from the firmware block header */ |
| static inline const void *snd_soc_fw_get_data(struct snd_soc_fw_hdr *hdr) |
| { |
| const void *ptr = hdr; |
| |
| return ptr + sizeof(*hdr); |
| } |
| |
| int snd_soc_fw_widget_bind_event(u16 event_type, struct snd_soc_dapm_widget *w, |
| const struct snd_soc_fw_widget_events *events, int num_events); |
| |
| /* Firmware loading for component drivers */ |
| int snd_soc_fw_load_card(struct snd_soc_card *card, |
| struct snd_soc_fw_card_ops *ops, const struct firmware *fw, |
| u32 index); |
| int snd_soc_fw_load_platform(struct snd_soc_platform *platform, |
| struct snd_soc_fw_platform_ops *ops, const struct firmware *fw, |
| u32 index); |
| int snd_soc_fw_load_codec(struct snd_soc_codec *codec, |
| struct snd_soc_fw_codec_ops *ops, const struct firmware *fw, |
| u32 index); |
| |
| #define SND_SOC_FW_INDEX_ALL 0 /* index that matches all FW objects */ |
| |
| /* Firmware based dynamic widget and assoc kcontrol removal */ |
| void snd_soc_fw_dcontrols_remove_widgets(struct snd_soc_dapm_context *dapm, |
| u32 index); |
| void snd_soc_fw_dcontrols_remove_widget(struct snd_soc_dapm_widget *w); |
| |
| /* Firmware based dynamic kcontrol removal for components */ |
| void snd_soc_fw_dcontrols_remove_codec(struct snd_soc_codec *codec, u32 index); |
| void snd_soc_fw_dcontrols_remove_platform(struct snd_soc_platform *platform, u32 index); |
| void snd_soc_fw_dcontrols_remove_card(struct snd_soc_card *soc_card, u32 index); |
| int snd_soc_fw_dcontrols_remove_all(struct snd_soc_card *soc_card, u32 index); |
| |
| #endif |