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