Lines Matching refs:codec

27 #define codec_in_pm(codec)		snd_hdac_is_in_pm(&codec->core)  argument
28 #define hda_codec_is_power_on(codec) snd_hdac_is_power_on(&codec->core) argument
29 #define codec_has_epss(codec) \ argument
30 ((codec)->core.power_caps & AC_PWRST_EPSS)
31 #define codec_has_clkstop(codec) \ argument
32 ((codec)->core.power_caps & AC_PWRST_CLKSTOP)
40 struct hda_codec *codec = container_of(dev, struct hda_codec, core); in codec_exec_verb() local
41 struct hda_bus *bus = codec->bus; in codec_exec_verb()
48 snd_hda_power_up_pm(codec); in codec_exec_verb()
52 err = snd_hdac_bus_exec_verb_unlocked(&bus->core, codec->core.addr, in codec_exec_verb()
56 snd_hda_power_down_pm(codec); in codec_exec_verb()
57 if (!codec_in_pm(codec) && res && err == -EAGAIN) { in codec_exec_verb()
59 codec_dbg(codec, in codec_exec_verb()
66 if (!err || codec_in_pm(codec)) in codec_exec_verb()
79 void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq) in snd_hda_sequence_write() argument
82 snd_hda_codec_write(codec, seq->nid, 0, seq->verb, seq->param); in snd_hda_sequence_write()
96 lookup_conn_list(struct hda_codec *codec, hda_nid_t nid) in lookup_conn_list() argument
99 list_for_each_entry(p, &codec->conn_list, list) { in lookup_conn_list()
106 static int add_conn_list(struct hda_codec *codec, hda_nid_t nid, int len, in add_conn_list() argument
117 list_add(&p->list, &codec->conn_list); in add_conn_list()
121 static void remove_conn_list(struct hda_codec *codec) in remove_conn_list() argument
123 while (!list_empty(&codec->conn_list)) { in remove_conn_list()
125 p = list_first_entry(&codec->conn_list, typeof(*p), list); in remove_conn_list()
132 static int read_and_add_raw_conns(struct hda_codec *codec, hda_nid_t nid) in read_and_add_raw_conns() argument
138 len = snd_hda_get_raw_connections(codec, nid, list, ARRAY_SIZE(list)); in read_and_add_raw_conns()
140 len = snd_hda_get_num_raw_conns(codec, nid); in read_and_add_raw_conns()
144 len = snd_hda_get_raw_connections(codec, nid, result, len); in read_and_add_raw_conns()
147 len = snd_hda_override_conn_list(codec, nid, len, result); in read_and_add_raw_conns()
168 int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid, in snd_hda_get_conn_list() argument
178 p = lookup_conn_list(codec, nid); in snd_hda_get_conn_list()
187 err = read_and_add_raw_conns(codec, nid); in snd_hda_get_conn_list()
207 int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid, in snd_hda_get_connections() argument
211 int len = snd_hda_get_conn_list(codec, nid, &list); in snd_hda_get_connections()
215 codec_err(codec, "Too many connections %d for NID 0x%x\n", in snd_hda_get_connections()
238 int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int len, in snd_hda_override_conn_list() argument
243 p = lookup_conn_list(codec, nid); in snd_hda_override_conn_list()
249 return add_conn_list(codec, nid, len, list); in snd_hda_override_conn_list()
264 int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux, in snd_hda_get_conn_index() argument
270 nums = snd_hda_get_conn_list(codec, mux, &conn); in snd_hda_get_conn_index()
277 codec_dbg(codec, "too deep connection for 0x%x\n", nid); in snd_hda_get_conn_index()
282 unsigned int type = get_wcaps_type(get_wcaps(codec, conn[i])); in snd_hda_get_conn_index()
285 if (snd_hda_get_conn_index(codec, conn[i], nid, recursive) >= 0) in snd_hda_get_conn_index()
300 unsigned int snd_hda_get_num_devices(struct hda_codec *codec, hda_nid_t nid) in snd_hda_get_num_devices() argument
302 unsigned int wcaps = get_wcaps(codec, nid); in snd_hda_get_num_devices()
305 if (!codec->dp_mst || !(wcaps & AC_WCAP_DIGITAL) || in snd_hda_get_num_devices()
309 parm = snd_hdac_read_parm_uncached(&codec->core, nid, AC_PAR_DEVLIST_LEN); in snd_hda_get_num_devices()
326 int snd_hda_get_devices(struct hda_codec *codec, hda_nid_t nid, in snd_hda_get_devices() argument
332 parm = snd_hda_get_num_devices(codec, nid); in snd_hda_get_devices()
341 if (snd_hdac_read(&codec->core, nid, in snd_hda_get_devices()
365 int snd_hda_get_dev_select(struct hda_codec *codec, hda_nid_t nid) in snd_hda_get_dev_select() argument
368 if (!codec->dp_mst) in snd_hda_get_dev_select()
371 return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_DEVICE_SEL, 0); in snd_hda_get_dev_select()
383 int snd_hda_set_dev_select(struct hda_codec *codec, hda_nid_t nid, int dev_id) in snd_hda_set_dev_select() argument
388 if (!codec->dp_mst) in snd_hda_set_dev_select()
392 num_devices = snd_hda_get_num_devices(codec, nid) + 1; in snd_hda_set_dev_select()
406 ret = snd_hda_codec_write(codec, nid, 0, in snd_hda_set_dev_select()
416 static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node) in read_widget_caps() argument
421 codec->wcaps = kmalloc_array(codec->core.num_nodes, 4, GFP_KERNEL); in read_widget_caps()
422 if (!codec->wcaps) in read_widget_caps()
424 nid = codec->core.start_nid; in read_widget_caps()
425 for (i = 0; i < codec->core.num_nodes; i++, nid++) in read_widget_caps()
426 codec->wcaps[i] = snd_hdac_read_parm_uncached(&codec->core, in read_widget_caps()
432 static int read_pin_defaults(struct hda_codec *codec) in read_pin_defaults() argument
436 for_each_hda_codec_node(nid, codec) { in read_pin_defaults()
438 unsigned int wcaps = get_wcaps(codec, nid); in read_pin_defaults()
442 pin = snd_array_new(&codec->init_pins); in read_pin_defaults()
446 pin->cfg = snd_hda_codec_read(codec, nid, 0, in read_pin_defaults()
452 pin->ctrl = snd_hda_codec_read(codec, nid, 0, in read_pin_defaults()
460 static struct hda_pincfg *look_up_pincfg(struct hda_codec *codec, in look_up_pincfg() argument
477 int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list, in snd_hda_add_pincfg() argument
482 pin = look_up_pincfg(codec, list, nid); in snd_hda_add_pincfg()
503 int snd_hda_codec_set_pincfg(struct hda_codec *codec, in snd_hda_codec_set_pincfg() argument
506 return snd_hda_add_pincfg(codec, &codec->driver_pins, nid, cfg); in snd_hda_codec_set_pincfg()
519 unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid) in snd_hda_codec_get_pincfg() argument
526 mutex_lock(&codec->user_mutex); in snd_hda_codec_get_pincfg()
527 pin = look_up_pincfg(codec, &codec->user_pins, nid); in snd_hda_codec_get_pincfg()
530 mutex_unlock(&codec->user_mutex); in snd_hda_codec_get_pincfg()
535 pin = look_up_pincfg(codec, &codec->driver_pins, nid); in snd_hda_codec_get_pincfg()
538 pin = look_up_pincfg(codec, &codec->init_pins, nid); in snd_hda_codec_get_pincfg()
555 int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid, in snd_hda_codec_set_pin_target() argument
560 pin = look_up_pincfg(codec, &codec->init_pins, nid); in snd_hda_codec_set_pin_target()
573 int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid) in snd_hda_codec_get_pin_target() argument
577 pin = look_up_pincfg(codec, &codec->init_pins, nid); in snd_hda_codec_get_pin_target()
591 void snd_hda_shutup_pins(struct hda_codec *codec) in snd_hda_shutup_pins() argument
599 if (codec->bus->shutdown) in snd_hda_shutup_pins()
601 snd_array_for_each(&codec->init_pins, i, pin) { in snd_hda_shutup_pins()
603 snd_hda_codec_read(codec, pin->nid, 0, in snd_hda_shutup_pins()
606 codec->pins_shutup = 1; in snd_hda_shutup_pins()
611 static void restore_shutup_pins(struct hda_codec *codec) in restore_shutup_pins() argument
616 if (!codec->pins_shutup) in restore_shutup_pins()
618 if (codec->bus->shutdown) in restore_shutup_pins()
620 snd_array_for_each(&codec->init_pins, i, pin) { in restore_shutup_pins()
621 snd_hda_codec_write(codec, pin->nid, 0, in restore_shutup_pins()
625 codec->pins_shutup = 0; in restore_shutup_pins()
630 struct hda_codec *codec = in hda_jackpoll_work() local
633 if (!codec->jackpoll_interval) in hda_jackpoll_work()
637 snd_hda_power_up(codec); in hda_jackpoll_work()
639 snd_hda_jack_set_dirty_all(codec); in hda_jackpoll_work()
640 snd_hda_jack_poll_all(codec); in hda_jackpoll_work()
641 schedule_delayed_work(&codec->jackpoll_work, codec->jackpoll_interval); in hda_jackpoll_work()
642 snd_hda_power_down(codec); in hda_jackpoll_work()
646 static void free_init_pincfgs(struct hda_codec *codec) in free_init_pincfgs() argument
648 snd_array_free(&codec->driver_pins); in free_init_pincfgs()
650 snd_array_free(&codec->user_pins); in free_init_pincfgs()
652 snd_array_free(&codec->init_pins); in free_init_pincfgs()
669 get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid) in get_hda_cvt_setup() argument
674 snd_array_for_each(&codec->cvt_setups, i, p) { in get_hda_cvt_setup()
678 p = snd_array_new(&codec->cvt_setups); in get_hda_cvt_setup()
689 if (refcount_dec_and_test(&pcm->codec->pcm_ref)) in snd_hda_codec_pcm_put()
690 wake_up(&pcm->codec->remove_sleep); in snd_hda_codec_pcm_put()
694 struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec, in snd_hda_codec_pcm_new() argument
704 pcm->codec = codec; in snd_hda_codec_pcm_new()
713 list_add_tail(&pcm->list, &codec->pcm_list_head); in snd_hda_codec_pcm_new()
714 refcount_inc(&codec->pcm_ref); in snd_hda_codec_pcm_new()
722 void snd_hda_codec_disconnect_pcms(struct hda_codec *codec) in snd_hda_codec_disconnect_pcms() argument
726 list_for_each_entry(pcm, &codec->pcm_list_head, list) { in snd_hda_codec_disconnect_pcms()
730 snd_device_disconnect(codec->card, pcm->pcm); in snd_hda_codec_disconnect_pcms()
736 static void codec_release_pcms(struct hda_codec *codec) in codec_release_pcms() argument
740 list_for_each_entry_safe(pcm, n, &codec->pcm_list_head, list) { in codec_release_pcms()
743 snd_device_free(pcm->codec->card, pcm->pcm); in codec_release_pcms()
744 clear_bit(pcm->device, pcm->codec->bus->pcm_dev_bits); in codec_release_pcms()
754 void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec) in snd_hda_codec_cleanup_for_unbind() argument
756 if (codec->core.registered) { in snd_hda_codec_cleanup_for_unbind()
758 pm_runtime_get_noresume(hda_codec_dev(codec)); in snd_hda_codec_cleanup_for_unbind()
759 pm_runtime_disable(hda_codec_dev(codec)); in snd_hda_codec_cleanup_for_unbind()
760 codec->core.registered = 0; in snd_hda_codec_cleanup_for_unbind()
763 snd_hda_codec_disconnect_pcms(codec); in snd_hda_codec_cleanup_for_unbind()
764 cancel_delayed_work_sync(&codec->jackpoll_work); in snd_hda_codec_cleanup_for_unbind()
765 if (!codec->in_freeing) in snd_hda_codec_cleanup_for_unbind()
766 snd_hda_ctls_clear(codec); in snd_hda_codec_cleanup_for_unbind()
767 codec_release_pcms(codec); in snd_hda_codec_cleanup_for_unbind()
768 snd_hda_detach_beep_device(codec); in snd_hda_codec_cleanup_for_unbind()
769 snd_hda_jack_tbl_clear(codec); in snd_hda_codec_cleanup_for_unbind()
770 codec->proc_widget_hook = NULL; in snd_hda_codec_cleanup_for_unbind()
771 codec->spec = NULL; in snd_hda_codec_cleanup_for_unbind()
774 snd_array_free(&codec->driver_pins); in snd_hda_codec_cleanup_for_unbind()
775 snd_array_free(&codec->cvt_setups); in snd_hda_codec_cleanup_for_unbind()
776 snd_array_free(&codec->spdif_out); in snd_hda_codec_cleanup_for_unbind()
777 snd_array_free(&codec->verbs); in snd_hda_codec_cleanup_for_unbind()
778 codec->follower_dig_outs = NULL; in snd_hda_codec_cleanup_for_unbind()
779 codec->spdif_status_reset = 0; in snd_hda_codec_cleanup_for_unbind()
780 snd_array_free(&codec->mixers); in snd_hda_codec_cleanup_for_unbind()
781 snd_array_free(&codec->nids); in snd_hda_codec_cleanup_for_unbind()
782 remove_conn_list(codec); in snd_hda_codec_cleanup_for_unbind()
783 snd_hdac_regmap_exit(&codec->core); in snd_hda_codec_cleanup_for_unbind()
784 codec->configured = 0; in snd_hda_codec_cleanup_for_unbind()
785 refcount_set(&codec->pcm_ref, 1); /* reset refcount */ in snd_hda_codec_cleanup_for_unbind()
789 static unsigned int hda_set_power_state(struct hda_codec *codec,
793 void snd_hda_codec_display_power(struct hda_codec *codec, bool enable) in snd_hda_codec_display_power() argument
795 if (codec->display_power_control) in snd_hda_codec_display_power()
796 snd_hdac_display_power(&codec->bus->core, codec->addr, enable); in snd_hda_codec_display_power()
805 void snd_hda_codec_register(struct hda_codec *codec) in snd_hda_codec_register() argument
807 if (codec->core.registered) in snd_hda_codec_register()
809 if (device_is_registered(hda_codec_dev(codec))) { in snd_hda_codec_register()
810 snd_hda_codec_display_power(codec, true); in snd_hda_codec_register()
811 pm_runtime_enable(hda_codec_dev(codec)); in snd_hda_codec_register()
813 snd_hda_power_down(codec); in snd_hda_codec_register()
814 codec->core.registered = 1; in snd_hda_codec_register()
829 void snd_hda_codec_unregister(struct hda_codec *codec) in snd_hda_codec_unregister() argument
831 codec->in_freeing = 1; in snd_hda_codec_unregister()
837 if (codec->core.type == HDA_DEV_LEGACY) in snd_hda_codec_unregister()
838 snd_hdac_device_unregister(&codec->core); in snd_hda_codec_unregister()
839 snd_hda_codec_display_power(codec, false); in snd_hda_codec_unregister()
845 if (codec->core.type == HDA_DEV_LEGACY) in snd_hda_codec_unregister()
846 put_device(hda_codec_dev(codec)); in snd_hda_codec_unregister()
858 struct hda_codec *codec = dev_to_hda_codec(dev); in snd_hda_codec_dev_release() local
860 free_init_pincfgs(codec); in snd_hda_codec_dev_release()
861 snd_hdac_device_exit(&codec->core); in snd_hda_codec_dev_release()
862 snd_hda_sysfs_clear(codec); in snd_hda_codec_dev_release()
863 kfree(codec->modelname); in snd_hda_codec_dev_release()
864 kfree(codec->wcaps); in snd_hda_codec_dev_release()
865 kfree(codec); in snd_hda_codec_dev_release()
884 struct hda_codec *codec; in snd_hda_codec_device_init() local
892 codec = kzalloc(sizeof(*codec), GFP_KERNEL); in snd_hda_codec_device_init()
893 if (!codec) in snd_hda_codec_device_init()
900 err = snd_hdac_device_init(&codec->core, &bus->core, name, codec_addr); in snd_hda_codec_device_init()
902 kfree(codec); in snd_hda_codec_device_init()
906 codec->bus = bus; in snd_hda_codec_device_init()
907 codec->depop_delay = -1; in snd_hda_codec_device_init()
908 codec->fixup_id = HDA_FIXUP_ID_NOT_SET; in snd_hda_codec_device_init()
909 codec->core.dev.release = snd_hda_codec_dev_release; in snd_hda_codec_device_init()
910 codec->core.type = HDA_DEV_LEGACY; in snd_hda_codec_device_init()
912 mutex_init(&codec->spdif_mutex); in snd_hda_codec_device_init()
913 mutex_init(&codec->control_mutex); in snd_hda_codec_device_init()
914 snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32); in snd_hda_codec_device_init()
915 snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32); in snd_hda_codec_device_init()
916 snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16); in snd_hda_codec_device_init()
917 snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16); in snd_hda_codec_device_init()
918 snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8); in snd_hda_codec_device_init()
919 snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16); in snd_hda_codec_device_init()
920 snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16); in snd_hda_codec_device_init()
921 snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8); in snd_hda_codec_device_init()
922 INIT_LIST_HEAD(&codec->conn_list); in snd_hda_codec_device_init()
923 INIT_LIST_HEAD(&codec->pcm_list_head); in snd_hda_codec_device_init()
924 INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work); in snd_hda_codec_device_init()
925 refcount_set(&codec->pcm_ref, 1); in snd_hda_codec_device_init()
926 init_waitqueue_head(&codec->remove_sleep); in snd_hda_codec_device_init()
928 return codec; in snd_hda_codec_device_init()
944 struct hda_codec *codec; in snd_hda_codec_new() local
947 codec = snd_hda_codec_device_init(bus, codec_addr, "hdaudioC%dD%d", in snd_hda_codec_new()
949 if (IS_ERR(codec)) in snd_hda_codec_new()
950 return PTR_ERR(codec); in snd_hda_codec_new()
951 *codecp = codec; in snd_hda_codec_new()
962 unsigned int codec_addr, struct hda_codec *codec, in snd_hda_codec_device_new() argument
980 codec->core.exec_verb = codec_exec_verb; in snd_hda_codec_device_new()
981 codec->card = card; in snd_hda_codec_device_new()
982 codec->addr = codec_addr; in snd_hda_codec_device_new()
984 codec->power_jiffies = jiffies; in snd_hda_codec_device_new()
986 snd_hda_sysfs_init(codec); in snd_hda_codec_device_new()
988 if (codec->bus->modelname) { in snd_hda_codec_device_new()
989 codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL); in snd_hda_codec_device_new()
990 if (!codec->modelname) in snd_hda_codec_device_new()
994 fg = codec->core.afg ? codec->core.afg : codec->core.mfg; in snd_hda_codec_device_new()
995 err = read_widget_caps(codec, fg); in snd_hda_codec_device_new()
998 err = read_pin_defaults(codec); in snd_hda_codec_device_new()
1003 hda_set_power_state(codec, AC_PWRST_D0); in snd_hda_codec_device_new()
1004 codec->core.dev.power.power_state = PMSG_ON; in snd_hda_codec_device_new()
1006 snd_hda_codec_proc_new(codec); in snd_hda_codec_device_new()
1008 snd_hda_create_hwdep(codec); in snd_hda_codec_device_new()
1010 sprintf(component, "HDA:%08x,%08x,%08x", codec->core.vendor_id, in snd_hda_codec_device_new()
1011 codec->core.subsystem_id, codec->core.revision_id); in snd_hda_codec_device_new()
1016 err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops); in snd_hda_codec_device_new()
1023 if (codec->core.dev.power.runtime_auto) in snd_hda_codec_device_new()
1024 pm_runtime_forbid(&codec->core.dev); in snd_hda_codec_device_new()
1027 pm_runtime_get_noresume(&codec->core.dev); in snd_hda_codec_device_new()
1041 int snd_hda_codec_update_widgets(struct hda_codec *codec) in snd_hda_codec_update_widgets() argument
1046 err = snd_hdac_refresh_widgets(&codec->core); in snd_hda_codec_update_widgets()
1053 kfree(codec->wcaps); in snd_hda_codec_update_widgets()
1054 fg = codec->core.afg ? codec->core.afg : codec->core.mfg; in snd_hda_codec_update_widgets()
1055 err = read_widget_caps(codec, fg); in snd_hda_codec_update_widgets()
1059 snd_array_free(&codec->init_pins); in snd_hda_codec_update_widgets()
1060 err = read_pin_defaults(codec); in snd_hda_codec_update_widgets()
1067 static void update_pcm_stream_id(struct hda_codec *codec, in update_pcm_stream_id() argument
1074 oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0); in update_pcm_stream_id()
1077 snd_hda_codec_write(codec, nid, 0, in update_pcm_stream_id()
1086 static void update_pcm_format(struct hda_codec *codec, struct hda_cvt_setup *p, in update_pcm_format() argument
1092 oldval = snd_hda_codec_read(codec, nid, 0, in update_pcm_format()
1096 snd_hda_codec_write(codec, nid, 0, in update_pcm_format()
1112 void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid, in snd_hda_codec_setup_stream() argument
1116 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in snd_hda_codec_setup_stream()
1125 codec_dbg(codec, in snd_hda_codec_setup_stream()
1128 p = get_hda_cvt_setup(codec, nid); in snd_hda_codec_setup_stream()
1133 driver->ops->stream_pm(codec, nid, true); in snd_hda_codec_setup_stream()
1134 if (codec->pcm_format_first) in snd_hda_codec_setup_stream()
1135 update_pcm_format(codec, p, nid, format); in snd_hda_codec_setup_stream()
1136 update_pcm_stream_id(codec, p, nid, stream_tag, channel_id); in snd_hda_codec_setup_stream()
1137 if (!codec->pcm_format_first) in snd_hda_codec_setup_stream()
1138 update_pcm_format(codec, p, nid, format); in snd_hda_codec_setup_stream()
1144 type = get_wcaps_type(get_wcaps(codec, nid)); in snd_hda_codec_setup_stream()
1145 list_for_each_codec(c, codec->bus) { in snd_hda_codec_setup_stream()
1155 static void really_cleanup_stream(struct hda_codec *codec,
1164 void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid, in __snd_hda_codec_cleanup_stream() argument
1172 if (codec->no_sticky_stream) in __snd_hda_codec_cleanup_stream()
1175 codec_dbg(codec, "hda_codec_cleanup_stream: NID=0x%x\n", nid); in __snd_hda_codec_cleanup_stream()
1176 p = get_hda_cvt_setup(codec, nid); in __snd_hda_codec_cleanup_stream()
1183 really_cleanup_stream(codec, p); in __snd_hda_codec_cleanup_stream()
1190 static void really_cleanup_stream(struct hda_codec *codec, in really_cleanup_stream() argument
1193 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in really_cleanup_stream()
1197 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0); in really_cleanup_stream()
1199 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0 in really_cleanup_stream()
1204 driver->ops->stream_pm(codec, nid, false); in really_cleanup_stream()
1208 static void purify_inactive_streams(struct hda_codec *codec) in purify_inactive_streams() argument
1214 list_for_each_codec(c, codec->bus) { in purify_inactive_streams()
1223 static void hda_cleanup_all_streams(struct hda_codec *codec) in hda_cleanup_all_streams() argument
1228 snd_array_for_each(&codec->cvt_setups, i, p) { in hda_cleanup_all_streams()
1230 really_cleanup_stream(codec, p); in hda_cleanup_all_streams()
1250 u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction) in query_amp_caps() argument
1252 if (!(get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD)) in query_amp_caps()
1253 nid = codec->core.afg; in query_amp_caps()
1254 return snd_hda_param_read(codec, nid, in query_amp_caps()
1269 bool snd_hda_check_amp_caps(struct hda_codec *codec, hda_nid_t nid, in snd_hda_check_amp_caps() argument
1274 if (get_wcaps(codec, nid) & (1 << (dir + 1))) in snd_hda_check_amp_caps()
1275 if (query_amp_caps(codec, nid, dir) & bits) in snd_hda_check_amp_caps()
1294 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir, in snd_hda_override_amp_caps() argument
1299 snd_hda_override_wcaps(codec, nid, in snd_hda_override_amp_caps()
1300 get_wcaps(codec, nid) | AC_WCAP_AMP_OVRD); in snd_hda_override_amp_caps()
1302 return snd_hdac_override_parm(&codec->core, nid, parm, caps); in snd_hda_override_amp_caps()
1306 static unsigned int encode_amp(struct hda_codec *codec, hda_nid_t nid, in encode_amp() argument
1312 if ((query_amp_caps(codec, nid, dir) & in encode_amp()
1330 int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, in snd_hda_codec_amp_update() argument
1333 unsigned int cmd = encode_amp(codec, nid, ch, dir, idx); in snd_hda_codec_amp_update()
1335 return snd_hdac_regmap_update_raw(&codec->core, cmd, mask, val); in snd_hda_codec_amp_update()
1351 int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid, in snd_hda_codec_amp_stereo() argument
1359 ret |= snd_hda_codec_amp_update(codec, nid, ch, direction, in snd_hda_codec_amp_stereo()
1379 int snd_hda_codec_amp_init(struct hda_codec *codec, hda_nid_t nid, int ch, in snd_hda_codec_amp_init() argument
1382 unsigned int cmd = encode_amp(codec, nid, ch, dir, idx); in snd_hda_codec_amp_init()
1384 if (!codec->core.regmap) in snd_hda_codec_amp_init()
1386 return snd_hdac_regmap_update_raw_once(&codec->core, cmd, mask, val); in snd_hda_codec_amp_init()
1401 int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid, in snd_hda_codec_amp_init_stereo() argument
1409 ret |= snd_hda_codec_amp_init(codec, nid, ch, dir, in snd_hda_codec_amp_init_stereo()
1415 static u32 get_amp_max_value(struct hda_codec *codec, hda_nid_t nid, int dir, in get_amp_max_value() argument
1418 u32 caps = query_amp_caps(codec, nid, dir); in get_amp_max_value()
1437 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_mixer_amp_volume_info() local
1446 uinfo->value.integer.max = get_amp_max_value(codec, nid, dir, ofs); in snd_hda_mixer_amp_volume_info()
1448 codec_warn(codec, in snd_hda_mixer_amp_volume_info()
1459 read_amp_value(struct hda_codec *codec, hda_nid_t nid, in read_amp_value() argument
1463 val = snd_hda_codec_amp_read(codec, nid, ch, dir, idx); in read_amp_value()
1473 update_amp_value(struct hda_codec *codec, hda_nid_t nid, in update_amp_value() argument
1482 maxval = get_amp_max_value(codec, nid, dir, 0); in update_amp_value()
1485 return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, in update_amp_value()
1500 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_mixer_amp_volume_get() local
1509 *valp++ = read_amp_value(codec, nid, 0, dir, idx, ofs); in snd_hda_mixer_amp_volume_get()
1511 *valp = read_amp_value(codec, nid, 1, dir, idx, ofs); in snd_hda_mixer_amp_volume_get()
1527 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_mixer_amp_volume_put() local
1538 err = update_amp_value(codec, nid, 0, dir, idx, ofs, *valp); in snd_hda_mixer_amp_volume_put()
1545 err = update_amp_value(codec, nid, 1, dir, idx, ofs, *valp); in snd_hda_mixer_amp_volume_put()
1557 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in get_ctl_amp_tlv() local
1564 caps = query_amp_caps(codec, nid, dir); in get_ctl_amp_tlv()
1613 void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir, in snd_hda_set_vmaster_tlv() argument
1619 caps = query_amp_caps(codec, nid, dir); in snd_hda_set_vmaster_tlv()
1632 find_mixer_ctl(struct hda_codec *codec, const char *name, int dev, int idx) in find_mixer_ctl() argument
1642 return snd_ctl_find_id(codec->card, &id); in find_mixer_ctl()
1652 struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec, in snd_hda_find_mixer_ctl() argument
1655 return find_mixer_ctl(codec, name, 0, 0); in snd_hda_find_mixer_ctl()
1659 static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name, in find_empty_mixer_ctl_idx() argument
1665 if (!find_mixer_ctl(codec, name, 0, idx)) in find_empty_mixer_ctl_idx()
1690 int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid, in snd_hda_ctl_add() argument
1706 err = snd_ctl_add(codec->card, kctl); in snd_hda_ctl_add()
1709 item = snd_array_new(&codec->mixers); in snd_hda_ctl_add()
1723 void snd_hda_ctls_clear(struct hda_codec *codec) in snd_hda_ctls_clear() argument
1726 struct hda_nid_item *items = codec->mixers.list; in snd_hda_ctls_clear()
1728 for (i = 0; i < codec->mixers.used; i++) in snd_hda_ctls_clear()
1729 snd_ctl_remove(codec->card, items[i].kctl); in snd_hda_ctls_clear()
1730 snd_array_free(&codec->mixers); in snd_hda_ctls_clear()
1731 snd_array_free(&codec->nids); in snd_hda_ctls_clear()
1743 struct hda_codec *codec; in snd_hda_lock_devices() local
1752 list_for_each_codec(codec, bus) { in snd_hda_lock_devices()
1754 list_for_each_entry(cpcm, &codec->pcm_list_head, list) { in snd_hda_lock_devices()
1797 int snd_hda_codec_reset(struct hda_codec *codec) in snd_hda_codec_reset() argument
1799 struct hda_bus *bus = codec->bus; in snd_hda_codec_reset()
1805 device_release_driver(hda_codec_dev(codec)); in snd_hda_codec_reset()
1815 static int map_followers(struct hda_codec *codec, const char * const *followers, in map_followers() argument
1822 items = codec->mixers.list; in map_followers()
1823 for (i = 0; i < codec->mixers.used; i++) { in map_followers()
1836 err = func(codec, data, sctl); in map_followers()
1846 static int check_follower_present(struct hda_codec *codec, in check_follower_present() argument
1867 struct hda_codec *codec; member
1884 codec_err(arg->codec, in init_follower_0dB()
1902 codec_err(arg->codec, in init_follower_0dB()
1926 static int add_follower(struct hda_codec *codec, in add_follower() argument
1952 int __snd_hda_add_vmaster(struct hda_codec *codec, char *name, in __snd_hda_add_vmaster() argument
1963 err = map_followers(codec, followers, suffix, check_follower_present, NULL); in __snd_hda_add_vmaster()
1965 codec_dbg(codec, "No follower found for %s\n", name); in __snd_hda_add_vmaster()
1972 err = snd_hda_ctl_add(codec, 0, kctl); in __snd_hda_add_vmaster()
1976 err = map_followers(codec, followers, suffix, add_follower, kctl); in __snd_hda_add_vmaster()
1984 .codec = codec, in __snd_hda_add_vmaster()
2003 hook->hook(hook->codec, enabled); in vmaster_hook()
2013 int snd_hda_add_vmaster_hook(struct hda_codec *codec, in snd_hda_add_vmaster_hook() argument
2018 hook->codec = codec; in snd_hda_add_vmaster_hook()
2033 if (!hook->hook || !hook->codec) in snd_hda_sync_vmaster_hook()
2038 if (hook->codec->bus->shutdown) in snd_hda_sync_vmaster_hook()
2077 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_mixer_amp_switch_get() local
2085 *valp++ = (snd_hda_codec_amp_read(codec, nid, 0, dir, idx) & in snd_hda_mixer_amp_switch_get()
2088 *valp = (snd_hda_codec_amp_read(codec, nid, 1, dir, idx) & in snd_hda_mixer_amp_switch_get()
2105 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_mixer_amp_switch_put() local
2116 change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx, in snd_hda_mixer_amp_switch_put()
2124 change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx, in snd_hda_mixer_amp_switch_put()
2128 hda_call_check_power_status(codec, nid); in snd_hda_mixer_amp_switch_put()
2169 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_default_get() local
2173 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_default_get()
2175 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_default_get()
2176 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_default_get()
2181 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_default_get()
2240 static void set_dig_out(struct hda_codec *codec, hda_nid_t nid, in set_dig_out() argument
2245 snd_hdac_regmap_update(&codec->core, nid, AC_VERB_SET_DIGI_CONVERT_1, in set_dig_out()
2247 d = codec->follower_dig_outs; in set_dig_out()
2251 snd_hdac_regmap_update(&codec->core, *d, in set_dig_out()
2255 static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid, in set_dig_out_convert() argument
2269 set_dig_out(codec, nid, mask, val); in set_dig_out_convert()
2275 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_default_put() local
2282 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_default_put()
2284 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_default_put()
2285 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_default_put()
2296 set_dig_out_convert(codec, nid, val & 0xff, (val >> 8) & 0xff); in snd_hda_spdif_default_put()
2297 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_default_put()
2306 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_out_switch_get() local
2310 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_out_switch_get()
2312 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_out_switch_get()
2313 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_out_switch_get()
2315 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_out_switch_get()
2319 static inline void set_spdif_ctls(struct hda_codec *codec, hda_nid_t nid, in set_spdif_ctls() argument
2322 set_dig_out_convert(codec, nid, dig1, dig2); in set_spdif_ctls()
2324 if ((get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) && in set_spdif_ctls()
2326 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0, in set_spdif_ctls()
2333 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_out_switch_put() local
2340 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_out_switch_put()
2342 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_out_switch_put()
2343 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_out_switch_put()
2351 set_spdif_ctls(codec, nid, val & 0xff, -1); in snd_hda_spdif_out_switch_put()
2352 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_out_switch_put()
2399 int snd_hda_create_dig_out_ctls(struct hda_codec *codec, in snd_hda_create_dig_out_ctls() argument
2411 struct hda_bus *bus = codec->bus; in snd_hda_create_dig_out_ctls()
2422 kctl = find_mixer_ctl(codec, dig_mix->name, 0, 0); in snd_hda_create_dig_out_ctls()
2427 err = snd_ctl_rename_id(codec->card, &kctl->id, &id); in snd_hda_create_dig_out_ctls()
2436 idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", idx); in snd_hda_create_dig_out_ctls()
2438 codec_err(codec, "too many IEC958 outputs\n"); in snd_hda_create_dig_out_ctls()
2441 spdif = snd_array_new(&codec->spdif_out); in snd_hda_create_dig_out_ctls()
2445 kctl = snd_ctl_new1(dig_mix, codec); in snd_hda_create_dig_out_ctls()
2449 kctl->private_value = codec->spdif_out.used - 1; in snd_hda_create_dig_out_ctls()
2450 err = snd_hda_ctl_add(codec, associated_nid, kctl); in snd_hda_create_dig_out_ctls()
2455 snd_hdac_regmap_read(&codec->core, cvt_nid, in snd_hda_create_dig_out_ctls()
2470 struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec, in snd_hda_spdif_out_of_nid() argument
2476 snd_array_for_each(&codec->spdif_out, i, spdif) { in snd_hda_spdif_out_of_nid()
2491 void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx) in snd_hda_spdif_ctls_unassign() argument
2495 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_ctls_unassign()
2497 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_ctls_unassign()
2498 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_ctls_unassign()
2500 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_ctls_unassign()
2512 void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid) in snd_hda_spdif_ctls_assign() argument
2517 if (WARN_ON(codec->spdif_out.used <= idx)) in snd_hda_spdif_ctls_assign()
2519 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_ctls_assign()
2520 spdif = snd_array_elem(&codec->spdif_out, idx); in snd_hda_spdif_ctls_assign()
2524 set_spdif_ctls(codec, nid, val & 0xff, (val >> 8) & 0xff); in snd_hda_spdif_ctls_assign()
2526 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_ctls_assign()
2562 int snd_hda_create_spdif_share_sw(struct hda_codec *codec, in snd_hda_create_spdif_share_sw() argument
2574 return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl); in snd_hda_create_spdif_share_sw()
2587 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_in_switch_get() local
2589 ucontrol->value.integer.value[0] = codec->spdif_in_enable; in snd_hda_spdif_in_switch_get()
2596 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_in_switch_put() local
2601 mutex_lock(&codec->spdif_mutex); in snd_hda_spdif_in_switch_put()
2602 change = codec->spdif_in_enable != val; in snd_hda_spdif_in_switch_put()
2604 codec->spdif_in_enable = val; in snd_hda_spdif_in_switch_put()
2605 snd_hdac_regmap_write(&codec->core, nid, in snd_hda_spdif_in_switch_put()
2608 mutex_unlock(&codec->spdif_mutex); in snd_hda_spdif_in_switch_put()
2615 struct hda_codec *codec = snd_kcontrol_chip(kcontrol); in snd_hda_spdif_in_status_get() local
2620 snd_hdac_regmap_read(&codec->core, nid, in snd_hda_spdif_in_status_get()
2658 int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid) in snd_hda_create_spdif_in_ctls() argument
2665 idx = find_empty_mixer_ctl_idx(codec, "IEC958 Capture Switch", 0); in snd_hda_create_spdif_in_ctls()
2667 codec_err(codec, "too many IEC958 inputs\n"); in snd_hda_create_spdif_in_ctls()
2671 kctl = snd_ctl_new1(dig_mix, codec); in snd_hda_create_spdif_in_ctls()
2675 err = snd_hda_ctl_add(codec, nid, kctl); in snd_hda_create_spdif_in_ctls()
2679 codec->spdif_in_enable = in snd_hda_create_spdif_in_ctls()
2680 snd_hda_codec_read(codec, nid, 0, in snd_hda_create_spdif_in_ctls()
2697 void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg, in snd_hda_codec_set_power_to_all() argument
2702 for_each_hda_codec_node(nid, codec) { in snd_hda_codec_set_power_to_all()
2703 unsigned int wcaps = get_wcaps(codec, nid); in snd_hda_codec_set_power_to_all()
2707 if (codec->power_filter) { in snd_hda_codec_set_power_to_all()
2708 state = codec->power_filter(codec, nid, power_state); in snd_hda_codec_set_power_to_all()
2712 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE, in snd_hda_codec_set_power_to_all()
2727 unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec, in snd_hda_codec_eapd_power_filter() argument
2731 if (nid == codec->core.afg || nid == codec->core.mfg) in snd_hda_codec_eapd_power_filter()
2734 get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN && in snd_hda_codec_eapd_power_filter()
2735 (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) { in snd_hda_codec_eapd_power_filter()
2736 int eapd = snd_hda_codec_read(codec, nid, 0, in snd_hda_codec_eapd_power_filter()
2748 static unsigned int hda_set_power_state(struct hda_codec *codec, in hda_set_power_state() argument
2751 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in hda_set_power_state()
2752 hda_nid_t fg = codec->core.afg ? codec->core.afg : codec->core.mfg; in hda_set_power_state()
2759 if (codec->depop_delay < 0) in hda_set_power_state()
2760 msleep(codec_has_epss(codec) ? 10 : 100); in hda_set_power_state()
2761 else if (codec->depop_delay > 0) in hda_set_power_state()
2762 msleep(codec->depop_delay); in hda_set_power_state()
2770 driver->ops->set_power_state(codec, fg, power_state); in hda_set_power_state()
2773 if (codec->power_filter) in hda_set_power_state()
2774 state = codec->power_filter(codec, fg, state); in hda_set_power_state()
2776 snd_hda_codec_read(codec, fg, flags, in hda_set_power_state()
2779 snd_hda_codec_set_power_to_all(codec, fg, power_state); in hda_set_power_state()
2781 state = snd_hda_sync_power_state(codec, fg, power_state); in hda_set_power_state()
2792 static void sync_power_up_states(struct hda_codec *codec) in sync_power_up_states() argument
2797 if (!codec->power_filter) in sync_power_up_states()
2800 for_each_hda_codec_node(nid, codec) { in sync_power_up_states()
2801 unsigned int wcaps = get_wcaps(codec, nid); in sync_power_up_states()
2805 target = codec->power_filter(codec, nid, AC_PWRST_D0); in sync_power_up_states()
2808 if (!snd_hda_check_power_state(codec, nid, target)) in sync_power_up_states()
2809 snd_hda_codec_write(codec, nid, 0, in sync_power_up_states()
2816 static void hda_exec_init_verbs(struct hda_codec *codec) in hda_exec_init_verbs() argument
2818 if (codec->init_verbs.list) in hda_exec_init_verbs()
2819 snd_hda_sequence_write(codec, codec->init_verbs.list); in hda_exec_init_verbs()
2822 static inline void hda_exec_init_verbs(struct hda_codec *codec) {} in hda_exec_init_verbs() argument
2826 static void update_power_acct(struct hda_codec *codec, bool on) in update_power_acct() argument
2828 unsigned long delta = jiffies - codec->power_jiffies; in update_power_acct()
2831 codec->power_on_acct += delta; in update_power_acct()
2833 codec->power_off_acct += delta; in update_power_acct()
2834 codec->power_jiffies += delta; in update_power_acct()
2837 void snd_hda_update_power_acct(struct hda_codec *codec) in snd_hda_update_power_acct() argument
2839 update_power_acct(codec, hda_codec_is_power_on(codec)); in snd_hda_update_power_acct()
2846 static unsigned int hda_call_codec_suspend(struct hda_codec *codec) in hda_call_codec_suspend() argument
2848 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in hda_call_codec_suspend()
2851 snd_hdac_enter_pm(&codec->core); in hda_call_codec_suspend()
2853 driver->ops->suspend(codec); in hda_call_codec_suspend()
2854 if (!codec->no_stream_clean_at_suspend) in hda_call_codec_suspend()
2855 hda_cleanup_all_streams(codec); in hda_call_codec_suspend()
2856 state = hda_set_power_state(codec, AC_PWRST_D3); in hda_call_codec_suspend()
2857 update_power_acct(codec, true); in hda_call_codec_suspend()
2858 snd_hdac_leave_pm(&codec->core); in hda_call_codec_suspend()
2865 static void hda_call_codec_resume(struct hda_codec *codec) in hda_call_codec_resume() argument
2867 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in hda_call_codec_resume()
2869 snd_hdac_enter_pm(&codec->core); in hda_call_codec_resume()
2870 if (codec->core.regmap) in hda_call_codec_resume()
2871 regcache_mark_dirty(codec->core.regmap); in hda_call_codec_resume()
2873 codec->power_jiffies = jiffies; in hda_call_codec_resume()
2875 hda_set_power_state(codec, AC_PWRST_D0); in hda_call_codec_resume()
2876 restore_shutup_pins(codec); in hda_call_codec_resume()
2877 hda_exec_init_verbs(codec); in hda_call_codec_resume()
2878 snd_hda_jack_set_dirty_all(codec); in hda_call_codec_resume()
2880 driver->ops->resume(codec); in hda_call_codec_resume()
2882 snd_hda_codec_init(codec); in hda_call_codec_resume()
2883 snd_hda_regmap_sync(codec); in hda_call_codec_resume()
2886 snd_hda_jack_report_sync(codec); in hda_call_codec_resume()
2887 codec->core.dev.power.power_state = PMSG_ON; in hda_call_codec_resume()
2888 snd_hdac_leave_pm(&codec->core); in hda_call_codec_resume()
2889 if (codec->jackpoll_interval) in hda_call_codec_resume()
2890 schedule_delayed_work(&codec->jackpoll_work, in hda_call_codec_resume()
2891 codec->jackpoll_interval); in hda_call_codec_resume()
2896 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_runtime_suspend() local
2900 if (!codec->card) in hda_codec_runtime_suspend()
2903 state = hda_call_codec_suspend(codec); in hda_codec_runtime_suspend()
2904 if (codec->link_down_at_suspend || in hda_codec_runtime_suspend()
2905 (codec_has_clkstop(codec) && codec_has_epss(codec) && in hda_codec_runtime_suspend()
2907 snd_hdac_codec_link_down(&codec->core); in hda_codec_runtime_suspend()
2908 snd_hda_codec_display_power(codec, false); in hda_codec_runtime_suspend()
2915 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_runtime_resume() local
2918 if (!codec->card) in hda_codec_runtime_resume()
2921 snd_hda_codec_display_power(codec, true); in hda_codec_runtime_resume()
2922 snd_hdac_codec_link_up(&codec->core); in hda_codec_runtime_resume()
2923 hda_call_codec_resume(codec); in hda_codec_runtime_resume()
2930 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_runtime_idle() local
2932 if (codec->jackpoll_interval && !codec->bus->jackpoll_in_suspend) in hda_codec_runtime_idle()
2939 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_pm_prepare() local
2941 cancel_delayed_work_sync(&codec->jackpoll_work); in hda_codec_pm_prepare()
2948 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_pm_complete() local
2954 if (pm_runtime_suspended(dev) && (codec->jackpoll_interval || in hda_codec_pm_complete()
2955 hda_codec_need_resume(codec) || codec->forced_resume)) in hda_codec_pm_complete()
2973 struct hda_codec *codec = dev_to_hda_codec(dev); in hda_codec_pm_freeze() local
2975 cancel_delayed_work_sync(&codec->jackpoll_work); in hda_codec_pm_freeze()
3007 void snd_hda_codec_shutdown(struct hda_codec *codec) in snd_hda_codec_shutdown() argument
3012 if (!codec->core.registered) in snd_hda_codec_shutdown()
3015 codec->jackpoll_interval = 0; /* don't poll any longer */ in snd_hda_codec_shutdown()
3016 cancel_delayed_work_sync(&codec->jackpoll_work); in snd_hda_codec_shutdown()
3017 list_for_each_entry(cpcm, &codec->pcm_list_head, list) in snd_hda_codec_shutdown()
3020 pm_runtime_force_suspend(hda_codec_dev(codec)); in snd_hda_codec_shutdown()
3021 pm_runtime_disable(hda_codec_dev(codec)); in snd_hda_codec_shutdown()
3027 static int add_std_chmaps(struct hda_codec *codec) in add_std_chmaps() argument
3032 list_for_each_entry(pcm, &codec->pcm_list_head, list) { in add_std_chmaps()
3065 int snd_hda_codec_build_controls(struct hda_codec *codec) in snd_hda_codec_build_controls() argument
3067 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in snd_hda_codec_build_controls()
3070 hda_exec_init_verbs(codec); in snd_hda_codec_build_controls()
3072 err = snd_hda_codec_init(codec); in snd_hda_codec_build_controls()
3077 err = driver->ops->build_controls(codec); in snd_hda_codec_build_controls()
3083 err = add_std_chmaps(codec); in snd_hda_codec_build_controls()
3087 snd_hda_jack_report_sync(codec); /* call at the last init point */ in snd_hda_codec_build_controls()
3088 if (codec->jackpoll_interval) in snd_hda_codec_build_controls()
3089 schedule_delayed_work(&codec->jackpoll_work, in snd_hda_codec_build_controls()
3090 codec->jackpoll_interval); in snd_hda_codec_build_controls()
3092 sync_power_up_states(codec); in snd_hda_codec_build_controls()
3101 struct hda_codec *codec, in hda_pcm_default_open_close() argument
3108 struct hda_codec *codec, in hda_pcm_default_prepare() argument
3113 snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format); in hda_pcm_default_prepare()
3118 struct hda_codec *codec, in hda_pcm_default_cleanup() argument
3121 snd_hda_codec_cleanup_stream(codec, hinfo->nid); in hda_pcm_default_cleanup()
3125 static int set_pcm_default_values(struct hda_codec *codec, in set_pcm_default_values() argument
3132 err = snd_hda_query_supported_pcm(codec, info->nid, in set_pcm_default_values()
3171 int snd_hda_codec_prepare(struct hda_codec *codec, in snd_hda_codec_prepare() argument
3178 mutex_lock(&codec->bus->prepare_mutex); in snd_hda_codec_prepare()
3180 ret = hinfo->ops.prepare(hinfo, codec, stream, format, in snd_hda_codec_prepare()
3185 purify_inactive_streams(codec); in snd_hda_codec_prepare()
3186 mutex_unlock(&codec->bus->prepare_mutex); in snd_hda_codec_prepare()
3199 void snd_hda_codec_cleanup(struct hda_codec *codec, in snd_hda_codec_cleanup() argument
3203 mutex_lock(&codec->bus->prepare_mutex); in snd_hda_codec_cleanup()
3205 hinfo->ops.cleanup(hinfo, codec, substream); in snd_hda_codec_cleanup()
3206 mutex_unlock(&codec->bus->prepare_mutex); in snd_hda_codec_cleanup()
3264 int snd_hda_codec_parse_pcms(struct hda_codec *codec) in snd_hda_codec_parse_pcms() argument
3266 struct hda_codec_driver *driver = hda_codec_to_driver(codec); in snd_hda_codec_parse_pcms()
3270 if (!list_empty(&codec->pcm_list_head)) in snd_hda_codec_parse_pcms()
3276 err = driver->ops->build_pcms(codec); in snd_hda_codec_parse_pcms()
3278 codec_err(codec, "cannot build PCMs for #%d (error %d)\n", in snd_hda_codec_parse_pcms()
3279 codec->core.addr, err); in snd_hda_codec_parse_pcms()
3283 list_for_each_entry(cpcm, &codec->pcm_list_head, list) { in snd_hda_codec_parse_pcms()
3291 err = set_pcm_default_values(codec, info); in snd_hda_codec_parse_pcms()
3293 codec_warn(codec, in snd_hda_codec_parse_pcms()
3306 int snd_hda_codec_build_pcms(struct hda_codec *codec) in snd_hda_codec_build_pcms() argument
3308 struct hda_bus *bus = codec->bus; in snd_hda_codec_build_pcms()
3312 err = snd_hda_codec_parse_pcms(codec); in snd_hda_codec_build_pcms()
3317 list_for_each_entry(cpcm, &codec->pcm_list_head, list) { in snd_hda_codec_build_pcms()
3329 err = snd_hda_attach_pcm_stream(bus, codec, cpcm); in snd_hda_codec_build_pcms()
3331 codec_err(codec, in snd_hda_codec_build_pcms()
3333 dev, codec->core.addr); in snd_hda_codec_build_pcms()
3351 int snd_hda_add_new_ctls(struct hda_codec *codec, in snd_hda_add_new_ctls() argument
3362 kctl = snd_ctl_new1(knew, codec); in snd_hda_add_new_ctls()
3370 if (addr > 0 && codec->ctl_dev_id) in snd_hda_add_new_ctls()
3374 err = snd_hda_ctl_add(codec, 0, kctl); in snd_hda_add_new_ctls()
3381 if (!addr && codec->core.addr) { in snd_hda_add_new_ctls()
3382 addr = codec->core.addr; in snd_hda_add_new_ctls()
3383 if (!codec->ctl_dev_id) in snd_hda_add_new_ctls()
3386 idx = find_empty_mixer_ctl_idx(codec, in snd_hda_add_new_ctls()
3403 void snd_hda_codec_set_power_save(struct hda_codec *codec, int delay) in snd_hda_codec_set_power_save() argument
3405 struct device *dev = hda_codec_dev(codec); in snd_hda_codec_set_power_save()
3407 if (delay == 0 && codec->auto_runtime_pm) in snd_hda_codec_set_power_save()
3452 int snd_hda_check_amp_list_power(struct hda_codec *codec, in snd_hda_check_amp_list_power() argument
3470 v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir, in snd_hda_check_amp_list_power()
3475 snd_hda_power_up_pm(codec); in snd_hda_check_amp_list_power()
3483 snd_hda_power_down_pm(codec); in snd_hda_check_amp_list_power()
3524 int snd_hda_input_mux_put(struct hda_codec *codec, in snd_hda_input_mux_put() argument
3539 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, in snd_hda_input_mux_put()
3579 static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid, in setup_dig_out_stream() argument
3586 spdif = snd_hda_spdif_out_of_nid(codec, nid); in setup_dig_out_stream()
3593 curr_fmt = snd_hda_codec_read(codec, nid, 0, in setup_dig_out_stream()
3595 reset = codec->spdif_status_reset && in setup_dig_out_stream()
3602 set_dig_out_convert(codec, nid, in setup_dig_out_stream()
3605 snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format); in setup_dig_out_stream()
3606 if (codec->follower_dig_outs) { in setup_dig_out_stream()
3608 for (d = codec->follower_dig_outs; *d; d++) in setup_dig_out_stream()
3609 snd_hda_codec_setup_stream(codec, *d, stream_tag, 0, in setup_dig_out_stream()
3614 set_dig_out_convert(codec, nid, in setup_dig_out_stream()
3618 static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid) in cleanup_dig_out_stream() argument
3620 snd_hda_codec_cleanup_stream(codec, nid); in cleanup_dig_out_stream()
3621 if (codec->follower_dig_outs) { in cleanup_dig_out_stream()
3623 for (d = codec->follower_dig_outs; *d; d++) in cleanup_dig_out_stream()
3624 snd_hda_codec_cleanup_stream(codec, *d); in cleanup_dig_out_stream()
3633 int snd_hda_multi_out_dig_open(struct hda_codec *codec, in snd_hda_multi_out_dig_open() argument
3636 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_dig_open()
3639 cleanup_dig_out_stream(codec, mout->dig_out_nid); in snd_hda_multi_out_dig_open()
3641 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_dig_open()
3654 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec, in snd_hda_multi_out_dig_prepare() argument
3660 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_dig_prepare()
3661 setup_dig_out_stream(codec, mout->dig_out_nid, stream_tag, format); in snd_hda_multi_out_dig_prepare()
3662 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_dig_prepare()
3672 int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec, in snd_hda_multi_out_dig_cleanup() argument
3675 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_dig_cleanup()
3676 cleanup_dig_out_stream(codec, mout->dig_out_nid); in snd_hda_multi_out_dig_cleanup()
3677 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_dig_cleanup()
3687 int snd_hda_multi_out_dig_close(struct hda_codec *codec, in snd_hda_multi_out_dig_close() argument
3690 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_dig_close()
3692 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_dig_close()
3708 int snd_hda_multi_out_analog_open(struct hda_codec *codec, in snd_hda_multi_out_analog_open() argument
3726 snd_hda_query_supported_pcm(codec, mout->dig_out_nid, in snd_hda_multi_out_analog_open()
3732 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_analog_open()
3745 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_analog_open()
3763 int snd_hda_multi_out_analog_prepare(struct hda_codec *codec, in snd_hda_multi_out_analog_prepare() argument
3774 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_analog_prepare()
3775 spdif = snd_hda_spdif_out_of_nid(codec, mout->dig_out_nid); in snd_hda_multi_out_analog_prepare()
3779 snd_hda_is_supported_format(codec, mout->dig_out_nid, in snd_hda_multi_out_analog_prepare()
3783 setup_dig_out_stream(codec, mout->dig_out_nid, in snd_hda_multi_out_analog_prepare()
3787 cleanup_dig_out_stream(codec, mout->dig_out_nid); in snd_hda_multi_out_analog_prepare()
3790 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_analog_prepare()
3793 snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag, in snd_hda_multi_out_analog_prepare()
3798 snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag, in snd_hda_multi_out_analog_prepare()
3803 snd_hda_codec_setup_stream(codec, in snd_hda_multi_out_analog_prepare()
3810 snd_hda_codec_setup_stream(codec, nids[i], stream_tag, in snd_hda_multi_out_analog_prepare()
3813 snd_hda_codec_setup_stream(codec, nids[i], stream_tag, in snd_hda_multi_out_analog_prepare()
3826 snd_hda_codec_setup_stream(codec, mout->extra_out_nid[i], in snd_hda_multi_out_analog_prepare()
3839 int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec, in snd_hda_multi_out_analog_cleanup() argument
3846 snd_hda_codec_cleanup_stream(codec, nids[i]); in snd_hda_multi_out_analog_cleanup()
3848 snd_hda_codec_cleanup_stream(codec, mout->hp_nid); in snd_hda_multi_out_analog_cleanup()
3851 snd_hda_codec_cleanup_stream(codec, in snd_hda_multi_out_analog_cleanup()
3855 snd_hda_codec_cleanup_stream(codec, in snd_hda_multi_out_analog_cleanup()
3857 mutex_lock(&codec->spdif_mutex); in snd_hda_multi_out_analog_cleanup()
3859 cleanup_dig_out_stream(codec, mout->dig_out_nid); in snd_hda_multi_out_analog_cleanup()
3862 mutex_unlock(&codec->spdif_mutex); in snd_hda_multi_out_analog_cleanup()
3875 unsigned int snd_hda_get_default_vref(struct hda_codec *codec, hda_nid_t pin) in snd_hda_get_default_vref() argument
3879 oldval = snd_hda_codec_read(codec, pin, 0, in snd_hda_get_default_vref()
3881 pincap = snd_hda_query_pin_caps(codec, pin); in snd_hda_get_default_vref()
3902 unsigned int snd_hda_correct_pin_ctl(struct hda_codec *codec, in snd_hda_correct_pin_ctl() argument
3915 cap = snd_hda_query_pin_caps(codec, pin); in snd_hda_correct_pin_ctl()
3965 int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin, in _snd_hda_set_pin_ctl() argument
3968 val = snd_hda_correct_pin_ctl(codec, pin, val); in _snd_hda_set_pin_ctl()
3969 snd_hda_codec_set_pin_target(codec, pin, val); in _snd_hda_set_pin_ctl()
3971 return snd_hda_codec_write_cache(codec, pin, 0, in _snd_hda_set_pin_ctl()
3974 return snd_hda_codec_write(codec, pin, 0, in _snd_hda_set_pin_ctl()
3991 int snd_hda_add_imux_item(struct hda_codec *codec, in snd_hda_add_imux_item() argument
3997 codec_err(codec, "hda_codec: Too many imux items!\n"); in snd_hda_add_imux_item()
4025 struct hda_codec *codec; in snd_hda_bus_reset_codecs() local
4027 list_for_each_codec(codec, bus) { in snd_hda_bus_reset_codecs()
4029 if (current_work() != &codec->jackpoll_work.work) in snd_hda_bus_reset_codecs()
4030 cancel_delayed_work_sync(&codec->jackpoll_work); in snd_hda_bus_reset_codecs()
4031 if (hda_codec_is_power_on(codec)) { in snd_hda_bus_reset_codecs()
4032 hda_call_codec_suspend(codec); in snd_hda_bus_reset_codecs()
4033 hda_call_codec_resume(codec); in snd_hda_bus_reset_codecs()