~hui.wang/alsa-driver/dkms-packaging.audiosdw-ppa

« back to all changes in this revision

Viewing changes to buildroot/src/oem-audiosdw-lp1836324-0.6ubuntu1.2/pci/hda/hda_codec.c

  • Committer: Hui Wang
  • Date: 2019-12-13 02:41:40 UTC
  • Revision ID: hui.wang@canonical.com-20191213024140-1cprdcbl3122fn85
insert pc-oem-dkms

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// SPDX-License-Identifier: GPL-2.0-or-later
2
 
/*
3
 
 * Universal Interface for Intel High Definition Audio Codec
4
 
 *
5
 
 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
6
 
 */
7
 
 
8
 
#include <linux/init.h>
9
 
#include <linux/delay.h>
10
 
#include <linux/slab.h>
11
 
#include <linux/mutex.h>
12
 
#include <linux/module.h>
13
 
#include <linux/pm.h>
14
 
#include <linux/pm_runtime.h>
15
 
#include <dkms/sound/core.h>
16
 
#include <dkms/sound/hda_codec.h>
17
 
#include <dkms/sound/asoundef.h>
18
 
#include <dkms/sound/tlv.h>
19
 
#include <dkms/sound/initval.h>
20
 
#include <dkms/sound/jack.h>
21
 
#include "hda_local.h"
22
 
#include "hda_beep.h"
23
 
#include "hda_jack.h"
24
 
#include <dkms/sound/hda_hwdep.h>
25
 
#include <dkms/sound/hda_component.h>
26
 
 
27
 
#define codec_in_pm(codec)              snd_hdac_is_in_pm(&codec->core)
28
 
#define hda_codec_is_power_on(codec)    snd_hdac_is_power_on(&codec->core)
29
 
#define codec_has_epss(codec) \
30
 
        ((codec)->core.power_caps & AC_PWRST_EPSS)
31
 
#define codec_has_clkstop(codec) \
32
 
        ((codec)->core.power_caps & AC_PWRST_CLKSTOP)
33
 
 
34
 
/*
35
 
 * Send and receive a verb - passed to exec_verb override for hdac_device
36
 
 */
37
 
static int codec_exec_verb(struct hdac_device *dev, unsigned int cmd,
38
 
                           unsigned int flags, unsigned int *res)
39
 
{
40
 
        struct hda_codec *codec = container_of(dev, struct hda_codec, core);
41
 
        struct hda_bus *bus = codec->bus;
42
 
        int err;
43
 
 
44
 
        if (cmd == ~0)
45
 
                return -1;
46
 
 
47
 
 again:
48
 
        snd_hda_power_up_pm(codec);
49
 
        mutex_lock(&bus->core.cmd_mutex);
50
 
        if (flags & HDA_RW_NO_RESPONSE_FALLBACK)
51
 
                bus->no_response_fallback = 1;
52
 
        err = snd_hdac_bus_exec_verb_unlocked(&bus->core, codec->core.addr,
53
 
                                              cmd, res);
54
 
        bus->no_response_fallback = 0;
55
 
        mutex_unlock(&bus->core.cmd_mutex);
56
 
        snd_hda_power_down_pm(codec);
57
 
        if (!codec_in_pm(codec) && res && err == -EAGAIN) {
58
 
                if (bus->response_reset) {
59
 
                        codec_dbg(codec,
60
 
                                  "resetting BUS due to fatal communication error\n");
61
 
                        snd_hda_bus_reset(bus);
62
 
                }
63
 
                goto again;
64
 
        }
65
 
        /* clear reset-flag when the communication gets recovered */
66
 
        if (!err || codec_in_pm(codec))
67
 
                bus->response_reset = 0;
68
 
        return err;
69
 
}
70
 
 
71
 
/**
72
 
 * snd_hda_sequence_write - sequence writes
73
 
 * @codec: the HDA codec
74
 
 * @seq: VERB array to send
75
 
 *
76
 
 * Send the commands sequentially from the given array.
77
 
 * The array must be terminated with NID=0.
78
 
 */
79
 
void snd_hda_sequence_write(struct hda_codec *codec, const struct hda_verb *seq)
80
 
{
81
 
        for (; seq->nid; seq++)
82
 
                snd_hda_codec_write(codec, seq->nid, 0, seq->verb, seq->param);
83
 
}
84
 
EXPORT_SYMBOL_GPL(snd_hda_sequence_write);
85
 
 
86
 
/* connection list element */
87
 
struct hda_conn_list {
88
 
        struct list_head list;
89
 
        int len;
90
 
        hda_nid_t nid;
91
 
        hda_nid_t conns[0];
92
 
};
93
 
 
94
 
/* look up the cached results */
95
 
static struct hda_conn_list *
96
 
lookup_conn_list(struct hda_codec *codec, hda_nid_t nid)
97
 
{
98
 
        struct hda_conn_list *p;
99
 
        list_for_each_entry(p, &codec->conn_list, list) {
100
 
                if (p->nid == nid)
101
 
                        return p;
102
 
        }
103
 
        return NULL;
104
 
}
105
 
 
106
 
static int add_conn_list(struct hda_codec *codec, hda_nid_t nid, int len,
107
 
                         const hda_nid_t *list)
108
 
{
109
 
        struct hda_conn_list *p;
110
 
 
111
 
        p = kmalloc(struct_size(p, conns, len), GFP_KERNEL);
112
 
        if (!p)
113
 
                return -ENOMEM;
114
 
        p->len = len;
115
 
        p->nid = nid;
116
 
        memcpy(p->conns, list, len * sizeof(hda_nid_t));
117
 
        list_add(&p->list, &codec->conn_list);
118
 
        return 0;
119
 
}
120
 
 
121
 
static void remove_conn_list(struct hda_codec *codec)
122
 
{
123
 
        while (!list_empty(&codec->conn_list)) {
124
 
                struct hda_conn_list *p;
125
 
                p = list_first_entry(&codec->conn_list, typeof(*p), list);
126
 
                list_del(&p->list);
127
 
                kfree(p);
128
 
        }
129
 
}
130
 
 
131
 
/* read the connection and add to the cache */
132
 
static int read_and_add_raw_conns(struct hda_codec *codec, hda_nid_t nid)
133
 
{
134
 
        hda_nid_t list[32];
135
 
        hda_nid_t *result = list;
136
 
        int len;
137
 
 
138
 
        len = snd_hda_get_raw_connections(codec, nid, list, ARRAY_SIZE(list));
139
 
        if (len == -ENOSPC) {
140
 
                len = snd_hda_get_num_raw_conns(codec, nid);
141
 
                result = kmalloc_array(len, sizeof(hda_nid_t), GFP_KERNEL);
142
 
                if (!result)
143
 
                        return -ENOMEM;
144
 
                len = snd_hda_get_raw_connections(codec, nid, result, len);
145
 
        }
146
 
        if (len >= 0)
147
 
                len = snd_hda_override_conn_list(codec, nid, len, result);
148
 
        if (result != list)
149
 
                kfree(result);
150
 
        return len;
151
 
}
152
 
 
153
 
/**
154
 
 * snd_hda_get_conn_list - get connection list
155
 
 * @codec: the HDA codec
156
 
 * @nid: NID to parse
157
 
 * @listp: the pointer to store NID list
158
 
 *
159
 
 * Parses the connection list of the given widget and stores the pointer
160
 
 * to the list of NIDs.
161
 
 *
162
 
 * Returns the number of connections, or a negative error code.
163
 
 *
164
 
 * Note that the returned pointer isn't protected against the list
165
 
 * modification.  If snd_hda_override_conn_list() might be called
166
 
 * concurrently, protect with a mutex appropriately.
167
 
 */
168
 
int snd_hda_get_conn_list(struct hda_codec *codec, hda_nid_t nid,
169
 
                          const hda_nid_t **listp)
170
 
{
171
 
        bool added = false;
172
 
 
173
 
        for (;;) {
174
 
                int err;
175
 
                const struct hda_conn_list *p;
176
 
 
177
 
                /* if the connection-list is already cached, read it */
178
 
                p = lookup_conn_list(codec, nid);
179
 
                if (p) {
180
 
                        if (listp)
181
 
                                *listp = p->conns;
182
 
                        return p->len;
183
 
                }
184
 
                if (snd_BUG_ON(added))
185
 
                        return -EINVAL;
186
 
 
187
 
                err = read_and_add_raw_conns(codec, nid);
188
 
                if (err < 0)
189
 
                        return err;
190
 
                added = true;
191
 
        }
192
 
}
193
 
EXPORT_SYMBOL_GPL(snd_hda_get_conn_list);
194
 
 
195
 
/**
196
 
 * snd_hda_get_connections - copy connection list
197
 
 * @codec: the HDA codec
198
 
 * @nid: NID to parse
199
 
 * @conn_list: connection list array; when NULL, checks only the size
200
 
 * @max_conns: max. number of connections to store
201
 
 *
202
 
 * Parses the connection list of the given widget and stores the list
203
 
 * of NIDs.
204
 
 *
205
 
 * Returns the number of connections, or a negative error code.
206
 
 */
207
 
int snd_hda_get_connections(struct hda_codec *codec, hda_nid_t nid,
208
 
                            hda_nid_t *conn_list, int max_conns)
209
 
{
210
 
        const hda_nid_t *list;
211
 
        int len = snd_hda_get_conn_list(codec, nid, &list);
212
 
 
213
 
        if (len > 0 && conn_list) {
214
 
                if (len > max_conns) {
215
 
                        codec_err(codec, "Too many connections %d for NID 0x%x\n",
216
 
                                   len, nid);
217
 
                        return -EINVAL;
218
 
                }
219
 
                memcpy(conn_list, list, len * sizeof(hda_nid_t));
220
 
        }
221
 
 
222
 
        return len;
223
 
}
224
 
EXPORT_SYMBOL_GPL(snd_hda_get_connections);
225
 
 
226
 
/**
227
 
 * snd_hda_override_conn_list - add/modify the connection-list to cache
228
 
 * @codec: the HDA codec
229
 
 * @nid: NID to parse
230
 
 * @len: number of connection list entries
231
 
 * @list: the list of connection entries
232
 
 *
233
 
 * Add or modify the given connection-list to the cache.  If the corresponding
234
 
 * cache already exists, invalidate it and append a new one.
235
 
 *
236
 
 * Returns zero or a negative error code.
237
 
 */
238
 
int snd_hda_override_conn_list(struct hda_codec *codec, hda_nid_t nid, int len,
239
 
                               const hda_nid_t *list)
240
 
{
241
 
        struct hda_conn_list *p;
242
 
 
243
 
        p = lookup_conn_list(codec, nid);
244
 
        if (p) {
245
 
                list_del(&p->list);
246
 
                kfree(p);
247
 
        }
248
 
 
249
 
        return add_conn_list(codec, nid, len, list);
250
 
}
251
 
EXPORT_SYMBOL_GPL(snd_hda_override_conn_list);
252
 
 
253
 
/**
254
 
 * snd_hda_get_conn_index - get the connection index of the given NID
255
 
 * @codec: the HDA codec
256
 
 * @mux: NID containing the list
257
 
 * @nid: NID to select
258
 
 * @recursive: 1 when searching NID recursively, otherwise 0
259
 
 *
260
 
 * Parses the connection list of the widget @mux and checks whether the
261
 
 * widget @nid is present.  If it is, return the connection index.
262
 
 * Otherwise it returns -1.
263
 
 */
264
 
int snd_hda_get_conn_index(struct hda_codec *codec, hda_nid_t mux,
265
 
                           hda_nid_t nid, int recursive)
266
 
{
267
 
        const hda_nid_t *conn;
268
 
        int i, nums;
269
 
 
270
 
        nums = snd_hda_get_conn_list(codec, mux, &conn);
271
 
        for (i = 0; i < nums; i++)
272
 
                if (conn[i] == nid)
273
 
                        return i;
274
 
        if (!recursive)
275
 
                return -1;
276
 
        if (recursive > 10) {
277
 
                codec_dbg(codec, "too deep connection for 0x%x\n", nid);
278
 
                return -1;
279
 
        }
280
 
        recursive++;
281
 
        for (i = 0; i < nums; i++) {
282
 
                unsigned int type = get_wcaps_type(get_wcaps(codec, conn[i]));
283
 
                if (type == AC_WID_PIN || type == AC_WID_AUD_OUT)
284
 
                        continue;
285
 
                if (snd_hda_get_conn_index(codec, conn[i], nid, recursive) >= 0)
286
 
                        return i;
287
 
        }
288
 
        return -1;
289
 
}
290
 
EXPORT_SYMBOL_GPL(snd_hda_get_conn_index);
291
 
 
292
 
/**
293
 
 * snd_hda_get_num_devices - get DEVLIST_LEN parameter of the given widget
294
 
 *  @codec: the HDA codec
295
 
 *  @nid: NID of the pin to parse
296
 
 *
297
 
 * Get the device entry number on the given widget. This is a feature of
298
 
 * DP MST audio. Each pin can have several device entries in it.
299
 
 */
300
 
unsigned int snd_hda_get_num_devices(struct hda_codec *codec, hda_nid_t nid)
301
 
{
302
 
        unsigned int wcaps = get_wcaps(codec, nid);
303
 
        unsigned int parm;
304
 
 
305
 
        if (!codec->dp_mst || !(wcaps & AC_WCAP_DIGITAL) ||
306
 
            get_wcaps_type(wcaps) != AC_WID_PIN)
307
 
                return 0;
308
 
 
309
 
        parm = snd_hdac_read_parm_uncached(&codec->core, nid, AC_PAR_DEVLIST_LEN);
310
 
        if (parm == -1)
311
 
                parm = 0;
312
 
        return parm & AC_DEV_LIST_LEN_MASK;
313
 
}
314
 
EXPORT_SYMBOL_GPL(snd_hda_get_num_devices);
315
 
 
316
 
/**
317
 
 * snd_hda_get_devices - copy device list without cache
318
 
 * @codec: the HDA codec
319
 
 * @nid: NID of the pin to parse
320
 
 * @dev_list: device list array
321
 
 * @max_devices: max. number of devices to store
322
 
 *
323
 
 * Copy the device list. This info is dynamic and so not cached.
324
 
 * Currently called only from hda_proc.c, so not exported.
325
 
 */
326
 
int snd_hda_get_devices(struct hda_codec *codec, hda_nid_t nid,
327
 
                        u8 *dev_list, int max_devices)
328
 
{
329
 
        unsigned int parm;
330
 
        int i, dev_len, devices;
331
 
 
332
 
        parm = snd_hda_get_num_devices(codec, nid);
333
 
        if (!parm)      /* not multi-stream capable */
334
 
                return 0;
335
 
 
336
 
        dev_len = parm + 1;
337
 
        dev_len = dev_len < max_devices ? dev_len : max_devices;
338
 
 
339
 
        devices = 0;
340
 
        while (devices < dev_len) {
341
 
                if (snd_hdac_read(&codec->core, nid,
342
 
                                  AC_VERB_GET_DEVICE_LIST, devices, &parm))
343
 
                        break; /* error */
344
 
 
345
 
                for (i = 0; i < 8; i++) {
346
 
                        dev_list[devices] = (u8)parm;
347
 
                        parm >>= 4;
348
 
                        devices++;
349
 
                        if (devices >= dev_len)
350
 
                                break;
351
 
                }
352
 
        }
353
 
        return devices;
354
 
}
355
 
 
356
 
/**
357
 
 * snd_hda_get_dev_select - get device entry select on the pin
358
 
 * @codec: the HDA codec
359
 
 * @nid: NID of the pin to get device entry select
360
 
 *
361
 
 * Get the devcie entry select on the pin. Return the device entry
362
 
 * id selected on the pin. Return 0 means the first device entry
363
 
 * is selected or MST is not supported.
364
 
 */
365
 
int snd_hda_get_dev_select(struct hda_codec *codec, hda_nid_t nid)
366
 
{
367
 
        /* not support dp_mst will always return 0, using first dev_entry */
368
 
        if (!codec->dp_mst)
369
 
                return 0;
370
 
 
371
 
        return snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_DEVICE_SEL, 0);
372
 
}
373
 
EXPORT_SYMBOL_GPL(snd_hda_get_dev_select);
374
 
 
375
 
/**
376
 
 * snd_hda_set_dev_select - set device entry select on the pin
377
 
 * @codec: the HDA codec
378
 
 * @nid: NID of the pin to set device entry select
379
 
 * @dev_id: device entry id to be set
380
 
 *
381
 
 * Set the device entry select on the pin nid.
382
 
 */
383
 
int snd_hda_set_dev_select(struct hda_codec *codec, hda_nid_t nid, int dev_id)
384
 
{
385
 
        int ret, num_devices;
386
 
 
387
 
        /* not support dp_mst will always return 0, using first dev_entry */
388
 
        if (!codec->dp_mst)
389
 
                return 0;
390
 
 
391
 
        /* AC_PAR_DEVLIST_LEN is 0 based. */
392
 
        num_devices = snd_hda_get_num_devices(codec, nid) + 1;
393
 
        /* If Device List Length is 0 (num_device = 1),
394
 
         * the pin is not multi stream capable.
395
 
         * Do nothing in this case.
396
 
         */
397
 
        if (num_devices == 1)
398
 
                return 0;
399
 
 
400
 
        /* Behavior of setting index being equal to or greater than
401
 
         * Device List Length is not predictable
402
 
         */
403
 
        if (num_devices <= dev_id)
404
 
                return -EINVAL;
405
 
 
406
 
        ret = snd_hda_codec_write(codec, nid, 0,
407
 
                        AC_VERB_SET_DEVICE_SEL, dev_id);
408
 
 
409
 
        return ret;
410
 
}
411
 
EXPORT_SYMBOL_GPL(snd_hda_set_dev_select);
412
 
 
413
 
/*
414
 
 * read widget caps for each widget and store in cache
415
 
 */
416
 
static int read_widget_caps(struct hda_codec *codec, hda_nid_t fg_node)
417
 
{
418
 
        int i;
419
 
        hda_nid_t nid;
420
 
 
421
 
        codec->wcaps = kmalloc_array(codec->core.num_nodes, 4, GFP_KERNEL);
422
 
        if (!codec->wcaps)
423
 
                return -ENOMEM;
424
 
        nid = codec->core.start_nid;
425
 
        for (i = 0; i < codec->core.num_nodes; i++, nid++)
426
 
                codec->wcaps[i] = snd_hdac_read_parm_uncached(&codec->core,
427
 
                                        nid, AC_PAR_AUDIO_WIDGET_CAP);
428
 
        return 0;
429
 
}
430
 
 
431
 
/* read all pin default configurations and save codec->init_pins */
432
 
static int read_pin_defaults(struct hda_codec *codec)
433
 
{
434
 
        hda_nid_t nid;
435
 
 
436
 
        for_each_hda_codec_node(nid, codec) {
437
 
                struct hda_pincfg *pin;
438
 
                unsigned int wcaps = get_wcaps(codec, nid);
439
 
                unsigned int wid_type = get_wcaps_type(wcaps);
440
 
                if (wid_type != AC_WID_PIN)
441
 
                        continue;
442
 
                pin = snd_array_new(&codec->init_pins);
443
 
                if (!pin)
444
 
                        return -ENOMEM;
445
 
                pin->nid = nid;
446
 
                pin->cfg = snd_hda_codec_read(codec, nid, 0,
447
 
                                              AC_VERB_GET_CONFIG_DEFAULT, 0);
448
 
                /*
449
 
                 * all device entries are the same widget control so far
450
 
                 * fixme: if any codec is different, need fix here
451
 
                 */
452
 
                pin->ctrl = snd_hda_codec_read(codec, nid, 0,
453
 
                                               AC_VERB_GET_PIN_WIDGET_CONTROL,
454
 
                                               0);
455
 
        }
456
 
        return 0;
457
 
}
458
 
 
459
 
/* look up the given pin config list and return the item matching with NID */
460
 
static struct hda_pincfg *look_up_pincfg(struct hda_codec *codec,
461
 
                                         struct snd_array *array,
462
 
                                         hda_nid_t nid)
463
 
{
464
 
        struct hda_pincfg *pin;
465
 
        int i;
466
 
 
467
 
        snd_array_for_each(array, i, pin) {
468
 
                if (pin->nid == nid)
469
 
                        return pin;
470
 
        }
471
 
        return NULL;
472
 
}
473
 
 
474
 
/* set the current pin config value for the given NID.
475
 
 * the value is cached, and read via snd_hda_codec_get_pincfg()
476
 
 */
477
 
int snd_hda_add_pincfg(struct hda_codec *codec, struct snd_array *list,
478
 
                       hda_nid_t nid, unsigned int cfg)
479
 
{
480
 
        struct hda_pincfg *pin;
481
 
 
482
 
        /* the check below may be invalid when pins are added by a fixup
483
 
         * dynamically (e.g. via snd_hda_codec_update_widgets()), so disabled
484
 
         * for now
485
 
         */
486
 
        /*
487
 
        if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
488
 
                return -EINVAL;
489
 
        */
490
 
 
491
 
        pin = look_up_pincfg(codec, list, nid);
492
 
        if (!pin) {
493
 
                pin = snd_array_new(list);
494
 
                if (!pin)
495
 
                        return -ENOMEM;
496
 
                pin->nid = nid;
497
 
        }
498
 
        pin->cfg = cfg;
499
 
        return 0;
500
 
}
501
 
 
502
 
/**
503
 
 * snd_hda_codec_set_pincfg - Override a pin default configuration
504
 
 * @codec: the HDA codec
505
 
 * @nid: NID to set the pin config
506
 
 * @cfg: the pin default config value
507
 
 *
508
 
 * Override a pin default configuration value in the cache.
509
 
 * This value can be read by snd_hda_codec_get_pincfg() in a higher
510
 
 * priority than the real hardware value.
511
 
 */
512
 
int snd_hda_codec_set_pincfg(struct hda_codec *codec,
513
 
                             hda_nid_t nid, unsigned int cfg)
514
 
{
515
 
        return snd_hda_add_pincfg(codec, &codec->driver_pins, nid, cfg);
516
 
}
517
 
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pincfg);
518
 
 
519
 
/**
520
 
 * snd_hda_codec_get_pincfg - Obtain a pin-default configuration
521
 
 * @codec: the HDA codec
522
 
 * @nid: NID to get the pin config
523
 
 *
524
 
 * Get the current pin config value of the given pin NID.
525
 
 * If the pincfg value is cached or overridden via sysfs or driver,
526
 
 * returns the cached value.
527
 
 */
528
 
unsigned int snd_hda_codec_get_pincfg(struct hda_codec *codec, hda_nid_t nid)
529
 
{
530
 
        struct hda_pincfg *pin;
531
 
 
532
 
#ifdef CONFIG_SND_HDA_RECONFIG
533
 
        {
534
 
                unsigned int cfg = 0;
535
 
                mutex_lock(&codec->user_mutex);
536
 
                pin = look_up_pincfg(codec, &codec->user_pins, nid);
537
 
                if (pin)
538
 
                        cfg = pin->cfg;
539
 
                mutex_unlock(&codec->user_mutex);
540
 
                if (cfg)
541
 
                        return cfg;
542
 
        }
543
 
#endif
544
 
        pin = look_up_pincfg(codec, &codec->driver_pins, nid);
545
 
        if (pin)
546
 
                return pin->cfg;
547
 
        pin = look_up_pincfg(codec, &codec->init_pins, nid);
548
 
        if (pin)
549
 
                return pin->cfg;
550
 
        return 0;
551
 
}
552
 
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pincfg);
553
 
 
554
 
/**
555
 
 * snd_hda_codec_set_pin_target - remember the current pinctl target value
556
 
 * @codec: the HDA codec
557
 
 * @nid: pin NID
558
 
 * @val: assigned pinctl value
559
 
 *
560
 
 * This function stores the given value to a pinctl target value in the
561
 
 * pincfg table.  This isn't always as same as the actually written value
562
 
 * but can be referred at any time via snd_hda_codec_get_pin_target().
563
 
 */
564
 
int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
565
 
                                 unsigned int val)
566
 
{
567
 
        struct hda_pincfg *pin;
568
 
 
569
 
        pin = look_up_pincfg(codec, &codec->init_pins, nid);
570
 
        if (!pin)
571
 
                return -EINVAL;
572
 
        pin->target = val;
573
 
        return 0;
574
 
}
575
 
EXPORT_SYMBOL_GPL(snd_hda_codec_set_pin_target);
576
 
 
577
 
/**
578
 
 * snd_hda_codec_get_pin_target - return the current pinctl target value
579
 
 * @codec: the HDA codec
580
 
 * @nid: pin NID
581
 
 */
582
 
int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid)
583
 
{
584
 
        struct hda_pincfg *pin;
585
 
 
586
 
        pin = look_up_pincfg(codec, &codec->init_pins, nid);
587
 
        if (!pin)
588
 
                return 0;
589
 
        return pin->target;
590
 
}
591
 
EXPORT_SYMBOL_GPL(snd_hda_codec_get_pin_target);
592
 
 
593
 
/**
594
 
 * snd_hda_shutup_pins - Shut up all pins
595
 
 * @codec: the HDA codec
596
 
 *
597
 
 * Clear all pin controls to shup up before suspend for avoiding click noise.
598
 
 * The controls aren't cached so that they can be resumed properly.
599
 
 */
600
 
void snd_hda_shutup_pins(struct hda_codec *codec)
601
 
{
602
 
        const struct hda_pincfg *pin;
603
 
        int i;
604
 
 
605
 
        /* don't shut up pins when unloading the driver; otherwise it breaks
606
 
         * the default pin setup at the next load of the driver
607
 
         */
608
 
        if (codec->bus->shutdown)
609
 
                return;
610
 
        snd_array_for_each(&codec->init_pins, i, pin) {
611
 
                /* use read here for syncing after issuing each verb */
612
 
                snd_hda_codec_read(codec, pin->nid, 0,
613
 
                                   AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
614
 
        }
615
 
        codec->pins_shutup = 1;
616
 
}
617
 
EXPORT_SYMBOL_GPL(snd_hda_shutup_pins);
618
 
 
619
 
#ifdef CONFIG_PM
620
 
/* Restore the pin controls cleared previously via snd_hda_shutup_pins() */
621
 
static void restore_shutup_pins(struct hda_codec *codec)
622
 
{
623
 
        const struct hda_pincfg *pin;
624
 
        int i;
625
 
 
626
 
        if (!codec->pins_shutup)
627
 
                return;
628
 
        if (codec->bus->shutdown)
629
 
                return;
630
 
        snd_array_for_each(&codec->init_pins, i, pin) {
631
 
                snd_hda_codec_write(codec, pin->nid, 0,
632
 
                                    AC_VERB_SET_PIN_WIDGET_CONTROL,
633
 
                                    pin->ctrl);
634
 
        }
635
 
        codec->pins_shutup = 0;
636
 
}
637
 
#endif
638
 
 
639
 
static void hda_jackpoll_work(struct work_struct *work)
640
 
{
641
 
        struct hda_codec *codec =
642
 
                container_of(work, struct hda_codec, jackpoll_work.work);
643
 
 
644
 
        snd_hda_jack_set_dirty_all(codec);
645
 
        snd_hda_jack_poll_all(codec);
646
 
 
647
 
        if (!codec->jackpoll_interval)
648
 
                return;
649
 
 
650
 
        schedule_delayed_work(&codec->jackpoll_work,
651
 
                              codec->jackpoll_interval);
652
 
}
653
 
 
654
 
/* release all pincfg lists */
655
 
static void free_init_pincfgs(struct hda_codec *codec)
656
 
{
657
 
        snd_array_free(&codec->driver_pins);
658
 
#ifdef CONFIG_SND_HDA_RECONFIG
659
 
        snd_array_free(&codec->user_pins);
660
 
#endif
661
 
        snd_array_free(&codec->init_pins);
662
 
}
663
 
 
664
 
/*
665
 
 * audio-converter setup caches
666
 
 */
667
 
struct hda_cvt_setup {
668
 
        hda_nid_t nid;
669
 
        u8 stream_tag;
670
 
        u8 channel_id;
671
 
        u16 format_id;
672
 
        unsigned char active;   /* cvt is currently used */
673
 
        unsigned char dirty;    /* setups should be cleared */
674
 
};
675
 
 
676
 
/* get or create a cache entry for the given audio converter NID */
677
 
static struct hda_cvt_setup *
678
 
get_hda_cvt_setup(struct hda_codec *codec, hda_nid_t nid)
679
 
{
680
 
        struct hda_cvt_setup *p;
681
 
        int i;
682
 
 
683
 
        snd_array_for_each(&codec->cvt_setups, i, p) {
684
 
                if (p->nid == nid)
685
 
                        return p;
686
 
        }
687
 
        p = snd_array_new(&codec->cvt_setups);
688
 
        if (p)
689
 
                p->nid = nid;
690
 
        return p;
691
 
}
692
 
 
693
 
/*
694
 
 * PCM device
695
 
 */
696
 
static void release_pcm(struct kref *kref)
697
 
{
698
 
        struct hda_pcm *pcm = container_of(kref, struct hda_pcm, kref);
699
 
 
700
 
        if (pcm->pcm)
701
 
                snd_device_free(pcm->codec->card, pcm->pcm);
702
 
        clear_bit(pcm->device, pcm->codec->bus->pcm_dev_bits);
703
 
        kfree(pcm->name);
704
 
        kfree(pcm);
705
 
}
706
 
 
707
 
void snd_hda_codec_pcm_put(struct hda_pcm *pcm)
708
 
{
709
 
        kref_put(&pcm->kref, release_pcm);
710
 
}
711
 
EXPORT_SYMBOL_GPL(snd_hda_codec_pcm_put);
712
 
 
713
 
struct hda_pcm *snd_hda_codec_pcm_new(struct hda_codec *codec,
714
 
                                      const char *fmt, ...)
715
 
{
716
 
        struct hda_pcm *pcm;
717
 
        va_list args;
718
 
 
719
 
        pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
720
 
        if (!pcm)
721
 
                return NULL;
722
 
 
723
 
        pcm->codec = codec;
724
 
        kref_init(&pcm->kref);
725
 
        va_start(args, fmt);
726
 
        pcm->name = kvasprintf(GFP_KERNEL, fmt, args);
727
 
        va_end(args);
728
 
        if (!pcm->name) {
729
 
                kfree(pcm);
730
 
                return NULL;
731
 
        }
732
 
 
733
 
        list_add_tail(&pcm->list, &codec->pcm_list_head);
734
 
        return pcm;
735
 
}
736
 
EXPORT_SYMBOL_GPL(snd_hda_codec_pcm_new);
737
 
 
738
 
/*
739
 
 * codec destructor
740
 
 */
741
 
static void codec_release_pcms(struct hda_codec *codec)
742
 
{
743
 
        struct hda_pcm *pcm, *n;
744
 
 
745
 
        list_for_each_entry_safe(pcm, n, &codec->pcm_list_head, list) {
746
 
                list_del_init(&pcm->list);
747
 
                if (pcm->pcm)
748
 
                        snd_device_disconnect(codec->card, pcm->pcm);
749
 
                snd_hda_codec_pcm_put(pcm);
750
 
        }
751
 
}
752
 
 
753
 
void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec)
754
 
{
755
 
        if (codec->registered) {
756
 
                /* pm_runtime_put() is called in snd_hdac_device_exit() */
757
 
                pm_runtime_get_noresume(hda_codec_dev(codec));
758
 
                pm_runtime_disable(hda_codec_dev(codec));
759
 
                codec->registered = 0;
760
 
        }
761
 
 
762
 
        cancel_delayed_work_sync(&codec->jackpoll_work);
763
 
        if (!codec->in_freeing)
764
 
                snd_hda_ctls_clear(codec);
765
 
        codec_release_pcms(codec);
766
 
        snd_hda_detach_beep_device(codec);
767
 
        memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
768
 
        snd_hda_jack_tbl_clear(codec);
769
 
        codec->proc_widget_hook = NULL;
770
 
        codec->spec = NULL;
771
 
 
772
 
        /* free only driver_pins so that init_pins + user_pins are restored */
773
 
        snd_array_free(&codec->driver_pins);
774
 
        snd_array_free(&codec->cvt_setups);
775
 
        snd_array_free(&codec->spdif_out);
776
 
        snd_array_free(&codec->verbs);
777
 
        codec->preset = NULL;
778
 
        codec->slave_dig_outs = NULL;
779
 
        codec->spdif_status_reset = 0;
780
 
        snd_array_free(&codec->mixers);
781
 
        snd_array_free(&codec->nids);
782
 
        remove_conn_list(codec);
783
 
        snd_hdac_regmap_exit(&codec->core);
784
 
}
785
 
 
786
 
static unsigned int hda_set_power_state(struct hda_codec *codec,
787
 
                                unsigned int power_state);
788
 
 
789
 
/* enable/disable display power per codec */
790
 
static void codec_display_power(struct hda_codec *codec, bool enable)
791
 
{
792
 
        if (codec->display_power_control)
793
 
                snd_hdac_display_power(&codec->bus->core, codec->addr, enable);
794
 
}
795
 
 
796
 
/* also called from hda_bind.c */
797
 
void snd_hda_codec_register(struct hda_codec *codec)
798
 
{
799
 
        if (codec->registered)
800
 
                return;
801
 
        if (device_is_registered(hda_codec_dev(codec))) {
802
 
                codec_display_power(codec, true);
803
 
                pm_runtime_enable(hda_codec_dev(codec));
804
 
                /* it was powered up in snd_hda_codec_new(), now all done */
805
 
                snd_hda_power_down(codec);
806
 
                codec->registered = 1;
807
 
        }
808
 
}
809
 
 
810
 
static int snd_hda_codec_dev_register(struct snd_device *device)
811
 
{
812
 
        snd_hda_codec_register(device->device_data);
813
 
        return 0;
814
 
}
815
 
 
816
 
static int snd_hda_codec_dev_free(struct snd_device *device)
817
 
{
818
 
        struct hda_codec *codec = device->device_data;
819
 
 
820
 
        codec->in_freeing = 1;
821
 
        /*
822
 
         * snd_hda_codec_device_new() is used by legacy HDA and ASoC driver.
823
 
         * We can't unregister ASoC device since it will be unregistered in
824
 
         * snd_hdac_ext_bus_device_remove().
825
 
         */
826
 
        if (codec->core.type == HDA_DEV_LEGACY)
827
 
                snd_hdac_device_unregister(&codec->core);
828
 
        codec_display_power(codec, false);
829
 
 
830
 
        /*
831
 
         * In the case of ASoC HD-audio bus, the device refcount is released in
832
 
         * snd_hdac_ext_bus_device_remove() explicitly.
833
 
         */
834
 
        if (codec->core.type == HDA_DEV_LEGACY)
835
 
                put_device(hda_codec_dev(codec));
836
 
 
837
 
        return 0;
838
 
}
839
 
 
840
 
static void snd_hda_codec_dev_release(struct device *dev)
841
 
{
842
 
        struct hda_codec *codec = dev_to_hda_codec(dev);
843
 
 
844
 
        free_init_pincfgs(codec);
845
 
        snd_hdac_device_exit(&codec->core);
846
 
        snd_hda_sysfs_clear(codec);
847
 
        kfree(codec->modelname);
848
 
        kfree(codec->wcaps);
849
 
 
850
 
        /*
851
 
         * In the case of ASoC HD-audio, hda_codec is device managed.
852
 
         * It will be freed when the ASoC device is removed.
853
 
         */
854
 
        if (codec->core.type == HDA_DEV_LEGACY)
855
 
                kfree(codec);
856
 
}
857
 
 
858
 
#define DEV_NAME_LEN 31
859
 
 
860
 
static int snd_hda_codec_device_init(struct hda_bus *bus, struct snd_card *card,
861
 
                        unsigned int codec_addr, struct hda_codec **codecp)
862
 
{
863
 
        char name[DEV_NAME_LEN];
864
 
        struct hda_codec *codec;
865
 
        int err;
866
 
 
867
 
        dev_dbg(card->dev, "%s: entry\n", __func__);
868
 
 
869
 
        if (snd_BUG_ON(!bus))
870
 
                return -EINVAL;
871
 
        if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
872
 
                return -EINVAL;
873
 
 
874
 
        codec = kzalloc(sizeof(*codec), GFP_KERNEL);
875
 
        if (!codec)
876
 
                return -ENOMEM;
877
 
 
878
 
        sprintf(name, "hdaudioC%dD%d", card->number, codec_addr);
879
 
        err = snd_hdac_device_init(&codec->core, &bus->core, name, codec_addr);
880
 
        if (err < 0) {
881
 
                kfree(codec);
882
 
                return err;
883
 
        }
884
 
 
885
 
        codec->core.type = HDA_DEV_LEGACY;
886
 
        *codecp = codec;
887
 
 
888
 
        return err;
889
 
}
890
 
 
891
 
/**
892
 
 * snd_hda_codec_new - create a HDA codec
893
 
 * @bus: the bus to assign
894
 
 * @codec_addr: the codec address
895
 
 * @codecp: the pointer to store the generated codec
896
 
 *
897
 
 * Returns 0 if successful, or a negative error code.
898
 
 */
899
 
int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
900
 
                      unsigned int codec_addr, struct hda_codec **codecp)
901
 
{
902
 
        int ret;
903
 
 
904
 
        ret = snd_hda_codec_device_init(bus, card, codec_addr, codecp);
905
 
        if (ret < 0)
906
 
                return ret;
907
 
 
908
 
        return snd_hda_codec_device_new(bus, card, codec_addr, *codecp);
909
 
}
910
 
EXPORT_SYMBOL_GPL(snd_hda_codec_new);
911
 
 
912
 
int snd_hda_codec_device_new(struct hda_bus *bus, struct snd_card *card,
913
 
                        unsigned int codec_addr, struct hda_codec *codec)
914
 
{
915
 
        char component[31];
916
 
        hda_nid_t fg;
917
 
        int err;
918
 
        static struct snd_device_ops dev_ops = {
919
 
                .dev_register = snd_hda_codec_dev_register,
920
 
                .dev_free = snd_hda_codec_dev_free,
921
 
        };
922
 
 
923
 
        dev_dbg(card->dev, "%s: entry\n", __func__);
924
 
 
925
 
        if (snd_BUG_ON(!bus))
926
 
                return -EINVAL;
927
 
        if (snd_BUG_ON(codec_addr > HDA_MAX_CODEC_ADDRESS))
928
 
                return -EINVAL;
929
 
 
930
 
        codec->core.dev.release = snd_hda_codec_dev_release;
931
 
        codec->core.exec_verb = codec_exec_verb;
932
 
 
933
 
        codec->bus = bus;
934
 
        codec->card = card;
935
 
        codec->addr = codec_addr;
936
 
        mutex_init(&codec->spdif_mutex);
937
 
        mutex_init(&codec->control_mutex);
938
 
        snd_array_init(&codec->mixers, sizeof(struct hda_nid_item), 32);
939
 
        snd_array_init(&codec->nids, sizeof(struct hda_nid_item), 32);
940
 
        snd_array_init(&codec->init_pins, sizeof(struct hda_pincfg), 16);
941
 
        snd_array_init(&codec->driver_pins, sizeof(struct hda_pincfg), 16);
942
 
        snd_array_init(&codec->cvt_setups, sizeof(struct hda_cvt_setup), 8);
943
 
        snd_array_init(&codec->spdif_out, sizeof(struct hda_spdif_out), 16);
944
 
        snd_array_init(&codec->jacktbl, sizeof(struct hda_jack_tbl), 16);
945
 
        snd_array_init(&codec->verbs, sizeof(struct hda_verb *), 8);
946
 
        INIT_LIST_HEAD(&codec->conn_list);
947
 
        INIT_LIST_HEAD(&codec->pcm_list_head);
948
 
 
949
 
        INIT_DELAYED_WORK(&codec->jackpoll_work, hda_jackpoll_work);
950
 
        codec->depop_delay = -1;
951
 
        codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
952
 
 
953
 
#ifdef CONFIG_PM
954
 
        codec->power_jiffies = jiffies;
955
 
#endif
956
 
 
957
 
        snd_hda_sysfs_init(codec);
958
 
 
959
 
        if (codec->bus->modelname) {
960
 
                codec->modelname = kstrdup(codec->bus->modelname, GFP_KERNEL);
961
 
                if (!codec->modelname) {
962
 
                        err = -ENOMEM;
963
 
                        goto error;
964
 
                }
965
 
        }
966
 
 
967
 
        fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
968
 
        err = read_widget_caps(codec, fg);
969
 
        if (err < 0)
970
 
                goto error;
971
 
        err = read_pin_defaults(codec);
972
 
        if (err < 0)
973
 
                goto error;
974
 
 
975
 
        /* power-up all before initialization */
976
 
        hda_set_power_state(codec, AC_PWRST_D0);
977
 
        codec->core.dev.power.power_state = PMSG_ON;
978
 
 
979
 
        snd_hda_codec_proc_new(codec);
980
 
 
981
 
        snd_hda_create_hwdep(codec);
982
 
 
983
 
        sprintf(component, "HDA:%08x,%08x,%08x", codec->core.vendor_id,
984
 
                codec->core.subsystem_id, codec->core.revision_id);
985
 
        snd_component_add(card, component);
986
 
 
987
 
        err = snd_device_new(card, SNDRV_DEV_CODEC, codec, &dev_ops);
988
 
        if (err < 0)
989
 
                goto error;
990
 
 
991
 
        return 0;
992
 
 
993
 
 error:
994
 
        put_device(hda_codec_dev(codec));
995
 
        return err;
996
 
}
997
 
EXPORT_SYMBOL_GPL(snd_hda_codec_device_new);
998
 
 
999
 
/**
1000
 
 * snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
1001
 
 * @codec: the HDA codec
1002
 
 *
1003
 
 * Forcibly refresh the all widget caps and the init pin configurations of
1004
 
 * the given codec.
1005
 
 */
1006
 
int snd_hda_codec_update_widgets(struct hda_codec *codec)
1007
 
{
1008
 
        hda_nid_t fg;
1009
 
        int err;
1010
 
 
1011
 
        err = snd_hdac_refresh_widgets(&codec->core);
1012
 
        if (err < 0)
1013
 
                return err;
1014
 
 
1015
 
        /* Assume the function group node does not change,
1016
 
         * only the widget nodes may change.
1017
 
         */
1018
 
        kfree(codec->wcaps);
1019
 
        fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
1020
 
        err = read_widget_caps(codec, fg);
1021
 
        if (err < 0)
1022
 
                return err;
1023
 
 
1024
 
        snd_array_free(&codec->init_pins);
1025
 
        err = read_pin_defaults(codec);
1026
 
 
1027
 
        return err;
1028
 
}
1029
 
EXPORT_SYMBOL_GPL(snd_hda_codec_update_widgets);
1030
 
 
1031
 
/* update the stream-id if changed */
1032
 
static void update_pcm_stream_id(struct hda_codec *codec,
1033
 
                                 struct hda_cvt_setup *p, hda_nid_t nid,
1034
 
                                 u32 stream_tag, int channel_id)
1035
 
{
1036
 
        unsigned int oldval, newval;
1037
 
 
1038
 
        if (p->stream_tag != stream_tag || p->channel_id != channel_id) {
1039
 
                oldval = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONV, 0);
1040
 
                newval = (stream_tag << 4) | channel_id;
1041
 
                if (oldval != newval)
1042
 
                        snd_hda_codec_write(codec, nid, 0,
1043
 
                                            AC_VERB_SET_CHANNEL_STREAMID,
1044
 
                                            newval);
1045
 
                p->stream_tag = stream_tag;
1046
 
                p->channel_id = channel_id;
1047
 
        }
1048
 
}
1049
 
 
1050
 
/* update the format-id if changed */
1051
 
static void update_pcm_format(struct hda_codec *codec, struct hda_cvt_setup *p,
1052
 
                              hda_nid_t nid, int format)
1053
 
{
1054
 
        unsigned int oldval;
1055
 
 
1056
 
        if (p->format_id != format) {
1057
 
                oldval = snd_hda_codec_read(codec, nid, 0,
1058
 
                                            AC_VERB_GET_STREAM_FORMAT, 0);
1059
 
                if (oldval != format) {
1060
 
                        msleep(1);
1061
 
                        snd_hda_codec_write(codec, nid, 0,
1062
 
                                            AC_VERB_SET_STREAM_FORMAT,
1063
 
                                            format);
1064
 
                }
1065
 
                p->format_id = format;
1066
 
        }
1067
 
}
1068
 
 
1069
 
/**
1070
 
 * snd_hda_codec_setup_stream - set up the codec for streaming
1071
 
 * @codec: the CODEC to set up
1072
 
 * @nid: the NID to set up
1073
 
 * @stream_tag: stream tag to pass, it's between 0x1 and 0xf.
1074
 
 * @channel_id: channel id to pass, zero based.
1075
 
 * @format: stream format.
1076
 
 */
1077
 
void snd_hda_codec_setup_stream(struct hda_codec *codec, hda_nid_t nid,
1078
 
                                u32 stream_tag,
1079
 
                                int channel_id, int format)
1080
 
{
1081
 
        struct hda_codec *c;
1082
 
        struct hda_cvt_setup *p;
1083
 
        int type;
1084
 
        int i;
1085
 
 
1086
 
        if (!nid)
1087
 
                return;
1088
 
 
1089
 
        codec_dbg(codec,
1090
 
                  "hda_codec_setup_stream: NID=0x%x, stream=0x%x, channel=%d, format=0x%x\n",
1091
 
                  nid, stream_tag, channel_id, format);
1092
 
        p = get_hda_cvt_setup(codec, nid);
1093
 
        if (!p)
1094
 
                return;
1095
 
 
1096
 
        if (codec->patch_ops.stream_pm)
1097
 
                codec->patch_ops.stream_pm(codec, nid, true);
1098
 
        if (codec->pcm_format_first)
1099
 
                update_pcm_format(codec, p, nid, format);
1100
 
        update_pcm_stream_id(codec, p, nid, stream_tag, channel_id);
1101
 
        if (!codec->pcm_format_first)
1102
 
                update_pcm_format(codec, p, nid, format);
1103
 
 
1104
 
        p->active = 1;
1105
 
        p->dirty = 0;
1106
 
 
1107
 
        /* make other inactive cvts with the same stream-tag dirty */
1108
 
        type = get_wcaps_type(get_wcaps(codec, nid));
1109
 
        list_for_each_codec(c, codec->bus) {
1110
 
                snd_array_for_each(&c->cvt_setups, i, p) {
1111
 
                        if (!p->active && p->stream_tag == stream_tag &&
1112
 
                            get_wcaps_type(get_wcaps(c, p->nid)) == type)
1113
 
                                p->dirty = 1;
1114
 
                }
1115
 
        }
1116
 
}
1117
 
EXPORT_SYMBOL_GPL(snd_hda_codec_setup_stream);
1118
 
 
1119
 
static void really_cleanup_stream(struct hda_codec *codec,
1120
 
                                  struct hda_cvt_setup *q);
1121
 
 
1122
 
/**
1123
 
 * __snd_hda_codec_cleanup_stream - clean up the codec for closing
1124
 
 * @codec: the CODEC to clean up
1125
 
 * @nid: the NID to clean up
1126
 
 * @do_now: really clean up the stream instead of clearing the active flag
1127
 
 */
1128
 
void __snd_hda_codec_cleanup_stream(struct hda_codec *codec, hda_nid_t nid,
1129
 
                                    int do_now)
1130
 
{
1131
 
        struct hda_cvt_setup *p;
1132
 
 
1133
 
        if (!nid)
1134
 
                return;
1135
 
 
1136
 
        if (codec->no_sticky_stream)
1137
 
                do_now = 1;
1138
 
 
1139
 
        codec_dbg(codec, "hda_codec_cleanup_stream: NID=0x%x\n", nid);
1140
 
        p = get_hda_cvt_setup(codec, nid);
1141
 
        if (p) {
1142
 
                /* here we just clear the active flag when do_now isn't set;
1143
 
                 * actual clean-ups will be done later in
1144
 
                 * purify_inactive_streams() called from snd_hda_codec_prpapre()
1145
 
                 */
1146
 
                if (do_now)
1147
 
                        really_cleanup_stream(codec, p);
1148
 
                else
1149
 
                        p->active = 0;
1150
 
        }
1151
 
}
1152
 
EXPORT_SYMBOL_GPL(__snd_hda_codec_cleanup_stream);
1153
 
 
1154
 
static void really_cleanup_stream(struct hda_codec *codec,
1155
 
                                  struct hda_cvt_setup *q)
1156
 
{
1157
 
        hda_nid_t nid = q->nid;
1158
 
        if (q->stream_tag || q->channel_id)
1159
 
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CHANNEL_STREAMID, 0);
1160
 
        if (q->format_id)
1161
 
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_STREAM_FORMAT, 0
1162
 
);
1163
 
        memset(q, 0, sizeof(*q));
1164
 
        q->nid = nid;
1165
 
        if (codec->patch_ops.stream_pm)
1166
 
                codec->patch_ops.stream_pm(codec, nid, false);
1167
 
}
1168
 
 
1169
 
/* clean up the all conflicting obsolete streams */
1170
 
static void purify_inactive_streams(struct hda_codec *codec)
1171
 
{
1172
 
        struct hda_codec *c;
1173
 
        struct hda_cvt_setup *p;
1174
 
        int i;
1175
 
 
1176
 
        list_for_each_codec(c, codec->bus) {
1177
 
                snd_array_for_each(&c->cvt_setups, i, p) {
1178
 
                        if (p->dirty)
1179
 
                                really_cleanup_stream(c, p);
1180
 
                }
1181
 
        }
1182
 
}
1183
 
 
1184
 
#ifdef CONFIG_PM
1185
 
/* clean up all streams; called from suspend */
1186
 
static void hda_cleanup_all_streams(struct hda_codec *codec)
1187
 
{
1188
 
        struct hda_cvt_setup *p;
1189
 
        int i;
1190
 
 
1191
 
        snd_array_for_each(&codec->cvt_setups, i, p) {
1192
 
                if (p->stream_tag)
1193
 
                        really_cleanup_stream(codec, p);
1194
 
        }
1195
 
}
1196
 
#endif
1197
 
 
1198
 
/*
1199
 
 * amp access functions
1200
 
 */
1201
 
 
1202
 
/**
1203
 
 * query_amp_caps - query AMP capabilities
1204
 
 * @codec: the HD-auio codec
1205
 
 * @nid: the NID to query
1206
 
 * @direction: either #HDA_INPUT or #HDA_OUTPUT
1207
 
 *
1208
 
 * Query AMP capabilities for the given widget and direction.
1209
 
 * Returns the obtained capability bits.
1210
 
 *
1211
 
 * When cap bits have been already read, this doesn't read again but
1212
 
 * returns the cached value.
1213
 
 */
1214
 
u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction)
1215
 
{
1216
 
        if (!(get_wcaps(codec, nid) & AC_WCAP_AMP_OVRD))
1217
 
                nid = codec->core.afg;
1218
 
        return snd_hda_param_read(codec, nid,
1219
 
                                  direction == HDA_OUTPUT ?
1220
 
                                  AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP);
1221
 
}
1222
 
EXPORT_SYMBOL_GPL(query_amp_caps);
1223
 
 
1224
 
/**
1225
 
 * snd_hda_check_amp_caps - query AMP capabilities
1226
 
 * @codec: the HD-audio codec
1227
 
 * @nid: the NID to query
1228
 
 * @dir: either #HDA_INPUT or #HDA_OUTPUT
1229
 
 * @bits: bit mask to check the result
1230
 
 *
1231
 
 * Check whether the widget has the given amp capability for the direction.
1232
 
 */
1233
 
bool snd_hda_check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
1234
 
                           int dir, unsigned int bits)
1235
 
{
1236
 
        if (!nid)
1237
 
                return false;
1238
 
        if (get_wcaps(codec, nid) & (1 << (dir + 1)))
1239
 
                if (query_amp_caps(codec, nid, dir) & bits)
1240
 
                        return true;
1241
 
        return false;
1242
 
}
1243
 
EXPORT_SYMBOL_GPL(snd_hda_check_amp_caps);
1244
 
 
1245
 
/**
1246
 
 * snd_hda_override_amp_caps - Override the AMP capabilities
1247
 
 * @codec: the CODEC to clean up
1248
 
 * @nid: the NID to clean up
1249
 
 * @dir: either #HDA_INPUT or #HDA_OUTPUT
1250
 
 * @caps: the capability bits to set
1251
 
 *
1252
 
 * Override the cached AMP caps bits value by the given one.
1253
 
 * This function is useful if the driver needs to adjust the AMP ranges,
1254
 
 * e.g. limit to 0dB, etc.
1255
 
 *
1256
 
 * Returns zero if successful or a negative error code.
1257
 
 */
1258
 
int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
1259
 
                              unsigned int caps)
1260
 
{
1261
 
        unsigned int parm;
1262
 
 
1263
 
        snd_hda_override_wcaps(codec, nid,
1264
 
                               get_wcaps(codec, nid) | AC_WCAP_AMP_OVRD);
1265
 
        parm = dir == HDA_OUTPUT ? AC_PAR_AMP_OUT_CAP : AC_PAR_AMP_IN_CAP;
1266
 
        return snd_hdac_override_parm(&codec->core, nid, parm, caps);
1267
 
}
1268
 
EXPORT_SYMBOL_GPL(snd_hda_override_amp_caps);
1269
 
 
1270
 
/**
1271
 
 * snd_hda_codec_amp_update - update the AMP mono value
1272
 
 * @codec: HD-audio codec
1273
 
 * @nid: NID to read the AMP value
1274
 
 * @ch: channel to update (0 or 1)
1275
 
 * @dir: #HDA_INPUT or #HDA_OUTPUT
1276
 
 * @idx: the index value (only for input direction)
1277
 
 * @mask: bit mask to set
1278
 
 * @val: the bits value to set
1279
 
 *
1280
 
 * Update the AMP values for the given channel, direction and index.
1281
 
 */
1282
 
int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid,
1283
 
                             int ch, int dir, int idx, int mask, int val)
1284
 
{
1285
 
        unsigned int cmd = snd_hdac_regmap_encode_amp(nid, ch, dir, idx);
1286
 
 
1287
 
        /* enable fake mute if no h/w mute but min=mute */
1288
 
        if ((query_amp_caps(codec, nid, dir) &
1289
 
             (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE)) == AC_AMPCAP_MIN_MUTE)
1290
 
                cmd |= AC_AMP_FAKE_MUTE;
1291
 
        return snd_hdac_regmap_update_raw(&codec->core, cmd, mask, val);
1292
 
}
1293
 
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_update);
1294
 
 
1295
 
/**
1296
 
 * snd_hda_codec_amp_stereo - update the AMP stereo values
1297
 
 * @codec: HD-audio codec
1298
 
 * @nid: NID to read the AMP value
1299
 
 * @direction: #HDA_INPUT or #HDA_OUTPUT
1300
 
 * @idx: the index value (only for input direction)
1301
 
 * @mask: bit mask to set
1302
 
 * @val: the bits value to set
1303
 
 *
1304
 
 * Update the AMP values like snd_hda_codec_amp_update(), but for a
1305
 
 * stereo widget with the same mask and value.
1306
 
 */
1307
 
int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
1308
 
                             int direction, int idx, int mask, int val)
1309
 
{
1310
 
        int ch, ret = 0;
1311
 
 
1312
 
        if (snd_BUG_ON(mask & ~0xff))
1313
 
                mask &= 0xff;
1314
 
        for (ch = 0; ch < 2; ch++)
1315
 
                ret |= snd_hda_codec_amp_update(codec, nid, ch, direction,
1316
 
                                                idx, mask, val);
1317
 
        return ret;
1318
 
}
1319
 
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_stereo);
1320
 
 
1321
 
/**
1322
 
 * snd_hda_codec_amp_init - initialize the AMP value
1323
 
 * @codec: the HDA codec
1324
 
 * @nid: NID to read the AMP value
1325
 
 * @ch: channel (left=0 or right=1)
1326
 
 * @dir: #HDA_INPUT or #HDA_OUTPUT
1327
 
 * @idx: the index value (only for input direction)
1328
 
 * @mask: bit mask to set
1329
 
 * @val: the bits value to set
1330
 
 *
1331
 
 * Works like snd_hda_codec_amp_update() but it writes the value only at
1332
 
 * the first access.  If the amp was already initialized / updated beforehand,
1333
 
 * this does nothing.
1334
 
 */
1335
 
int snd_hda_codec_amp_init(struct hda_codec *codec, hda_nid_t nid, int ch,
1336
 
                           int dir, int idx, int mask, int val)
1337
 
{
1338
 
        int orig;
1339
 
 
1340
 
        if (!codec->core.regmap)
1341
 
                return -EINVAL;
1342
 
        regcache_cache_only(codec->core.regmap, true);
1343
 
        orig = snd_hda_codec_amp_read(codec, nid, ch, dir, idx);
1344
 
        regcache_cache_only(codec->core.regmap, false);
1345
 
        if (orig >= 0)
1346
 
                return 0;
1347
 
        return snd_hda_codec_amp_update(codec, nid, ch, dir, idx, mask, val);
1348
 
}
1349
 
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init);
1350
 
 
1351
 
/**
1352
 
 * snd_hda_codec_amp_init_stereo - initialize the stereo AMP value
1353
 
 * @codec: the HDA codec
1354
 
 * @nid: NID to read the AMP value
1355
 
 * @dir: #HDA_INPUT or #HDA_OUTPUT
1356
 
 * @idx: the index value (only for input direction)
1357
 
 * @mask: bit mask to set
1358
 
 * @val: the bits value to set
1359
 
 *
1360
 
 * Call snd_hda_codec_amp_init() for both stereo channels.
1361
 
 */
1362
 
int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
1363
 
                                  int dir, int idx, int mask, int val)
1364
 
{
1365
 
        int ch, ret = 0;
1366
 
 
1367
 
        if (snd_BUG_ON(mask & ~0xff))
1368
 
                mask &= 0xff;
1369
 
        for (ch = 0; ch < 2; ch++)
1370
 
                ret |= snd_hda_codec_amp_init(codec, nid, ch, dir,
1371
 
                                              idx, mask, val);
1372
 
        return ret;
1373
 
}
1374
 
EXPORT_SYMBOL_GPL(snd_hda_codec_amp_init_stereo);
1375
 
 
1376
 
static u32 get_amp_max_value(struct hda_codec *codec, hda_nid_t nid, int dir,
1377
 
                             unsigned int ofs)
1378
 
{
1379
 
        u32 caps = query_amp_caps(codec, nid, dir);
1380
 
        /* get num steps */
1381
 
        caps = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
1382
 
        if (ofs < caps)
1383
 
                caps -= ofs;
1384
 
        return caps;
1385
 
}
1386
 
 
1387
 
/**
1388
 
 * snd_hda_mixer_amp_volume_info - Info callback for a standard AMP mixer
1389
 
 * @kcontrol: referred ctl element
1390
 
 * @uinfo: pointer to get/store the data
1391
 
 *
1392
 
 * The control element is supposed to have the private_value field
1393
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
1394
 
 */
1395
 
int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol,
1396
 
                                  struct snd_ctl_elem_info *uinfo)
1397
 
{
1398
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1399
 
        u16 nid = get_amp_nid(kcontrol);
1400
 
        u8 chs = get_amp_channels(kcontrol);
1401
 
        int dir = get_amp_direction(kcontrol);
1402
 
        unsigned int ofs = get_amp_offset(kcontrol);
1403
 
 
1404
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
1405
 
        uinfo->count = chs == 3 ? 2 : 1;
1406
 
        uinfo->value.integer.min = 0;
1407
 
        uinfo->value.integer.max = get_amp_max_value(codec, nid, dir, ofs);
1408
 
        if (!uinfo->value.integer.max) {
1409
 
                codec_warn(codec,
1410
 
                           "num_steps = 0 for NID=0x%x (ctl = %s)\n",
1411
 
                           nid, kcontrol->id.name);
1412
 
                return -EINVAL;
1413
 
        }
1414
 
        return 0;
1415
 
}
1416
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_info);
1417
 
 
1418
 
 
1419
 
static inline unsigned int
1420
 
read_amp_value(struct hda_codec *codec, hda_nid_t nid,
1421
 
               int ch, int dir, int idx, unsigned int ofs)
1422
 
{
1423
 
        unsigned int val;
1424
 
        val = snd_hda_codec_amp_read(codec, nid, ch, dir, idx);
1425
 
        val &= HDA_AMP_VOLMASK;
1426
 
        if (val >= ofs)
1427
 
                val -= ofs;
1428
 
        else
1429
 
                val = 0;
1430
 
        return val;
1431
 
}
1432
 
 
1433
 
static inline int
1434
 
update_amp_value(struct hda_codec *codec, hda_nid_t nid,
1435
 
                 int ch, int dir, int idx, unsigned int ofs,
1436
 
                 unsigned int val)
1437
 
{
1438
 
        unsigned int maxval;
1439
 
 
1440
 
        if (val > 0)
1441
 
                val += ofs;
1442
 
        /* ofs = 0: raw max value */
1443
 
        maxval = get_amp_max_value(codec, nid, dir, 0);
1444
 
        if (val > maxval)
1445
 
                val = maxval;
1446
 
        return snd_hda_codec_amp_update(codec, nid, ch, dir, idx,
1447
 
                                        HDA_AMP_VOLMASK, val);
1448
 
}
1449
 
 
1450
 
/**
1451
 
 * snd_hda_mixer_amp_volume_get - Get callback for a standard AMP mixer volume
1452
 
 * @kcontrol: ctl element
1453
 
 * @ucontrol: pointer to get/store the data
1454
 
 *
1455
 
 * The control element is supposed to have the private_value field
1456
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
1457
 
 */
1458
 
int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol,
1459
 
                                 struct snd_ctl_elem_value *ucontrol)
1460
 
{
1461
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1462
 
        hda_nid_t nid = get_amp_nid(kcontrol);
1463
 
        int chs = get_amp_channels(kcontrol);
1464
 
        int dir = get_amp_direction(kcontrol);
1465
 
        int idx = get_amp_index(kcontrol);
1466
 
        unsigned int ofs = get_amp_offset(kcontrol);
1467
 
        long *valp = ucontrol->value.integer.value;
1468
 
 
1469
 
        if (chs & 1)
1470
 
                *valp++ = read_amp_value(codec, nid, 0, dir, idx, ofs);
1471
 
        if (chs & 2)
1472
 
                *valp = read_amp_value(codec, nid, 1, dir, idx, ofs);
1473
 
        return 0;
1474
 
}
1475
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_get);
1476
 
 
1477
 
/**
1478
 
 * snd_hda_mixer_amp_volume_put - Put callback for a standard AMP mixer volume
1479
 
 * @kcontrol: ctl element
1480
 
 * @ucontrol: pointer to get/store the data
1481
 
 *
1482
 
 * The control element is supposed to have the private_value field
1483
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
1484
 
 */
1485
 
int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol,
1486
 
                                 struct snd_ctl_elem_value *ucontrol)
1487
 
{
1488
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1489
 
        hda_nid_t nid = get_amp_nid(kcontrol);
1490
 
        int chs = get_amp_channels(kcontrol);
1491
 
        int dir = get_amp_direction(kcontrol);
1492
 
        int idx = get_amp_index(kcontrol);
1493
 
        unsigned int ofs = get_amp_offset(kcontrol);
1494
 
        long *valp = ucontrol->value.integer.value;
1495
 
        int change = 0;
1496
 
 
1497
 
        if (chs & 1) {
1498
 
                change = update_amp_value(codec, nid, 0, dir, idx, ofs, *valp);
1499
 
                valp++;
1500
 
        }
1501
 
        if (chs & 2)
1502
 
                change |= update_amp_value(codec, nid, 1, dir, idx, ofs, *valp);
1503
 
        return change;
1504
 
}
1505
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_volume_put);
1506
 
 
1507
 
/* inquiry the amp caps and convert to TLV */
1508
 
static void get_ctl_amp_tlv(struct snd_kcontrol *kcontrol, unsigned int *tlv)
1509
 
{
1510
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1511
 
        hda_nid_t nid = get_amp_nid(kcontrol);
1512
 
        int dir = get_amp_direction(kcontrol);
1513
 
        unsigned int ofs = get_amp_offset(kcontrol);
1514
 
        bool min_mute = get_amp_min_mute(kcontrol);
1515
 
        u32 caps, val1, val2;
1516
 
 
1517
 
        caps = query_amp_caps(codec, nid, dir);
1518
 
        val2 = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT;
1519
 
        val2 = (val2 + 1) * 25;
1520
 
        val1 = -((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT);
1521
 
        val1 += ofs;
1522
 
        val1 = ((int)val1) * ((int)val2);
1523
 
        if (min_mute || (caps & AC_AMPCAP_MIN_MUTE))
1524
 
                val2 |= TLV_DB_SCALE_MUTE;
1525
 
        tlv[SNDRV_CTL_TLVO_TYPE] = SNDRV_CTL_TLVT_DB_SCALE;
1526
 
        tlv[SNDRV_CTL_TLVO_LEN] = 2 * sizeof(unsigned int);
1527
 
        tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] = val1;
1528
 
        tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] = val2;
1529
 
}
1530
 
 
1531
 
/**
1532
 
 * snd_hda_mixer_amp_tlv - TLV callback for a standard AMP mixer volume
1533
 
 * @kcontrol: ctl element
1534
 
 * @op_flag: operation flag
1535
 
 * @size: byte size of input TLV
1536
 
 * @_tlv: TLV data
1537
 
 *
1538
 
 * The control element is supposed to have the private_value field
1539
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
1540
 
 */
1541
 
int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1542
 
                          unsigned int size, unsigned int __user *_tlv)
1543
 
{
1544
 
        unsigned int tlv[4];
1545
 
 
1546
 
        if (size < 4 * sizeof(unsigned int))
1547
 
                return -ENOMEM;
1548
 
        get_ctl_amp_tlv(kcontrol, tlv);
1549
 
        if (copy_to_user(_tlv, tlv, sizeof(tlv)))
1550
 
                return -EFAULT;
1551
 
        return 0;
1552
 
}
1553
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_tlv);
1554
 
 
1555
 
/**
1556
 
 * snd_hda_set_vmaster_tlv - Set TLV for a virtual master control
1557
 
 * @codec: HD-audio codec
1558
 
 * @nid: NID of a reference widget
1559
 
 * @dir: #HDA_INPUT or #HDA_OUTPUT
1560
 
 * @tlv: TLV data to be stored, at least 4 elements
1561
 
 *
1562
 
 * Set (static) TLV data for a virtual master volume using the AMP caps
1563
 
 * obtained from the reference NID.
1564
 
 * The volume range is recalculated as if the max volume is 0dB.
1565
 
 */
1566
 
void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
1567
 
                             unsigned int *tlv)
1568
 
{
1569
 
        u32 caps;
1570
 
        int nums, step;
1571
 
 
1572
 
        caps = query_amp_caps(codec, nid, dir);
1573
 
        nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
1574
 
        step = (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT;
1575
 
        step = (step + 1) * 25;
1576
 
        tlv[SNDRV_CTL_TLVO_TYPE] = SNDRV_CTL_TLVT_DB_SCALE;
1577
 
        tlv[SNDRV_CTL_TLVO_LEN] = 2 * sizeof(unsigned int);
1578
 
        tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] = -nums * step;
1579
 
        tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP] = step;
1580
 
}
1581
 
EXPORT_SYMBOL_GPL(snd_hda_set_vmaster_tlv);
1582
 
 
1583
 
/* find a mixer control element with the given name */
1584
 
static struct snd_kcontrol *
1585
 
find_mixer_ctl(struct hda_codec *codec, const char *name, int dev, int idx)
1586
 
{
1587
 
        struct snd_ctl_elem_id id;
1588
 
        memset(&id, 0, sizeof(id));
1589
 
        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1590
 
        id.device = dev;
1591
 
        id.index = idx;
1592
 
        if (snd_BUG_ON(strlen(name) >= sizeof(id.name)))
1593
 
                return NULL;
1594
 
        strcpy(id.name, name);
1595
 
        return snd_ctl_find_id(codec->card, &id);
1596
 
}
1597
 
 
1598
 
/**
1599
 
 * snd_hda_find_mixer_ctl - Find a mixer control element with the given name
1600
 
 * @codec: HD-audio codec
1601
 
 * @name: ctl id name string
1602
 
 *
1603
 
 * Get the control element with the given id string and IFACE_MIXER.
1604
 
 */
1605
 
struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
1606
 
                                            const char *name)
1607
 
{
1608
 
        return find_mixer_ctl(codec, name, 0, 0);
1609
 
}
1610
 
EXPORT_SYMBOL_GPL(snd_hda_find_mixer_ctl);
1611
 
 
1612
 
static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name,
1613
 
                                    int start_idx)
1614
 
{
1615
 
        int i, idx;
1616
 
        /* 16 ctlrs should be large enough */
1617
 
        for (i = 0, idx = start_idx; i < 16; i++, idx++) {
1618
 
                if (!find_mixer_ctl(codec, name, 0, idx))
1619
 
                        return idx;
1620
 
        }
1621
 
        return -EBUSY;
1622
 
}
1623
 
 
1624
 
/**
1625
 
 * snd_hda_ctl_add - Add a control element and assign to the codec
1626
 
 * @codec: HD-audio codec
1627
 
 * @nid: corresponding NID (optional)
1628
 
 * @kctl: the control element to assign
1629
 
 *
1630
 
 * Add the given control element to an array inside the codec instance.
1631
 
 * All control elements belonging to a codec are supposed to be added
1632
 
 * by this function so that a proper clean-up works at the free or
1633
 
 * reconfiguration time.
1634
 
 *
1635
 
 * If non-zero @nid is passed, the NID is assigned to the control element.
1636
 
 * The assignment is shown in the codec proc file.
1637
 
 *
1638
 
 * snd_hda_ctl_add() checks the control subdev id field whether
1639
 
 * #HDA_SUBDEV_NID_FLAG bit is set.  If set (and @nid is zero), the lower
1640
 
 * bits value is taken as the NID to assign. The #HDA_NID_ITEM_AMP bit
1641
 
 * specifies if kctl->private_value is a HDA amplifier value.
1642
 
 */
1643
 
int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid,
1644
 
                    struct snd_kcontrol *kctl)
1645
 
{
1646
 
        int err;
1647
 
        unsigned short flags = 0;
1648
 
        struct hda_nid_item *item;
1649
 
 
1650
 
        if (kctl->id.subdevice & HDA_SUBDEV_AMP_FLAG) {
1651
 
                flags |= HDA_NID_ITEM_AMP;
1652
 
                if (nid == 0)
1653
 
                        nid = get_amp_nid_(kctl->private_value);
1654
 
        }
1655
 
        if ((kctl->id.subdevice & HDA_SUBDEV_NID_FLAG) != 0 && nid == 0)
1656
 
                nid = kctl->id.subdevice & 0xffff;
1657
 
        if (kctl->id.subdevice & (HDA_SUBDEV_NID_FLAG|HDA_SUBDEV_AMP_FLAG))
1658
 
                kctl->id.subdevice = 0;
1659
 
        err = snd_ctl_add(codec->card, kctl);
1660
 
        if (err < 0)
1661
 
                return err;
1662
 
        item = snd_array_new(&codec->mixers);
1663
 
        if (!item)
1664
 
                return -ENOMEM;
1665
 
        item->kctl = kctl;
1666
 
        item->nid = nid;
1667
 
        item->flags = flags;
1668
 
        return 0;
1669
 
}
1670
 
EXPORT_SYMBOL_GPL(snd_hda_ctl_add);
1671
 
 
1672
 
/**
1673
 
 * snd_hda_add_nid - Assign a NID to a control element
1674
 
 * @codec: HD-audio codec
1675
 
 * @nid: corresponding NID (optional)
1676
 
 * @kctl: the control element to assign
1677
 
 * @index: index to kctl
1678
 
 *
1679
 
 * Add the given control element to an array inside the codec instance.
1680
 
 * This function is used when #snd_hda_ctl_add cannot be used for 1:1
1681
 
 * NID:KCTL mapping - for example "Capture Source" selector.
1682
 
 */
1683
 
int snd_hda_add_nid(struct hda_codec *codec, struct snd_kcontrol *kctl,
1684
 
                    unsigned int index, hda_nid_t nid)
1685
 
{
1686
 
        struct hda_nid_item *item;
1687
 
 
1688
 
        if (nid > 0) {
1689
 
                item = snd_array_new(&codec->nids);
1690
 
                if (!item)
1691
 
                        return -ENOMEM;
1692
 
                item->kctl = kctl;
1693
 
                item->index = index;
1694
 
                item->nid = nid;
1695
 
                return 0;
1696
 
        }
1697
 
        codec_err(codec, "no NID for mapping control %s:%d:%d\n",
1698
 
                  kctl->id.name, kctl->id.index, index);
1699
 
        return -EINVAL;
1700
 
}
1701
 
EXPORT_SYMBOL_GPL(snd_hda_add_nid);
1702
 
 
1703
 
/**
1704
 
 * snd_hda_ctls_clear - Clear all controls assigned to the given codec
1705
 
 * @codec: HD-audio codec
1706
 
 */
1707
 
void snd_hda_ctls_clear(struct hda_codec *codec)
1708
 
{
1709
 
        int i;
1710
 
        struct hda_nid_item *items = codec->mixers.list;
1711
 
        for (i = 0; i < codec->mixers.used; i++)
1712
 
                snd_ctl_remove(codec->card, items[i].kctl);
1713
 
        snd_array_free(&codec->mixers);
1714
 
        snd_array_free(&codec->nids);
1715
 
}
1716
 
 
1717
 
/**
1718
 
 * snd_hda_lock_devices - pseudo device locking
1719
 
 * @bus: the BUS
1720
 
 *
1721
 
 * toggle card->shutdown to allow/disallow the device access (as a hack)
1722
 
 */
1723
 
int snd_hda_lock_devices(struct hda_bus *bus)
1724
 
{
1725
 
        struct snd_card *card = bus->card;
1726
 
        struct hda_codec *codec;
1727
 
 
1728
 
        spin_lock(&card->files_lock);
1729
 
        if (card->shutdown)
1730
 
                goto err_unlock;
1731
 
        card->shutdown = 1;
1732
 
        if (!list_empty(&card->ctl_files))
1733
 
                goto err_clear;
1734
 
 
1735
 
        list_for_each_codec(codec, bus) {
1736
 
                struct hda_pcm *cpcm;
1737
 
                list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
1738
 
                        if (!cpcm->pcm)
1739
 
                                continue;
1740
 
                        if (cpcm->pcm->streams[0].substream_opened ||
1741
 
                            cpcm->pcm->streams[1].substream_opened)
1742
 
                                goto err_clear;
1743
 
                }
1744
 
        }
1745
 
        spin_unlock(&card->files_lock);
1746
 
        return 0;
1747
 
 
1748
 
 err_clear:
1749
 
        card->shutdown = 0;
1750
 
 err_unlock:
1751
 
        spin_unlock(&card->files_lock);
1752
 
        return -EINVAL;
1753
 
}
1754
 
EXPORT_SYMBOL_GPL(snd_hda_lock_devices);
1755
 
 
1756
 
/**
1757
 
 * snd_hda_unlock_devices - pseudo device unlocking
1758
 
 * @bus: the BUS
1759
 
 */
1760
 
void snd_hda_unlock_devices(struct hda_bus *bus)
1761
 
{
1762
 
        struct snd_card *card = bus->card;
1763
 
 
1764
 
        spin_lock(&card->files_lock);
1765
 
        card->shutdown = 0;
1766
 
        spin_unlock(&card->files_lock);
1767
 
}
1768
 
EXPORT_SYMBOL_GPL(snd_hda_unlock_devices);
1769
 
 
1770
 
/**
1771
 
 * snd_hda_codec_reset - Clear all objects assigned to the codec
1772
 
 * @codec: HD-audio codec
1773
 
 *
1774
 
 * This frees the all PCM and control elements assigned to the codec, and
1775
 
 * clears the caches and restores the pin default configurations.
1776
 
 *
1777
 
 * When a device is being used, it returns -EBSY.  If successfully freed,
1778
 
 * returns zero.
1779
 
 */
1780
 
int snd_hda_codec_reset(struct hda_codec *codec)
1781
 
{
1782
 
        struct hda_bus *bus = codec->bus;
1783
 
 
1784
 
        if (snd_hda_lock_devices(bus) < 0)
1785
 
                return -EBUSY;
1786
 
 
1787
 
        /* OK, let it free */
1788
 
        snd_hdac_device_unregister(&codec->core);
1789
 
 
1790
 
        /* allow device access again */
1791
 
        snd_hda_unlock_devices(bus);
1792
 
        return 0;
1793
 
}
1794
 
 
1795
 
typedef int (*map_slave_func_t)(struct hda_codec *, void *, struct snd_kcontrol *);
1796
 
 
1797
 
/* apply the function to all matching slave ctls in the mixer list */
1798
 
static int map_slaves(struct hda_codec *codec, const char * const *slaves,
1799
 
                      const char *suffix, map_slave_func_t func, void *data) 
1800
 
{
1801
 
        struct hda_nid_item *items;
1802
 
        const char * const *s;
1803
 
        int i, err;
1804
 
 
1805
 
        items = codec->mixers.list;
1806
 
        for (i = 0; i < codec->mixers.used; i++) {
1807
 
                struct snd_kcontrol *sctl = items[i].kctl;
1808
 
                if (!sctl || sctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER)
1809
 
                        continue;
1810
 
                for (s = slaves; *s; s++) {
1811
 
                        char tmpname[sizeof(sctl->id.name)];
1812
 
                        const char *name = *s;
1813
 
                        if (suffix) {
1814
 
                                snprintf(tmpname, sizeof(tmpname), "%s %s",
1815
 
                                         name, suffix);
1816
 
                                name = tmpname;
1817
 
                        }
1818
 
                        if (!strcmp(sctl->id.name, name)) {
1819
 
                                err = func(codec, data, sctl);
1820
 
                                if (err)
1821
 
                                        return err;
1822
 
                                break;
1823
 
                        }
1824
 
                }
1825
 
        }
1826
 
        return 0;
1827
 
}
1828
 
 
1829
 
static int check_slave_present(struct hda_codec *codec,
1830
 
                               void *data, struct snd_kcontrol *sctl)
1831
 
{
1832
 
        return 1;
1833
 
}
1834
 
 
1835
 
/* call kctl->put with the given value(s) */
1836
 
static int put_kctl_with_value(struct snd_kcontrol *kctl, int val)
1837
 
{
1838
 
        struct snd_ctl_elem_value *ucontrol;
1839
 
        ucontrol = kzalloc(sizeof(*ucontrol), GFP_KERNEL);
1840
 
        if (!ucontrol)
1841
 
                return -ENOMEM;
1842
 
        ucontrol->value.integer.value[0] = val;
1843
 
        ucontrol->value.integer.value[1] = val;
1844
 
        kctl->put(kctl, ucontrol);
1845
 
        kfree(ucontrol);
1846
 
        return 0;
1847
 
}
1848
 
 
1849
 
struct slave_init_arg {
1850
 
        struct hda_codec *codec;
1851
 
        int step;
1852
 
};
1853
 
 
1854
 
/* initialize the slave volume with 0dB via snd_ctl_apply_vmaster_slaves() */
1855
 
static int init_slave_0dB(struct snd_kcontrol *slave,
1856
 
                          struct snd_kcontrol *kctl,
1857
 
                          void *_arg)
1858
 
{
1859
 
        struct slave_init_arg *arg = _arg;
1860
 
        int _tlv[4];
1861
 
        const int *tlv = NULL;
1862
 
        int step;
1863
 
        int val;
1864
 
 
1865
 
        if (kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) {
1866
 
                if (kctl->tlv.c != snd_hda_mixer_amp_tlv) {
1867
 
                        codec_err(arg->codec,
1868
 
                                  "Unexpected TLV callback for slave %s:%d\n",
1869
 
                                  kctl->id.name, kctl->id.index);
1870
 
                        return 0; /* ignore */
1871
 
                }
1872
 
                get_ctl_amp_tlv(kctl, _tlv);
1873
 
                tlv = _tlv;
1874
 
        } else if (kctl->vd[0].access & SNDRV_CTL_ELEM_ACCESS_TLV_READ)
1875
 
                tlv = kctl->tlv.p;
1876
 
 
1877
 
        if (!tlv || tlv[SNDRV_CTL_TLVO_TYPE] != SNDRV_CTL_TLVT_DB_SCALE)
1878
 
                return 0;
1879
 
 
1880
 
        step = tlv[SNDRV_CTL_TLVO_DB_SCALE_MUTE_AND_STEP];
1881
 
        step &= ~TLV_DB_SCALE_MUTE;
1882
 
        if (!step)
1883
 
                return 0;
1884
 
        if (arg->step && arg->step != step) {
1885
 
                codec_err(arg->codec,
1886
 
                          "Mismatching dB step for vmaster slave (%d!=%d)\n",
1887
 
                          arg->step, step);
1888
 
                return 0;
1889
 
        }
1890
 
 
1891
 
        arg->step = step;
1892
 
        val = -tlv[SNDRV_CTL_TLVO_DB_SCALE_MIN] / step;
1893
 
        if (val > 0) {
1894
 
                put_kctl_with_value(slave, val);
1895
 
                return val;
1896
 
        }
1897
 
 
1898
 
        return 0;
1899
 
}
1900
 
 
1901
 
/* unmute the slave via snd_ctl_apply_vmaster_slaves() */
1902
 
static int init_slave_unmute(struct snd_kcontrol *slave,
1903
 
                             struct snd_kcontrol *kctl,
1904
 
                             void *_arg)
1905
 
{
1906
 
        return put_kctl_with_value(slave, 1);
1907
 
}
1908
 
 
1909
 
static int add_slave(struct hda_codec *codec,
1910
 
                     void *data, struct snd_kcontrol *slave)
1911
 
{
1912
 
        return snd_ctl_add_slave(data, slave);
1913
 
}
1914
 
 
1915
 
/**
1916
 
 * __snd_hda_add_vmaster - create a virtual master control and add slaves
1917
 
 * @codec: HD-audio codec
1918
 
 * @name: vmaster control name
1919
 
 * @tlv: TLV data (optional)
1920
 
 * @slaves: slave control names (optional)
1921
 
 * @suffix: suffix string to each slave name (optional)
1922
 
 * @init_slave_vol: initialize slaves to unmute/0dB
1923
 
 * @ctl_ret: store the vmaster kcontrol in return
1924
 
 *
1925
 
 * Create a virtual master control with the given name.  The TLV data
1926
 
 * must be either NULL or a valid data.
1927
 
 *
1928
 
 * @slaves is a NULL-terminated array of strings, each of which is a
1929
 
 * slave control name.  All controls with these names are assigned to
1930
 
 * the new virtual master control.
1931
 
 *
1932
 
 * This function returns zero if successful or a negative error code.
1933
 
 */
1934
 
int __snd_hda_add_vmaster(struct hda_codec *codec, char *name,
1935
 
                        unsigned int *tlv, const char * const *slaves,
1936
 
                          const char *suffix, bool init_slave_vol,
1937
 
                          struct snd_kcontrol **ctl_ret)
1938
 
{
1939
 
        struct snd_kcontrol *kctl;
1940
 
        int err;
1941
 
 
1942
 
        if (ctl_ret)
1943
 
                *ctl_ret = NULL;
1944
 
 
1945
 
        err = map_slaves(codec, slaves, suffix, check_slave_present, NULL);
1946
 
        if (err != 1) {
1947
 
                codec_dbg(codec, "No slave found for %s\n", name);
1948
 
                return 0;
1949
 
        }
1950
 
        kctl = snd_ctl_make_virtual_master(name, tlv);
1951
 
        if (!kctl)
1952
 
                return -ENOMEM;
1953
 
        err = snd_hda_ctl_add(codec, 0, kctl);
1954
 
        if (err < 0)
1955
 
                return err;
1956
 
 
1957
 
        err = map_slaves(codec, slaves, suffix, add_slave, kctl);
1958
 
        if (err < 0)
1959
 
                return err;
1960
 
 
1961
 
        /* init with master mute & zero volume */
1962
 
        put_kctl_with_value(kctl, 0);
1963
 
        if (init_slave_vol) {
1964
 
                struct slave_init_arg arg = {
1965
 
                        .codec = codec,
1966
 
                        .step = 0,
1967
 
                };
1968
 
                snd_ctl_apply_vmaster_slaves(kctl,
1969
 
                                             tlv ? init_slave_0dB : init_slave_unmute,
1970
 
                                             &arg);
1971
 
        }
1972
 
 
1973
 
        if (ctl_ret)
1974
 
                *ctl_ret = kctl;
1975
 
        return 0;
1976
 
}
1977
 
EXPORT_SYMBOL_GPL(__snd_hda_add_vmaster);
1978
 
 
1979
 
/*
1980
 
 * mute-LED control using vmaster
1981
 
 */
1982
 
static int vmaster_mute_mode_info(struct snd_kcontrol *kcontrol,
1983
 
                                  struct snd_ctl_elem_info *uinfo)
1984
 
{
1985
 
        static const char * const texts[] = {
1986
 
                "On", "Off", "Follow Master"
1987
 
        };
1988
 
 
1989
 
        return snd_ctl_enum_info(uinfo, 1, 3, texts);
1990
 
}
1991
 
 
1992
 
static int vmaster_mute_mode_get(struct snd_kcontrol *kcontrol,
1993
 
                                 struct snd_ctl_elem_value *ucontrol)
1994
 
{
1995
 
        struct hda_vmaster_mute_hook *hook = snd_kcontrol_chip(kcontrol);
1996
 
        ucontrol->value.enumerated.item[0] = hook->mute_mode;
1997
 
        return 0;
1998
 
}
1999
 
 
2000
 
static int vmaster_mute_mode_put(struct snd_kcontrol *kcontrol,
2001
 
                                 struct snd_ctl_elem_value *ucontrol)
2002
 
{
2003
 
        struct hda_vmaster_mute_hook *hook = snd_kcontrol_chip(kcontrol);
2004
 
        unsigned int old_mode = hook->mute_mode;
2005
 
 
2006
 
        hook->mute_mode = ucontrol->value.enumerated.item[0];
2007
 
        if (hook->mute_mode > HDA_VMUTE_FOLLOW_MASTER)
2008
 
                hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
2009
 
        if (old_mode == hook->mute_mode)
2010
 
                return 0;
2011
 
        snd_hda_sync_vmaster_hook(hook);
2012
 
        return 1;
2013
 
}
2014
 
 
2015
 
static const struct snd_kcontrol_new vmaster_mute_mode = {
2016
 
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2017
 
        .name = "Mute-LED Mode",
2018
 
        .info = vmaster_mute_mode_info,
2019
 
        .get = vmaster_mute_mode_get,
2020
 
        .put = vmaster_mute_mode_put,
2021
 
};
2022
 
 
2023
 
/* meta hook to call each driver's vmaster hook */
2024
 
static void vmaster_hook(void *private_data, int enabled)
2025
 
{
2026
 
        struct hda_vmaster_mute_hook *hook = private_data;
2027
 
 
2028
 
        if (hook->mute_mode != HDA_VMUTE_FOLLOW_MASTER)
2029
 
                enabled = hook->mute_mode;
2030
 
        hook->hook(hook->codec, enabled);
2031
 
}
2032
 
 
2033
 
/**
2034
 
 * snd_hda_add_vmaster_hook - Add a vmaster hook for mute-LED
2035
 
 * @codec: the HDA codec
2036
 
 * @hook: the vmaster hook object
2037
 
 * @expose_enum_ctl: flag to create an enum ctl
2038
 
 *
2039
 
 * Add a mute-LED hook with the given vmaster switch kctl.
2040
 
 * When @expose_enum_ctl is set, "Mute-LED Mode" control is automatically
2041
 
 * created and associated with the given hook.
2042
 
 */
2043
 
int snd_hda_add_vmaster_hook(struct hda_codec *codec,
2044
 
                             struct hda_vmaster_mute_hook *hook,
2045
 
                             bool expose_enum_ctl)
2046
 
{
2047
 
        struct snd_kcontrol *kctl;
2048
 
 
2049
 
        if (!hook->hook || !hook->sw_kctl)
2050
 
                return 0;
2051
 
        hook->codec = codec;
2052
 
        hook->mute_mode = HDA_VMUTE_FOLLOW_MASTER;
2053
 
        snd_ctl_add_vmaster_hook(hook->sw_kctl, vmaster_hook, hook);
2054
 
        if (!expose_enum_ctl)
2055
 
                return 0;
2056
 
        kctl = snd_ctl_new1(&vmaster_mute_mode, hook);
2057
 
        if (!kctl)
2058
 
                return -ENOMEM;
2059
 
        return snd_hda_ctl_add(codec, 0, kctl);
2060
 
}
2061
 
EXPORT_SYMBOL_GPL(snd_hda_add_vmaster_hook);
2062
 
 
2063
 
/**
2064
 
 * snd_hda_sync_vmaster_hook - Sync vmaster hook
2065
 
 * @hook: the vmaster hook
2066
 
 *
2067
 
 * Call the hook with the current value for synchronization.
2068
 
 * Should be called in init callback.
2069
 
 */
2070
 
void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook)
2071
 
{
2072
 
        if (!hook->hook || !hook->codec)
2073
 
                return;
2074
 
        /* don't call vmaster hook in the destructor since it might have
2075
 
         * been already destroyed
2076
 
         */
2077
 
        if (hook->codec->bus->shutdown)
2078
 
                return;
2079
 
        snd_ctl_sync_vmaster_hook(hook->sw_kctl);
2080
 
}
2081
 
EXPORT_SYMBOL_GPL(snd_hda_sync_vmaster_hook);
2082
 
 
2083
 
 
2084
 
/**
2085
 
 * snd_hda_mixer_amp_switch_info - Info callback for a standard AMP mixer switch
2086
 
 * @kcontrol: referred ctl element
2087
 
 * @uinfo: pointer to get/store the data
2088
 
 *
2089
 
 * The control element is supposed to have the private_value field
2090
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
2091
 
 */
2092
 
int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol,
2093
 
                                  struct snd_ctl_elem_info *uinfo)
2094
 
{
2095
 
        int chs = get_amp_channels(kcontrol);
2096
 
 
2097
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
2098
 
        uinfo->count = chs == 3 ? 2 : 1;
2099
 
        uinfo->value.integer.min = 0;
2100
 
        uinfo->value.integer.max = 1;
2101
 
        return 0;
2102
 
}
2103
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_info);
2104
 
 
2105
 
/**
2106
 
 * snd_hda_mixer_amp_switch_get - Get callback for a standard AMP mixer switch
2107
 
 * @kcontrol: ctl element
2108
 
 * @ucontrol: pointer to get/store the data
2109
 
 *
2110
 
 * The control element is supposed to have the private_value field
2111
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
2112
 
 */
2113
 
int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol,
2114
 
                                 struct snd_ctl_elem_value *ucontrol)
2115
 
{
2116
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2117
 
        hda_nid_t nid = get_amp_nid(kcontrol);
2118
 
        int chs = get_amp_channels(kcontrol);
2119
 
        int dir = get_amp_direction(kcontrol);
2120
 
        int idx = get_amp_index(kcontrol);
2121
 
        long *valp = ucontrol->value.integer.value;
2122
 
 
2123
 
        if (chs & 1)
2124
 
                *valp++ = (snd_hda_codec_amp_read(codec, nid, 0, dir, idx) &
2125
 
                           HDA_AMP_MUTE) ? 0 : 1;
2126
 
        if (chs & 2)
2127
 
                *valp = (snd_hda_codec_amp_read(codec, nid, 1, dir, idx) &
2128
 
                         HDA_AMP_MUTE) ? 0 : 1;
2129
 
        return 0;
2130
 
}
2131
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_get);
2132
 
 
2133
 
/**
2134
 
 * snd_hda_mixer_amp_switch_put - Put callback for a standard AMP mixer switch
2135
 
 * @kcontrol: ctl element
2136
 
 * @ucontrol: pointer to get/store the data
2137
 
 *
2138
 
 * The control element is supposed to have the private_value field
2139
 
 * set up via HDA_COMPOSE_AMP_VAL*() or related macros.
2140
 
 */
2141
 
int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
2142
 
                                 struct snd_ctl_elem_value *ucontrol)
2143
 
{
2144
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2145
 
        hda_nid_t nid = get_amp_nid(kcontrol);
2146
 
        int chs = get_amp_channels(kcontrol);
2147
 
        int dir = get_amp_direction(kcontrol);
2148
 
        int idx = get_amp_index(kcontrol);
2149
 
        long *valp = ucontrol->value.integer.value;
2150
 
        int change = 0;
2151
 
 
2152
 
        if (chs & 1) {
2153
 
                change = snd_hda_codec_amp_update(codec, nid, 0, dir, idx,
2154
 
                                                  HDA_AMP_MUTE,
2155
 
                                                  *valp ? 0 : HDA_AMP_MUTE);
2156
 
                valp++;
2157
 
        }
2158
 
        if (chs & 2)
2159
 
                change |= snd_hda_codec_amp_update(codec, nid, 1, dir, idx,
2160
 
                                                   HDA_AMP_MUTE,
2161
 
                                                   *valp ? 0 : HDA_AMP_MUTE);
2162
 
        hda_call_check_power_status(codec, nid);
2163
 
        return change;
2164
 
}
2165
 
EXPORT_SYMBOL_GPL(snd_hda_mixer_amp_switch_put);
2166
 
 
2167
 
/*
2168
 
 * SPDIF out controls
2169
 
 */
2170
 
 
2171
 
static int snd_hda_spdif_mask_info(struct snd_kcontrol *kcontrol,
2172
 
                                   struct snd_ctl_elem_info *uinfo)
2173
 
{
2174
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
2175
 
        uinfo->count = 1;
2176
 
        return 0;
2177
 
}
2178
 
 
2179
 
static int snd_hda_spdif_cmask_get(struct snd_kcontrol *kcontrol,
2180
 
                                   struct snd_ctl_elem_value *ucontrol)
2181
 
{
2182
 
        ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
2183
 
                                           IEC958_AES0_NONAUDIO |
2184
 
                                           IEC958_AES0_CON_EMPHASIS_5015 |
2185
 
                                           IEC958_AES0_CON_NOT_COPYRIGHT;
2186
 
        ucontrol->value.iec958.status[1] = IEC958_AES1_CON_CATEGORY |
2187
 
                                           IEC958_AES1_CON_ORIGINAL;
2188
 
        return 0;
2189
 
}
2190
 
 
2191
 
static int snd_hda_spdif_pmask_get(struct snd_kcontrol *kcontrol,
2192
 
                                   struct snd_ctl_elem_value *ucontrol)
2193
 
{
2194
 
        ucontrol->value.iec958.status[0] = IEC958_AES0_PROFESSIONAL |
2195
 
                                           IEC958_AES0_NONAUDIO |
2196
 
                                           IEC958_AES0_PRO_EMPHASIS_5015;
2197
 
        return 0;
2198
 
}
2199
 
 
2200
 
static int snd_hda_spdif_default_get(struct snd_kcontrol *kcontrol,
2201
 
                                     struct snd_ctl_elem_value *ucontrol)
2202
 
{
2203
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2204
 
        int idx = kcontrol->private_value;
2205
 
        struct hda_spdif_out *spdif;
2206
 
 
2207
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2208
 
                return -EINVAL;
2209
 
        mutex_lock(&codec->spdif_mutex);
2210
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2211
 
        ucontrol->value.iec958.status[0] = spdif->status & 0xff;
2212
 
        ucontrol->value.iec958.status[1] = (spdif->status >> 8) & 0xff;
2213
 
        ucontrol->value.iec958.status[2] = (spdif->status >> 16) & 0xff;
2214
 
        ucontrol->value.iec958.status[3] = (spdif->status >> 24) & 0xff;
2215
 
        mutex_unlock(&codec->spdif_mutex);
2216
 
 
2217
 
        return 0;
2218
 
}
2219
 
 
2220
 
/* convert from SPDIF status bits to HDA SPDIF bits
2221
 
 * bit 0 (DigEn) is always set zero (to be filled later)
2222
 
 */
2223
 
static unsigned short convert_from_spdif_status(unsigned int sbits)
2224
 
{
2225
 
        unsigned short val = 0;
2226
 
 
2227
 
        if (sbits & IEC958_AES0_PROFESSIONAL)
2228
 
                val |= AC_DIG1_PROFESSIONAL;
2229
 
        if (sbits & IEC958_AES0_NONAUDIO)
2230
 
                val |= AC_DIG1_NONAUDIO;
2231
 
        if (sbits & IEC958_AES0_PROFESSIONAL) {
2232
 
                if ((sbits & IEC958_AES0_PRO_EMPHASIS) ==
2233
 
                    IEC958_AES0_PRO_EMPHASIS_5015)
2234
 
                        val |= AC_DIG1_EMPHASIS;
2235
 
        } else {
2236
 
                if ((sbits & IEC958_AES0_CON_EMPHASIS) ==
2237
 
                    IEC958_AES0_CON_EMPHASIS_5015)
2238
 
                        val |= AC_DIG1_EMPHASIS;
2239
 
                if (!(sbits & IEC958_AES0_CON_NOT_COPYRIGHT))
2240
 
                        val |= AC_DIG1_COPYRIGHT;
2241
 
                if (sbits & (IEC958_AES1_CON_ORIGINAL << 8))
2242
 
                        val |= AC_DIG1_LEVEL;
2243
 
                val |= sbits & (IEC958_AES1_CON_CATEGORY << 8);
2244
 
        }
2245
 
        return val;
2246
 
}
2247
 
 
2248
 
/* convert to SPDIF status bits from HDA SPDIF bits
2249
 
 */
2250
 
static unsigned int convert_to_spdif_status(unsigned short val)
2251
 
{
2252
 
        unsigned int sbits = 0;
2253
 
 
2254
 
        if (val & AC_DIG1_NONAUDIO)
2255
 
                sbits |= IEC958_AES0_NONAUDIO;
2256
 
        if (val & AC_DIG1_PROFESSIONAL)
2257
 
                sbits |= IEC958_AES0_PROFESSIONAL;
2258
 
        if (sbits & IEC958_AES0_PROFESSIONAL) {
2259
 
                if (val & AC_DIG1_EMPHASIS)
2260
 
                        sbits |= IEC958_AES0_PRO_EMPHASIS_5015;
2261
 
        } else {
2262
 
                if (val & AC_DIG1_EMPHASIS)
2263
 
                        sbits |= IEC958_AES0_CON_EMPHASIS_5015;
2264
 
                if (!(val & AC_DIG1_COPYRIGHT))
2265
 
                        sbits |= IEC958_AES0_CON_NOT_COPYRIGHT;
2266
 
                if (val & AC_DIG1_LEVEL)
2267
 
                        sbits |= (IEC958_AES1_CON_ORIGINAL << 8);
2268
 
                sbits |= val & (0x7f << 8);
2269
 
        }
2270
 
        return sbits;
2271
 
}
2272
 
 
2273
 
/* set digital convert verbs both for the given NID and its slaves */
2274
 
static void set_dig_out(struct hda_codec *codec, hda_nid_t nid,
2275
 
                        int mask, int val)
2276
 
{
2277
 
        const hda_nid_t *d;
2278
 
 
2279
 
        snd_hdac_regmap_update(&codec->core, nid, AC_VERB_SET_DIGI_CONVERT_1,
2280
 
                               mask, val);
2281
 
        d = codec->slave_dig_outs;
2282
 
        if (!d)
2283
 
                return;
2284
 
        for (; *d; d++)
2285
 
                snd_hdac_regmap_update(&codec->core, *d,
2286
 
                                       AC_VERB_SET_DIGI_CONVERT_1, mask, val);
2287
 
}
2288
 
 
2289
 
static inline void set_dig_out_convert(struct hda_codec *codec, hda_nid_t nid,
2290
 
                                       int dig1, int dig2)
2291
 
{
2292
 
        unsigned int mask = 0;
2293
 
        unsigned int val = 0;
2294
 
 
2295
 
        if (dig1 != -1) {
2296
 
                mask |= 0xff;
2297
 
                val = dig1;
2298
 
        }
2299
 
        if (dig2 != -1) {
2300
 
                mask |= 0xff00;
2301
 
                val |= dig2 << 8;
2302
 
        }
2303
 
        set_dig_out(codec, nid, mask, val);
2304
 
}
2305
 
 
2306
 
static int snd_hda_spdif_default_put(struct snd_kcontrol *kcontrol,
2307
 
                                     struct snd_ctl_elem_value *ucontrol)
2308
 
{
2309
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2310
 
        int idx = kcontrol->private_value;
2311
 
        struct hda_spdif_out *spdif;
2312
 
        hda_nid_t nid;
2313
 
        unsigned short val;
2314
 
        int change;
2315
 
 
2316
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2317
 
                return -EINVAL;
2318
 
        mutex_lock(&codec->spdif_mutex);
2319
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2320
 
        nid = spdif->nid;
2321
 
        spdif->status = ucontrol->value.iec958.status[0] |
2322
 
                ((unsigned int)ucontrol->value.iec958.status[1] << 8) |
2323
 
                ((unsigned int)ucontrol->value.iec958.status[2] << 16) |
2324
 
                ((unsigned int)ucontrol->value.iec958.status[3] << 24);
2325
 
        val = convert_from_spdif_status(spdif->status);
2326
 
        val |= spdif->ctls & 1;
2327
 
        change = spdif->ctls != val;
2328
 
        spdif->ctls = val;
2329
 
        if (change && nid != (u16)-1)
2330
 
                set_dig_out_convert(codec, nid, val & 0xff, (val >> 8) & 0xff);
2331
 
        mutex_unlock(&codec->spdif_mutex);
2332
 
        return change;
2333
 
}
2334
 
 
2335
 
#define snd_hda_spdif_out_switch_info   snd_ctl_boolean_mono_info
2336
 
 
2337
 
static int snd_hda_spdif_out_switch_get(struct snd_kcontrol *kcontrol,
2338
 
                                        struct snd_ctl_elem_value *ucontrol)
2339
 
{
2340
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2341
 
        int idx = kcontrol->private_value;
2342
 
        struct hda_spdif_out *spdif;
2343
 
 
2344
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2345
 
                return -EINVAL;
2346
 
        mutex_lock(&codec->spdif_mutex);
2347
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2348
 
        ucontrol->value.integer.value[0] = spdif->ctls & AC_DIG1_ENABLE;
2349
 
        mutex_unlock(&codec->spdif_mutex);
2350
 
        return 0;
2351
 
}
2352
 
 
2353
 
static inline void set_spdif_ctls(struct hda_codec *codec, hda_nid_t nid,
2354
 
                                  int dig1, int dig2)
2355
 
{
2356
 
        set_dig_out_convert(codec, nid, dig1, dig2);
2357
 
        /* unmute amp switch (if any) */
2358
 
        if ((get_wcaps(codec, nid) & AC_WCAP_OUT_AMP) &&
2359
 
            (dig1 & AC_DIG1_ENABLE))
2360
 
                snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
2361
 
                                            HDA_AMP_MUTE, 0);
2362
 
}
2363
 
 
2364
 
static int snd_hda_spdif_out_switch_put(struct snd_kcontrol *kcontrol,
2365
 
                                        struct snd_ctl_elem_value *ucontrol)
2366
 
{
2367
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2368
 
        int idx = kcontrol->private_value;
2369
 
        struct hda_spdif_out *spdif;
2370
 
        hda_nid_t nid;
2371
 
        unsigned short val;
2372
 
        int change;
2373
 
 
2374
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2375
 
                return -EINVAL;
2376
 
        mutex_lock(&codec->spdif_mutex);
2377
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2378
 
        nid = spdif->nid;
2379
 
        val = spdif->ctls & ~AC_DIG1_ENABLE;
2380
 
        if (ucontrol->value.integer.value[0])
2381
 
                val |= AC_DIG1_ENABLE;
2382
 
        change = spdif->ctls != val;
2383
 
        spdif->ctls = val;
2384
 
        if (change && nid != (u16)-1)
2385
 
                set_spdif_ctls(codec, nid, val & 0xff, -1);
2386
 
        mutex_unlock(&codec->spdif_mutex);
2387
 
        return change;
2388
 
}
2389
 
 
2390
 
static struct snd_kcontrol_new dig_mixes[] = {
2391
 
        {
2392
 
                .access = SNDRV_CTL_ELEM_ACCESS_READ,
2393
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2394
 
                .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, CON_MASK),
2395
 
                .info = snd_hda_spdif_mask_info,
2396
 
                .get = snd_hda_spdif_cmask_get,
2397
 
        },
2398
 
        {
2399
 
                .access = SNDRV_CTL_ELEM_ACCESS_READ,
2400
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2401
 
                .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, PRO_MASK),
2402
 
                .info = snd_hda_spdif_mask_info,
2403
 
                .get = snd_hda_spdif_pmask_get,
2404
 
        },
2405
 
        {
2406
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2407
 
                .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, DEFAULT),
2408
 
                .info = snd_hda_spdif_mask_info,
2409
 
                .get = snd_hda_spdif_default_get,
2410
 
                .put = snd_hda_spdif_default_put,
2411
 
        },
2412
 
        {
2413
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2414
 
                .name = SNDRV_CTL_NAME_IEC958("", PLAYBACK, SWITCH),
2415
 
                .info = snd_hda_spdif_out_switch_info,
2416
 
                .get = snd_hda_spdif_out_switch_get,
2417
 
                .put = snd_hda_spdif_out_switch_put,
2418
 
        },
2419
 
        { } /* end */
2420
 
};
2421
 
 
2422
 
/**
2423
 
 * snd_hda_create_dig_out_ctls - create Output SPDIF-related controls
2424
 
 * @codec: the HDA codec
2425
 
 * @associated_nid: NID that new ctls associated with
2426
 
 * @cvt_nid: converter NID
2427
 
 * @type: HDA_PCM_TYPE_*
2428
 
 * Creates controls related with the digital output.
2429
 
 * Called from each patch supporting the digital out.
2430
 
 *
2431
 
 * Returns 0 if successful, or a negative error code.
2432
 
 */
2433
 
int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
2434
 
                                hda_nid_t associated_nid,
2435
 
                                hda_nid_t cvt_nid,
2436
 
                                int type)
2437
 
{
2438
 
        int err;
2439
 
        struct snd_kcontrol *kctl;
2440
 
        struct snd_kcontrol_new *dig_mix;
2441
 
        int idx = 0;
2442
 
        int val = 0;
2443
 
        const int spdif_index = 16;
2444
 
        struct hda_spdif_out *spdif;
2445
 
        struct hda_bus *bus = codec->bus;
2446
 
 
2447
 
        if (bus->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
2448
 
            type == HDA_PCM_TYPE_SPDIF) {
2449
 
                idx = spdif_index;
2450
 
        } else if (bus->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
2451
 
                   type == HDA_PCM_TYPE_HDMI) {
2452
 
                /* suppose a single SPDIF device */
2453
 
                for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
2454
 
                        kctl = find_mixer_ctl(codec, dig_mix->name, 0, 0);
2455
 
                        if (!kctl)
2456
 
                                break;
2457
 
                        kctl->id.index = spdif_index;
2458
 
                }
2459
 
                bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
2460
 
        }
2461
 
        if (!bus->primary_dig_out_type)
2462
 
                bus->primary_dig_out_type = type;
2463
 
 
2464
 
        idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", idx);
2465
 
        if (idx < 0) {
2466
 
                codec_err(codec, "too many IEC958 outputs\n");
2467
 
                return -EBUSY;
2468
 
        }
2469
 
        spdif = snd_array_new(&codec->spdif_out);
2470
 
        if (!spdif)
2471
 
                return -ENOMEM;
2472
 
        for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
2473
 
                kctl = snd_ctl_new1(dig_mix, codec);
2474
 
                if (!kctl)
2475
 
                        return -ENOMEM;
2476
 
                kctl->id.index = idx;
2477
 
                kctl->private_value = codec->spdif_out.used - 1;
2478
 
                err = snd_hda_ctl_add(codec, associated_nid, kctl);
2479
 
                if (err < 0)
2480
 
                        return err;
2481
 
        }
2482
 
        spdif->nid = cvt_nid;
2483
 
        snd_hdac_regmap_read(&codec->core, cvt_nid,
2484
 
                             AC_VERB_GET_DIGI_CONVERT_1, &val);
2485
 
        spdif->ctls = val;
2486
 
        spdif->status = convert_to_spdif_status(spdif->ctls);
2487
 
        return 0;
2488
 
}
2489
 
EXPORT_SYMBOL_GPL(snd_hda_create_dig_out_ctls);
2490
 
 
2491
 
/**
2492
 
 * snd_hda_spdif_out_of_nid - get the hda_spdif_out entry from the given NID
2493
 
 * @codec: the HDA codec
2494
 
 * @nid: widget NID
2495
 
 *
2496
 
 * call within spdif_mutex lock
2497
 
 */
2498
 
struct hda_spdif_out *snd_hda_spdif_out_of_nid(struct hda_codec *codec,
2499
 
                                               hda_nid_t nid)
2500
 
{
2501
 
        struct hda_spdif_out *spdif;
2502
 
        int i;
2503
 
 
2504
 
        snd_array_for_each(&codec->spdif_out, i, spdif) {
2505
 
                if (spdif->nid == nid)
2506
 
                        return spdif;
2507
 
        }
2508
 
        return NULL;
2509
 
}
2510
 
EXPORT_SYMBOL_GPL(snd_hda_spdif_out_of_nid);
2511
 
 
2512
 
/**
2513
 
 * snd_hda_spdif_ctls_unassign - Unassign the given SPDIF ctl
2514
 
 * @codec: the HDA codec
2515
 
 * @idx: the SPDIF ctl index
2516
 
 *
2517
 
 * Unassign the widget from the given SPDIF control.
2518
 
 */
2519
 
void snd_hda_spdif_ctls_unassign(struct hda_codec *codec, int idx)
2520
 
{
2521
 
        struct hda_spdif_out *spdif;
2522
 
 
2523
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2524
 
                return;
2525
 
        mutex_lock(&codec->spdif_mutex);
2526
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2527
 
        spdif->nid = (u16)-1;
2528
 
        mutex_unlock(&codec->spdif_mutex);
2529
 
}
2530
 
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_unassign);
2531
 
 
2532
 
/**
2533
 
 * snd_hda_spdif_ctls_assign - Assign the SPDIF controls to the given NID
2534
 
 * @codec: the HDA codec
2535
 
 * @idx: the SPDIF ctl idx
2536
 
 * @nid: widget NID
2537
 
 *
2538
 
 * Assign the widget to the SPDIF control with the given index.
2539
 
 */
2540
 
void snd_hda_spdif_ctls_assign(struct hda_codec *codec, int idx, hda_nid_t nid)
2541
 
{
2542
 
        struct hda_spdif_out *spdif;
2543
 
        unsigned short val;
2544
 
 
2545
 
        if (WARN_ON(codec->spdif_out.used <= idx))
2546
 
                return;
2547
 
        mutex_lock(&codec->spdif_mutex);
2548
 
        spdif = snd_array_elem(&codec->spdif_out, idx);
2549
 
        if (spdif->nid != nid) {
2550
 
                spdif->nid = nid;
2551
 
                val = spdif->ctls;
2552
 
                set_spdif_ctls(codec, nid, val & 0xff, (val >> 8) & 0xff);
2553
 
        }
2554
 
        mutex_unlock(&codec->spdif_mutex);
2555
 
}
2556
 
EXPORT_SYMBOL_GPL(snd_hda_spdif_ctls_assign);
2557
 
 
2558
 
/*
2559
 
 * SPDIF sharing with analog output
2560
 
 */
2561
 
static int spdif_share_sw_get(struct snd_kcontrol *kcontrol,
2562
 
                              struct snd_ctl_elem_value *ucontrol)
2563
 
{
2564
 
        struct hda_multi_out *mout = snd_kcontrol_chip(kcontrol);
2565
 
        ucontrol->value.integer.value[0] = mout->share_spdif;
2566
 
        return 0;
2567
 
}
2568
 
 
2569
 
static int spdif_share_sw_put(struct snd_kcontrol *kcontrol,
2570
 
                              struct snd_ctl_elem_value *ucontrol)
2571
 
{
2572
 
        struct hda_multi_out *mout = snd_kcontrol_chip(kcontrol);
2573
 
        mout->share_spdif = !!ucontrol->value.integer.value[0];
2574
 
        return 0;
2575
 
}
2576
 
 
2577
 
static const struct snd_kcontrol_new spdif_share_sw = {
2578
 
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2579
 
        .name = "IEC958 Default PCM Playback Switch",
2580
 
        .info = snd_ctl_boolean_mono_info,
2581
 
        .get = spdif_share_sw_get,
2582
 
        .put = spdif_share_sw_put,
2583
 
};
2584
 
 
2585
 
/**
2586
 
 * snd_hda_create_spdif_share_sw - create Default PCM switch
2587
 
 * @codec: the HDA codec
2588
 
 * @mout: multi-out instance
2589
 
 */
2590
 
int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
2591
 
                                  struct hda_multi_out *mout)
2592
 
{
2593
 
        struct snd_kcontrol *kctl;
2594
 
 
2595
 
        if (!mout->dig_out_nid)
2596
 
                return 0;
2597
 
 
2598
 
        kctl = snd_ctl_new1(&spdif_share_sw, mout);
2599
 
        if (!kctl)
2600
 
                return -ENOMEM;
2601
 
        /* ATTENTION: here mout is passed as private_data, instead of codec */
2602
 
        return snd_hda_ctl_add(codec, mout->dig_out_nid, kctl);
2603
 
}
2604
 
EXPORT_SYMBOL_GPL(snd_hda_create_spdif_share_sw);
2605
 
 
2606
 
/*
2607
 
 * SPDIF input
2608
 
 */
2609
 
 
2610
 
#define snd_hda_spdif_in_switch_info    snd_hda_spdif_out_switch_info
2611
 
 
2612
 
static int snd_hda_spdif_in_switch_get(struct snd_kcontrol *kcontrol,
2613
 
                                       struct snd_ctl_elem_value *ucontrol)
2614
 
{
2615
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2616
 
 
2617
 
        ucontrol->value.integer.value[0] = codec->spdif_in_enable;
2618
 
        return 0;
2619
 
}
2620
 
 
2621
 
static int snd_hda_spdif_in_switch_put(struct snd_kcontrol *kcontrol,
2622
 
                                       struct snd_ctl_elem_value *ucontrol)
2623
 
{
2624
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2625
 
        hda_nid_t nid = kcontrol->private_value;
2626
 
        unsigned int val = !!ucontrol->value.integer.value[0];
2627
 
        int change;
2628
 
 
2629
 
        mutex_lock(&codec->spdif_mutex);
2630
 
        change = codec->spdif_in_enable != val;
2631
 
        if (change) {
2632
 
                codec->spdif_in_enable = val;
2633
 
                snd_hdac_regmap_write(&codec->core, nid,
2634
 
                                      AC_VERB_SET_DIGI_CONVERT_1, val);
2635
 
        }
2636
 
        mutex_unlock(&codec->spdif_mutex);
2637
 
        return change;
2638
 
}
2639
 
 
2640
 
static int snd_hda_spdif_in_status_get(struct snd_kcontrol *kcontrol,
2641
 
                                       struct snd_ctl_elem_value *ucontrol)
2642
 
{
2643
 
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2644
 
        hda_nid_t nid = kcontrol->private_value;
2645
 
        unsigned int val;
2646
 
        unsigned int sbits;
2647
 
 
2648
 
        snd_hdac_regmap_read(&codec->core, nid,
2649
 
                             AC_VERB_GET_DIGI_CONVERT_1, &val);
2650
 
        sbits = convert_to_spdif_status(val);
2651
 
        ucontrol->value.iec958.status[0] = sbits;
2652
 
        ucontrol->value.iec958.status[1] = sbits >> 8;
2653
 
        ucontrol->value.iec958.status[2] = sbits >> 16;
2654
 
        ucontrol->value.iec958.status[3] = sbits >> 24;
2655
 
        return 0;
2656
 
}
2657
 
 
2658
 
static struct snd_kcontrol_new dig_in_ctls[] = {
2659
 
        {
2660
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2661
 
                .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, SWITCH),
2662
 
                .info = snd_hda_spdif_in_switch_info,
2663
 
                .get = snd_hda_spdif_in_switch_get,
2664
 
                .put = snd_hda_spdif_in_switch_put,
2665
 
        },
2666
 
        {
2667
 
                .access = SNDRV_CTL_ELEM_ACCESS_READ,
2668
 
                .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2669
 
                .name = SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
2670
 
                .info = snd_hda_spdif_mask_info,
2671
 
                .get = snd_hda_spdif_in_status_get,
2672
 
        },
2673
 
        { } /* end */
2674
 
};
2675
 
 
2676
 
/**
2677
 
 * snd_hda_create_spdif_in_ctls - create Input SPDIF-related controls
2678
 
 * @codec: the HDA codec
2679
 
 * @nid: audio in widget NID
2680
 
 *
2681
 
 * Creates controls related with the SPDIF input.
2682
 
 * Called from each patch supporting the SPDIF in.
2683
 
 *
2684
 
 * Returns 0 if successful, or a negative error code.
2685
 
 */
2686
 
int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid)
2687
 
{
2688
 
        int err;
2689
 
        struct snd_kcontrol *kctl;
2690
 
        struct snd_kcontrol_new *dig_mix;
2691
 
        int idx;
2692
 
 
2693
 
        idx = find_empty_mixer_ctl_idx(codec, "IEC958 Capture Switch", 0);
2694
 
        if (idx < 0) {
2695
 
                codec_err(codec, "too many IEC958 inputs\n");
2696
 
                return -EBUSY;
2697
 
        }
2698
 
        for (dig_mix = dig_in_ctls; dig_mix->name; dig_mix++) {
2699
 
                kctl = snd_ctl_new1(dig_mix, codec);
2700
 
                if (!kctl)
2701
 
                        return -ENOMEM;
2702
 
                kctl->private_value = nid;
2703
 
                err = snd_hda_ctl_add(codec, nid, kctl);
2704
 
                if (err < 0)
2705
 
                        return err;
2706
 
        }
2707
 
        codec->spdif_in_enable =
2708
 
                snd_hda_codec_read(codec, nid, 0,
2709
 
                                   AC_VERB_GET_DIGI_CONVERT_1, 0) &
2710
 
                AC_DIG1_ENABLE;
2711
 
        return 0;
2712
 
}
2713
 
EXPORT_SYMBOL_GPL(snd_hda_create_spdif_in_ctls);
2714
 
 
2715
 
/**
2716
 
 * snd_hda_codec_set_power_to_all - Set the power state to all widgets
2717
 
 * @codec: the HDA codec
2718
 
 * @fg: function group (not used now)
2719
 
 * @power_state: the power state to set (AC_PWRST_*)
2720
 
 *
2721
 
 * Set the given power state to all widgets that have the power control.
2722
 
 * If the codec has power_filter set, it evaluates the power state and
2723
 
 * filter out if it's unchanged as D3.
2724
 
 */
2725
 
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
2726
 
                                    unsigned int power_state)
2727
 
{
2728
 
        hda_nid_t nid;
2729
 
 
2730
 
        for_each_hda_codec_node(nid, codec) {
2731
 
                unsigned int wcaps = get_wcaps(codec, nid);
2732
 
                unsigned int state = power_state;
2733
 
                if (!(wcaps & AC_WCAP_POWER))
2734
 
                        continue;
2735
 
                if (codec->power_filter) {
2736
 
                        state = codec->power_filter(codec, nid, power_state);
2737
 
                        if (state != power_state && power_state == AC_PWRST_D3)
2738
 
                                continue;
2739
 
                }
2740
 
                snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_POWER_STATE,
2741
 
                                    state);
2742
 
        }
2743
 
}
2744
 
EXPORT_SYMBOL_GPL(snd_hda_codec_set_power_to_all);
2745
 
 
2746
 
/**
2747
 
 * snd_hda_codec_eapd_power_filter - A power filter callback for EAPD
2748
 
 * @codec: the HDA codec
2749
 
 * @nid: widget NID
2750
 
 * @power_state: power state to evalue
2751
 
 *
2752
 
 * Don't power down the widget if it controls eapd and EAPD_BTLENABLE is set.
2753
 
 * This can be used a codec power_filter callback.
2754
 
 */
2755
 
unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
2756
 
                                             hda_nid_t nid,
2757
 
                                             unsigned int power_state)
2758
 
{
2759
 
        if (nid == codec->core.afg || nid == codec->core.mfg)
2760
 
                return power_state;
2761
 
        if (power_state == AC_PWRST_D3 &&
2762
 
            get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_PIN &&
2763
 
            (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)) {
2764
 
                int eapd = snd_hda_codec_read(codec, nid, 0,
2765
 
                                              AC_VERB_GET_EAPD_BTLENABLE, 0);
2766
 
                if (eapd & 0x02)
2767
 
                        return AC_PWRST_D0;
2768
 
        }
2769
 
        return power_state;
2770
 
}
2771
 
EXPORT_SYMBOL_GPL(snd_hda_codec_eapd_power_filter);
2772
 
 
2773
 
/*
2774
 
 * set power state of the codec, and return the power state
2775
 
 */
2776
 
static unsigned int hda_set_power_state(struct hda_codec *codec,
2777
 
                                        unsigned int power_state)
2778
 
{
2779
 
        hda_nid_t fg = codec->core.afg ? codec->core.afg : codec->core.mfg;
2780
 
        int count;
2781
 
        unsigned int state;
2782
 
        int flags = 0;
2783
 
 
2784
 
        /* this delay seems necessary to avoid click noise at power-down */
2785
 
        if (power_state == AC_PWRST_D3) {
2786
 
                if (codec->depop_delay < 0)
2787
 
                        msleep(codec_has_epss(codec) ? 10 : 100);
2788
 
                else if (codec->depop_delay > 0)
2789
 
                        msleep(codec->depop_delay);
2790
 
                flags = HDA_RW_NO_RESPONSE_FALLBACK;
2791
 
        }
2792
 
 
2793
 
        /* repeat power states setting at most 10 times*/
2794
 
        for (count = 0; count < 10; count++) {
2795
 
                if (codec->patch_ops.set_power_state)
2796
 
                        codec->patch_ops.set_power_state(codec, fg,
2797
 
                                                         power_state);
2798
 
                else {
2799
 
                        state = power_state;
2800
 
                        if (codec->power_filter)
2801
 
                                state = codec->power_filter(codec, fg, state);
2802
 
                        if (state == power_state || power_state != AC_PWRST_D3)
2803
 
                                snd_hda_codec_read(codec, fg, flags,
2804
 
                                                   AC_VERB_SET_POWER_STATE,
2805
 
                                                   state);
2806
 
                        snd_hda_codec_set_power_to_all(codec, fg, power_state);
2807
 
                }
2808
 
                state = snd_hda_sync_power_state(codec, fg, power_state);
2809
 
                if (!(state & AC_PWRST_ERROR))
2810
 
                        break;
2811
 
        }
2812
 
 
2813
 
        return state;
2814
 
}
2815
 
 
2816
 
/* sync power states of all widgets;
2817
 
 * this is called at the end of codec parsing
2818
 
 */
2819
 
static void sync_power_up_states(struct hda_codec *codec)
2820
 
{
2821
 
        hda_nid_t nid;
2822
 
 
2823
 
        /* don't care if no filter is used */
2824
 
        if (!codec->power_filter)
2825
 
                return;
2826
 
 
2827
 
        for_each_hda_codec_node(nid, codec) {
2828
 
                unsigned int wcaps = get_wcaps(codec, nid);
2829
 
                unsigned int target;
2830
 
                if (!(wcaps & AC_WCAP_POWER))
2831
 
                        continue;
2832
 
                target = codec->power_filter(codec, nid, AC_PWRST_D0);
2833
 
                if (target == AC_PWRST_D0)
2834
 
                        continue;
2835
 
                if (!snd_hda_check_power_state(codec, nid, target))
2836
 
                        snd_hda_codec_write(codec, nid, 0,
2837
 
                                            AC_VERB_SET_POWER_STATE, target);
2838
 
        }
2839
 
}
2840
 
 
2841
 
#ifdef CONFIG_SND_HDA_RECONFIG
2842
 
/* execute additional init verbs */
2843
 
static void hda_exec_init_verbs(struct hda_codec *codec)
2844
 
{
2845
 
        if (codec->init_verbs.list)
2846
 
                snd_hda_sequence_write(codec, codec->init_verbs.list);
2847
 
}
2848
 
#else
2849
 
static inline void hda_exec_init_verbs(struct hda_codec *codec) {}
2850
 
#endif
2851
 
 
2852
 
#ifdef CONFIG_PM
2853
 
/* update the power on/off account with the current jiffies */
2854
 
static void update_power_acct(struct hda_codec *codec, bool on)
2855
 
{
2856
 
        unsigned long delta = jiffies - codec->power_jiffies;
2857
 
 
2858
 
        if (on)
2859
 
                codec->power_on_acct += delta;
2860
 
        else
2861
 
                codec->power_off_acct += delta;
2862
 
        codec->power_jiffies += delta;
2863
 
}
2864
 
 
2865
 
void snd_hda_update_power_acct(struct hda_codec *codec)
2866
 
{
2867
 
        update_power_acct(codec, hda_codec_is_power_on(codec));
2868
 
}
2869
 
 
2870
 
/*
2871
 
 * call suspend and power-down; used both from PM and power-save
2872
 
 * this function returns the power state in the end
2873
 
 */
2874
 
static unsigned int hda_call_codec_suspend(struct hda_codec *codec)
2875
 
{
2876
 
        unsigned int state;
2877
 
 
2878
 
        snd_hdac_enter_pm(&codec->core);
2879
 
        if (codec->patch_ops.suspend)
2880
 
                codec->patch_ops.suspend(codec);
2881
 
        hda_cleanup_all_streams(codec);
2882
 
        state = hda_set_power_state(codec, AC_PWRST_D3);
2883
 
        update_power_acct(codec, true);
2884
 
        snd_hdac_leave_pm(&codec->core);
2885
 
        return state;
2886
 
}
2887
 
 
2888
 
/*
2889
 
 * kick up codec; used both from PM and power-save
2890
 
 */
2891
 
static void hda_call_codec_resume(struct hda_codec *codec)
2892
 
{
2893
 
        snd_hdac_enter_pm(&codec->core);
2894
 
        if (codec->core.regmap)
2895
 
                regcache_mark_dirty(codec->core.regmap);
2896
 
 
2897
 
        codec->power_jiffies = jiffies;
2898
 
 
2899
 
        hda_set_power_state(codec, AC_PWRST_D0);
2900
 
        restore_shutup_pins(codec);
2901
 
        hda_exec_init_verbs(codec);
2902
 
        snd_hda_jack_set_dirty_all(codec);
2903
 
        if (codec->patch_ops.resume)
2904
 
                codec->patch_ops.resume(codec);
2905
 
        else {
2906
 
                if (codec->patch_ops.init)
2907
 
                        codec->patch_ops.init(codec);
2908
 
                if (codec->core.regmap)
2909
 
                        regcache_sync(codec->core.regmap);
2910
 
        }
2911
 
 
2912
 
        if (codec->jackpoll_interval)
2913
 
                hda_jackpoll_work(&codec->jackpoll_work.work);
2914
 
        else
2915
 
                snd_hda_jack_report_sync(codec);
2916
 
        codec->core.dev.power.power_state = PMSG_ON;
2917
 
        snd_hdac_leave_pm(&codec->core);
2918
 
}
2919
 
 
2920
 
static int hda_codec_runtime_suspend(struct device *dev)
2921
 
{
2922
 
        struct hda_codec *codec = dev_to_hda_codec(dev);
2923
 
        unsigned int state;
2924
 
 
2925
 
        cancel_delayed_work_sync(&codec->jackpoll_work);
2926
 
        state = hda_call_codec_suspend(codec);
2927
 
        if (codec->link_down_at_suspend ||
2928
 
            (codec_has_clkstop(codec) && codec_has_epss(codec) &&
2929
 
             (state & AC_PWRST_CLK_STOP_OK)))
2930
 
                snd_hdac_codec_link_down(&codec->core);
2931
 
        codec_display_power(codec, false);
2932
 
        return 0;
2933
 
}
2934
 
 
2935
 
static int hda_codec_runtime_resume(struct device *dev)
2936
 
{
2937
 
        struct hda_codec *codec = dev_to_hda_codec(dev);
2938
 
 
2939
 
        codec_display_power(codec, true);
2940
 
        snd_hdac_codec_link_up(&codec->core);
2941
 
        hda_call_codec_resume(codec);
2942
 
        pm_runtime_mark_last_busy(dev);
2943
 
        return 0;
2944
 
}
2945
 
#endif /* CONFIG_PM */
2946
 
 
2947
 
#ifdef CONFIG_PM_SLEEP
2948
 
static int hda_codec_force_resume(struct device *dev)
2949
 
{
2950
 
        struct hda_codec *codec = dev_to_hda_codec(dev);
2951
 
        bool forced_resume = !codec->relaxed_resume && codec->jacktbl.used;
2952
 
        int ret;
2953
 
 
2954
 
        /* The get/put pair below enforces the runtime resume even if the
2955
 
         * device hasn't been used at suspend time.  This trick is needed to
2956
 
         * update the jack state change during the sleep.
2957
 
         */
2958
 
        if (forced_resume)
2959
 
                pm_runtime_get_noresume(dev);
2960
 
        ret = pm_runtime_force_resume(dev);
2961
 
        if (forced_resume)
2962
 
                pm_runtime_put(dev);
2963
 
        return ret;
2964
 
}
2965
 
 
2966
 
static int hda_codec_pm_suspend(struct device *dev)
2967
 
{
2968
 
        dev->power.power_state = PMSG_SUSPEND;
2969
 
        return pm_runtime_force_suspend(dev);
2970
 
}
2971
 
 
2972
 
static int hda_codec_pm_resume(struct device *dev)
2973
 
{
2974
 
        dev->power.power_state = PMSG_RESUME;
2975
 
        return hda_codec_force_resume(dev);
2976
 
}
2977
 
 
2978
 
static int hda_codec_pm_freeze(struct device *dev)
2979
 
{
2980
 
        dev->power.power_state = PMSG_FREEZE;
2981
 
        return pm_runtime_force_suspend(dev);
2982
 
}
2983
 
 
2984
 
static int hda_codec_pm_thaw(struct device *dev)
2985
 
{
2986
 
        dev->power.power_state = PMSG_THAW;
2987
 
        return hda_codec_force_resume(dev);
2988
 
}
2989
 
 
2990
 
static int hda_codec_pm_restore(struct device *dev)
2991
 
{
2992
 
        dev->power.power_state = PMSG_RESTORE;
2993
 
        return hda_codec_force_resume(dev);
2994
 
}
2995
 
#endif /* CONFIG_PM_SLEEP */
2996
 
 
2997
 
/* referred in hda_bind.c */
2998
 
const struct dev_pm_ops hda_codec_driver_pm = {
2999
 
#ifdef CONFIG_PM_SLEEP
3000
 
        .suspend = hda_codec_pm_suspend,
3001
 
        .resume = hda_codec_pm_resume,
3002
 
        .freeze = hda_codec_pm_freeze,
3003
 
        .thaw = hda_codec_pm_thaw,
3004
 
        .poweroff = hda_codec_pm_suspend,
3005
 
        .restore = hda_codec_pm_restore,
3006
 
#endif /* CONFIG_PM_SLEEP */
3007
 
        SET_RUNTIME_PM_OPS(hda_codec_runtime_suspend, hda_codec_runtime_resume,
3008
 
                           NULL)
3009
 
};
3010
 
 
3011
 
/*
3012
 
 * add standard channel maps if not specified
3013
 
 */
3014
 
static int add_std_chmaps(struct hda_codec *codec)
3015
 
{
3016
 
        struct hda_pcm *pcm;
3017
 
        int str, err;
3018
 
 
3019
 
        list_for_each_entry(pcm, &codec->pcm_list_head, list) {
3020
 
                for (str = 0; str < 2; str++) {
3021
 
                        struct hda_pcm_stream *hinfo = &pcm->stream[str];
3022
 
                        struct snd_pcm_chmap *chmap;
3023
 
                        const struct snd_pcm_chmap_elem *elem;
3024
 
 
3025
 
                        if (!pcm->pcm || pcm->own_chmap || !hinfo->substreams)
3026
 
                                continue;
3027
 
                        elem = hinfo->chmap ? hinfo->chmap : snd_pcm_std_chmaps;
3028
 
                        err = snd_pcm_add_chmap_ctls(pcm->pcm, str, elem,
3029
 
                                                     hinfo->channels_max,
3030
 
                                                     0, &chmap);
3031
 
                        if (err < 0)
3032
 
                                return err;
3033
 
                        chmap->channel_mask = SND_PCM_CHMAP_MASK_2468;
3034
 
                }
3035
 
        }
3036
 
        return 0;
3037
 
}
3038
 
 
3039
 
/* default channel maps for 2.1 speakers;
3040
 
 * since HD-audio supports only stereo, odd number channels are omitted
3041
 
 */
3042
 
const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[] = {
3043
 
        { .channels = 2,
3044
 
          .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
3045
 
        { .channels = 4,
3046
 
          .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
3047
 
                   SNDRV_CHMAP_LFE, SNDRV_CHMAP_LFE } },
3048
 
        { }
3049
 
};
3050
 
EXPORT_SYMBOL_GPL(snd_pcm_2_1_chmaps);
3051
 
 
3052
 
int snd_hda_codec_build_controls(struct hda_codec *codec)
3053
 
{
3054
 
        int err = 0;
3055
 
        hda_exec_init_verbs(codec);
3056
 
        /* continue to initialize... */
3057
 
        if (codec->patch_ops.init)
3058
 
                err = codec->patch_ops.init(codec);
3059
 
        if (!err && codec->patch_ops.build_controls)
3060
 
                err = codec->patch_ops.build_controls(codec);
3061
 
        if (err < 0)
3062
 
                return err;
3063
 
 
3064
 
        /* we create chmaps here instead of build_pcms */
3065
 
        err = add_std_chmaps(codec);
3066
 
        if (err < 0)
3067
 
                return err;
3068
 
 
3069
 
        if (codec->jackpoll_interval)
3070
 
                hda_jackpoll_work(&codec->jackpoll_work.work);
3071
 
        else
3072
 
                snd_hda_jack_report_sync(codec); /* call at the last init point */
3073
 
        sync_power_up_states(codec);
3074
 
        return 0;
3075
 
}
3076
 
EXPORT_SYMBOL_GPL(snd_hda_codec_build_controls);
3077
 
 
3078
 
/*
3079
 
 * PCM stuff
3080
 
 */
3081
 
static int hda_pcm_default_open_close(struct hda_pcm_stream *hinfo,
3082
 
                                      struct hda_codec *codec,
3083
 
                                      struct snd_pcm_substream *substream)
3084
 
{
3085
 
        return 0;
3086
 
}
3087
 
 
3088
 
static int hda_pcm_default_prepare(struct hda_pcm_stream *hinfo,
3089
 
                                   struct hda_codec *codec,
3090
 
                                   unsigned int stream_tag,
3091
 
                                   unsigned int format,
3092
 
                                   struct snd_pcm_substream *substream)
3093
 
{
3094
 
        snd_hda_codec_setup_stream(codec, hinfo->nid, stream_tag, 0, format);
3095
 
        return 0;
3096
 
}
3097
 
 
3098
 
static int hda_pcm_default_cleanup(struct hda_pcm_stream *hinfo,
3099
 
                                   struct hda_codec *codec,
3100
 
                                   struct snd_pcm_substream *substream)
3101
 
{
3102
 
        snd_hda_codec_cleanup_stream(codec, hinfo->nid);
3103
 
        return 0;
3104
 
}
3105
 
 
3106
 
static int set_pcm_default_values(struct hda_codec *codec,
3107
 
                                  struct hda_pcm_stream *info)
3108
 
{
3109
 
        int err;
3110
 
 
3111
 
        /* query support PCM information from the given NID */
3112
 
        if (info->nid && (!info->rates || !info->formats)) {
3113
 
                err = snd_hda_query_supported_pcm(codec, info->nid,
3114
 
                                info->rates ? NULL : &info->rates,
3115
 
                                info->formats ? NULL : &info->formats,
3116
 
                                info->maxbps ? NULL : &info->maxbps);
3117
 
                if (err < 0)
3118
 
                        return err;
3119
 
        }
3120
 
        if (info->ops.open == NULL)
3121
 
                info->ops.open = hda_pcm_default_open_close;
3122
 
        if (info->ops.close == NULL)
3123
 
                info->ops.close = hda_pcm_default_open_close;
3124
 
        if (info->ops.prepare == NULL) {
3125
 
                if (snd_BUG_ON(!info->nid))
3126
 
                        return -EINVAL;
3127
 
                info->ops.prepare = hda_pcm_default_prepare;
3128
 
        }
3129
 
        if (info->ops.cleanup == NULL) {
3130
 
                if (snd_BUG_ON(!info->nid))
3131
 
                        return -EINVAL;
3132
 
                info->ops.cleanup = hda_pcm_default_cleanup;
3133
 
        }
3134
 
        return 0;
3135
 
}
3136
 
 
3137
 
/*
3138
 
 * codec prepare/cleanup entries
3139
 
 */
3140
 
/**
3141
 
 * snd_hda_codec_prepare - Prepare a stream
3142
 
 * @codec: the HDA codec
3143
 
 * @hinfo: PCM information
3144
 
 * @stream: stream tag to assign
3145
 
 * @format: format id to assign
3146
 
 * @substream: PCM substream to assign
3147
 
 *
3148
 
 * Calls the prepare callback set by the codec with the given arguments.
3149
 
 * Clean up the inactive streams when successful.
3150
 
 */
3151
 
int snd_hda_codec_prepare(struct hda_codec *codec,
3152
 
                          struct hda_pcm_stream *hinfo,
3153
 
                          unsigned int stream,
3154
 
                          unsigned int format,
3155
 
                          struct snd_pcm_substream *substream)
3156
 
{
3157
 
        int ret;
3158
 
        mutex_lock(&codec->bus->prepare_mutex);
3159
 
        if (hinfo->ops.prepare)
3160
 
                ret = hinfo->ops.prepare(hinfo, codec, stream, format,
3161
 
                                         substream);
3162
 
        else
3163
 
                ret = -ENODEV;
3164
 
        if (ret >= 0)
3165
 
                purify_inactive_streams(codec);
3166
 
        mutex_unlock(&codec->bus->prepare_mutex);
3167
 
        return ret;
3168
 
}
3169
 
EXPORT_SYMBOL_GPL(snd_hda_codec_prepare);
3170
 
 
3171
 
/**
3172
 
 * snd_hda_codec_cleanup - Prepare a stream
3173
 
 * @codec: the HDA codec
3174
 
 * @hinfo: PCM information
3175
 
 * @substream: PCM substream
3176
 
 *
3177
 
 * Calls the cleanup callback set by the codec with the given arguments.
3178
 
 */
3179
 
void snd_hda_codec_cleanup(struct hda_codec *codec,
3180
 
                           struct hda_pcm_stream *hinfo,
3181
 
                           struct snd_pcm_substream *substream)
3182
 
{
3183
 
        mutex_lock(&codec->bus->prepare_mutex);
3184
 
        if (hinfo->ops.cleanup)
3185
 
                hinfo->ops.cleanup(hinfo, codec, substream);
3186
 
        mutex_unlock(&codec->bus->prepare_mutex);
3187
 
}
3188
 
EXPORT_SYMBOL_GPL(snd_hda_codec_cleanup);
3189
 
 
3190
 
/* global */
3191
 
const char *snd_hda_pcm_type_name[HDA_PCM_NTYPES] = {
3192
 
        "Audio", "SPDIF", "HDMI", "Modem"
3193
 
};
3194
 
 
3195
 
/*
3196
 
 * get the empty PCM device number to assign
3197
 
 */
3198
 
static int get_empty_pcm_device(struct hda_bus *bus, unsigned int type)
3199
 
{
3200
 
        /* audio device indices; not linear to keep compatibility */
3201
 
        /* assigned to static slots up to dev#10; if more needed, assign
3202
 
         * the later slot dynamically (when CONFIG_SND_DYNAMIC_MINORS=y)
3203
 
         */
3204
 
        static int audio_idx[HDA_PCM_NTYPES][5] = {
3205
 
                [HDA_PCM_TYPE_AUDIO] = { 0, 2, 4, 5, -1 },
3206
 
                [HDA_PCM_TYPE_SPDIF] = { 1, -1 },
3207
 
                [HDA_PCM_TYPE_HDMI]  = { 3, 7, 8, 9, -1 },
3208
 
                [HDA_PCM_TYPE_MODEM] = { 6, -1 },
3209
 
        };
3210
 
        int i;
3211
 
 
3212
 
        if (type >= HDA_PCM_NTYPES) {
3213
 
                dev_err(bus->card->dev, "Invalid PCM type %d\n", type);
3214
 
                return -EINVAL;
3215
 
        }
3216
 
 
3217
 
        for (i = 0; audio_idx[type][i] >= 0; i++) {
3218
 
#ifndef CONFIG_SND_DYNAMIC_MINORS
3219
 
                if (audio_idx[type][i] >= 8)
3220
 
                        break;
3221
 
#endif
3222
 
                if (!test_and_set_bit(audio_idx[type][i], bus->pcm_dev_bits))
3223
 
                        return audio_idx[type][i];
3224
 
        }
3225
 
 
3226
 
#ifdef CONFIG_SND_DYNAMIC_MINORS
3227
 
        /* non-fixed slots starting from 10 */
3228
 
        for (i = 10; i < 32; i++) {
3229
 
                if (!test_and_set_bit(i, bus->pcm_dev_bits))
3230
 
                        return i;
3231
 
        }
3232
 
#endif
3233
 
 
3234
 
        dev_warn(bus->card->dev, "Too many %s devices\n",
3235
 
                snd_hda_pcm_type_name[type]);
3236
 
#ifndef CONFIG_SND_DYNAMIC_MINORS
3237
 
        dev_warn(bus->card->dev,
3238
 
                 "Consider building the kernel with CONFIG_SND_DYNAMIC_MINORS=y\n");
3239
 
#endif
3240
 
        return -EAGAIN;
3241
 
}
3242
 
 
3243
 
/* call build_pcms ops of the given codec and set up the default parameters */
3244
 
int snd_hda_codec_parse_pcms(struct hda_codec *codec)
3245
 
{
3246
 
        struct hda_pcm *cpcm;
3247
 
        int err;
3248
 
 
3249
 
        if (!list_empty(&codec->pcm_list_head))
3250
 
                return 0; /* already parsed */
3251
 
 
3252
 
        if (!codec->patch_ops.build_pcms)
3253
 
                return 0;
3254
 
 
3255
 
        err = codec->patch_ops.build_pcms(codec);
3256
 
        if (err < 0) {
3257
 
                codec_err(codec, "cannot build PCMs for #%d (error %d)\n",
3258
 
                          codec->core.addr, err);
3259
 
                return err;
3260
 
        }
3261
 
 
3262
 
        list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
3263
 
                int stream;
3264
 
 
3265
 
                for (stream = 0; stream < 2; stream++) {
3266
 
                        struct hda_pcm_stream *info = &cpcm->stream[stream];
3267
 
 
3268
 
                        if (!info->substreams)
3269
 
                                continue;
3270
 
                        err = set_pcm_default_values(codec, info);
3271
 
                        if (err < 0) {
3272
 
                                codec_warn(codec,
3273
 
                                           "fail to setup default for PCM %s\n",
3274
 
                                           cpcm->name);
3275
 
                                return err;
3276
 
                        }
3277
 
                }
3278
 
        }
3279
 
 
3280
 
        return 0;
3281
 
}
3282
 
EXPORT_SYMBOL_GPL(snd_hda_codec_parse_pcms);
3283
 
 
3284
 
/* assign all PCMs of the given codec */
3285
 
int snd_hda_codec_build_pcms(struct hda_codec *codec)
3286
 
{
3287
 
        struct hda_bus *bus = codec->bus;
3288
 
        struct hda_pcm *cpcm;
3289
 
        int dev, err;
3290
 
 
3291
 
        err = snd_hda_codec_parse_pcms(codec);
3292
 
        if (err < 0)
3293
 
                return err;
3294
 
 
3295
 
        /* attach a new PCM streams */
3296
 
        list_for_each_entry(cpcm, &codec->pcm_list_head, list) {
3297
 
                if (cpcm->pcm)
3298
 
                        continue; /* already attached */
3299
 
                if (!cpcm->stream[0].substreams && !cpcm->stream[1].substreams)
3300
 
                        continue; /* no substreams assigned */
3301
 
 
3302
 
                dev = get_empty_pcm_device(bus, cpcm->pcm_type);
3303
 
                if (dev < 0) {
3304
 
                        cpcm->device = SNDRV_PCM_INVALID_DEVICE;
3305
 
                        continue; /* no fatal error */
3306
 
                }
3307
 
                cpcm->device = dev;
3308
 
                err =  snd_hda_attach_pcm_stream(bus, codec, cpcm);
3309
 
                if (err < 0) {
3310
 
                        codec_err(codec,
3311
 
                                  "cannot attach PCM stream %d for codec #%d\n",
3312
 
                                  dev, codec->core.addr);
3313
 
                        continue; /* no fatal error */
3314
 
                }
3315
 
        }
3316
 
 
3317
 
        return 0;
3318
 
}
3319
 
 
3320
 
/**
3321
 
 * snd_hda_add_new_ctls - create controls from the array
3322
 
 * @codec: the HDA codec
3323
 
 * @knew: the array of struct snd_kcontrol_new
3324
 
 *
3325
 
 * This helper function creates and add new controls in the given array.
3326
 
 * The array must be terminated with an empty entry as terminator.
3327
 
 *
3328
 
 * Returns 0 if successful, or a negative error code.
3329
 
 */
3330
 
int snd_hda_add_new_ctls(struct hda_codec *codec,
3331
 
                         const struct snd_kcontrol_new *knew)
3332
 
{
3333
 
        int err;
3334
 
 
3335
 
        for (; knew->name; knew++) {
3336
 
                struct snd_kcontrol *kctl;
3337
 
                int addr = 0, idx = 0;
3338
 
                if (knew->iface == (__force snd_ctl_elem_iface_t)-1)
3339
 
                        continue; /* skip this codec private value */
3340
 
                for (;;) {
3341
 
                        kctl = snd_ctl_new1(knew, codec);
3342
 
                        if (!kctl)
3343
 
                                return -ENOMEM;
3344
 
                        if (addr > 0)
3345
 
                                kctl->id.device = addr;
3346
 
                        if (idx > 0)
3347
 
                                kctl->id.index = idx;
3348
 
                        err = snd_hda_ctl_add(codec, 0, kctl);
3349
 
                        if (!err)
3350
 
                                break;
3351
 
                        /* try first with another device index corresponding to
3352
 
                         * the codec addr; if it still fails (or it's the
3353
 
                         * primary codec), then try another control index
3354
 
                         */
3355
 
                        if (!addr && codec->core.addr)
3356
 
                                addr = codec->core.addr;
3357
 
                        else if (!idx && !knew->index) {
3358
 
                                idx = find_empty_mixer_ctl_idx(codec,
3359
 
                                                               knew->name, 0);
3360
 
                                if (idx <= 0)
3361
 
                                        return err;
3362
 
                        } else
3363
 
                                return err;
3364
 
                }
3365
 
        }
3366
 
        return 0;
3367
 
}
3368
 
EXPORT_SYMBOL_GPL(snd_hda_add_new_ctls);
3369
 
 
3370
 
#ifdef CONFIG_PM
3371
 
static void codec_set_power_save(struct hda_codec *codec, int delay)
3372
 
{
3373
 
        struct device *dev = hda_codec_dev(codec);
3374
 
 
3375
 
        if (delay == 0 && codec->auto_runtime_pm)
3376
 
                delay = 3000;
3377
 
 
3378
 
        if (delay > 0) {
3379
 
                pm_runtime_set_autosuspend_delay(dev, delay);
3380
 
                pm_runtime_use_autosuspend(dev);
3381
 
                pm_runtime_allow(dev);
3382
 
                if (!pm_runtime_suspended(dev))
3383
 
                        pm_runtime_mark_last_busy(dev);
3384
 
        } else {
3385
 
                pm_runtime_dont_use_autosuspend(dev);
3386
 
                pm_runtime_forbid(dev);
3387
 
        }
3388
 
}
3389
 
 
3390
 
/**
3391
 
 * snd_hda_set_power_save - reprogram autosuspend for the given delay
3392
 
 * @bus: HD-audio bus
3393
 
 * @delay: autosuspend delay in msec, 0 = off
3394
 
 *
3395
 
 * Synchronize the runtime PM autosuspend state from the power_save option.
3396
 
 */
3397
 
void snd_hda_set_power_save(struct hda_bus *bus, int delay)
3398
 
{
3399
 
        struct hda_codec *c;
3400
 
 
3401
 
        list_for_each_codec(c, bus)
3402
 
                codec_set_power_save(c, delay);
3403
 
}
3404
 
EXPORT_SYMBOL_GPL(snd_hda_set_power_save);
3405
 
 
3406
 
/**
3407
 
 * snd_hda_check_amp_list_power - Check the amp list and update the power
3408
 
 * @codec: HD-audio codec
3409
 
 * @check: the object containing an AMP list and the status
3410
 
 * @nid: NID to check / update
3411
 
 *
3412
 
 * Check whether the given NID is in the amp list.  If it's in the list,
3413
 
 * check the current AMP status, and update the the power-status according
3414
 
 * to the mute status.
3415
 
 *
3416
 
 * This function is supposed to be set or called from the check_power_status
3417
 
 * patch ops.
3418
 
 */
3419
 
int snd_hda_check_amp_list_power(struct hda_codec *codec,
3420
 
                                 struct hda_loopback_check *check,
3421
 
                                 hda_nid_t nid)
3422
 
{
3423
 
        const struct hda_amp_list *p;
3424
 
        int ch, v;
3425
 
 
3426
 
        if (!check->amplist)
3427
 
                return 0;
3428
 
        for (p = check->amplist; p->nid; p++) {
3429
 
                if (p->nid == nid)
3430
 
                        break;
3431
 
        }
3432
 
        if (!p->nid)
3433
 
                return 0; /* nothing changed */
3434
 
 
3435
 
        for (p = check->amplist; p->nid; p++) {
3436
 
                for (ch = 0; ch < 2; ch++) {
3437
 
                        v = snd_hda_codec_amp_read(codec, p->nid, ch, p->dir,
3438
 
                                                   p->idx);
3439
 
                        if (!(v & HDA_AMP_MUTE) && v > 0) {
3440
 
                                if (!check->power_on) {
3441
 
                                        check->power_on = 1;
3442
 
                                        snd_hda_power_up_pm(codec);
3443
 
                                }
3444
 
                                return 1;
3445
 
                        }
3446
 
                }
3447
 
        }
3448
 
        if (check->power_on) {
3449
 
                check->power_on = 0;
3450
 
                snd_hda_power_down_pm(codec);
3451
 
        }
3452
 
        return 0;
3453
 
}
3454
 
EXPORT_SYMBOL_GPL(snd_hda_check_amp_list_power);
3455
 
#endif
3456
 
 
3457
 
/*
3458
 
 * input MUX helper
3459
 
 */
3460
 
 
3461
 
/**
3462
 
 * snd_hda_input_mux_info_info - Info callback helper for the input-mux enum
3463
 
 * @imux: imux helper object
3464
 
 * @uinfo: pointer to get/store the data
3465
 
 */
3466
 
int snd_hda_input_mux_info(const struct hda_input_mux *imux,
3467
 
                           struct snd_ctl_elem_info *uinfo)
3468
 
{
3469
 
        unsigned int index;
3470
 
 
3471
 
        uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3472
 
        uinfo->count = 1;
3473
 
        uinfo->value.enumerated.items = imux->num_items;
3474
 
        if (!imux->num_items)
3475
 
                return 0;
3476
 
        index = uinfo->value.enumerated.item;
3477
 
        if (index >= imux->num_items)
3478
 
                index = imux->num_items - 1;
3479
 
        strcpy(uinfo->value.enumerated.name, imux->items[index].label);
3480
 
        return 0;
3481
 
}
3482
 
EXPORT_SYMBOL_GPL(snd_hda_input_mux_info);
3483
 
 
3484
 
/**
3485
 
 * snd_hda_input_mux_info_put - Put callback helper for the input-mux enum
3486
 
 * @codec: the HDA codec
3487
 
 * @imux: imux helper object
3488
 
 * @ucontrol: pointer to get/store the data
3489
 
 * @nid: input mux NID
3490
 
 * @cur_val: pointer to get/store the current imux value
3491
 
 */
3492
 
int snd_hda_input_mux_put(struct hda_codec *codec,
3493
 
                          const struct hda_input_mux *imux,
3494
 
                          struct snd_ctl_elem_value *ucontrol,
3495
 
                          hda_nid_t nid,
3496
 
                          unsigned int *cur_val)
3497
 
{
3498
 
        unsigned int idx;
3499
 
 
3500
 
        if (!imux->num_items)
3501
 
                return 0;
3502
 
        idx = ucontrol->value.enumerated.item[0];
3503
 
        if (idx >= imux->num_items)
3504
 
                idx = imux->num_items - 1;
3505
 
        if (*cur_val == idx)
3506
 
                return 0;
3507
 
        snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_CONNECT_SEL,
3508
 
                                  imux->items[idx].index);
3509
 
        *cur_val = idx;
3510
 
        return 1;
3511
 
}
3512
 
EXPORT_SYMBOL_GPL(snd_hda_input_mux_put);
3513
 
 
3514
 
 
3515
 
/**
3516
 
 * snd_hda_enum_helper_info - Helper for simple enum ctls
3517
 
 * @kcontrol: ctl element
3518
 
 * @uinfo: pointer to get/store the data
3519
 
 * @num_items: number of enum items
3520
 
 * @texts: enum item string array
3521
 
 *
3522
 
 * process kcontrol info callback of a simple string enum array
3523
 
 * when @num_items is 0 or @texts is NULL, assume a boolean enum array
3524
 
 */
3525
 
int snd_hda_enum_helper_info(struct snd_kcontrol *kcontrol,
3526
 
                             struct snd_ctl_elem_info *uinfo,
3527
 
                             int num_items, const char * const *texts)
3528
 
{
3529
 
        static const char * const texts_default[] = {
3530
 
                "Disabled", "Enabled"
3531
 
        };
3532
 
 
3533
 
        if (!texts || !num_items) {
3534
 
                num_items = 2;
3535
 
                texts = texts_default;
3536
 
        }
3537
 
 
3538
 
        return snd_ctl_enum_info(uinfo, 1, num_items, texts);
3539
 
}
3540
 
EXPORT_SYMBOL_GPL(snd_hda_enum_helper_info);
3541
 
 
3542
 
/*
3543
 
 * Multi-channel / digital-out PCM helper functions
3544
 
 */
3545
 
 
3546
 
/* setup SPDIF output stream */
3547
 
static void setup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid,
3548
 
                                 unsigned int stream_tag, unsigned int format)
3549
 
{
3550
 
        struct hda_spdif_out *spdif;
3551
 
        unsigned int curr_fmt;
3552
 
        bool reset;
3553
 
 
3554
 
        spdif = snd_hda_spdif_out_of_nid(codec, nid);
3555
 
        /* Add sanity check to pass klockwork check.
3556
 
         * This should never happen.
3557
 
         */
3558
 
        if (WARN_ON(spdif == NULL))
3559
 
                return;
3560
 
 
3561
 
        curr_fmt = snd_hda_codec_read(codec, nid, 0,
3562
 
                                      AC_VERB_GET_STREAM_FORMAT, 0);
3563
 
        reset = codec->spdif_status_reset &&
3564
 
                (spdif->ctls & AC_DIG1_ENABLE) &&
3565
 
                curr_fmt != format;
3566
 
 
3567
 
        /* turn off SPDIF if needed; otherwise the IEC958 bits won't be
3568
 
           updated */
3569
 
        if (reset)
3570
 
                set_dig_out_convert(codec, nid,
3571
 
                                    spdif->ctls & ~AC_DIG1_ENABLE & 0xff,
3572
 
                                    -1);
3573
 
        snd_hda_codec_setup_stream(codec, nid, stream_tag, 0, format);
3574
 
        if (codec->slave_dig_outs) {
3575
 
                const hda_nid_t *d;
3576
 
                for (d = codec->slave_dig_outs; *d; d++)
3577
 
                        snd_hda_codec_setup_stream(codec, *d, stream_tag, 0,
3578
 
                                                   format);
3579
 
        }
3580
 
        /* turn on again (if needed) */
3581
 
        if (reset)
3582
 
                set_dig_out_convert(codec, nid,
3583
 
                                    spdif->ctls & 0xff, -1);
3584
 
}
3585
 
 
3586
 
static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid)
3587
 
{
3588
 
        snd_hda_codec_cleanup_stream(codec, nid);
3589
 
        if (codec->slave_dig_outs) {
3590
 
                const hda_nid_t *d;
3591
 
                for (d = codec->slave_dig_outs; *d; d++)
3592
 
                        snd_hda_codec_cleanup_stream(codec, *d);
3593
 
        }
3594
 
}
3595
 
 
3596
 
/**
3597
 
 * snd_hda_multi_out_dig_open - open the digital out in the exclusive mode
3598
 
 * @codec: the HDA codec
3599
 
 * @mout: hda_multi_out object
3600
 
 */
3601
 
int snd_hda_multi_out_dig_open(struct hda_codec *codec,
3602
 
                               struct hda_multi_out *mout)
3603
 
{
3604
 
        mutex_lock(&codec->spdif_mutex);
3605
 
        if (mout->dig_out_used == HDA_DIG_ANALOG_DUP)
3606
 
                /* already opened as analog dup; reset it once */
3607
 
                cleanup_dig_out_stream(codec, mout->dig_out_nid);
3608
 
        mout->dig_out_used = HDA_DIG_EXCLUSIVE;
3609
 
        mutex_unlock(&codec->spdif_mutex);
3610
 
        return 0;
3611
 
}
3612
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_open);
3613
 
 
3614
 
/**
3615
 
 * snd_hda_multi_out_dig_prepare - prepare the digital out stream
3616
 
 * @codec: the HDA codec
3617
 
 * @mout: hda_multi_out object
3618
 
 * @stream_tag: stream tag to assign
3619
 
 * @format: format id to assign
3620
 
 * @substream: PCM substream to assign
3621
 
 */
3622
 
int snd_hda_multi_out_dig_prepare(struct hda_codec *codec,
3623
 
                                  struct hda_multi_out *mout,
3624
 
                                  unsigned int stream_tag,
3625
 
                                  unsigned int format,
3626
 
                                  struct snd_pcm_substream *substream)
3627
 
{
3628
 
        mutex_lock(&codec->spdif_mutex);
3629
 
        setup_dig_out_stream(codec, mout->dig_out_nid, stream_tag, format);
3630
 
        mutex_unlock(&codec->spdif_mutex);
3631
 
        return 0;
3632
 
}
3633
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_prepare);
3634
 
 
3635
 
/**
3636
 
 * snd_hda_multi_out_dig_cleanup - clean-up the digital out stream
3637
 
 * @codec: the HDA codec
3638
 
 * @mout: hda_multi_out object
3639
 
 */
3640
 
int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
3641
 
                                  struct hda_multi_out *mout)
3642
 
{
3643
 
        mutex_lock(&codec->spdif_mutex);
3644
 
        cleanup_dig_out_stream(codec, mout->dig_out_nid);
3645
 
        mutex_unlock(&codec->spdif_mutex);
3646
 
        return 0;
3647
 
}
3648
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_cleanup);
3649
 
 
3650
 
/**
3651
 
 * snd_hda_multi_out_dig_close - release the digital out stream
3652
 
 * @codec: the HDA codec
3653
 
 * @mout: hda_multi_out object
3654
 
 */
3655
 
int snd_hda_multi_out_dig_close(struct hda_codec *codec,
3656
 
                                struct hda_multi_out *mout)
3657
 
{
3658
 
        mutex_lock(&codec->spdif_mutex);
3659
 
        mout->dig_out_used = 0;
3660
 
        mutex_unlock(&codec->spdif_mutex);
3661
 
        return 0;
3662
 
}
3663
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_dig_close);
3664
 
 
3665
 
/**
3666
 
 * snd_hda_multi_out_analog_open - open analog outputs
3667
 
 * @codec: the HDA codec
3668
 
 * @mout: hda_multi_out object
3669
 
 * @substream: PCM substream to assign
3670
 
 * @hinfo: PCM information to assign
3671
 
 *
3672
 
 * Open analog outputs and set up the hw-constraints.
3673
 
 * If the digital outputs can be opened as slave, open the digital
3674
 
 * outputs, too.
3675
 
 */
3676
 
int snd_hda_multi_out_analog_open(struct hda_codec *codec,
3677
 
                                  struct hda_multi_out *mout,
3678
 
                                  struct snd_pcm_substream *substream,
3679
 
                                  struct hda_pcm_stream *hinfo)
3680
 
{
3681
 
        struct snd_pcm_runtime *runtime = substream->runtime;
3682
 
        runtime->hw.channels_max = mout->max_channels;
3683
 
        if (mout->dig_out_nid) {
3684
 
                if (!mout->analog_rates) {
3685
 
                        mout->analog_rates = hinfo->rates;
3686
 
                        mout->analog_formats = hinfo->formats;
3687
 
                        mout->analog_maxbps = hinfo->maxbps;
3688
 
                } else {
3689
 
                        runtime->hw.rates = mout->analog_rates;
3690
 
                        runtime->hw.formats = mout->analog_formats;
3691
 
                        hinfo->maxbps = mout->analog_maxbps;
3692
 
                }
3693
 
                if (!mout->spdif_rates) {
3694
 
                        snd_hda_query_supported_pcm(codec, mout->dig_out_nid,
3695
 
                                                    &mout->spdif_rates,
3696
 
                                                    &mout->spdif_formats,
3697
 
                                                    &mout->spdif_maxbps);
3698
 
                }
3699
 
                mutex_lock(&codec->spdif_mutex);
3700
 
                if (mout->share_spdif) {
3701
 
                        if ((runtime->hw.rates & mout->spdif_rates) &&
3702
 
                            (runtime->hw.formats & mout->spdif_formats)) {
3703
 
                                runtime->hw.rates &= mout->spdif_rates;
3704
 
                                runtime->hw.formats &= mout->spdif_formats;
3705
 
                                if (mout->spdif_maxbps < hinfo->maxbps)
3706
 
                                        hinfo->maxbps = mout->spdif_maxbps;
3707
 
                        } else {
3708
 
                                mout->share_spdif = 0;
3709
 
                                /* FIXME: need notify? */
3710
 
                        }
3711
 
                }
3712
 
                mutex_unlock(&codec->spdif_mutex);
3713
 
        }
3714
 
        return snd_pcm_hw_constraint_step(substream->runtime, 0,
3715
 
                                          SNDRV_PCM_HW_PARAM_CHANNELS, 2);
3716
 
}
3717
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_open);
3718
 
 
3719
 
/**
3720
 
 * snd_hda_multi_out_analog_prepare - Preapre the analog outputs.
3721
 
 * @codec: the HDA codec
3722
 
 * @mout: hda_multi_out object
3723
 
 * @stream_tag: stream tag to assign
3724
 
 * @format: format id to assign
3725
 
 * @substream: PCM substream to assign
3726
 
 *
3727
 
 * Set up the i/o for analog out.
3728
 
 * When the digital out is available, copy the front out to digital out, too.
3729
 
 */
3730
 
int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
3731
 
                                     struct hda_multi_out *mout,
3732
 
                                     unsigned int stream_tag,
3733
 
                                     unsigned int format,
3734
 
                                     struct snd_pcm_substream *substream)
3735
 
{
3736
 
        const hda_nid_t *nids = mout->dac_nids;
3737
 
        int chs = substream->runtime->channels;
3738
 
        struct hda_spdif_out *spdif;
3739
 
        int i;
3740
 
 
3741
 
        mutex_lock(&codec->spdif_mutex);
3742
 
        spdif = snd_hda_spdif_out_of_nid(codec, mout->dig_out_nid);
3743
 
        if (mout->dig_out_nid && mout->share_spdif &&
3744
 
            mout->dig_out_used != HDA_DIG_EXCLUSIVE) {
3745
 
                if (chs == 2 && spdif != NULL &&
3746
 
                    snd_hda_is_supported_format(codec, mout->dig_out_nid,
3747
 
                                                format) &&
3748
 
                    !(spdif->status & IEC958_AES0_NONAUDIO)) {
3749
 
                        mout->dig_out_used = HDA_DIG_ANALOG_DUP;
3750
 
                        setup_dig_out_stream(codec, mout->dig_out_nid,
3751
 
                                             stream_tag, format);
3752
 
                } else {
3753
 
                        mout->dig_out_used = 0;
3754
 
                        cleanup_dig_out_stream(codec, mout->dig_out_nid);
3755
 
                }
3756
 
        }
3757
 
        mutex_unlock(&codec->spdif_mutex);
3758
 
 
3759
 
        /* front */
3760
 
        snd_hda_codec_setup_stream(codec, nids[HDA_FRONT], stream_tag,
3761
 
                                   0, format);
3762
 
        if (!mout->no_share_stream &&
3763
 
            mout->hp_nid && mout->hp_nid != nids[HDA_FRONT])
3764
 
                /* headphone out will just decode front left/right (stereo) */
3765
 
                snd_hda_codec_setup_stream(codec, mout->hp_nid, stream_tag,
3766
 
                                           0, format);
3767
 
        /* extra outputs copied from front */
3768
 
        for (i = 0; i < ARRAY_SIZE(mout->hp_out_nid); i++)
3769
 
                if (!mout->no_share_stream && mout->hp_out_nid[i])
3770
 
                        snd_hda_codec_setup_stream(codec,
3771
 
                                                   mout->hp_out_nid[i],
3772
 
                                                   stream_tag, 0, format);
3773
 
 
3774
 
        /* surrounds */
3775
 
        for (i = 1; i < mout->num_dacs; i++) {
3776
 
                if (chs >= (i + 1) * 2) /* independent out */
3777
 
                        snd_hda_codec_setup_stream(codec, nids[i], stream_tag,
3778
 
                                                   i * 2, format);
3779
 
                else if (!mout->no_share_stream) /* copy front */
3780
 
                        snd_hda_codec_setup_stream(codec, nids[i], stream_tag,
3781
 
                                                   0, format);
3782
 
        }
3783
 
 
3784
 
        /* extra surrounds */
3785
 
        for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++) {
3786
 
                int ch = 0;
3787
 
                if (!mout->extra_out_nid[i])
3788
 
                        break;
3789
 
                if (chs >= (i + 1) * 2)
3790
 
                        ch = i * 2;
3791
 
                else if (!mout->no_share_stream)
3792
 
                        break;
3793
 
                snd_hda_codec_setup_stream(codec, mout->extra_out_nid[i],
3794
 
                                           stream_tag, ch, format);
3795
 
        }
3796
 
 
3797
 
        return 0;
3798
 
}
3799
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_prepare);
3800
 
 
3801
 
/**
3802
 
 * snd_hda_multi_out_analog_cleanup - clean up the setting for analog out
3803
 
 * @codec: the HDA codec
3804
 
 * @mout: hda_multi_out object
3805
 
 */
3806
 
int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
3807
 
                                     struct hda_multi_out *mout)
3808
 
{
3809
 
        const hda_nid_t *nids = mout->dac_nids;
3810
 
        int i;
3811
 
 
3812
 
        for (i = 0; i < mout->num_dacs; i++)
3813
 
                snd_hda_codec_cleanup_stream(codec, nids[i]);
3814
 
        if (mout->hp_nid)
3815
 
                snd_hda_codec_cleanup_stream(codec, mout->hp_nid);
3816
 
        for (i = 0; i < ARRAY_SIZE(mout->hp_out_nid); i++)
3817
 
                if (mout->hp_out_nid[i])
3818
 
                        snd_hda_codec_cleanup_stream(codec,
3819
 
                                                     mout->hp_out_nid[i]);
3820
 
        for (i = 0; i < ARRAY_SIZE(mout->extra_out_nid); i++)
3821
 
                if (mout->extra_out_nid[i])
3822
 
                        snd_hda_codec_cleanup_stream(codec,
3823
 
                                                     mout->extra_out_nid[i]);
3824
 
        mutex_lock(&codec->spdif_mutex);
3825
 
        if (mout->dig_out_nid && mout->dig_out_used == HDA_DIG_ANALOG_DUP) {
3826
 
                cleanup_dig_out_stream(codec, mout->dig_out_nid);
3827
 
                mout->dig_out_used = 0;
3828
 
        }
3829
 
        mutex_unlock(&codec->spdif_mutex);
3830
 
        return 0;
3831
 
}
3832
 
EXPORT_SYMBOL_GPL(snd_hda_multi_out_analog_cleanup);
3833
 
 
3834
 
/**
3835
 
 * snd_hda_get_default_vref - Get the default (mic) VREF pin bits
3836
 
 * @codec: the HDA codec
3837
 
 * @pin: referred pin NID
3838
 
 *
3839
 
 * Guess the suitable VREF pin bits to be set as the pin-control value.
3840
 
 * Note: the function doesn't set the AC_PINCTL_IN_EN bit.
3841
 
 */
3842
 
unsigned int snd_hda_get_default_vref(struct hda_codec *codec, hda_nid_t pin)
3843
 
{
3844
 
        unsigned int pincap;
3845
 
        unsigned int oldval;
3846
 
        oldval = snd_hda_codec_read(codec, pin, 0,
3847
 
                                    AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3848
 
        pincap = snd_hda_query_pin_caps(codec, pin);
3849
 
        pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
3850
 
        /* Exception: if the default pin setup is vref50, we give it priority */
3851
 
        if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
3852
 
                return AC_PINCTL_VREF_80;
3853
 
        else if (pincap & AC_PINCAP_VREF_50)
3854
 
                return AC_PINCTL_VREF_50;
3855
 
        else if (pincap & AC_PINCAP_VREF_100)
3856
 
                return AC_PINCTL_VREF_100;
3857
 
        else if (pincap & AC_PINCAP_VREF_GRD)
3858
 
                return AC_PINCTL_VREF_GRD;
3859
 
        return AC_PINCTL_VREF_HIZ;
3860
 
}
3861
 
EXPORT_SYMBOL_GPL(snd_hda_get_default_vref);
3862
 
 
3863
 
/**
3864
 
 * snd_hda_correct_pin_ctl - correct the pin ctl value for matching with the pin cap
3865
 
 * @codec: the HDA codec
3866
 
 * @pin: referred pin NID
3867
 
 * @val: pin ctl value to audit
3868
 
 */
3869
 
unsigned int snd_hda_correct_pin_ctl(struct hda_codec *codec,
3870
 
                                     hda_nid_t pin, unsigned int val)
3871
 
{
3872
 
        static unsigned int cap_lists[][2] = {
3873
 
                { AC_PINCTL_VREF_100, AC_PINCAP_VREF_100 },
3874
 
                { AC_PINCTL_VREF_80, AC_PINCAP_VREF_80 },
3875
 
                { AC_PINCTL_VREF_50, AC_PINCAP_VREF_50 },
3876
 
                { AC_PINCTL_VREF_GRD, AC_PINCAP_VREF_GRD },
3877
 
        };
3878
 
        unsigned int cap;
3879
 
 
3880
 
        if (!val)
3881
 
                return 0;
3882
 
        cap = snd_hda_query_pin_caps(codec, pin);
3883
 
        if (!cap)
3884
 
                return val; /* don't know what to do... */
3885
 
 
3886
 
        if (val & AC_PINCTL_OUT_EN) {
3887
 
                if (!(cap & AC_PINCAP_OUT))
3888
 
                        val &= ~(AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
3889
 
                else if ((val & AC_PINCTL_HP_EN) && !(cap & AC_PINCAP_HP_DRV))
3890
 
                        val &= ~AC_PINCTL_HP_EN;
3891
 
        }
3892
 
 
3893
 
        if (val & AC_PINCTL_IN_EN) {
3894
 
                if (!(cap & AC_PINCAP_IN))
3895
 
                        val &= ~(AC_PINCTL_IN_EN | AC_PINCTL_VREFEN);
3896
 
                else {
3897
 
                        unsigned int vcap, vref;
3898
 
                        int i;
3899
 
                        vcap = (cap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
3900
 
                        vref = val & AC_PINCTL_VREFEN;
3901
 
                        for (i = 0; i < ARRAY_SIZE(cap_lists); i++) {
3902
 
                                if (vref == cap_lists[i][0] &&
3903
 
                                    !(vcap & cap_lists[i][1])) {
3904
 
                                        if (i == ARRAY_SIZE(cap_lists) - 1)
3905
 
                                                vref = AC_PINCTL_VREF_HIZ;
3906
 
                                        else
3907
 
                                                vref = cap_lists[i + 1][0];
3908
 
                                }
3909
 
                        }
3910
 
                        val &= ~AC_PINCTL_VREFEN;
3911
 
                        val |= vref;
3912
 
                }
3913
 
        }
3914
 
 
3915
 
        return val;
3916
 
}
3917
 
EXPORT_SYMBOL_GPL(snd_hda_correct_pin_ctl);
3918
 
 
3919
 
/**
3920
 
 * _snd_hda_pin_ctl - Helper to set pin ctl value
3921
 
 * @codec: the HDA codec
3922
 
 * @pin: referred pin NID
3923
 
 * @val: pin control value to set
3924
 
 * @cached: access over codec pinctl cache or direct write
3925
 
 *
3926
 
 * This function is a helper to set a pin ctl value more safely.
3927
 
 * It corrects the pin ctl value via snd_hda_correct_pin_ctl(), stores the
3928
 
 * value in pin target array via snd_hda_codec_set_pin_target(), then
3929
 
 * actually writes the value via either snd_hda_codec_write_cache() or
3930
 
 * snd_hda_codec_write() depending on @cached flag.
3931
 
 */
3932
 
int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
3933
 
                         unsigned int val, bool cached)
3934
 
{
3935
 
        val = snd_hda_correct_pin_ctl(codec, pin, val);
3936
 
        snd_hda_codec_set_pin_target(codec, pin, val);
3937
 
        if (cached)
3938
 
                return snd_hda_codec_write_cache(codec, pin, 0,
3939
 
                                AC_VERB_SET_PIN_WIDGET_CONTROL, val);
3940
 
        else
3941
 
                return snd_hda_codec_write(codec, pin, 0,
3942
 
                                           AC_VERB_SET_PIN_WIDGET_CONTROL, val);
3943
 
}
3944
 
EXPORT_SYMBOL_GPL(_snd_hda_set_pin_ctl);
3945
 
 
3946
 
/**
3947
 
 * snd_hda_add_imux_item - Add an item to input_mux
3948
 
 * @codec: the HDA codec
3949
 
 * @imux: imux helper object
3950
 
 * @label: the name of imux item to assign
3951
 
 * @index: index number of imux item to assign
3952
 
 * @type_idx: pointer to store the resultant label index
3953
 
 *
3954
 
 * When the same label is used already in the existing items, the number
3955
 
 * suffix is appended to the label.  This label index number is stored
3956
 
 * to type_idx when non-NULL pointer is given.
3957
 
 */
3958
 
int snd_hda_add_imux_item(struct hda_codec *codec,
3959
 
                          struct hda_input_mux *imux, const char *label,
3960
 
                          int index, int *type_idx)
3961
 
{
3962
 
        int i, label_idx = 0;
3963
 
        if (imux->num_items >= HDA_MAX_NUM_INPUTS) {
3964
 
                codec_err(codec, "hda_codec: Too many imux items!\n");
3965
 
                return -EINVAL;
3966
 
        }
3967
 
        for (i = 0; i < imux->num_items; i++) {
3968
 
                if (!strncmp(label, imux->items[i].label, strlen(label)))
3969
 
                        label_idx++;
3970
 
        }
3971
 
        if (type_idx)
3972
 
                *type_idx = label_idx;
3973
 
        if (label_idx > 0)
3974
 
                snprintf(imux->items[imux->num_items].label,
3975
 
                         sizeof(imux->items[imux->num_items].label),
3976
 
                         "%s %d", label, label_idx);
3977
 
        else
3978
 
                strlcpy(imux->items[imux->num_items].label, label,
3979
 
                        sizeof(imux->items[imux->num_items].label));
3980
 
        imux->items[imux->num_items].index = index;
3981
 
        imux->num_items++;
3982
 
        return 0;
3983
 
}
3984
 
EXPORT_SYMBOL_GPL(snd_hda_add_imux_item);
3985
 
 
3986
 
/**
3987
 
 * snd_hda_bus_reset_codecs - Reset the bus
3988
 
 * @bus: HD-audio bus
3989
 
 */
3990
 
void snd_hda_bus_reset_codecs(struct hda_bus *bus)
3991
 
{
3992
 
        struct hda_codec *codec;
3993
 
 
3994
 
        list_for_each_codec(codec, bus) {
3995
 
                /* FIXME: maybe a better way needed for forced reset */
3996
 
                if (current_work() != &codec->jackpoll_work.work)
3997
 
                        cancel_delayed_work_sync(&codec->jackpoll_work);
3998
 
#ifdef CONFIG_PM
3999
 
                if (hda_codec_is_power_on(codec)) {
4000
 
                        hda_call_codec_suspend(codec);
4001
 
                        hda_call_codec_resume(codec);
4002
 
                }
4003
 
#endif
4004
 
        }
4005
 
}
4006
 
 
4007
 
/**
4008
 
 * snd_print_pcm_bits - Print the supported PCM fmt bits to the string buffer
4009
 
 * @pcm: PCM caps bits
4010
 
 * @buf: the string buffer to write
4011
 
 * @buflen: the max buffer length
4012
 
 *
4013
 
 * used by hda_proc.c and hda_eld.c
4014
 
 */
4015
 
void snd_print_pcm_bits(int pcm, char *buf, int buflen)
4016
 
{
4017
 
        static unsigned int bits[] = { 8, 16, 20, 24, 32 };
4018
 
        int i, j;
4019
 
 
4020
 
        for (i = 0, j = 0; i < ARRAY_SIZE(bits); i++)
4021
 
                if (pcm & (AC_SUPPCM_BITS_8 << i))
4022
 
                        j += snprintf(buf + j, buflen - j,  " %d", bits[i]);
4023
 
 
4024
 
        buf[j] = '\0'; /* necessary when j == 0 */
4025
 
}
4026
 
EXPORT_SYMBOL_GPL(snd_print_pcm_bits);
4027
 
 
4028
 
MODULE_DESCRIPTION("HDA codec core");
4029
 
MODULE_LICENSE("GPL");