ARM: s3c: fix typos in comments
[platform/kernel/linux-starfive.git] / sound / pci / aw2 / aw2-alsa.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*****************************************************************************
3  *
4  * Copyright (C) 2008 Cedric Bregardis <cedric.bregardis@free.fr> and
5  * Jean-Christian Hassler <jhassler@free.fr>
6  *
7  * This file is part of the Audiowerk2 ALSA driver
8  *
9  *****************************************************************************/
10 #include <linux/init.h>
11 #include <linux/pci.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/slab.h>
14 #include <linux/interrupt.h>
15 #include <linux/delay.h>
16 #include <linux/io.h>
17 #include <linux/module.h>
18 #include <sound/core.h>
19 #include <sound/initval.h>
20 #include <sound/pcm.h>
21 #include <sound/pcm_params.h>
22 #include <sound/control.h>
23
24 #include "saa7146.h"
25 #include "aw2-saa7146.h"
26
27 MODULE_AUTHOR("Cedric Bregardis <cedric.bregardis@free.fr>, "
28               "Jean-Christian Hassler <jhassler@free.fr>");
29 MODULE_DESCRIPTION("Emagic Audiowerk 2 sound driver");
30 MODULE_LICENSE("GPL");
31
32 /*********************************
33  * DEFINES
34  ********************************/
35 #define CTL_ROUTE_ANALOG 0
36 #define CTL_ROUTE_DIGITAL 1
37
38 /*********************************
39  * TYPEDEFS
40  ********************************/
41   /* hardware definition */
42 static const struct snd_pcm_hardware snd_aw2_playback_hw = {
43         .info = (SNDRV_PCM_INFO_MMAP |
44                  SNDRV_PCM_INFO_INTERLEAVED |
45                  SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID),
46         .formats = SNDRV_PCM_FMTBIT_S16_LE,
47         .rates = SNDRV_PCM_RATE_44100,
48         .rate_min = 44100,
49         .rate_max = 44100,
50         .channels_min = 2,
51         .channels_max = 4,
52         .buffer_bytes_max = 32768,
53         .period_bytes_min = 4096,
54         .period_bytes_max = 32768,
55         .periods_min = 1,
56         .periods_max = 1024,
57 };
58
59 static const struct snd_pcm_hardware snd_aw2_capture_hw = {
60         .info = (SNDRV_PCM_INFO_MMAP |
61                  SNDRV_PCM_INFO_INTERLEAVED |
62                  SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_MMAP_VALID),
63         .formats = SNDRV_PCM_FMTBIT_S16_LE,
64         .rates = SNDRV_PCM_RATE_44100,
65         .rate_min = 44100,
66         .rate_max = 44100,
67         .channels_min = 2,
68         .channels_max = 2,
69         .buffer_bytes_max = 32768,
70         .period_bytes_min = 4096,
71         .period_bytes_max = 32768,
72         .periods_min = 1,
73         .periods_max = 1024,
74 };
75
76 struct aw2_pcm_device {
77         struct snd_pcm *pcm;
78         unsigned int stream_number;
79         struct aw2 *chip;
80 };
81
82 struct aw2 {
83         struct snd_aw2_saa7146 saa7146;
84
85         struct pci_dev *pci;
86         int irq;
87         spinlock_t reg_lock;
88         struct mutex mtx;
89
90         unsigned long iobase_phys;
91         void __iomem *iobase_virt;
92
93         struct snd_card *card;
94
95         struct aw2_pcm_device device_playback[NB_STREAM_PLAYBACK];
96         struct aw2_pcm_device device_capture[NB_STREAM_CAPTURE];
97 };
98
99 /*********************************
100  * FUNCTION DECLARATIONS
101  ********************************/
102 static int snd_aw2_create(struct snd_card *card, struct pci_dev *pci);
103 static int snd_aw2_probe(struct pci_dev *pci,
104                          const struct pci_device_id *pci_id);
105 static int snd_aw2_pcm_playback_open(struct snd_pcm_substream *substream);
106 static int snd_aw2_pcm_playback_close(struct snd_pcm_substream *substream);
107 static int snd_aw2_pcm_capture_open(struct snd_pcm_substream *substream);
108 static int snd_aw2_pcm_capture_close(struct snd_pcm_substream *substream);
109 static int snd_aw2_pcm_prepare_playback(struct snd_pcm_substream *substream);
110 static int snd_aw2_pcm_prepare_capture(struct snd_pcm_substream *substream);
111 static int snd_aw2_pcm_trigger_playback(struct snd_pcm_substream *substream,
112                                         int cmd);
113 static int snd_aw2_pcm_trigger_capture(struct snd_pcm_substream *substream,
114                                        int cmd);
115 static snd_pcm_uframes_t snd_aw2_pcm_pointer_playback(struct snd_pcm_substream
116                                                       *substream);
117 static snd_pcm_uframes_t snd_aw2_pcm_pointer_capture(struct snd_pcm_substream
118                                                      *substream);
119 static int snd_aw2_new_pcm(struct aw2 *chip);
120
121 static int snd_aw2_control_switch_capture_info(struct snd_kcontrol *kcontrol,
122                                                struct snd_ctl_elem_info *uinfo);
123 static int snd_aw2_control_switch_capture_get(struct snd_kcontrol *kcontrol,
124                                               struct snd_ctl_elem_value
125                                               *ucontrol);
126 static int snd_aw2_control_switch_capture_put(struct snd_kcontrol *kcontrol,
127                                               struct snd_ctl_elem_value
128                                               *ucontrol);
129
130 /*********************************
131  * VARIABLES
132  ********************************/
133 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;
134 static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;
135 static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;
136
137 module_param_array(index, int, NULL, 0444);
138 MODULE_PARM_DESC(index, "Index value for Audiowerk2 soundcard.");
139 module_param_array(id, charp, NULL, 0444);
140 MODULE_PARM_DESC(id, "ID string for the Audiowerk2 soundcard.");
141 module_param_array(enable, bool, NULL, 0444);
142 MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard.");
143
144 static const struct pci_device_id snd_aw2_ids[] = {
145         {PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146, 0, 0,
146          0, 0, 0},
147         {0}
148 };
149
150 MODULE_DEVICE_TABLE(pci, snd_aw2_ids);
151
152 /* pci_driver definition */
153 static struct pci_driver aw2_driver = {
154         .name = KBUILD_MODNAME,
155         .id_table = snd_aw2_ids,
156         .probe = snd_aw2_probe,
157 };
158
159 module_pci_driver(aw2_driver);
160
161 /* operators for playback PCM alsa interface */
162 static const struct snd_pcm_ops snd_aw2_playback_ops = {
163         .open = snd_aw2_pcm_playback_open,
164         .close = snd_aw2_pcm_playback_close,
165         .prepare = snd_aw2_pcm_prepare_playback,
166         .trigger = snd_aw2_pcm_trigger_playback,
167         .pointer = snd_aw2_pcm_pointer_playback,
168 };
169
170 /* operators for capture PCM alsa interface */
171 static const struct snd_pcm_ops snd_aw2_capture_ops = {
172         .open = snd_aw2_pcm_capture_open,
173         .close = snd_aw2_pcm_capture_close,
174         .prepare = snd_aw2_pcm_prepare_capture,
175         .trigger = snd_aw2_pcm_trigger_capture,
176         .pointer = snd_aw2_pcm_pointer_capture,
177 };
178
179 static const struct snd_kcontrol_new aw2_control = {
180         .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
181         .name = "PCM Capture Route",
182         .index = 0,
183         .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
184         .private_value = 0xffff,
185         .info = snd_aw2_control_switch_capture_info,
186         .get = snd_aw2_control_switch_capture_get,
187         .put = snd_aw2_control_switch_capture_put
188 };
189
190 /*********************************
191  * FUNCTION IMPLEMENTATIONS
192  ********************************/
193
194 /* component-destructor */
195 static void snd_aw2_free(struct snd_card *card)
196 {
197         struct aw2 *chip = card->private_data;
198
199         /* Free hardware */
200         snd_aw2_saa7146_free(&chip->saa7146);
201 }
202
203 /* chip-specific constructor */
204 static int snd_aw2_create(struct snd_card *card,
205                           struct pci_dev *pci)
206 {
207         struct aw2 *chip = card->private_data;
208         int err;
209
210         /* initialize the PCI entry */
211         err = pcim_enable_device(pci);
212         if (err < 0)
213                 return err;
214         pci_set_master(pci);
215
216         /* check PCI availability (32bit DMA) */
217         if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) {
218                 dev_err(card->dev, "Impossible to set 32bit mask DMA\n");
219                 return -ENXIO;
220         }
221
222         /* initialize the stuff */
223         chip->card = card;
224         chip->pci = pci;
225         chip->irq = -1;
226
227         /* (1) PCI resource allocation */
228         err = pcim_iomap_regions(pci, 1 << 0, "Audiowerk2");
229         if (err < 0)
230                 return err;
231         chip->iobase_phys = pci_resource_start(pci, 0);
232         chip->iobase_virt = pcim_iomap_table(pci)[0];
233
234         /* (2) initialization of the chip hardware */
235         snd_aw2_saa7146_setup(&chip->saa7146, chip->iobase_virt);
236
237         if (devm_request_irq(&pci->dev, pci->irq, snd_aw2_saa7146_interrupt,
238                              IRQF_SHARED, KBUILD_MODNAME, chip)) {
239                 dev_err(card->dev, "Cannot grab irq %d\n", pci->irq);
240                 return -EBUSY;
241         }
242         chip->irq = pci->irq;
243         card->sync_irq = chip->irq;
244         card->private_free = snd_aw2_free;
245
246         dev_info(card->dev,
247                  "Audiowerk 2 sound card (saa7146 chipset) detected and managed\n");
248         return 0;
249 }
250
251 /* constructor */
252 static int snd_aw2_probe(struct pci_dev *pci,
253                          const struct pci_device_id *pci_id)
254 {
255         static int dev;
256         struct snd_card *card;
257         struct aw2 *chip;
258         int err;
259
260         /* (1) Continue if device is not enabled, else inc dev */
261         if (dev >= SNDRV_CARDS)
262                 return -ENODEV;
263         if (!enable[dev]) {
264                 dev++;
265                 return -ENOENT;
266         }
267
268         /* (2) Create card instance */
269         err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
270                                 sizeof(*chip), &card);
271         if (err < 0)
272                 return err;
273         chip = card->private_data;
274
275         /* (3) Create main component */
276         err = snd_aw2_create(card, pci);
277         if (err < 0)
278                 return err;
279
280         /* initialize mutex */
281         mutex_init(&chip->mtx);
282         /* init spinlock */
283         spin_lock_init(&chip->reg_lock);
284         /* (4) Define driver ID and name string */
285         strcpy(card->driver, "aw2");
286         strcpy(card->shortname, "Audiowerk2");
287
288         sprintf(card->longname, "%s with SAA7146 irq %i",
289                 card->shortname, chip->irq);
290
291         /* (5) Create other components */
292         snd_aw2_new_pcm(chip);
293
294         /* (6) Register card instance */
295         err = snd_card_register(card);
296         if (err < 0)
297                 return err;
298
299         /* (7) Set PCI driver data */
300         pci_set_drvdata(pci, card);
301
302         dev++;
303         return 0;
304 }
305
306 /* open callback */
307 static int snd_aw2_pcm_playback_open(struct snd_pcm_substream *substream)
308 {
309         struct snd_pcm_runtime *runtime = substream->runtime;
310
311         dev_dbg(substream->pcm->card->dev, "Playback_open\n");
312         runtime->hw = snd_aw2_playback_hw;
313         return 0;
314 }
315
316 /* close callback */
317 static int snd_aw2_pcm_playback_close(struct snd_pcm_substream *substream)
318 {
319         return 0;
320
321 }
322
323 static int snd_aw2_pcm_capture_open(struct snd_pcm_substream *substream)
324 {
325         struct snd_pcm_runtime *runtime = substream->runtime;
326
327         dev_dbg(substream->pcm->card->dev, "Capture_open\n");
328         runtime->hw = snd_aw2_capture_hw;
329         return 0;
330 }
331
332 /* close callback */
333 static int snd_aw2_pcm_capture_close(struct snd_pcm_substream *substream)
334 {
335         /* TODO: something to do ? */
336         return 0;
337 }
338
339 /* prepare callback for playback */
340 static int snd_aw2_pcm_prepare_playback(struct snd_pcm_substream *substream)
341 {
342         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
343         struct aw2 *chip = pcm_device->chip;
344         struct snd_pcm_runtime *runtime = substream->runtime;
345         unsigned long period_size, buffer_size;
346
347         mutex_lock(&chip->mtx);
348
349         period_size = snd_pcm_lib_period_bytes(substream);
350         buffer_size = snd_pcm_lib_buffer_bytes(substream);
351
352         snd_aw2_saa7146_pcm_init_playback(&chip->saa7146,
353                                           pcm_device->stream_number,
354                                           runtime->dma_addr, period_size,
355                                           buffer_size);
356
357         /* Define Interrupt callback */
358         snd_aw2_saa7146_define_it_playback_callback(pcm_device->stream_number,
359                                                     (snd_aw2_saa7146_it_cb)
360                                                     snd_pcm_period_elapsed,
361                                                     (void *)substream);
362
363         mutex_unlock(&chip->mtx);
364
365         return 0;
366 }
367
368 /* prepare callback for capture */
369 static int snd_aw2_pcm_prepare_capture(struct snd_pcm_substream *substream)
370 {
371         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
372         struct aw2 *chip = pcm_device->chip;
373         struct snd_pcm_runtime *runtime = substream->runtime;
374         unsigned long period_size, buffer_size;
375
376         mutex_lock(&chip->mtx);
377
378         period_size = snd_pcm_lib_period_bytes(substream);
379         buffer_size = snd_pcm_lib_buffer_bytes(substream);
380
381         snd_aw2_saa7146_pcm_init_capture(&chip->saa7146,
382                                          pcm_device->stream_number,
383                                          runtime->dma_addr, period_size,
384                                          buffer_size);
385
386         /* Define Interrupt callback */
387         snd_aw2_saa7146_define_it_capture_callback(pcm_device->stream_number,
388                                                    (snd_aw2_saa7146_it_cb)
389                                                    snd_pcm_period_elapsed,
390                                                    (void *)substream);
391
392         mutex_unlock(&chip->mtx);
393
394         return 0;
395 }
396
397 /* playback trigger callback */
398 static int snd_aw2_pcm_trigger_playback(struct snd_pcm_substream *substream,
399                                         int cmd)
400 {
401         int status = 0;
402         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
403         struct aw2 *chip = pcm_device->chip;
404         spin_lock(&chip->reg_lock);
405         switch (cmd) {
406         case SNDRV_PCM_TRIGGER_START:
407                 snd_aw2_saa7146_pcm_trigger_start_playback(&chip->saa7146,
408                                                            pcm_device->
409                                                            stream_number);
410                 break;
411         case SNDRV_PCM_TRIGGER_STOP:
412                 snd_aw2_saa7146_pcm_trigger_stop_playback(&chip->saa7146,
413                                                           pcm_device->
414                                                           stream_number);
415                 break;
416         default:
417                 status = -EINVAL;
418         }
419         spin_unlock(&chip->reg_lock);
420         return status;
421 }
422
423 /* capture trigger callback */
424 static int snd_aw2_pcm_trigger_capture(struct snd_pcm_substream *substream,
425                                        int cmd)
426 {
427         int status = 0;
428         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
429         struct aw2 *chip = pcm_device->chip;
430         spin_lock(&chip->reg_lock);
431         switch (cmd) {
432         case SNDRV_PCM_TRIGGER_START:
433                 snd_aw2_saa7146_pcm_trigger_start_capture(&chip->saa7146,
434                                                           pcm_device->
435                                                           stream_number);
436                 break;
437         case SNDRV_PCM_TRIGGER_STOP:
438                 snd_aw2_saa7146_pcm_trigger_stop_capture(&chip->saa7146,
439                                                          pcm_device->
440                                                          stream_number);
441                 break;
442         default:
443                 status = -EINVAL;
444         }
445         spin_unlock(&chip->reg_lock);
446         return status;
447 }
448
449 /* playback pointer callback */
450 static snd_pcm_uframes_t snd_aw2_pcm_pointer_playback(struct snd_pcm_substream
451                                                       *substream)
452 {
453         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
454         struct aw2 *chip = pcm_device->chip;
455         unsigned int current_ptr;
456
457         /* get the current hardware pointer */
458         struct snd_pcm_runtime *runtime = substream->runtime;
459         current_ptr =
460                 snd_aw2_saa7146_get_hw_ptr_playback(&chip->saa7146,
461                                                     pcm_device->stream_number,
462                                                     runtime->dma_area,
463                                                     runtime->buffer_size);
464
465         return bytes_to_frames(substream->runtime, current_ptr);
466 }
467
468 /* capture pointer callback */
469 static snd_pcm_uframes_t snd_aw2_pcm_pointer_capture(struct snd_pcm_substream
470                                                      *substream)
471 {
472         struct aw2_pcm_device *pcm_device = snd_pcm_substream_chip(substream);
473         struct aw2 *chip = pcm_device->chip;
474         unsigned int current_ptr;
475
476         /* get the current hardware pointer */
477         struct snd_pcm_runtime *runtime = substream->runtime;
478         current_ptr =
479                 snd_aw2_saa7146_get_hw_ptr_capture(&chip->saa7146,
480                                                    pcm_device->stream_number,
481                                                    runtime->dma_area,
482                                                    runtime->buffer_size);
483
484         return bytes_to_frames(substream->runtime, current_ptr);
485 }
486
487 /* create a pcm device */
488 static int snd_aw2_new_pcm(struct aw2 *chip)
489 {
490         struct snd_pcm *pcm_playback_ana;
491         struct snd_pcm *pcm_playback_num;
492         struct snd_pcm *pcm_capture;
493         struct aw2_pcm_device *pcm_device;
494         int err = 0;
495
496         /* Create new Alsa PCM device */
497
498         err = snd_pcm_new(chip->card, "Audiowerk2 analog playback", 0, 1, 0,
499                           &pcm_playback_ana);
500         if (err < 0) {
501                 dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
502                 return err;
503         }
504
505         /* Creation ok */
506         pcm_device = &chip->device_playback[NUM_STREAM_PLAYBACK_ANA];
507
508         /* Set PCM device name */
509         strcpy(pcm_playback_ana->name, "Analog playback");
510         /* Associate private data to PCM device */
511         pcm_playback_ana->private_data = pcm_device;
512         /* set operators of PCM device */
513         snd_pcm_set_ops(pcm_playback_ana, SNDRV_PCM_STREAM_PLAYBACK,
514                         &snd_aw2_playback_ops);
515         /* store PCM device */
516         pcm_device->pcm = pcm_playback_ana;
517         /* give base chip pointer to our internal pcm device
518            structure */
519         pcm_device->chip = chip;
520         /* Give stream number to PCM device */
521         pcm_device->stream_number = NUM_STREAM_PLAYBACK_ANA;
522
523         /* pre-allocation of buffers */
524         /* Preallocate continuous pages. */
525         snd_pcm_set_managed_buffer_all(pcm_playback_ana,
526                                        SNDRV_DMA_TYPE_DEV,
527                                        &chip->pci->dev,
528                                        64 * 1024, 64 * 1024);
529
530         err = snd_pcm_new(chip->card, "Audiowerk2 digital playback", 1, 1, 0,
531                           &pcm_playback_num);
532
533         if (err < 0) {
534                 dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
535                 return err;
536         }
537         /* Creation ok */
538         pcm_device = &chip->device_playback[NUM_STREAM_PLAYBACK_DIG];
539
540         /* Set PCM device name */
541         strcpy(pcm_playback_num->name, "Digital playback");
542         /* Associate private data to PCM device */
543         pcm_playback_num->private_data = pcm_device;
544         /* set operators of PCM device */
545         snd_pcm_set_ops(pcm_playback_num, SNDRV_PCM_STREAM_PLAYBACK,
546                         &snd_aw2_playback_ops);
547         /* store PCM device */
548         pcm_device->pcm = pcm_playback_num;
549         /* give base chip pointer to our internal pcm device
550            structure */
551         pcm_device->chip = chip;
552         /* Give stream number to PCM device */
553         pcm_device->stream_number = NUM_STREAM_PLAYBACK_DIG;
554
555         /* pre-allocation of buffers */
556         /* Preallocate continuous pages. */
557         snd_pcm_set_managed_buffer_all(pcm_playback_num,
558                                        SNDRV_DMA_TYPE_DEV,
559                                        &chip->pci->dev,
560                                        64 * 1024, 64 * 1024);
561
562         err = snd_pcm_new(chip->card, "Audiowerk2 capture", 2, 0, 1,
563                           &pcm_capture);
564
565         if (err < 0) {
566                 dev_err(chip->card->dev, "snd_pcm_new error (0x%X)\n", err);
567                 return err;
568         }
569
570         /* Creation ok */
571         pcm_device = &chip->device_capture[NUM_STREAM_CAPTURE_ANA];
572
573         /* Set PCM device name */
574         strcpy(pcm_capture->name, "Capture");
575         /* Associate private data to PCM device */
576         pcm_capture->private_data = pcm_device;
577         /* set operators of PCM device */
578         snd_pcm_set_ops(pcm_capture, SNDRV_PCM_STREAM_CAPTURE,
579                         &snd_aw2_capture_ops);
580         /* store PCM device */
581         pcm_device->pcm = pcm_capture;
582         /* give base chip pointer to our internal pcm device
583            structure */
584         pcm_device->chip = chip;
585         /* Give stream number to PCM device */
586         pcm_device->stream_number = NUM_STREAM_CAPTURE_ANA;
587
588         /* pre-allocation of buffers */
589         /* Preallocate continuous pages. */
590         snd_pcm_set_managed_buffer_all(pcm_capture,
591                                        SNDRV_DMA_TYPE_DEV,
592                                        &chip->pci->dev,
593                                        64 * 1024, 64 * 1024);
594
595         /* Create control */
596         err = snd_ctl_add(chip->card, snd_ctl_new1(&aw2_control, chip));
597         if (err < 0) {
598                 dev_err(chip->card->dev, "snd_ctl_add error (0x%X)\n", err);
599                 return err;
600         }
601
602         return 0;
603 }
604
605 static int snd_aw2_control_switch_capture_info(struct snd_kcontrol *kcontrol,
606                                                struct snd_ctl_elem_info *uinfo)
607 {
608         static const char * const texts[2] = {
609                 "Analog", "Digital"
610         };
611         return snd_ctl_enum_info(uinfo, 1, 2, texts);
612 }
613
614 static int snd_aw2_control_switch_capture_get(struct snd_kcontrol *kcontrol,
615                                               struct snd_ctl_elem_value
616                                               *ucontrol)
617 {
618         struct aw2 *chip = snd_kcontrol_chip(kcontrol);
619         if (snd_aw2_saa7146_is_using_digital_input(&chip->saa7146))
620                 ucontrol->value.enumerated.item[0] = CTL_ROUTE_DIGITAL;
621         else
622                 ucontrol->value.enumerated.item[0] = CTL_ROUTE_ANALOG;
623         return 0;
624 }
625
626 static int snd_aw2_control_switch_capture_put(struct snd_kcontrol *kcontrol,
627                                               struct snd_ctl_elem_value
628                                               *ucontrol)
629 {
630         struct aw2 *chip = snd_kcontrol_chip(kcontrol);
631         int changed = 0;
632         int is_disgital =
633             snd_aw2_saa7146_is_using_digital_input(&chip->saa7146);
634
635         if (((ucontrol->value.integer.value[0] == CTL_ROUTE_DIGITAL)
636              && !is_disgital)
637             || ((ucontrol->value.integer.value[0] == CTL_ROUTE_ANALOG)
638                 && is_disgital)) {
639                 snd_aw2_saa7146_use_digital_input(&chip->saa7146, !is_disgital);
640                 changed = 1;
641         }
642         return changed;
643 }