[PATCH] Preliminary soc-scenario API.
Robert Jarzmik
robert.jarzmik at free.fr
Fri Feb 20 17:44:09 CET 2009
Signed-off-by: Robert Jarzmik <robert.jarzmik at free.fr>
---
include/sound/soc-scenario.h | 119 ++++++++++++++++++++++++++++++++++++++++++
1 files changed, 119 insertions(+), 0 deletions(-)
create mode 100644 include/sound/soc-scenario.h
diff --git a/include/sound/soc-scenario.h b/include/sound/soc-scenario.h
new file mode 100644
index 0000000..bf02d1e
--- /dev/null
+++ b/include/sound/soc-scenario.h
@@ -0,0 +1,119 @@
+/*
+ * Handles the machine boards scenarios
+ *
+ * Copyright (C) 2008 Robert Jarzmik
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ *
+ * Some boards need to enforce use cases of audio paths to protect the hardware
+ * from overheating if uncorrectly used.
+ *
+ * This infrastructure is _not_ to be used as a scenario API. This should be
+ * left to userland applications. This API unique purpose is to protect devices
+ * from hardware destruction through pre-defined use cases.
+ *
+ * ALWAYS CONSIDER A USERLAND SOLUTION before using soc-scenario !!!
+ */
+
+/*
+ * Usage example:
+ * static struct scen_gsm = {
+ * .pin_activate = { "Front Speaker", "Front Mic", "GSM Line Out",
+ * "GSM Line In", NULL },
+ * .pin_deactivate = { "Rear Speaker", NULL },
+ * .mixes_num = 4,
+ * .mixes = {
+ * SOC_SCN_MIX("Left HP Mixer PC Beep Playback Switch", 1),
+ * SOC_SCN_MIX("Left Headphone Out Mux", 2),
+ * SOC_SCN_MIX("Right HP Mixer MonoIn Playback Switch" , 1),
+ * SOC_SNC_MIX("Right Headphone Out Mux", 2),
+ * },
+ * };
+ */
+
+#define SOC_SNC_MIX(_name, _val) { .mixname = _name, .val = _val }
+struct soc_scen_setup_mixmux {
+ char *mixname; /* Codec Mixer or Mux name */
+ snd_ctl_elem_value val; /* Value to enforce */
+};
+
+/**
+ * struct soc_scenario - describes one sound usecase
+ * @name: Scenario name, value as will be seen in alsa "SoC Mode" alsa control
+ * @pin_activate: Pins to activate on scenario activation
+ * @pin_deactivate: Pins to deactivate on scenario activation
+ * Table of all pins, as they should be configured. Each elements is a
+ * pin_change value, describing how to handle a specific pin.
+ * @mixes_num: Size of array mixes[]
+ * @mixes: Mixers/muxes to set up in phase (b)
+ * Table of all mixers and muxes to set up upon entering this scenario
+ * @lvol_master: Left volume aliased to "SoC Volume"
+ * @rvol_master: Right volume aliased to "SoC Volume"
+ * @lvol_mute: Left volume mute aliased to "SoC Volume" mute control
+ * @rvol_mute: Right volume mute aliased to "SoC Volume" mute control
+ *
+ * This structure describes what a scenario change implies. The behaviour is to :
+ * a) enable several pins, disable others, leave others in their state
+ * (understand here snd_soc_dapm_enable_pin)
+ * Note: tables are NULL terminated
+ * b) set up some mixers and muxes to the final state This should be normally
+ * used to activate the mixers/muxes into their final state.
+ * Note: table is NULL, or always terminated by NULL pointer
+ */
+struct soc_scenario {
+ const char *name; /* scenario name */
+ const char *pin_activate[]; /* pins to activate */
+ const char *pin_deactivate[]; /* pins to deactivate */
+ const int mixes_num; /* size of mixes[] */
+ const struct soc_scen_setup_mixmux mixes[]; /* mixers/muxes setup */
+ const char *lvol_master; /* left volume master */
+ const char *rvol_master; /* right volume master */
+ const char *lvol_mute; /* left volume mute */
+ const char *rvol_mute; /* right volume mute */
+};
+
+/**
+ * snd_soc_scenario_init - initialize soc scenarios
+ * @card: card associated to the pins/mixers/muxes/volumes/mutes
+ * @scenario: table of scenarios
+ * @num_scenarios: number of scenarios
+ *
+ * Remember, only use if hardware damage is to be prevented. See file header.
+ *
+ * Initialise the soc scenarios engine. The first scenario (0) will be used. By
+ * default, the user could leave this scenario as non intrusive (not a single
+ * pin changed, no mixers/muxes changes, and volume master inactive).
+ */
+int snd_soc_scenario_init(struct snd_soc_card *card,
+ struct soc_scenario *scenario, int num_scenarios);
+
+/**
+ * snd_soc_scenario_release - release soc scenarios
+ * @card: card used for the init
+ */
+void snd_soc_scenario_release(struct snd_soc_card *card);
+
+/**
+ * snd_soc_scenario_activate - activate a scenario
+ * @card: card associated to the pins/mixers/muxes/volumes/mutes
+ * @name: scenario name
+ *
+ * Activates a scenario. This is the same behaviour as through alsa control, if
+ * "SoC Mode" control was assigned a "name" value.
+ *
+ * Returns -EINVAL if name not known, or 0 upon success.
+ */
+int snd_soc_scenario_activate(struct snd_soc_card *card, char *name);
--
1.5.6.5
More information about the Alsa-devel
mailing list