mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 06:41:39 -04:00
ALSA: hda: Add sync version of snd_hda_codec_write()
We used snd_hda_codec_read() for the verb write when a synchronization is needed after the write, e.g. for the power state toggle or such cases. It works in principle, but it looks rather confusing and too hackish. For improving the code readability, introduce a new helper function, snd_hda_codec_write_sync(), which is another variant of snd_hda_codec_write(), and replace the existing snd_hda_codec_read() calls with this one. No behavior change but just the code refactoring. Signed-off-by: Takashi Iwai <tiwai@suse.de> Link: https://patch.msgid.link/20260409093826.1317626-2-tiwai@suse.de
This commit is contained in:
@@ -336,6 +336,17 @@ snd_hda_codec_write(struct hda_codec *codec, hda_nid_t nid, int flags,
|
||||
return snd_hdac_codec_write(&codec->core, nid, flags, verb, parm);
|
||||
}
|
||||
|
||||
/* sync after write */
|
||||
static inline int
|
||||
snd_hda_codec_write_sync(struct hda_codec *codec, hda_nid_t nid, int flags,
|
||||
unsigned int verb, unsigned int parm)
|
||||
{
|
||||
/* use snd_hda_codec_read() for writing;
|
||||
* the returned value is usually discarded
|
||||
*/
|
||||
return snd_hdac_codec_read(&codec->core, nid, flags, verb, parm);
|
||||
}
|
||||
|
||||
#define snd_hda_param_read(codec, nid, param) \
|
||||
snd_hdac_read_parm(&(codec)->core, nid, param)
|
||||
#define snd_hda_get_sub_nodes(codec, nid, start_nid) \
|
||||
|
||||
@@ -863,7 +863,7 @@ static void sync_power_state_change(struct hda_codec *codec, hda_nid_t nid)
|
||||
{
|
||||
if (nid) {
|
||||
msleep(10);
|
||||
snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_POWER_STATE, 0);
|
||||
snd_hda_codec_write_sync(codec, nid, 0, AC_VERB_GET_POWER_STATE, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -85,7 +85,7 @@ static void haswell_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
||||
}
|
||||
}
|
||||
|
||||
snd_hda_codec_read(codec, fg, 0, AC_VERB_SET_POWER_STATE, power_state);
|
||||
snd_hda_codec_write_sync(codec, fg, 0, AC_VERB_SET_POWER_STATE, power_state);
|
||||
snd_hda_codec_set_power_to_all(codec, fg, power_state);
|
||||
}
|
||||
|
||||
|
||||
@@ -411,9 +411,8 @@ void alc_headset_mic_no_shutup(struct hda_codec *codec)
|
||||
return;
|
||||
|
||||
snd_array_for_each(&codec->init_pins, i, pin) {
|
||||
/* use read here for syncing after issuing each verb */
|
||||
if (pin->nid != mic_pin)
|
||||
snd_hda_codec_read(codec, pin->nid, 0,
|
||||
snd_hda_codec_write_sync(codec, pin->nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -311,12 +311,12 @@ static void stac_gpio_set(struct hda_codec *codec, unsigned int mask,
|
||||
|
||||
snd_hda_codec_write(codec, fg, 0,
|
||||
AC_VERB_SET_GPIO_MASK, gpiomask);
|
||||
snd_hda_codec_read(codec, fg, 0,
|
||||
snd_hda_codec_write_sync(codec, fg, 0,
|
||||
AC_VERB_SET_GPIO_DIRECTION, gpiodir); /* sync */
|
||||
|
||||
msleep(1);
|
||||
|
||||
snd_hda_codec_read(codec, fg, 0,
|
||||
snd_hda_codec_write_sync(codec, fg, 0,
|
||||
AC_VERB_SET_GPIO_DATA, gpiostate); /* sync */
|
||||
}
|
||||
|
||||
|
||||
@@ -606,9 +606,8 @@ void snd_hda_shutup_pins(struct hda_codec *codec)
|
||||
if (codec->bus->shutdown)
|
||||
return;
|
||||
snd_array_for_each(&codec->init_pins, i, pin) {
|
||||
/* use read here for syncing after issuing each verb */
|
||||
snd_hda_codec_read(codec, pin->nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
|
||||
snd_hda_codec_write_sync(codec, pin->nid, 0,
|
||||
AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
|
||||
}
|
||||
codec->pins_shutup = 1;
|
||||
}
|
||||
@@ -2794,9 +2793,9 @@ static unsigned int hda_set_power_state(struct hda_codec *codec,
|
||||
if (codec->power_filter)
|
||||
state = codec->power_filter(codec, fg, state);
|
||||
if (state == power_state || power_state != AC_PWRST_D3)
|
||||
snd_hda_codec_read(codec, fg, flags,
|
||||
AC_VERB_SET_POWER_STATE,
|
||||
state);
|
||||
snd_hda_codec_write_sync(codec, fg, flags,
|
||||
AC_VERB_SET_POWER_STATE,
|
||||
state);
|
||||
snd_hda_codec_set_power_to_all(codec, fg, power_state);
|
||||
}
|
||||
state = snd_hda_sync_power_state(codec, fg, power_state);
|
||||
|
||||
Reference in New Issue
Block a user