This source file includes following definitions.
- default_release
- snd_hdac_device_init
- snd_hdac_device_exit
- snd_hdac_device_register
- snd_hdac_device_unregister
- snd_hdac_device_set_chip_name
- snd_hdac_codec_modalias
- snd_hdac_make_cmd
- snd_hdac_exec_verb
- snd_hdac_read
- _snd_hdac_read_parm
- snd_hdac_read_parm_uncached
- snd_hdac_override_parm
- snd_hdac_get_sub_nodes
- setup_fg_nodes
- snd_hdac_refresh_widgets
- get_num_conns
- snd_hdac_get_connections
- snd_hdac_power_up
- snd_hdac_power_down
- snd_hdac_power_up_pm
- snd_hdac_keep_power_up
- snd_hdac_power_down_pm
- get_codec_vendor_name
- snd_hdac_calc_stream_format
- query_pcm_param
- query_stream_param
- snd_hdac_query_supported_pcm
- snd_hdac_is_supported_format
- codec_read
- codec_write
- snd_hdac_codec_read
- snd_hdac_codec_write
- snd_hdac_check_power_state
- snd_hdac_sync_power_state
1
2
3
4
5
6 #include <linux/init.h>
7 #include <linux/delay.h>
8 #include <linux/device.h>
9 #include <linux/slab.h>
10 #include <linux/module.h>
11 #include <linux/export.h>
12 #include <linux/pm_runtime.h>
13 #include <sound/hdaudio.h>
14 #include <sound/hda_regmap.h>
15 #include <sound/pcm.h>
16 #include "local.h"
17
18 static void setup_fg_nodes(struct hdac_device *codec);
19 static int get_codec_vendor_name(struct hdac_device *codec);
20
21 static void default_release(struct device *dev)
22 {
23 snd_hdac_device_exit(container_of(dev, struct hdac_device, dev));
24 }
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 int snd_hdac_device_init(struct hdac_device *codec, struct hdac_bus *bus,
41 const char *name, unsigned int addr)
42 {
43 struct device *dev;
44 hda_nid_t fg;
45 int err;
46
47 dev = &codec->dev;
48 device_initialize(dev);
49 dev->parent = bus->dev;
50 dev->bus = &snd_hda_bus_type;
51 dev->release = default_release;
52 dev->groups = hdac_dev_attr_groups;
53 dev_set_name(dev, "%s", name);
54 device_enable_async_suspend(dev);
55
56 codec->bus = bus;
57 codec->addr = addr;
58 codec->type = HDA_DEV_CORE;
59 mutex_init(&codec->widget_lock);
60 mutex_init(&codec->regmap_lock);
61 pm_runtime_set_active(&codec->dev);
62 pm_runtime_get_noresume(&codec->dev);
63 atomic_set(&codec->in_pm, 0);
64
65 err = snd_hdac_bus_add_device(bus, codec);
66 if (err < 0)
67 goto error;
68
69
70 codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT,
71 AC_PAR_VENDOR_ID);
72 if (codec->vendor_id == -1) {
73
74
75
76 codec->vendor_id = snd_hdac_read_parm(codec, AC_NODE_ROOT,
77 AC_PAR_VENDOR_ID);
78 }
79
80 codec->subsystem_id = snd_hdac_read_parm(codec, AC_NODE_ROOT,
81 AC_PAR_SUBSYSTEM_ID);
82 codec->revision_id = snd_hdac_read_parm(codec, AC_NODE_ROOT,
83 AC_PAR_REV_ID);
84
85 setup_fg_nodes(codec);
86 if (!codec->afg && !codec->mfg) {
87 dev_err(dev, "no AFG or MFG node found\n");
88 err = -ENODEV;
89 goto error;
90 }
91
92 fg = codec->afg ? codec->afg : codec->mfg;
93
94 err = snd_hdac_refresh_widgets(codec);
95 if (err < 0)
96 goto error;
97
98 codec->power_caps = snd_hdac_read_parm(codec, fg, AC_PAR_POWER_STATE);
99
100 if (codec->subsystem_id == -1 || codec->subsystem_id == 0)
101 snd_hdac_read(codec, fg, AC_VERB_GET_SUBSYSTEM_ID, 0,
102 &codec->subsystem_id);
103
104 err = get_codec_vendor_name(codec);
105 if (err < 0)
106 goto error;
107
108 codec->chip_name = kasprintf(GFP_KERNEL, "ID %x",
109 codec->vendor_id & 0xffff);
110 if (!codec->chip_name) {
111 err = -ENOMEM;
112 goto error;
113 }
114
115 return 0;
116
117 error:
118 put_device(&codec->dev);
119 return err;
120 }
121 EXPORT_SYMBOL_GPL(snd_hdac_device_init);
122
123
124
125
126
127 void snd_hdac_device_exit(struct hdac_device *codec)
128 {
129 pm_runtime_put_noidle(&codec->dev);
130 snd_hdac_bus_remove_device(codec->bus, codec);
131 kfree(codec->vendor_name);
132 kfree(codec->chip_name);
133 }
134 EXPORT_SYMBOL_GPL(snd_hdac_device_exit);
135
136
137
138
139
140 int snd_hdac_device_register(struct hdac_device *codec)
141 {
142 int err;
143
144 err = device_add(&codec->dev);
145 if (err < 0)
146 return err;
147 mutex_lock(&codec->widget_lock);
148 err = hda_widget_sysfs_init(codec);
149 mutex_unlock(&codec->widget_lock);
150 if (err < 0) {
151 device_del(&codec->dev);
152 return err;
153 }
154
155 return 0;
156 }
157 EXPORT_SYMBOL_GPL(snd_hdac_device_register);
158
159
160
161
162
163 void snd_hdac_device_unregister(struct hdac_device *codec)
164 {
165 if (device_is_registered(&codec->dev)) {
166 mutex_lock(&codec->widget_lock);
167 hda_widget_sysfs_exit(codec);
168 mutex_unlock(&codec->widget_lock);
169 device_del(&codec->dev);
170 snd_hdac_bus_remove_device(codec->bus, codec);
171 }
172 }
173 EXPORT_SYMBOL_GPL(snd_hdac_device_unregister);
174
175
176
177
178
179
180
181
182 int snd_hdac_device_set_chip_name(struct hdac_device *codec, const char *name)
183 {
184 char *newname;
185
186 if (!name)
187 return 0;
188 newname = kstrdup(name, GFP_KERNEL);
189 if (!newname)
190 return -ENOMEM;
191 kfree(codec->chip_name);
192 codec->chip_name = newname;
193 return 0;
194 }
195 EXPORT_SYMBOL_GPL(snd_hdac_device_set_chip_name);
196
197
198
199
200
201
202
203
204
205 int snd_hdac_codec_modalias(struct hdac_device *codec, char *buf, size_t size)
206 {
207 return snprintf(buf, size, "hdaudio:v%08Xr%08Xa%02X\n",
208 codec->vendor_id, codec->revision_id, codec->type);
209 }
210 EXPORT_SYMBOL_GPL(snd_hdac_codec_modalias);
211
212
213
214
215
216
217
218
219
220
221
222 static unsigned int snd_hdac_make_cmd(struct hdac_device *codec, hda_nid_t nid,
223 unsigned int verb, unsigned int parm)
224 {
225 u32 val, addr;
226
227 addr = codec->addr;
228 if ((addr & ~0xf) || (nid & ~0x7f) ||
229 (verb & ~0xfff) || (parm & ~0xffff)) {
230 dev_err(&codec->dev, "out of range cmd %x:%x:%x:%x\n",
231 addr, nid, verb, parm);
232 return -1;
233 }
234
235 val = addr << 28;
236 val |= (u32)nid << 20;
237 val |= verb << 8;
238 val |= parm;
239 return val;
240 }
241
242
243
244
245
246
247
248
249
250
251
252
253
254 int snd_hdac_exec_verb(struct hdac_device *codec, unsigned int cmd,
255 unsigned int flags, unsigned int *res)
256 {
257 if (codec->exec_verb)
258 return codec->exec_verb(codec, cmd, flags, res);
259 return snd_hdac_bus_exec_verb(codec->bus, codec->addr, cmd, res);
260 }
261
262
263
264
265
266
267
268
269
270
271
272
273 int snd_hdac_read(struct hdac_device *codec, hda_nid_t nid,
274 unsigned int verb, unsigned int parm, unsigned int *res)
275 {
276 unsigned int cmd = snd_hdac_make_cmd(codec, nid, verb, parm);
277
278 return snd_hdac_exec_verb(codec, cmd, 0, res);
279 }
280 EXPORT_SYMBOL_GPL(snd_hdac_read);
281
282
283
284
285
286
287 int _snd_hdac_read_parm(struct hdac_device *codec, hda_nid_t nid, int parm,
288 unsigned int *res)
289 {
290 unsigned int cmd;
291
292 cmd = snd_hdac_regmap_encode_verb(nid, AC_VERB_PARAMETERS) | parm;
293 return snd_hdac_regmap_read_raw(codec, cmd, res);
294 }
295 EXPORT_SYMBOL_GPL(_snd_hdac_read_parm);
296
297
298
299
300
301
302
303
304
305
306 int snd_hdac_read_parm_uncached(struct hdac_device *codec, hda_nid_t nid,
307 int parm)
308 {
309 unsigned int cmd, val;
310
311 cmd = snd_hdac_regmap_encode_verb(nid, AC_VERB_PARAMETERS) | parm;
312 if (snd_hdac_regmap_read_raw_uncached(codec, cmd, &val) < 0)
313 return -1;
314 return val;
315 }
316 EXPORT_SYMBOL_GPL(snd_hdac_read_parm_uncached);
317
318
319
320
321
322
323
324
325 int snd_hdac_override_parm(struct hdac_device *codec, hda_nid_t nid,
326 unsigned int parm, unsigned int val)
327 {
328 unsigned int verb = (AC_VERB_PARAMETERS << 8) | (nid << 20) | parm;
329 int err;
330
331 if (!codec->regmap)
332 return -EINVAL;
333
334 codec->caps_overwriting = true;
335 err = snd_hdac_regmap_write_raw(codec, verb, val);
336 codec->caps_overwriting = false;
337 return err;
338 }
339 EXPORT_SYMBOL_GPL(snd_hdac_override_parm);
340
341
342
343
344
345
346
347
348
349
350 int snd_hdac_get_sub_nodes(struct hdac_device *codec, hda_nid_t nid,
351 hda_nid_t *start_id)
352 {
353 unsigned int parm;
354
355 parm = snd_hdac_read_parm_uncached(codec, nid, AC_PAR_NODE_COUNT);
356 if (parm == -1) {
357 *start_id = 0;
358 return 0;
359 }
360 *start_id = (parm >> 16) & 0x7fff;
361 return (int)(parm & 0x7fff);
362 }
363 EXPORT_SYMBOL_GPL(snd_hdac_get_sub_nodes);
364
365
366
367
368 static void setup_fg_nodes(struct hdac_device *codec)
369 {
370 int i, total_nodes, function_id;
371 hda_nid_t nid;
372
373 total_nodes = snd_hdac_get_sub_nodes(codec, AC_NODE_ROOT, &nid);
374 for (i = 0; i < total_nodes; i++, nid++) {
375 function_id = snd_hdac_read_parm(codec, nid,
376 AC_PAR_FUNCTION_TYPE);
377 switch (function_id & 0xff) {
378 case AC_GRP_AUDIO_FUNCTION:
379 codec->afg = nid;
380 codec->afg_function_id = function_id & 0xff;
381 codec->afg_unsol = (function_id >> 8) & 1;
382 break;
383 case AC_GRP_MODEM_FUNCTION:
384 codec->mfg = nid;
385 codec->mfg_function_id = function_id & 0xff;
386 codec->mfg_unsol = (function_id >> 8) & 1;
387 break;
388 default:
389 break;
390 }
391 }
392 }
393
394
395
396
397
398 int snd_hdac_refresh_widgets(struct hdac_device *codec)
399 {
400 hda_nid_t start_nid;
401 int nums, err = 0;
402
403
404
405
406
407 mutex_lock(&codec->widget_lock);
408 nums = snd_hdac_get_sub_nodes(codec, codec->afg, &start_nid);
409 if (!start_nid || nums <= 0 || nums >= 0xff) {
410 dev_err(&codec->dev, "cannot read sub nodes for FG 0x%02x\n",
411 codec->afg);
412 err = -EINVAL;
413 goto unlock;
414 }
415
416 err = hda_widget_sysfs_reinit(codec, start_nid, nums);
417 if (err < 0)
418 goto unlock;
419
420 codec->num_nodes = nums;
421 codec->start_nid = start_nid;
422 codec->end_nid = start_nid + nums;
423 unlock:
424 mutex_unlock(&codec->widget_lock);
425 return err;
426 }
427 EXPORT_SYMBOL_GPL(snd_hdac_refresh_widgets);
428
429
430 static unsigned int get_num_conns(struct hdac_device *codec, hda_nid_t nid)
431 {
432 unsigned int wcaps = get_wcaps(codec, nid);
433 unsigned int parm;
434
435 if (!(wcaps & AC_WCAP_CONN_LIST) &&
436 get_wcaps_type(wcaps) != AC_WID_VOL_KNB)
437 return 0;
438
439 parm = snd_hdac_read_parm(codec, nid, AC_PAR_CONNLIST_LEN);
440 if (parm == -1)
441 parm = 0;
442 return parm;
443 }
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458 int snd_hdac_get_connections(struct hdac_device *codec, hda_nid_t nid,
459 hda_nid_t *conn_list, int max_conns)
460 {
461 unsigned int parm;
462 int i, conn_len, conns, err;
463 unsigned int shift, num_elems, mask;
464 hda_nid_t prev_nid;
465 int null_count = 0;
466
467 parm = get_num_conns(codec, nid);
468 if (!parm)
469 return 0;
470
471 if (parm & AC_CLIST_LONG) {
472
473 shift = 16;
474 num_elems = 2;
475 } else {
476
477 shift = 8;
478 num_elems = 4;
479 }
480 conn_len = parm & AC_CLIST_LENGTH;
481 mask = (1 << (shift-1)) - 1;
482
483 if (!conn_len)
484 return 0;
485
486 if (conn_len == 1) {
487
488 err = snd_hdac_read(codec, nid, AC_VERB_GET_CONNECT_LIST, 0,
489 &parm);
490 if (err < 0)
491 return err;
492 if (conn_list)
493 conn_list[0] = parm & mask;
494 return 1;
495 }
496
497
498 conns = 0;
499 prev_nid = 0;
500 for (i = 0; i < conn_len; i++) {
501 int range_val;
502 hda_nid_t val, n;
503
504 if (i % num_elems == 0) {
505 err = snd_hdac_read(codec, nid,
506 AC_VERB_GET_CONNECT_LIST, i,
507 &parm);
508 if (err < 0)
509 return -EIO;
510 }
511 range_val = !!(parm & (1 << (shift-1)));
512 val = parm & mask;
513 if (val == 0 && null_count++) {
514 dev_dbg(&codec->dev,
515 "invalid CONNECT_LIST verb %x[%i]:%x\n",
516 nid, i, parm);
517 return 0;
518 }
519 parm >>= shift;
520 if (range_val) {
521
522 if (!prev_nid || prev_nid >= val) {
523 dev_warn(&codec->dev,
524 "invalid dep_range_val %x:%x\n",
525 prev_nid, val);
526 continue;
527 }
528 for (n = prev_nid + 1; n <= val; n++) {
529 if (conn_list) {
530 if (conns >= max_conns)
531 return -ENOSPC;
532 conn_list[conns] = n;
533 }
534 conns++;
535 }
536 } else {
537 if (conn_list) {
538 if (conns >= max_conns)
539 return -ENOSPC;
540 conn_list[conns] = val;
541 }
542 conns++;
543 }
544 prev_nid = val;
545 }
546 return conns;
547 }
548 EXPORT_SYMBOL_GPL(snd_hdac_get_connections);
549
550 #ifdef CONFIG_PM
551
552
553
554
555
556
557
558
559
560
561 int snd_hdac_power_up(struct hdac_device *codec)
562 {
563 return pm_runtime_get_sync(&codec->dev);
564 }
565 EXPORT_SYMBOL_GPL(snd_hdac_power_up);
566
567
568
569
570
571
572
573 int snd_hdac_power_down(struct hdac_device *codec)
574 {
575 struct device *dev = &codec->dev;
576
577 pm_runtime_mark_last_busy(dev);
578 return pm_runtime_put_autosuspend(dev);
579 }
580 EXPORT_SYMBOL_GPL(snd_hdac_power_down);
581
582
583
584
585
586
587
588
589
590
591
592
593 int snd_hdac_power_up_pm(struct hdac_device *codec)
594 {
595 if (!atomic_inc_not_zero(&codec->in_pm))
596 return snd_hdac_power_up(codec);
597 return 0;
598 }
599 EXPORT_SYMBOL_GPL(snd_hdac_power_up_pm);
600
601
602
603
604
605 int snd_hdac_keep_power_up(struct hdac_device *codec)
606 {
607 if (!atomic_inc_not_zero(&codec->in_pm)) {
608 int ret = pm_runtime_get_if_in_use(&codec->dev);
609 if (!ret)
610 return -1;
611 if (ret < 0)
612 return 0;
613 }
614 return 1;
615 }
616
617
618
619
620
621
622
623
624
625
626 int snd_hdac_power_down_pm(struct hdac_device *codec)
627 {
628 if (atomic_dec_if_positive(&codec->in_pm) < 0)
629 return snd_hdac_power_down(codec);
630 return 0;
631 }
632 EXPORT_SYMBOL_GPL(snd_hdac_power_down_pm);
633 #endif
634
635
636 struct hda_vendor_id {
637 unsigned int id;
638 const char *name;
639 };
640
641 static struct hda_vendor_id hda_vendor_ids[] = {
642 { 0x1002, "ATI" },
643 { 0x1013, "Cirrus Logic" },
644 { 0x1057, "Motorola" },
645 { 0x1095, "Silicon Image" },
646 { 0x10de, "Nvidia" },
647 { 0x10ec, "Realtek" },
648 { 0x1102, "Creative" },
649 { 0x1106, "VIA" },
650 { 0x111d, "IDT" },
651 { 0x11c1, "LSI" },
652 { 0x11d4, "Analog Devices" },
653 { 0x13f6, "C-Media" },
654 { 0x14f1, "Conexant" },
655 { 0x17e8, "Chrontel" },
656 { 0x1854, "LG" },
657 { 0x1aec, "Wolfson Microelectronics" },
658 { 0x1af4, "QEMU" },
659 { 0x434d, "C-Media" },
660 { 0x8086, "Intel" },
661 { 0x8384, "SigmaTel" },
662 {}
663 };
664
665
666 static int get_codec_vendor_name(struct hdac_device *codec)
667 {
668 const struct hda_vendor_id *c;
669 u16 vendor_id = codec->vendor_id >> 16;
670
671 for (c = hda_vendor_ids; c->id; c++) {
672 if (c->id == vendor_id) {
673 codec->vendor_name = kstrdup(c->name, GFP_KERNEL);
674 return codec->vendor_name ? 0 : -ENOMEM;
675 }
676 }
677
678 codec->vendor_name = kasprintf(GFP_KERNEL, "Generic %04x", vendor_id);
679 return codec->vendor_name ? 0 : -ENOMEM;
680 }
681
682
683
684
685 struct hda_rate_tbl {
686 unsigned int hz;
687 unsigned int alsa_bits;
688 unsigned int hda_fmt;
689 };
690
691
692 #define HDA_RATE(base, mult, div) \
693 (AC_FMT_BASE_##base##K | (((mult) - 1) << AC_FMT_MULT_SHIFT) | \
694 (((div) - 1) << AC_FMT_DIV_SHIFT))
695
696 static struct hda_rate_tbl rate_bits[] = {
697
698
699
700 { 8000, SNDRV_PCM_RATE_8000, HDA_RATE(48, 1, 6) },
701 { 11025, SNDRV_PCM_RATE_11025, HDA_RATE(44, 1, 4) },
702 { 16000, SNDRV_PCM_RATE_16000, HDA_RATE(48, 1, 3) },
703 { 22050, SNDRV_PCM_RATE_22050, HDA_RATE(44, 1, 2) },
704 { 32000, SNDRV_PCM_RATE_32000, HDA_RATE(48, 2, 3) },
705 { 44100, SNDRV_PCM_RATE_44100, HDA_RATE(44, 1, 1) },
706 { 48000, SNDRV_PCM_RATE_48000, HDA_RATE(48, 1, 1) },
707 { 88200, SNDRV_PCM_RATE_88200, HDA_RATE(44, 2, 1) },
708 { 96000, SNDRV_PCM_RATE_96000, HDA_RATE(48, 2, 1) },
709 { 176400, SNDRV_PCM_RATE_176400, HDA_RATE(44, 4, 1) },
710 { 192000, SNDRV_PCM_RATE_192000, HDA_RATE(48, 4, 1) },
711 #define AC_PAR_PCM_RATE_BITS 11
712
713
714
715 { 9600, SNDRV_PCM_RATE_KNOT, HDA_RATE(48, 1, 5) },
716
717 { 0 }
718 };
719
720
721
722
723
724
725
726
727
728
729
730
731
732 unsigned int snd_hdac_calc_stream_format(unsigned int rate,
733 unsigned int channels,
734 snd_pcm_format_t format,
735 unsigned int maxbps,
736 unsigned short spdif_ctls)
737 {
738 int i;
739 unsigned int val = 0;
740
741 for (i = 0; rate_bits[i].hz; i++)
742 if (rate_bits[i].hz == rate) {
743 val = rate_bits[i].hda_fmt;
744 break;
745 }
746 if (!rate_bits[i].hz)
747 return 0;
748
749 if (channels == 0 || channels > 8)
750 return 0;
751 val |= channels - 1;
752
753 switch (snd_pcm_format_width(format)) {
754 case 8:
755 val |= AC_FMT_BITS_8;
756 break;
757 case 16:
758 val |= AC_FMT_BITS_16;
759 break;
760 case 20:
761 case 24:
762 case 32:
763 if (maxbps >= 32 || format == SNDRV_PCM_FORMAT_FLOAT_LE)
764 val |= AC_FMT_BITS_32;
765 else if (maxbps >= 24)
766 val |= AC_FMT_BITS_24;
767 else
768 val |= AC_FMT_BITS_20;
769 break;
770 default:
771 return 0;
772 }
773
774 if (spdif_ctls & AC_DIG1_NONAUDIO)
775 val |= AC_FMT_TYPE_NON_PCM;
776
777 return val;
778 }
779 EXPORT_SYMBOL_GPL(snd_hdac_calc_stream_format);
780
781 static unsigned int query_pcm_param(struct hdac_device *codec, hda_nid_t nid)
782 {
783 unsigned int val = 0;
784
785 if (nid != codec->afg &&
786 (get_wcaps(codec, nid) & AC_WCAP_FORMAT_OVRD))
787 val = snd_hdac_read_parm(codec, nid, AC_PAR_PCM);
788 if (!val || val == -1)
789 val = snd_hdac_read_parm(codec, codec->afg, AC_PAR_PCM);
790 if (!val || val == -1)
791 return 0;
792 return val;
793 }
794
795 static unsigned int query_stream_param(struct hdac_device *codec, hda_nid_t nid)
796 {
797 unsigned int streams = snd_hdac_read_parm(codec, nid, AC_PAR_STREAM);
798
799 if (!streams || streams == -1)
800 streams = snd_hdac_read_parm(codec, codec->afg, AC_PAR_STREAM);
801 if (!streams || streams == -1)
802 return 0;
803 return streams;
804 }
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819 int snd_hdac_query_supported_pcm(struct hdac_device *codec, hda_nid_t nid,
820 u32 *ratesp, u64 *formatsp, unsigned int *bpsp)
821 {
822 unsigned int i, val, wcaps;
823
824 wcaps = get_wcaps(codec, nid);
825 val = query_pcm_param(codec, nid);
826
827 if (ratesp) {
828 u32 rates = 0;
829 for (i = 0; i < AC_PAR_PCM_RATE_BITS; i++) {
830 if (val & (1 << i))
831 rates |= rate_bits[i].alsa_bits;
832 }
833 if (rates == 0) {
834 dev_err(&codec->dev,
835 "rates == 0 (nid=0x%x, val=0x%x, ovrd=%i)\n",
836 nid, val,
837 (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0);
838 return -EIO;
839 }
840 *ratesp = rates;
841 }
842
843 if (formatsp || bpsp) {
844 u64 formats = 0;
845 unsigned int streams, bps;
846
847 streams = query_stream_param(codec, nid);
848 if (!streams)
849 return -EIO;
850
851 bps = 0;
852 if (streams & AC_SUPFMT_PCM) {
853 if (val & AC_SUPPCM_BITS_8) {
854 formats |= SNDRV_PCM_FMTBIT_U8;
855 bps = 8;
856 }
857 if (val & AC_SUPPCM_BITS_16) {
858 formats |= SNDRV_PCM_FMTBIT_S16_LE;
859 bps = 16;
860 }
861 if (wcaps & AC_WCAP_DIGITAL) {
862 if (val & AC_SUPPCM_BITS_32)
863 formats |= SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE;
864 if (val & (AC_SUPPCM_BITS_20|AC_SUPPCM_BITS_24))
865 formats |= SNDRV_PCM_FMTBIT_S32_LE;
866 if (val & AC_SUPPCM_BITS_24)
867 bps = 24;
868 else if (val & AC_SUPPCM_BITS_20)
869 bps = 20;
870 } else if (val & (AC_SUPPCM_BITS_20|AC_SUPPCM_BITS_24|
871 AC_SUPPCM_BITS_32)) {
872 formats |= SNDRV_PCM_FMTBIT_S32_LE;
873 if (val & AC_SUPPCM_BITS_32)
874 bps = 32;
875 else if (val & AC_SUPPCM_BITS_24)
876 bps = 24;
877 else if (val & AC_SUPPCM_BITS_20)
878 bps = 20;
879 }
880 }
881 #if 0
882 if (streams & AC_SUPFMT_FLOAT32) {
883 formats |= SNDRV_PCM_FMTBIT_FLOAT_LE;
884 if (!bps)
885 bps = 32;
886 }
887 #endif
888 if (streams == AC_SUPFMT_AC3) {
889
890
891
892
893 formats |= SNDRV_PCM_FMTBIT_U8;
894 bps = 8;
895 }
896 if (formats == 0) {
897 dev_err(&codec->dev,
898 "formats == 0 (nid=0x%x, val=0x%x, ovrd=%i, streams=0x%x)\n",
899 nid, val,
900 (wcaps & AC_WCAP_FORMAT_OVRD) ? 1 : 0,
901 streams);
902 return -EIO;
903 }
904 if (formatsp)
905 *formatsp = formats;
906 if (bpsp)
907 *bpsp = bps;
908 }
909
910 return 0;
911 }
912 EXPORT_SYMBOL_GPL(snd_hdac_query_supported_pcm);
913
914
915
916
917
918
919
920
921
922
923
924 bool snd_hdac_is_supported_format(struct hdac_device *codec, hda_nid_t nid,
925 unsigned int format)
926 {
927 int i;
928 unsigned int val = 0, rate, stream;
929
930 val = query_pcm_param(codec, nid);
931 if (!val)
932 return false;
933
934 rate = format & 0xff00;
935 for (i = 0; i < AC_PAR_PCM_RATE_BITS; i++)
936 if (rate_bits[i].hda_fmt == rate) {
937 if (val & (1 << i))
938 break;
939 return false;
940 }
941 if (i >= AC_PAR_PCM_RATE_BITS)
942 return false;
943
944 stream = query_stream_param(codec, nid);
945 if (!stream)
946 return false;
947
948 if (stream & AC_SUPFMT_PCM) {
949 switch (format & 0xf0) {
950 case 0x00:
951 if (!(val & AC_SUPPCM_BITS_8))
952 return false;
953 break;
954 case 0x10:
955 if (!(val & AC_SUPPCM_BITS_16))
956 return false;
957 break;
958 case 0x20:
959 if (!(val & AC_SUPPCM_BITS_20))
960 return false;
961 break;
962 case 0x30:
963 if (!(val & AC_SUPPCM_BITS_24))
964 return false;
965 break;
966 case 0x40:
967 if (!(val & AC_SUPPCM_BITS_32))
968 return false;
969 break;
970 default:
971 return false;
972 }
973 } else {
974
975 }
976
977 return true;
978 }
979 EXPORT_SYMBOL_GPL(snd_hdac_is_supported_format);
980
981 static unsigned int codec_read(struct hdac_device *hdac, hda_nid_t nid,
982 int flags, unsigned int verb, unsigned int parm)
983 {
984 unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
985 unsigned int res;
986
987 if (snd_hdac_exec_verb(hdac, cmd, flags, &res))
988 return -1;
989
990 return res;
991 }
992
993 static int codec_write(struct hdac_device *hdac, hda_nid_t nid,
994 int flags, unsigned int verb, unsigned int parm)
995 {
996 unsigned int cmd = snd_hdac_make_cmd(hdac, nid, verb, parm);
997
998 return snd_hdac_exec_verb(hdac, cmd, flags, NULL);
999 }
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013 int snd_hdac_codec_read(struct hdac_device *hdac, hda_nid_t nid,
1014 int flags, unsigned int verb, unsigned int parm)
1015 {
1016 return codec_read(hdac, nid, flags, verb, parm);
1017 }
1018 EXPORT_SYMBOL_GPL(snd_hdac_codec_read);
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032 int snd_hdac_codec_write(struct hdac_device *hdac, hda_nid_t nid,
1033 int flags, unsigned int verb, unsigned int parm)
1034 {
1035 return codec_write(hdac, nid, flags, verb, parm);
1036 }
1037 EXPORT_SYMBOL_GPL(snd_hdac_codec_write);
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049 bool snd_hdac_check_power_state(struct hdac_device *hdac,
1050 hda_nid_t nid, unsigned int target_state)
1051 {
1052 unsigned int state = codec_read(hdac, nid, 0,
1053 AC_VERB_GET_POWER_STATE, 0);
1054
1055 if (state & AC_PWRST_ERROR)
1056 return true;
1057 state = (state >> 4) & 0x0f;
1058 return (state == target_state);
1059 }
1060 EXPORT_SYMBOL_GPL(snd_hdac_check_power_state);
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071 unsigned int snd_hdac_sync_power_state(struct hdac_device *codec,
1072 hda_nid_t nid, unsigned int power_state)
1073 {
1074 unsigned long end_time = jiffies + msecs_to_jiffies(500);
1075 unsigned int state, actual_state, count;
1076
1077 for (count = 0; count < 500; count++) {
1078 state = snd_hdac_codec_read(codec, nid, 0,
1079 AC_VERB_GET_POWER_STATE, 0);
1080 if (state & AC_PWRST_ERROR) {
1081 msleep(20);
1082 break;
1083 }
1084 actual_state = (state >> 4) & 0x0f;
1085 if (actual_state == power_state)
1086 break;
1087 if (time_after_eq(jiffies, end_time))
1088 break;
1089
1090 msleep(1);
1091 }
1092 return state;
1093 }
1094 EXPORT_SYMBOL_GPL(snd_hdac_sync_power_state);