[1/2] ALSA: hdac: Copy codec helpers to core
diff mbox

Message ID 1444294086-27031-1-git-send-email-vinod.koul@intel.com
State New
Headers show

Commit Message

Vinod Koul Oct. 8, 2015, 8:48 a.m. UTC
From: "Subhransu S. Prusty" <subhransu.s.prusty@intel.com>

The current codec helpers are local to hda code and needs to be moved to
core so that other users can use it.
The helpers to read/write the codec and to check the
power state of widgets is copied

Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
---
 include/sound/hdaudio.h |  6 ++++
 sound/hda/hdac_device.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)

Comments

Takashi Iwai Oct. 8, 2015, 5:12 p.m. UTC | #1
On Thu, 08 Oct 2015 10:48:05 +0200,
Vinod Koul wrote:
> 
> From: "Subhransu S. Prusty" <subhransu.s.prusty@intel.com>
> 
> The current codec helpers are local to hda code and needs to be moved to
> core so that other users can use it.
> The helpers to read/write the codec and to check the
> power state of widgets is copied
> 
> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
> Signed-off-by: Vinod Koul <vinod.koul@intel.com>

Thanks, applied both patches.


Takashi

> ---
>  include/sound/hdaudio.h |  6 ++++
>  sound/hda/hdac_device.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 87 insertions(+)
> 
> diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
> index 49bc836fcd84..26e956f4b7c6 100644
> --- a/include/sound/hdaudio.h
> +++ b/include/sound/hdaudio.h
> @@ -147,6 +147,12 @@ int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid,
>  bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
>  				  unsigned int format);
>  
> +int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm);
> +int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm);
> +bool snd_hdac_check_power_state(struct hdac_device *hdac,
> +		hda_nid_t nid, unsigned int target_state);
>  /**
>   * snd_hdac_read_parm - read a codec parameter
>   * @codec: the codec object
> diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c
> index db96042a497f..b3b0ad289df1 100644
> --- a/sound/hda/hdac_device.c
> +++ b/sound/hda/hdac_device.c
> @@ -952,3 +952,84 @@ bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
>  	return true;
>  }
>  EXPORT_SYMBOL_GPL(snd_hdac_is_supported_format);
> +
> +static unsigned int codec_read(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm)
> +{
> +	unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
> +	unsigned int res;
> +
> +	if (snd_hdac_exec_verb(hdac, cmd, flags, &res))
> +		return -1;
> +
> +	return res;
> +}
> +
> +static int codec_write(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm)
> +{
> +	unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
> +
> +	return snd_hdac_exec_verb(hdac, cmd, flags, NULL);
> +}
> +
> +/**
> + * snd_hdac_codec_read - send a command and get the response
> + * @hdac: the HDAC device
> + * @nid: NID to send the command
> + * @flags: optional bit flags
> + * @verb: the verb to send
> + * @parm: the parameter for the verb
> + *
> + * Send a single command and read the corresponding response.
> + *
> + * Returns the obtained response value, or -1 for an error.
> + */
> +int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm)
> +{
> +	return codec_read(hdac, nid, flags, verb, parm);
> +}
> +EXPORT_SYMBOL_GPL(snd_hdac_codec_read);
> +
> +/**
> + * snd_hdac_codec_write - send a single command without waiting for response
> + * @hdac: the HDAC device
> + * @nid: NID to send the command
> + * @flags: optional bit flags
> + * @verb: the verb to send
> + * @parm: the parameter for the verb
> + *
> + * Send a single command without waiting for response.
> + *
> + * Returns 0 if successful, or a negative error code.
> + */
> +int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
> +			int flags, unsigned int verb, unsigned int parm)
> +{
> +	return codec_write(hdac, nid, flags, verb, parm);
> +}
> +EXPORT_SYMBOL_GPL(snd_hdac_codec_write);
> +
> +/*
> + * snd_hdac_check_power_state: check whether the actual power state matches
> + * with the target state
> + *
> + * @hdac: the HDAC device
> + * @nid: NID to send the command
> + * @target_state: target state to check for
> + *
> + * Return true if state matches, false if not
> + */
> +bool snd_hdac_check_power_state(struct hdac_device *hdac,
> +		hda_nid_t nid, unsigned int target_state)
> +{
> +	unsigned int state = codec_read(hdac, nid, 0,
> +				AC_VERB_GET_POWER_STATE, 0);
> +
> +	if (state & AC_PWRST_ERROR)
> +		return true;
> +	state = (state >> 4) & 0x0f;
> +	return (state == target_state);
> +}
> +EXPORT_SYMBOL_GPL(snd_hdac_check_power_state);
> -- 
> 2.4.3
>

Patch
diff mbox

diff --git a/include/sound/hdaudio.h b/include/sound/hdaudio.h
index 49bc836fcd84..26e956f4b7c6 100644
--- a/include/sound/hdaudio.h
+++ b/include/sound/hdaudio.h
@@ -147,6 +147,12 @@  int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid,
 bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
 				  unsigned int format);
 
+int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm);
+int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm);
+bool snd_hdac_check_power_state(struct hdac_device *hdac,
+		hda_nid_t nid, unsigned int target_state);
 /**
  * snd_hdac_read_parm - read a codec parameter
  * @codec: the codec object
diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c
index db96042a497f..b3b0ad289df1 100644
--- a/sound/hda/hdac_device.c
+++ b/sound/hda/hdac_device.c
@@ -952,3 +952,84 @@  bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
 	return true;
 }
 EXPORT_SYMBOL_GPL(snd_hdac_is_supported_format);
+
+static unsigned int codec_read(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm)
+{
+	unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
+	unsigned int res;
+
+	if (snd_hdac_exec_verb(hdac, cmd, flags, &res))
+		return -1;
+
+	return res;
+}
+
+static int codec_write(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm)
+{
+	unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
+
+	return snd_hdac_exec_verb(hdac, cmd, flags, NULL);
+}
+
+/**
+ * snd_hdac_codec_read - send a command and get the response
+ * @hdac: the HDAC device
+ * @nid: NID to send the command
+ * @flags: optional bit flags
+ * @verb: the verb to send
+ * @parm: the parameter for the verb
+ *
+ * Send a single command and read the corresponding response.
+ *
+ * Returns the obtained response value, or -1 for an error.
+ */
+int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm)
+{
+	return codec_read(hdac, nid, flags, verb, parm);
+}
+EXPORT_SYMBOL_GPL(snd_hdac_codec_read);
+
+/**
+ * snd_hdac_codec_write - send a single command without waiting for response
+ * @hdac: the HDAC device
+ * @nid: NID to send the command
+ * @flags: optional bit flags
+ * @verb: the verb to send
+ * @parm: the parameter for the verb
+ *
+ * Send a single command without waiting for response.
+ *
+ * Returns 0 if successful, or a negative error code.
+ */
+int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
+			int flags, unsigned int verb, unsigned int parm)
+{
+	return codec_write(hdac, nid, flags, verb, parm);
+}
+EXPORT_SYMBOL_GPL(snd_hdac_codec_write);
+
+/*
+ * snd_hdac_check_power_state: check whether the actual power state matches
+ * with the target state
+ *
+ * @hdac: the HDAC device
+ * @nid: NID to send the command
+ * @target_state: target state to check for
+ *
+ * Return true if state matches, false if not
+ */
+bool snd_hdac_check_power_state(struct hdac_device *hdac,
+		hda_nid_t nid, unsigned int target_state)
+{
+	unsigned int state = codec_read(hdac, nid, 0,
+				AC_VERB_GET_POWER_STATE, 0);
+
+	if (state & AC_PWRST_ERROR)
+		return true;
+	state = (state >> 4) & 0x0f;
+	return (state == target_state);
+}
+EXPORT_SYMBOL_GPL(snd_hdac_check_power_state);