[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