• Home
  • Raw
  • Download

Lines Matching +full:codec +full:- +full:0

1 // SPDX-License-Identifier: GPL-2.0-only
3 * HD-audio codec core device
18 static void setup_fg_nodes(struct hdac_device *codec);
19 static int get_codec_vendor_name(struct hdac_device *codec);
27 * snd_hdac_device_init - initialize the HD-audio codec base device
28 * @codec: device to initialize
31 * @addr: codec address
40 int snd_hdac_device_init(struct hdac_device *codec, struct hdac_bus *bus, in snd_hdac_device_init() argument
47 dev = &codec->dev; in snd_hdac_device_init()
49 dev->parent = bus->dev; in snd_hdac_device_init()
50 dev->bus = &snd_hda_bus_type; in snd_hdac_device_init()
51 dev->release = default_release; in snd_hdac_device_init()
52 dev->groups = hdac_dev_attr_groups; in snd_hdac_device_init()
56 codec->bus = bus; in snd_hdac_device_init()
57 codec->addr = addr; in snd_hdac_device_init()
58 codec->type = HDA_DEV_CORE; in snd_hdac_device_init()
59 mutex_init(&codec->widget_lock); in snd_hdac_device_init()
60 mutex_init(&codec->regmap_lock); in snd_hdac_device_init()
61 pm_runtime_set_active(&codec->dev); in snd_hdac_device_init()
62 pm_runtime_get_noresume(&codec->dev); in snd_hdac_device_init()
63 atomic_set(&codec->in_pm, 0); in snd_hdac_device_init()
65 err = snd_hdac_bus_add_device(bus, codec); in snd_hdac_device_init()
66 if (err < 0) in snd_hdac_device_init()
70 codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, in snd_hdac_device_init()
72 if (codec->vendor_id == -1) { in snd_hdac_device_init()
76 codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, in snd_hdac_device_init()
80 codec->subsystem_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, in snd_hdac_device_init()
82 codec->revision_id = snd_hdac_read_parm(codec, AC_NODE_ROOT, in snd_hdac_device_init()
85 setup_fg_nodes(codec); in snd_hdac_device_init()
86 if (!codec->afg && !codec->mfg) { in snd_hdac_device_init()
88 err = -ENODEV; in snd_hdac_device_init()
92 fg = codec->afg ? codec->afg : codec->mfg; in snd_hdac_device_init()
94 err = snd_hdac_refresh_widgets(codec); in snd_hdac_device_init()
95 if (err < 0) in snd_hdac_device_init()
98 codec->power_caps = snd_hdac_read_parm(codec, fg, AC_PAR_POWER_STATE); in snd_hdac_device_init()
100 if (codec->subsystem_id == -1 || codec->subsystem_id == 0) in snd_hdac_device_init()
101 snd_hdac_read(codec, fg, AC_VERB_GET_SUBSYSTEM_ID, 0, in snd_hdac_device_init()
102 &codec->subsystem_id); in snd_hdac_device_init()
104 err = get_codec_vendor_name(codec); in snd_hdac_device_init()
105 if (err < 0) in snd_hdac_device_init()
108 codec->chip_name = kasprintf(GFP_KERNEL, "ID %x", in snd_hdac_device_init()
109 codec->vendor_id & 0xffff); in snd_hdac_device_init()
110 if (!codec->chip_name) { in snd_hdac_device_init()
111 err = -ENOMEM; in snd_hdac_device_init()
115 return 0; in snd_hdac_device_init()
118 put_device(&codec->dev); in snd_hdac_device_init()
124 * snd_hdac_device_exit - clean up the HD-audio codec base device
125 * @codec: device to clean up
127 void snd_hdac_device_exit(struct hdac_device *codec) in snd_hdac_device_exit() argument
129 pm_runtime_put_noidle(&codec->dev); in snd_hdac_device_exit()
131 pm_runtime_set_suspended(&codec->dev); in snd_hdac_device_exit()
132 snd_hdac_bus_remove_device(codec->bus, codec); in snd_hdac_device_exit()
133 kfree(codec->vendor_name); in snd_hdac_device_exit()
134 kfree(codec->chip_name); in snd_hdac_device_exit()
139 * snd_hdac_device_register - register the hd-audio codec base device
140 * @codec: the device to register
142 int snd_hdac_device_register(struct hdac_device *codec) in snd_hdac_device_register() argument
146 err = device_add(&codec->dev); in snd_hdac_device_register()
147 if (err < 0) in snd_hdac_device_register()
149 mutex_lock(&codec->widget_lock); in snd_hdac_device_register()
150 err = hda_widget_sysfs_init(codec); in snd_hdac_device_register()
151 mutex_unlock(&codec->widget_lock); in snd_hdac_device_register()
152 if (err < 0) { in snd_hdac_device_register()
153 device_del(&codec->dev); in snd_hdac_device_register()
157 return 0; in snd_hdac_device_register()
162 * snd_hdac_device_unregister - unregister the hd-audio codec base device
163 * @codec: the device to unregister
165 void snd_hdac_device_unregister(struct hdac_device *codec) in snd_hdac_device_unregister() argument
167 if (device_is_registered(&codec->dev)) { in snd_hdac_device_unregister()
168 mutex_lock(&codec->widget_lock); in snd_hdac_device_unregister()
169 hda_widget_sysfs_exit(codec); in snd_hdac_device_unregister()
170 mutex_unlock(&codec->widget_lock); in snd_hdac_device_unregister()
171 device_del(&codec->dev); in snd_hdac_device_unregister()
172 snd_hdac_bus_remove_device(codec->bus, codec); in snd_hdac_device_unregister()
178 * snd_hdac_device_set_chip_name - set/update the codec name
179 * @codec: the HDAC device
182 * Returns 0 if the name is set or updated, or a negative error code.
184 int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name) in snd_hdac_device_set_chip_name() argument
189 return 0; in snd_hdac_device_set_chip_name()
192 return -ENOMEM; in snd_hdac_device_set_chip_name()
193 kfree(codec->chip_name); in snd_hdac_device_set_chip_name()
194 codec->chip_name = newname; in snd_hdac_device_set_chip_name()
195 return 0; in snd_hdac_device_set_chip_name()
200 * snd_hdac_codec_modalias - give the module alias name
201 * @codec: HDAC device
207 int snd_hdac_codec_modalias(const struct hdac_device *codec, char *buf, size_t size) in snd_hdac_codec_modalias() argument
210 codec->vendor_id, codec->revision_id, codec->type); in snd_hdac_codec_modalias()
215 * snd_hdac_make_cmd - compose a 32bit command word to be sent to the
216 * HD-audio controller
217 * @codec: the codec object
222 * Return an encoded command verb or -1 for error.
224 static unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_make_cmd() argument
229 addr = codec->addr; in snd_hdac_make_cmd()
230 if ((addr & ~0xf) || (nid & ~0x7f) || in snd_hdac_make_cmd()
231 (verb & ~0xfff) || (parm & ~0xffff)) { in snd_hdac_make_cmd()
232 dev_err(&codec->dev, "out of range cmd %x:%x:%x:%x\n", in snd_hdac_make_cmd()
234 return -1; in snd_hdac_make_cmd()
245 * snd_hdac_exec_verb - execute an encoded verb
246 * @codec: the codec object
256 int snd_hdac_exec_verb(struct hdac_device *codec, unsigned int cmd, in snd_hdac_exec_verb() argument
259 if (codec->exec_verb) in snd_hdac_exec_verb()
260 return codec->exec_verb(codec, cmd, flags, res); in snd_hdac_exec_verb()
261 return snd_hdac_bus_exec_verb(codec->bus, codec->addr, cmd, res); in snd_hdac_exec_verb()
266 * snd_hdac_read - execute a verb
267 * @codec: the codec object
275 int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_read() argument
278 unsigned int cmd = snd_hdac_make_cmd(codec, nid, verb, parm); in snd_hdac_read()
280 return snd_hdac_exec_verb(codec, cmd, 0, res); in snd_hdac_read()
285 * _snd_hdac_read_parm - read a parmeter
286 * @codec: the codec object
293 int _snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm, in _snd_hdac_read_parm() argument
299 return snd_hdac_regmap_read_raw(codec, cmd, res); in _snd_hdac_read_parm()
304 * snd_hdac_read_parm_uncached - read a codec parameter without caching
305 * @codec: the codec object
309 * Returns -1 for error. If you need to distinguish the error more
312 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_read_parm_uncached() argument
318 if (snd_hdac_regmap_read_raw_uncached(codec, cmd, &val) < 0) in snd_hdac_read_parm_uncached()
319 return -1; in snd_hdac_read_parm_uncached()
325 * snd_hdac_override_parm - override read-only parameters
326 * @codec: the codec object
331 int snd_hdac_override_parm(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_override_parm() argument
337 if (!codec->regmap) in snd_hdac_override_parm()
338 return -EINVAL; in snd_hdac_override_parm()
340 codec->caps_overwriting = true; in snd_hdac_override_parm()
341 err = snd_hdac_regmap_write_raw(codec, verb, val); in snd_hdac_override_parm()
342 codec->caps_overwriting = false; in snd_hdac_override_parm()
348 * snd_hdac_get_sub_nodes - get start NID and number of subtree nodes
349 * @codec: the codec object
356 int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_get_sub_nodes() argument
361 parm = snd_hdac_read_parm_uncached(codec, nid, AC_PAR_NODE_COUNT); in snd_hdac_get_sub_nodes()
362 if (parm == -1) { in snd_hdac_get_sub_nodes()
363 *start_id = 0; in snd_hdac_get_sub_nodes()
364 return 0; in snd_hdac_get_sub_nodes()
366 *start_id = (parm >> 16) & 0x7fff; in snd_hdac_get_sub_nodes()
367 return (int)(parm & 0x7fff); in snd_hdac_get_sub_nodes()
374 static void setup_fg_nodes(struct hdac_device *codec) in setup_fg_nodes() argument
379 total_nodes = snd_hdac_get_sub_nodes(codec, AC_NODE_ROOT, &nid); in setup_fg_nodes()
380 for (i = 0; i < total_nodes; i++, nid++) { in setup_fg_nodes()
381 function_id = snd_hdac_read_parm(codec, nid, in setup_fg_nodes()
383 switch (function_id & 0xff) { in setup_fg_nodes()
385 codec->afg = nid; in setup_fg_nodes()
386 codec->afg_function_id = function_id & 0xff; in setup_fg_nodes()
387 codec->afg_unsol = (function_id >> 8) & 1; in setup_fg_nodes()
390 codec->mfg = nid; in setup_fg_nodes()
391 codec->mfg_function_id = function_id & 0xff; in setup_fg_nodes()
392 codec->mfg_unsol = (function_id >> 8) & 1; in setup_fg_nodes()
401 * snd_hdac_refresh_widgets - Reset the widget start/end nodes
402 * @codec: the codec object
404 int snd_hdac_refresh_widgets(struct hdac_device *codec) in snd_hdac_refresh_widgets() argument
407 int nums, err = 0; in snd_hdac_refresh_widgets()
413 mutex_lock(&codec->widget_lock); in snd_hdac_refresh_widgets()
414 nums = snd_hdac_get_sub_nodes(codec, codec->afg, &start_nid); in snd_hdac_refresh_widgets()
415 if (!start_nid || nums <= 0 || nums >= 0xff) { in snd_hdac_refresh_widgets()
416 dev_err(&codec->dev, "cannot read sub nodes for FG 0x%02x\n", in snd_hdac_refresh_widgets()
417 codec->afg); in snd_hdac_refresh_widgets()
418 err = -EINVAL; in snd_hdac_refresh_widgets()
422 err = hda_widget_sysfs_reinit(codec, start_nid, nums); in snd_hdac_refresh_widgets()
423 if (err < 0) in snd_hdac_refresh_widgets()
426 codec->num_nodes = nums; in snd_hdac_refresh_widgets()
427 codec->start_nid = start_nid; in snd_hdac_refresh_widgets()
428 codec->end_nid = start_nid + nums; in snd_hdac_refresh_widgets()
430 mutex_unlock(&codec->widget_lock); in snd_hdac_refresh_widgets()
436 static unsigned int get_num_conns(struct hdac_device *codec, hda_nid_t nid) in get_num_conns() argument
438 unsigned int wcaps = get_wcaps(codec, nid); in get_num_conns()
443 return 0; in get_num_conns()
445 parm = snd_hdac_read_parm(codec, nid, AC_PAR_CONNLIST_LEN); in get_num_conns()
446 if (parm == -1) in get_num_conns()
447 parm = 0; in get_num_conns()
452 * snd_hdac_get_connections - get a widget connection list
453 * @codec: the codec object
460 * given array size, it returns -ENOSPC.
464 int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_get_connections() argument
471 int null_count = 0; in snd_hdac_get_connections()
473 parm = get_num_conns(codec, nid); in snd_hdac_get_connections()
475 return 0; in snd_hdac_get_connections()
487 mask = (1 << (shift-1)) - 1; in snd_hdac_get_connections()
490 return 0; /* no connection */ in snd_hdac_get_connections()
494 err = snd_hdac_read(codec, nid, AC_VERB_GET_CONNECT_LIST, 0, in snd_hdac_get_connections()
496 if (err < 0) in snd_hdac_get_connections()
499 conn_list[0] = parm & mask; in snd_hdac_get_connections()
504 conns = 0; in snd_hdac_get_connections()
505 prev_nid = 0; in snd_hdac_get_connections()
506 for (i = 0; i < conn_len; i++) { in snd_hdac_get_connections()
510 if (i % num_elems == 0) { in snd_hdac_get_connections()
511 err = snd_hdac_read(codec, nid, in snd_hdac_get_connections()
514 if (err < 0) in snd_hdac_get_connections()
515 return -EIO; in snd_hdac_get_connections()
517 range_val = !!(parm & (1 << (shift-1))); /* ranges */ in snd_hdac_get_connections()
519 if (val == 0 && null_count++) { /* no second chance */ in snd_hdac_get_connections()
520 dev_dbg(&codec->dev, in snd_hdac_get_connections()
523 return 0; in snd_hdac_get_connections()
529 dev_warn(&codec->dev, in snd_hdac_get_connections()
537 return -ENOSPC; in snd_hdac_get_connections()
545 return -ENOSPC; in snd_hdac_get_connections()
558 * snd_hdac_power_up - power up the codec
559 * @codec: the codec object
561 * This function calls the runtime PM helper to power up the given codec.
567 int snd_hdac_power_up(struct hdac_device *codec) in snd_hdac_power_up() argument
569 return pm_runtime_get_sync(&codec->dev); in snd_hdac_power_up()
574 * snd_hdac_power_down - power down the codec
575 * @codec: the codec object
579 int snd_hdac_power_down(struct hdac_device *codec) in snd_hdac_power_down() argument
581 struct device *dev = &codec->dev; in snd_hdac_power_down()
589 * snd_hdac_power_up_pm - power up the codec
590 * @codec: the codec object
593 * which may be called by PM suspend/resume again. OTOH, if a power-up
599 int snd_hdac_power_up_pm(struct hdac_device *codec) in snd_hdac_power_up_pm() argument
601 if (!atomic_inc_not_zero(&codec->in_pm)) in snd_hdac_power_up_pm()
602 return snd_hdac_power_up(codec); in snd_hdac_power_up_pm()
603 return 0; in snd_hdac_power_up_pm()
608 * already powered up. Returns -1 if not powered up, 1 if incremented
609 * or 0 if unchanged. Only used in hdac_regmap.c
611 int snd_hdac_keep_power_up(struct hdac_device *codec) in snd_hdac_keep_power_up() argument
613 if (!atomic_inc_not_zero(&codec->in_pm)) { in snd_hdac_keep_power_up()
614 int ret = pm_runtime_get_if_active(&codec->dev, true); in snd_hdac_keep_power_up()
616 return -1; in snd_hdac_keep_power_up()
617 if (ret < 0) in snd_hdac_keep_power_up()
618 return 0; in snd_hdac_keep_power_up()
624 * snd_hdac_power_down_pm - power down the codec
625 * @codec: the codec object
632 int snd_hdac_power_down_pm(struct hdac_device *codec) in snd_hdac_power_down_pm() argument
634 if (atomic_dec_if_positive(&codec->in_pm) < 0) in snd_hdac_power_down_pm()
635 return snd_hdac_power_down(codec); in snd_hdac_power_down_pm()
636 return 0; in snd_hdac_power_down_pm()
641 /* codec vendor labels */
648 { 0x0014, "Loongson" },
649 { 0x1002, "ATI" },
650 { 0x1013, "Cirrus Logic" },
651 { 0x1057, "Motorola" },
652 { 0x1095, "Silicon Image" },
653 { 0x10de, "Nvidia" },
654 { 0x10ec, "Realtek" },
655 { 0x1102, "Creative" },
656 { 0x1106, "VIA" },
657 { 0x111d, "IDT" },
658 { 0x11c1, "LSI" },
659 { 0x11d4, "Analog Devices" },
660 { 0x13f6, "C-Media" },
661 { 0x14f1, "Conexant" },
662 { 0x17e8, "Chrontel" },
663 { 0x1854, "LG" },
664 { 0x19e5, "Huawei" },
665 { 0x1aec, "Wolfson Microelectronics" },
666 { 0x1af4, "QEMU" },
667 { 0x434d, "C-Media" },
668 { 0x8086, "Intel" },
669 { 0x8384, "SigmaTel" },
673 /* store the codec vendor name */
674 static int get_codec_vendor_name(struct hdac_device *codec) in get_codec_vendor_name() argument
677 u16 vendor_id = codec->vendor_id >> 16; in get_codec_vendor_name()
679 for (c = hda_vendor_ids; c->id; c++) { in get_codec_vendor_name()
680 if (c->id == vendor_id) { in get_codec_vendor_name()
681 codec->vendor_name = kstrdup(c->name, GFP_KERNEL); in get_codec_vendor_name()
682 return codec->vendor_name ? 0 : -ENOMEM; in get_codec_vendor_name()
686 codec->vendor_name = kasprintf(GFP_KERNEL, "Generic %04x", vendor_id); in get_codec_vendor_name()
687 return codec->vendor_name ? 0 : -ENOMEM; in get_codec_vendor_name()
701 (AC_FMT_BASE_##base##K | (((mult) - 1) << AC_FMT_MULT_SHIFT) | \
702 (((div) - 1) << AC_FMT_DIV_SHIFT))
725 { 0 } /* terminator */
729 * snd_hdac_calc_stream_format - calculate the format bitset
734 * @spdif_ctls: HD-audio SPDIF status bits (0 if irrelevant)
747 unsigned int val = 0; in snd_hdac_calc_stream_format()
749 for (i = 0; rate_bits[i].hz; i++) in snd_hdac_calc_stream_format()
755 return 0; in snd_hdac_calc_stream_format()
757 if (channels == 0 || channels > 8) in snd_hdac_calc_stream_format()
758 return 0; in snd_hdac_calc_stream_format()
759 val |= channels - 1; in snd_hdac_calc_stream_format()
779 return 0; in snd_hdac_calc_stream_format()
789 static unsigned int query_pcm_param(struct hdac_device *codec, hda_nid_t nid) in query_pcm_param() argument
791 unsigned int val = 0; in query_pcm_param()
793 if (nid != codec->afg && in query_pcm_param()
794 (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD)) in query_pcm_param()
795 val = snd_hdac_read_parm(codec, nid, AC_PAR_PCM); in query_pcm_param()
796 if (!val || val == -1) in query_pcm_param()
797 val = snd_hdac_read_parm(codec, codec->afg, AC_PAR_PCM); in query_pcm_param()
798 if (!val || val == -1) in query_pcm_param()
799 return 0; in query_pcm_param()
803 static unsigned int query_stream_param(struct hdac_device *codec, hda_nid_t nid) in query_stream_param() argument
805 unsigned int streams = snd_hdac_read_parm(codec, nid, AC_PAR_STREAM); in query_stream_param()
807 if (!streams || streams == -1) in query_stream_param()
808 streams = snd_hdac_read_parm(codec, codec->afg, AC_PAR_STREAM); in query_stream_param()
809 if (!streams || streams == -1) in query_stream_param()
810 return 0; in query_stream_param()
815 * snd_hdac_query_supported_pcm - query the supported PCM rates and formats
816 * @codec: the codec object
825 * Returns 0 if successful, otherwise a negative error code.
827 int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_query_supported_pcm() argument
832 wcaps = get_wcaps(codec, nid); in snd_hdac_query_supported_pcm()
833 val = query_pcm_param(codec, nid); in snd_hdac_query_supported_pcm()
836 u32 rates = 0; in snd_hdac_query_supported_pcm()
837 for (i = 0; i < AC_PAR_PCM_RATE_BITS; i++) { in snd_hdac_query_supported_pcm()
841 if (rates == 0) { in snd_hdac_query_supported_pcm()
842 dev_err(&codec->dev, in snd_hdac_query_supported_pcm()
843 "rates == 0 (nid=0x%x, val=0x%x, ovrd=%i)\n", in snd_hdac_query_supported_pcm()
845 (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0); in snd_hdac_query_supported_pcm()
846 return -EIO; in snd_hdac_query_supported_pcm()
852 u64 formats = 0; in snd_hdac_query_supported_pcm()
855 streams = query_stream_param(codec, nid); in snd_hdac_query_supported_pcm()
857 return -EIO; in snd_hdac_query_supported_pcm()
859 bps = 0; in snd_hdac_query_supported_pcm()
889 #if 0 /* FIXME: CS4206 doesn't work, which is the only codec supporting float */ in snd_hdac_query_supported_pcm()
904 if (formats == 0) { in snd_hdac_query_supported_pcm()
905 dev_err(&codec->dev, in snd_hdac_query_supported_pcm()
906 "formats == 0 (nid=0x%x, val=0x%x, ovrd=%i, streams=0x%x)\n", in snd_hdac_query_supported_pcm()
908 (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0, in snd_hdac_query_supported_pcm()
910 return -EIO; in snd_hdac_query_supported_pcm()
918 return 0; in snd_hdac_query_supported_pcm()
923 * snd_hdac_is_supported_format - Check the validity of the format
924 * @codec: the codec object
926 * @format: the HD-audio format value to check
932 bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid, in snd_hdac_is_supported_format() argument
936 unsigned int val = 0, rate, stream; in snd_hdac_is_supported_format()
938 val = query_pcm_param(codec, nid); in snd_hdac_is_supported_format()
942 rate = format & 0xff00; in snd_hdac_is_supported_format()
943 for (i = 0; i < AC_PAR_PCM_RATE_BITS; i++) in snd_hdac_is_supported_format()
952 stream = query_stream_param(codec, nid); in snd_hdac_is_supported_format()
957 switch (format & 0xf0) { in snd_hdac_is_supported_format()
958 case 0x00: in snd_hdac_is_supported_format()
962 case 0x10: in snd_hdac_is_supported_format()
966 case 0x20: in snd_hdac_is_supported_format()
970 case 0x30: in snd_hdac_is_supported_format()
974 case 0x40: in snd_hdac_is_supported_format()
996 return -1; in codec_read()
1010 * snd_hdac_codec_read - send a command and get the response
1019 * Returns the obtained response value, or -1 for an error.
1029 * snd_hdac_codec_write - send a single command without waiting for response
1038 * Returns 0 if successful, or a negative error code.
1048 * snd_hdac_check_power_state - check whether the actual power state matches
1060 unsigned int state = codec_read(hdac, nid, 0, in snd_hdac_check_power_state()
1061 AC_VERB_GET_POWER_STATE, 0); in snd_hdac_check_power_state()
1065 state = (state >> 4) & 0x0f; in snd_hdac_check_power_state()
1070 * snd_hdac_sync_power_state - wait until actual power state matches
1073 * @codec: the HDAC device
1077 * Return power state or PS_ERROR if codec rejects GET verb.
1079 unsigned int snd_hdac_sync_power_state(struct hdac_device *codec, in snd_hdac_sync_power_state() argument
1085 for (count = 0; count < 500; count++) { in snd_hdac_sync_power_state()
1086 state = snd_hdac_codec_read(codec, nid, 0, in snd_hdac_sync_power_state()
1087 AC_VERB_GET_POWER_STATE, 0); in snd_hdac_sync_power_state()
1092 actual_state = (state >> 4) & 0x0f; in snd_hdac_sync_power_state()
1097 /* wait until the codec reachs to the target state */ in snd_hdac_sync_power_state()