Message ID | 1444294086-27031-1-git-send-email-vinod.koul@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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 >
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);