|
@@ -77,6 +77,10 @@ static struct hda_vendor_id hda_vendor_ids[] = {
|
|
static DEFINE_MUTEX(preset_mutex);
|
|
static DEFINE_MUTEX(preset_mutex);
|
|
static LIST_HEAD(hda_preset_tables);
|
|
static LIST_HEAD(hda_preset_tables);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_add_codec_preset - Add a codec preset to the chain
|
|
|
|
+ * @preset: codec preset table to add
|
|
|
|
+ */
|
|
int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset)
|
|
int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset)
|
|
{
|
|
{
|
|
mutex_lock(&preset_mutex);
|
|
mutex_lock(&preset_mutex);
|
|
@@ -86,6 +90,10 @@ int snd_hda_add_codec_preset(struct hda_codec_preset_list *preset)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_add_codec_preset);
|
|
EXPORT_SYMBOL_GPL(snd_hda_add_codec_preset);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_delete_codec_preset - Delete a codec preset from the chain
|
|
|
|
+ * @preset: codec preset table to delete
|
|
|
|
+ */
|
|
int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset)
|
|
int snd_hda_delete_codec_preset(struct hda_codec_preset_list *preset)
|
|
{
|
|
{
|
|
mutex_lock(&preset_mutex);
|
|
mutex_lock(&preset_mutex);
|
|
@@ -1187,7 +1195,16 @@ unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pincfg);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pincfg);
|
|
|
|
|
|
-/* remember the current pinctl target value */
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_set_pin_target - remember the current pinctl target value
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: pin NID
|
|
|
|
+ * @val: assigned pinctl value
|
|
|
|
+ *
|
|
|
|
+ * This function stores the given value to a pinctl target value in the
|
|
|
|
+ * pincfg table. This isn't always as same as the actually written value
|
|
|
|
+ * but can be referred at any time via snd_hda_codec_get_pin_target().
|
|
|
|
+ */
|
|
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
|
|
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
|
|
unsigned int val)
|
|
unsigned int val)
|
|
{
|
|
{
|
|
@@ -1201,7 +1218,11 @@ int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pin_target);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pin_target);
|
|
|
|
|
|
-/* return the current pinctl target value */
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_get_pin_target - return the current pinctl target value
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: pin NID
|
|
|
|
+ */
|
|
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid)
|
|
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid)
|
|
{
|
|
{
|
|
struct hda_pincfg *pin;
|
|
struct hda_pincfg *pin;
|
|
@@ -1573,6 +1594,13 @@ int snd_hda_codec_new(struct hda_bus *bus,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_new);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_new);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ *
|
|
|
|
+ * Forcibly refresh the all widget caps and the init pin configurations of
|
|
|
|
+ * the given codec.
|
|
|
|
+ */
|
|
int snd_hda_codec_update_widgets(struct hda_codec *codec)
|
|
int snd_hda_codec_update_widgets(struct hda_codec *codec)
|
|
{
|
|
{
|
|
hda_nid_t fg;
|
|
hda_nid_t fg;
|
|
@@ -2239,7 +2267,17 @@ int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_stereo);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_stereo);
|
|
|
|
|
|
-/* Works like snd_hda_codec_amp_update() but it writes the value only at
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_amp_init - initialize the AMP value
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: NID to read the AMP value
|
|
|
|
+ * @ch: channel (left=0 or right=1)
|
|
|
|
+ * @dir: #HDA_INPUT or #HDA_OUTPUT
|
|
|
|
+ * @idx: the index value (only for input direction)
|
|
|
|
+ * @mask: bit mask to set
|
|
|
|
+ * @val: the bits value to set
|
|
|
|
+ *
|
|
|
|
+ * Works like snd_hda_codec_amp_update() but it writes the value only at
|
|
* the first access. If the amp was already initialized / updated beforehand,
|
|
* the first access. If the amp was already initialized / updated beforehand,
|
|
* this does nothing.
|
|
* this does nothing.
|
|
*/
|
|
*/
|
|
@@ -2250,6 +2288,17 @@ int snd_hda_codec_amp_init(struct hda_codec *codec, hda_nid_t nid, int ch,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_amp_init_stereo - initialize the stereo AMP value
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: NID to read the AMP value
|
|
|
|
+ * @dir: #HDA_INPUT or #HDA_OUTPUT
|
|
|
|
+ * @idx: the index value (only for input direction)
|
|
|
|
+ * @mask: bit mask to set
|
|
|
|
+ * @val: the bits value to set
|
|
|
|
+ *
|
|
|
|
+ * Call snd_hda_codec_amp_init() for both stereo channels.
|
|
|
|
+ */
|
|
int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
|
|
int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
|
|
int dir, int idx, int mask, int val)
|
|
int dir, int idx, int mask, int val)
|
|
{
|
|
{
|
|
@@ -2644,7 +2693,10 @@ void snd_hda_ctls_clear(struct hda_codec *codec)
|
|
snd_array_free(&codec->nids);
|
|
snd_array_free(&codec->nids);
|
|
}
|
|
}
|
|
|
|
|
|
-/* pseudo device locking
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_lock_devices - pseudo device locking
|
|
|
|
+ * @bus: the BUS
|
|
|
|
+ *
|
|
* toggle card->shutdown to allow/disallow the device access (as a hack)
|
|
* toggle card->shutdown to allow/disallow the device access (as a hack)
|
|
*/
|
|
*/
|
|
int snd_hda_lock_devices(struct hda_bus *bus)
|
|
int snd_hda_lock_devices(struct hda_bus *bus)
|
|
@@ -2681,6 +2733,10 @@ int snd_hda_lock_devices(struct hda_bus *bus)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_lock_devices);
|
|
EXPORT_SYMBOL_GPL(snd_hda_lock_devices);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_unlock_devices - pseudo device unlocking
|
|
|
|
+ * @bus: the BUS
|
|
|
|
+ */
|
|
void snd_hda_unlock_devices(struct hda_bus *bus)
|
|
void snd_hda_unlock_devices(struct hda_bus *bus)
|
|
{
|
|
{
|
|
struct snd_card *card = bus->card;
|
|
struct snd_card *card = bus->card;
|
|
@@ -2867,7 +2923,7 @@ static int add_slave(struct hda_codec *codec,
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * snd_hda_add_vmaster - create a virtual master control and add slaves
|
|
|
|
|
|
+ * __snd_hda_add_vmaster - create a virtual master control and add slaves
|
|
* @codec: HD-audio codec
|
|
* @codec: HD-audio codec
|
|
* @name: vmaster control name
|
|
* @name: vmaster control name
|
|
* @tlv: TLV data (optional)
|
|
* @tlv: TLV data (optional)
|
|
@@ -2970,10 +3026,15 @@ static struct snd_kcontrol_new vmaster_mute_mode = {
|
|
.put = vmaster_mute_mode_put,
|
|
.put = vmaster_mute_mode_put,
|
|
};
|
|
};
|
|
|
|
|
|
-/*
|
|
|
|
- * Add a mute-LED hook with the given vmaster switch kctl
|
|
|
|
- * "Mute-LED Mode" control is automatically created and associated with
|
|
|
|
- * the given hook.
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @hook: the vmaster hook object
|
|
|
|
+ * @expose_enum_ctl: flag to create an enum ctl
|
|
|
|
+ *
|
|
|
|
+ * Add a mute-LED hook with the given vmaster switch kctl.
|
|
|
|
+ * When @expose_enum_ctl is set, "Mute-LED Mode" control is automatically
|
|
|
|
+ * created and associated with the given hook.
|
|
*/
|
|
*/
|
|
int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|
int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|
struct hda_vmaster_mute_hook *hook,
|
|
struct hda_vmaster_mute_hook *hook,
|
|
@@ -2995,9 +3056,12 @@ int snd_hda_add_vmaster_hook(struct hda_codec *codec,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_add_vmaster_hook);
|
|
EXPORT_SYMBOL_GPL(snd_hda_add_vmaster_hook);
|
|
|
|
|
|
-/*
|
|
|
|
- * Call the hook with the current value for synchronization
|
|
|
|
- * Should be called in init callback
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_sync_vmaster_hook - Sync vmaster hook
|
|
|
|
+ * @hook: the vmaster hook
|
|
|
|
+ *
|
|
|
|
+ * Call the hook with the current value for synchronization.
|
|
|
|
+ * Should be called in init callback.
|
|
*/
|
|
*/
|
|
void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
|
|
void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
|
|
{
|
|
{
|
|
@@ -3599,7 +3663,11 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_create_dig_out_ctls);
|
|
EXPORT_SYMBOL_GPL(snd_hda_create_dig_out_ctls);
|
|
|
|
|
|
-/* get the hda_spdif_out entry from the given NID
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_spdif_out_of_nid - get the hda_spdif_out entry from the given NID
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: widget NID
|
|
|
|
+ *
|
|
* call within spdif_mutex lock
|
|
* call within spdif_mutex lock
|
|
*/
|
|
*/
|
|
struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
|
|
struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
|
|
@@ -3616,6 +3684,13 @@ struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_spdif_out_of_nid);
|
|
EXPORT_SYMBOL_GPL(snd_hda_spdif_out_of_nid);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_spdif_ctls_unassign - Unassign the given SPDIF ctl
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @idx: the SPDIF ctl index
|
|
|
|
+ *
|
|
|
|
+ * Unassign the widget from the given SPDIF control.
|
|
|
|
+ */
|
|
void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx)
|
|
void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx)
|
|
{
|
|
{
|
|
struct hda_spdif_out *spdif;
|
|
struct hda_spdif_out *spdif;
|
|
@@ -3627,6 +3702,14 @@ void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_unassign);
|
|
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_unassign);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_spdif_ctls_assign - Assign the SPDIF controls to the given NID
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @idx: the SPDIF ctl idx
|
|
|
|
+ * @nid: widget NID
|
|
|
|
+ *
|
|
|
|
+ * Assign the widget to the SPDIF control with the given index.
|
|
|
|
+ */
|
|
void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid)
|
|
void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid)
|
|
{
|
|
{
|
|
struct hda_spdif_out *spdif;
|
|
struct hda_spdif_out *spdif;
|
|
@@ -3946,6 +4029,16 @@ void snd_hda_codec_flush_cache(struct hda_codec *codec)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_flush_cache);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_flush_cache);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_set_power_to_all - Set the power state to all widgets
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @fg: function group (not used now)
|
|
|
|
+ * @power_state: the power state to set (AC_PWRST_*)
|
|
|
|
+ *
|
|
|
|
+ * Set the given power state to all widgets that have the power control.
|
|
|
|
+ * If the codec has power_filter set, it evaluates the power state and
|
|
|
|
+ * filter out if it's unchanged as D3.
|
|
|
|
+ */
|
|
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
|
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
|
unsigned int power_state)
|
|
unsigned int power_state)
|
|
{
|
|
{
|
|
@@ -4010,7 +4103,15 @@ static unsigned int hda_sync_power_state(struct hda_codec *codec,
|
|
return state;
|
|
return state;
|
|
}
|
|
}
|
|
|
|
|
|
-/* don't power down the widget if it controls eapd and EAPD_BTLENABLE is set */
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_eapd_power_filter - A power filter callback for EAPD
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @nid: widget NID
|
|
|
|
+ * @power_state: power state to evalue
|
|
|
|
+ *
|
|
|
|
+ * Don't power down the widget if it controls eapd and EAPD_BTLENABLE is set.
|
|
|
|
+ * This can be used a codec power_filter callback.
|
|
|
|
+ */
|
|
unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
|
|
unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
|
|
hda_nid_t nid,
|
|
hda_nid_t nid,
|
|
unsigned int power_state)
|
|
unsigned int power_state)
|
|
@@ -4671,6 +4772,17 @@ static int set_pcm_default_values(struct hda_codec *codec,
|
|
/*
|
|
/*
|
|
* codec prepare/cleanup entries
|
|
* codec prepare/cleanup entries
|
|
*/
|
|
*/
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_prepare - Prepare a stream
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @hinfo: PCM information
|
|
|
|
+ * @stream: stream tag to assign
|
|
|
|
+ * @format: format id to assign
|
|
|
|
+ * @substream: PCM substream to assign
|
|
|
|
+ *
|
|
|
|
+ * Calls the prepare callback set by the codec with the given arguments.
|
|
|
|
+ * Clean up the inactive streams when successful.
|
|
|
|
+ */
|
|
int snd_hda_codec_prepare(struct hda_codec *codec,
|
|
int snd_hda_codec_prepare(struct hda_codec *codec,
|
|
struct hda_pcm_stream *hinfo,
|
|
struct hda_pcm_stream *hinfo,
|
|
unsigned int stream,
|
|
unsigned int stream,
|
|
@@ -4687,6 +4799,14 @@ int snd_hda_codec_prepare(struct hda_codec *codec,
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_prepare);
|
|
EXPORT_SYMBOL_GPL(snd_hda_codec_prepare);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * snd_hda_codec_cleanup - Prepare a stream
|
|
|
|
+ * @codec: the HDA codec
|
|
|
|
+ * @hinfo: PCM information
|
|
|
|
+ * @substream: PCM substream
|
|
|
|
+ *
|
|
|
|
+ * Calls the cleanup callback set by the codec with the given arguments.
|
|
|
|
+ */
|
|
void snd_hda_codec_cleanup(struct hda_codec *codec,
|
|
void snd_hda_codec_cleanup(struct hda_codec *codec,
|
|
struct hda_pcm_stream *hinfo,
|
|
struct hda_pcm_stream *hinfo,
|
|
struct snd_pcm_substream *substream)
|
|
struct snd_pcm_substream *substream)
|