1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/delay.h>
27#include <linux/interrupt.h>
28#include <linux/init.h>
29#include <linux/slab.h>
30#include <sound/core.h>
31#include <sound/tlv.h>
32
33#include "ice1712.h"
34#include "envy24ht.h"
35#include "juli.h"
36
37struct juli_spec {
38 struct ak4114 *ak4114;
39 unsigned int analog:1;
40};
41
42
43
44
45#define AK4114_ADDR 0x20
46#define AK4358_ADDR 0x22
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77#define GPIO_FREQ_MASK (3<<0)
78#define GPIO_FREQ_32KHZ (0<<0)
79#define GPIO_FREQ_44KHZ (1<<0)
80#define GPIO_FREQ_48KHZ (2<<0)
81#define GPIO_MULTI_MASK (3<<2)
82#define GPIO_MULTI_4X (0<<2)
83#define GPIO_MULTI_2X (1<<2)
84#define GPIO_MULTI_1X (2<<2)
85#define GPIO_MULTI_HALF (3<<2)
86#define GPIO_INTERNAL_CLOCK (1<<4)
87#define GPIO_CLOCK_MASK (1<<4)
88#define GPIO_ANALOG_PRESENT (1<<5)
89#define GPIO_RXMCLK_SEL (1<<7)
90#define GPIO_AK5385A_CKS0 (1<<8)
91#define GPIO_AK5385A_DFS1 (1<<9)
92#define GPIO_AK5385A_DFS0 (1<<10)
93#define GPIO_DIGOUT_MONITOR (1<<11)
94#define GPIO_DIGIN_MONITOR (1<<12)
95#define GPIO_ANAIN_MONITOR (1<<13)
96#define GPIO_AK5385A_CKS1 (1<<14)
97#define GPIO_MUTE_CONTROL (1<<15)
98
99#define GPIO_RATE_MASK (GPIO_FREQ_MASK | GPIO_MULTI_MASK | \
100 GPIO_CLOCK_MASK)
101#define GPIO_AK5385A_MASK (GPIO_AK5385A_CKS0 | GPIO_AK5385A_DFS0 | \
102 GPIO_AK5385A_DFS1 | GPIO_AK5385A_CKS1)
103
104#define JULI_PCM_RATE (SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
105 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
106 SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \
107 SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
108 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000)
109
110#define GPIO_RATE_16000 (GPIO_FREQ_32KHZ | GPIO_MULTI_HALF | \
111 GPIO_INTERNAL_CLOCK)
112#define GPIO_RATE_22050 (GPIO_FREQ_44KHZ | GPIO_MULTI_HALF | \
113 GPIO_INTERNAL_CLOCK)
114#define GPIO_RATE_24000 (GPIO_FREQ_48KHZ | GPIO_MULTI_HALF | \
115 GPIO_INTERNAL_CLOCK)
116#define GPIO_RATE_32000 (GPIO_FREQ_32KHZ | GPIO_MULTI_1X | \
117 GPIO_INTERNAL_CLOCK)
118#define GPIO_RATE_44100 (GPIO_FREQ_44KHZ | GPIO_MULTI_1X | \
119 GPIO_INTERNAL_CLOCK)
120#define GPIO_RATE_48000 (GPIO_FREQ_48KHZ | GPIO_MULTI_1X | \
121 GPIO_INTERNAL_CLOCK)
122#define GPIO_RATE_64000 (GPIO_FREQ_32KHZ | GPIO_MULTI_2X | \
123 GPIO_INTERNAL_CLOCK)
124#define GPIO_RATE_88200 (GPIO_FREQ_44KHZ | GPIO_MULTI_2X | \
125 GPIO_INTERNAL_CLOCK)
126#define GPIO_RATE_96000 (GPIO_FREQ_48KHZ | GPIO_MULTI_2X | \
127 GPIO_INTERNAL_CLOCK)
128#define GPIO_RATE_176400 (GPIO_FREQ_44KHZ | GPIO_MULTI_4X | \
129 GPIO_INTERNAL_CLOCK)
130#define GPIO_RATE_192000 (GPIO_FREQ_48KHZ | GPIO_MULTI_4X | \
131 GPIO_INTERNAL_CLOCK)
132
133
134
135
136static unsigned int juli_rates[] = {
137 16000, 22050, 24000, 32000,
138 44100, 48000, 64000, 88200,
139 96000, 176400, 192000,
140};
141
142static unsigned int gpio_vals[] = {
143 GPIO_RATE_16000, GPIO_RATE_22050, GPIO_RATE_24000, GPIO_RATE_32000,
144 GPIO_RATE_44100, GPIO_RATE_48000, GPIO_RATE_64000, GPIO_RATE_88200,
145 GPIO_RATE_96000, GPIO_RATE_176400, GPIO_RATE_192000,
146};
147
148static struct snd_pcm_hw_constraint_list juli_rates_info = {
149 .count = ARRAY_SIZE(juli_rates),
150 .list = juli_rates,
151 .mask = 0,
152};
153
154static int get_gpio_val(int rate)
155{
156 int i;
157 for (i = 0; i < ARRAY_SIZE(juli_rates); i++)
158 if (juli_rates[i] == rate)
159 return gpio_vals[i];
160 return 0;
161}
162
163static void juli_ak4114_write(void *private_data, unsigned char reg,
164 unsigned char val)
165{
166 snd_vt1724_write_i2c((struct snd_ice1712 *)private_data, AK4114_ADDR,
167 reg, val);
168}
169
170static unsigned char juli_ak4114_read(void *private_data, unsigned char reg)
171{
172 return snd_vt1724_read_i2c((struct snd_ice1712 *)private_data,
173 AK4114_ADDR, reg);
174}
175
176
177
178
179
180static void juli_spdif_in_open(struct snd_ice1712 *ice,
181 struct snd_pcm_substream *substream)
182{
183 struct juli_spec *spec = ice->spec;
184 struct snd_pcm_runtime *runtime = substream->runtime;
185 int rate;
186
187 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
188 !ice->is_spdif_master(ice))
189 return;
190 rate = snd_ak4114_external_rate(spec->ak4114);
191 if (rate >= runtime->hw.rate_min && rate <= runtime->hw.rate_max) {
192 runtime->hw.rate_min = rate;
193 runtime->hw.rate_max = rate;
194 }
195}
196
197
198
199
200
201static void juli_akm_lock(struct snd_akm4xxx *ak, int chip)
202{
203}
204
205static void juli_akm_unlock(struct snd_akm4xxx *ak, int chip)
206{
207}
208
209static void juli_akm_write(struct snd_akm4xxx *ak, int chip,
210 unsigned char addr, unsigned char data)
211{
212 struct snd_ice1712 *ice = ak->private_data[0];
213
214 if (snd_BUG_ON(chip))
215 return;
216 snd_vt1724_write_i2c(ice, AK4358_ADDR, addr, data);
217}
218
219
220
221
222static void juli_akm_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
223{
224 unsigned char old, tmp, ak4358_dfs;
225 unsigned int ak5385_pins, old_gpio, new_gpio;
226 struct snd_ice1712 *ice = ak->private_data[0];
227 struct juli_spec *spec = ice->spec;
228
229 if (rate == 0)
230
231 return;
232
233
234 if (rate > 96000) {
235 ak4358_dfs = 2;
236 ak5385_pins = GPIO_AK5385A_DFS1 | GPIO_AK5385A_CKS0;
237 } else if (rate > 48000) {
238 ak4358_dfs = 1;
239 ak5385_pins = GPIO_AK5385A_DFS0;
240 } else {
241 ak4358_dfs = 0;
242 ak5385_pins = 0;
243 }
244
245 old_gpio = ice->gpio.get_data(ice);
246 new_gpio = (old_gpio & ~GPIO_AK5385A_MASK) | ak5385_pins;
247
248
249 ice->gpio.set_data(ice, new_gpio);
250
251
252 old = inb(ICEMT1724(ice, AC97_CMD));
253 outb(old | VT1724_AC97_COLD, ICEMT1724(ice, AC97_CMD));
254 udelay(1);
255 outb(old & ~VT1724_AC97_COLD, ICEMT1724(ice, AC97_CMD));
256
257
258
259 tmp = snd_akm4xxx_get(ak, 0, 2);
260 snd_akm4xxx_reset(ak, 1);
261 tmp = snd_akm4xxx_get(ak, 0, 2);
262 tmp &= ~(0x03 << 4);
263 tmp |= ak4358_dfs << 4;
264 snd_akm4xxx_set(ak, 0, 2, tmp);
265 snd_akm4xxx_reset(ak, 0);
266
267
268 snd_ak4114_reinit(spec->ak4114);
269}
270
271#define AK_DAC(xname, xch) { .name = xname, .num_channels = xch }
272#define PCM_VOLUME "PCM Playback Volume"
273#define MONITOR_AN_IN_VOLUME "Monitor Analog In Volume"
274#define MONITOR_DIG_IN_VOLUME "Monitor Digital In Volume"
275#define MONITOR_DIG_OUT_VOLUME "Monitor Digital Out Volume"
276
277static const struct snd_akm4xxx_dac_channel juli_dac[] = {
278 AK_DAC(PCM_VOLUME, 2),
279 AK_DAC(MONITOR_AN_IN_VOLUME, 2),
280 AK_DAC(MONITOR_DIG_OUT_VOLUME, 2),
281 AK_DAC(MONITOR_DIG_IN_VOLUME, 2),
282};
283
284
285static struct snd_akm4xxx akm_juli_dac = {
286 .type = SND_AK4358,
287 .num_dacs = 8,
288
289
290
291
292 .ops = {
293 .lock = juli_akm_lock,
294 .unlock = juli_akm_unlock,
295 .write = juli_akm_write,
296 .set_rate_val = juli_akm_set_rate_val
297 },
298 .dac_info = juli_dac,
299};
300
301#define juli_mute_info snd_ctl_boolean_mono_info
302
303static int juli_mute_get(struct snd_kcontrol *kcontrol,
304 struct snd_ctl_elem_value *ucontrol)
305{
306 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
307 unsigned int val;
308 val = ice->gpio.get_data(ice) & (unsigned int) kcontrol->private_value;
309 if (kcontrol->private_value == GPIO_MUTE_CONTROL)
310
311 ucontrol->value.integer.value[0] = (val) ? 0 : 1;
312 else
313
314 ucontrol->value.integer.value[0] = (val) ? 1 : 0;
315 return 0;
316}
317
318static int juli_mute_put(struct snd_kcontrol *kcontrol,
319 struct snd_ctl_elem_value *ucontrol)
320{
321 struct snd_ice1712 *ice = snd_kcontrol_chip(kcontrol);
322 unsigned int old_gpio, new_gpio;
323 old_gpio = ice->gpio.get_data(ice);
324 if (ucontrol->value.integer.value[0]) {
325
326 if (kcontrol->private_value == GPIO_MUTE_CONTROL) {
327
328 new_gpio = old_gpio & ~GPIO_MUTE_CONTROL;
329
330 snd_akm4xxx_write(ice->akm, 0, 0x01, 0x01);
331 } else
332
333 new_gpio = old_gpio |
334 (unsigned int) kcontrol->private_value;
335 } else {
336
337 if (kcontrol->private_value == GPIO_MUTE_CONTROL) {
338
339 new_gpio = old_gpio | GPIO_MUTE_CONTROL;
340
341 snd_akm4xxx_write(ice->akm, 0, 0x01, 0x03);
342 } else
343
344 new_gpio = old_gpio &
345 ~((unsigned int) kcontrol->private_value);
346 }
347
348
349
350
351
352 if (old_gpio != new_gpio) {
353 ice->gpio.set_data(ice, new_gpio);
354 return 1;
355 }
356
357 return 0;
358}
359
360static struct snd_kcontrol_new juli_mute_controls[] = {
361 {
362 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
363 .name = "Master Playback Switch",
364 .info = juli_mute_info,
365 .get = juli_mute_get,
366 .put = juli_mute_put,
367 .private_value = GPIO_MUTE_CONTROL,
368 },
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388 {
389 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
390 .name = "Monitor Analog In Switch",
391 .info = juli_mute_info,
392 .get = juli_mute_get,
393 .put = juli_mute_put,
394 .private_value = GPIO_ANAIN_MONITOR,
395 },
396 {
397 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
398 .name = "Monitor Digital Out Switch",
399 .info = juli_mute_info,
400 .get = juli_mute_get,
401 .put = juli_mute_put,
402 .private_value = GPIO_DIGOUT_MONITOR,
403 },
404 {
405 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
406 .name = "Monitor Digital In Switch",
407 .info = juli_mute_info,
408 .get = juli_mute_get,
409 .put = juli_mute_put,
410 .private_value = GPIO_DIGIN_MONITOR,
411 },
412};
413
414static char *slave_vols[] = {
415 PCM_VOLUME,
416 MONITOR_AN_IN_VOLUME,
417 MONITOR_DIG_IN_VOLUME,
418 MONITOR_DIG_OUT_VOLUME,
419 NULL
420};
421
422static
423DECLARE_TLV_DB_SCALE(juli_master_db_scale, -6350, 50, 1);
424
425static struct snd_kcontrol *ctl_find(struct snd_card *card,
426 const char *name)
427{
428 struct snd_ctl_elem_id sid;
429 memset(&sid, 0, sizeof(sid));
430
431 strcpy(sid.name, name);
432 sid.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
433 return snd_ctl_find_id(card, &sid);
434}
435
436static void add_slaves(struct snd_card *card,
437 struct snd_kcontrol *master,
438 char * const *list)
439{
440 for (; *list; list++) {
441 struct snd_kcontrol *slave = ctl_find(card, *list);
442
443 if (slave) {
444
445 snd_ctl_add_slave(master, slave);
446 }
447 }
448}
449
450static int juli_add_controls(struct snd_ice1712 *ice)
451{
452 struct juli_spec *spec = ice->spec;
453 int err;
454 unsigned int i;
455 struct snd_kcontrol *vmaster;
456
457 err = snd_ice1712_akm4xxx_build_controls(ice);
458 if (err < 0)
459 return err;
460
461 for (i = 0; i < ARRAY_SIZE(juli_mute_controls); i++) {
462 err = snd_ctl_add(ice->card,
463 snd_ctl_new1(&juli_mute_controls[i], ice));
464 if (err < 0)
465 return err;
466 }
467
468 vmaster = snd_ctl_make_virtual_master("Master Playback Volume",
469 juli_master_db_scale);
470 if (!vmaster)
471 return -ENOMEM;
472 add_slaves(ice->card, vmaster, slave_vols);
473 err = snd_ctl_add(ice->card, vmaster);
474 if (err < 0)
475 return err;
476
477
478 return snd_ak4114_build(spec->ak4114, NULL,
479 ice->pcm->streams[SNDRV_PCM_STREAM_CAPTURE].substream);
480}
481
482
483
484
485
486#ifdef CONFIG_PM_SLEEP
487static int juli_resume(struct snd_ice1712 *ice)
488{
489 struct snd_akm4xxx *ak = ice->akm;
490 struct juli_spec *spec = ice->spec;
491
492 snd_akm4xxx_reset(ak, 0);
493
494 snd_ak4114_resume(spec->ak4114);
495 return 0;
496}
497
498static int juli_suspend(struct snd_ice1712 *ice)
499{
500 struct snd_akm4xxx *ak = ice->akm;
501 struct juli_spec *spec = ice->spec;
502
503 snd_akm4xxx_reset(ak, 1);
504 snd_ak4114_suspend(spec->ak4114);
505 return 0;
506}
507#endif
508
509
510
511
512
513static inline int juli_is_spdif_master(struct snd_ice1712 *ice)
514{
515 return (ice->gpio.get_data(ice) & GPIO_INTERNAL_CLOCK) ? 0 : 1;
516}
517
518static unsigned int juli_get_rate(struct snd_ice1712 *ice)
519{
520 int i;
521 unsigned char result;
522
523 result = ice->gpio.get_data(ice) & GPIO_RATE_MASK;
524 for (i = 0; i < ARRAY_SIZE(gpio_vals); i++)
525 if (gpio_vals[i] == result)
526 return juli_rates[i];
527 return 0;
528}
529
530
531static void juli_set_rate(struct snd_ice1712 *ice, unsigned int rate)
532{
533 unsigned int old, new;
534 unsigned char val;
535
536 old = ice->gpio.get_data(ice);
537 new = (old & ~GPIO_RATE_MASK) | get_gpio_val(rate);
538
539
540
541
542 ice->gpio.set_data(ice, new);
543
544 val = inb(ICEMT1724(ice, RATE));
545 outb(val | VT1724_SPDIF_MASTER, ICEMT1724(ice, RATE));
546}
547
548static inline unsigned char juli_set_mclk(struct snd_ice1712 *ice,
549 unsigned int rate)
550{
551
552 return 0;
553}
554
555
556static int juli_set_spdif_clock(struct snd_ice1712 *ice, int type)
557{
558 unsigned int old;
559 old = ice->gpio.get_data(ice);
560
561 ice->gpio.set_data(ice, (old & ~GPIO_RATE_MASK) | GPIO_MULTI_1X |
562 GPIO_FREQ_48KHZ);
563 return 0;
564}
565
566
567static void juli_ak4114_change(struct ak4114 *ak4114, unsigned char c0,
568 unsigned char c1)
569{
570 struct snd_ice1712 *ice = ak4114->change_callback_private;
571 int rate;
572 if (ice->is_spdif_master(ice) && c1) {
573
574 rate = snd_ak4114_external_rate(ak4114);
575
576
577 juli_akm_set_rate_val(ice->akm, rate);
578 }
579}
580
581static int juli_init(struct snd_ice1712 *ice)
582{
583 static const unsigned char ak4114_init_vals[] = {
584 AK4114_RST | AK4114_PWN |
585 AK4114_OCKS0 | AK4114_OCKS1,
586 AK4114_DIF_I24I2S,
587 AK4114_TX1E,
588 AK4114_EFH_1024 | AK4114_DIT |
589 AK4114_IPS(1),
590 0,
591 0
592 };
593 static const unsigned char ak4114_init_txcsb[] = {
594 0x41, 0x02, 0x2c, 0x00, 0x00
595 };
596 int err;
597 struct juli_spec *spec;
598 struct snd_akm4xxx *ak;
599
600 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
601 if (!spec)
602 return -ENOMEM;
603 ice->spec = spec;
604
605 err = snd_ak4114_create(ice->card,
606 juli_ak4114_read,
607 juli_ak4114_write,
608 ak4114_init_vals, ak4114_init_txcsb,
609 ice, &spec->ak4114);
610 if (err < 0)
611 return err;
612
613 spec->ak4114->change_callback = juli_ak4114_change;
614 spec->ak4114->change_callback_private = ice;
615
616 spec->ak4114->check_flags = 0;
617
618#if 0
619
620
621
622
623
624 spec->analog = (ice->gpio.get_data(ice) & GPIO_ANALOG_PRESENT) ? 0 : 1;
625#else
626 spec->analog = 1;
627#endif
628
629 if (spec->analog) {
630 dev_info(ice->card->dev, "juli@: analog I/O detected\n");
631 ice->num_total_dacs = 2;
632 ice->num_total_adcs = 2;
633
634 ice->akm = kzalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
635 ak = ice->akm;
636 if (!ak)
637 return -ENOMEM;
638 ice->akm_codecs = 1;
639 err = snd_ice1712_akm4xxx_init(ak, &akm_juli_dac, NULL, ice);
640 if (err < 0)
641 return err;
642 }
643
644
645 ice->hw_rates = &juli_rates_info;
646 ice->is_spdif_master = juli_is_spdif_master;
647 ice->get_rate = juli_get_rate;
648 ice->set_rate = juli_set_rate;
649 ice->set_mclk = juli_set_mclk;
650 ice->set_spdif_clock = juli_set_spdif_clock;
651
652 ice->spdif.ops.open = juli_spdif_in_open;
653
654#ifdef CONFIG_PM_SLEEP
655 ice->pm_resume = juli_resume;
656 ice->pm_suspend = juli_suspend;
657 ice->pm_suspend_enabled = 1;
658#endif
659
660 return 0;
661}
662
663
664
665
666
667
668
669static unsigned char juli_eeprom[] = {
670 [ICE_EEP2_SYSCONF] = 0x2b,
671
672 [ICE_EEP2_ACLINK] = 0x80,
673 [ICE_EEP2_I2S] = 0xf8,
674 [ICE_EEP2_SPDIF] = 0xc3,
675 [ICE_EEP2_GPIO_DIR] = 0x9f,
676 [ICE_EEP2_GPIO_DIR1] = 0xff,
677 [ICE_EEP2_GPIO_DIR2] = 0x7f,
678 [ICE_EEP2_GPIO_MASK] = 0x60,
679 [ICE_EEP2_GPIO_MASK1] = 0x00,
680 [ICE_EEP2_GPIO_MASK2] = 0x7f,
681 [ICE_EEP2_GPIO_STATE] = GPIO_FREQ_48KHZ | GPIO_MULTI_1X |
682 GPIO_INTERNAL_CLOCK,
683 [ICE_EEP2_GPIO_STATE1] = 0x00,
684 [ICE_EEP2_GPIO_STATE2] = 0x00,
685};
686
687
688struct snd_ice1712_card_info snd_vt1724_juli_cards[] = {
689 {
690 .subvendor = VT1724_SUBDEVICE_JULI,
691 .name = "ESI Juli@",
692 .model = "juli",
693 .chip_init = juli_init,
694 .build_controls = juli_add_controls,
695 .eeprom_size = sizeof(juli_eeprom),
696 .eeprom_data = juli_eeprom,
697 },
698 { }
699};
700